From c1852434bbd5cfb26e6f0ca7063216930fea9317 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 30 Aug 2020 19:37:38 -0600 Subject: [PATCH 001/248] add rock climb --- data/field_effect_scripts.s | 11 + data/scripts/field_move_scripts.inc | 26 ++ graphics/field_effects/palettes/big_dust.pal | 19 ++ .../field_effects/pics/rock_climb_blob.png | Bin 0 -> 383 bytes .../field_effects/pics/rock_climb_dust.png | Bin 0 -> 558 bytes include/constants/event_object_movement.h | 5 + include/constants/field_effects.h | 5 + include/constants/metatile_behaviors.h | 2 +- include/event_scripts.h | 1 + include/field_effect.h | 1 + include/metatile_behavior.h | 1 + spritesheet_rules.mk | 6 + .../field_effect_object_template_pointers.h | 4 + src/data/field_effects/field_effect_objects.h | 45 +++ .../movement_action_func_tables.h | 45 +++ .../object_events/object_event_graphics.h | 3 + src/data/party_menu.h | 5 +- src/event_object_movement.c | 73 +++-- src/field_control_avatar.c | 3 + src/field_effect.c | 265 ++++++++++++++++++ src/field_effect_helpers.c | 20 ++ src/metatile_behavior.c | 10 +- src/party_menu.c | 22 ++ 23 files changed, 553 insertions(+), 19 deletions(-) create mode 100644 graphics/field_effects/palettes/big_dust.pal create mode 100644 graphics/field_effects/pics/rock_climb_blob.png create mode 100644 graphics/field_effects/pics/rock_climb_dust.png diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index c57f19a040..3a2e9f14ee 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -72,6 +72,8 @@ gFieldEffectScriptPointers:: @ 82DB9D4 .4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT .4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK .4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK + .4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB + .4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST gFieldEffectScript_ExclamationMarkIcon1:: @ 82DBAE0 field_eff_callnative FldEff_ExclamationMarkIcon @@ -343,3 +345,12 @@ gFieldEffectScript_DestroyDeoxysRock:: @ 82DBCF9 gFieldEffectScript_MoveDeoxysRock:: @ 82DBCFF field_eff_callnative FldEff_MoveDeoxysRock field_eff_end + +gFieldEffectScript_UseRockClimb:: @ 82DBC3F + field_eff_callnative FldEff_UseRockClimb + field_eff_end + +gFieldEffectScript_RockClimbDust:: @ 82DBB28 + field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust + field_eff_end + diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index 2d689348b0..d04304abc9 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -301,3 +301,29 @@ EventScript_FailSweetScent:: @ 8290CAE Text_FailSweetScent: @ 8290CB7 .string "Looks like there's nothing here…$" + + +EventScript_UseRockClimb:: + lockall + checkpartymove MOVE_ROCK_CLIMB + compare VAR_RESULT, PARTY_SIZE + goto_if_eq EventScript_CantRockClimb + bufferpartymonnick 0, VAR_RESULT + setfieldeffectargument 0, VAR_RESULT + msgbox Text_WantToRockClimb, MSGBOX_YESNO + compare VAR_RESULT, NO + goto_if_eq EventScript_EndRockClimb + msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT + dofieldeffect FLDEFF_USE_ROCK_CLIMB + goto EventScript_EndRockClimb +EventScript_CantRockClimb:: @ 8290A84 + msgbox Text_CantRockClimb, MSGBOX_DEFAULT +EventScript_EndRockClimb:: @ 8290A8C + releaseall + end +Text_WantToRockClimb: + .string "The cliff is steep.\nWould you like to use Rock Climb?$" +Text_MonUsedRockClimb: + .string "{STR_VAR_1} used Rock Climb!$" +Text_CantRockClimb: + .string "The cliff is steep.\nA Pokémon may be able to climb it.$" diff --git a/graphics/field_effects/palettes/big_dust.pal b/graphics/field_effects/palettes/big_dust.pal new file mode 100644 index 0000000000..34beaf0371 --- /dev/null +++ b/graphics/field_effects/palettes/big_dust.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 172 238 +198 181 156 +165 140 115 +181 165 140 +148 123 99 +206 198 173 +189 173 148 +82 74 57 +222 180 148 +140 123 82 +173 156 123 +238 213 180 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/field_effects/pics/rock_climb_blob.png b/graphics/field_effects/pics/rock_climb_blob.png new file mode 100644 index 0000000000000000000000000000000000000000..19a9a7cea9b64d8b91262792826091934322e1cf GIT binary patch literal 383 zcmV-_0f7FAP)5Fk0;=I(RNb4rv_|6*FjK|%lj{{R30FCfkm00009 za7bBm000&x000&x0ZCFM@Bjb+^+`lQR5*?8Q#*FUFbvb=Ri~3ydx=+G-AlBhvPnp! zlfJ$VnObh301*16^k09gfa7=kN0FcaJX+-D*ZIXOmiDN!x%IXS9L^`dD+d2GsFQ)c zukKFKE`F&TA(ugI(Qn|Co+>B@11V%Eg9FoHWD+x2)iS>b#2RJYT%wU7Gr-DB7!x!T zXrM=n7Xc#_I|mw66O2eaCw8jc4lUPj1t8%F3^9RCteApk4HbwPz%~uLIB*ZkrKqDJ zY9Lc^J&h^oBeV{0ATEIw@8M(sVPYU;#C1|8mN1Yb9A7D0gr3khj6H?A{kXefjvwkx d{Ydy+eE}yq7eUcLbl?C0002ovPDHLkV1g59m4pBQ literal 0 HcmV?d00001 diff --git a/graphics/field_effects/pics/rock_climb_dust.png b/graphics/field_effects/pics/rock_climb_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..541c6ba9b8b3f3dba8f8546fe42f643169103d96 GIT binary patch literal 558 zcmV+}0@3}6P)=jL9sbPN{d@04`5?qC0JaozJOq5XKm{X z`p@jeM9pC`9Jd)V-^@S%#u$y4%uEZSayg+qBckKmF5j}drwTxH`<)%9hZ|b<`K|+( z33yK_vQ}rVd{6nZ>rZs|QEO_WO|PSkC@7CQV3z9uYMMw5ad0c7&o(w%Giz)-2fyxs zed&+@+fdGKApqMJh`bY!9{`6m@L5cNy=HGdxi5(?6(F(zM3e5^M3q{~RPenE%Fw|W z&s_chYz*?&+X$efb!+F+?2B(%V211n6IGID(mv>o76AH^hJXY1E&(p^J@}Ijcti*2 zf+R7Pu(bG!LqLOrg+J|pCv-4b`MqXn~xIssJ!|uBhZJsx-0h zlKzp}3PH8gZ=*&CAg37!Ovr)AwYhDLk`2X{2jsK5TXz}N5q@=LF$wL|Hq!&#*T~n6Z1+oDC%k~ wpx;7Wj}>ILUya0KB%o8SCKM|$R?g)30(n1Mi4fg(6#xJL07*qoM6N<$g5})wKL7v# literal 0 HcmV?d00001 diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 6a4405b653..8012ac88d1 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -241,6 +241,11 @@ #define MOVEMENT_ACTION_FIGURE_8 0x9B #define MOVEMENT_ACTION_FLY_UP 0x9C #define MOVEMENT_ACTION_FLY_DOWN 0x9D +//fast diagonal movement +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT 0x9E +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT 0x9F +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT 0xA0 +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT 0xA1 #define MOVEMENT_ACTION_STEP_END 0xFE diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index dc1085f7ca..f94e19cf02 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -68,6 +68,8 @@ #define FLDEFF_RAYQUAZA_SPOTLIGHT 64 #define FLDEFF_DESTROY_DEOXYS_ROCK 65 #define FLDEFF_MOVE_DEOXYS_ROCK 66 +#define FLDEFF_USE_ROCK_CLIMB 67 +#define FLDEFF_ROCK_CLIMB_DUST 68 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 @@ -106,6 +108,8 @@ #define FLDEFFOBJ_BUBBLES 34 #define FLDEFFOBJ_SMALL_SPARKLE 35 #define FLDEFFOBJ_RAYQUAZA 36 +#define FLDEFFOBJ_ROCK_CLIMB_BLOB 37 +#define FLDEFFOBJ_ROCK_CLIMB_DUST 38 #define FLDEFF_PAL_TAG_CUT_GRASS 0x1000 #define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003 @@ -119,5 +123,6 @@ #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 +#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1012 #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 94cb0ffcaa..cc4bd7fee5 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -240,6 +240,6 @@ #define MB_UNUSED_EC 0xEC #define MB_UNUSED_ED 0xED #define MB_UNUSED_EE 0xEE -#define MB_UNUSED_EF 0xEF +#define MB_ROCK_CLIMB 0xEF #endif // GUARD_METATILE_BEHAVIORS diff --git a/include/event_scripts.h b/include/event_scripts.h index 8515597244..82d47490e9 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -541,6 +541,7 @@ extern const u8 EventScript_UseWaterfall[]; extern const u8 EventScript_CannotUseWaterfall[]; extern const u8 EventScript_UseDive[]; extern const u8 EventScript_UseDiveUnderwater[]; +extern const u8 EventScript_UseRockClimb[]; extern const u8 EventScript_FallDownHole[]; extern const u8 EventScript_FieldPoison[]; extern const u8 EventScript_EggHatch[]; diff --git a/include/field_effect.h b/include/field_effect.h index 731fb9c59f..78e2643071 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -46,5 +46,6 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b); void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority); void StartEscapeRopeFieldEffect(void); +bool8 IsRockClimbActive(void); #endif // GUARD_FIELD_EFFECTS_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index b5dae6de09..9222bf7c7e 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -145,5 +145,6 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index ae79719602..020a160c2d 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -606,6 +606,9 @@ $(FLDEFFGFXDIR)/deep_sand_footprints.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 1 +$(FLDEFFGFXDIR)/rock_climb_dust.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 @@ -630,6 +633,9 @@ $(FLDEFFGFXDIR)/short_grass.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 diff --git a/src/data/field_effects/field_effect_object_template_pointers.h b/src/data/field_effects/field_effect_object_template_pointers.h index 41d6271bf2..06166747ce 100755 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -35,6 +35,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch; const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles; const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle; const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza; +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob; +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, @@ -74,4 +76,6 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_BUBBLES] = &gFieldEffectObjectTemplate_Bubbles, [FLDEFFOBJ_SMALL_SPARKLE] = &gFieldEffectObjectTemplate_SmallSparkle, [FLDEFFOBJ_RAYQUAZA] = &gFieldEffectObjectTemplate_Rayquaza, + [FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob, + [FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 1626b9f323..5877c288ff 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -1287,3 +1287,48 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { }; static const struct SpritePalette sSpritePalette_Unused = {gObjectEventPalette2, FLDEFF_PAL_TAG_UNKNOWN}; + +static const struct SpriteFrameImage sPicTable_RockClimbBlob[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 2), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob = { + .tileTag = 0xFFFF, + .paletteTag = 0xFFFF, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_SurfBlob, + .images = sPicTable_RockClimbBlob, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateSurfBlobFieldEffect, +}; + + +static const union AnimCmd sAnim_RockClimbDust[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(2, 12), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimTable_RockClimbDust[] = +{ + sAnim_RockClimbDust, +}; +static const struct SpriteFrameImage sPicTable_RockClimbDust[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 2), +}; +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust = { + .tileTag = 0xFFFF, + .paletteTag = FLDEFF_PAL_TAG_DUST_CLOUD, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_RockClimbDust, + .images = sPicTable_RockClimbDust, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateJumpImpactEffect, +}; + +const struct SpritePalette gSpritePalette_BigDust = {gFieldEffectPal_DustCloud, FLDEFF_PAL_TAG_DUST_CLOUD}; diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 8cf7d1699f..5f2d7cb9e0 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -261,6 +261,13 @@ u8 MovementAction_FlyUp_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementAction_Fly_Finish(struct ObjectEvent *, struct Sprite *); u8 MovementAction_FlyDown_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementAction_FlyDown_Step1(struct ObjectEvent *, struct Sprite *); +//fast diagonal +u8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *, struct Sprite *); + u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *); @@ -420,6 +427,12 @@ u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *, u8 (*const gMovementActionFuncs_Figure8[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *); +//fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); + u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -580,6 +593,12 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_FIGURE_8] = gMovementActionFuncs_Figure8, [MOVEMENT_ACTION_FLY_UP] = gMovementActionFuncs_FlyUp, [MOVEMENT_ACTION_FLY_DOWN] = gMovementActionFuncs_FlyDown, + //fast diagonal + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT] = gMovementActionFuncs_WalkFastDiagonalUpLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT] = gMovementActionFuncs_WalkFastDiagonalUpRight, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT] = gMovementActionFuncs_WalkFastDiagonalDownLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT] = gMovementActionFuncs_WalkFastDiagonalDownRight, + }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1511,3 +1530,29 @@ u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *, MovementAction_DestroyExtraTaskIfAtTop_Step0, MovementAction_Finish, }; + +// fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 50fc6715c7..ac2190ea57 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -286,6 +286,8 @@ const u32 gObjectEventPic_LansatBerryTree[] = INCBIN_U32("graphics/object_events const u32 gObjectEventPic_DurinBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/durin.4bpp"); const u32 gObjectEventPic_TamatoBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/tamato.4bpp"); const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/field_effects/pics/surf_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbBlob[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbDust[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_dust.4bpp"); const u32 gObjectEventPic_QuintyPlump[] = INCBIN_U32("graphics/object_events/pics/people/quinty_plump.4bpp"); const u16 gObjectEventPalette12[] = INCBIN_U16("graphics/object_events/palettes/12.gbapal"); const u16 gObjectEventPalette13[] = INCBIN_U16("graphics/object_events/palettes/13.gbapal"); @@ -325,6 +327,7 @@ const u32 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U32("graphics/field_ const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/field_effects/pics/sand_disguise_placeholder.4bpp"); const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effects/pics/hot_springs_water.4bpp"); const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal"); +const u16 gFieldEffectPal_DustCloud[] = INCBIN_U16("graphics/field_effects/palettes/big_dust.gbapal"); const u32 gFieldEffectObjectPic_AshPuff[] = INCBIN_U32("graphics/field_effects/pics/ash_puff.4bpp"); const u32 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp"); const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp"); diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 3c3a3e1ce3..64e128af74 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -717,6 +717,7 @@ enum FIELD_MOVE_MILK_DRINK, FIELD_MOVE_SOFT_BOILED, FIELD_MOVE_SWEET_SCENT, + FIELD_MOVE_ROCK_CLIMB, }; // What a weird choice of table termination; @@ -761,6 +762,7 @@ struct [MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCb_FieldMove}, [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove}, [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_CLIMB] = {gMoveNames[MOVE_ROCK_CLIMB], CursorCb_FieldMove}, }; static const u8 sPartyMenuAction_SummarySwitchCancel[] = {MENU_SUMMARY, MENU_SWITCH, MENU_CANCEL1}; @@ -835,7 +837,7 @@ static const u8 sPartyMenuActionCounts[] = static const u16 sFieldMoves[] = { MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, MOVE_TELEPORT, - MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, FIELD_MOVE_TERMINATOR + MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, MOVE_ROCK_CLIMB, FIELD_MOVE_TERMINATOR }; struct @@ -858,6 +860,7 @@ struct [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE}, + [FIELD_MOVE_ROCK_CLIMB] = {SetUpFieldMove_RockClimb, PARTY_MSG_CANT_USE_HERE}, }; static const u8 *const sUnionRoomTradeMessages[] = diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 72de880c85..684b2cf1ed 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -681,10 +681,10 @@ const u8 gFaceDirectionAnimNums[] = { [DIR_NORTH] = 1, [DIR_WEST] = 2, [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_SOUTHWEST] = 2, + [DIR_SOUTHEAST] = 3, + [DIR_NORTHWEST] = 2, + [DIR_NORTHEAST] = 3, }; const u8 gMoveDirectionAnimNums[] = { [DIR_NONE] = 4, @@ -692,10 +692,10 @@ const u8 gMoveDirectionAnimNums[] = { [DIR_NORTH] = 5, [DIR_WEST] = 6, [DIR_EAST] = 7, - [DIR_SOUTHWEST] = 4, - [DIR_SOUTHEAST] = 4, - [DIR_NORTHWEST] = 5, - [DIR_NORTHEAST] = 5, + [DIR_SOUTHWEST] = 6, + [DIR_SOUTHEAST] = 7, + [DIR_NORTHWEST] = 6, + [DIR_NORTHEAST] = 7, }; const u8 gMoveDirectionFastAnimNums[] = { [DIR_NONE] = 8, @@ -703,10 +703,10 @@ const u8 gMoveDirectionFastAnimNums[] = { [DIR_NORTH] = 9, [DIR_WEST] = 10, [DIR_EAST] = 11, - [DIR_SOUTHWEST] = 8, - [DIR_SOUTHEAST] = 8, - [DIR_NORTHWEST] = 9, - [DIR_NORTHEAST] = 9, + [DIR_SOUTHWEST] = 10, + [DIR_SOUTHEAST] = 11, + [DIR_NORTHWEST] = 10, + [DIR_NORTHEAST] = 11, }; const u8 gMoveDirectionFasterAnimNums[] = { [DIR_NONE] = 12, @@ -736,10 +736,10 @@ const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon [DIR_NORTH] = 21, [DIR_WEST] = 22, [DIR_EAST] = 23, - [DIR_SOUTHWEST] = 20, - [DIR_SOUTHEAST] = 20, - [DIR_NORTHWEST] = 21, - [DIR_NORTHEAST] = 21, + [DIR_SOUTHWEST] = 22, + [DIR_SOUTHEAST] = 23, + [DIR_NORTHWEST] = 22, + [DIR_NORTHEAST] = 23, }; const u8 gAcroWheelieDirectionAnimNums[] = { [DIR_NONE] = 20, @@ -969,6 +969,10 @@ const u8 gJumpSpecialMovementActions[] = { MOVEMENT_ACTION_JUMP_SPECIAL_UP, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; const u8 gWalkInPlaceSlowMovementActions[] = { MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, @@ -9006,3 +9010,40 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr { return TRUE; } + +// fast diagonal +bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index fab14c5776..73c9fa9bda 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -9,6 +9,7 @@ #include "event_scripts.h" #include "fieldmap.h" #include "field_control_avatar.h" +#include "field_effect.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_screen_effect.h" @@ -409,6 +410,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me return EventScript_Questionnaire; if (MetatileBehavior_IsTrainerHillTimer(metatileBehavior) == TRUE) return EventScript_TrainerHillTimer; + if (MetatileBehavior_IsRockClimbable(metatileBehavior) == TRUE && !IsRockClimbActive()) + return EventScript_UseRockClimb; height = position->height; if (height == MapGridGetZCoordAt(position->x, position->y)) diff --git a/src/field_effect.c b/src/field_effect.c index b64902c0ec..c7ffa23f4a 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -231,6 +231,18 @@ static void SpriteCB_DeoxysRockFragment(struct Sprite* sprite); static void Task_MoveDeoxysRock(u8 taskId); +static void Task_UseRockClimb(u8); +static bool8 RockClimb_Init(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_FieldMovePose(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ShowMon(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent); +//static bool8 RockClimb_RideUp(struct Task *, struct ObjectEvent *); +//static bool8 RockClimb_RideDown(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ContinueRideOrEnd(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent); // Static RAM declarations static u8 sActiveList[32]; @@ -3880,3 +3892,256 @@ static void Task_MoveDeoxysRock(u8 taskId) } } +// ROCK CLIMB +enum RockClimbState +{ + STATE_ROCK_CLIMB_INIT, + STATE_ROCK_CLIMB_POSE, + STATE_ROCK_CLIMB_SHOW_MON, + STATE_ROCK_CLIMB_JUMP_ON, + STATE_ROCK_CLIMB_WAIT_JUMP, + STATE_ROCK_CLIMB_RIDE, + STATE_ROCK_CLIMB_CONTINUE_RIDE, + STATE_ROCK_CLIMB_STOP_INIT, + STATE_ROCK_CLIMB_WAIT_STOP +}; + +#define tState data[0] +#define tDestX data[1] +#define tDestY data[2] +#define tMonId data[15] + +static u8 CreateRockClimbBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = 0; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -1; + sprite->data[6] = -1; + sprite->data[7] = -1; + } + + return spriteId; +} + +bool8 (*const sRockClimbFieldEffectFuncs[])(struct Task *, struct ObjectEvent *) = +{ + [STATE_ROCK_CLIMB_INIT] = RockClimb_Init, + [STATE_ROCK_CLIMB_POSE] = RockClimb_FieldMovePose, + [STATE_ROCK_CLIMB_SHOW_MON] = RockClimb_ShowMon, + [STATE_ROCK_CLIMB_JUMP_ON] = RockClimb_JumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_WAIT_JUMP] = RockClimb_WaitJumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_RIDE] = RockClimb_Ride, + [STATE_ROCK_CLIMB_CONTINUE_RIDE] = RockClimb_ContinueRideOrEnd, + [STATE_ROCK_CLIMB_STOP_INIT] = RockClimb_StopRockClimbInit, + [STATE_ROCK_CLIMB_WAIT_STOP] = RockClimb_WaitStopRockClimb +}; + +bool8 FldEff_UseRockClimb(void) +{ + u8 taskId; + taskId = CreateTask(Task_UseRockClimb, 0xff); + gTasks[taskId].tMonId = gFieldEffectArguments[0]; + Task_UseRockClimb(taskId); + return FALSE; +} + +static void Task_UseRockClimb(u8 taskId) +{ + while (sRockClimbFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])); +} + +static bool8 RockClimb_Init(struct Task *task, struct ObjectEvent *objectEvent) +{ + ScriptContext2_Enable(); + FreezeObjectEvents(); + gPlayerAvatar.preventStep = TRUE; + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->tDestX, &task->tDestY); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_FieldMovePose(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetPlayerAvatarFieldMove(); + ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); + task->tState++; + } + return FALSE; +} + +static bool8 RockClimb_ShowMon(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventCheckHeldMovementStatus(objectEvent)) + { + gFieldEffectArguments[0] = task->tMonId | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->tState++; + return TRUE; + } + return FALSE; +} + +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); + ObjectEventClearHeldMovementIfFinished(objectEvent); + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection)); + gFieldEffectArguments[0] = task->tDestX; + gFieldEffectArguments[1] = task->tDestY; + gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; + objectEvent->fieldEffectSpriteId = CreateRockClimbBlob(); + task->tState++; + } + + return FALSE; +} + +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetSurfBobState(objectEvent->fieldEffectSpriteId, 1); + switch (objectEvent->facingDirection) + { + case DIR_EAST: + //check southeast then northeast + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHEAST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHEAST; + break; + case DIR_WEST: + //check northwest then southwest + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHWEST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHWEST; + break; + } + + task->tState++; + } + + return FALSE; +} + +struct RockClimbRide +{ + u8 action; + s8 dx; + s8 dy; + u8 jumpDir; +}; +static const struct RockClimbRide sRockClimbMovement[] = +{ + [DIR_NONE] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, 0, DIR_NONE}, + [DIR_SOUTH] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, -1, DIR_SOUTH}, + [DIR_NORTH] = {MOVEMENT_ACTION_WALK_FAST_UP, 0, 1, DIR_NORTH}, + [DIR_WEST] = {MOVEMENT_ACTION_WALK_FAST_LEFT, 1, 1, DIR_WEST}, + [DIR_EAST] = {MOVEMENT_ACTION_WALK_FAST_RIGHT, -1, -1, DIR_EAST}, + [DIR_SOUTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT, 1, -1, DIR_WEST}, + [DIR_SOUTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT, -1, -1, DIR_EAST}, + [DIR_NORTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT, 1, 1, DIR_WEST}, + [DIR_NORTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT, -1, 1, DIR_EAST}, +}; + +static void RockClimbDust(struct ObjectEvent *objectEvent, u8 direction) +{ + s8 dx = sRockClimbMovement[direction].dx; + s8 dy = sRockClimbMovement[direction].dy; + + gFieldEffectArguments[0] = objectEvent->currentCoords.x + dx; + gFieldEffectArguments[1] = objectEvent->currentCoords.y + dy; + gFieldEffectArguments[2] = objectEvent->previousElevation; + gFieldEffectArguments[3] = gSprites[objectEvent->spriteId].oam.priority; + FieldEffectStart(FLDEFF_ROCK_CLIMB_DUST); +} + +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent) +{ + ObjectEventSetHeldMovement(objectEvent, sRockClimbMovement[objectEvent->movementDirection].action); + PlaySE(SE_M_ROCK_THROW); + RockClimbDust(objectEvent, objectEvent->movementDirection); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(objectEvent->movementDirection, &task->tDestX, &task->tDestY); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX, task->tDestY))) + { + task->tState = STATE_ROCK_CLIMB_RIDE; + return TRUE; + } + + ScriptContext2_Enable(); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; + task->tState++; + return FALSE; +} + +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventIsMovementOverridden(objectEvent)) + { + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + } + + RockClimbDust(objectEvent, DIR_NONE); //dust on final spot + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(sRockClimbMovement[objectEvent->movementDirection].jumpDir)); + SetSurfBobState(objectEvent->fieldEffectSpriteId, 0); + task->tState++; + return TRUE; +} + +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL)); + ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection)); + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB); + DestroyTask(FindTaskIdByFunc(Task_UseRockClimb)); + } + + return FALSE; +} + +bool8 IsRockClimbActive(void) +{ + if (FieldEffectActiveListContains(FLDEFF_USE_ROCK_CLIMB)) + return TRUE; + else + return FALSE; +} + + +#undef tState +#undef tDestX +#undef tDestY +#undef tMonId + diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 886e023d1c..29f4272c86 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1057,10 +1057,12 @@ static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite * { sprite->pos2.y += sprite->data[3]; } + if ((sprite->data[4] & 0x0F) == 0) { sprite->data[3] = -sprite->data[3]; } + if (bobState != 2) { if (GetSurfBobWhileFishingState(sprite) == 0) @@ -1120,6 +1122,24 @@ u32 FldEff_Dust(void) return 0; } +u32 FldEff_RockClimbDust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = FLDEFF_ROCK_CLIMB_DUST; + } + return 0; +} + u32 FldEff_SandPile(void) { u8 objectEventId; diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 435ad72336..151a7a29ec 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -249,7 +249,7 @@ static const u8 sTileBitAttributes[] = [MB_UNUSED_EC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_UNUSED_ED] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), [MB_UNUSED_EE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - [MB_UNUSED_EF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + [MB_ROCK_CLIMB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) @@ -1488,3 +1488,11 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior) else return FALSE; } + +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior) +{ + if (metatileBehavior == MB_ROCK_CLIMB) + return TRUE; + else + return FALSE; +} diff --git a/src/party_menu.c b/src/party_menu.c index 7514cf545e..2fedc54f8e 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -405,6 +405,7 @@ static bool8 SetUpFieldMove_Surf(void); static bool8 SetUpFieldMove_Fly(void); static bool8 SetUpFieldMove_Waterfall(void); static bool8 SetUpFieldMove_Dive(void); +static bool8 SetUpFieldMove_RockClimb(void); // static const data #include "data/pokemon/tutor_learnsets.h" @@ -6353,3 +6354,24 @@ void IsLastMonThatKnowsSurf(void) gSpecialVar_Result = TRUE; } } + +static void FieldCallback_RockClimb(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + FieldEffectStart(FLDEFF_USE_ROCK_CLIMB); +} + +static bool8 SetUpFieldMove_RockClimb(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(x, y))) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_RockClimb; + return TRUE; + } + + return FALSE; +} From 7d1a1abe51950796d9433999ca1e8d8646b7a792 Mon Sep 17 00:00:00 2001 From: Jaizu Date: Mon, 31 Aug 2020 12:12:32 +0200 Subject: [PATCH 002/248] Update Rock Climb script Small fixes and make it more consistent with other field move scripts. --- data/scripts/field_move_scripts.inc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index d04304abc9..5d1cb31fcb 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -302,7 +302,6 @@ EventScript_FailSweetScent:: @ 8290CAE Text_FailSweetScent: @ 8290CB7 .string "Looks like there's nothing here…$" - EventScript_UseRockClimb:: lockall checkpartymove MOVE_ROCK_CLIMB @@ -314,16 +313,25 @@ EventScript_UseRockClimb:: compare VAR_RESULT, NO goto_if_eq EventScript_EndRockClimb msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT + closemessage dofieldeffect FLDEFF_USE_ROCK_CLIMB + waitstate goto EventScript_EndRockClimb -EventScript_CantRockClimb:: @ 8290A84 + +EventScript_CantRockClimb:: msgbox Text_CantRockClimb, MSGBOX_DEFAULT -EventScript_EndRockClimb:: @ 8290A8C + +EventScript_EndRockClimb:: releaseall end + Text_WantToRockClimb: - .string "The cliff is steep.\nWould you like to use Rock Climb?$" + .string "The cliff is steep.\n" + .string "Would you like to use Rock Climb?$" + Text_MonUsedRockClimb: .string "{STR_VAR_1} used Rock Climb!$" + Text_CantRockClimb: - .string "The cliff is steep.\nA Pokémon may be able to climb it.$" + .string "The cliff is steep.\n" + .string "A Pokémon may be able to climb it.$" From 50d20131ff32cf557e8a4addf8c2bbfa6fcab23f Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 1 Sep 2020 16:13:34 -0600 Subject: [PATCH 003/248] fix single climbable tile (thx skeli) --- src/field_effect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_effect.c b/src/field_effect.c index c7ffa23f4a..1ecbeb482f 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4033,7 +4033,7 @@ static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectE break; } - task->tState++; + task->tState = STATE_ROCK_CLIMB_CONTINUE_RIDE; } return FALSE; From 529709b5ec6d0448d07c5514e21466ceef2ecb6b Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 14 Sep 2020 20:08:08 -0600 Subject: [PATCH 004/248] fix diagonal surf blob facing --- src/field_effect_helpers.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 29f4272c86..ae0e1c04f0 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1013,10 +1013,10 @@ static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite * [DIR_NORTH] = 1, [DIR_WEST] = 2, [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_SOUTHWEST] = 2, + [DIR_SOUTHEAST] = 3, + [DIR_NORTHWEST] = 2, + [DIR_NORTHEAST] = 3, }; if (GetSurfBobWhileFlyingOutState(sprite) == 0) From 8f5bef1ec578192c58239748b837fb56b8d8a260 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 25 Oct 2020 09:46:28 -0600 Subject: [PATCH 005/248] follower attaches to riding player --- include/constants/global.h | 2 ++ src/field_effect.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/constants/global.h b/include/constants/global.h index 55830ae8b2..2f256e7bbc 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -117,4 +117,6 @@ #define DIR_NORTHWEST 7 #define DIR_NORTHEAST 8 +#define FOLLOW_ME_IMPLEMENTED FALSE + #endif // GUARD_CONSTANTS_GLOBAL_H diff --git a/src/field_effect.c b/src/field_effect.c index 1ecbeb482f..f524d90583 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -245,6 +245,10 @@ static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent * static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent); // Static RAM declarations +#if FOLLOW_ME_IMPLEMENTED +static void TryAttachFollowerToPlayer(void); +#endif + static u8 sActiveList[32]; // External declarations @@ -1882,6 +1886,10 @@ static bool8 WaterfallFieldEffect_ContinueRideOrEnd(struct Task *task, struct Ob { if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) return FALSE; + + #if FOLLOW_ME_IMPLEMENTED + TryAttachFollowerToPlayer(); + #endif if (MetatileBehavior_IsWaterfall(objectEvent->currentMetatileBehavior)) { @@ -4085,6 +4093,10 @@ static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent * if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) return FALSE; + #if FOLLOW_ME_IMPLEMENTED + TryAttachFollowerToPlayer(); + #endif + PlayerGetDestCoords(&task->tDestX, &task->tDestY); MoveCoords(objectEvent->movementDirection, &task->tDestX, &task->tDestY); if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX, task->tDestY))) @@ -4140,6 +4152,19 @@ bool8 IsRockClimbActive(void) } +#if FOLLOW_ME_IMPLEMENTED +static void TryAttachFollowerToPlayer(void) +{ + if (gFollowerState.inProgress) + { + //Keep the follow close by while its hidden to prevent it from going too far out of view + struct ObjectEvent* player = &gObjectEvents[gPlayerAvatar.eventObjectId]; + struct ObjectEvent* follower = &gObjectEvents[GetFollowerMapObjId()]; + MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y); + } +} +#endif + #undef tState #undef tDestX #undef tDestY From 8c556c727405be16a7c74e2af41d93e3bea450fb Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 25 Oct 2020 09:50:16 -0600 Subject: [PATCH 006/248] fix follower check --- src/field_effect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_effect.c b/src/field_effect.c index f524d90583..70075d2496 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4155,7 +4155,7 @@ bool8 IsRockClimbActive(void) #if FOLLOW_ME_IMPLEMENTED static void TryAttachFollowerToPlayer(void) { - if (gFollowerState.inProgress) + if (PlayerHasFollower()) { //Keep the follow close by while its hidden to prevent it from going too far out of view struct ObjectEvent* player = &gObjectEvents[gPlayerAvatar.eventObjectId]; From c66b03e0832be9ef0ad2521a28f07f251018eb82 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 25 Oct 2020 09:52:17 -0600 Subject: [PATCH 007/248] fix player avatar element --- src/field_effect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_effect.c b/src/field_effect.c index 70075d2496..93ac5dbab0 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4158,7 +4158,7 @@ static void TryAttachFollowerToPlayer(void) if (PlayerHasFollower()) { //Keep the follow close by while its hidden to prevent it from going too far out of view - struct ObjectEvent* player = &gObjectEvents[gPlayerAvatar.eventObjectId]; + struct ObjectEvent* player = &gObjectEvents[gPlayerAvatar.objectEventId]; struct ObjectEvent* follower = &gObjectEvents[GetFollowerMapObjId()]; MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y); } From 15f7a6ecbb88c6f1c8e6940844ff95d06688fdcd Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 3 Dec 2020 14:35:04 -0500 Subject: [PATCH 008/248] fix rock climb retaining bike flags --- src/field_effect.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field_effect.c b/src/field_effect.c index 734c103ca6..00c456dfe5 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3972,6 +3972,7 @@ static bool8 RockClimb_Init(struct Task *task, struct ObjectEvent *objectEvent) ScriptContext2_Enable(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); PlayerGetDestCoords(&task->tDestX, &task->tDestY); MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->tDestX, &task->tDestY); task->tState++; @@ -4107,6 +4108,7 @@ static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent * ScriptContext2_Enable(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; task->tState++; return FALSE; From df145ecb24ac7ae65699d66d46b87dee335a07cb Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 7 Feb 2021 11:44:40 -0700 Subject: [PATCH 009/248] fix rock climb not unfreezing objects. Thx Sph. Ice --- src/field_effect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field_effect.c b/src/field_effect.c index a1858ba572..1b9fe6347e 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4143,6 +4143,7 @@ static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent * ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL)); ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection)); gPlayerAvatar.preventStep = FALSE; + UnfreezeObjectEvents(); ScriptContext2_Disable(); DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB); From af36b25817e45824edef3f3609b82a86de6cd230 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 14 Jun 2021 11:34:08 -0600 Subject: [PATCH 010/248] trigger ground effects on rock climb dismount --- src/field_effect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field_effect.c b/src/field_effect.c index 8285bf3dfc..bd036aa3cb 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4140,6 +4140,7 @@ static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent * ScriptContext2_Disable(); DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB); + objectEvent->triggerGroundEffectsOnMove = TRUE; // e.g. if dismount on grass DestroyTask(FindTaskIdByFunc(Task_UseRockClimb)); } From df46fe1700ca1ae1e33b44f01786ee9e3653322e Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 14 Jun 2021 12:47:18 -0600 Subject: [PATCH 011/248] rename relevant functions --- include/constants/moves.h | 4 ++++ src/data/party_menu.h | 8 +++++++- src/event_object_movement.c | 10 +++++----- src/field_effect.c | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 85c02e3da5..51a9b3c27c 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -1,6 +1,10 @@ #ifndef GUARD_CONSTANTS_MOVES_H #define GUARD_CONSTANTS_MOVES_H +#ifndef BATTLE_ENGINE + #define MOVE_ROCK_CLIMB 1 +#endif + #define MOVE_NONE 0 #define MOVE_POUND 1 #define MOVE_KARATE_CHOP 2 diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 7852b9decc..9696502ceb 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -762,7 +762,9 @@ struct [MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCb_FieldMove}, [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove}, [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove}, + #ifdef BATTLE_ENGINE [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_CLIMB] = {gMoveNames[MOVE_ROCK_CLIMB], CursorCb_FieldMove}, + #endif }; static const u8 sPartyMenuAction_SummarySwitchCancel[] = {MENU_SUMMARY, MENU_SWITCH, MENU_CANCEL1}; @@ -837,7 +839,11 @@ static const u8 sPartyMenuActionCounts[] = static const u16 sFieldMoves[] = { MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, MOVE_TELEPORT, - MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, MOVE_ROCK_CLIMB, FIELD_MOVE_TERMINATOR + MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, + #ifdef BATTLE_ENGINE + MOVE_ROCK_CLIMB, + #endif + FIELD_MOVE_TERMINATOR }; struct diff --git a/src/event_object_movement.c b/src/event_object_movement.c index e52cdc5146..e54bf8d52f 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -9025,31 +9025,31 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr // fast diagonal bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 1); + InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, 1); return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 1); + InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, 1); return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 1); + InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, 1); return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 1); + InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, 1); return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { sprite->data[2] = 2; return TRUE; diff --git a/src/field_effect.c b/src/field_effect.c index bd036aa3cb..a2129f1cee 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4023,7 +4023,7 @@ static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectE { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { - SetSurfBobState(objectEvent->fieldEffectSpriteId, 1); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); switch (objectEvent->facingDirection) { case DIR_EAST: @@ -4124,7 +4124,7 @@ static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent * RockClimbDust(objectEvent, DIR_NONE); //dust on final spot ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(sRockClimbMovement[objectEvent->movementDirection].jumpDir)); - SetSurfBobState(objectEvent->fieldEffectSpriteId, 0); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE); task->tState++; return TRUE; } From a626b4be1987b0952694cfd9ba5815fedfe79a87 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 20 Dec 2021 13:04:04 -0500 Subject: [PATCH 012/248] fix end rock climb --- src/field_effect.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/field_effect.c b/src/field_effect.c index e5ee0b34df..009f4a8c2b 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -4106,7 +4106,6 @@ static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent * ScriptContext2_Enable(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; task->tState++; return FALSE; From 8cf7de166ceceb1f99764c54632d51446fe9ff50 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sun, 4 Aug 2024 12:32:26 -0400 Subject: [PATCH 013/248] use gMovesInfo for rock climb given expansion's changes --- src/data/party_menu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 555f91f793..2518fc669d 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -691,7 +691,7 @@ struct [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove}, [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove}, #ifdef BATTLE_ENGINE - [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_CLIMB] = {gMoveNames[MOVE_ROCK_CLIMB], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_CLIMB] = {gMovesInfo[MOVE_ROCK_CLIMB].name, CursorCb_FieldMove}, #endif }; From 0e968b31a9a17de7f3da78694460251bdab4510d Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 30 May 2025 21:24:29 +0200 Subject: [PATCH 014/248] Start of 1.13 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index b0e7397b56..2471c067e6 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -3,8 +3,8 @@ // Last version: 1.12.0 #define EXPANSION_VERSION_MAJOR 1 -#define EXPANSION_VERSION_MINOR 12 -#define EXPANSION_VERSION_PATCH 1 +#define EXPANSION_VERSION_MINOR 13 +#define EXPANSION_VERSION_PATCH 0 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. From 6e64f6f5ef1152cb16b972c19bc81ce2a0152e6f Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 30 May 2025 23:10:54 +0200 Subject: [PATCH 015/248] New sprite compressor (#5627) Co-authored-by: Hedara Co-authored-by: DizzyEggg Co-authored-by: Raymond Dodge --- .gitignore | 5 + Makefile | 21 +- include/config/test.h | 3 + include/decompress.h | 63 +- include/decompress_error_handler.h | 15 + make_tools.mk | 2 +- .../1.13/convert_compressed_files.py | 67 + src/battle_anim.c | 8 +- src/battle_anim_mons.c | 2 +- src/battle_bg.c | 164 +- src/battle_dome.c | 2 +- src/battle_gfx_sfx_util.c | 8 +- src/battle_pyramid_bag.c | 2 +- src/battle_transition.c | 36 +- src/battle_transition_frontier.c | 4 +- src/berry_blender.c | 6 +- src/berry_fix_graphics.c | 5 +- src/berry_fix_program.c | 5 +- src/berry_tag_screen.c | 4 +- src/bg.c | 3 +- src/contest.c | 8 +- src/contest_painting.c | 2 +- src/contest_util.c | 2 +- src/credits.c | 6 +- src/decompress.c | 1088 ++- src/decompress_asm.s | 131 + src/decompress_error_handler.c | 197 + src/decoration.c | 2 +- src/dexnav.c | 2 +- src/diploma.c | 2 +- src/dodrio_berry_picking.c | 9 +- src/expansion_intro.c | 8 +- src/field_effect.c | 2 +- src/fldeff_flash.c | 9 +- src/intro.c | 50 +- src/intro_credits_graphics.c | 36 +- src/item_icon.c | 4 +- src/item_menu.c | 2 +- src/main_menu.c | 8 +- src/menu.c | 19 +- src/mystery_gift_view.c | 4 +- src/naming_screen.c | 3 +- src/party_menu.c | 2 +- src/pokeball.c | 2 +- src/pokeblock.c | 2 +- src/pokeblock_feed.c | 2 +- src/pokedex_area_screen.c | 3 +- src/pokemon_sprite_visualizer.c | 56 +- src/pokemon_storage_system.c | 12 +- src/pokemon_summary_screen.c | 10 +- src/pokenav_conditions_gfx.c | 4 +- src/pokenav_main_menu.c | 4 +- src/pokenav_region_map.c | 2 +- src/rayquaza_scene.c | 30 +- src/region_map.c | 15 +- src/roulette.c | 2 - src/save_failed_screen.c | 8 +- src/shop.c | 2 +- src/slot_machine.c | 6 +- src/sprite.c | 6 + src/starter_choose.c | 6 +- src/title_screen.c | 12 +- src/trade.c | 6 +- src/trainer_card.c | 27 +- src/use_pokeblock.c | 8 +- src/wallclock.c | 6 +- src/window.c | 3 +- test/compression/complex_battle_sprite.png | Bin 0 -> 2313 bytes test/compression/gossifleur.png | Bin 0 -> 705 bytes test/compression/large_mode_0.png | Bin 0 -> 5090 bytes test/compression/large_mode_1.png | Bin 0 -> 5090 bytes test/compression/large_mode_2.png | Bin 0 -> 5090 bytes test/compression/large_mode_3.png | Bin 0 -> 11311 bytes test/compression/large_mode_4.png | Bin 0 -> 11311 bytes test/compression/large_mode_5.png | Bin 0 -> 11311 bytes test/compression/ledian.png | Bin 0 -> 1325 bytes test/compression/medium_mode_0.png | Bin 0 -> 88 bytes test/compression/medium_mode_1.png | Bin 0 -> 997 bytes test/compression/medium_mode_2.png | Bin 0 -> 373 bytes test/compression/medium_mode_3.png | Bin 0 -> 800 bytes test/compression/medium_mode_4.png | Bin 0 -> 800 bytes test/compression/medium_mode_5.png | Bin 0 -> 1316 bytes test/compression/mr_mime.png | Bin 0 -> 1151 bytes test/compression/secondary_tileset.png | Bin 0 -> 1740 bytes test/compression/simple_battle_sprite.png | Bin 0 -> 368 bytes test/compression/small_bubbles.png | Bin 0 -> 255 bytes test/compression/small_mode_0.png | Bin 0 -> 160 bytes test/compression/small_mode_1.png | Bin 0 -> 139 bytes test/compression/small_mode_2.png | Bin 0 -> 147 bytes test/compression/small_mode_3.png | Bin 0 -> 5019 bytes test/compression/small_mode_4.png | Bin 0 -> 5019 bytes test/compression/small_mode_5.png | Bin 0 -> 195 bytes test/compression/smol.c | 6337 +++++++++++++++++ test/compression/table_32_32.png | Bin 0 -> 295 bytes test/compression/table_33_31.png | Bin 0 -> 320 bytes test/compression/table_34_30.png | Bin 0 -> 319 bytes test/compression/table_35_29.png | Bin 0 -> 308 bytes test/compression/table_36_28.png | Bin 0 -> 318 bytes test/compression/table_37_27.png | Bin 0 -> 295 bytes test/compression/table_38_26.png | Bin 0 -> 309 bytes test/compression/table_39_25.png | Bin 0 -> 305 bytes test/compression/table_40_24.png | Bin 0 -> 273 bytes test/compression/table_41_23.png | Bin 0 -> 291 bytes test/compression/table_42_22.png | Bin 0 -> 316 bytes test/compression/table_43_21.png | Bin 0 -> 296 bytes test/compression/table_44_20.png | Bin 0 -> 314 bytes test/compression/table_45_19.png | Bin 0 -> 326 bytes test/compression/table_46_18.png | Bin 0 -> 335 bytes test/compression/table_47_17.png | Bin 0 -> 297 bytes test/compression/table_48_16.png | Bin 0 -> 309 bytes test/compression/table_49_15.png | Bin 0 -> 302 bytes test/compression/table_50_14.png | Bin 0 -> 304 bytes test/compression/table_51_13.png | Bin 0 -> 310 bytes test/compression/table_52_12.png | Bin 0 -> 299 bytes test/compression/table_53_11.png | Bin 0 -> 301 bytes test/compression/table_54_10.png | Bin 0 -> 317 bytes test/compression/table_55_9.png | Bin 0 -> 297 bytes test/compression/table_56_8.png | Bin 0 -> 307 bytes test/compression/table_57_7.png | Bin 0 -> 288 bytes test/compression/table_58_6.png | Bin 0 -> 311 bytes test/compression/table_59_5.png | Bin 0 -> 318 bytes test/compression/table_60_4.png | Bin 0 -> 311 bytes test/compression/table_61_3.png | Bin 0 -> 307 bytes test/compression/table_62_2.png | Bin 0 -> 307 bytes test/compression/table_63_1.png | Bin 0 -> 297 bytes test/compression/tilemap.bin | Bin 0 -> 1200 bytes test/compression/tilemapLarge.bin | Bin 0 -> 8192 bytes test/compression/tilesetTest.png | Bin 0 -> 7622 bytes tools/compresSmol/Makefile | 31 + tools/compresSmol/compresSmol.cpp | 262 + tools/compresSmol/compressAlgo.cpp | 1467 ++++ tools/compresSmol/compressAlgo.h | 178 + tools/compresSmol/compressSmolTiles.cpp | 264 + tools/compresSmol/compressSmolTiles.h | 62 + tools/compresSmol/fileDispatcher.cpp | 45 + tools/compresSmol/fileDispatcher.h | 22 + tools/compresSmol/mainTiles.cpp | 73 + tools/compresSmol/tANS.cpp | 318 + tools/compresSmol/tANS.h | 63 + 139 files changed, 11017 insertions(+), 360 deletions(-) create mode 100644 include/decompress_error_handler.h create mode 100644 migration_scripts/1.13/convert_compressed_files.py create mode 100644 src/decompress_asm.s create mode 100644 src/decompress_error_handler.c create mode 100644 test/compression/complex_battle_sprite.png create mode 100644 test/compression/gossifleur.png create mode 100644 test/compression/large_mode_0.png create mode 100644 test/compression/large_mode_1.png create mode 100644 test/compression/large_mode_2.png create mode 100644 test/compression/large_mode_3.png create mode 100644 test/compression/large_mode_4.png create mode 100644 test/compression/large_mode_5.png create mode 100644 test/compression/ledian.png create mode 100644 test/compression/medium_mode_0.png create mode 100644 test/compression/medium_mode_1.png create mode 100644 test/compression/medium_mode_2.png create mode 100644 test/compression/medium_mode_3.png create mode 100644 test/compression/medium_mode_4.png create mode 100644 test/compression/medium_mode_5.png create mode 100644 test/compression/mr_mime.png create mode 100644 test/compression/secondary_tileset.png create mode 100644 test/compression/simple_battle_sprite.png create mode 100644 test/compression/small_bubbles.png create mode 100644 test/compression/small_mode_0.png create mode 100644 test/compression/small_mode_1.png create mode 100644 test/compression/small_mode_2.png create mode 100644 test/compression/small_mode_3.png create mode 100644 test/compression/small_mode_4.png create mode 100644 test/compression/small_mode_5.png create mode 100644 test/compression/smol.c create mode 100644 test/compression/table_32_32.png create mode 100644 test/compression/table_33_31.png create mode 100644 test/compression/table_34_30.png create mode 100644 test/compression/table_35_29.png create mode 100644 test/compression/table_36_28.png create mode 100644 test/compression/table_37_27.png create mode 100644 test/compression/table_38_26.png create mode 100644 test/compression/table_39_25.png create mode 100644 test/compression/table_40_24.png create mode 100644 test/compression/table_41_23.png create mode 100644 test/compression/table_42_22.png create mode 100644 test/compression/table_43_21.png create mode 100644 test/compression/table_44_20.png create mode 100644 test/compression/table_45_19.png create mode 100644 test/compression/table_46_18.png create mode 100644 test/compression/table_47_17.png create mode 100644 test/compression/table_48_16.png create mode 100644 test/compression/table_49_15.png create mode 100644 test/compression/table_50_14.png create mode 100644 test/compression/table_51_13.png create mode 100644 test/compression/table_52_12.png create mode 100644 test/compression/table_53_11.png create mode 100644 test/compression/table_54_10.png create mode 100644 test/compression/table_55_9.png create mode 100644 test/compression/table_56_8.png create mode 100644 test/compression/table_57_7.png create mode 100644 test/compression/table_58_6.png create mode 100644 test/compression/table_59_5.png create mode 100644 test/compression/table_60_4.png create mode 100644 test/compression/table_61_3.png create mode 100644 test/compression/table_62_2.png create mode 100644 test/compression/table_63_1.png create mode 100644 test/compression/tilemap.bin create mode 100644 test/compression/tilemapLarge.bin create mode 100644 test/compression/tilesetTest.png create mode 100644 tools/compresSmol/Makefile create mode 100644 tools/compresSmol/compresSmol.cpp create mode 100644 tools/compresSmol/compressAlgo.cpp create mode 100644 tools/compresSmol/compressAlgo.h create mode 100644 tools/compresSmol/compressSmolTiles.cpp create mode 100644 tools/compresSmol/compressSmolTiles.h create mode 100644 tools/compresSmol/fileDispatcher.cpp create mode 100644 tools/compresSmol/fileDispatcher.h create mode 100644 tools/compresSmol/mainTiles.cpp create mode 100644 tools/compresSmol/tANS.cpp create mode 100644 tools/compresSmol/tANS.h diff --git a/.gitignore b/.gitignore index 6d9453242a..d7071897e6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ *.8bpp *.gbapal *.lz +*.smol +*.fastSmol +*.smolTM *.rl *.latfont *.hwjpnfont @@ -41,6 +44,8 @@ prefabs.json /pokeemerald-*.png src/data/map_group_count.h tools/trainerproc/trainerproc +tools/compresSmol/compresSmol +tools/compresSmol/compresSmolTilemap *.Identifier *.smol *.fastSmol diff --git a/Makefile b/Makefile index 47503834c9..b01624ac81 100644 --- a/Makefile +++ b/Makefile @@ -151,6 +151,8 @@ endif AUTO_GEN_TARGETS := include make_tools.mk # Tool executables +SMOLTM := $(TOOLS_DIR)/compresSmol/compresSmolTilemap$(EXE) +SMOL := $(TOOLS_DIR)/compresSmol/compresSmol$(EXE) GFX := $(TOOLS_DIR)/gbagfx/gbagfx$(EXE) AIF := $(TOOLS_DIR)/aif2pcm/aif2pcm$(EXE) MID := $(TOOLS_DIR)/mid2agb/mid2agb$(EXE) @@ -317,7 +319,7 @@ clean-assets: rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc $(DATA_SRC_SUBDIR)/map_group_count.h find sound -iname '*.bin' -exec rm {} + - find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.smol' -o -iname '*.fastSmol' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + tidy: tidymodern tidycheck tidydebug @@ -351,13 +353,16 @@ generated: $(AUTO_GEN_TARGETS) %.pal: ; %.aif: ; -%.1bpp: %.png ; $(GFX) $< $@ -%.4bpp: %.png ; $(GFX) $< $@ -%.8bpp: %.png ; $(GFX) $< $@ -%.gbapal: %.pal ; $(GFX) $< $@ -%.gbapal: %.png ; $(GFX) $< $@ -%.lz: % ; $(GFX) $< $@ -%.rl: % ; $(GFX) $< $@ +%.1bpp: %.png ; $(GFX) $< $@ +%.4bpp: %.png ; $(GFX) $< $@ +%.8bpp: %.png ; $(GFX) $< $@ +%.gbapal: %.pal ; $(GFX) $< $@ +%.gbapal: %.png ; $(GFX) $< $@ +%.lz: % ; $(GFX) $< $@ +%.smolTM: % ; $(SMOLTM) $< $@ +%.fastSmol: % ; $(SMOL) -w $< $@ false false false +%.smol: % ; $(SMOL) -w $< $@ +%.rl: % ; $(GFX) $< $@ clean-generated: @rm -f $(AUTO_GEN_TARGETS) diff --git a/include/config/test.h b/include/config/test.h index 6122d14aa1..53801063a7 100644 --- a/include/config/test.h +++ b/include/config/test.h @@ -1139,6 +1139,9 @@ #undef B_FLAG_INVERSE_BATTLE #define B_FLAG_INVERSE_BATTLE TESTING_FLAG_INVERSE_BATTLE +// Compression DebugPrintf switch +#define T_COMPRESSION_SHOULD_PRINT FALSE + // Move animation testing #define T_SHOULD_RUN_MOVE_ANIM FALSE // If TRUE, enables the move animation tests, these are very computationally heavy and takes a long time to run. diff --git a/include/decompress.h b/include/decompress.h index cc654a49ce..5fac4f794b 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -5,9 +5,68 @@ #define MAX_DECOMPRESSION_BUFFER_SIZE 0x4000 -void LZDecompressWram(const u32 *src, void *dest); -void LZDecompressVram(const u32 *src, void *dest); +#define TANS_TABLE_SIZE 64 +#define PACKED_FREQ_MASK 0x3F +#define PARTIAL_FREQ_MASK 0xC0000000 +#define FIRST_LO_MASK 0x7f +#define CONTINUE_BIT 0x80 + +#define SMOL_IMAGE_SIZE_MULTIPLIER 4 + +struct LZ77Header { + u32 lz77IdBits:5; + u32 padding:3; + u32 size:24; +}; + +struct SmolHeader { + u32 mode:4; + u32 imageSize:14; + u32 symSize:14; + u32 initialState:6; + u32 bitstreamSize:13; + u32 loSize:13; +}; + +struct SpriteSheetHeader { + u32 mode:4; + u32 numComponents:12; + u32 framesPerComponent:16; +}; + +struct SmolTilemapHeader { + u32 mode:4; + u32 tilemapSize:14; + u32 symSize:14; + u32 tileNumberSize; +}; + +union CompressionHeader { + struct LZ77Header lz77; + struct SmolHeader smol; + struct SmolTilemapHeader smolTilemap; +}; + +enum CompressionMode { + MODE_LZ77 = 0, + BASE_ONLY = 1, + ENCODE_SYMS = 2, + ENCODE_DELTA_SYMS = 3, + ENCODE_LO = 4, + ENCODE_BOTH = 5, + ENCODE_BOTH_DELTA_SYMS = 6, + IS_FRAME_CONTAINER = 7, + IS_TILEMAP = 8, +}; + +void DecompressDataWithHeaderVram(const u32 *src, void *dest); +void DecompressDataWithHeaderWram(const u32 *src, void *dest); + +// Lucky's fast lz decompression function +void FastLZ77UnCompWram(const u32 *src, void *dest); + +// Default Decompression functions are below here u32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize); u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); diff --git a/include/decompress_error_handler.h b/include/decompress_error_handler.h new file mode 100644 index 0000000000..1eb2c34a25 --- /dev/null +++ b/include/decompress_error_handler.h @@ -0,0 +1,15 @@ +#ifndef GUARD_DECOMPRESS_ERROR_HANDLER_H +#define GUARD_DECOMPRESS_ERROR_HANDLER_H + +#include "gba/types.h" + +enum CompressionError { + NO_COMPRESSION_ERROR, + HEADER_ERROR, +}; + +void DoDecompressionError(void); +void DecompressionError_CB2(void); +void DecompressionError(const u32 *src, enum CompressionError error); + +#endif // GUARD_DECOMPRESS_ERROR_HANDLER_H diff --git a/make_tools.mk b/make_tools.mk index 75ebc05c96..6a7de5b24e 100644 --- a/make_tools.mk +++ b/make_tools.mk @@ -5,7 +5,7 @@ MAKEFLAGS += --no-print-directory # Inclusive list. If you don't want a tool to be built, don't add it here. TOOLS_DIR := tools -TOOL_NAMES := aif2pcm bin2c gbafix gbagfx jsonproc mapjson mid2agb preproc ramscrgen rsfont scaninc trainerproc +TOOL_NAMES := aif2pcm bin2c gbafix gbagfx jsonproc mapjson mid2agb preproc ramscrgen rsfont scaninc trainerproc compresSmol CHECK_TOOL_NAMES = patchelf mgba-rom-test-hydra TOOLDIRS := $(TOOL_NAMES:%=$(TOOLS_DIR)/%) diff --git a/migration_scripts/1.13/convert_compressed_files.py b/migration_scripts/1.13/convert_compressed_files.py new file mode 100644 index 0000000000..11f29708bc --- /dev/null +++ b/migration_scripts/1.13/convert_compressed_files.py @@ -0,0 +1,67 @@ +import glob +import re +import os +from pathlib import Path + +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + +primaryTileset_pattern = re.compile(r"(.*\"data/tilesets/primary/.+\.4bpp\.)lz(\".*)") +secondaryTileset_pattern = re.compile(r"(.*\"data/tilesets/secondary/.+\.4bpp\.)lz(\".*)") +tilemap_pattern = re.compile(r"(.*\"graphics/.+\.bin\.)lz(\".*)") +lzuncomp_pattern = re.compile(r"(.*)\bLZ77UnComp([WV])ram\b(\(.*)") +lzdecomp_pattern = re.compile(r"(.*)\bLZDecompress([WV])ram\b(\(.*)") + +def handle_file(fileInput): + fileTest = Path(fileInput) + if not fileTest.is_file(): + return False + allLines = list() + with open(fileInput, 'r', encoding='UTF-8') as file: + has_decompress_h = False + needs_decompress_h = False + + while line:=file.readline(): + if line.strip() == "#include \"decompress.h\"": + has_decompress_h = True + elif match := secondaryTileset_pattern.match(line): + line = match.group(1) + "fastSmol" + match.group(2) + "\n" + elif match := primaryTileset_pattern.match(line): + line = match.group(1) + "smol" + match.group(2) + "\n" + elif match := tilemap_pattern.match(line): + line = match.group(1) + "smolTM" + match.group(2) + "\n" + elif ".4bpp.lz" in line: + line = line.replace(".4bpp.lz", ".4bpp.smol") + elif ".8bpp.lz" in line: + line = line.replace(".8bpp.lz", ".8bpp.smol") + elif match := lzuncomp_pattern.match(line): + if allLines[-1].strip() != "case MODE_LZ77:": # do not modify DecompressDataWithHeader itself + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True + elif match := lzdecomp_pattern.match(line): + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True + else: + pass + + allLines.append(line) + + if needs_decompress_h and not has_decompress_h: + # attempt to place the new header in alphabetical order + i = 0 + while not allLines[i].startswith("#include \"") or allLines[i] == "#include \"global.h\"\n": + i += 1 + while allLines[i].startswith("#include \"") and allLines[i] < "#include \"decompress.h\"\n": + i += 1 + allLines.insert(i, "#include \"decompress.h\"\n") + + with open(fileInput, 'w', encoding='UTF-8') as file: + for line in allLines: + file.write(line) + return True + +for path in glob.glob("src/**/*.c", recursive=True): + handle_file(path) +for path in glob.glob("src/**/*.h", recursive=True): + handle_file(path) diff --git a/src/battle_anim.c b/src/battle_anim.c index 3840c91012..76e37b7eea 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1571,17 +1571,17 @@ void LoadMoveBg(u16 bgId) void *decompressionBuffer = Alloc(0x800); const u32 *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; - LZDecompressWram(tilemap, decompressionBuffer); + DecompressDataWithHeaderWram(tilemap, decompressionBuffer); RelocateBattleBgPal(GetBattleBgPaletteNum(), decompressionBuffer, 0x100, FALSE); DmaCopy32(3, decompressionBuffer, (void *)BG_SCREEN_ADDR(26), 0x800); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4)); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4)); LoadPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(GetBattleBgPaletteNum()), PLTT_SIZE_4BPP); Free(decompressionBuffer); } else { - LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)BG_SCREEN_ADDR(26)); - LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_CHAR_ADDR(2)); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)BG_SCREEN_ADDR(26)); + DecompressDataWithHeaderVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_CHAR_ADDR(2)); LoadPalette(gBattleAnimBackgroundTable[bgId].palette, BG_PLTT_ID(2), PLTT_SIZE_4BPP); } } diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index f7c98bef56..879f41f715 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -916,7 +916,7 @@ void ClearBattleAnimBg(u32 bgId) void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset) { CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000); - LZDecompressWram(src, gBattleAnimBgTileBuffer); + DecompressDataWithHeaderWram(src, gBattleAnimBgTileBuffer); LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset); } diff --git a/src/battle_bg.c b/src/battle_bg.c index a0df9017c7..7c11ce4d05 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -754,8 +754,8 @@ void DrawMainBattleBackground(void) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) @@ -763,23 +763,23 @@ void DrawMainBattleBackground(void) switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) { case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case SPECIES_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; default: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; } @@ -791,15 +791,15 @@ void DrawMainBattleBackground(void) u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); return; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); return; } @@ -809,48 +809,48 @@ void DrawMainBattleBackground(void) { default: case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; } @@ -859,7 +859,7 @@ void DrawMainBattleBackground(void) void LoadBattleTextboxAndBackground(void) { - LZDecompressVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0); CopyBgTilemapBufferToVram(0); LoadPalette(gBattleTextboxPalette, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); @@ -1129,8 +1129,8 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - LZDecompressVram(gBattleVSFrame_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gVsLettersGfx, (void *)OBJ_VRAM0); + DecompressDataWithHeaderVram(gBattleVSFrame_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gVsLettersGfx, (void *)OBJ_VRAM0); LoadPalette(gBattleVSFrame_Pal, BG_PLTT_ID(6), PLTT_SIZE_4BPP); SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04); @@ -1148,8 +1148,8 @@ void DrawBattleEntryBackground(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); } else { @@ -1168,20 +1168,20 @@ void DrawBattleEntryBackground(void) switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) { case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28))); break; case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28))); break; case SPECIES_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28))); break; default: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); break; } } @@ -1192,27 +1192,27 @@ void DrawBattleEntryBackground(void) u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); return; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); return; } } if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL) { - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); } else { - LZDecompressVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); } } } @@ -1224,7 +1224,7 @@ bool8 LoadChosenBattleElement(u8 caseId) switch (caseId) { case 0: - LZDecompressVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gBattleTextboxTiles, (void *)(BG_CHAR_ADDR(0))); break; case 1: CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0); @@ -1236,17 +1236,17 @@ bool8 LoadChosenBattleElement(u8 caseId) case 3: if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) { case SPECIES_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); break; case SPECIES_KYOGRE: - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(2))); break; } } @@ -1257,12 +1257,12 @@ bool8 LoadChosenBattleElement(u8 caseId) u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); break; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; } } @@ -1271,31 +1271,31 @@ bool8 LoadChosenBattleElement(u8 caseId) { default: case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); break; case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); break; } } @@ -1303,14 +1303,14 @@ bool8 LoadChosenBattleElement(u8 caseId) case 4: if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); else - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); } else { @@ -1319,12 +1319,12 @@ bool8 LoadChosenBattleElement(u8 caseId) u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); break; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; } } @@ -1333,31 +1333,31 @@ bool8 LoadChosenBattleElement(u8 caseId) { default: case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); break; case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); break; } } diff --git a/src/battle_dome.c b/src/battle_dome.c index 28de62c07a..c01dbbc25d 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -5260,7 +5260,7 @@ static void Task_ShowTourneyTree(u8 taskId) break; case 2: sTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); - LZDecompressWram(gDomeTourneyTree_Tilemap, sTilemapBuffer); + DecompressDataWithHeaderWram(gDomeTourneyTree_Tilemap, sTilemapBuffer); SetBgTilemapBuffer(1, sTilemapBuffer); CopyBgTilemapBufferToVram(1); DecompressAndLoadBgGfxUsingHeap(1, gDomeTourneyTree_Gfx, 0x2000, 0, 0); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 3d8d2f48be..d05a9bf86a 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -811,7 +811,7 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) void LoadBattleBarGfx(u8 unused) { - LZDecompressWram(gBattleInterfaceGfx_BattleBar, gMonSpritesGfxPtr->barFontGfx); + DecompressDataWithHeaderWram(gBattleInterfaceGfx_BattleBar, gMonSpritesGfxPtr->barFontGfx); } bool8 BattleInitAllSprites(u8 *state1, u8 *battler) @@ -1026,11 +1026,11 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite) position = GetBattlerPosition(battler); if (IsContest()) - LZDecompressVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); else if (!IsOnPlayerSide(battler)) - LZDecompressVram(gBattleAnimSpriteGfx_Substitute, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_Substitute, gMonSpritesGfxPtr->spritesGfx[position]); else - LZDecompressVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); + DecompressDataWithHeaderVram(gBattleAnimSpriteGfx_SubstituteBack, gMonSpritesGfxPtr->spritesGfx[position]); for (i = 1; i < 4; i++) { diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index 5d5c6c1f03..f4c544dd02 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -573,7 +573,7 @@ static bool8 LoadPyramidBagGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBattlePyramidBagTilemap, gPyramidBagMenu->tilemapBuffer); + DecompressDataWithHeaderWram(gBattlePyramidBagTilemap, gPyramidBagMenu->tilemapBuffer); gPyramidBagMenu->state++; } break; diff --git a/src/battle_transition.c b/src/battle_transition.c index fe7188203b..ae91f17228 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1385,7 +1385,7 @@ static bool8 Aqua_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sTeamAqua_Tileset, tileset); + DecompressDataWithHeaderVram(sTeamAqua_Tileset, tileset); LoadPalette(sEvilTeam_Palette, BG_PLTT_ID(15), sizeof(sEvilTeam_Palette)); task->tState++; @@ -1400,7 +1400,7 @@ static bool8 Magma_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sTeamMagma_Tileset, tileset); + DecompressDataWithHeaderVram(sTeamMagma_Tileset, tileset); LoadPalette(sEvilTeam_Palette, BG_PLTT_ID(15), sizeof(sEvilTeam_Palette)); task->tState++; @@ -1460,7 +1460,7 @@ static bool8 Aqua_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sTeamAqua_Tilemap, tilemap); + DecompressDataWithHeaderVram(sTeamAqua_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -1472,7 +1472,7 @@ static bool8 Magma_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sTeamMagma_Tilemap, tilemap); + DecompressDataWithHeaderVram(sTeamMagma_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -1526,8 +1526,8 @@ static bool8 Kyogre_Init(struct Task *task) GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sKyogre_Tileset, tileset); - LZ77UnCompVram(sKyogre_Tilemap, tilemap); + DecompressDataWithHeaderVram(sKyogre_Tileset, tileset); + DecompressDataWithHeaderVram(sKyogre_Tilemap, tilemap); task->tState++; return FALSE; @@ -3418,8 +3418,8 @@ static bool8 Groudon_Init(struct Task *task) GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sGroudon_Tileset, tileset); - LZ77UnCompVram(sGroudon_Tilemap, tilemap); + DecompressDataWithHeaderVram(sGroudon_Tileset, tileset); + DecompressDataWithHeaderVram(sGroudon_Tilemap, tilemap); task->tState++; task->tTimer = 0; @@ -4304,7 +4304,7 @@ static bool8 FrontierLogoWiggle_Init(struct Task *task) InitPatternWeaveTransition(task); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sFrontierLogo_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); task->tState++; @@ -4316,7 +4316,7 @@ static bool8 FrontierLogoWiggle_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap); + DecompressDataWithHeaderVram(sFrontierLogo_Tilemap, tilemap); SetSinWave((s16*)gScanlineEffectRegBuffers[0], 0, task->tSinIndex, 132, task->tAmplitude, DISPLAY_HEIGHT); task->tState++; @@ -4366,7 +4366,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) REG_BLDALPHA = sTransitionData->BLDALPHA; GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, BG_SCREEN_SIZE); - LZ77UnCompVram(sFrontierLogo_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; UpdateShadowColor(RGB_GRAY); @@ -4380,7 +4380,7 @@ static bool8 FrontierLogoWave_SetGfx(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap); + DecompressDataWithHeaderVram(sFrontierLogo_Tilemap, tilemap); task->tState++; return TRUE; @@ -4512,7 +4512,7 @@ static bool8 FrontierSquares_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15); @@ -4570,13 +4570,13 @@ static bool8 FrontierSquares_Shrink(struct Task *task) break; case 1: BlendPalettes(PALETTES_ALL & ~(1 << 15), 16, RGB_BLACK); - LZ77UnCompVram(sFrontierSquares_EmptyBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_EmptyBg_Tileset, tileset); break; case 2: - LZ77UnCompVram(sFrontierSquares_Shrink1_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_Shrink1_Tileset, tileset); break; case 3: - LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_Shrink2_Tileset, tileset); break; default: FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 32, 32); @@ -4607,7 +4607,7 @@ static bool8 FrontierSquaresSpiral_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); FillBgTilemapBufferRect(0, 1, 0, 0, MARGIN_SIZE, 32, 15); @@ -4725,7 +4725,7 @@ static bool8 FrontierSquaresScroll_Init(struct Task *task) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset); + DecompressDataWithHeaderVram(sFrontierSquares_FilledBg_Tileset, tileset); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(0); LoadPalette(sFrontierSquares_Palette, BG_PLTT_ID(15), sizeof(sFrontierSquares_Palette)); diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c index 3e40129fa5..c426e6e60c 100644 --- a/src/battle_transition_frontier.c +++ b/src/battle_transition_frontier.c @@ -221,8 +221,8 @@ static void LoadLogoGfx(void) u16 *tilemap, *tileset; GetBg0TilesDst(&tilemap, &tileset); - LZ77UnCompVram(sLogoCenter_Gfx, tileset); - LZ77UnCompVram(sLogoCenter_Tilemap, tilemap); + DecompressDataWithHeaderVram(sLogoCenter_Gfx, tileset); + DecompressDataWithHeaderVram(sLogoCenter_Tilemap, tilemap); LoadPalette(sLogo_Pal, BG_PLTT_ID(15), sizeof(sLogo_Pal)); LoadCompressedSpriteSheet(&sSpriteSheet_LogoCircles); LoadSpritePalette(&sSpritePalette_LogoCircles); diff --git a/src/berry_blender.c b/src/berry_blender.c index 5475208126..f953d7d5e8 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -940,7 +940,7 @@ static bool8 LoadBerryBlenderGfx(void) { case 0: sBerryBlender->tilesBuffer = AllocZeroed(GetDecompressedDataSize(gBerryBlenderCenter_Gfx) + 100); - LZDecompressWram(gBerryBlenderCenter_Gfx, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderCenter_Gfx, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 1: @@ -954,7 +954,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlender->loadGfxState++; break; case 3: - LZDecompressWram(gBerryBlenderOuter_Gfx, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderOuter_Gfx, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 4: @@ -962,7 +962,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlender->loadGfxState++; break; case 5: - LZDecompressWram(gBerryBlenderOuter_Tilemap, sBerryBlender->tilesBuffer); + DecompressDataWithHeaderWram(gBerryBlenderOuter_Tilemap, sBerryBlender->tilesBuffer); sBerryBlender->loadGfxState++; break; case 6: diff --git a/src/berry_fix_graphics.c b/src/berry_fix_graphics.c index 80510a4ce1..3fd4fccd3c 100644 --- a/src/berry_fix_graphics.c +++ b/src/berry_fix_graphics.c @@ -1,5 +1,6 @@ #include "global.h" #include "graphics.h" +#include "decompress.h" // Duplicate of sBerryFixGraphics in berry_fix_program.c static const struct { @@ -41,8 +42,8 @@ static void UNUSED LoadBerryFixGraphics(u32 idx) REG_BG0HOFS = 0; REG_BG0VOFS = 0; REG_BLDCNT = 0; - LZ77UnCompVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); - LZ77UnCompVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sBerryFixGraphics[idx].gfx, (void *)BG_CHAR_ADDR(0)); + DecompressDataWithHeaderVram(sBerryFixGraphics[idx].tilemap, (void *)BG_SCREEN_ADDR(31)); CpuCopy16(sBerryFixGraphics[idx].pltt, (void *)BG_PLTT, BG_PLTT_SIZE); REG_BG0CNT = BGCNT_SCREENBASE(31); REG_DISPCNT = DISPCNT_BG0_ON; diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 98938c78b5..ab624add2e 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -12,6 +12,7 @@ #include "text.h" #include "menu.h" #include "m4a.h" +#include "decompress.h" #include "constants/rgb.h" enum { @@ -366,8 +367,8 @@ static void BerryFix_SetScene(int scene) break; } CopyBgTilemapBufferToVram(0); - LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); - LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); // These palettes range in size from 32-48 colors, so the below is interpreting whatever // follows the palette (by default, the corresponding tiles) as the remaining 80-96. CpuCopy32(sBerryFixGraphics[scene].palette, (void *)BG_PLTT, PLTT_SIZEOF(128)); diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 7bc486f3fa..84db1ad844 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -335,12 +335,12 @@ static bool8 LoadBerryTagGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBerryTag_Gfx, sBerryTag->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gBerryTag_Gfx, sBerryTag->tilemapBuffers[0]); sBerryTag->gfxState++; } break; case 2: - LZDecompressWram(gBerryTag_Tilemap, sBerryTag->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gBerryTag_Tilemap, sBerryTag->tilemapBuffers[2]); sBerryTag->gfxState++; break; case 3: diff --git a/src/bg.c b/src/bg.c index ab7b48c58d..bfc719a25f 100644 --- a/src/bg.c +++ b/src/bg.c @@ -5,6 +5,7 @@ #include "gpu_regs.h" #include "malloc.h" #include "menu.h" +#include "decompress.h" #define DISPCNT_ALL_BG_AND_MODE_BITS (DISPCNT_BG_ALL_ON | 0x7) @@ -874,7 +875,7 @@ void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset) if (mode != 0) CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); else - LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); + DecompressDataWithHeaderWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); } } diff --git a/src/contest.c b/src/contest.c index da11859dee..08ff4765f9 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1133,8 +1133,8 @@ void LoadContestBgAfterMoveAnim(void) { s32 i; - LZDecompressVram(gContestInterfaceGfx, (void *)VRAM); - LZDecompressVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); + DecompressDataWithHeaderVram(gContestInterfaceGfx, (void *)VRAM); + DecompressDataWithHeaderVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); CopyToBgTilemapBuffer(3, gContestAudienceTilemap, 0, 0); CopyBgTilemapBufferToVram(3); LoadPalette(gContestInterfaceAudiencePalette, BG_PLTT_OFFSET, BG_PLTT_SIZE); @@ -1414,10 +1414,10 @@ static bool8 SetupContestGraphics(u8 *stateVar) RequestDma3Fill(0, (void *)VRAM + 0x10000, 0x8000, 1); break; case 1: - LZDecompressVram(gContestInterfaceGfx, (void *)VRAM); + DecompressDataWithHeaderVram(gContestInterfaceGfx, (void *)VRAM); break; case 2: - LZDecompressVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); + DecompressDataWithHeaderVram(gContestAudienceGfx, (void *)(BG_SCREEN_ADDR(4))); DmaCopyLarge32(3, (void *)(BG_SCREEN_ADDR(4)), eUnzippedContestAudience_Gfx, 0x2000, 0x1000); break; case 3: diff --git a/src/contest_painting.c b/src/contest_painting.c index 1911e70689..6dadf2b275 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -363,7 +363,7 @@ static void VBlankCB_ContestPainting(void) static void InitContestMonPixels(u16 species, bool8 backPic) { const void *pal = GetMonSpritePalFromSpeciesAndPersonality(species, gContestPaintingWinner->isShiny, gContestPaintingWinner->personality); - LZDecompressVram(pal, gContestPaintingMonPalette); + DecompressDataWithHeaderVram(pal, gContestPaintingMonPalette); if (!backPic) { HandleLoadSpecialPokePic(TRUE, diff --git a/src/contest_util.c b/src/contest_util.c index 66d0b575fe..2fd5a7575a 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -452,7 +452,7 @@ static void LoadContestResultsBgGfx(void) s8 numStars, round2Points; u16 tile1, tile2; - LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); + DecompressDataWithHeaderVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0); CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0); CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0); diff --git a/src/credits.c b/src/credits.c index c06a6fca9b..f48717a2a8 100644 --- a/src/credits.c +++ b/src/credits.c @@ -538,8 +538,8 @@ static void Task_LoadShowMons(u8 taskId) ResetAllPicSprites(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); LoadPalette(gBirchBagGrass_Pal + 1, BG_PLTT_ID(0) + 1, PLTT_SIZEOF(2 * 16 - 1)); for (i = 0; i < MON_PIC_SIZE; i++) @@ -1282,7 +1282,7 @@ static void LoadTheEndScreen(u16 tileOffsetLoad, u16 tileOffsetWrite, u16 palOff u16 baseTile; u16 i; - LZ77UnCompVram(sCreditsCopyrightEnd_Gfx, (void *)(VRAM + tileOffsetLoad)); + DecompressDataWithHeaderVram(sCreditsCopyrightEnd_Gfx, (void *)(VRAM + tileOffsetLoad)); LoadPalette(gIntroCopyright_Pal, palOffset, sizeof(gIntroCopyright_Pal)); baseTile = (palOffset / 16) << 12; diff --git a/src/decompress.c b/src/decompress.c index ed935eae16..f4e43e3cf6 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -2,20 +2,175 @@ #include "malloc.h" #include "data.h" #include "decompress.h" +#include "decompress_error_handler.h" #include "pokemon.h" #include "pokemon_sprite_visualizer.h" #include "text.h" #include "menu.h" -void LZDecompressWram(const u32 *src, void *dest) -{ - LZ77UnCompWram(src, dest); -} +// === WARNING === WARNING === WARNING === +// === No user serviceable code before === +// === the SpecialPokePic function, do === +// === not modify code unless magician === +// === WARNING === WARNING === WARNING === -void LZDecompressVram(const u32 *src, void *dest) -{ - LZ77UnCompVram(src, dest); -} +static void SmolDecompressData(const struct SmolHeader *header, const u32 *data, void *dest); +static void SmolDecompressTilemap(const struct SmolTilemapHeader *header, const u32 *data, u16 *dest); + +static bool32 isModeLoEncoded(enum CompressionMode mode); +static bool32 isModeSymEncoded(enum CompressionMode mode); +static bool32 isModeSymDelta(enum CompressionMode mode); + + +#define TABLE_READ_K(tableVal)((tableVal & 7)) +#define TABLE_READ_SYMBOL(tableVal)((tableVal & 0xFF) >> 3) +#define TABLE_READ_Y(tableVal)((tableVal >> 8) & 0xFF) +#define TABLE_READ_MASK(tableVal)((tableVal >> 16)) + +/* +Layout is the following: +u32 kVal:3; +u32 symbol:5; // Set in BuildDecompressionTable +u32 yVal:8; +u32 mask:8; +*/ + +#define SET_TABLE_ENTRY(k, y, mask)(((k) & 7) | ((y) << 8) | ((mask) << 16)) + +static IWRAM_DATA u32 sWorkingYkTable[TANS_TABLE_SIZE] = {0}; + +// Helper struct to build the tANS decode tables without having to do calculations at run-time +// Mask Table is 0, 1, 3, 7, 15, 31, 63. +static const u32 sYkTemplate[2*TANS_TABLE_SIZE] = { + [0] = 0, + [1] = SET_TABLE_ENTRY(6, (1 << 6) - 64, 63), + [2] = SET_TABLE_ENTRY(5, (2 << 5) - 64, 31), + [3] = SET_TABLE_ENTRY(5, (3 << 5) - 64, 31), + [4] = SET_TABLE_ENTRY(4, (4 << 4) - 64, 15), + [5] = SET_TABLE_ENTRY(4, (5 << 4) - 64, 15), + [6] = SET_TABLE_ENTRY(4, (6 << 4) - 64, 15), + [7] = SET_TABLE_ENTRY(4, (7 << 4) - 64, 15), + [8] = SET_TABLE_ENTRY(3, (8 << 3) - 64, 7), + [9] = SET_TABLE_ENTRY(3, (9 << 3) - 64, 7), + [10] = SET_TABLE_ENTRY(3, (10 << 3) - 64, 7), + [11] = SET_TABLE_ENTRY(3, (11 << 3) - 64, 7), + [12] = SET_TABLE_ENTRY(3, (12 << 3) - 64, 7), + [13] = SET_TABLE_ENTRY(3, (13 << 3) - 64, 7), + [14] = SET_TABLE_ENTRY(3, (14 << 3) - 64, 7), + [15] = SET_TABLE_ENTRY(3, (15 << 3) - 64, 7), + [16] = SET_TABLE_ENTRY(2, (16 << 2) - 64, 3), + [17] = SET_TABLE_ENTRY(2, (17 << 2) - 64, 3), + [18] = SET_TABLE_ENTRY(2, (18 << 2) - 64, 3), + [19] = SET_TABLE_ENTRY(2, (19 << 2) - 64, 3), + [20] = SET_TABLE_ENTRY(2, (20 << 2) - 64, 3), + [21] = SET_TABLE_ENTRY(2, (21 << 2) - 64, 3), + [22] = SET_TABLE_ENTRY(2, (22 << 2) - 64, 3), + [23] = SET_TABLE_ENTRY(2, (23 << 2) - 64, 3), + [24] = SET_TABLE_ENTRY(2, (24 << 2) - 64, 3), + [25] = SET_TABLE_ENTRY(2, (25 << 2) - 64, 3), + [26] = SET_TABLE_ENTRY(2, (26 << 2) - 64, 3), + [27] = SET_TABLE_ENTRY(2, (27 << 2) - 64, 3), + [28] = SET_TABLE_ENTRY(2, (28 << 2) - 64, 3), + [29] = SET_TABLE_ENTRY(2, (29 << 2) - 64, 3), + [30] = SET_TABLE_ENTRY(2, (30 << 2) - 64, 3), + [31] = SET_TABLE_ENTRY(2, (31 << 2) - 64, 3), + [32] = SET_TABLE_ENTRY(1, (32 << 1) - 64, 1), + [33] = SET_TABLE_ENTRY(1, (33 << 1) - 64, 1), + [34] = SET_TABLE_ENTRY(1, (34 << 1) - 64, 1), + [35] = SET_TABLE_ENTRY(1, (35 << 1) - 64, 1), + [36] = SET_TABLE_ENTRY(1, (36 << 1) - 64, 1), + [37] = SET_TABLE_ENTRY(1, (37 << 1) - 64, 1), + [38] = SET_TABLE_ENTRY(1, (38 << 1) - 64, 1), + [39] = SET_TABLE_ENTRY(1, (39 << 1) - 64, 1), + [40] = SET_TABLE_ENTRY(1, (40 << 1) - 64, 1), + [41] = SET_TABLE_ENTRY(1, (41 << 1) - 64, 1), + [42] = SET_TABLE_ENTRY(1, (42 << 1) - 64, 1), + [43] = SET_TABLE_ENTRY(1, (43 << 1) - 64, 1), + [44] = SET_TABLE_ENTRY(1, (44 << 1) - 64, 1), + [45] = SET_TABLE_ENTRY(1, (45 << 1) - 64, 1), + [46] = SET_TABLE_ENTRY(1, (46 << 1) - 64, 1), + [47] = SET_TABLE_ENTRY(1, (47 << 1) - 64, 1), + [48] = SET_TABLE_ENTRY(1, (48 << 1) - 64, 1), + [49] = SET_TABLE_ENTRY(1, (49 << 1) - 64, 1), + [50] = SET_TABLE_ENTRY(1, (50 << 1) - 64, 1), + [51] = SET_TABLE_ENTRY(1, (51 << 1) - 64, 1), + [52] = SET_TABLE_ENTRY(1, (52 << 1) - 64, 1), + [53] = SET_TABLE_ENTRY(1, (53 << 1) - 64, 1), + [54] = SET_TABLE_ENTRY(1, (54 << 1) - 64, 1), + [55] = SET_TABLE_ENTRY(1, (55 << 1) - 64, 1), + [56] = SET_TABLE_ENTRY(1, (56 << 1) - 64, 1), + [57] = SET_TABLE_ENTRY(1, (57 << 1) - 64, 1), + [58] = SET_TABLE_ENTRY(1, (58 << 1) - 64, 1), + [59] = SET_TABLE_ENTRY(1, (59 << 1) - 64, 1), + [60] = SET_TABLE_ENTRY(1, (60 << 1) - 64, 1), + [61] = SET_TABLE_ENTRY(1, (61 << 1) - 64, 1), + [62] = SET_TABLE_ENTRY(1, (62 << 1) - 64, 1), + [63] = SET_TABLE_ENTRY(1, (63 << 1) - 64, 1), + [64] = SET_TABLE_ENTRY(0, 64 - 64, 0), + [65] = SET_TABLE_ENTRY(0, 65 - 64, 0), + [66] = SET_TABLE_ENTRY(0, 66 - 64, 0), + [67] = SET_TABLE_ENTRY(0, 67 - 64, 0), + [68] = SET_TABLE_ENTRY(0, 68 - 64, 0), + [69] = SET_TABLE_ENTRY(0, 69 - 64, 0), + [70] = SET_TABLE_ENTRY(0, 70 - 64, 0), + [71] = SET_TABLE_ENTRY(0, 71 - 64, 0), + [72] = SET_TABLE_ENTRY(0, 72 - 64, 0), + [73] = SET_TABLE_ENTRY(0, 73 - 64, 0), + [74] = SET_TABLE_ENTRY(0, 74 - 64, 0), + [75] = SET_TABLE_ENTRY(0, 75 - 64, 0), + [76] = SET_TABLE_ENTRY(0, 76 - 64, 0), + [77] = SET_TABLE_ENTRY(0, 77 - 64, 0), + [78] = SET_TABLE_ENTRY(0, 78 - 64, 0), + [79] = SET_TABLE_ENTRY(0, 79 - 64, 0), + [80] = SET_TABLE_ENTRY(0, 80 - 64, 0), + [81] = SET_TABLE_ENTRY(0, 81 - 64, 0), + [82] = SET_TABLE_ENTRY(0, 82 - 64, 0), + [83] = SET_TABLE_ENTRY(0, 83 - 64, 0), + [84] = SET_TABLE_ENTRY(0, 84 - 64, 0), + [85] = SET_TABLE_ENTRY(0, 85 - 64, 0), + [86] = SET_TABLE_ENTRY(0, 86 - 64, 0), + [87] = SET_TABLE_ENTRY(0, 87 - 64, 0), + [88] = SET_TABLE_ENTRY(0, 88 - 64, 0), + [89] = SET_TABLE_ENTRY(0, 89 - 64, 0), + [90] = SET_TABLE_ENTRY(0, 90 - 64, 0), + [91] = SET_TABLE_ENTRY(0, 91 - 64, 0), + [92] = SET_TABLE_ENTRY(0, 92 - 64, 0), + [93] = SET_TABLE_ENTRY(0, 93 - 64, 0), + [94] = SET_TABLE_ENTRY(0, 94 - 64, 0), + [95] = SET_TABLE_ENTRY(0, 95 - 64, 0), + [96] = SET_TABLE_ENTRY(0, 96 - 64, 0), + [97] = SET_TABLE_ENTRY(0, 97 - 64, 0), + [98] = SET_TABLE_ENTRY(0, 98 - 64, 0), + [99] = SET_TABLE_ENTRY(0, 99 - 64, 0), + [100] = SET_TABLE_ENTRY(0, 100 - 64, 0), + [101] = SET_TABLE_ENTRY(0, 101 - 64, 0), + [102] = SET_TABLE_ENTRY(0, 102 - 64, 0), + [103] = SET_TABLE_ENTRY(0, 103 - 64, 0), + [104] = SET_TABLE_ENTRY(0, 104 - 64, 0), + [105] = SET_TABLE_ENTRY(0, 105 - 64, 0), + [106] = SET_TABLE_ENTRY(0, 106 - 64, 0), + [107] = SET_TABLE_ENTRY(0, 107 - 64, 0), + [108] = SET_TABLE_ENTRY(0, 108 - 64, 0), + [109] = SET_TABLE_ENTRY(0, 109 - 64, 0), + [110] = SET_TABLE_ENTRY(0, 110 - 64, 0), + [111] = SET_TABLE_ENTRY(0, 111 - 64, 0), + [112] = SET_TABLE_ENTRY(0, 112 - 64, 0), + [113] = SET_TABLE_ENTRY(0, 113 - 64, 0), + [114] = SET_TABLE_ENTRY(0, 114 - 64, 0), + [115] = SET_TABLE_ENTRY(0, 115 - 64, 0), + [116] = SET_TABLE_ENTRY(0, 116 - 64, 0), + [117] = SET_TABLE_ENTRY(0, 117 - 64, 0), + [118] = SET_TABLE_ENTRY(0, 118 - 64, 0), + [119] = SET_TABLE_ENTRY(0, 119 - 64, 0), + [120] = SET_TABLE_ENTRY(0, 120 - 64, 0), + [121] = SET_TABLE_ENTRY(0, 121 - 64, 0), + [122] = SET_TABLE_ENTRY(0, 122 - 64, 0), + [123] = SET_TABLE_ENTRY(0, 123 - 64, 0), + [124] = SET_TABLE_ENTRY(0, 124 - 64, 0), + [125] = SET_TABLE_ENTRY(0, 125 - 64, 0), + [126] = SET_TABLE_ENTRY(0, 126 - 64, 0), + [127] = SET_TABLE_ENTRY(0, 127 - 64, 0), +}; // Checks if `ptr` is likely LZ77 data // Checks word-alignment, min/max size, and header byte @@ -60,7 +215,7 @@ u32 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) u32 LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) { - LZDecompressWram(src->data, buffer); + DecompressDataWithHeaderWram(src->data, buffer); return DoLoadCompressedSpriteSheet(src, buffer); } @@ -96,6 +251,873 @@ void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 pe LoadSpecialPokePic(dest, species, personality, isFrontPic); } +// Wrapper function for all decompression calls using formats with headers +// calls the correct decompression function depending on the header +// VRAM version +void DecompressDataWithHeaderVram(const u32 *src, void *dest) +{ + union CompressionHeader header; + CpuCopy32(src, &header, 8); + switch (header.smol.mode) + { + case MODE_LZ77: + LZ77UnCompVram(src, dest); + break; + case IS_TILEMAP: + SmolDecompressTilemap(&header.smolTilemap, &src[2], dest); + break; + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + SmolDecompressData(&header.smol, &src[2], dest); + break; + default: + DecompressionError(src, HEADER_ERROR); + } +} + +// Wrapper function for all decompression calls using formats with headers +// calls the correct decompression function depending on the header +// WRAM version +void DecompressDataWithHeaderWram(const u32 *src, void *dest) +{ + union CompressionHeader header; + CpuCopy32(src, &header, 8); + switch (header.smol.mode) + { + case MODE_LZ77: + FastLZ77UnCompWram(src, dest); + break; + case IS_TILEMAP: + SmolDecompressTilemap(&header.smolTilemap, &src[2], dest); + break; + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + SmolDecompressData(&header.smol, &src[2], dest); + break; + default: + DecompressionError(src, HEADER_ERROR); + } +} + +#define REP0(X) +#define REP1(X) X +#define REP2(X) REP1(X) X +#define REP3(X) REP2(X) X +#define REP4(X) REP3(X) X +#define REP5(X) REP4(X) X +#define REP6(X) REP5(X) X +#define REP7(X) REP6(X) X +#define REP8(X) REP7(X) X +#define REP9(X) REP8(X) X +#define REP10(X) REP9(X) X + +#define REP(TENS,ONES,X) \ + REP##TENS(REP10(X)) \ + REP##ONES(X) + +// Unpack packed tANS encoded data symbol frequences into their individual parts +static inline void UnpackFrequenciesLoop(const u32 *packedFreqs, u16 *freqs, u32 i) +{ + // Loop unpack + freqs[i*5 + 0] = (packedFreqs[i] >> (6*0)) & PACKED_FREQ_MASK; + freqs[i*5 + 1] = (packedFreqs[i] >> (6*1)) & PACKED_FREQ_MASK; + freqs[i*5 + 2] = (packedFreqs[i] >> (6*2)) & PACKED_FREQ_MASK; + freqs[i*5 + 3] = (packedFreqs[i] >> (6*3)) & PACKED_FREQ_MASK; + freqs[i*5 + 4] = (packedFreqs[i] >> (6*4)) & PACKED_FREQ_MASK; + + freqs[15] += (packedFreqs[i] & PARTIAL_FREQ_MASK) >> (30 - 2*i); +} + +static inline void UnpackFrequencies(const u32 *packedFreqs, u16 *freqs) +{ + freqs[15] = 0; + + UnpackFrequenciesLoop(packedFreqs, freqs, 0); + UnpackFrequenciesLoop(packedFreqs, freqs, 1); + UnpackFrequenciesLoop(packedFreqs, freqs, 2); +} + +// This is a small function, so we can store it in IWRAM for improved performance and don't need to worry about it taking too much precious IWRAM space. +ARM_FUNC __attribute__((section(".iwram.code"))) __attribute__((noinline)) static void CopyTable(u32 *dst, const u32 *src, u32 size, u32 orrVal) +{ + for (u32 i = 0; i < size; i++) { + *dst++ = (*src++) | orrVal; + } +} + +// Build the tANS decompression table from the specified frequencies and the precomputed helper struct +__attribute__((optimize("-O3"))) static void BuildDecompressionTable(const u32 *packedFreqs, u32 *table) +{ + u16 freqs[16]; + + UnpackFrequencies(packedFreqs, freqs); + + for (u8 i = 0; i < 16; i++) + { + const u32 *srcTemplate; + + switch (freqs[i]) { + case 0: + break; + default: { + srcTemplate = &sYkTemplate[freqs[i]]; + CopyTable(table, srcTemplate, freqs[i], i << 3); + table += freqs[i]; + srcTemplate += freqs[i]; + break; + } + case 1: + srcTemplate = &sYkTemplate[1]; + REP(0, 1, *table++ = *srcTemplate++ | (i << 3);) + break; + case 2: + srcTemplate = &sYkTemplate[2]; + REP(0, 2, *table++ = (*srcTemplate++) | (i << 3);) + break; + case 3: + srcTemplate = &sYkTemplate[3]; + REP(0, 3, *table++ = (*srcTemplate++) | (i << 3);) + break; + } + } +} + +static IWRAM_DATA u8 sBitIndex = 0; +static IWRAM_DATA const u32 *sDataPtr = 0; +static IWRAM_DATA u32 sCurrState = 0; + +extern void FastUnsafeCopy32(void *, const void *, u32 size); + +// Dark Egg magic +static inline void CopyFuncToIwram(void *funcBuffer, const void *funcStartAddress, const void *funcEndAdress) +{ + FastUnsafeCopy32(funcBuffer, funcStartAddress, funcEndAdress - funcStartAddress); +} + +// The reason for macros and unrolling the loops stems from the following: +// currK can be max 6, meaning in the worst case scenario it takes minimum 4 loop iterations, where we don't need to check if bitIndex is >= 32, because it's mathematically impossible for it to be. +// This optimization matters for large images, because we don't waste a cycle on comparing operations. If the loops run over 5000 times in total, these can be costly. + +#define LOT_LOOP_MAIN(nibble) \ +{ \ + u32 ykVals = ykTable[sCurrState]; \ + symbol |= TABLE_READ_SYMBOL(ykVals) << (nibble*4); \ + currK = TABLE_READ_K(ykVals); \ + sCurrState = TABLE_READ_Y(ykVals); \ + sCurrState += (currBits >> bitIndex) & TABLE_READ_MASK(ykVals); \ + bitIndex += currK; \ +} + +// The same for all the loops +#define LOOP_BITADVANCE() \ +{ \ + currBits = *data++; \ + bitIndex -= 32; \ + if (bitIndex != 0) \ + { \ + sCurrState += (currBits & ((1u << bitIndex) - 1)) << (currK - bitIndex); \ + } \ +} +// Inner loop of tANS decoding for Lengths and Offset data for decompression instructions, uses u8 data sizes +// Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state +// from the y and k values for the current state and add the value read from the next k bits in the bitstream +ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeLOtANSLoop(const u32 *data, u32 *ykTable, u8 *resultVec, u8 *resultVecEnd) +{ + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + u16 *resultVec_u16 = (u16 *) resultVec; + + do + { + u32 currK; + u32 symbol = 0; + + { + LOT_LOOP_MAIN(0); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(1); + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(1); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(2); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + LOT_LOOP_MAIN(3); + + goto LOOP_STORE; + } + } + { + LOT_LOOP_MAIN(3); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + *resultVec_u16++ = symbol; + if (resultVec_u16 >= (u16 *) resultVecEnd) + break; + + symbol = 0; + + LOT_LOOP_MAIN(0); + LOT_LOOP_MAIN(1); + LOT_LOOP_MAIN(2); + LOT_LOOP_MAIN(3); + } + } + +LOOP_STORE: + *resultVec_u16++ = symbol; + } while (resultVec_u16 < (u16 *) resultVecEnd); + + sBitIndex = bitIndex; + sDataPtr = data - 1; +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallLOtANS(const u32 *data, u32 *ykTable, void *resultVec, void *resultVecEnd, void (*decodeFunction)(const u32 *data, u32 *ykTable, void *resultVec, void *resultVecEnd)) +{ + decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +// Function that decodes tANS encoded LO data, resulting data is u8 values +static void DecodeLOtANS(const u32 *data, const u32 *pFreqs, u8 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + // We want to store in packs of 2, so count needs to be divisible by 2 + u32 remainingCount = count % 2; + + u32 funcBuffer[400]; + + CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); + SwitchToArmCallLOtANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); + + if (remainingCount) + { + u32 currBits = *sDataPtr; + u32 symbol = 0; + for (u32 currNibble = 0; currNibble < 2; currNibble++) + { + u32 ykVals = sWorkingYkTable[sCurrState]; + symbol |= TABLE_READ_SYMBOL(ykVals) << (currNibble*4); + u32 currK = TABLE_READ_K(ykVals); + sCurrState = TABLE_READ_Y(ykVals); + sCurrState += (currBits >> sBitIndex) & TABLE_READ_MASK(ykVals); + sBitIndex += currK; + if (sBitIndex >= 32) + { + currBits = *(++sDataPtr); + sBitIndex -= 32; + if (sBitIndex != 0) + { + sCurrState += (currBits & ((1u << sBitIndex) - 1)) << (currK - sBitIndex); + } + } + } + resultVec[count - remainingCount] = symbol; + } +} + +// The reason this function is UNUSED, because it's currently exactly the same as `DecodeLOtANSLoop`(as it was optimized out for halfwords and not bytes as it's technically designed). +// If ever DecodeLOtANSLoop or DecodeSymtANSLoop were to change make sure to uncomment the 'CopyFuncToIwram' call. + +ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) UNUSED static void DecodeSymtANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +{ + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + + do + { + u32 symbol = 0; + for (u32 currNibble = 0; currNibble < 4; currNibble++) + { + u32 ykVals = ykTable[sCurrState]; + symbol |= TABLE_READ_SYMBOL(ykVals) << (currNibble*4); + u32 currK = TABLE_READ_K(ykVals); + sCurrState = TABLE_READ_Y(ykVals); + sCurrState += (currBits >> bitIndex) & TABLE_READ_MASK(ykVals); + bitIndex += currK; + if (bitIndex >= 32) + { + currBits = *data++; + bitIndex -= 32; + if (bitIndex != 0) + { + sCurrState += (currBits & ((1u << bitIndex) - 1)) << (currK - bitIndex); + } + } + } + *resultVec++ = symbol; + } while (resultVec < resultVecEnd); + + sBitIndex = bitIndex; + sDataPtr = data - 1; +} + +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeSymtANS(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd, void (*decodeFunction)(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd)) +{ + decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +static void DecodeSymtANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + u32 funcBuffer[300]; + // CopyFuncToIwram(funcBuffer, DecodeSymtANSLoop, SwitchToArmCallDecodeSymtANS); + CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); + SwitchToArmCallDecodeSymtANS(data, sWorkingYkTable, resultVec, &resultVec[count], (void *) funcBuffer); +} + +#define ANS_LOOP_MAIN(nibble) \ +{ \ + u32 ykVals = ykTable[sCurrState]; \ + currK = TABLE_READ_K(ykVals); \ + currSymbol = (currSymbol + TABLE_READ_SYMBOL(ykVals)) & 0xf; \ + symbol |= currSymbol << (nibble*4); \ + sCurrState = TABLE_READ_Y(ykVals); \ + sCurrState += ((currBits >> bitIndex) & TABLE_READ_MASK(ykVals)); \ + bitIndex += currK; \ +} + +// Inner loop of tANS decoding for delta encoded symbol data, uses u16 data size +// Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state +// from the y and k values for the current state and add the value read from the next k bits in the bitstream +ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) u32 DecodeSymDeltatANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +{ + u32 currBits = *data++; + u32 currSymbol = 0; + u32 bitIndex = sBitIndex; + u32 * resultVec_32 = (u32*)(resultVec); // Since we're doing 2 symbols at one time we store as word which is faster than storing two halfwords. + + do + { + u32 symbol = 0; + u32 currK; + + { + ANS_LOOP_MAIN(0); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + + goto NIBBLE_5; + } + } + { + ANS_LOOP_MAIN(1); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + + goto NIBBLE_6; + } + } + { + ANS_LOOP_MAIN(2); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(3); + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + + goto NIBBLE_7; + } + } + { + ANS_LOOP_MAIN(3); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(4); + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_4: + { + ANS_LOOP_MAIN(4); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(5); + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_5: + { + ANS_LOOP_MAIN(5); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(6); + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_6: + { + ANS_LOOP_MAIN(6); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(7); + + goto LOOP_STORE; + } + } + NIBBLE_7: + { + ANS_LOOP_MAIN(7); + + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + *resultVec_32++ = (symbol); + if (resultVec_32 >= (u32 *) resultVecEnd) + break; + + symbol = 0; + + ANS_LOOP_MAIN(0); + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto NIBBLE_4; + } + } + + LOOP_STORE: + *resultVec_32++ = (symbol); + + } while (resultVec_32 < (u32 *) resultVecEnd); + sBitIndex = bitIndex; + sDataPtr = data - 1; + return currSymbol; +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static u32 SwitchToArmCallSymDeltaANS(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd, u32 (*decodeFunction)(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd)) +{ + return decodeFunction(data, ykTable, resultVec, resultVecEnd); +} + +static void DecodeSymDeltatANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u32 count) +{ + BuildDecompressionTable(pFreqs, sWorkingYkTable); + + // We want to store in packs of 2, so count needs to be divisible by 2 + u32 remainingCount = count % 2; + + u32 funcBuffer[450]; + CopyFuncToIwram(funcBuffer, DecodeSymDeltatANSLoop, SwitchToArmCallSymDeltaANS); + u32 currSymbol = SwitchToArmCallSymDeltaANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); + + if (remainingCount) + { + u32 currK; + u32 *ykTable = sWorkingYkTable; + const u32 *data = sDataPtr; + u32 currBits = *data++; + u32 bitIndex = sBitIndex; + u32 symbol = 0; + + ANS_LOOP_MAIN(0); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(1); + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(1); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(2); + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(2); + if (bitIndex >= 32) + { + LOOP_BITADVANCE(); + + ANS_LOOP_MAIN(3); + + goto LOOP_STORE; + } + + ANS_LOOP_MAIN(3); + + LOOP_STORE: + resultVec[count - remainingCount] = symbol; + sBitIndex = bitIndex; + } +} + +static inline void Fill16(u16 value, void *_dst, u32 size) +{ + u16 *dst = _dst; + for (u32 i = 0; i < size; i++) { + dst[i] = value; + } +} + +static inline void Copy16(const void *_src, void *_dst, u32 size) +{ + const u16 *src = _src; + u16 *dst = _dst; + for (u32 i = 0; i < size; i++) { + dst[i] = src[i]; + } +} + +// Function to decode the instructions into the actual decompressed data +// Basic process: +// Read length from the loVec, 1 or 2 bytes as indicated by the last bit in the first byte +// Read offset from the loVec, 1 or 2 bytes as indicated by the last bit in the first byte +// If length is not 0 and offset is not 1: +// Insert the current value from the Symbol vector into current result position and advance symbol vector by 1 +// Copy values from values back in the result vector +// If length is not 0 and offser is 1: +// Insert the current value from the Symbol vector into current result position times, then advance symbol vector by 1 +// If length is 0: +// Insert number of symbols from the symbol vector into the result vector and advance the symbol vector position by +ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, u16 *dest) +{ + const u8 *loVecEnd = loVec + headerLoSize; + do + { + u32 currOffset, currLength; + + if (loVec[0] & CONTINUE_BIT) + { + currLength = (loVec[0] & FIRST_LO_MASK) | (loVec[1] << 7); + currOffset = loVec[2] & FIRST_LO_MASK; + if (loVec[2] & CONTINUE_BIT) + { + currOffset |= loVec[3] << 7; + loVec += 4; + } + else + { + loVec += 3; + } + } + else + { + currLength = loVec[0] & FIRST_LO_MASK; + currOffset = loVec[1] & FIRST_LO_MASK; + + if (loVec[1] & CONTINUE_BIT) + { + currOffset |= (loVec[2] << 7); + loVec += 3; + } + else + { + loVec += 2; + } + } + + if (currLength != 0) + { + u16 symVecVal = *symVec; + *dest++ = *symVec++; + if (currOffset == 1) + { + Fill16(symVecVal, dest, currLength); + dest += currLength; + } + else + { + // Copy16 is slower in this case. + u16 *from = dest - currOffset; + u16 *to = dest + currLength; + do { + *dest++ = *from++; + } while (dest != to); + } + } + else + { + Copy16(symVec, dest, currOffset); + dest += currOffset; + symVec += currOffset; + } + } while (loVec < loVecEnd); +} + +// Dark Egg magic +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest, void (*decodeFunction)(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest)) +{ + decodeFunction(headerLoSize, loVec, symVec, dest); +} + +// Dark Egg magic +static void DecodeInstructionsIwram(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest) +{ + u32 funcBuffer[350]; + + CopyFuncToIwram(funcBuffer, DecodeInstructions, SwitchToArmCallDecodeInstructions); + SwitchToArmCallDecodeInstructions(headerLoSize, loVec, symVec, dest, (void *) funcBuffer); +} + +// Entrance point for smol compressed data +static void SmolDecompressData(const struct SmolHeader *header, const u32 *data, void *dest) +{ + // This is apparently needed due to Game Freak sending bullshit down the decompression pipeline + if (header->loSize == 0 || header->symSize == 0) + return; + const u8 *leftoverPos = (u8 *)data; + + sCurrState = header->initialState; + + u32 headerLoSize = header->loSize; + u32 headerSymSize = header->symSize; + + const u32 *pLoFreqs = NULL; + const u32 *pSymFreqs = NULL; + + // Use different decoding flows depending on which mode the data is compressed with + switch (header->mode) + { + case BASE_ONLY: // Used by .fastSmol, there is no encoding there, so we can quickly decode all the instructions and quit. + DecodeInstructionsIwram(headerLoSize, leftoverPos + headerSymSize*2, (void *) leftoverPos, dest); + return; + case ENCODE_LO: + pLoFreqs = &data[0]; + sDataPtr = &data[3]; + break; + case ENCODE_DELTA_SYMS: + case ENCODE_SYMS: + pSymFreqs = &data[0]; + sDataPtr = &data[3]; + break; + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + pLoFreqs = &data[0]; + pSymFreqs = &data[3]; + sDataPtr = &data[6]; + break; + } + + bool32 loEncoded = isModeLoEncoded(header->mode); + bool32 symEncoded = isModeSymEncoded(header->mode); + bool32 symDelta = isModeSymDelta(header->mode); + + // Everything needs to be aligned. + u32 alignedLoSize = header->loSize % 2 == 1 ? headerLoSize + 1 : headerLoSize; + u32 alignedSymSize = header->symSize % 2 == 1 ? headerSymSize + 1 : headerSymSize; + void *memoryAlloced = Alloc((alignedSymSize*2) + alignedLoSize); + u16 *symVec = memoryAlloced; + u8 *loVec = memoryAlloced + alignedSymSize*2; + + sBitIndex = 0; + // Decode tANS encoded LO data, mode 3, 4 and 5 + if (loEncoded) + { + DecodeLOtANS(sDataPtr, pLoFreqs, loVec, headerLoSize); + leftoverPos += 12; + } + // Decode tANS encoded symbol data, mode 1, 2, 4 and 5 + if (symEncoded) + { + // Symbols are delta encoded, mode 2 and 5 + if (symDelta) + DecodeSymDeltatANS(sDataPtr, pSymFreqs, symVec, headerSymSize); + // Symbols are not delta encoded, mode 1 and 4 + else + DecodeSymtANS(sDataPtr, pSymFreqs, symVec, headerSymSize); + leftoverPos += 12; + } + + // If not both of lo and sym data are tANS encoded, data that isn't entropy encoded exists + // This is stored after the 32-bit aligned bitstream + if (loEncoded || symEncoded) + leftoverPos += 4*header->bitstreamSize; + + // Copy the not entropy encoded symbol data to the symbol buffer + // Symbol data is u16 aligned + if (symEncoded == FALSE) + { + symVec = (void *) leftoverPos; + leftoverPos += headerSymSize*2; + } + + // Copy the not entropy encoded lo data to the lo buffer + // Despite the individual lo values being u8 aligned, the entire vector for the u8 values is u16 aligned + if (loEncoded == FALSE) + { + loVec = (void *) leftoverPos; + } + + // Actually decode the final data from loVec and symVec + DecodeInstructionsIwram(headerLoSize, loVec, symVec, dest); + + Free(memoryAlloced); +} + +ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DeltaDecodeTileNumbers(u16 *tileNumbers, u32 arraySize) +{ + u32 prevVal = 0; + u32 reminder = arraySize % 8; + u16 *dst = tileNumbers + (arraySize - reminder); + do + { + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + } while (tileNumbers != dst); + + for (u32 i = 0; i < reminder; i++) + { + prevVal += *tileNumbers; + *tileNumbers++ = prevVal; + } +} + +ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeTileNumbers(u16 *tileNumbers, u32 arraySize, void (*decodeFunction)(u16 *tileNumbers, u32 arraySize)) +{ + decodeFunction(tileNumbers, arraySize); +} + +static void SmolDecompressTilemap(const struct SmolTilemapHeader *header, const u32 *data, u16 *dest) +{ + u16 *deltaDest = dest; + u32 loOffset = header->symSize*2 + 2*(header->symSize % 2); + u8 *loVec = (u8 *)data; + loVec = &loVec[loOffset]; + u16 *symVec = (u16 *)data; + + DecodeInstructionsIwram(header->tileNumberSize, loVec, symVec, dest); + u32 arraySize = header->tilemapSize/2; + + u32 funcBuffer[100]; + + CopyFuncToIwram(funcBuffer, DeltaDecodeTileNumbers, SwitchToArmCallDecodeTileNumbers); + SwitchToArmCallDecodeTileNumbers(deltaDest, arraySize, (void *) funcBuffer); +} + +// Helper functions for determining modes +static bool32 isModeLoEncoded(enum CompressionMode mode) +{ + if (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + +static bool32 isModeSymEncoded(enum CompressionMode mode) +{ + if (mode == ENCODE_SYMS + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + +static bool32 isModeSymDelta(enum CompressionMode mode) +{ + if (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS) + return TRUE; + return FALSE; +} + void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic) { species = SanitizeSpeciesId(species); @@ -106,25 +1128,25 @@ void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontP { #if P_GENDER_DIFFERENCES if (gSpeciesInfo[species].frontPicFemale != NULL && IsPersonalityFemale(species, personality)) - LZ77UnCompWram(gSpeciesInfo[species].frontPicFemale, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].frontPicFemale, dest); else #endif if (gSpeciesInfo[species].frontPic != NULL) - LZ77UnCompWram(gSpeciesInfo[species].frontPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].frontPic, dest); else - LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].frontPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[SPECIES_NONE].frontPic, dest); } else { #if P_GENDER_DIFFERENCES if (gSpeciesInfo[species].backPicFemale != NULL && IsPersonalityFemale(species, personality)) - LZ77UnCompWram(gSpeciesInfo[species].backPicFemale, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].backPicFemale, dest); else #endif if (gSpeciesInfo[species].backPic != NULL) - LZ77UnCompWram(gSpeciesInfo[species].backPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[species].backPic, dest); else - LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].backPic, dest); + DecompressDataWithHeaderWram(gSpeciesInfo[SPECIES_NONE].backPic, dest); } if (species == SPECIES_SPINDA && isFrontPic) @@ -134,9 +1156,9 @@ void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontP } } -void Unused_LZDecompressWramIndirect(const void **src, void *dest) +void Unused_DecompressDataWithHeaderWramIndirect(const void **src, void *dest) { - LZ77UnCompWram(*src, dest); + DecompressDataWithHeaderWram(*src, dest); } static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles) @@ -290,8 +1312,16 @@ static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u u32 GetDecompressedDataSize(const u32 *ptr) { - const u8 *ptr8 = (const u8 *)ptr; - return (ptr8[3] << 16) | (ptr8[2] << 8) | (ptr8[1]); + union CompressionHeader *header = (union CompressionHeader *)ptr; + switch (header->smol.mode) + { + case MODE_LZ77: + return header->lz77.size; + case IS_TILEMAP: + return header->smolTilemap.tilemapSize; + default: + return header->smol.imageSize*SMOL_IMAGE_SIZE_MULTIPLIER; + } } bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src) @@ -299,8 +1329,8 @@ bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src struct SpriteSheet dest; void *buffer; - buffer = AllocZeroed(src->data[0] >> 8); - LZ77UnCompWram(src->data, buffer); + buffer = AllocZeroed(GetDecompressedDataSize(&src->data[0])); + DecompressDataWithHeaderWram(src->data, buffer); dest.data = buffer; dest.size = src->size; @@ -310,3 +1340,19 @@ bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src Free(buffer); return FALSE; } + +extern const u32 LZ77UnCompWRAMOptimized[]; +extern const u32 LZ77UnCompWRAMOptimized_end[]; + +ARM_FUNC static void SwitchToArmCallFastLZ77(const u32 *src, void *dest, void (*funcPtr)(const u32 *src, void *dest)) +{ + funcPtr(src, dest); +} + +void FastLZ77UnCompWram(const u32 *src, void *dest) +{ + u32 funcBuffer[200]; + + CopyFuncToIwram(funcBuffer, LZ77UnCompWRAMOptimized, LZ77UnCompWRAMOptimized_end); + SwitchToArmCallFastLZ77(src, dest, (void *) funcBuffer); +} diff --git a/src/decompress_asm.s b/src/decompress_asm.s new file mode 100644 index 0000000000..bfe690ef60 --- /dev/null +++ b/src/decompress_asm.s @@ -0,0 +1,131 @@ + .syntax unified + + .arm + .section .iwram.code + .align 2 + +.global FastUnsafeCopy32 +.type FastUnsafeCopy32, %function + + @ Word aligned, 32-byte copy + @ This function WILL overwrite your buffer, so make sure it is at least 32 bytes larger than the desired size. +FastUnsafeCopy32: + push {r4-r10} +.Lloop_32: + ldmia r1!, {r3-r10} + stmia r0!, {r3-r10} + subs r2, r2, #32 + bgt .Lloop_32 + pop {r4-r10} + bx lr + + +@ Credit to: luckytyphlosion as it's his implementation + + .section .text @Copied to stack on run-time + .align 2 + +.global LZ77UnCompWRAMOptimized +.type LZ77UnCompWRAMOptimized, %function +LZ77UnCompWRAMOptimized: @ 0x000010FC + push {r4, r5, r6, lr} + // read in data header in r5 + // Data header (32bit) + // Bit 0-3 Reserved + // Bit 4-7 Compressed type (must be 1 for LZ77) + // Bit 8-31 Size of decompressed data + ldr r5, [r0], #4 + // store decompressed size in r2 + lsr r2, r5, #8 + // main loop + cmp r2, #0 + ble LZ77_Done +LZ77_MainLoop: + // read in Flag Byte + // Flag data (8bit) + // Bit 0-7 Type Flags for next 8 Blocks, MSB first + ldrb lr, [r0], #1 + // shift to the highest byte + lsl lr, lr, #24 + // 8 blocks so set counter (r4) to 8 + mov r4, #8 + b LZ77_EightBlockLoop +LZ77_HandleCompressedData: + // reading in block type 1 Part 1 into r5 + // Block Type 1 Part 1 - Compressed - Copy N+3 Bytes from Dest-Disp-1 to Dest + // Bit 0-3 Disp MSBs + // Bit 4-7 Number of bytes to copy (minus 3) + // byte copy range: [3, 18] + ldrb r5, [r0], #1 + + + // 18 -> 0 + // 17 -> 1 + // 16 -> 2 + // ... + // 3 -> 15 + // formula: do 18 - x + // want to calculate r3 = 18 - (3 + (numBytesToCopy)) + // r3 = 18 - 3 - (numBytesToCopy) + // r3 = 15 - numBytesToCopy + // but then also need to do r2 = r2 - (3 + (numBytesToCopy)) + // r2 = r2 - 3 - numBytesToCopy + // r2 = r2 - 18 + 18 - 3 - numBytesToCopy + // r2 = r2 - 18 + 15 - numBytesToCopy + + mov r6, #3 + // r3 = 3 + (numBytesToCopy) + add r3, r6, r5, asr #4 + // get displacement high bits + and r5, r5, #0xf + // Now reading Block Type 1 Part 2 into r6 + // Block type 1 Part 2 + // Bit 0-7 Disp LSBs + ldrb r6, [r0], #1 + // combine low and high bits into r6 + orr r6, r6, r5, lsl #8 + // +1 because of reasons + add r6, r6, #1 + // subtract how many bytes are going to be copied from the size + subs r2, r2, r3 + + // do duff's device + // https://en.wikipedia.org/wiki/Duff%27s_device + // calculate pc offset + rsb r3, r3, #18 + // jump + add pc, pc, r3, lsl #3 + nop + .rept 18 + ldrb r5, [r1, -r6] + strb r5, [r1], #1 + .endr + + // cpsr flags still preserved from earlier + // check if no more bytes have to be copied + ble LZ77_Done + // check if end of the block + subs r4, r4, #1 + ble LZ77_MainLoop +LZ77_EightBlockLoop: + // check if compressed data (bit set) + lsls lr, lr, #1 + bcs LZ77_HandleCompressedData + // uncompressed data can only be 1 byte long + // copy one byte of uncompressed data + ldrb r6, [r0], #1 + strb r6, [r1], #1 + subs r2, r2, #1 + ble LZ77_Done +LZ77_EightBlockLoop_HandleLoop: + // check if we're done with the 8 blocks + subs r4, r4, #1 + bgt LZ77_EightBlockLoop // go back to main loop if so + // no need to check if r2 is 0 since already checked elsewhere + b LZ77_MainLoop +LZ77_Done: + pop {r4, r5, r6, lr} + bx lr + +.global LZ77UnCompWRAMOptimized_end +LZ77UnCompWRAMOptimized_end: diff --git a/src/decompress_error_handler.c b/src/decompress_error_handler.c new file mode 100644 index 0000000000..74e28e3ca1 --- /dev/null +++ b/src/decompress_error_handler.c @@ -0,0 +1,197 @@ +#include "decompress_error_handler.h" +#include "global.h" +#include "data.h" +#include "menu.h" +#include "menu_helpers.h" +#include "malloc.h" +#include "palette.h" +#include "graphics.h" +#include "gpu_regs.h" +#include "bg.h" +#include "main.h" +#include "text_window.h" +#include "string_util.h" +#include "constants/rgb.h" + +static EWRAM_DATA u32 sErrorAddress; +static EWRAM_DATA enum CompressionError sCompressionError; + +static const struct BgTemplate sBgTemplates[3] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 14, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0, + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, +}; + +static void DecompressErrorScreenTextPrint(const u8 *text, u8 x, u8 y) +{ + u8 color[3]; + + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_DYNAMIC_COLOR_6; + color[2] = TEXT_COLOR_LIGHT_GRAY; + AddTextPrinterParameterized4(0, FONT_NORMAL, x * 8, y * 8 + 1, 0, 0, color, 0, text); +} + +static void GetHexStringFromU32(u8 *str, u32 value) +{ + str[0] = CHAR_0; + str[1] = CHAR_x; + str[10] = EOS; + for (u32 i = 0; i < 8; i++) + { + u8 currChar = 0; + switch ((value >> (4*i)) & 0xF) + { + case 0: + currChar = CHAR_0; + break; + case 1: + currChar = CHAR_1; + break; + case 2: + currChar = CHAR_2; + break; + case 3: + currChar = CHAR_3; + break; + case 4: + currChar = CHAR_4; + break; + case 5: + currChar = CHAR_5; + break; + case 6: + currChar = CHAR_6; + break; + case 7: + currChar = CHAR_7; + break; + case 8: + currChar = CHAR_8; + break; + case 9: + currChar = CHAR_9; + break; + case 10: + currChar = CHAR_A; + break; + case 11: + currChar = CHAR_B; + break; + case 12: + currChar = CHAR_C; + break; + case 13: + currChar = CHAR_D; + break; + case 14: + currChar = CHAR_E; + break; + case 15: + currChar = CHAR_F; + break; + } + u32 pos = 9 - i; + str[pos] = currChar; + } +} + +void DecompressionError_CB2(void) +{ + static const struct WindowTemplate textWin[] = + { + { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 2, + .width = 24, + .height = 16, + .paletteNum = 15, + .baseBlock = 1, + } + }; + + if (sErrorAddress == 0) + return; + + ResetVramOamAndBgCntRegs(); + ResetAllBgsCoordinates(); + FreeAllWindowBuffers(); + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + LoadBgTiles(0, gTextWindowFrame1_Gfx, 0x120, 0x214); + DeactivateAllTextPrinters(); + ResetTasks(); + ResetPaletteFade(); + LoadPalette(gTextWindowFrame1_Pal, 0xE0, 0x20); + LoadPalette(gStandardMenuPalette, 0xF0, 0x20); + InitWindows(textWin); + DrawStdFrameWithCustomTileAndPalette(0, TRUE, 0x214, 0xE); + static const u8 romCheckFailMessage[] =_( + "{COLOR RED}ERROR! {COLOR DARK_GRAY}Decompression Failed!\n" + "\n" + "Address:\n" + "Error:\n"); + DecompressErrorScreenTextPrint(romCheckFailMessage, 1, 0); + u8 addressStr[11]; + u8 errorStr[11]; + GetHexStringFromU32(addressStr, sErrorAddress); + GetHexStringFromU32(errorStr, sCompressionError); + DecompressErrorScreenTextPrint(addressStr, 7, 4); + DecompressErrorScreenTextPrint(errorStr, 7, 6); + TransferPlttBuffer(); + *(u16*)PLTT = RGB(17, 18, 31); + ShowBg(0); + sErrorAddress = 0; + // This loop is apparently needed to prevent the game from doing + // stupid stuff with data it couldn't decompress + while(TRUE) + sCompressionError++; +} + +void DecompressionError(const u32 *src, enum CompressionError error) +{ + sErrorAddress = (u32)src; + sCompressionError = error; + SetMainCallback2(DecompressionError_CB2); + DecompressionError_CB2(); +} + +void DoDecompressionError(void) +{ + DecompressionError((u32 *)0x12345678, HEADER_ERROR); +} diff --git a/src/decoration.c b/src/decoration.c index 1608061255..dba16d8f97 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -2080,7 +2080,7 @@ static u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 if (!AllocItemIconTemporaryBuffers()) return MAX_SPRITES; - LZDecompressWram(GetDecorationIconPic(decor), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetDecorationIconPic(decor), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); sheet.data = gItemIcon4x4Buffer; sheet.size = 0x200; diff --git a/src/dexnav.c b/src/dexnav.c index 48dd75829b..6857de210c 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -1656,7 +1656,7 @@ static bool8 DexNav_LoadGraphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(sDexNavGuiTilemap, sBg1TilemapBuffer); + DecompressDataWithHeaderWram(sDexNavGuiTilemap, sBg1TilemapBuffer); sDexNavUiDataPtr->state++; } break; diff --git a/src/diploma.c b/src/diploma.c index 2a18867450..50284f7cc6 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -80,7 +80,7 @@ void CB2_ShowDiploma(void) DecompressAndCopyTileDataToVram(1, &sDiplomaTiles, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(sDiplomaTilemap, sDiplomaTilemapPtr); + DecompressDataWithHeaderWram(sDiplomaTilemap, sDiplomaTilemapPtr); CopyBgTilemapBufferToVram(1); DisplayDiplomaText(); BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 16ea035c7c..0393afae8b 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -1,6 +1,7 @@ #include "global.h" #include "malloc.h" #include "bg.h" +#include "decompress.h" #include "dodrio_berry_picking.h" #include "dynamic_placeholder_text_util.h" #include "event_data.h" @@ -3830,7 +3831,7 @@ static void LoadDodrioGfx(void) struct SpritePalette normal = {sDodrioNormal_Pal, PALTAG_DODRIO_NORMAL}; struct SpritePalette shiny = {sDodrioShiny_Pal, PALTAG_DODRIO_SHINY}; - LZ77UnCompWram(sDodrio_Gfx, ptr); + DecompressDataWithHeaderWram(sDodrio_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x3000, GFXTAG_DODRIO}; @@ -4013,7 +4014,7 @@ static void CreateStatusBarSprites(void) void *ptr = AllocZeroed(0x180); struct SpritePalette pal = {sStatus_Pal, PALTAG_STATUS}; - LZ77UnCompWram(sStatus_Gfx, ptr); + DecompressDataWithHeaderWram(sStatus_Gfx, ptr); // This check should be one line up. if (ptr) { @@ -4155,7 +4156,7 @@ static void LoadBerryGfx(void) void *ptr = AllocZeroed(0x480); struct SpritePalette pal = {sBerries_Pal, PALTAG_BERRIES}; - LZ77UnCompWram(sBerries_Gfx, ptr); + DecompressDataWithHeaderWram(sBerries_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x480, GFXTAG_BERRIES}; @@ -4303,7 +4304,7 @@ static void CreateCloudSprites(void) void *ptr = AllocZeroed(0x400); struct SpritePalette pal = {sCloud_Pal, PALTAG_CLOUD}; - LZ77UnCompWram(sCloud_Gfx, ptr); + DecompressDataWithHeaderWram(sCloud_Gfx, ptr); if (ptr) { struct SpriteSheet sheet = {ptr, 0x400, GFXTAG_CLOUD}; diff --git a/src/expansion_intro.c b/src/expansion_intro.c index f656c4ff5e..668661e8dd 100644 --- a/src/expansion_intro.c +++ b/src/expansion_intro.c @@ -308,10 +308,10 @@ static void ExpansionIntro_InitBgs(void) static void ExpansionIntro_LoadGraphics(void) { - LZ77UnCompVram(sBgTiles_PoweredBy, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].charBaseIndex)); - LZ77UnCompVram(sBgMap_PoweredBy, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].mapBaseIndex)); - LZ77UnCompVram(sBgTiles_RhhCredits, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].charBaseIndex)); - LZ77UnCompVram(sBgMap_RhhCredits, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].mapBaseIndex)); + DecompressDataWithHeaderVram(sBgTiles_PoweredBy, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].charBaseIndex)); + DecompressDataWithHeaderVram(sBgMap_PoweredBy, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG3].mapBaseIndex)); + DecompressDataWithHeaderVram(sBgTiles_RhhCredits, (void*) BG_CHAR_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].charBaseIndex)); + DecompressDataWithHeaderVram(sBgMap_RhhCredits, (u16*) BG_SCREEN_ADDR(sBgTemplates_RhhCopyrightScreen[EXPANSION_INTRO_BG2].mapBaseIndex)); LoadPalette(sBgPal_Credits, 0x00, 0x60); LoadCompressedSpriteSheet(&sSpriteSheet_DizzyEgg); diff --git a/src/field_effect.c b/src/field_effect.c index 1f2feaba8f..2106fcd491 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -930,7 +930,7 @@ u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buf static void UNUSED LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) { - LZDecompressVram(gTrainerSprites[gender].frontPic.data, dest); + DecompressDataWithHeaderVram(gTrainerSprites[gender].frontPic.data, dest); LoadPalette(gTrainerSprites[gender].palette.data, palOffset, PLTT_SIZE_4BPP); } diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 1e2b9a95fc..788d3ca0fd 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -1,5 +1,6 @@ #include "global.h" #include "braille_puzzles.h" +#include "decompress.h" #include "event_data.h" #include "event_scripts.h" #include "field_effect.h" @@ -216,8 +217,8 @@ static void Task_ExitCaveTransition1(u8 taskId) static void Task_ExitCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + DecompressDataWithHeaderVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + DecompressDataWithHeaderVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); LoadPalette(sCaveTransitionPalette_White, BG_PLTT_ID(14), PLTT_SIZE_4BPP); LoadPalette(&sCaveTransitionPalette_Enter[8], BG_PLTT_ID(14), PLTT_SIZEOF(8)); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 @@ -301,8 +302,8 @@ static void Task_EnterCaveTransition1(u8 taskId) static void Task_EnterCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + DecompressDataWithHeaderVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + DecompressDataWithHeaderVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); diff --git a/src/intro.c b/src/intro.c index 7a19e235ef..fb4c757567 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1059,8 +1059,8 @@ static void MainCB2_EndIntro(void) static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteOffset) { - LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); - LZ77UnCompVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); + DecompressDataWithHeaderVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); + DecompressDataWithHeaderVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); LoadPalette(gIntroCopyright_Pal, paletteOffset, PLTT_SIZE_4BPP); } @@ -1184,14 +1184,14 @@ void Task_Scene1_Load(u8 taskId) SetGpuReg(REG_OFFSET_BG2VOFS, 80); SetGpuReg(REG_OFFSET_BG1VOFS, 24); SetGpuReg(REG_OFFSET_BG0VOFS, 40); - LZ77UnCompVram(sIntro1Bg_Gfx, (void *)VRAM); - LZ77UnCompVram(sIntro1Bg0_Tilemap, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sIntro1Bg_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(sIntro1Bg0_Tilemap, (void *)(BG_CHAR_ADDR(2))); DmaClear16(3, BG_SCREEN_ADDR(17), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); + DecompressDataWithHeaderVram(sIntro1Bg1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); DmaClear16(3, BG_SCREEN_ADDR(19), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); + DecompressDataWithHeaderVram(sIntro1Bg2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); DmaClear16(3, BG_SCREEN_ADDR(21), BG_SCREEN_SIZE); - LZ77UnCompVram(sIntro1Bg3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); + DecompressDataWithHeaderVram(sIntro1Bg3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); DmaClear16(3, BG_SCREEN_ADDR(23), BG_SCREEN_SIZE); LoadPalette(sIntro1Bg_Pal, BG_PLTT_ID(0), sizeof(sIntro1Bg_Pal)); SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512); @@ -1730,8 +1730,8 @@ static void SpriteCB_Manectric(struct Sprite *sprite) static void Task_Scene3_Load(u8 taskId) { IntroResetGpuRegs(); - LZ77UnCompVram(sIntroPokeball_Gfx, (void *)VRAM); - LZ77UnCompVram(sIntroPokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sIntroPokeball_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(sIntroPokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); LoadPalette(sIntroPokeball_Pal, BG_PLTT_ID(0), sizeof(sIntroPokeball_Pal)); gTasks[taskId].tAlpha = 0; gTasks[taskId].tZoomDiv = 0; @@ -1785,10 +1785,10 @@ static void Task_Scene3_LoadGroudon(u8 taskId) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZDecompressVram(gIntroGroudon_Gfx, (void *)VRAM); - LZDecompressVram(gIntroGroudon_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroLegendBg_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroGroudonBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroGroudon_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroGroudon_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroLegendBg_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroGroudonBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); LoadSpritePalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); CpuCopy16(gIntro3Bg_Pal, gPlttBufferUnfaded, sizeof(gIntro3Bg_Pal)); @@ -2060,9 +2060,9 @@ static void SpriteCB_GroudonRocks(struct Sprite *sprite) static void Task_Scene3_LoadKyogre(u8 taskId) { ResetSpriteData(); - LZDecompressVram(gIntroKyogre_Gfx, (void *)VRAM); - LZDecompressVram(gIntroKyogre_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroKyogreBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroKyogre_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroKyogre_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroKyogreBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); LoadCompressedSpriteSheet(sSpriteSheet_Bubbles); LoadSpritePalette(sSpritePalette_Bubbles); BeginNormalPaletteFade(PALETTES_ALL & ~1, 0, 16, 0, RGB_WHITEALPHA); @@ -2368,16 +2368,16 @@ static void Task_Scene3_LoadClouds1(u8 taskId) SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); - LZDecompressVram(gIntroClouds_Gfx, (void *)VRAM); - LZDecompressVram(gIntroClouds_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroCloudsSun_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroClouds_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroClouds_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroCloudsSun_Tilemap, (void *)(BG_SCREEN_ADDR(28))); gTasks[taskId].func = Task_Scene3_LoadClouds2; } static void Task_Scene3_LoadClouds2(u8 taskId) { - LZDecompressVram(gIntroCloudsLeft_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroCloudsRight_Tilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gIntroCloudsLeft_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroCloudsRight_Tilemap, (void *)(BG_SCREEN_ADDR(26))); gTasks[taskId].func = Task_Scene3_InitClouds; } @@ -2435,10 +2435,10 @@ static void Task_Scene3_Clouds(u8 taskId) static void Task_Scene3_LoadLightning(u8 taskId) { - LZDecompressVram(gIntroRayquaza_Tilemap, (void *)(BG_SCREEN_ADDR(28))); - LZDecompressVram(gIntroRayquazaClouds_Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntroRayquaza_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntroRayquazaClouds_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gIntroRayquaza_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gIntroRayquazaClouds_Tilemap, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gIntroRayquaza_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gIntroRayquazaClouds_Gfx, (void *)VRAM); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index c4b059fdd7..3df3119304 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -728,8 +728,8 @@ static void Task_BicycleBgAnimation(u8); void LoadIntroPart2Graphics(u8 scenery) { - LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); LoadPalette(&sGrass_Pal, BG_PLTT_ID(15), sizeof(sGrass_Pal)); switch (scenery) { @@ -737,16 +737,16 @@ void LoadIntroPart2Graphics(u8 scenery) default: // Never reached, only called with an argument of 1 // Clouds are never used in this part of the intro - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBg_Pal, BG_PLTT_ID(0), sizeof(sCloudsBg_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); LoadPalette(&sClouds_Pal, OBJ_PLTT_ID(0), sizeof(sClouds_Pal)); CreateCloudSprites(); break; case 1: - LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sTrees_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sTrees_Pal, BG_PLTT_ID(0), sizeof(sTrees_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); LoadPalette(&sTreesSmall_Pal, OBJ_PLTT_ID(0), sizeof(sTreesSmall_Pal)); @@ -837,36 +837,36 @@ void SetIntroPart2BgCnt(u8 scenery) void LoadCreditsSceneGraphics(u8 scene) { - LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); switch (scene) { case SCENE_OCEAN_MORNING: default: LoadPalette(&sGrass_Pal, BG_PLTT_ID(15), sizeof(sGrass_Pal)); - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBg_Pal, BG_PLTT_ID(0), sizeof(sCloudsBg_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); - LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + DecompressDataWithHeaderVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); LoadPalette(&sClouds_Pal, OBJ_PLTT_ID(0), sizeof(sClouds_Pal)); CreateCloudSprites(); break; case SCENE_OCEAN_SUNSET: LoadPalette(&sGrassSunset_Pal, BG_PLTT_ID(15), sizeof(sGrassSunset_Pal)); - LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sCloudsBg_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sCloudsBgSunset_Pal, BG_PLTT_ID(0), sizeof(sCloudsBgSunset_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_Clouds); - LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + DecompressDataWithHeaderVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); LoadPalette(&sCloudsSunset_Pal, OBJ_PLTT_ID(0), sizeof(sCloudsSunset_Pal)); CreateCloudSprites(); break; case SCENE_FOREST_RIVAL_ARRIVE: case SCENE_FOREST_CATCH_RIVAL: LoadPalette(&sGrassSunset_Pal, BG_PLTT_ID(15), sizeof(sGrassSunset_Pal)); - LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sTrees_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sTreesSunset_Pal, BG_PLTT_ID(0), sizeof(sTreesSunset_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); LoadPalette(&sTreesSunset_Pal, OBJ_PLTT_ID(0), sizeof(sTreesSunset_Pal)); @@ -874,8 +874,8 @@ void LoadCreditsSceneGraphics(u8 scene) break; case SCENE_CITY_NIGHT: LoadPalette(&sGrassNight_Pal, BG_PLTT_ID(15), sizeof(sGrassNight_Pal)); - LZ77UnCompVram(sHouses_Gfx, (void *)(VRAM)); - LZ77UnCompVram(sHouses_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(sHouses_Gfx, (void *)(VRAM)); + DecompressDataWithHeaderVram(sHouses_Tilemap, (void *)(BG_SCREEN_ADDR(6))); LoadPalette(&sHouses_Pal, BG_PLTT_ID(0), sizeof(sHouses_Pal)); LoadCompressedSpriteSheet(sSpriteSheet_HouseSilhouette); LoadPalette(&sHouseSilhouette_Pal, OBJ_PLTT_ID(0), sizeof(sHouseSilhouette_Pal)); diff --git a/src/item_icon.c b/src/item_icon.c index e5bd085d7f..a218ebaf8e 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -99,7 +99,7 @@ u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId) struct SpritePalette spritePalette; struct SpriteTemplate *spriteTemplate; - LZDecompressWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); spriteSheet.data = gItemIcon4x4Buffer; spriteSheet.size = 0x200; @@ -136,7 +136,7 @@ u8 AddCustomItemIconSprite(const struct SpriteTemplate *customSpriteTemplate, u1 struct SpritePalette spritePalette; struct SpriteTemplate *spriteTemplate; - LZDecompressWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); + DecompressDataWithHeaderWram(GetItemIconPic(itemId), gItemIconDecompressionBuffer); CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer); spriteSheet.data = gItemIcon4x4Buffer; spriteSheet.size = 0x200; diff --git a/src/item_menu.c b/src/item_menu.c index 900ddd3bc3..1c3cee77e5 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -827,7 +827,7 @@ static bool8 LoadBagMenu_Graphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBagScreen_GfxTileMap, gBagMenu->tilemapBuffer); + DecompressDataWithHeaderWram(gBagScreen_GfxTileMap, gBagMenu->tilemapBuffer); gBagMenu->graphicsLoadState++; } break; diff --git a/src/main_menu.c b/src/main_menu.c index 5dd421043d..8fcc225cce 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1295,8 +1295,8 @@ static void Task_NewGameBirchSpeech_Init(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); - LZ77UnCompVram(sBirchSpeechShadowGfx, (void *)VRAM); - LZ77UnCompVram(sBirchSpeechBgMap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(sBirchSpeechShadowGfx, (void *)VRAM); + DecompressDataWithHeaderVram(sBirchSpeechBgMap, (void *)(BG_SCREEN_ADDR(7))); LoadPalette(sBirchSpeechBgPals, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadPalette(&sBirchSpeechBgGradientPal[8], BG_PLTT_ID(0) + 1, PLTT_SIZEOF(8)); ScanlineEffect_Stop(); @@ -1830,8 +1830,8 @@ static void CB2_NewGameBirchSpeech_ReturnFromNamingScreen(void) DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); ResetPaletteFade(); - LZ77UnCompVram(sBirchSpeechShadowGfx, (u8 *)VRAM); - LZ77UnCompVram(sBirchSpeechBgMap, (u8 *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(sBirchSpeechShadowGfx, (u8 *)VRAM); + DecompressDataWithHeaderVram(sBirchSpeechBgMap, (u8 *)(BG_SCREEN_ADDR(7))); LoadPalette(sBirchSpeechBgPals, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadPalette(&sBirchSpeechBgGradientPal[1], BG_PLTT_ID(0) + 1, PLTT_SIZEOF(8)); ResetTasks(); diff --git a/src/menu.c b/src/menu.c index a6d6a38926..48bbc01dc9 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2,6 +2,7 @@ #include "malloc.h" #include "bg.h" #include "blit.h" +#include "decompress.h" #include "dma3.h" #include "event_data.h" #include "field_weather.h" @@ -1943,23 +1944,15 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId) void *malloc_and_decompress(const void *src, u32 *size) { - u32 sizeLocal; // If size is passed as NULL, because we don't care about knowing the size void *ptr; + u32 localSize = GetDecompressedDataSize(src); - if (size == NULL) - size = &sizeLocal; + if (size != NULL) + *size = localSize; - u8 *sizeAsBytes = (u8 *)size; - u8 *srcAsBytes = (u8 *)src; - - sizeAsBytes[0] = srcAsBytes[1]; - sizeAsBytes[1] = srcAsBytes[2]; - sizeAsBytes[2] = srcAsBytes[3]; - sizeAsBytes[3] = 0; - - ptr = Alloc(*size); + ptr = Alloc(localSize); if (ptr) - LZ77UnCompWram(src, ptr); + DecompressDataWithHeaderWram(src, ptr); return ptr; } diff --git a/src/mystery_gift_view.c b/src/mystery_gift_view.c index 9d1ae836dc..b1163663af 100644 --- a/src/mystery_gift_view.c +++ b/src/mystery_gift_view.c @@ -243,7 +243,7 @@ s32 WonderCard_Enter(void) LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(2), PLTT_SIZE_4BPP); gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderCardData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); - LZ77UnCompWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); + DecompressDataWithHeaderWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(2, sWonderCardData->bgTilemapBuffer, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 1, 0x008, 0); CopyBgTilemapBufferToVram(2); break; @@ -706,7 +706,7 @@ s32 WonderNews_Enter(void) LoadPalette(GetTextWindowPalette(1), BG_PLTT_ID(2), PLTT_SIZE_4BPP); gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(sWonderNewsData->gfx->pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); - LZ77UnCompWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); + DecompressDataWithHeaderWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); CopyRectToBgTilemapBufferRect(1, sWonderNewsData->bgTilemapBuffer, 0, 0, DISPLAY_TILE_WIDTH, 3, 0, 0, DISPLAY_TILE_WIDTH, 3, 1, 8, 0); CopyRectToBgTilemapBufferRect(3, sWonderNewsData->bgTilemapBuffer, 0, 3, DISPLAY_TILE_WIDTH, 3 + DISPLAY_TILE_HEIGHT, 0, 3, DISPLAY_TILE_WIDTH, 3 + DISPLAY_TILE_HEIGHT, 1, 8, 0); CopyBgTilemapBufferToVram(1); diff --git a/src/naming_screen.c b/src/naming_screen.c index e1307aa658..79028a0782 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -27,6 +27,7 @@ #include "overworld.h" #include "walda_phrase.h" #include "main.h" +#include "decompress.h" #include "constants/event_objects.h" #include "constants/rgb.h" @@ -1886,7 +1887,7 @@ static void SaveInputText(void) static void LoadGfx(void) { - LZ77UnCompWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer); + DecompressDataWithHeaderWram(gNamingScreenMenu_Gfx, sNamingScreen->tileBuffer); LoadBgTiles(1, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(2, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); LoadBgTiles(3, sNamingScreen->tileBuffer, sizeof(sNamingScreen->tileBuffer), 0); diff --git a/src/party_menu.c b/src/party_menu.c index f05c42bd0a..1fbb9e0edb 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -904,7 +904,7 @@ static bool8 AllocPartyMenuBgGfx(void) case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - LZDecompressWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer); + DecompressDataWithHeaderWram(gPartyMenuBg_Tilemap, sPartyBgTilemapBuffer); sPartyMenuInternal->data[0]++; } break; diff --git a/src/pokeball.c b/src/pokeball.c index 86b5bc9d9e..d77d49797d 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -1567,7 +1567,7 @@ void LoadBallGfx(u8 ballId) case BALL_REPEAT: case BALL_SAFARI: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); - LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); + DecompressDataWithHeaderVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; } } diff --git a/src/pokeblock.c b/src/pokeblock.c index 41d68ed8d6..2e6aaf5ccd 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -653,7 +653,7 @@ static bool8 LoadPokeblockMenuGfx(void) case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gMenuPokeblock_Tilemap, sPokeblockMenu->tilemap); + DecompressDataWithHeaderWram(gMenuPokeblock_Tilemap, sPokeblockMenu->tilemap); sPokeblockMenu->gfxState++; } break; diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index ef83dc6eda..6a50a1d4b6 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -697,7 +697,7 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) case 7: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gPokeblockFeedBg_Tilemap, sPokeblockFeed->tilemapBuffer); + DecompressDataWithHeaderWram(gPokeblockFeedBg_Tilemap, sPokeblockFeed->tilemapBuffer); sPokeblockFeed->loadGfxState++; } break; diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 93866817d2..6b95e55b79 100644 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -1,5 +1,6 @@ #include "global.h" #include "bg.h" +#include "decompress.h" #include "event_data.h" #include "gpu_regs.h" #include "graphics.h" @@ -1000,7 +1001,7 @@ static void LoadAreaUnknownGraphics(void) .size = sizeof(sPokedexAreaScreen->areaUnknownGraphicsBuffer), .tag = TAG_AREA_UNKNOWN, }; - LZ77UnCompWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer); + DecompressDataWithHeaderWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer); LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&sAreaUnknownSpritePalette); } diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index e2264dfc64..0c85945cb9 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -927,73 +927,73 @@ static void LoadBattleBg(u8 battleBgType, u8 battleEnvironment) { default: case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(sBattleEnvironmentTable[battleEnvironment].tileset, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(sBattleEnvironmentTable[battleEnvironment].tilemap, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tileset, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tilemap, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(sBattleEnvironmentTable[battleEnvironment].palette, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingGym, 0x20, 0x60); break; case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumMagma, 0x20, 0x60); break; case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumAqua, 0x20, 0x60); break; case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumSidney, 0x20, 0x60); break; case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, 0x20, 0x60); break; case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumDrake, 0x20, 0x60); break; case MAP_BATTLE_SCENE_FRONTIER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Frontier, 0x20, 0x60); break; case MAP_BATTLE_SCENE_LEADER: - LZDecompressVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_BuildingLeader, 0x20, 0x60); break; case MAP_BATTLE_SCENE_WALLACE: - LZDecompressVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_StadiumWallace, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GROUDON: - LZDecompressVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Groudon, 0x20, 0x60); break; case MAP_BATTLE_SCENE_KYOGRE: - LZDecompressVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Kyogre, 0x20, 0x60); break; case MAP_BATTLE_SCENE_RAYQUAZA: - LZDecompressVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); - LZDecompressVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); LoadPalette(gBattleEnvironmentPalette_Rayquaza, 0x20, 0x60); break; } diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 8c54c43f0c..05e7442194 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -3809,7 +3809,7 @@ static void SetScrollingBackground(void) { SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0); - LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressDataWithHeaderVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); } static void ScrollBackground(void) @@ -3822,7 +3822,7 @@ static void LoadPokeStorageMenuGfx(void) { InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); DecompressAndLoadBgGfxUsingHeap(1, gStorageSystemMenu_Gfx, 0, 0, 0); - LZ77UnCompWram(sDisplayMenu_Tilemap, sStorage->displayMenuTilemapBuffer); + DecompressDataWithHeaderWram(sDisplayMenu_Tilemap, sStorage->displayMenuTilemapBuffer); SetBgTilemapBuffer(1, sStorage->displayMenuTilemapBuffer); ShowBg(1); ScheduleBgCopyTilemapToVram(1); @@ -4040,7 +4040,7 @@ static void UpdateWaveformAnimation(void) static void InitSupplementalTilemaps(void) { - LZ77UnCompWram(gStorageSystemPartyMenu_Tilemap, sStorage->partyMenuTilemapBuffer); + DecompressDataWithHeaderWram(gStorageSystemPartyMenu_Tilemap, sStorage->partyMenuTilemapBuffer); LoadPalette(gStorageSystemPartyMenu_Pal, BG_PLTT_ID(1), PLTT_SIZE_4BPP); TilemapUtil_SetMap(TILEMAPID_PARTY_MENU, 1, sStorage->partyMenuTilemapBuffer, 12, 22); TilemapUtil_SetMap(TILEMAPID_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4); @@ -5387,7 +5387,7 @@ static void LoadWallpaperGfx(u8 boxId, s8 direction) if (wallpaperId != WALLPAPER_FRIENDS) { wallpaper = &sWallpapers[wallpaperId]; - LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DecompressDataWithHeaderWram(wallpaper->tilemap, sStorage->wallpaperTilemap); DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); if (sStorage->wallpaperLoadDir != 0) @@ -5401,7 +5401,7 @@ static void LoadWallpaperGfx(u8 boxId, s8 direction) else { wallpaper = &sWaldaWallpapers[GetWaldaWallpaperPatternId()]; - LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DecompressDataWithHeaderWram(wallpaper->tilemap, sStorage->wallpaperTilemap); DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); CpuCopy16(wallpaper->palettes, sStorage->wallpaperTilemap, 0x40); @@ -9180,7 +9180,7 @@ static void LoadItemIconGfx(u8 id, const u32 *itemTiles, const u16 *itemPal) return; CpuFastFill(0, sStorage->itemIconBuffer, 0x200); - LZ77UnCompWram(itemTiles, sStorage->tileBuffer); + DecompressDataWithHeaderWram(itemTiles, sStorage->tileBuffer); for (i = 0; i < 3; i++) CpuFastCopy(&sStorage->tileBuffer[i * 0x60], &sStorage->itemIconBuffer[i * 0x80], 0x60); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index d4ea8e5d4e..17f1f82db6 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1418,24 +1418,24 @@ static bool8 DecompressGraphics(void) case 1: if (FreeTempTileDataBuffersIfPossible() != 1) { - LZDecompressWram(gSummaryPage_Info_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][0]); + DecompressDataWithHeaderWram(gSummaryPage_Info_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][0]); sMonSummaryScreen->switchCounter++; } break; case 2: - LZDecompressWram(gSummaryPage_InfoEgg_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]); + DecompressDataWithHeaderWram(gSummaryPage_InfoEgg_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]); sMonSummaryScreen->switchCounter++; break; case 3: - LZDecompressWram(gSummaryPage_Skills_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_SKILLS][1]); + DecompressDataWithHeaderWram(gSummaryPage_Skills_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_SKILLS][1]); sMonSummaryScreen->switchCounter++; break; case 4: - LZDecompressWram(gSummaryPage_BattleMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][1]); + DecompressDataWithHeaderWram(gSummaryPage_BattleMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][1]); sMonSummaryScreen->switchCounter++; break; case 5: - LZDecompressWram(gSummaryPage_ContestMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][1]); + DecompressDataWithHeaderWram(gSummaryPage_ContestMoves_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][1]); sMonSummaryScreen->switchCounter++; break; case 6: diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index 8845307c0e..35464dfea6 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -222,7 +222,7 @@ static u32 LoopedTask_OpenConditionGraphMenu(s32 state) if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - LZ77UnCompVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]); + DecompressDataWithHeaderVram(gPokenavCondition_Tilemap, menu->tilemapBuffers[0]); SetBgTilemapBuffer(3, menu->tilemapBuffers[0]); if (IsConditionMenuSearchMode() == TRUE) CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4); @@ -236,7 +236,7 @@ static u32 LoopedTask_OpenConditionGraphMenu(s32 state) if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - LZ77UnCompVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]); + DecompressDataWithHeaderVram(sConditionGraphData_Tilemap, menu->tilemapBuffers[2]); SetBgTilemapBuffer(2, menu->tilemapBuffers[2]); CopyBgTilemapBufferToVram(2); CopyPaletteIntoBufferUnfaded(gConditionGraphData_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index d2765b6706..2dc10f34b2 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -685,7 +685,7 @@ static void LoadLeftHeaderGfxForMenu(u32 menuGfxId) tag = sMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(1)), PLTT_SIZE_4BPP); - LZDecompressWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderMenuBuffer); + DecompressDataWithHeaderWram(sMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderMenuBuffer); RequestDma3Copy(menu->leftHeaderMenuBuffer, (void *)OBJ_VRAM0 + (GetSpriteTileStartByTag(2) * 32), size, 1); menu->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sMenuLeftHeaderSpriteSheets[menuGfxId].size; @@ -707,7 +707,7 @@ static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId) tag = sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].tag; size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], OBJ_PLTT_ID(IndexOfSpritePaletteTag(2)), PLTT_SIZE_4BPP); - LZDecompressWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderSubMenuBuffer); + DecompressDataWithHeaderWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, menu->leftHeaderSubMenuBuffer); RequestDma3Copy(menu->leftHeaderSubMenuBuffer, (void *)OBJ_VRAM0 + 0x800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index b17689aad8..5dbf73b118 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -657,7 +657,7 @@ static u32 LoopedTask_DecompressCityMaps(s32 taskState) struct Pokenav_RegionMapGfx *state = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP_ZOOM); if (taskState < NUM_CITY_MAPS) { - LZ77UnCompWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); + DecompressDataWithHeaderWram(sPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]); return LT_INC_AND_CONTINUE; } diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 161440bdb3..5440ad802d 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1599,9 +1599,9 @@ static void LoadDuoFightSceneGfx(void) DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneDuoFight_Clouds_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Groudon); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonShoulder); @@ -2039,9 +2039,9 @@ static void LoadTakesFlightSceneGfx(void) DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneTakesFlight_Rayquaza_Pal, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); LoadSpritePalette(&sSpritePal_TakesFlight_Smoke); @@ -2242,8 +2242,8 @@ static void LoadDescendsSceneGfx(void) DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + DecompressDataWithHeaderWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); CpuFastFill16(0, sRayScene->tilemapBuffers[2], BG_SCREEN_SIZE); CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], BG_SCREEN_SIZE); CpuFastFill16(0, &sRayScene->tilemapBuffers[1][0x100], 0x340); @@ -2493,10 +2493,10 @@ static void LoadChargesSceneGfx(void) DecompressAndCopyTileDataToVram(3, gRaySceneCharges_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); - LZDecompressWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + DecompressDataWithHeaderWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); LoadPalette(gRaySceneCharges_Bg_Pal, BG_PLTT_ID(0), 4 * PLTT_SIZE_4BPP); } @@ -2678,9 +2678,9 @@ static void LoadChasesAwaySceneGfx(void) DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Light_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); LoadPalette(gRaySceneChasesAway_Bg_Pal, BG_PLTT_ID(0), 3 * PLTT_SIZE_4BPP); LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Groudon); LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_GroudonTail); diff --git a/src/region_map.c b/src/region_map.c index be033f8e47..46d317be1e 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -20,6 +20,7 @@ #include "field_specials.h" #include "fldeff.h" #include "region_map.h" +#include "decompress.h" #include "constants/region_map_sections.h" #include "heal_location.h" #include "constants/field_specials.h" @@ -549,7 +550,7 @@ bool8 LoadRegionMapGfx(void) if (sRegionMap->bgManaged) DecompressAndCopyTileDataToVram(sRegionMap->bgNum, sRegionMapBg_GfxLZ, 0, 0, 0); else - LZ77UnCompVram(sRegionMapBg_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); + DecompressDataWithHeaderVram(sRegionMapBg_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); break; case 1: if (sRegionMap->bgManaged) @@ -559,7 +560,7 @@ bool8 LoadRegionMapGfx(void) } else { - LZ77UnCompVram(sRegionMapBg_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); + DecompressDataWithHeaderVram(sRegionMapBg_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); } break; case 2: @@ -567,10 +568,10 @@ bool8 LoadRegionMapGfx(void) LoadPalette(sRegionMapBg_Pal, BG_PLTT_ID(7), 3 * PLTT_SIZE_4BPP); break; case 3: - LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, sRegionMap->cursorSmallImage); + DecompressDataWithHeaderWram(sRegionMapCursorSmallGfxLZ, sRegionMap->cursorSmallImage); break; case 4: - LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, sRegionMap->cursorLargeImage); + DecompressDataWithHeaderWram(sRegionMapCursorLargeGfxLZ, sRegionMap->cursorLargeImage); break; case 5: InitMapBasedOnPlayerLocation(); @@ -1707,11 +1708,11 @@ void CB2_OpenFlyMap(void) gMain.state++; break; case 5: - LZ77UnCompVram(sRegionMapFrameGfxLZ, (u16 *)BG_CHAR_ADDR(3)); + DecompressDataWithHeaderVram(sRegionMapFrameGfxLZ, (u16 *)BG_CHAR_ADDR(3)); gMain.state++; break; case 6: - LZ77UnCompVram(sRegionMapFrameTilemapLZ, (u16 *)BG_SCREEN_ADDR(30)); + DecompressDataWithHeaderVram(sRegionMapFrameTilemapLZ, (u16 *)BG_SCREEN_ADDR(30)); gMain.state++; break; case 7: @@ -1830,7 +1831,7 @@ static void LoadFlyDestIcons(void) { struct SpriteSheet sheet; - LZ77UnCompWram(sFlyTargetIcons_Gfx, sFlyMap->tileBuffer); + DecompressDataWithHeaderWram(sFlyTargetIcons_Gfx, sFlyMap->tileBuffer); sheet.data = sFlyMap->tileBuffer; sheet.size = sizeof(sFlyMap->tileBuffer); sheet.tag = TAG_FLY_ICON; diff --git a/src/roulette.c b/src/roulette.c index c72b1b7876..fd15ab70bc 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -3833,9 +3833,7 @@ static void SpriteCB_GridSquare(struct Sprite *sprite) static void CreateWheelCenterSprite(void) { u8 spriteId; - LoadCompressedSpriteSheet(&sSpriteSheet_WheelCenter); - // This sprite id isn't saved because it doesn't need to be referenced again // but by virtue of creation order it's SPR_WHEEL_CENTER spriteId = CreateSprite(&sSpriteTemplate_WheelCenter, 116, 80, 81); diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 08cc1aaeb9..39451d89d3 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -205,10 +205,10 @@ static void CB2_SaveFailedScreen(void) DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(14))); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(15))); - LZ77UnCompVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(14))); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(15))); + DecompressDataWithHeaderVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(0, sSaveFailedBuffers->tilemapBuffer); diff --git a/src/shop.c b/src/shop.c index ac8a01a9b4..5522b07583 100644 --- a/src/shop.c +++ b/src/shop.c @@ -745,7 +745,7 @@ static void BuyMenuInitBgs(void) static void BuyMenuDecompressBgGraphics(void) { DecompressAndCopyTileDataToVram(1, gShopMenu_Gfx, 0x3A0, 0x3E3, 0); - LZDecompressWram(gShopMenu_Tilemap, sShopData->tilemapBuffers[0]); + DecompressDataWithHeaderWram(gShopMenu_Tilemap, sShopData->tilemapBuffers[0]); LoadPalette(gShopMenu_Pal, BG_PLTT_ID(12), PLTT_SIZE_4BPP); } diff --git a/src/slot_machine.c b/src/slot_machine.c index 7f11396514..0d1e7301eb 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -5015,9 +5015,9 @@ static void LoadSlotMachineGfx(void) LoadReelBackground(); sDigitalDisplayGfxPtr = Alloc(0x3200); - LZDecompressWram(gSlotMachineDigitalDisplay_Gfx, sDigitalDisplayGfxPtr); + DecompressDataWithHeaderWram(gSlotMachineDigitalDisplay_Gfx, sDigitalDisplayGfxPtr); sReelTimeGfxPtr = Alloc(0x3600); - LZDecompressWram(sReelTimeGfx, sReelTimeGfxPtr); + DecompressDataWithHeaderWram(sReelTimeGfx, sReelTimeGfxPtr); sSlotMachineSpritesheetsPtr = AllocZeroed(sizeof(struct SpriteSheet) * ARRAY_COUNT(sSlotMachineSpriteSheets)); for (i = 0; i < ARRAY_COUNT(sSlotMachineSpriteSheets); i++) { @@ -5055,7 +5055,7 @@ static void LoadReelBackground(void) static void LoadMenuGfx(void) { sMenuGfx = Alloc(0x2200); - LZDecompressWram(gSlotMachineMenu_Gfx, sMenuGfx); + DecompressDataWithHeaderWram(gSlotMachineMenu_Gfx, sMenuGfx); LoadBgTiles(2, sMenuGfx, 0x2200, 0); LoadPalette(gSlotMachineMenu_Pal, BG_PLTT_ID(0), 5 * PLTT_SIZE_4BPP); LoadPalette(sUnkPalette, BG_PLTT_ID(13), PLTT_SIZE_4BPP); diff --git a/src/sprite.c b/src/sprite.c index 8367881e7d..225c181f42 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -878,8 +878,11 @@ void BeginAnim(struct Sprite *sprite) if (sprite->usingSheet) { + // Inject OW decompression here if (OW_GFX_COMPRESS && sprite->sheetSpan) + { imageValue = (imageValue + 1) << sprite->sheetSpan; + } sprite->oam.tileNum = sprite->sheetTileStart + imageValue; } else @@ -937,7 +940,10 @@ void AnimCmd_frame(struct Sprite *sprite) if (sprite->usingSheet) { if (OW_GFX_COMPRESS && sprite->sheetSpan) + { + // Inject OW frame switcher here imageValue = (imageValue + 1) << sprite->sheetSpan; + } sprite->oam.tileNum = sprite->sheetTileStart + imageValue; } else diff --git a/src/starter_choose.c b/src/starter_choose.c index 7eaff8254d..d836d819fc 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -397,9 +397,9 @@ void CB2_ChooseStarter(void) DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(gBirchBagGrass_Gfx, (void *)VRAM); - LZ77UnCompVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(6))); - LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); + DecompressDataWithHeaderVram(gBirchBagGrass_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(6))); + DecompressDataWithHeaderVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); diff --git a/src/title_screen.c b/src/title_screen.c index 1d605d1fc0..215abea813 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -596,15 +596,15 @@ void CB2_InitTitleScreen(void) break; case 1: // bg2 - LZ77UnCompVram(gTitleScreenPokemonLogoGfx, (void *)(BG_CHAR_ADDR(0))); - LZ77UnCompVram(gTitleScreenPokemonLogoTilemap, (void *)(BG_SCREEN_ADDR(9))); + DecompressDataWithHeaderVram(gTitleScreenPokemonLogoGfx, (void *)(BG_CHAR_ADDR(0))); + DecompressDataWithHeaderVram(gTitleScreenPokemonLogoTilemap, (void *)(BG_SCREEN_ADDR(9))); LoadPalette(gTitleScreenBgPalettes, BG_PLTT_ID(0), 15 * PLTT_SIZE_4BPP); // bg3 - LZ77UnCompVram(sTitleScreenRayquazaGfx, (void *)(BG_CHAR_ADDR(2))); - LZ77UnCompVram(sTitleScreenRayquazaTilemap, (void *)(BG_SCREEN_ADDR(26))); + DecompressDataWithHeaderVram(sTitleScreenRayquazaGfx, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(sTitleScreenRayquazaTilemap, (void *)(BG_SCREEN_ADDR(26))); // bg1 - LZ77UnCompVram(sTitleScreenCloudsGfx, (void *)(BG_CHAR_ADDR(3))); - LZ77UnCompVram(gTitleScreenCloudsTilemap, (void *)(BG_SCREEN_ADDR(27))); + DecompressDataWithHeaderVram(sTitleScreenCloudsGfx, (void *)(BG_CHAR_ADDR(3))); + DecompressDataWithHeaderVram(gTitleScreenCloudsTilemap, (void *)(BG_SCREEN_ADDR(27))); ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); diff --git a/src/trade.c b/src/trade.c index 4d51cfbd9a..fa8e160c6d 100644 --- a/src/trade.c +++ b/src/trade.c @@ -3189,7 +3189,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(sWirelessCloseup_Map, (void *) BG_SCREEN_ADDR(5)); + DecompressDataWithHeaderVram(sWirelessCloseup_Map, (void *) BG_SCREEN_ADDR(5)); BlendPalettes(0x8, 16, RGB_BLACK); } else @@ -3204,8 +3204,8 @@ static void SetTradeSequenceBgGpuRegs(u8 state) break; case 3: LoadPalette(sWirelessSignalNone_Pal, BG_PLTT_ID(3), PLTT_SIZE_4BPP); - LZ77UnCompVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1)); - LZ77UnCompVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18)); + DecompressDataWithHeaderVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18)); sTradeAnim->bg2vofs = 80; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | diff --git a/src/trainer_card.c b/src/trainer_card.c index 29e94bfe9f..2e066156df 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -26,6 +26,7 @@ #include "pokemon_icon.h" #include "trainer_pokemon_sprites.h" #include "contest_util.h" +#include "decompress.h" #include "constants/songs.h" #include "constants/game_stat.h" #include "constants/battle_frontier.h" @@ -535,47 +536,47 @@ static bool8 LoadCardGfx(void) { case 0: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardBg_Tilemap, sData->bgTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardBg_Tilemap, sData->bgTilemap); else - LZ77UnCompWram(gKantoTrainerCardBg_Tilemap, sData->bgTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardBg_Tilemap, sData->bgTilemap); break; case 1: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardBack_Tilemap, sData->backTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardBack_Tilemap, sData->backTilemap); else - LZ77UnCompWram(gKantoTrainerCardBack_Tilemap, sData->backTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardBack_Tilemap, sData->backTilemap); break; case 2: if (!sData->isLink) { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardFront_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardFront_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gKantoTrainerCardFront_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardFront_Tilemap, sData->frontTilemap); } else { if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCardFrontLink_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gHoennTrainerCardFrontLink_Tilemap, sData->frontTilemap); else - LZ77UnCompWram(gKantoTrainerCardFrontLink_Tilemap, sData->frontTilemap); + DecompressDataWithHeaderWram(gKantoTrainerCardFrontLink_Tilemap, sData->frontTilemap); } break; case 3: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(sHoennTrainerCardBadges_Gfx, sData->badgeTiles); + DecompressDataWithHeaderWram(sHoennTrainerCardBadges_Gfx, sData->badgeTiles); else - LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sData->badgeTiles); + DecompressDataWithHeaderWram(sKantoTrainerCardBadges_Gfx, sData->badgeTiles); break; case 4: if (sData->cardType != CARD_TYPE_FRLG) - LZ77UnCompWram(gHoennTrainerCard_Gfx, sData->cardTiles); + DecompressDataWithHeaderWram(gHoennTrainerCard_Gfx, sData->cardTiles); else - LZ77UnCompWram(gKantoTrainerCard_Gfx, sData->cardTiles); + DecompressDataWithHeaderWram(gKantoTrainerCard_Gfx, sData->cardTiles); break; case 5: if (sData->cardType == CARD_TYPE_FRLG) - LZ77UnCompWram(sTrainerCardStickers_Gfx, sData->stickerTiles); + DecompressDataWithHeaderWram(sTrainerCardStickers_Gfx, sData->stickerTiles); break; default: sData->gfxLoadState = 0; diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index 7d6af9bd79..4a58a2ee83 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -1334,7 +1334,7 @@ static bool8 LoadUsePokeblockMenuGfx(void) sMonFrame_TilemapPtr = Alloc(1280); break; case 2: - LZ77UnCompVram(sMonFrame_Tilemap, sMonFrame_TilemapPtr); + DecompressDataWithHeaderVram(sMonFrame_Tilemap, sMonFrame_TilemapPtr); break; case 3: LoadBgTiles(3, sMonFrame_Gfx, 224, 0); @@ -1347,10 +1347,10 @@ static bool8 LoadUsePokeblockMenuGfx(void) sMenu->curMonXOffset = -80; break; case 6: - LZ77UnCompVram(gUsePokeblockGraph_Gfx, sGraph_Gfx); + DecompressDataWithHeaderVram(gUsePokeblockGraph_Gfx, sGraph_Gfx); break; case 7: - LZ77UnCompVram(gUsePokeblockGraph_Tilemap, sGraph_Tilemap); + DecompressDataWithHeaderVram(gUsePokeblockGraph_Tilemap, sGraph_Tilemap); LoadPalette(gUsePokeblockGraph_Pal, BG_PLTT_ID(2), PLTT_SIZE_4BPP); break; case 8: @@ -1362,7 +1362,7 @@ static bool8 LoadUsePokeblockMenuGfx(void) CopyBgTilemapBufferToVram(1); break; case 10: - LZ77UnCompVram(sGraphData_Tilemap, sMenu->tilemapBuffer); + DecompressDataWithHeaderVram(sGraphData_Tilemap, sMenu->tilemapBuffer); break; case 11: LoadBgTilemap(2, sMenu->tilemapBuffer, 1280, 0); diff --git a/src/wallclock.c b/src/wallclock.c index ab1add25a0..ec5410f520 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -644,7 +644,7 @@ static void LoadWallClockGraphics(void) DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); - LZ77UnCompVram(gWallClock_Gfx, (void *)VRAM); + DecompressDataWithHeaderVram(gWallClock_Gfx, (void *)VRAM); if (gSpecialVar_0x8004 == MALE) LoadPalette(gWallClockMale_Pal, BG_PLTT_ID(0), PLTT_SIZE_4BPP); @@ -689,7 +689,7 @@ void CB2_StartWallClock(void) u8 spriteId; LoadWallClockGraphics(); - LZ77UnCompVram(gWallClockStart_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); + DecompressDataWithHeaderVram(gWallClockStart_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); taskId = CreateTask(Task_SetClock_WaitFadeIn, 0); gTasks[taskId].tHours = 10; @@ -733,7 +733,7 @@ void CB2_ViewWallClock(void) u8 angle2; LoadWallClockGraphics(); - LZ77UnCompVram(gWallClockView_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); + DecompressDataWithHeaderVram(gWallClockView_Tilemap, (u16 *)BG_SCREEN_ADDR(7)); taskId = CreateTask(Task_ViewClock_WaitFadeIn, 0); InitClockWithRtc(taskId); diff --git a/src/window.c b/src/window.c index f393b109de..65419ff77b 100644 --- a/src/window.c +++ b/src/window.c @@ -3,6 +3,7 @@ #include "malloc.h" #include "bg.h" #include "blit.h" +#include "decompress.h" // This global is set to 0 and never changed. COMMON_DATA u8 gTransparentTileNumber = 0; @@ -457,7 +458,7 @@ void CopyToWindowPixelBuffer(u32 windowId, const void *src, u16 size, u16 tileOf if (size != 0) CpuCopy16(src, gWindows[windowId].tileData + (32 * tileOffset), size); else - LZ77UnCompWram(src, gWindows[windowId].tileData + (32 * tileOffset)); + DecompressDataWithHeaderWram(src, gWindows[windowId].tileData + (32 * tileOffset)); } // Sets all pixels within the window to the fillValue color. diff --git a/test/compression/complex_battle_sprite.png b/test/compression/complex_battle_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..e6cc875e50a6e44219b561dab6c2218732db16ba GIT binary patch literal 2313 zcmV+k3HJ7hP)_xJaE*6;V`t-psQ zHM7t2ogg&sQPKEE$$bD=T7BQdgkcOmT1s&UP@-jPh0=WdmAOfZXFjqE@Z(&K&QMA% z@x@Ja(I?~-P}Uo0;oROK-3DOmr|`|yrB${`hAcFd;$Eu-tCTub;jKu_Jh^xpgc2+j zTQN`-K=LYC^~q3_*+x;U(`x%+m5Q&+1bhqw&CDF7Z2;QUhiYWP++5u_%d<(g=-u{1 z=gvdFy^W*^(?0_irwF;h1hD1!M-oVuSN)3{r!fYEtkP1OGP`awH!5Y>vrauM2Ev6i z;KWFAZN`wJ+ex)N~f0B~lg5N8TB9Rnffm983XugT?RECtOeGIO;?DXY)VbKcbPhUTy&WmWHPG7M7}YQ5kXR?g!f})0stRD8klQUoMHbZou+wC1w{=*J4+ipmwo5e) zr_>}}(jkVfOD=(hYA0Ghci?He+b(1N#?}%6z~U~xT%~s%>0v_vGlwacxijufQsf*n z?!xBZX*(OzKibngZQIaTjk-T0#W3VuuE9&{AIUOIm>U8}~E-fh1bV&89v?N37y7qjpk0ldN; zlyFA?4NNdU#$UgAJ{nLKP3qsIiq>G-PXa{7KJvJDWYs4*jHi&04Huam1i&zT9)m? z*b*qwbp|1 zRCU#Xi@g=vqNRVYK!DWNKs?-TwGKfzR^vvycK_379(Br0jDO773`}*y@sF zQ{BKU$7iU0#CU~=-MSQermFw*&Fg>kK(~;>C94hqt+3vF7>PPCfchsVZ(eo;K(2s( zff2i1?;t$}%;m{P0K9mj;dK}+ocRE-eh-1FlPU?C?DtMiUiVc^oh?Wy2nt>*gFX*) zvd{neih|e-t+R z0{BDm3h!db!et!^e3qBMQdvcEDxH96q{m;;CdiW^wSFbW9-B&;9vmcyS|JO z{(Bv|+lp}pNFScg-Fgg&OWVZq5P*fe0e!@Kk$@V$Ek+i4cpi4k=a1!ArMEiwwdKeK zDEo>`FKOj-Zvzv{lMxV!JZsI*zt!v?TvMYo+@8FtZJKAdDEZ7ihPx#1ZP1_K>z@;j|==^1poj5Fi=cXMVQc_m|!UI&>#>H5a5^~`0z;h@SuPg82CUa z$S@c{(1D0vbs~ zK~zY`?UXTZ6EPIW9VODOT!0U7CShVIb%$OHLvy}-fK&VdD3y__B4xW|?!aZfA@R^I zkw7vMOSWY1)R~PBK#}e<@Sa^E?(8cg1H94ypZ@Rv{4A4yw8B3D{YMY$9U2+pahu+! zH0p$5_^bsOQA$IAXbaFA3d)BfYX!Ivlc5lz4d}^KjD!L9{J<$sQ_wRy@B%%4CeMsc z6R$o#9n&`<4#9muFCEj-AQf5kg!4V0E+(i$!iY0Reo3BU^VE*u>SRBpV#2v-o$-KD zu%DowMSV}i?udfDy`(7e0sKT*AcIjXkk@-)NV_L$hYUW{fDXE!P^^I;7-Bqb^kj)A zvpUeHxS|6NmBeZa21OIV<_QoiRtU_B%UTE9{Ak0Nf?ATir~&2~LUZ|f`^f;H7r)=< zKKk?I)y?@wIltFyKo`@o*B8&vPo(sUvJ;V zMlXpARF(WDtExnzY_2>2;7(Vv(rZ;hKhT3|)8bm|A6l>HcF=rQHworwvDNxJ+~mp~ z!w`2GDlV^QH1;iTLJQjd%INv00000NkvXXu0mjf%$zo| literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_0.png b/test/compression/large_mode_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4c57fcde4f0ee0034992ab5a5bc1439ee6bd31 GIT binary patch literal 5090 zcmV<86CLb{P)003YF0{{R3XbEJh0000mP)t-s00960 z|K|VytpERu|Nm0TF-D_<|$2%OBaEg)ZZoq*)Z?7Bg}sLX06LBFV8 z_7sxHcD_QtyiXy?4-h2f0ooFIfdDTsvFBXb)%^g4%dXD`j_!Z&x#ylMBngio&Er^j zi*DzP*)vV+a~Al%?>V!JX3ut=tIx$!+-$>e9>$@gE9y13xTSSI<+I^Z2tSKL&iL%2 zfd}D90)WxRS#;&LW{kCg$vN=+jb(h@(nj1F|32`;brP;#1;S&Ki}u`gTubl1x8@Zntk*Hun*t$E>leoSRlx8F7D|Y^SfH#9y&V+x0xY z(7V5LCT@~sah|N0>3ZYV2f%e+W$Slc;5AxuyU#3xxjuI}v#wOF+toT9)w*6Lq4VZ8 zPd1)6orfN`#@d-V3KB$!KYl;*`MC4XBj5Ey{qAg z%Xw1f+aHQ5M@SpSgV332-S#y_nB}p*Fl^7d_y8EC$(A$iMGe?cO@{$+p&Q7%Hq^Cl ztMS}lS5>)tQxRb18w`Mxo}nSBQCcQp5H3diUw~N>`HnN`JOUz#Y-;mq7l&=*yVGek zejnXd`$Kk9?5ixea^wUyeN?~5pS5IDIWmO^bs=*hTPYH4O!EAy4Ft~mUR6XxM}I8u9Ldv2WI%()1X8t|!#2#Biad%o{H0=5;ccLi40 z&$ipD+W98kACGyqKkh34ZokuvEA`UmT*PUf^e_p{ejDaNQ7eJJOMW3 z$2OsI^#{<&Nb%?O;bP} zNX!@jK)!VUR^~}{e0aFO3mrD@PX-MAi6eTxU?X&*?Q&;;wrMm+NLI3SDQTYLXkGcd zRwohPR&gOAIRiAqC+vqji}nCKWE)O^hG{Whgg8sY_4&&7xaSxX9i_btVkiPop&;DS zJFRouh1x|T%A%YAbw%lFgLRI^IG%nhW4ubcgoYVxju?>cP&W63qs=J%XGDX#L}{+xwx5JO`bU1jG(RE;*B~B7cG=@S~gRc&N(v7UBYy=RiFZbVlrl z&Q;&`aFhYs>#OJHn$9Z%k;b04nq9P2=HkF1=$WOGp?5p&K1bU`H~S;{VrzT8XA807 zZUj7t(^hPzmoA2)(i@oUkH2%HJQFKmU=oFpRYf)NOSBoe2>>k!-q|&cxkwbymvYBF z*RfGu4{uD9qRc`}lfKIr9YqCT=Th9{N&L=^(gOc`3k}Uct@ri|kUo{lEy_2uePncw zmq0J`FxjqpoKG>ERMV27%6aBHcow<O zT>u7jO{i5K^0DoVWx1^y<7dkpRrT32CE>|J$IyokI%F!$B0gIF9lypPJTHt0k+$t54PteGvk%r~y4=V)B{ZU!qeG0}2=ZRULVO zi1Jtz0LwCO>nSfII##?`CI#d>C*5MMWxY-!LH!88 zcsg>!H30^Bjsf*f@9Et>1M4TRFfp<)Dl`7Is_8Ugy2@pgm$=S5%#-~AA+AgYSzyRm z3_V33A&Ehh39=9vIRM;PL!ctO0W)G;d&T|)VOQj5eZ~=CiAfhn zH6T#@0M@29H9ns(!vus>q=D8t(%HDv?%u7zIH}654BA z3yM5ONnR7XgugP=syOU_jRblQF}!HLWZadY^9gtotS+FwO7Gf@ZcoRCtQZ3 zK&yC=!ot9FA);kkmT*psZva;v?qZRPbsW8W(Rj{mS3)Q$r8E3Wy=Wt2Zd9D^4+ped zO!Ej`E7oA_DgfhQU!iJtkeB3m|Na{8;sJFB`*xw{U?}xX8#yeBkQDR3Rn*kv;65}0 zv$D)^$dV2hWzeQ&l4f!2yB_DkZIOY5-+fb54-a^4QkCU9$7t0vPAcy50_vE=|J&{; zeNaLqM7IQhd7kDdMnHZoM8SZIY(nS|tBAwtJjDn*lzE2v_}>4^U9W#Z{mOiogM03OeE>xA{WwLHLtWh1n4vT4%E{DFi2Vi>xTT*UgDjmJXyC^`%Ad5F%Umbsa{Dv25_nhBlvi_KT6Mr z*hy%4p}(DuFv1l~YEGIO(abx7YNQ|fBVtnq3E(!A*1zYwv?{Z$Ag##@a?cgsEuCEl zp-3|<2b9(O;|YKj5d|Tl$?FKIbFD{14Rf31d@|7FFH`tY^dJlB=|%Az_NNC4PB3|_ z=4}Cgd4e(^!VJudLr@RRfZRZ;R@27_o1cjUqBXwwvMAB?<@>o0goFU`LIA#k1fUFr zSW!|Rj)$^Dl{0EHys~&Wg1w;8=Fg8=d_MP~IhOYMEe>>mq=ll6sVp8NL_}0n#EAAn zOJNf2>Bu7d>yyQQrh3@=bO1m#F!r(PrYX&DO8UdYL#=i>osy0!J=_y3GwNG7GOQuT zdkPr%-;t%Qj|t;7);_~{08t@lFf}EG05+T+?jbmb0~)5zJ4OHweju@;y5fka!m+Ap z6aKZ;RFqniIITUO-sC7`xf7JJ`b_XC`+K~9kK&M;q*;~{AkIM@k=F)|_+93t7%Tlk zR>|j|^;u6>wexjEn_ejBy$C0zy_EbKPEPXlbY|&rBuOjFI*Dss0wt)9zvl7xSWSk5 zPPf@Nbp?xo0xiddL`{+uU5)lch*iy(D#e2enM(Jx(;S+EcZ6dTt`KpR{-4m>sn0JUtZ^{hvR3yDHJSlmgm5f?Q8 zodPkE^QV)?o*TNJi!p@4OSDeYDYC~o$!2E+*doPiW1{cDlLXw0~ut)47eO}pl+sk>@O$a@mK*YTa;yhN}u1U)7Ujp`Sxb8(8KN;aYmTr(@I2 zz`4}|UPcPXjRxJ);0~K(&_EiJ741dQlLDcr;PJzK30Bbs{F=pYITra^R7fLl0Ep3tDG6yOkp_L^)xhDfo=jJ- zuu+mru9r-RyhOJVv0l;~#mr8842d_Q80bQkl4)^oU342*2MFxhNK zH!DrscQC<0@+9!4T3;G>)UHp7ipBed$=%@X#Wm5mRtx}QD-7A|S}AG#)WVQ%S61H! z_cVQYjom%;B2o#y(1%QdH~y5n>!fzPN$phQ?TpBm?;jpYx<@LatuyU$XJ{Cv%>vga zA>BedXPW64lMComKo{K8yp+1F#xv8c?FjUf)CrFtLB4&7h{$@z7zNxMagTwku8Z!) zW`q6?QDu|q8n$Yb5r{vdZdHA&>TJGFNc(A{j8KR`qhP?}H>6+~=NorvJN(suRGB?7+M#f>AKu8oLg}9%JStH_RP^#9UegKBh)WA*~Cyp5}PO*bCyMMpf#I@EPMl%23Ck}U5gM3 zKSw9LhwJ~oH%Ck6<)dymPN7HFTX3o^km>5IcGi4+xbwI)UW zY3?&;+G?C*vG?mwrKa*cLFIR3a<*?fa?fBG!iL^68ME;s&bYBIPEcNwyA5+36y+Zb zv4h#iyB~GsY=AB7nKqik5@0GUy7L?GfkVRdYt$rZGw$gwDQo?x5di2577{hah@aBoc5GrCEq*eR_MkXL3x zj-+~TJ!i{^BvtsECH5fcV;*%#eek5Vpv!PccZWXaQGdFpei3AKGkqi6v^sqhpiXC2 z`f$JdYPah9^K^gzQGnxmR~pW5U|#OLuheggj|8Mos^mUM3;SBgxJ)d z_1OFteBb#q>s#2Xj{}7HeKz8Bqo(|6H3|ZV?8o5!Kip$%YvPRYR{#J207*qoM6N<$ Ef~(lKssI20 literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_1.png b/test/compression/large_mode_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4c57fcde4f0ee0034992ab5a5bc1439ee6bd31 GIT binary patch literal 5090 zcmV<86CLb{P)003YF0{{R3XbEJh0000mP)t-s00960 z|K|VytpERu|Nm0TF-D_<|$2%OBaEg)ZZoq*)Z?7Bg}sLX06LBFV8 z_7sxHcD_QtyiXy?4-h2f0ooFIfdDTsvFBXb)%^g4%dXD`j_!Z&x#ylMBngio&Er^j zi*DzP*)vV+a~Al%?>V!JX3ut=tIx$!+-$>e9>$@gE9y13xTSSI<+I^Z2tSKL&iL%2 zfd}D90)WxRS#;&LW{kCg$vN=+jb(h@(nj1F|32`;brP;#1;S&Ki}u`gTubl1x8@Zntk*Hun*t$E>leoSRlx8F7D|Y^SfH#9y&V+x0xY z(7V5LCT@~sah|N0>3ZYV2f%e+W$Slc;5AxuyU#3xxjuI}v#wOF+toT9)w*6Lq4VZ8 zPd1)6orfN`#@d-V3KB$!KYl;*`MC4XBj5Ey{qAg z%Xw1f+aHQ5M@SpSgV332-S#y_nB}p*Fl^7d_y8EC$(A$iMGe?cO@{$+p&Q7%Hq^Cl ztMS}lS5>)tQxRb18w`Mxo}nSBQCcQp5H3diUw~N>`HnN`JOUz#Y-;mq7l&=*yVGek zejnXd`$Kk9?5ixea^wUyeN?~5pS5IDIWmO^bs=*hTPYH4O!EAy4Ft~mUR6XxM}I8u9Ldv2WI%()1X8t|!#2#Biad%o{H0=5;ccLi40 z&$ipD+W98kACGyqKkh34ZokuvEA`UmT*PUf^e_p{ejDaNQ7eJJOMW3 z$2OsI^#{<&Nb%?O;bP} zNX!@jK)!VUR^~}{e0aFO3mrD@PX-MAi6eTxU?X&*?Q&;;wrMm+NLI3SDQTYLXkGcd zRwohPR&gOAIRiAqC+vqji}nCKWE)O^hG{Whgg8sY_4&&7xaSxX9i_btVkiPop&;DS zJFRouh1x|T%A%YAbw%lFgLRI^IG%nhW4ubcgoYVxju?>cP&W63qs=J%XGDX#L}{+xwx5JO`bU1jG(RE;*B~B7cG=@S~gRc&N(v7UBYy=RiFZbVlrl z&Q;&`aFhYs>#OJHn$9Z%k;b04nq9P2=HkF1=$WOGp?5p&K1bU`H~S;{VrzT8XA807 zZUj7t(^hPzmoA2)(i@oUkH2%HJQFKmU=oFpRYf)NOSBoe2>>k!-q|&cxkwbymvYBF z*RfGu4{uD9qRc`}lfKIr9YqCT=Th9{N&L=^(gOc`3k}Uct@ri|kUo{lEy_2uePncw zmq0J`FxjqpoKG>ERMV27%6aBHcow<O zT>u7jO{i5K^0DoVWx1^y<7dkpRrT32CE>|J$IyokI%F!$B0gIF9lypPJTHt0k+$t54PteGvk%r~y4=V)B{ZU!qeG0}2=ZRULVO zi1Jtz0LwCO>nSfII##?`CI#d>C*5MMWxY-!LH!88 zcsg>!H30^Bjsf*f@9Et>1M4TRFfp<)Dl`7Is_8Ugy2@pgm$=S5%#-~AA+AgYSzyRm z3_V33A&Ehh39=9vIRM;PL!ctO0W)G;d&T|)VOQj5eZ~=CiAfhn zH6T#@0M@29H9ns(!vus>q=D8t(%HDv?%u7zIH}654BA z3yM5ONnR7XgugP=syOU_jRblQF}!HLWZadY^9gtotS+FwO7Gf@ZcoRCtQZ3 zK&yC=!ot9FA);kkmT*psZva;v?qZRPbsW8W(Rj{mS3)Q$r8E3Wy=Wt2Zd9D^4+ped zO!Ej`E7oA_DgfhQU!iJtkeB3m|Na{8;sJFB`*xw{U?}xX8#yeBkQDR3Rn*kv;65}0 zv$D)^$dV2hWzeQ&l4f!2yB_DkZIOY5-+fb54-a^4QkCU9$7t0vPAcy50_vE=|J&{; zeNaLqM7IQhd7kDdMnHZoM8SZIY(nS|tBAwtJjDn*lzE2v_}>4^U9W#Z{mOiogM03OeE>xA{WwLHLtWh1n4vT4%E{DFi2Vi>xTT*UgDjmJXyC^`%Ad5F%Umbsa{Dv25_nhBlvi_KT6Mr z*hy%4p}(DuFv1l~YEGIO(abx7YNQ|fBVtnq3E(!A*1zYwv?{Z$Ag##@a?cgsEuCEl zp-3|<2b9(O;|YKj5d|Tl$?FKIbFD{14Rf31d@|7FFH`tY^dJlB=|%Az_NNC4PB3|_ z=4}Cgd4e(^!VJudLr@RRfZRZ;R@27_o1cjUqBXwwvMAB?<@>o0goFU`LIA#k1fUFr zSW!|Rj)$^Dl{0EHys~&Wg1w;8=Fg8=d_MP~IhOYMEe>>mq=ll6sVp8NL_}0n#EAAn zOJNf2>Bu7d>yyQQrh3@=bO1m#F!r(PrYX&DO8UdYL#=i>osy0!J=_y3GwNG7GOQuT zdkPr%-;t%Qj|t;7);_~{08t@lFf}EG05+T+?jbmb0~)5zJ4OHweju@;y5fka!m+Ap z6aKZ;RFqniIITUO-sC7`xf7JJ`b_XC`+K~9kK&M;q*;~{AkIM@k=F)|_+93t7%Tlk zR>|j|^;u6>wexjEn_ejBy$C0zy_EbKPEPXlbY|&rBuOjFI*Dss0wt)9zvl7xSWSk5 zPPf@Nbp?xo0xiddL`{+uU5)lch*iy(D#e2enM(Jx(;S+EcZ6dTt`KpR{-4m>sn0JUtZ^{hvR3yDHJSlmgm5f?Q8 zodPkE^QV)?o*TNJi!p@4OSDeYDYC~o$!2E+*doPiW1{cDlLXw0~ut)47eO}pl+sk>@O$a@mK*YTa;yhN}u1U)7Ujp`Sxb8(8KN;aYmTr(@I2 zz`4}|UPcPXjRxJ);0~K(&_EiJ741dQlLDcr;PJzK30Bbs{F=pYITra^R7fLl0Ep3tDG6yOkp_L^)xhDfo=jJ- zuu+mru9r-RyhOJVv0l;~#mr8842d_Q80bQkl4)^oU342*2MFxhNK zH!DrscQC<0@+9!4T3;G>)UHp7ipBed$=%@X#Wm5mRtx}QD-7A|S}AG#)WVQ%S61H! z_cVQYjom%;B2o#y(1%QdH~y5n>!fzPN$phQ?TpBm?;jpYx<@LatuyU$XJ{Cv%>vga zA>BedXPW64lMComKo{K8yp+1F#xv8c?FjUf)CrFtLB4&7h{$@z7zNxMagTwku8Z!) zW`q6?QDu|q8n$Yb5r{vdZdHA&>TJGFNc(A{j8KR`qhP?}H>6+~=NorvJN(suRGB?7+M#f>AKu8oLg}9%JStH_RP^#9UegKBh)WA*~Cyp5}PO*bCyMMpf#I@EPMl%23Ck}U5gM3 zKSw9LhwJ~oH%Ck6<)dymPN7HFTX3o^km>5IcGi4+xbwI)UW zY3?&;+G?C*vG?mwrKa*cLFIR3a<*?fa?fBG!iL^68ME;s&bYBIPEcNwyA5+36y+Zb zv4h#iyB~GsY=AB7nKqik5@0GUy7L?GfkVRdYt$rZGw$gwDQo?x5di2577{hah@aBoc5GrCEq*eR_MkXL3x zj-+~TJ!i{^BvtsECH5fcV;*%#eek5Vpv!PccZWXaQGdFpei3AKGkqi6v^sqhpiXC2 z`f$JdYPah9^K^gzQGnxmR~pW5U|#OLuheggj|8Mos^mUM3;SBgxJ)d z_1OFteBb#q>s#2Xj{}7HeKz8Bqo(|6H3|ZV?8o5!Kip$%YvPRYR{#J207*qoM6N<$ Ef~(lKssI20 literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_2.png b/test/compression/large_mode_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4c57fcde4f0ee0034992ab5a5bc1439ee6bd31 GIT binary patch literal 5090 zcmV<86CLb{P)003YF0{{R3XbEJh0000mP)t-s00960 z|K|VytpERu|Nm0TF-D_<|$2%OBaEg)ZZoq*)Z?7Bg}sLX06LBFV8 z_7sxHcD_QtyiXy?4-h2f0ooFIfdDTsvFBXb)%^g4%dXD`j_!Z&x#ylMBngio&Er^j zi*DzP*)vV+a~Al%?>V!JX3ut=tIx$!+-$>e9>$@gE9y13xTSSI<+I^Z2tSKL&iL%2 zfd}D90)WxRS#;&LW{kCg$vN=+jb(h@(nj1F|32`;brP;#1;S&Ki}u`gTubl1x8@Zntk*Hun*t$E>leoSRlx8F7D|Y^SfH#9y&V+x0xY z(7V5LCT@~sah|N0>3ZYV2f%e+W$Slc;5AxuyU#3xxjuI}v#wOF+toT9)w*6Lq4VZ8 zPd1)6orfN`#@d-V3KB$!KYl;*`MC4XBj5Ey{qAg z%Xw1f+aHQ5M@SpSgV332-S#y_nB}p*Fl^7d_y8EC$(A$iMGe?cO@{$+p&Q7%Hq^Cl ztMS}lS5>)tQxRb18w`Mxo}nSBQCcQp5H3diUw~N>`HnN`JOUz#Y-;mq7l&=*yVGek zejnXd`$Kk9?5ixea^wUyeN?~5pS5IDIWmO^bs=*hTPYH4O!EAy4Ft~mUR6XxM}I8u9Ldv2WI%()1X8t|!#2#Biad%o{H0=5;ccLi40 z&$ipD+W98kACGyqKkh34ZokuvEA`UmT*PUf^e_p{ejDaNQ7eJJOMW3 z$2OsI^#{<&Nb%?O;bP} zNX!@jK)!VUR^~}{e0aFO3mrD@PX-MAi6eTxU?X&*?Q&;;wrMm+NLI3SDQTYLXkGcd zRwohPR&gOAIRiAqC+vqji}nCKWE)O^hG{Whgg8sY_4&&7xaSxX9i_btVkiPop&;DS zJFRouh1x|T%A%YAbw%lFgLRI^IG%nhW4ubcgoYVxju?>cP&W63qs=J%XGDX#L}{+xwx5JO`bU1jG(RE;*B~B7cG=@S~gRc&N(v7UBYy=RiFZbVlrl z&Q;&`aFhYs>#OJHn$9Z%k;b04nq9P2=HkF1=$WOGp?5p&K1bU`H~S;{VrzT8XA807 zZUj7t(^hPzmoA2)(i@oUkH2%HJQFKmU=oFpRYf)NOSBoe2>>k!-q|&cxkwbymvYBF z*RfGu4{uD9qRc`}lfKIr9YqCT=Th9{N&L=^(gOc`3k}Uct@ri|kUo{lEy_2uePncw zmq0J`FxjqpoKG>ERMV27%6aBHcow<O zT>u7jO{i5K^0DoVWx1^y<7dkpRrT32CE>|J$IyokI%F!$B0gIF9lypPJTHt0k+$t54PteGvk%r~y4=V)B{ZU!qeG0}2=ZRULVO zi1Jtz0LwCO>nSfII##?`CI#d>C*5MMWxY-!LH!88 zcsg>!H30^Bjsf*f@9Et>1M4TRFfp<)Dl`7Is_8Ugy2@pgm$=S5%#-~AA+AgYSzyRm z3_V33A&Ehh39=9vIRM;PL!ctO0W)G;d&T|)VOQj5eZ~=CiAfhn zH6T#@0M@29H9ns(!vus>q=D8t(%HDv?%u7zIH}654BA z3yM5ONnR7XgugP=syOU_jRblQF}!HLWZadY^9gtotS+FwO7Gf@ZcoRCtQZ3 zK&yC=!ot9FA);kkmT*psZva;v?qZRPbsW8W(Rj{mS3)Q$r8E3Wy=Wt2Zd9D^4+ped zO!Ej`E7oA_DgfhQU!iJtkeB3m|Na{8;sJFB`*xw{U?}xX8#yeBkQDR3Rn*kv;65}0 zv$D)^$dV2hWzeQ&l4f!2yB_DkZIOY5-+fb54-a^4QkCU9$7t0vPAcy50_vE=|J&{; zeNaLqM7IQhd7kDdMnHZoM8SZIY(nS|tBAwtJjDn*lzE2v_}>4^U9W#Z{mOiogM03OeE>xA{WwLHLtWh1n4vT4%E{DFi2Vi>xTT*UgDjmJXyC^`%Ad5F%Umbsa{Dv25_nhBlvi_KT6Mr z*hy%4p}(DuFv1l~YEGIO(abx7YNQ|fBVtnq3E(!A*1zYwv?{Z$Ag##@a?cgsEuCEl zp-3|<2b9(O;|YKj5d|Tl$?FKIbFD{14Rf31d@|7FFH`tY^dJlB=|%Az_NNC4PB3|_ z=4}Cgd4e(^!VJudLr@RRfZRZ;R@27_o1cjUqBXwwvMAB?<@>o0goFU`LIA#k1fUFr zSW!|Rj)$^Dl{0EHys~&Wg1w;8=Fg8=d_MP~IhOYMEe>>mq=ll6sVp8NL_}0n#EAAn zOJNf2>Bu7d>yyQQrh3@=bO1m#F!r(PrYX&DO8UdYL#=i>osy0!J=_y3GwNG7GOQuT zdkPr%-;t%Qj|t;7);_~{08t@lFf}EG05+T+?jbmb0~)5zJ4OHweju@;y5fka!m+Ap z6aKZ;RFqniIITUO-sC7`xf7JJ`b_XC`+K~9kK&M;q*;~{AkIM@k=F)|_+93t7%Tlk zR>|j|^;u6>wexjEn_ejBy$C0zy_EbKPEPXlbY|&rBuOjFI*Dss0wt)9zvl7xSWSk5 zPPf@Nbp?xo0xiddL`{+uU5)lch*iy(D#e2enM(Jx(;S+EcZ6dTt`KpR{-4m>sn0JUtZ^{hvR3yDHJSlmgm5f?Q8 zodPkE^QV)?o*TNJi!p@4OSDeYDYC~o$!2E+*doPiW1{cDlLXw0~ut)47eO}pl+sk>@O$a@mK*YTa;yhN}u1U)7Ujp`Sxb8(8KN;aYmTr(@I2 zz`4}|UPcPXjRxJ);0~K(&_EiJ741dQlLDcr;PJzK30Bbs{F=pYITra^R7fLl0Ep3tDG6yOkp_L^)xhDfo=jJ- zuu+mru9r-RyhOJVv0l;~#mr8842d_Q80bQkl4)^oU342*2MFxhNK zH!DrscQC<0@+9!4T3;G>)UHp7ipBed$=%@X#Wm5mRtx}QD-7A|S}AG#)WVQ%S61H! z_cVQYjom%;B2o#y(1%QdH~y5n>!fzPN$phQ?TpBm?;jpYx<@LatuyU$XJ{Cv%>vga zA>BedXPW64lMComKo{K8yp+1F#xv8c?FjUf)CrFtLB4&7h{$@z7zNxMagTwku8Z!) zW`q6?QDu|q8n$Yb5r{vdZdHA&>TJGFNc(A{j8KR`qhP?}H>6+~=NorvJN(suRGB?7+M#f>AKu8oLg}9%JStH_RP^#9UegKBh)WA*~Cyp5}PO*bCyMMpf#I@EPMl%23Ck}U5gM3 zKSw9LhwJ~oH%Ck6<)dymPN7HFTX3o^km>5IcGi4+xbwI)UW zY3?&;+G?C*vG?mwrKa*cLFIR3a<*?fa?fBG!iL^68ME;s&bYBIPEcNwyA5+36y+Zb zv4h#iyB~GsY=AB7nKqik5@0GUy7L?GfkVRdYt$rZGw$gwDQo?x5di2577{hah@aBoc5GrCEq*eR_MkXL3x zj-+~TJ!i{^BvtsECH5fcV;*%#eek5Vpv!PccZWXaQGdFpei3AKGkqi6v^sqhpiXC2 z`f$JdYPah9^K^gzQGnxmR~pW5U|#OLuheggj|8Mos^mUM3;SBgxJ)d z_1OFteBb#q>s#2Xj{}7HeKz8Bqo(|6H3|ZV?8o5!Kip$%YvPRYR{#J207*qoM6N<$ Ef~(lKssI20 literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_3.png b/test/compression/large_mode_3.png new file mode 100644 index 0000000000000000000000000000000000000000..df9f920ba5e37d6a4dbe1fd697e7a6a4ebc77a42 GIT binary patch literal 11311 zcmeHtRZ!f)*X3^*+#v*a2?TcyFu1z~4K4}62G>D@dywEkgIjPJ2=4Bd;O-E7^WX1b z_hlcxt$o~E)z#g%PTh05tGcTDR7a?*%3-0Cq5}Ycr64b@`LBlo00Mvt{x|X)Peug* z{BUpW_pX{|9@I`Qj@EYeR@AOuPFB=bo_5v%;JH+hZkM0L?Y6?^9{_t40!R$dHMZ8l`_YuZPw(|#)p&U{;ps`u@|vU zwyoP;4z>1xmz&359==pE*@};r#h*WzwsJUS?t&`ZHMf%9^ zZ!kn&P?b=!_b~n3;jZ?~*!yt47q=98?kDzS63IAo3c8LX^~-6z=)c_WxBBDAQk$dq zd>q>P3#;?_q0s&I#QpScWp&`I;_R-ER>11eLpYeRQ2BJ3`NNpU@0!jJSyg>(?7|KE zJ6oSb=h!rlKP@(3wYsmZ4-+bloJ;R|M6(p#HY11o7&-FPb{xs7i5@fZ-Pi9K{Mr9& z!FFTP*g0=F*L1-j8{Ib;?eX|){?g;0#t-7Eu2s382$zag?>;*b6zPWv7w3@oVz_tm zu{rv!SM3t5gnS^)5Y+M-UTNyW+u0?kTTrtvY#fi+R2)$IOFiWqpawT@ayR2j*@Kj% zMCxEr=4WX1%LX8`#KHZiKr9RnKJ4uZKc+GX-9E2v-cXV$J-);GIT4=7EH$+^k*hC6 zbhge(^Ny`gu~f!&rwh+>d=L51mzGaA$KQlg);Aw*<~^65sqKd{d=Zjgu_3n+8-910~Q;Lw*tx> z&vV>PG!CE1vV3M*9Cx2<90R6*ikiqMI0o~EmfFb^nYY@l=yC+xa;;i~ddyaK>QVYP zP|iX(+l=UI!o-r+MK(_kR}9rSd`5ODa-@|W>>hvBbXhc{*Esl9D1Gl?GJ9`k6i)@33tq5Myi`GBCc@|T~* zsu5B-j9ik3(VCYH9U=^kh5|YrjbC_DB}gNUtNxjg0rBULrrX zM|?kvpx(S6;-#R?Tu#ZVEmpg|hV%ZymT-m)4aAQPr!!%>}`UKQQJOeSRNZnjtdn^@=+%0nIY&Z5*ASyy`Hj-ToL7&2)|G;kg(kTR*X?>3E!3CLc`^TA}&+O)OucH{t57=Ziko4rsz6$vpP~Pb`jllql@Y zNuYygUg*WzMu`3UYS!%Mv4*wZCW%JZZhU9_kum-`Ki|j*{%QmrdxO=*@@Bn0f=ADA ze*rmHQyVmZ9^d(~EiC4g^4STGTtq?1CF*jV+&(LsW-u1z#o#^!!vn6;XnT5h_9~7g}G;8gq!CHKU0g`4_ z5vj0qk98HTD=1IEHr#J|Asqhaiz1E=Zy2FK%3(uOnobVxo+weR;L2KhtB%3XU!d|( zew~;L^ul`?;?VrA*9ga+H>Upmlg+u;Vf60_q8z{Qr%8T`GjAVNYksm9Bj6Jsg(wD& zY8fWzKO8>SITouU=*!^!;8*|hILB<-=k02CfppAD{&4^#qr89a{&5M-EsGba6r$7S zo>m}W3S|nuA~1zB=qQm1H|sVKY7Gb9){hflMd@#I+9oaRR};1%E*JMkc=LtGKe=17 z(MV!?kTZPhP*}l$#zyxF+fsB$f2Fc-+na1}p@7tlYG`00Ze{ZrO$>De+B=UOy;9JQvdwbxo@uQXXRJTvm2N zPFF%}4)WnGQm+$rj%?D{Z}sKQl_0NwY;$6Ip#4iT#+^M_a@AGlS&qd1S%rkoes+XK zrfJJm6gQ-oI5uX8;0RMH4c7bUv~}PnUd_}!ox6wimN65vpZQ0yU1T%EOFZUWuhSk= z*9hJai|zC`I)2tsSotZKqD$a?aHv@D8v@2a80OpKklfPBq^*N-_Hm z8xcKOCx95z)3VVz$LkDK&hq+6X$6W)k7~vVXg0mNFpUf@Bs9)6T}qLsPi@VfbRe(K z=pbP2`tjAX6JH{%>}L8mBBaUE;#|E(*M2$;G;UzA>mJUn8z=G1@atg2UD(Bml5r4S zDfJWE1R39QZW(QYy2x;Rfqp2af&>(MgS#5TOB8)s)h)048;+46<2+9{VXPOOgJ&P} zZJHU&*w7<`Jt+-1gN=uOk~q2tx&_0ThFj*ZMWbX}{Gvf5NoJv3LTAK(#dF0%t~5IU zcm}8!fkJpb`ZR5i8W3k{^VL5L30nxHYJXx1?p8)Vj0#7rxrlu7|`dY6*QF%Uow9husFlj_+s>JkhB}E z#tq66k`=5|w&ZarXJh3#;2)h_zRwSd9r}PEC!~fl1|Uop(CA?*=$1yLznhd9+Omg; zPGVWkR1X5tMVr&<(yU65`aXk@Z|+>osDf{a?SC_ET#LCj$e5C#^VSyc`7h$iz4hYq zR~9@kkjN;HB#0H2by2fvMy0Bw(A`b>!K4us8%BpFWsO4fUE52jDIwurg$JQ`<%m=;aA zf1;~o3W1=N+M@sO`=cCtcWzo4DnYgfW7#K1oOf?U z+g*-=NfLsY5d}~q65z!Ps^Cv(X7kL$pKH0UGRiH~gnJY|BlNB0uV$VrmAG17@XJK+ zkxkdbY$#gvj$=QA%(V(ZQh~uP7?n5Vc-Rdo27C#GB(Hd(HmtQ0%&#qoYJ~JM@cii{ zG314}l5;VwK|03g5}9Dy{?-R;%XmA30hLK~omYJ(#pmAU)m@mGSi>?g$GkG!ZSH}I z!%!UN`jo!t>aB%$Zv=kh5wqFGBug#S(Xds;kjrHEEEj=e_JS~JWK$V)gqX`v6*C^U zuFeq0higCljNp|G#?8M<-|hum+&vS9V(9Ozqkr35`ABKD;EYHl8oTg z+N2grB6m(vW|V{FB?_=T(H^mjh1gXB z$h!Y$y3i|IB#;xobx0mffY40LXv+frFdiR6SvbC!VpJ)fP?p&jc%@`s!%=udVZ9SV zSUbFx49J>e9Vu;J0JDP_silRPn2BsXlI(pH(gg4G&?tGdLL+48pVs6u8d>Ra8IX~B z&^b9k(+lgLvj&@>1Fg=U3A;-0zOxK4|0fgy>~jjg%q}DRZJ9ci3>r&}l;GDC==p}U zvVz^~U36h2L^Jdax(ACfFHLSkug8Pg@DY-|ov?`g^(KT1n8+vF3(~Ly>LV!$RQY3? zhKYYE^yElw)^HLlZI$4`o&9*6$h1kCXUZ{dA?X?u{#sjCj)TE%b6jNV)a89nU0=*V5Ctc=!*cbA6+7%3FLb~1XTr8zQh#vWy zkk2DN-EASa^2gSybBYX-M}JXmag{Eqqtm)Ctb36S$55qz%{kzP;dB35pw?Gm#-N0m z!={XV=uOJjeo!E}ewI8CB=AOmZ1x7#_@DiMQ+`*+Uo#amcd|&S;vJvQ(`FGr_KEG?cIP89^@sAo@ zsY~s3DfO%GC|GAZ?9AGw=B02G=8G@S))eXt*sSmF_MkaK)EW=JzXt?=(9rwL3;TdZ z9EioW8gB4oNeT;Z9xd97;{M%5ICgCU+b@9bwQP#;c`MCrDF!0i&%tyG$rr**b!&FK znv;cwyn4wtxvZS9KxDx^HTpzWR5q=NH}CRd{{o)?KtuL;5Q*L`z5gZ)?bKgf`u#U|nG9O(DLKadE@ZyXlzBPP zjP4c-pSp6V7Ka|v9<1>Sq-eu^v3B@wl3N?5Eng>a6?Imu&8ru5oqTSu(i&RjMw#!8 z7?L=0oZ%05M^Z_UH5`njh6VHH#bLaet|BM==_fg%{OUIfiL%Aq8y<(q(DWT$Do$G} zdfrehk`D#MpQ2KrayPsr(C|74F|0*adWR__uaYPTu88U9L{z}k_BF5gRUr>|Zq0rY z`5pmz0tKV|CK=HId)?EW-?hFr>i7#7GB57QgSYGo0AN5}SzG3xMMZ1?a6tiyD8Qf` zC@6m^=zWQrefgLF-y?a{y#6J);Kcl2^1qGO1gH&wx90z05%T#Dkzz8SnfV_&02e@g z3*ZU?KE1gAtN#BPk4lXCU-*A|%*z!|UQYfm^t`;h+}xa;-0bY!tc{+m)$i<-&z=O2 zp48W8&d%XC3011OkF6fJ!I%TuDwE2uGrj|2IK%lGld<06X1( z8pyLy-2Gn?#Z^H?24xq7jl}U*S*`sN00?Omq$RXHmyWZd+?NH%`mdQ&@)yJy4}`dn zkLL$ea(*B39`~tUJjd101BtoPiUpN*BCPQ%(0 z+LQd^j|XeDTfvW6fd3DwA5W$J1vie@bbK%H@fDy`{pI@gb-;`4lX!s96NxB9yx>Lg zzVqeDMjz*q_DOH*MdkhyBn`fK&!76Uu(GkSaoLRz#&QF%h^WSdUym*v?{Kq%;9Gbb z?uG;#qd$?m9sx(kEJP^SXnhRY5{+*o&ec(Y}`#y+XW4fY~@j9(SNtB zeg>z$W5L>(bFd?Y8`iNifL44fRS|7zdcZ4>ep#3kkZ`1?(4fx%e3>kxP6o6h{N0Zl zR{x0{UctB;2Bz-b3*teB&{%$2Ue>JJWglOeLxwy3#js}sde5{LBY}Zxc6d1J0~MlY zfKPu+SfkY_f_&1!DfYlaH?YKuI^{Ip#sNM%nW9#Li=WnkJ;RGENr8#MkWTyYYg!dB z?vc<**_*+KHUK1`FFvW_-q^Z&?C|_LQP`O8*bDaI?E_+!UbSA+Wy?GG?9cf^P$ioo z@rF&thK|R`Au+6MsUvcc@$a3M*YDk`l(rUe@(smh8@vZZ@ktoO=9ikwh$*aWQOq}L z`7H=JC3=9j2_sERkjAX>=<@P%{(Wohlhz!LnA+c~ep(|(6~8E41jwwK1KqY`LWXX` zBqbTssRMN@q8Mx(d)l`=s&al@^(j`Si*Es`vS8YOo+KwN6T7?EYk>_1wTl|lr;Y8D z+V|kgeEnCA@rL%)o{IULF|Ed#Lj8|UekQF)DIJ&R^Bju@5-q;B#D4{wg$(PJ`uz(gRWer*98ND-&Q-;m8v=t*6y(D@3vI^S+4)g85}cg1#z7I3 zxP}!F>4$m>|KiH2%{IyC(?T)W^ad0U z_3WhrNg^UC1pkilW z`PD++hNgkLe0(yMo>#g~e;jqg=3CzhL5%mbTM;244~(1)Y$ z&aW>Jm3>VQVTtdKvFnB19$W1o4Lkx%zq29Cbf6{2^Jh0yY78XJ^caKz+B)h?=|y#z zA1!3#u45zJK2q;~(EGuG8}_tLX&Qji1ZD+S2ly6{)%VVg29Uwz5Iv1R@CIKBV9uqe zlL?+bXLUaedWU?J19tkK=jYX;!s4G&$@JL|gc6)d_ZPRdKoEh1f%aG5(to%8_g+Zq zfnv0*D7n`)=U@Gw>#N21Ou+I~tcY-fxb8O;M6R%}D6rDfzdUs!u%Fp8tF^oyvlbVM zhJ&p-cB&|uAu;zu^;D0v_Bxq$D9naf%(e}P@l5D}pb^=w>mLM%_5?#nC5EHBC|Au# z5lJ+hc&M8Q2$q-4z`cnU~@(Q^gl>RgUnnBq7Mj7BC&-@x$6k z{$5&qod9S)!T{IH5{yo;=@y&h2TXVHf-F^XSIjkx2W1MoggG_0iu5lK9S)7V!Wore ziGoEAA0{8Y4NqO#1ToNsq7$&9$Cz)60+Lbupq8XuWLOJQ?p5IrA0*roxn_?=RVnTa ztTXu@$ml(AaO7l*&k3U)hyMM#yA}Q&G%@3GQO$xy4|@awu|T&F-WJjzIKun09)Ue^ zu0)NCb!1Ji@<$P1>v2^T;mAdLK*Oh)Y0L3P4jqgg&d5)tZIK`kDH-IpWwFkE+hE-Rb=og_wH+y&qSS`iAMtA8lmg+7-0$2T@#JhP|bTxL}O@y`hT zK}pWaN5r3XmcXvVulQGDBmoy3Zi(f7F&I510Xson!loP5oYa|$u! z@mw*}(&`l}dtubzMADRFOtyS8W)P&2yU|@;mE)p8;R9a~CT>VlxQ;eGDKH>n&w%`` zE&t@#G%GEqSmbv;zO&asrRzwns2C$16hEJVV{u4-+QK-Owkw4?-#ciEwElJ_Mrks! zx@bEc4j2M@chQKByys;K66Q%10<3ulY6rF>K%5H2A(5Hy@*HM(h`ouw#uK3MB-T=( zi!hdzE+FAw!mdTPr2-p8WC|2%>BFPZn27D^=Uc(uC&}76NB9*9NVQc_!7*->H!_t< zAn7P9Skh`P+-&hi0v!@7Qv{KNFlg4ue&5OtcxPfBob1B~mNy?ul}`x^fNI{|iiUfn=(y0z5n(JAe#Ux07$3zFwB;LU z6@W5}i(en|?S0Ayxc7T-HNFaL$TENcet8Lf!UQh%wme8ZF5fkVO0=h?3X@wA?va;} z0&VCrz`G=?!t>j)zX)_WM(Rz2W-NKG-)A&vR#tnn2KoXwZ9ekIzxh#LkB2gsV_fU)#qCo5y57KB{A!w^3iQ?>j&7uHCaha60+FM#Y#SFNLznyEroVA#Q5;DBM219a zn4P5A-Ah!=2#|eCtg)@rtr?NOgt@Y0Ai>(&RvjiWLR(rxXYV%6vO7p#ZT!S6m|sun_fh{-l^xyS$TCtZD*t_k*)RMtjqeT3O{rL zzE%T#F-plzIt<8H+ti>1@h4nCwXhpX`*pUL?H*hNlWU2N-m>iWWSJDxN}$7$ZRibo z=o+1K@dKn{Qad}Do>p{e{MN>@(2Kz(jikhXKN_F%)efPl!A zdxMLl=000`n_jQKhsBtrRr8e~#Mim{YqF34Pg$F^c=i}v)p^W6X#nzQgVwS1^dc;w z2Z^s~g31HO#DVUTG$c?q%bWe{tBI69y!dZpI>z4qCJ9s(lSf|S79DkK6xwM7-t!2kiJ+!OT_G}z@9B(=d1RFQM4$E$c-}TI_`OO% z$ZeTBNP4qR7nIGki{ql|X_saSB+6B3s6_xJj$vDjV08jRESNQva(dKcSc)>w&1ERW z^1-z_LyH|^2BJJC`1bXSDUr93BJlcJ1s#y>nyZXLC)z;EF03;Mot?*n*-6AOhA4gg z0|HF%0T?0xF*@z69^_`yS0L+}dnoa@ql2B_yzceANH|BO{Y%^-;Y)QB(N+o}gB zMG^}XAa;zVKq6`D+p7@q>{KkgYHZ4l-pHJGx z$toO}Aedy5ArJ%jAfJ```Z}Y9=u_;aFPQ?$&~UlcKPZaw2Hai44i}SRHS8hL)MyYs z{H?}iMl6^Zhw{}cSvoA1WJW+YeJWU;FHSL$(gQ{>aKFGvRK<6o=}o#5I# Q%$T zkjw;Ild6K@kuiOFU2(E+jNh=rj7g%AICZd@Y3F44E_}UwS*h4yVP+Skc^7+(YKot$ zr;QcV#l*T7G0-u52U(RDR9F8!2u)8990qb+DpY|-W^Ta%oFpwmd^%u74iYaizB#nl zbAV%F#CTO|iU}EZv7w#;7+Xpk|A1@tUl+~=YUg{EoVeLSbrvrhNzG&dvu%!gIlD1p z4VMutb>pVz-tzeJQ4CXP456j{S6e~_9t7<+!euM-eBp7DkdB%XoyZiVGfZS>qFQAX z&H@6Qsh1B3>ZxioFQxz#Ymj0C+o>^d$E3G0)_X~ZXIdaTN7$tIwipR*K|%PbnbwEx zVTJ0*gJTiuX^;M-w`hBieyu5EoJ)bYa9J)M57KUE@A?nX|z+u&0z0 z0>X<~U9~?ML_6tF0M8SLmz{>>&TN{!vtcTa1kwDF(OAZ&Kl_`bIrX&fknR;Ak2qPY z|MAlyVz~-SK}8txud?9&saG8_ zPJHeO$1ffb>TPhQj-XMWtF(OQ4-=#vg#0XAK@$k6V>{ej5*B~jTGo(;PA%y_^xpn! zioe_Lrc6FsCRpbF`5}&Ky|Xj(-58lxxTN#E!{cxq)$Zlp_V$b{F$9qG?VCRIMJO@( zmP!<-)bHuHh{SP$#ldk?nums}d8JnT;*(%4uEUKap?ttsSy=Iylp2VrfPF?N3BC2r zZbxZRK`wc}0;+rlf_{J!(U4=rB%VMRz0btqbK+R*pKlL*Sow(!$;m1*6NN!8q})E`_uqh?}UA{-f+c9@MPoPlf9S_ zsEH0IlhfV0kOXR&^u0pkkneoPrNm3=%XnL$(0qEoEn>$(wqMtDSM`D(OBMD+1n24` z3b*ny9E6$lAox?D=ybOyo>w7d$n2N&b&k*i)F z>mVv{2dB-#Gw{!JoThNMVO$>qK8U<3Fd|IkP zF)Hqckal?Wz+QrHT=*mZ?)kP+AWb@`jjC(;apGZFbb^gT)$jUl!KY&$2loh6ym70$ z+u%F?;pzrf`!}&q=^~C(ig@W&*vkqy85G8D!Ksdw7vC`@-Xk0 z6$?q}&$E$&chE#MyiR?Jt7osYyPv;BM1-&9l)i+DT=y={<{11GKtLkzWpVIe^fe^V z`DSH&&vtjUi6d%UwEe(5C;z0>^b}Nf8;}i+_x{^TB2Ab1Mnq!Y76lYSTtXR~#Mjx> zJ$)Y#7^910uuEha9$9=YXe23blvUCh<#v+X@1E+Jm`*VrVGnom8(2 z@cY%fD8Lmvu?~ENGf{_dro}BGK7xwtoZ_qs8+etq8hqi)_+Z#xUG1M?>hiQXNujx6 zx$Ocx5tZ|!rI3Xl_0Q$+6kT$aqiv+Ku!~a-)bdppW$Y-HdQsQD{_F;8eHuNgt$q>! zX3D@bP{|PBBZ02RM`!?cYCTZWu1NHC7VD8`%1x99U?#Qm8^1ypP3t2O1!D8)q8-U? zc>feof^n_-ND9iIG&A58n~*Ssg_GvA);Yeg>Kt=K2$g;X#Y}o16sQNI7;97^z=_t1)42Zw)?BMf3?_#sek|+bsmL!9(NYH|LkW zz(IhwviCvk;}^Aw7o2A6aTSC=NZ}3tzBeImOqF9n*u6|%!}|um0jz?$V9zJ;_4sH~9 zrs4L`TLq|Szq-iWI?w@;pK>6n`+yE)Kp%;6O^9Qz7RM`#t3cxLx9n{`pAg9B~qhSd!tj4Kf8k%-D?AEsffn z$nfx|ST4%1--0a1t^%8z?>v!V!k1f)x@x%230zK{kvrID NK}J=&QqnZ&e*oUYSwsK; literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_4.png b/test/compression/large_mode_4.png new file mode 100644 index 0000000000000000000000000000000000000000..df9f920ba5e37d6a4dbe1fd697e7a6a4ebc77a42 GIT binary patch literal 11311 zcmeHtRZ!f)*X3^*+#v*a2?TcyFu1z~4K4}62G>D@dywEkgIjPJ2=4Bd;O-E7^WX1b z_hlcxt$o~E)z#g%PTh05tGcTDR7a?*%3-0Cq5}Ycr64b@`LBlo00Mvt{x|X)Peug* z{BUpW_pX{|9@I`Qj@EYeR@AOuPFB=bo_5v%;JH+hZkM0L?Y6?^9{_t40!R$dHMZ8l`_YuZPw(|#)p&U{;ps`u@|vU zwyoP;4z>1xmz&359==pE*@};r#h*WzwsJUS?t&`ZHMf%9^ zZ!kn&P?b=!_b~n3;jZ?~*!yt47q=98?kDzS63IAo3c8LX^~-6z=)c_WxBBDAQk$dq zd>q>P3#;?_q0s&I#QpScWp&`I;_R-ER>11eLpYeRQ2BJ3`NNpU@0!jJSyg>(?7|KE zJ6oSb=h!rlKP@(3wYsmZ4-+bloJ;R|M6(p#HY11o7&-FPb{xs7i5@fZ-Pi9K{Mr9& z!FFTP*g0=F*L1-j8{Ib;?eX|){?g;0#t-7Eu2s382$zag?>;*b6zPWv7w3@oVz_tm zu{rv!SM3t5gnS^)5Y+M-UTNyW+u0?kTTrtvY#fi+R2)$IOFiWqpawT@ayR2j*@Kj% zMCxEr=4WX1%LX8`#KHZiKr9RnKJ4uZKc+GX-9E2v-cXV$J-);GIT4=7EH$+^k*hC6 zbhge(^Ny`gu~f!&rwh+>d=L51mzGaA$KQlg);Aw*<~^65sqKd{d=Zjgu_3n+8-910~Q;Lw*tx> z&vV>PG!CE1vV3M*9Cx2<90R6*ikiqMI0o~EmfFb^nYY@l=yC+xa;;i~ddyaK>QVYP zP|iX(+l=UI!o-r+MK(_kR}9rSd`5ODa-@|W>>hvBbXhc{*Esl9D1Gl?GJ9`k6i)@33tq5Myi`GBCc@|T~* zsu5B-j9ik3(VCYH9U=^kh5|YrjbC_DB}gNUtNxjg0rBULrrX zM|?kvpx(S6;-#R?Tu#ZVEmpg|hV%ZymT-m)4aAQPr!!%>}`UKQQJOeSRNZnjtdn^@=+%0nIY&Z5*ASyy`Hj-ToL7&2)|G;kg(kTR*X?>3E!3CLc`^TA}&+O)OucH{t57=Ziko4rsz6$vpP~Pb`jllql@Y zNuYygUg*WzMu`3UYS!%Mv4*wZCW%JZZhU9_kum-`Ki|j*{%QmrdxO=*@@Bn0f=ADA ze*rmHQyVmZ9^d(~EiC4g^4STGTtq?1CF*jV+&(LsW-u1z#o#^!!vn6;XnT5h_9~7g}G;8gq!CHKU0g`4_ z5vj0qk98HTD=1IEHr#J|Asqhaiz1E=Zy2FK%3(uOnobVxo+weR;L2KhtB%3XU!d|( zew~;L^ul`?;?VrA*9ga+H>Upmlg+u;Vf60_q8z{Qr%8T`GjAVNYksm9Bj6Jsg(wD& zY8fWzKO8>SITouU=*!^!;8*|hILB<-=k02CfppAD{&4^#qr89a{&5M-EsGba6r$7S zo>m}W3S|nuA~1zB=qQm1H|sVKY7Gb9){hflMd@#I+9oaRR};1%E*JMkc=LtGKe=17 z(MV!?kTZPhP*}l$#zyxF+fsB$f2Fc-+na1}p@7tlYG`00Ze{ZrO$>De+B=UOy;9JQvdwbxo@uQXXRJTvm2N zPFF%}4)WnGQm+$rj%?D{Z}sKQl_0NwY;$6Ip#4iT#+^M_a@AGlS&qd1S%rkoes+XK zrfJJm6gQ-oI5uX8;0RMH4c7bUv~}PnUd_}!ox6wimN65vpZQ0yU1T%EOFZUWuhSk= z*9hJai|zC`I)2tsSotZKqD$a?aHv@D8v@2a80OpKklfPBq^*N-_Hm z8xcKOCx95z)3VVz$LkDK&hq+6X$6W)k7~vVXg0mNFpUf@Bs9)6T}qLsPi@VfbRe(K z=pbP2`tjAX6JH{%>}L8mBBaUE;#|E(*M2$;G;UzA>mJUn8z=G1@atg2UD(Bml5r4S zDfJWE1R39QZW(QYy2x;Rfqp2af&>(MgS#5TOB8)s)h)048;+46<2+9{VXPOOgJ&P} zZJHU&*w7<`Jt+-1gN=uOk~q2tx&_0ThFj*ZMWbX}{Gvf5NoJv3LTAK(#dF0%t~5IU zcm}8!fkJpb`ZR5i8W3k{^VL5L30nxHYJXx1?p8)Vj0#7rxrlu7|`dY6*QF%Uow9husFlj_+s>JkhB}E z#tq66k`=5|w&ZarXJh3#;2)h_zRwSd9r}PEC!~fl1|Uop(CA?*=$1yLznhd9+Omg; zPGVWkR1X5tMVr&<(yU65`aXk@Z|+>osDf{a?SC_ET#LCj$e5C#^VSyc`7h$iz4hYq zR~9@kkjN;HB#0H2by2fvMy0Bw(A`b>!K4us8%BpFWsO4fUE52jDIwurg$JQ`<%m=;aA zf1;~o3W1=N+M@sO`=cCtcWzo4DnYgfW7#K1oOf?U z+g*-=NfLsY5d}~q65z!Ps^Cv(X7kL$pKH0UGRiH~gnJY|BlNB0uV$VrmAG17@XJK+ zkxkdbY$#gvj$=QA%(V(ZQh~uP7?n5Vc-Rdo27C#GB(Hd(HmtQ0%&#qoYJ~JM@cii{ zG314}l5;VwK|03g5}9Dy{?-R;%XmA30hLK~omYJ(#pmAU)m@mGSi>?g$GkG!ZSH}I z!%!UN`jo!t>aB%$Zv=kh5wqFGBug#S(Xds;kjrHEEEj=e_JS~JWK$V)gqX`v6*C^U zuFeq0higCljNp|G#?8M<-|hum+&vS9V(9Ozqkr35`ABKD;EYHl8oTg z+N2grB6m(vW|V{FB?_=T(H^mjh1gXB z$h!Y$y3i|IB#;xobx0mffY40LXv+frFdiR6SvbC!VpJ)fP?p&jc%@`s!%=udVZ9SV zSUbFx49J>e9Vu;J0JDP_silRPn2BsXlI(pH(gg4G&?tGdLL+48pVs6u8d>Ra8IX~B z&^b9k(+lgLvj&@>1Fg=U3A;-0zOxK4|0fgy>~jjg%q}DRZJ9ci3>r&}l;GDC==p}U zvVz^~U36h2L^Jdax(ACfFHLSkug8Pg@DY-|ov?`g^(KT1n8+vF3(~Ly>LV!$RQY3? zhKYYE^yElw)^HLlZI$4`o&9*6$h1kCXUZ{dA?X?u{#sjCj)TE%b6jNV)a89nU0=*V5Ctc=!*cbA6+7%3FLb~1XTr8zQh#vWy zkk2DN-EASa^2gSybBYX-M}JXmag{Eqqtm)Ctb36S$55qz%{kzP;dB35pw?Gm#-N0m z!={XV=uOJjeo!E}ewI8CB=AOmZ1x7#_@DiMQ+`*+Uo#amcd|&S;vJvQ(`FGr_KEG?cIP89^@sAo@ zsY~s3DfO%GC|GAZ?9AGw=B02G=8G@S))eXt*sSmF_MkaK)EW=JzXt?=(9rwL3;TdZ z9EioW8gB4oNeT;Z9xd97;{M%5ICgCU+b@9bwQP#;c`MCrDF!0i&%tyG$rr**b!&FK znv;cwyn4wtxvZS9KxDx^HTpzWR5q=NH}CRd{{o)?KtuL;5Q*L`z5gZ)?bKgf`u#U|nG9O(DLKadE@ZyXlzBPP zjP4c-pSp6V7Ka|v9<1>Sq-eu^v3B@wl3N?5Eng>a6?Imu&8ru5oqTSu(i&RjMw#!8 z7?L=0oZ%05M^Z_UH5`njh6VHH#bLaet|BM==_fg%{OUIfiL%Aq8y<(q(DWT$Do$G} zdfrehk`D#MpQ2KrayPsr(C|74F|0*adWR__uaYPTu88U9L{z}k_BF5gRUr>|Zq0rY z`5pmz0tKV|CK=HId)?EW-?hFr>i7#7GB57QgSYGo0AN5}SzG3xMMZ1?a6tiyD8Qf` zC@6m^=zWQrefgLF-y?a{y#6J);Kcl2^1qGO1gH&wx90z05%T#Dkzz8SnfV_&02e@g z3*ZU?KE1gAtN#BPk4lXCU-*A|%*z!|UQYfm^t`;h+}xa;-0bY!tc{+m)$i<-&z=O2 zp48W8&d%XC3011OkF6fJ!I%TuDwE2uGrj|2IK%lGld<06X1( z8pyLy-2Gn?#Z^H?24xq7jl}U*S*`sN00?Omq$RXHmyWZd+?NH%`mdQ&@)yJy4}`dn zkLL$ea(*B39`~tUJjd101BtoPiUpN*BCPQ%(0 z+LQd^j|XeDTfvW6fd3DwA5W$J1vie@bbK%H@fDy`{pI@gb-;`4lX!s96NxB9yx>Lg zzVqeDMjz*q_DOH*MdkhyBn`fK&!76Uu(GkSaoLRz#&QF%h^WSdUym*v?{Kq%;9Gbb z?uG;#qd$?m9sx(kEJP^SXnhRY5{+*o&ec(Y}`#y+XW4fY~@j9(SNtB zeg>z$W5L>(bFd?Y8`iNifL44fRS|7zdcZ4>ep#3kkZ`1?(4fx%e3>kxP6o6h{N0Zl zR{x0{UctB;2Bz-b3*teB&{%$2Ue>JJWglOeLxwy3#js}sde5{LBY}Zxc6d1J0~MlY zfKPu+SfkY_f_&1!DfYlaH?YKuI^{Ip#sNM%nW9#Li=WnkJ;RGENr8#MkWTyYYg!dB z?vc<**_*+KHUK1`FFvW_-q^Z&?C|_LQP`O8*bDaI?E_+!UbSA+Wy?GG?9cf^P$ioo z@rF&thK|R`Au+6MsUvcc@$a3M*YDk`l(rUe@(smh8@vZZ@ktoO=9ikwh$*aWQOq}L z`7H=JC3=9j2_sERkjAX>=<@P%{(Wohlhz!LnA+c~ep(|(6~8E41jwwK1KqY`LWXX` zBqbTssRMN@q8Mx(d)l`=s&al@^(j`Si*Es`vS8YOo+KwN6T7?EYk>_1wTl|lr;Y8D z+V|kgeEnCA@rL%)o{IULF|Ed#Lj8|UekQF)DIJ&R^Bju@5-q;B#D4{wg$(PJ`uz(gRWer*98ND-&Q-;m8v=t*6y(D@3vI^S+4)g85}cg1#z7I3 zxP}!F>4$m>|KiH2%{IyC(?T)W^ad0U z_3WhrNg^UC1pkilW z`PD++hNgkLe0(yMo>#g~e;jqg=3CzhL5%mbTM;244~(1)Y$ z&aW>Jm3>VQVTtdKvFnB19$W1o4Lkx%zq29Cbf6{2^Jh0yY78XJ^caKz+B)h?=|y#z zA1!3#u45zJK2q;~(EGuG8}_tLX&Qji1ZD+S2ly6{)%VVg29Uwz5Iv1R@CIKBV9uqe zlL?+bXLUaedWU?J19tkK=jYX;!s4G&$@JL|gc6)d_ZPRdKoEh1f%aG5(to%8_g+Zq zfnv0*D7n`)=U@Gw>#N21Ou+I~tcY-fxb8O;M6R%}D6rDfzdUs!u%Fp8tF^oyvlbVM zhJ&p-cB&|uAu;zu^;D0v_Bxq$D9naf%(e}P@l5D}pb^=w>mLM%_5?#nC5EHBC|Au# z5lJ+hc&M8Q2$q-4z`cnU~@(Q^gl>RgUnnBq7Mj7BC&-@x$6k z{$5&qod9S)!T{IH5{yo;=@y&h2TXVHf-F^XSIjkx2W1MoggG_0iu5lK9S)7V!Wore ziGoEAA0{8Y4NqO#1ToNsq7$&9$Cz)60+Lbupq8XuWLOJQ?p5IrA0*roxn_?=RVnTa ztTXu@$ml(AaO7l*&k3U)hyMM#yA}Q&G%@3GQO$xy4|@awu|T&F-WJjzIKun09)Ue^ zu0)NCb!1Ji@<$P1>v2^T;mAdLK*Oh)Y0L3P4jqgg&d5)tZIK`kDH-IpWwFkE+hE-Rb=og_wH+y&qSS`iAMtA8lmg+7-0$2T@#JhP|bTxL}O@y`hT zK}pWaN5r3XmcXvVulQGDBmoy3Zi(f7F&I510Xson!loP5oYa|$u! z@mw*}(&`l}dtubzMADRFOtyS8W)P&2yU|@;mE)p8;R9a~CT>VlxQ;eGDKH>n&w%`` zE&t@#G%GEqSmbv;zO&asrRzwns2C$16hEJVV{u4-+QK-Owkw4?-#ciEwElJ_Mrks! zx@bEc4j2M@chQKByys;K66Q%10<3ulY6rF>K%5H2A(5Hy@*HM(h`ouw#uK3MB-T=( zi!hdzE+FAw!mdTPr2-p8WC|2%>BFPZn27D^=Uc(uC&}76NB9*9NVQc_!7*->H!_t< zAn7P9Skh`P+-&hi0v!@7Qv{KNFlg4ue&5OtcxPfBob1B~mNy?ul}`x^fNI{|iiUfn=(y0z5n(JAe#Ux07$3zFwB;LU z6@W5}i(en|?S0Ayxc7T-HNFaL$TENcet8Lf!UQh%wme8ZF5fkVO0=h?3X@wA?va;} z0&VCrz`G=?!t>j)zX)_WM(Rz2W-NKG-)A&vR#tnn2KoXwZ9ekIzxh#LkB2gsV_fU)#qCo5y57KB{A!w^3iQ?>j&7uHCaha60+FM#Y#SFNLznyEroVA#Q5;DBM219a zn4P5A-Ah!=2#|eCtg)@rtr?NOgt@Y0Ai>(&RvjiWLR(rxXYV%6vO7p#ZT!S6m|sun_fh{-l^xyS$TCtZD*t_k*)RMtjqeT3O{rL zzE%T#F-plzIt<8H+ti>1@h4nCwXhpX`*pUL?H*hNlWU2N-m>iWWSJDxN}$7$ZRibo z=o+1K@dKn{Qad}Do>p{e{MN>@(2Kz(jikhXKN_F%)efPl!A zdxMLl=000`n_jQKhsBtrRr8e~#Mim{YqF34Pg$F^c=i}v)p^W6X#nzQgVwS1^dc;w z2Z^s~g31HO#DVUTG$c?q%bWe{tBI69y!dZpI>z4qCJ9s(lSf|S79DkK6xwM7-t!2kiJ+!OT_G}z@9B(=d1RFQM4$E$c-}TI_`OO% z$ZeTBNP4qR7nIGki{ql|X_saSB+6B3s6_xJj$vDjV08jRESNQva(dKcSc)>w&1ERW z^1-z_LyH|^2BJJC`1bXSDUr93BJlcJ1s#y>nyZXLC)z;EF03;Mot?*n*-6AOhA4gg z0|HF%0T?0xF*@z69^_`yS0L+}dnoa@ql2B_yzceANH|BO{Y%^-;Y)QB(N+o}gB zMG^}XAa;zVKq6`D+p7@q>{KkgYHZ4l-pHJGx z$toO}Aedy5ArJ%jAfJ```Z}Y9=u_;aFPQ?$&~UlcKPZaw2Hai44i}SRHS8hL)MyYs z{H?}iMl6^Zhw{}cSvoA1WJW+YeJWU;FHSL$(gQ{>aKFGvRK<6o=}o#5I# Q%$T zkjw;Ild6K@kuiOFU2(E+jNh=rj7g%AICZd@Y3F44E_}UwS*h4yVP+Skc^7+(YKot$ zr;QcV#l*T7G0-u52U(RDR9F8!2u)8990qb+DpY|-W^Ta%oFpwmd^%u74iYaizB#nl zbAV%F#CTO|iU}EZv7w#;7+Xpk|A1@tUl+~=YUg{EoVeLSbrvrhNzG&dvu%!gIlD1p z4VMutb>pVz-tzeJQ4CXP456j{S6e~_9t7<+!euM-eBp7DkdB%XoyZiVGfZS>qFQAX z&H@6Qsh1B3>ZxioFQxz#Ymj0C+o>^d$E3G0)_X~ZXIdaTN7$tIwipR*K|%PbnbwEx zVTJ0*gJTiuX^;M-w`hBieyu5EoJ)bYa9J)M57KUE@A?nX|z+u&0z0 z0>X<~U9~?ML_6tF0M8SLmz{>>&TN{!vtcTa1kwDF(OAZ&Kl_`bIrX&fknR;Ak2qPY z|MAlyVz~-SK}8txud?9&saG8_ zPJHeO$1ffb>TPhQj-XMWtF(OQ4-=#vg#0XAK@$k6V>{ej5*B~jTGo(;PA%y_^xpn! zioe_Lrc6FsCRpbF`5}&Ky|Xj(-58lxxTN#E!{cxq)$Zlp_V$b{F$9qG?VCRIMJO@( zmP!<-)bHuHh{SP$#ldk?nums}d8JnT;*(%4uEUKap?ttsSy=Iylp2VrfPF?N3BC2r zZbxZRK`wc}0;+rlf_{J!(U4=rB%VMRz0btqbK+R*pKlL*Sow(!$;m1*6NN!8q})E`_uqh?}UA{-f+c9@MPoPlf9S_ zsEH0IlhfV0kOXR&^u0pkkneoPrNm3=%XnL$(0qEoEn>$(wqMtDSM`D(OBMD+1n24` z3b*ny9E6$lAox?D=ybOyo>w7d$n2N&b&k*i)F z>mVv{2dB-#Gw{!JoThNMVO$>qK8U<3Fd|IkP zF)Hqckal?Wz+QrHT=*mZ?)kP+AWb@`jjC(;apGZFbb^gT)$jUl!KY&$2loh6ym70$ z+u%F?;pzrf`!}&q=^~C(ig@W&*vkqy85G8D!Ksdw7vC`@-Xk0 z6$?q}&$E$&chE#MyiR?Jt7osYyPv;BM1-&9l)i+DT=y={<{11GKtLkzWpVIe^fe^V z`DSH&&vtjUi6d%UwEe(5C;z0>^b}Nf8;}i+_x{^TB2Ab1Mnq!Y76lYSTtXR~#Mjx> zJ$)Y#7^910uuEha9$9=YXe23blvUCh<#v+X@1E+Jm`*VrVGnom8(2 z@cY%fD8Lmvu?~ENGf{_dro}BGK7xwtoZ_qs8+etq8hqi)_+Z#xUG1M?>hiQXNujx6 zx$Ocx5tZ|!rI3Xl_0Q$+6kT$aqiv+Ku!~a-)bdppW$Y-HdQsQD{_F;8eHuNgt$q>! zX3D@bP{|PBBZ02RM`!?cYCTZWu1NHC7VD8`%1x99U?#Qm8^1ypP3t2O1!D8)q8-U? zc>feof^n_-ND9iIG&A58n~*Ssg_GvA);Yeg>Kt=K2$g;X#Y}o16sQNI7;97^z=_t1)42Zw)?BMf3?_#sek|+bsmL!9(NYH|LkW zz(IhwviCvk;}^Aw7o2A6aTSC=NZ}3tzBeImOqF9n*u6|%!}|um0jz?$V9zJ;_4sH~9 zrs4L`TLq|Szq-iWI?w@;pK>6n`+yE)Kp%;6O^9Qz7RM`#t3cxLx9n{`pAg9B~qhSd!tj4Kf8k%-D?AEsffn z$nfx|ST4%1--0a1t^%8z?>v!V!k1f)x@x%230zK{kvrID NK}J=&QqnZ&e*oUYSwsK; literal 0 HcmV?d00001 diff --git a/test/compression/large_mode_5.png b/test/compression/large_mode_5.png new file mode 100644 index 0000000000000000000000000000000000000000..df9f920ba5e37d6a4dbe1fd697e7a6a4ebc77a42 GIT binary patch literal 11311 zcmeHtRZ!f)*X3^*+#v*a2?TcyFu1z~4K4}62G>D@dywEkgIjPJ2=4Bd;O-E7^WX1b z_hlcxt$o~E)z#g%PTh05tGcTDR7a?*%3-0Cq5}Ycr64b@`LBlo00Mvt{x|X)Peug* z{BUpW_pX{|9@I`Qj@EYeR@AOuPFB=bo_5v%;JH+hZkM0L?Y6?^9{_t40!R$dHMZ8l`_YuZPw(|#)p&U{;ps`u@|vU zwyoP;4z>1xmz&359==pE*@};r#h*WzwsJUS?t&`ZHMf%9^ zZ!kn&P?b=!_b~n3;jZ?~*!yt47q=98?kDzS63IAo3c8LX^~-6z=)c_WxBBDAQk$dq zd>q>P3#;?_q0s&I#QpScWp&`I;_R-ER>11eLpYeRQ2BJ3`NNpU@0!jJSyg>(?7|KE zJ6oSb=h!rlKP@(3wYsmZ4-+bloJ;R|M6(p#HY11o7&-FPb{xs7i5@fZ-Pi9K{Mr9& z!FFTP*g0=F*L1-j8{Ib;?eX|){?g;0#t-7Eu2s382$zag?>;*b6zPWv7w3@oVz_tm zu{rv!SM3t5gnS^)5Y+M-UTNyW+u0?kTTrtvY#fi+R2)$IOFiWqpawT@ayR2j*@Kj% zMCxEr=4WX1%LX8`#KHZiKr9RnKJ4uZKc+GX-9E2v-cXV$J-);GIT4=7EH$+^k*hC6 zbhge(^Ny`gu~f!&rwh+>d=L51mzGaA$KQlg);Aw*<~^65sqKd{d=Zjgu_3n+8-910~Q;Lw*tx> z&vV>PG!CE1vV3M*9Cx2<90R6*ikiqMI0o~EmfFb^nYY@l=yC+xa;;i~ddyaK>QVYP zP|iX(+l=UI!o-r+MK(_kR}9rSd`5ODa-@|W>>hvBbXhc{*Esl9D1Gl?GJ9`k6i)@33tq5Myi`GBCc@|T~* zsu5B-j9ik3(VCYH9U=^kh5|YrjbC_DB}gNUtNxjg0rBULrrX zM|?kvpx(S6;-#R?Tu#ZVEmpg|hV%ZymT-m)4aAQPr!!%>}`UKQQJOeSRNZnjtdn^@=+%0nIY&Z5*ASyy`Hj-ToL7&2)|G;kg(kTR*X?>3E!3CLc`^TA}&+O)OucH{t57=Ziko4rsz6$vpP~Pb`jllql@Y zNuYygUg*WzMu`3UYS!%Mv4*wZCW%JZZhU9_kum-`Ki|j*{%QmrdxO=*@@Bn0f=ADA ze*rmHQyVmZ9^d(~EiC4g^4STGTtq?1CF*jV+&(LsW-u1z#o#^!!vn6;XnT5h_9~7g}G;8gq!CHKU0g`4_ z5vj0qk98HTD=1IEHr#J|Asqhaiz1E=Zy2FK%3(uOnobVxo+weR;L2KhtB%3XU!d|( zew~;L^ul`?;?VrA*9ga+H>Upmlg+u;Vf60_q8z{Qr%8T`GjAVNYksm9Bj6Jsg(wD& zY8fWzKO8>SITouU=*!^!;8*|hILB<-=k02CfppAD{&4^#qr89a{&5M-EsGba6r$7S zo>m}W3S|nuA~1zB=qQm1H|sVKY7Gb9){hflMd@#I+9oaRR};1%E*JMkc=LtGKe=17 z(MV!?kTZPhP*}l$#zyxF+fsB$f2Fc-+na1}p@7tlYG`00Ze{ZrO$>De+B=UOy;9JQvdwbxo@uQXXRJTvm2N zPFF%}4)WnGQm+$rj%?D{Z}sKQl_0NwY;$6Ip#4iT#+^M_a@AGlS&qd1S%rkoes+XK zrfJJm6gQ-oI5uX8;0RMH4c7bUv~}PnUd_}!ox6wimN65vpZQ0yU1T%EOFZUWuhSk= z*9hJai|zC`I)2tsSotZKqD$a?aHv@D8v@2a80OpKklfPBq^*N-_Hm z8xcKOCx95z)3VVz$LkDK&hq+6X$6W)k7~vVXg0mNFpUf@Bs9)6T}qLsPi@VfbRe(K z=pbP2`tjAX6JH{%>}L8mBBaUE;#|E(*M2$;G;UzA>mJUn8z=G1@atg2UD(Bml5r4S zDfJWE1R39QZW(QYy2x;Rfqp2af&>(MgS#5TOB8)s)h)048;+46<2+9{VXPOOgJ&P} zZJHU&*w7<`Jt+-1gN=uOk~q2tx&_0ThFj*ZMWbX}{Gvf5NoJv3LTAK(#dF0%t~5IU zcm}8!fkJpb`ZR5i8W3k{^VL5L30nxHYJXx1?p8)Vj0#7rxrlu7|`dY6*QF%Uow9husFlj_+s>JkhB}E z#tq66k`=5|w&ZarXJh3#;2)h_zRwSd9r}PEC!~fl1|Uop(CA?*=$1yLznhd9+Omg; zPGVWkR1X5tMVr&<(yU65`aXk@Z|+>osDf{a?SC_ET#LCj$e5C#^VSyc`7h$iz4hYq zR~9@kkjN;HB#0H2by2fvMy0Bw(A`b>!K4us8%BpFWsO4fUE52jDIwurg$JQ`<%m=;aA zf1;~o3W1=N+M@sO`=cCtcWzo4DnYgfW7#K1oOf?U z+g*-=NfLsY5d}~q65z!Ps^Cv(X7kL$pKH0UGRiH~gnJY|BlNB0uV$VrmAG17@XJK+ zkxkdbY$#gvj$=QA%(V(ZQh~uP7?n5Vc-Rdo27C#GB(Hd(HmtQ0%&#qoYJ~JM@cii{ zG314}l5;VwK|03g5}9Dy{?-R;%XmA30hLK~omYJ(#pmAU)m@mGSi>?g$GkG!ZSH}I z!%!UN`jo!t>aB%$Zv=kh5wqFGBug#S(Xds;kjrHEEEj=e_JS~JWK$V)gqX`v6*C^U zuFeq0higCljNp|G#?8M<-|hum+&vS9V(9Ozqkr35`ABKD;EYHl8oTg z+N2grB6m(vW|V{FB?_=T(H^mjh1gXB z$h!Y$y3i|IB#;xobx0mffY40LXv+frFdiR6SvbC!VpJ)fP?p&jc%@`s!%=udVZ9SV zSUbFx49J>e9Vu;J0JDP_silRPn2BsXlI(pH(gg4G&?tGdLL+48pVs6u8d>Ra8IX~B z&^b9k(+lgLvj&@>1Fg=U3A;-0zOxK4|0fgy>~jjg%q}DRZJ9ci3>r&}l;GDC==p}U zvVz^~U36h2L^Jdax(ACfFHLSkug8Pg@DY-|ov?`g^(KT1n8+vF3(~Ly>LV!$RQY3? zhKYYE^yElw)^HLlZI$4`o&9*6$h1kCXUZ{dA?X?u{#sjCj)TE%b6jNV)a89nU0=*V5Ctc=!*cbA6+7%3FLb~1XTr8zQh#vWy zkk2DN-EASa^2gSybBYX-M}JXmag{Eqqtm)Ctb36S$55qz%{kzP;dB35pw?Gm#-N0m z!={XV=uOJjeo!E}ewI8CB=AOmZ1x7#_@DiMQ+`*+Uo#amcd|&S;vJvQ(`FGr_KEG?cIP89^@sAo@ zsY~s3DfO%GC|GAZ?9AGw=B02G=8G@S))eXt*sSmF_MkaK)EW=JzXt?=(9rwL3;TdZ z9EioW8gB4oNeT;Z9xd97;{M%5ICgCU+b@9bwQP#;c`MCrDF!0i&%tyG$rr**b!&FK znv;cwyn4wtxvZS9KxDx^HTpzWR5q=NH}CRd{{o)?KtuL;5Q*L`z5gZ)?bKgf`u#U|nG9O(DLKadE@ZyXlzBPP zjP4c-pSp6V7Ka|v9<1>Sq-eu^v3B@wl3N?5Eng>a6?Imu&8ru5oqTSu(i&RjMw#!8 z7?L=0oZ%05M^Z_UH5`njh6VHH#bLaet|BM==_fg%{OUIfiL%Aq8y<(q(DWT$Do$G} zdfrehk`D#MpQ2KrayPsr(C|74F|0*adWR__uaYPTu88U9L{z}k_BF5gRUr>|Zq0rY z`5pmz0tKV|CK=HId)?EW-?hFr>i7#7GB57QgSYGo0AN5}SzG3xMMZ1?a6tiyD8Qf` zC@6m^=zWQrefgLF-y?a{y#6J);Kcl2^1qGO1gH&wx90z05%T#Dkzz8SnfV_&02e@g z3*ZU?KE1gAtN#BPk4lXCU-*A|%*z!|UQYfm^t`;h+}xa;-0bY!tc{+m)$i<-&z=O2 zp48W8&d%XC3011OkF6fJ!I%TuDwE2uGrj|2IK%lGld<06X1( z8pyLy-2Gn?#Z^H?24xq7jl}U*S*`sN00?Omq$RXHmyWZd+?NH%`mdQ&@)yJy4}`dn zkLL$ea(*B39`~tUJjd101BtoPiUpN*BCPQ%(0 z+LQd^j|XeDTfvW6fd3DwA5W$J1vie@bbK%H@fDy`{pI@gb-;`4lX!s96NxB9yx>Lg zzVqeDMjz*q_DOH*MdkhyBn`fK&!76Uu(GkSaoLRz#&QF%h^WSdUym*v?{Kq%;9Gbb z?uG;#qd$?m9sx(kEJP^SXnhRY5{+*o&ec(Y}`#y+XW4fY~@j9(SNtB zeg>z$W5L>(bFd?Y8`iNifL44fRS|7zdcZ4>ep#3kkZ`1?(4fx%e3>kxP6o6h{N0Zl zR{x0{UctB;2Bz-b3*teB&{%$2Ue>JJWglOeLxwy3#js}sde5{LBY}Zxc6d1J0~MlY zfKPu+SfkY_f_&1!DfYlaH?YKuI^{Ip#sNM%nW9#Li=WnkJ;RGENr8#MkWTyYYg!dB z?vc<**_*+KHUK1`FFvW_-q^Z&?C|_LQP`O8*bDaI?E_+!UbSA+Wy?GG?9cf^P$ioo z@rF&thK|R`Au+6MsUvcc@$a3M*YDk`l(rUe@(smh8@vZZ@ktoO=9ikwh$*aWQOq}L z`7H=JC3=9j2_sERkjAX>=<@P%{(Wohlhz!LnA+c~ep(|(6~8E41jwwK1KqY`LWXX` zBqbTssRMN@q8Mx(d)l`=s&al@^(j`Si*Es`vS8YOo+KwN6T7?EYk>_1wTl|lr;Y8D z+V|kgeEnCA@rL%)o{IULF|Ed#Lj8|UekQF)DIJ&R^Bju@5-q;B#D4{wg$(PJ`uz(gRWer*98ND-&Q-;m8v=t*6y(D@3vI^S+4)g85}cg1#z7I3 zxP}!F>4$m>|KiH2%{IyC(?T)W^ad0U z_3WhrNg^UC1pkilW z`PD++hNgkLe0(yMo>#g~e;jqg=3CzhL5%mbTM;244~(1)Y$ z&aW>Jm3>VQVTtdKvFnB19$W1o4Lkx%zq29Cbf6{2^Jh0yY78XJ^caKz+B)h?=|y#z zA1!3#u45zJK2q;~(EGuG8}_tLX&Qji1ZD+S2ly6{)%VVg29Uwz5Iv1R@CIKBV9uqe zlL?+bXLUaedWU?J19tkK=jYX;!s4G&$@JL|gc6)d_ZPRdKoEh1f%aG5(to%8_g+Zq zfnv0*D7n`)=U@Gw>#N21Ou+I~tcY-fxb8O;M6R%}D6rDfzdUs!u%Fp8tF^oyvlbVM zhJ&p-cB&|uAu;zu^;D0v_Bxq$D9naf%(e}P@l5D}pb^=w>mLM%_5?#nC5EHBC|Au# z5lJ+hc&M8Q2$q-4z`cnU~@(Q^gl>RgUnnBq7Mj7BC&-@x$6k z{$5&qod9S)!T{IH5{yo;=@y&h2TXVHf-F^XSIjkx2W1MoggG_0iu5lK9S)7V!Wore ziGoEAA0{8Y4NqO#1ToNsq7$&9$Cz)60+Lbupq8XuWLOJQ?p5IrA0*roxn_?=RVnTa ztTXu@$ml(AaO7l*&k3U)hyMM#yA}Q&G%@3GQO$xy4|@awu|T&F-WJjzIKun09)Ue^ zu0)NCb!1Ji@<$P1>v2^T;mAdLK*Oh)Y0L3P4jqgg&d5)tZIK`kDH-IpWwFkE+hE-Rb=og_wH+y&qSS`iAMtA8lmg+7-0$2T@#JhP|bTxL}O@y`hT zK}pWaN5r3XmcXvVulQGDBmoy3Zi(f7F&I510Xson!loP5oYa|$u! z@mw*}(&`l}dtubzMADRFOtyS8W)P&2yU|@;mE)p8;R9a~CT>VlxQ;eGDKH>n&w%`` zE&t@#G%GEqSmbv;zO&asrRzwns2C$16hEJVV{u4-+QK-Owkw4?-#ciEwElJ_Mrks! zx@bEc4j2M@chQKByys;K66Q%10<3ulY6rF>K%5H2A(5Hy@*HM(h`ouw#uK3MB-T=( zi!hdzE+FAw!mdTPr2-p8WC|2%>BFPZn27D^=Uc(uC&}76NB9*9NVQc_!7*->H!_t< zAn7P9Skh`P+-&hi0v!@7Qv{KNFlg4ue&5OtcxPfBob1B~mNy?ul}`x^fNI{|iiUfn=(y0z5n(JAe#Ux07$3zFwB;LU z6@W5}i(en|?S0Ayxc7T-HNFaL$TENcet8Lf!UQh%wme8ZF5fkVO0=h?3X@wA?va;} z0&VCrz`G=?!t>j)zX)_WM(Rz2W-NKG-)A&vR#tnn2KoXwZ9ekIzxh#LkB2gsV_fU)#qCo5y57KB{A!w^3iQ?>j&7uHCaha60+FM#Y#SFNLznyEroVA#Q5;DBM219a zn4P5A-Ah!=2#|eCtg)@rtr?NOgt@Y0Ai>(&RvjiWLR(rxXYV%6vO7p#ZT!S6m|sun_fh{-l^xyS$TCtZD*t_k*)RMtjqeT3O{rL zzE%T#F-plzIt<8H+ti>1@h4nCwXhpX`*pUL?H*hNlWU2N-m>iWWSJDxN}$7$ZRibo z=o+1K@dKn{Qad}Do>p{e{MN>@(2Kz(jikhXKN_F%)efPl!A zdxMLl=000`n_jQKhsBtrRr8e~#Mim{YqF34Pg$F^c=i}v)p^W6X#nzQgVwS1^dc;w z2Z^s~g31HO#DVUTG$c?q%bWe{tBI69y!dZpI>z4qCJ9s(lSf|S79DkK6xwM7-t!2kiJ+!OT_G}z@9B(=d1RFQM4$E$c-}TI_`OO% z$ZeTBNP4qR7nIGki{ql|X_saSB+6B3s6_xJj$vDjV08jRESNQva(dKcSc)>w&1ERW z^1-z_LyH|^2BJJC`1bXSDUr93BJlcJ1s#y>nyZXLC)z;EF03;Mot?*n*-6AOhA4gg z0|HF%0T?0xF*@z69^_`yS0L+}dnoa@ql2B_yzceANH|BO{Y%^-;Y)QB(N+o}gB zMG^}XAa;zVKq6`D+p7@q>{KkgYHZ4l-pHJGx z$toO}Aedy5ArJ%jAfJ```Z}Y9=u_;aFPQ?$&~UlcKPZaw2Hai44i}SRHS8hL)MyYs z{H?}iMl6^Zhw{}cSvoA1WJW+YeJWU;FHSL$(gQ{>aKFGvRK<6o=}o#5I# Q%$T zkjw;Ild6K@kuiOFU2(E+jNh=rj7g%AICZd@Y3F44E_}UwS*h4yVP+Skc^7+(YKot$ zr;QcV#l*T7G0-u52U(RDR9F8!2u)8990qb+DpY|-W^Ta%oFpwmd^%u74iYaizB#nl zbAV%F#CTO|iU}EZv7w#;7+Xpk|A1@tUl+~=YUg{EoVeLSbrvrhNzG&dvu%!gIlD1p z4VMutb>pVz-tzeJQ4CXP456j{S6e~_9t7<+!euM-eBp7DkdB%XoyZiVGfZS>qFQAX z&H@6Qsh1B3>ZxioFQxz#Ymj0C+o>^d$E3G0)_X~ZXIdaTN7$tIwipR*K|%PbnbwEx zVTJ0*gJTiuX^;M-w`hBieyu5EoJ)bYa9J)M57KUE@A?nX|z+u&0z0 z0>X<~U9~?ML_6tF0M8SLmz{>>&TN{!vtcTa1kwDF(OAZ&Kl_`bIrX&fknR;Ak2qPY z|MAlyVz~-SK}8txud?9&saG8_ zPJHeO$1ffb>TPhQj-XMWtF(OQ4-=#vg#0XAK@$k6V>{ej5*B~jTGo(;PA%y_^xpn! zioe_Lrc6FsCRpbF`5}&Ky|Xj(-58lxxTN#E!{cxq)$Zlp_V$b{F$9qG?VCRIMJO@( zmP!<-)bHuHh{SP$#ldk?nums}d8JnT;*(%4uEUKap?ttsSy=Iylp2VrfPF?N3BC2r zZbxZRK`wc}0;+rlf_{J!(U4=rB%VMRz0btqbK+R*pKlL*Sow(!$;m1*6NN!8q})E`_uqh?}UA{-f+c9@MPoPlf9S_ zsEH0IlhfV0kOXR&^u0pkkneoPrNm3=%XnL$(0qEoEn>$(wqMtDSM`D(OBMD+1n24` z3b*ny9E6$lAox?D=ybOyo>w7d$n2N&b&k*i)F z>mVv{2dB-#Gw{!JoThNMVO$>qK8U<3Fd|IkP zF)Hqckal?Wz+QrHT=*mZ?)kP+AWb@`jjC(;apGZFbb^gT)$jUl!KY&$2loh6ym70$ z+u%F?;pzrf`!}&q=^~C(ig@W&*vkqy85G8D!Ksdw7vC`@-Xk0 z6$?q}&$E$&chE#MyiR?Jt7osYyPv;BM1-&9l)i+DT=y={<{11GKtLkzWpVIe^fe^V z`DSH&&vtjUi6d%UwEe(5C;z0>^b}Nf8;}i+_x{^TB2Ab1Mnq!Y76lYSTtXR~#Mjx> zJ$)Y#7^910uuEha9$9=YXe23blvUCh<#v+X@1E+Jm`*VrVGnom8(2 z@cY%fD8Lmvu?~ENGf{_dro}BGK7xwtoZ_qs8+etq8hqi)_+Z#xUG1M?>hiQXNujx6 zx$Ocx5tZ|!rI3Xl_0Q$+6kT$aqiv+Ku!~a-)bdppW$Y-HdQsQD{_F;8eHuNgt$q>! zX3D@bP{|PBBZ02RM`!?cYCTZWu1NHC7VD8`%1x99U?#Qm8^1ypP3t2O1!D8)q8-U? zc>feof^n_-ND9iIG&A58n~*Ssg_GvA);Yeg>Kt=K2$g;X#Y}o16sQNI7;97^z=_t1)42Zw)?BMf3?_#sek|+bsmL!9(NYH|LkW zz(IhwviCvk;}^Aw7o2A6aTSC=NZ}3tzBeImOqF9n*u6|%!}|um0jz?$V9zJ;_4sH~9 zrs4L`TLq|Szq-iWI?w@;pK>6n`+yE)Kp%;6O^9Qz7RM`#t3cxLx9n{`pAg9B~qhSd!tj4Kf8k%-D?AEsffn z$nfx|ST4%1--0a1t^%8z?>v!V!k1f)x@x%230zK{kvrID NK}J=&QqnZ&e*oUYSwsK; literal 0 HcmV?d00001 diff --git a/test/compression/ledian.png b/test/compression/ledian.png new file mode 100644 index 0000000000000000000000000000000000000000..f5fa8dec90e3fc79a55a4f341a87262220fa3313 GIT binary patch literal 1325 zcmV+|1=9M7P)!e1`1tq$YTmT8w4{3g&9pi8=5y86)lg7SN$_JA00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-~w2L=WZnqr63000D#Nkl{Ev_r70NDj(gYRky4gTL8n_ zECZyvQAQ(H^@B`d0Rkyj{sf5tDXkE%Qzwxr25^PC2GmPm5-Pi{3&38M0@Y{k3t-GE ztxwY;@fPps-DPwddr897k@P!p()Pq)w(&$dgy6ZvbtdZ@w&YIj0qj)_WdE;h>pN%rx zu1`3hw?N9)O`VQI9`Lib83_ayc1yzE1@yZz+Q$k}bW2|q0NR|l*YE*Az4d+uX!6b( zSP5X%UWt3i1NOp50b-eca}Ej+cM_5kcR(!E{W-m4nNMRUB~gN;Vi^-}$1d0_>%Mn?N1Bs~Xr#1(;Ii z#e)=pQdZS$p$@w~r3YUnlNfI%$W`(H^&SCQbpGSt(=%D4#fP)D4bc8Pv|0&}jN(U$ zZN>zZ|F4h!+PaCxzs)Ba`R9P1w+r}tG|@*nU(;|AXKZQ_`rs&MohiUl6B!(N!%0Da zG9HazcfGN6^1yBac(K43r%1j>2hd2Jf8gO5y2!ubGpHxduQL=NBnRv!@g)U-h+toh zP`hY_jGdlLYhCmk`{xJcG{(S$O@EvrV08Grt&DPjfs6Xbr%PJvq9-msQwA{-afQQE zwEk{$&P5KWz?3xD;cQlO#wI7CtpeR7;T*nRA`r$?Spld!Vv`zr|MHD9mZtEPx6qHg zCv4ha)AOYa$I=2*1-_BZPvbVdeuKb`WeKH%ekH@7l8p6*4C`MTARaU$L$uHYzKuiB zoxEUO!wmLKp3%^xeEI_>l;`iH!KRk6uVFV;3CuV&k{8y&#BySn%mNw`b^81+gnA!v zl43U%N6`#|h7IV9x4k~?wbvcRQ7Sv!7sT32oR@+nY!$$#G6lru9`$?Zt%0u!a2tRm zz%6EU{EMi-!cGH56vaYqr`jk4H0+fh zf9X_9tWjIdvH$5LDz-)w1s*?=imfs3|CV7m91b@E7>ikN1E4c(&~zg}X_@suhU;wr jW(c}D8)yLk(QNPsl;GvUmI!Ie00000NkvXXu0mjfo4Q-S literal 0 HcmV?d00001 diff --git a/test/compression/medium_mode_0.png b/test/compression/medium_mode_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4ba289c9ff05721564ce248af8247db9812f45 GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^4j{||BpAFt9cBhn@}4e^As(H{Kl~XCdbA`$4OS(D k99+>9$hw%zO>_Yh!`Fl#S=aKIr-HP2y85}Sb4q9e0AKAFaR2}S literal 0 HcmV?d00001 diff --git a/test/compression/medium_mode_1.png b/test/compression/medium_mode_1.png new file mode 100644 index 0000000000000000000000000000000000000000..87d5d41ea55918f902fd78c45ef25ca9d7d52814 GIT binary patch literal 997 zcmVUAEW0<2G*3p@OIhGS40~Yck z>cV<1Bq+gXyqdAF)x&k)g-@+Ye7T%944K*6&pE&J?88uGC7J-}thyH?aK$h#00J~z z1PiDOQI~cvmoQZpuY)10gxaAj$7f^!2F5WIXT@>%`38z97%fa6LHpzC5lb9M7JST1 zbT(j<&~WQyiWX$=$E%I@s}cD$r{v~Fy1GMHiSBypF%C8rolv4P`1~4LOm;L9z#|v$ zfJr>aE;0?fQEKX$f`IhVKmt35#}9GgUWyxaGZoQT##BY^WYuqSt8Th-ayCfF7}KE> za$=$ocal-2bK(0M=5$h%1HyWwgynsQ2*rJAA|!hUc_dMr+;yR$HavMcNwr(6uB|Pk=Bv5MP$PWSE-&ID1 zZuZeNg{=De{{HRZRt@H1%L$tvKLBXjE<^;zJ?KiC1MJ&6sJ&sz8P!yB(b!ES=up&X=Y8FxzG|7u!RpfSuF7}wJYskb{ryhv7KFy?C?xtu(`)Em3zh3GlnT0!`HQkEJd&B44 zviiSDP0yyoS;`6EWtZ^1uy~neNqC-*u{{&ryz0|Qbn%hd+oo`w^2ude&-7oZx?5N5 zQtVNZvACmsTZ45*xBpmd>eZnl)L22nY`*#MDe~pEBC!0{;QM0zeaTUhWJIa_&Kbfm zw?BwS&dHQxbv8|^RtXBM%LwS1)CSHWV{1fjo1A$$p*&+gu%OKyM1AyaQO3jJ8o~MM zdyP(m&uui_Jm}4|l_)te(@*m8Jo4%-X(6xyKL{-O|3B#ee}?}{82$$_{0EDdt=pN)z`)4h>EamT(fRiBM!qHk0k(v= zM&96GX8UH`7JU4`?eLSdf~3iF`1+3M<*8jN-{^3JNpzjjE8UhU|95MPoWH*H%2VOf zudmDhaBNsz*|6u#tOmte?ysBo3PsQ7X=#0NoH=8iih@qk3%)7lZ#x|-dKs-gN=!P# zSixbypk|^TS807gcV;uA!CKe%HjDwG$HfvXT|Cot{F%5Ic@h+@K4vVAUE z1Fr9-F&)ePCNv8(IR8Dg%4^l+j++Mdd?%D2Fn(0I>N}q;v$LORPm8J7%2~Tl6)^vh zU6-EfKat_ajdV38#+q3(*|yl-@NS%I;9=a4MxSM_#4!3TsvOb`#ky} PC{R3I{an^LB{Ts5?}d~2 literal 0 HcmV?d00001 diff --git a/test/compression/medium_mode_3.png b/test/compression/medium_mode_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f5871b4d0ce20d34d09a0762343d5a3675d1b1 GIT binary patch literal 800 zcmV+*1K<3KP)y^h*I5FTrr#Zbg@W099Qi^9fF1#*E8rPz}T*5nGL6mfhh98qAL6jw$H z1*dBe;h{2%jd#6=lmkUcMzY!YJpVJh3&3BaK;wy>*Q?N5NQnT_nQKRiSh+^vwgJo_ zhh69;(ozYX-7LyMA^v%nseJMPNhM(1)I8JzMBpEg={zZnuIAR<+g_2l?{Wlj{ zGuLQuuJ8sr9I8>qb0CfyRe>Xys1hQA)|_iZ>feiph+V3137IdDT;q)whlMWD&?Mra z$AnQ#l1B5`vM1{Kfn^-VmZugP%5)jE=EDopXaurO#Co@$Rgs9-I9R!(Y$l_zCOm{- zBn=F(!PJ&Ol49S;MDkxmMDC5$=rCbOF>$2X75kkvVf|jVZJoZ+KD&6XsTP5Vx_O!u zvGuU^cKsW=!}8McG;aXcX0Won*gHb_BC}}`TfW;m9e5a8?c;(kEw9?Xb-fP7KI8B8t<8eGq*$(}_(C?F) z*m?MBqE}dTbcHL2fwprbKKE?^+(zG#v&3xno_!9V0JZ{PK-kX%cUXPwi_m+U!;Y(F z9^uKCfb||htuYnJB@cuTE-eHGKPu%7A_~4!MW2cN0ero88K#!L)C53xAr} e8CTs`y7~n)s=7`)G9(B90000y^h*I5FTrr#Zbg@W099Qi^9fF1#*E8rPz}T*5nGL6mfhh98qAL6jw$H z1*dBe;h{2%jd#6=lmkUcMzY!YJpVJh3&3BaK;wy>*Q?N5NQnT_nQKRiSh+^vwgJo_ zhh69;(ozYX-7LyMA^v%nseJMPNhM(1)I8JzMBpEg={zZnuIAR<+g_2l?{Wlj{ zGuLQuuJ8sr9I8>qb0CfyRe>Xys1hQA)|_iZ>feiph+V3137IdDT;q)whlMWD&?Mra z$AnQ#l1B5`vM1{Kfn^-VmZugP%5)jE=EDopXaurO#Co@$Rgs9-I9R!(Y$l_zCOm{- zBn=F(!PJ&Ol49S;MDkxmMDC5$=rCbOF>$2X75kkvVf|jVZJoZ+KD&6XsTP5Vx_O!u zvGuU^cKsW=!}8McG;aXcX0Won*gHb_BC}}`TfW;m9e5a8?c;(kEw9?Xb-fP7KI8B8t<8eGq*$(}_(C?F) z*m?MBqE}dTbcHL2fwprbKKE?^+(zG#v&3xno_!9V0JZ{PK-kX%cUXPwi_m+U!;Y(F z9^uKCfb||htuYnJB@cuTE-eHGKPu%7A_~4!MW2cN0ero88K#!L)C53xAr} e8CTs`y7~n)s=7`)G9(B900005?GP)!-)q}e6vxF9$H80w2`}9q_LeL6p-CXj$2Qn26yhrdw*}MKQXf_*sjVwI z2BmDZ{)~W<1&%W)B%xrXu!n?#>pacvL#q3~>|Dt|q;xRYL)q?&{r&jp=;)rW&y}YA z>m{s|%nHwHCiJp!UzX<~%RS+G5A|)&n*dJ;_XR8QZSgz?T!@!N{ebhHcoJQ4!QB=N z1qc)D2q13&2w;^iyQM(y85el;%lG*ehcR`H5Qh#kVKu)}mhV+Dm9DwNBoyj;`S_D|(-nx7{46q)9oX^(Yi~#VUUVRl+Dt(40KnweE z={K%!<38yszM4KSA_jne%=aTlC;A+xZnP+Lj%GtPl^&jZ^NdeiP?ivYnN{ zz}IcI`mL(~H+~xQxg}Zv>=EhAgK-0o3*4%gxS_Hx%CLk?=hR&y1Rlt9U^?8F=S98E zn*>5ephUb#UZo`UKUq+Ostkd#TM_Vs;H1;M#3}rZK;1nF;=yxf@22S>;erGf!J)8s(2q}Pcf4ZY`grxg3 z2Wnpp@iM6+Q>L^cf7i>;vpmmBOCe@<&{V_S9#q^p`QoPV0JuBVf-JLL_V{FgWCb@l z@0#M**dLncLaAGUlHs;GQNS}_2SZSbN9D+^*(w3kX#xIbbt(z~xxs8vdkouYsSv38 z1@aH_GT0rVK<(_U)d3DIC_8E_!I}KPZN^~-;70|H*CiM`jMaSxmmd^hG#PvX=&wr! zzGQkaK*o3jK{g5Gj%g?bKC(Iu5d}2tUrI?ag*wDD1@TNu7%;XG#vP}5@@5Plk2mDI zc}t--z@u7IN@Hsn}%i95C*%Q4_x z?UR+;(&beO1nkZr6@tN9y7u`vckJ{JOOBO3pIe95Lbh&8@o5!W_OYbHDe+78=P^|G zlh=Y?3jj80>x^aud^YHx6sc2I*O-(}N1)mu+vagdZcmH$-Dx`_bz93i>{PD3N<>R9 z>reIf39wl8LB<;rXIRj&@NqBFBCb!TH?jyg7DPE0YLgv8sKggdbPo5O)Ef*`?M}&< a$-e*(!xIx7ie?-D0000zi%5i z6vxjpwJCrtYiNf6GVcsmmkzehi6_x6q;V{N_3mTb^L}=0}9k{%hurs7+};kdE9lS(>=+8;h^A%R}cB=_(CW zC@dS+R%+rp79aGvd)XY1>wypxmT8`6U!A&tSXP%^_1#N?F$v@YobRY~zjo@BEQ_%r zz3c7~QV-@p?G^hkYxVtt)%}~XtNn2bp^Jc^uxk%CxleN@h$Z`8&mJIHmplOz2~1j~ zawjXLKK2B|xB%?Z>9tM%vN~^>OXKwfC{_9Aw=ShWyI0Shc&V6ufTTNY_$PNo`|d^D zMRuA_=6Lo4=RGw$VM8Z_&|SB3A{LB!GWgm9r}-X1wKf@fJ0XI_dpyLWYeN-7ksacv zv)SJFmcT{A+HA~|HxLLwr+4UU^QK5ZpFeA5~Mg0VKo zH{K3-6|^yw(HC#(Vk`*cLn9C^q1;L!%LBEehX^FH9(HryI~^d9$oe+Ni7WZap`FNj1oG`WpFl#Ve?h5rzda?8cQXQ!@}VRZ zIZyP11hOn!q3TlUr$`SHNTF3Wf{FxxrY`uK<`amUdtsJZp*TkPDF+OnKwOh5gb_$Dw0RAipamyZ2N4Uos~U^_j|%LKh0A1mazt zEvUIUftVa8`l9FGClG+@RMh(e1Tq#??QH}y1Iqu8K*WFn<^)o0ekJHNiB0Si$ODpV z#|61o?NIkij0yxLy5a8(WJPd~W>4{}Ir%ve5y*o%R(vD`j1WI43x4Ht_6u=48Xcl`gP-N*Qqv-BqGzC!sG4jx@38SHHkPrDdNK~5-lSnH0 z-w5n~Adt5JMKYWQ0|BH#Cqqlc!9EWyA`Y>+WN-T39gig`%8}EdPk!Q=y8G$9cX#g{ zWf-53FR5YBSU=H`-ZNr#{6xHVL}{cnbz4aW@Y~U7KpCTywSwkXuh!R<)|>q(dapEG z|9*Y_YLmTzZu0XSAbQWDXvCr)a{$iYD;)yh>T#csIp?$hFgl7DAQ%FySYFlJ>L%(N zxPd$b@CN*o1DuQ)V!Slg2na(XXF;n^m3ed&G^v*R85bzkfGOueZfSMc5v9%7 zl#bYte$8Te4K5@SvNv7fAy+$ksz8df58`mZ?F7UKh4&>jMELF|kjO5G{ihkz~LvizqxfWHOPC;=@#cAjSU z0yq_m2vWPI-WpSSrW9_&G!F1KmzHDzfYsmQZ`+9gK!`J?VSOmqAdcr#$JxnRFpJJb zg!*&%@TO^5N;81Yke+b07r-9+Gy`yF{ES0CE)YNnxrS=ian525J7dp{0aNNxFJ}P& zI4T0P2WBP)0HE#(AK>^RfZR$EzrcktEI;Z70z);O11u4Pv0R7_#=1KX5KF{B1fBx; zVji$e3}74i0C0R!1Xv;lun`3;l&&ZOEQo>f3pEA^u>#(SI~T>^nvMa17(j|p8YF;f z0l=d=20w-Ar5s0HYUdAibHy}G+s*?VK7%z5>N%+$SoeM09ZC~GwOTCzP+iULrK;Dj zS5ob6Y}OZ$C~W&q7Le|E#Z!v~F6f(12gZc}LtF02L4|;%s8%W!H1*PeTHM0!`kJ1{ zYHNHttGc0KJQmXyydH?aFdl7ubDxmf51Vz_ZRJKTnO+*OxfFm>2|yQ80Ad&f0p@p~ zX+iX%5}^xGAz=v%u+pql;BCYFJPRa%;QN0DY!vvgETHn)07n6CsH&S8J255`09XjH z<^ZIOfLkO6Y|a7Jq+|i-xR^~AfOD0jmP25exuwmfZtvz>MUuUHeRnROsH z0;Fm9W(2@>TLK8bt^wKtC8paE*Y2V$mOxJ8si-B6v5 zcf)OCf#?JD?f9Ajh;FDF-Tw<B6YLGL zLDGZb7?aonc&bu>+Cc)?1CaoLhj#wtaTGuE%>jDz0B|p~(aSU-o}Arf0EHHWdwVaQ z?d@FzP=Uc1KuWih1+p|Co<*0lfAp%3{F&{)^}P`x4;M)Asb-4LzCy+%KP_ zgc?9f*=Y=Wy_e5=JqdVJK6huQ?eJ0g?p*+=mH4o%Ru#_m^Miwz2*4-yA+&K#XbZ5Q zJ}F0FK|6d>e)q1{YiJh~07HoY3}OZlPb1z3)7vxH3m&y?04NLey2eOCuwG!tUp{{P zIE1zY00_Vm0Gmkya5LTMZD#>!0X(g5VMlBap*;`4PhtSg0k8vnP?tX%fXzc_o0e(i zESTTU8laN|c0~V&(3XHy3@+DCjWoSn=b>4~>Wq4_4gx&~N}K1p({cIvxhHetWt&hD5Z!oo2{&$U(r> zTv41O`ljcBQ$@b{f*+auq_h|GtlYdOTnF!7>$rC5z{*Xs0Yc)!QMZ|&c>3B4 zuAjx`bbG(@lOsY|m+Dy=SX(YIs&eiSsnR K&t;ucLK6Vv(UCv^ literal 0 HcmV?d00001 diff --git a/test/compression/small_bubbles.png b/test/compression/small_bubbles.png new file mode 100644 index 0000000000000000000000000000000000000000..9547b39faf1ace4a8b71b25a8dd8655c1b7c56a5 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<6!VDx?zobtBQU(D&A+A|dx|5>*7iazNZvMYy z&i^f2{+~Vj|Jk$uKmb$%2XOICOSR7eMY}v*9780gmQJwcJ8ZzwI&ngkoXYCW#q8Is zr=79QN%Ir5jCL_h*xEa3`w!!KerW~;RRdK)Wf4)$Cw!_*MHj?39j@Zu<7Vi7eIbMY z-fTDZOJu%klyLbN4K|s2lR>QP`fnVY}jzD;`&uS9P2bJNviz lmlEI7<+oBaW8%JC|HoM9Rz5!{FzpD)t)8xaF6*2UngGD~X<+~W literal 0 HcmV?d00001 diff --git a/test/compression/small_mode_0.png b/test/compression/small_mode_0.png new file mode 100644 index 0000000000000000000000000000000000000000..15cffcc857e8dab51f3d3ce8c49985265acac959 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U41_3@Hu0Z-f5WKth|JmOESLggc zTYYa$*52-@Iayvnsk8t8M-?CC5SRjFL%^KZ!c{<)wx^3@2*=Figa?*~4;W|9$i^=m0iMb?Y+YX3Zzsx4>9~a&-27=hMNh<08dvxmvv4FO#rFEIz9jZ literal 0 HcmV?d00001 diff --git a/test/compression/small_mode_1.png b/test/compression/small_mode_1.png new file mode 100644 index 0000000000000000000000000000000000000000..76eb7c9a8f23e51a128e45464f8ffcf1fb1a8fbd GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U41_3@Hu1ltL1DQcVK}(h_`Tzg_ z(JjSGrUW$?TP6ibcv&)>J$tmdx%t0W*8l(A|JO+TKdL$Jo=Fx^gP5m_V+hC0D1O+7}1O)}L7_vzA^zvThU=%pWzz{T#rFugb_al&Tp00i_ I>zopr01SE@(EtDd literal 0 HcmV?d00001 diff --git a/test/compression/small_mode_3.png b/test/compression/small_mode_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d7c927549bb8590999f1f5184bc587c67501f8 GIT binary patch literal 5019 zcmeHKdsGu=7M}nT5=3YL6}BxQNCj(>$@^g4#Fq%fJ8K!iL<0tCCDE7V6p z3a;1|aVcUcsIUcE5mZ_gs@7s36j2aV>{=0p^#O&V(n&zYvpsu`=WPEoCzH(F@7~|N z_jm7ilW)5+e5o7Jmk0oWn_MP|z`i|fmy;v*d8fM<6F81+P_3~o}cf2yQWl->OdH%;RBiHuZ*>t z;?K_c{PGTeikWo9U9#X#|5*=1;dDt^%%`P1H-f=Y<16c`o$1HEO!cp?svcWrIjR*N z>N%BZb&va(VC0n>Z-&kkO5X&0>I3C4@Ex77sio=;ddIzOwo5~A-x0FM5U&00@W#l0 zCw$bODL9CxhZlIBeOy5sJA0&U(`%U{7wXzC^^Rr6fAE>VpeAIX=iqQk>l$h88>+E} zij3ey*ZYih(>s=Jx&gHXZ1EZjdPVw5`?ON!2ers9^**TL#~tkUIc^`d9&ytQicucoFg)eh6THBPf+a~gnQ~-7&E@C6^-qjGkJu%y((jy2bcy$}o3p}4ZO?H_4MrV+F$H<%yQ|2uQ z<(B&G@!4hU4P3M*h@f8E?-6oho;rx1e1ZQJwI{%K}!;4;#`EkKVu8LiJ z)v|f(+bcUhKJeGbpMx&4Vjj>XJLu(3C4}9cP2nHrN8FfyNwf6QFZt}##l(}JUhI93 zR+_LqaAkEw%|=zMxZO8#eYyXxB3cWbte15J*7V3uq1R9&soN09n=IlPt!4P zH(vT8pvUX=Zyqh<5{JXNk5zo%ACFgFF4M0*(4IWKaAgg}6`O=#_h4jJ)co%6w$pZ_HS;v(Sw%jP33)xbCI$Zo!OY( z|9V(s^CjYa8VhqoVmy$;XKY?+Ivy8u!TFG|8Eq zxyCDtm#?^#NYNQqF3ViAQ{kCfJkYn~T5DWX=k;F&cPmrV{Ps47ocYZ&V}Z_cF1mB{ z`}48cqYaXW@@!^H?DV#yKP_|&o7=qFA=W|E@gU&dEL__=ULp9f5K^WO_$aTJ_LarQ z%dgof#<>OG7rN2Ebya8|ZNE=Q_roh;_448RuJ-<;-Wg2|nI(yX1Ecu)za@P4y%?YOFZB9IK;{BEb zSvhspGpaX}MsU5iukOD|4tz`t{(Rfrt4I6>2SfusxFuyLRdtE4D%s~`EwGwXKX3RL z8Ng+2Q%lt4|CG@*SNTl?*RJ=+WXGqMjF}$+RX6!h1gGZg2{a1}BUB;tOvzq;n)2@}3SF;tM!YD=)w6YB*G;%|@3f_ zNqV!uDk9r)1=zh!Oe2%*DwaeMd5uCz5*th?iA7~mL5kF>O=XZ55=lZ6q7g($LMI`x zClNWpVlfJ6w6wG|Y8sPjFvZj8d_JEBGH4721=FCI)Abg}O3|AGY!DL|64VTvv_^~8 zpeNZdA+;gJA|jKqb<&ggbVh~ZDZJi1$pXd)%?cT5bSg;G>1b0e%ob@X1~M7YA6l4I z*iRcR0yP^_OfV`kA1@T&) z(Qbv2{hX#nt9eG&bFtZ0?CDGm1T%k%`<(WZ-0jMkmO>$r7~m9Jcyft|Z1XQb46qgv z*l$^Mh{J^tkiu0%bP5aQuqiwcpS>h{NZjQ=sH}vjx(_s0|7Or)n`Am`-OS zEGC`8=c!Q&i$T{=AeNd*f!S;|lf~Dt8QiH5D@2hLy=X(FgH+}O zvaK)zEFFwm$kwSCfZYPiMj$q!ki}q984O7xvMnf*&C=fBB;iC^WLh((k#6hx$*zw? zlP8`gHbIiszC?UN`aKUC3?dh3SgsUP$?6cm3b!B0f9rpnB{dP#Sia zQKXsoU7;Ssf4sAEYdbMpf>E~C3;?d4whIRo z70$@^g4#Fq%fJ8K!iL<0tCCDE7V6p z3a;1|aVcUcsIUcE5mZ_gs@7s36j2aV>{=0p^#O&V(n&zYvpsu`=WPEoCzH(F@7~|N z_jm7ilW)5+e5o7Jmk0oWn_MP|z`i|fmy;v*d8fM<6F81+P_3~o}cf2yQWl->OdH%;RBiHuZ*>t z;?K_c{PGTeikWo9U9#X#|5*=1;dDt^%%`P1H-f=Y<16c`o$1HEO!cp?svcWrIjR*N z>N%BZb&va(VC0n>Z-&kkO5X&0>I3C4@Ex77sio=;ddIzOwo5~A-x0FM5U&00@W#l0 zCw$bODL9CxhZlIBeOy5sJA0&U(`%U{7wXzC^^Rr6fAE>VpeAIX=iqQk>l$h88>+E} zij3ey*ZYih(>s=Jx&gHXZ1EZjdPVw5`?ON!2ers9^**TL#~tkUIc^`d9&ytQicucoFg)eh6THBPf+a~gnQ~-7&E@C6^-qjGkJu%y((jy2bcy$}o3p}4ZO?H_4MrV+F$H<%yQ|2uQ z<(B&G@!4hU4P3M*h@f8E?-6oho;rx1e1ZQJwI{%K}!;4;#`EkKVu8LiJ z)v|f(+bcUhKJeGbpMx&4Vjj>XJLu(3C4}9cP2nHrN8FfyNwf6QFZt}##l(}JUhI93 zR+_LqaAkEw%|=zMxZO8#eYyXxB3cWbte15J*7V3uq1R9&soN09n=IlPt!4P zH(vT8pvUX=Zyqh<5{JXNk5zo%ACFgFF4M0*(4IWKaAgg}6`O=#_h4jJ)co%6w$pZ_HS;v(Sw%jP33)xbCI$Zo!OY( z|9V(s^CjYa8VhqoVmy$;XKY?+Ivy8u!TFG|8Eq zxyCDtm#?^#NYNQqF3ViAQ{kCfJkYn~T5DWX=k;F&cPmrV{Ps47ocYZ&V}Z_cF1mB{ z`}48cqYaXW@@!^H?DV#yKP_|&o7=qFA=W|E@gU&dEL__=ULp9f5K^WO_$aTJ_LarQ z%dgof#<>OG7rN2Ebya8|ZNE=Q_roh;_448RuJ-<;-Wg2|nI(yX1Ecu)za@P4y%?YOFZB9IK;{BEb zSvhspGpaX}MsU5iukOD|4tz`t{(Rfrt4I6>2SfusxFuyLRdtE4D%s~`EwGwXKX3RL z8Ng+2Q%lt4|CG@*SNTl?*RJ=+WXGqMjF}$+RX6!h1gGZg2{a1}BUB;tOvzq;n)2@}3SF;tM!YD=)w6YB*G;%|@3f_ zNqV!uDk9r)1=zh!Oe2%*DwaeMd5uCz5*th?iA7~mL5kF>O=XZ55=lZ6q7g($LMI`x zClNWpVlfJ6w6wG|Y8sPjFvZj8d_JEBGH4721=FCI)Abg}O3|AGY!DL|64VTvv_^~8 zpeNZdA+;gJA|jKqb<&ggbVh~ZDZJi1$pXd)%?cT5bSg;G>1b0e%ob@X1~M7YA6l4I z*iRcR0yP^_OfV`kA1@T&) z(Qbv2{hX#nt9eG&bFtZ0?CDGm1T%k%`<(WZ-0jMkmO>$r7~m9Jcyft|Z1XQb46qgv z*l$^Mh{J^tkiu0%bP5aQuqiwcpS>h{NZjQ=sH}vjx(_s0|7Or)n`Am`-OS zEGC`8=c!Q&i$T{=AeNd*f!S;|lf~Dt8QiH5D@2hLy=X(FgH+}O zvaK)zEFFwm$kwSCfZYPiMj$q!ki}q984O7xvMnf*&C=fBB;iC^WLh((k#6hx$*zw? zlP8`gHbIiszC?UN`aKUC3?dh3SgsUP$?6cm3b!B0f9rpnB{dP#Sia zQKXsoU7;Ssf4sAEYdbMpf>E~C3;?d4whIRo z70zopr0Ep;7eE0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWCBuFSnNp{Jx&B m`zU+CyD9sd3b?x?nz0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWmdKI;Vst0ChHs+W-In literal 0 HcmV?d00001 diff --git a/test/compression/table_35_29.png b/test/compression/table_35_29.png new file mode 100644 index 0000000000000000000000000000000000000000..0a60fcc7c264a9c1ad91f7a24777c6b8e09f6d25 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWE{-7@x)*2 ZZK}eVxSp(5x(2j?!PC{xWt~$(696~Fi&X#s literal 0 HcmV?d00001 diff --git a/test/compression/table_36_28.png b/test/compression/table_36_28.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd266ca96e05f084ccec87aff4faaee287a182b GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0)ts)O6iX$2em$EC#X0vCR%gs61r=C z!b)O;_5sF@P=}3-CM8U=B0W6uLTekQJ#@Gs$kPH;ZNSQ?Wx&|BxUK01&`<_XS3j3^ HP60(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWmdKI;Vst0Ou5l(f|Me literal 0 HcmV?d00001 diff --git a/test/compression/table_39_25.png b/test/compression/table_39_25.png new file mode 100644 index 0000000000000000000000000000000000000000..c91994abcd30980f0d2c6317b496a43249c43e0b GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWjr;=W3+x_ddpZ U+^?$U0F7txboFyt=akR{0GarQ6#xJL literal 0 HcmV?d00001 diff --git a/test/compression/table_40_24.png b/test/compression/table_40_24.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2b192610e47643aa90f552c9631ad139536c4f GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW#N!;B`z%MTx0&h)wNN0-hr0+ zOG-Q0Ubry09pI>7{Ih54W`^J1x4y2P?o;2$uz~F(hjCiF@Rz+T28*V6ojAqpqF|N$ hVSDK5e|zkoGA`3&5?vSXZ3483!PC{xWt~$(696L4j{5)r literal 0 HcmV?d00001 diff --git a/test/compression/table_43_21.png b/test/compression/table_43_21.png new file mode 100644 index 0000000000000000000000000000000000000000..df7aeea81530cbf99793ad2782e69e57a17eb253 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWW2>cHXDou?r*blUU2-uKiRSd1`db&ANOnU%x4TdpLFZ6>VjX4?G3kY1_MoH N@O1TaS?83{1OS)Wg}nd( literal 0 HcmV?d00001 diff --git a/test/compression/table_44_20.png b/test/compression/table_44_20.png new file mode 100644 index 0000000000000000000000000000000000000000..354132253626581d75485653edcd91aa47ae024f GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWllU@&R3c>WrYeS0w-+kElM{z{kU9CV2071 zXywN_B6m6$UwFITe8r_;>%a+r?h3Z%_C_3j(4p^~BD=+GU9W}R904)I&g847xnG2* fGJm@I^Qz3_dyFS+jO+IR?P2hA^>bP0l+XkK#qN(d literal 0 HcmV?d00001 diff --git a/test/compression/table_45_19.png b/test/compression/table_45_19.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6eeff3cc95b55d98d782fcad6f9edf4caa262b GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWaQ^ylx?B(MwI4mNr>#$t6LMD0dm0=# zbhO~c7^0s2Pgn@Q4c)I$ztaD0e0syjilZF5Q literal 0 HcmV?d00001 diff --git a/test/compression/table_46_18.png b/test/compression/table_46_18.png new file mode 100644 index 0000000000000000000000000000000000000000..c39bdf757c6420bc0dca0689fbeadd613d053245 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWFVdQ&MBb@0Q=sK A*8l(j literal 0 HcmV?d00001 diff --git a/test/compression/table_47_17.png b/test/compression/table_47_17.png new file mode 100644 index 0000000000000000000000000000000000000000..792f053dc8c09447c2150aff0fb75053a8f050bb GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW^%w%id@qh8JR9cge*9{So^>P^%V^v;sRfo zy13R{I+4}Z&U8mhBivv`j3=-11}#O+i;01adj30^F5Tq_Zq(yqxF*6FTUxtZ31}>X Mr>mdKI;Vst0L;pMKL7v# literal 0 HcmV?d00001 diff --git a/test/compression/table_48_16.png b/test/compression/table_48_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d88f3794cfa6c8075385d797756fbf399264e6b0 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW^7;S#cLI_buOBS@c7x}USMre?URC!G zFk488=N$=rQJ_`Oa>v%s!Expm0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWZNC;J8uVpz>XNoAFDY?Y6b7FV42S5oXt0&bVKQaZ#Jv R8wH@*44$rjF6*2UngA<5gQNfe literal 0 HcmV?d00001 diff --git a/test/compression/table_50_14.png b/test/compression/table_50_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a773629b05a503352bf43c29f7cdd310cdb243d7 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW$luu{Kxa(I{e~y?&TL4 VO5)Cx46!PC{xWt~$(69CUwh_wI! literal 0 HcmV?d00001 diff --git a/test/compression/table_51_13.png b/test/compression/table_51_13.png new file mode 100644 index 0000000000000000000000000000000000000000..edece0a3e87de7770f155c148d92f365cb69a2a9 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW*H?w-0ECzl$5Xaz%?txLcwX>T{ivupR#3n aXGPAu!6eYoEPVrL2ZN`ppUXO@geCxH+=vwb literal 0 HcmV?d00001 diff --git a/test/compression/table_52_12.png b/test/compression/table_52_12.png new file mode 100644 index 0000000000000000000000000000000000000000..686ffb10835c06b67411548f5371be96a7a91887 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWBl$@-YYqIA8qsZ~8QWgDGiR2hYX7x-H<)ugg-n zq%3^G&IP_q+S?eF3}xpr|94#9_+y?v14{!#+4TF4wa59xCcX(>QXRy&d^KZ3<`d@| QK!X`PUHx3vIVCg!0M?O&SpWb4 literal 0 HcmV?d00001 diff --git a/test/compression/table_53_11.png b/test/compression/table_53_11.png new file mode 100644 index 0000000000000000000000000000000000000000..9fce27e88fd488c192f89b9e4fbe7f7756a56506 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWBO5@&R4Xa`S)vEs5N33LBRcXiK!QC134HI6mRb z$pnTKiVRs>{;K{xpefl$2w1Q R!huFJc)I$ztaD0e0s!ITg>V1> literal 0 HcmV?d00001 diff --git a/test/compression/table_54_10.png b/test/compression/table_54_10.png new file mode 100644 index 0000000000000000000000000000000000000000..ce94bc41eabebce5263baf26d37e51cca3e01386 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWZ}m4q`65U-L>jFVdQ&MBb@0CZi8Jpcdz literal 0 HcmV?d00001 diff --git a/test/compression/table_55_9.png b/test/compression/table_55_9.png new file mode 100644 index 0000000000000000000000000000000000000000..30665e3e145838a95b995a8880158cd1f0e22726 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW^%t$iak1=!K}($3JSd|nVjcMoM59I`joS> zzp=r@iIFe!k?4ad@^M@m{2E>%0$zM3L5>$>TVlLU=0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW%T#suBZxgEx$He1SVLeW~*%u-gHBSE)n4oH1{i5iXsCf3X@CV^qX$<)$ WjP-sEUH5?&FnGH9xvX0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWgTe~DWM4f D0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWmdKI;Vst0Nl8V!~g&Q literal 0 HcmV?d00001 diff --git a/test/compression/table_59_5.png b/test/compression/table_59_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a283ced33c9b41d1d5648cb735815de24f522c GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW iYK0Sv$_1t!HxTQPW>QxDp|Kcf7lWs(pUXO@geCw_GK~iS literal 0 HcmV?d00001 diff --git a/test/compression/table_60_4.png b/test/compression/table_60_4.png new file mode 100644 index 0000000000000000000000000000000000000000..cdbbee03db800a17a95e482007a96da22f5a73be GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWevegBqee2R)%p=@!RtIzE&P=7nQ zA#wv-uL8pi)_O+91wVOqov*nP-Edd=!fht?Q_|%Pwi(}eJa#u#CDFVdQ&MBb@0Ed=~RR910 literal 0 HcmV?d00001 diff --git a/test/compression/table_61_3.png b/test/compression/table_61_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2e420c5f7f8480036cc2779bbb5e8829b16fb360 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plW3#^t+E-yUt7w~rEyqvh;isols z$9;+t7Z@Kn{pBlT(A=?zOCUMX(eX^>17+68vj?&#I~Yxf4|)3RlkTPKihApo#&Qd_ WGM-g_v&tK20fVQjpUXO@geCy*M~BD& literal 0 HcmV?d00001 diff --git a/test/compression/table_63_1.png b/test/compression/table_63_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4be88870cb52e22e3f2d02667278f4b06dbf88 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|5(0ceT!Hjr z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S69A)zl2F1&<=%? zAirP+plWiA~;INl3&dfp%kwt&(=_Ruckl*saDg O=FWqNNWRTOPJ96CA5#AS literal 0 HcmV?d00001 diff --git a/test/compression/tilemapLarge.bin b/test/compression/tilemapLarge.bin new file mode 100644 index 0000000000000000000000000000000000000000..d102290e4cbc1bc431fcd82d5fdc08b051d14c1f GIT binary patch literal 8192 zcmeI0TTc@~6vzM40~Dobm5U%X2N-bC#)O;q7YI>NA5gsO1E@TBO;99WiMNM>E%8QL z;x|w~f%@T`?RIA`ZK(?+6`B5$&PjLvd(N5e&YT%wwVx>VzzE1*M9KDh00(ghhfxuL zBN$Zr<2Zqn7zv=Rz$ushA}--FuHb3_uA$ZrAB;Zqk;H7X^kV>9B{fu&Z3n2|b=B&_ zD*k3{^D&H2mIy^Gi-yVHr&;N{5%w{J&5{r-y|ihF{C&EWzAfj?@@amzQVUwpiWtR| z?Oe62wq^8Ik2>0iIO_85{x^Cv{w+9)W7wU`C5V43{#`hYGuSUPF>{gnu=^gR;}0QL z8}n$2=?RsnLN%(XiYkdHWRHJsMCz^o!r#a7--CKIpb<@IqDE?-~7i7xDvbWtbuQm_0aA8(&_r60tm

wP>b!r0=zzeE00`_5Xeam)pAX1=o)C`y2EXv|lJAz_o;b&jew5uj=cjzVBoB+~-}4<# za*9(TDPHlogE7vp`D~6iK7E4cI3dh9vU($Bq~gi=2VV5>mOmEMr#Zt*oDpex2UBl* zv0G0ZGNK>s^`AB}#*&eVr{i9|oyR99i>&pNfBEA#=8S|?`}DayzId`&`aq_pHgO#>={g*4cUjOsfdAcIOKtYHYw3fhOhI53zt{b^GzbqnKT7YbJ;!v%6#|z-r0aQH%Rw zq?wVemH~%aM=t`gm02JIgPC1%5M&k;(pIoQu*tAm@;do27_pjMVRkl{Radp06~#E} zxrZ?Z8&GrKjXn>9D><&OE z0jy9Q*on%fVf61D=oJ8~zc<&PE%x_XtBC{ybH!4rQv#%bZfDyWW1E>VtU@MJvQU20 zwDOr;F_X2-y^#cz?EX2kP}~4uXvbV%k7?vHnQh3;zMdC-me2I`XG(=kZ(k;>Bq&*C z(X=)KLI4Uq#jH{6>)D1ppX+;(`Nh6oAOPv_$t?(gW#`SgY^g)pM!+J$DA|2IUolP7 zK;GA58*FZ8(K4+}#wu93;$bEQ=rQN)e14NAFlOg7eNaJW8}gov`3ftVHk8oco6X}( zE}||p&5UUk%zUb1%x>MK#{8i*A(GnmeheA z$AhuGnz#Bbvp>K0A4V*11(rp*jogS2$Afmv4&Tg{db2$RYyMk( zJw2H{m%55lY=&;N?UE_FF`t9gmZ-i(c?m3I&R-Z@S!HvURmu$XmU`!pPzc5{ca`*g}a&e7fo}pN0Hm86RqOivP;r5vO5#GJM%3CPXL@ zV6K=cNK}U7RYBGDJdZv#59KwlE{|_i$zlS}57e=)U$0Jh?!^1G_p}ra>P)*{yIdYS zj_Zk0oOxaYA4gqYcVU3_iK(e6SBc(kTKRC%3_ryZy2%ZWtL;4GL{fG1(Vj`Q9% zDDRr90FGO&UP+hZxQZ{;Q1u1p5JLfWT)Q@jbKpBSoa+jJG?OmB0VV->#Kcq}4fw~2 z>ZIyEc;bMYaToeGJzW!eq}I-?D|cO|T1CYmLLxxj ztx6T*yen^1b?Pjct;! ze%+uluFvx@iWp~J{k8zGD!VNea%yye0C2L89oHt_pRW2oDjA&X z^Jr!iG|&qGbn~d`QU{A3o375Hb-0`J0cyYwn&`?I2!NJDg3rWxPAP;hxb6)Ca90Az z((7(WJuCp6?4t==zFG$}WOq3KOr7V)c|;ybHgnu#O&8yle_xHLi|-A&4Ua9lKD!O$ zf%(GpsA3dg;y2@?`K&&}n>>yU<2!!Ptg-2;_V-W#%5EUaXPQmw`;a$C^#qt@(v%s8 z_QTlN-tt?%-*g=9?=ulySaxOkb!gaef{^bZ)x(PaA6!AS0;+&VEdUVKYYc#@_V^zdPbiWmlGecpP>YG{Rdum}mpL zN`0&o3w!`th)>Fw#Q#~k5CBpB;dbitFuJpYg)NvEo8@=ffF0hfv7JMux5Tne!o|8AkV_ zFl5!R127Fh6g9Q<%HI(#0EnXRAc7vlf(|OX*NmcDC}#~C!JS!H5&6NQ0|18xZaaxL z!QY|9auwy@aRcwz9WspWTi$GV3+0S-I0IXNVx}>wxd4R0`gnlL00@IRyM6umEc${) z_nz>1iz^*m;UX+!AoQEmgkXI<;6j23+MWK-7)FC^fownkj<vTNe49?UL?x+5M$ z1Q6v7VFqP%SSb82pm`KEL)d`vq?^P88t^kh7saY6uafuPBFu$^wMgMH)+~D={=;)E*QB1VCN8Shx%l3;L4Wfut-Mn0w z!85~^(em&GD6u;-wjUG1@nq^oHXq&^sSwJ!QnM$Q{a=3DWCKtk2)P+%UAukVA z{msfL3c(I4r_Prv7yhO6itWd^>O#ut;*j4e8!p9#b~zX2Ff##o?!x(_!zUELC?7jc za~{M1nMdVYd_2SdxsU3Y?%(|ocS0!{W>!O-@_o`HQr`PdSHm5L3+Lh3}i$)p!1;a zA!K5PB5n^Yy^VzhEC!#(gB>V%FgiLaBack$0dl2?8H&egsm%G?B4|=)g%7$3V4BYn zz*1>b00;(`i*1sif!NV%KmzhV4bX~N5BPyvYqkM1jHV{^?*ZmRk#52t$^qlAkE~Oo zUTYc;C16}g(DH-?vjniLJp?!>D;(4SNI?2Hpx2shKuQOYfNQ{6se(PJrW{ZJvDQpW zkn}hutS1Kcux2LA0z3;k|`1a+IJ5&0sLH>%;^WiZlR1kH7~;*n9_o zD$?SUavCoZ!1qPxd{0Th`8$7CsoW3wJXCQi9f`<@aoCg+-1=@Jz)rC#_cg7=7MgIM zkFeACRTD;45{km~n7$+6epf#_`D)R8wSteq$0_1Ilz{n4r~!W@)^_~CAIe2|{d~E6 z6yrr~Y|CWxnHP=6^Up#)^Bcy)dvuTEf#eyv^$G z>F>2(eB7+OmaUw4KIv!D!93^p=amjF&XWd46yV7^0Z>1-%zV#4*0dhaRi3Rp`}*^S zo*$;W5jO2zoTo^Z0B#U~z*si~9@Y_$Kl@sx@>=D2L(dP>0E`&y;ympuCV-{}VBHXS zSVuf=nw824^Lazh4}~2t`phc{(f}ioz{R=&>xg6e4v{^pmoIKyZLUUlmu^k|Km-@?tjM{781PnvNYv$!W)en8lcnT`+j#H-^ah90GPeK z&2ACk7#kjTsiY)0HB3QO&kxfQl-DH!Y)=4PeM$!+C@1s8 zwgjh!;y63FV&(@ifmm8yTf#WRR>OtW)wrD=!F1$Sgq|ltf_W(c0BTAR$7{54NV`41 z-CF(Vm$L2>)t9Ts{$3-QCmL__`@fHncATFYTDIuHnU#%KAs-S8U%O|{dEAE;04~JJ1Kykp`-z&ten=Y1>%O@ zg81+G@tVxnKHdy4JUWWM^Y|P3TurQECTmg?po&1Xz-t(rH9;rX$FiDOt@&PB0xw>Z z0BQl*IRI}N(KywAnCwqg-duExN&NWYe2=TFS_Uh zDM8&6GAt<2n$&3;Flz8{eC*-FNHyWB4FZ_d3n>X&umRBo>VkSl695ofrD03f|9uHC zr35X%UK0R00rcV)Nl+Kt|80PpAE*Xs2~;y z0F6!n*}|GszPIp#B*YPALGVZe$dHWgMNb0mbOO*3DJ9By5Y&W8uXX?yTME!vFM(2` zE2I$dU=139F=_z4p8ySLfOn@ui4b8;+|Lh^co50_V+El16QF?v(D;IGd_ly6lpPR& z-cK;z@g%^|-G~WiVn`d}fy{M45@|i4f_cG)c<_RX2e4(b3;zoM6*5sB4_50E@V~rY zc1W8nt{V+*2s=mv^h`01O$_fQ4e#;V>cWy3pTj6UyoWrFxwZqJt5vEJfa@TW0GBb+ zFWa$brsscx3q`I0EDb<2@_!)L+y5c~!nL zZ4bSNwETH?dD%9_+~_kF{+gatQN9`AKEG=MAXbcf^ybI@{rk;=Y3~=;xc)=#TzN>j z1o)LsKt9XQzD)OhZO@rLYDv#?*7CBsVv1MpjHu>+f{E>~DIcYX^bVUJNdZoCbKft| zzW%Q`|JAE|&P!bmlM43R^ePcOQMmdE_xy*Hizy%$7L_#MQ?q5BeT`cde|gW>qz=DN zDp+2YfR^k2I&vWeax8D(GX99MdAST1c5pgkcg-_rKmC;N+w+{-{m8`oDHTL7G+K@S zNPzBEU+l7?*d+D(aMgYpiF30%`9o=}ETl@aImOuhBnO(cu zfW_GlTmn!|$v8KBy0aUhzO!Nn?%#Url z@7aCV+IK@WX#=pbyL*?LI^Ps zBGwv=C3EX?dl!d>cKV#ld@Gj#+6!>QK2SL#0p6r@y=kuNB0|xlar3q*a)DZojw3OrB9>* zq6xcS*ljc?Ai+%1!p#6X+Y*E-B@&oMb851>nFJUUEY*aan>8WPK~!^`nw(0v7oP$^ z?=Ko#N|5vdZ{DcZ`Nk$7q?b1WQW9u8I2JWM|DK^u{YwBT2{fRaM>FBjW&ruwN&;mN zu#e+hKd;{uaAsh03CMquaz-j`4#;gT0Y?|E2c&y}#so1goG}MBmEi8~hFN~*nGOIw zXGp^Y@T{5p5*@S?W_CYKiSw5DoXwl|7xuzd0G);{GpE~@mOy_KkwI+$O}zg`qqxpj04K-(uELO}!0w*kXa zAL{{06Gp`pk3JBgpq2Gl8*qM82_`0<+6XYp=MrtVcYexeqy)nqfIt1yr}T9y9!M=D z7Iyxq45=rF0g%11Dd4fuw~}~ZsHLO$cCLJszMm`~+(LqHKGoKpa%UE@{$6@)y#z-& zci<>B=j4%tTS(CRQ{%C>G{6w^#E=Ec`*}bE>{16n+C(Sd&oWP?0dct;LxR|{*0>zv zQ-F)g9y)uWe zN%g|4co=-;j?u8`S)?uJisy7MK!VpGz+bij^t_oqZNNW$7QFvHB*+n@~NRV2U;X2vEQ*B3H@@3AT^Q zDduQ-C^ar@4!F`v3&66_x_DHwL_M-5 zUIO?HBoHs07=dyto&S?FH6ee3FfkEKJLAFhl>AO*lg{|Vb?1#JsELX?|B*8>aXF}o z3y}ZpQu{mpJ3o6k>7>t(8$4>xa(ZrjsX40w6PKIv9+#WH_|etm`!xdK0!N>Bt~O^e z_ls(iB3-VHYrw>1d5ejwwI4b9JLLfUi9>`MF2k40H3HPt1@)h`0jlh39f0J#06c^U z&eghzCqKJXH~7QJU_$9+a%x-wCRCXd;5a!i0DO#O2&n#_kMY3Ze=^m+VDiuTXX^l; zbpk$skYgGE%>~B8$*Ie#S1wbx^fnjV{&xb%yOi81Ot<4yJU zM-)c$^!T5?ql~siM4ZHp#E(LPU&w`~wgC$2RBluhfs1^E&np5|4kf^$*Y9Bu0-$Yx z0ClJ48I^fljarc;otE;v`SbOFu}e)MgSG)NtkCKmR|^sD%X~yVexBi~4UTHV*w`f@ zg0_(~;7zJAuk!m!giQc-1rT;o1%Q5-0l)|FdP*i!K!8Z7HICN+*l$gd z3iFKRjy-iOZok%+fb=3PQOaJY#|Gk_-Qtcxup=!4j@LIq8<-*5 z3<XAB3Hr{77ASm-o3x9u96@n%E2=ms96W4E^TSa}uI^gGG; ze;a;m7yV}4^-+=Ct_KXquD>;ae%qtpNk&?n38^9g0V*>3(OziV-WQD4^e&=)Cz;+y zn_&b%g920xrd>$)N|*ly0JJ&zO$NP>HbZx0)6fdD?Yip*{@g2Fhra-TF#W%6yI7=| z!QsHI`vkb{cct=k4zF9A+=+4d{A4ytR0k=^Auvx{N$N|#$}bkPYz{M$S+ z@nVbX(u)-0Z8nIlHy^jUp3?t)@7hl$+=;;iKso*3EWLZVH6RcGd%|871yn%*kiHyn z^P7K0k4%2=C#4k|09}aywciNv&G)W>aI;Vv%vt%p0zgghRa3qU;1_-m!drXi%)-iG z$vm6@sQv!|W5t&Nutb9JW_Bez7{@Ew!->068mrgFM04t21i*}bBA;8ZW3~`09V7rG ot&c5r@XeoC)O{?btK#VY19F}-r~yz*+yDRo07*qoM6N<$f=+cy+W-In literal 0 HcmV?d00001 diff --git a/tools/compresSmol/Makefile b/tools/compresSmol/Makefile new file mode 100644 index 0000000000..768de9d4a7 --- /dev/null +++ b/tools/compresSmol/Makefile @@ -0,0 +1,31 @@ +CXX ?= g++ + +CXXFLAGS := -Werror -std=c++17 -pthread -O2 -Wunused + +INCLUDES := -I . + +SRCS := compresSmol.cpp compressAlgo.cpp tANS.cpp fileDispatcher.cpp +TILEMAP_SRCS := mainTiles.cpp compressAlgo.cpp compressSmolTiles.cpp tANS.cpp fileDispatcher.cpp + +HEADERS := compressAlgo.h tANS.h fileDispatcher.h +TILEMAP_HEADERS := compressAlgo.h compressSmolTiles.h tANS.h fileDispatcher.h + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +.PHONY: all clean + +all: compresSmol$(EXE) compresSmolTilemap$(EXE) + @: + +compresSmol$(EXE): $(SRCS) $(HEADERS) + $(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) -o $@ $(LDFLAGS) + +compresSmolTilemap$(EXE): $(TILEMAP_SRCS) $(TILEMAP_HEADERS) + $(CXX) $(CXXFLAGS) $(TILEMAP_INCLUDES) $(TILEMAP_SRCS) -o $@ $(LDFLAGS) + +clean: + $(RM) compresSmol compresSmol.exe compresSmolTilemap compresSmolTilemap.exe diff --git a/tools/compresSmol/compresSmol.cpp b/tools/compresSmol/compresSmol.cpp new file mode 100644 index 0000000000..80d7ae9f88 --- /dev/null +++ b/tools/compresSmol/compresSmol.cpp @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include +#include "fileDispatcher.h" +#include "compressAlgo.h" + +struct ThingCount { + size_t number = 0; + size_t count = 1; +}; + +bool isNumber(std::string input) +{ + return input.find_first_not_of("0123456789") == std::string::npos; +} + +enum Option { + ANALYZE, + WRITE, + FRAME_WRITE, + DECODE, + USAGE, +}; + +int main(int argc, char *argv[]) +{ + Option option = USAGE; + bool printUsage = false; + std::string input; + std::string output; + int numThreads = 1; + InputSettings settings(true, true, true); + + if (argc > 1) + { + std::string argument = argv[1]; + if (argument.compare("-a") == 0) + option = ANALYZE; + else if (argument.compare("-w") == 0) + option = WRITE; + else if (argument.compare("-fw") == 0) + option = FRAME_WRITE; + else if (argument.compare("-d") == 0) + option = DECODE; + } + switch (option) + { + case ANALYZE: + if (argc > 2) + input = argv[2]; + else + printUsage = true; + if (argc > 4) + { + std::string arg2 = argv[3]; + std::string arg2arg = argv[4]; + if (arg2.compare("-t") == 0 && isNumber(arg2arg)) + numThreads = std::stoi(arg2arg.c_str()); + } + if (argc > 7) + { + std::string setting1 = argv[5]; + std::string setting2 = argv[6]; + std::string setting3 = argv[7]; + if (setting1.compare("true") == 0) + settings.canEncodeLO = true; + else if (setting1.compare("false") == 0) + settings.canEncodeLO = false; + else + fprintf(stderr, "Unrecognized setting1 \"%s\", defaulting to \"true\"\n", setting1.c_str()); + if (setting2.compare("true") == 0) + settings.canEncodeSyms = true; + else if (setting2.compare("false") == 0) + settings.canEncodeSyms = false; + else + fprintf(stderr, "Unrecognized setting2 \"%s\", defaulting to \"true\"\n", setting2.c_str()); + if (setting3.compare("true") == 0) + settings.canDeltaSyms = true; + else if (setting3.compare("false") == 0) + settings.canDeltaSyms = false; + else + fprintf(stderr, "Unrecognized setting3 \"%s\", defaulting to \"true\"\n", setting3.c_str()); + } + break; + case FRAME_WRITE: + settings.useFrames = true; + option = WRITE; + case WRITE: + if (argc > 3) + { + input = argv[2]; + output = argv[3]; + if (argc > 6) + { + std::string setting1 = argv[4]; + std::string setting2 = argv[5]; + std::string setting3 = argv[6]; + if (setting1.compare("true") == 0) + settings.canEncodeLO = true; + else if (setting1.compare("false") == 0) + settings.canEncodeLO = false; + else + fprintf(stderr, "Unrecognized setting1 \"%s\", defaulting to \"true\"\n", setting1.c_str()); + if (setting2.compare("true") == 0) + settings.canEncodeSyms = true; + else if (setting2.compare("false") == 0) + settings.canEncodeSyms = false; + else + fprintf(stderr, "Unrecognized setting2 \"%s\", defaulting to \"true\"\n", setting2.c_str()); + if (setting3.compare("true") == 0) + settings.canDeltaSyms = true; + else if (setting3.compare("false") == 0) + settings.canDeltaSyms = false; + else + fprintf(stderr, "Unrecognized setting3 \"%s\", defaulting to \"true\"\n", setting3.c_str()); + } + } + else + { + printUsage = true; + } + break; + case DECODE: + if (argc > 3) + { + input = argv[2]; + output = argv[3]; + } + else + { + printUsage = true; + } + break; + case USAGE: + printUsage = true; + break; + } + if (printUsage) + { + printf("Usage:\n\ + %s -a \"path/to/some/directory\"\n\ + Analyses all images currently in .4bpp.lz format and compares with this compression.\n\ + -t can be appended to this mode to specify how many threads to use.\n\ + \n\ + %s -w \"path/to/some/file.4bpp\" \"path/to/some/file.4bpp.smol\"\ + Compresses the first argument and writes the result to the second argument.\n\ + These modes can also be appended with 4 true/false statements that control the following settings of the compression:\n\ + - If the compression instructions can be tANS encoded.\n\ + - If the raw symbols in the compression can be tANS encoded.\n\ + - If the compression instructions can be delta encoded.\n\ + - If the raw symbols in the compression ca be delta encoded.\n\ + %s -d \"path/to/some/file.4bpp.smol\" \"path/to/some/file.4bpp\"\n\ + Decompresses the first argument and writes it to the second argument.", argv[0], argv[0], argv[0]); + + return 0; + } + + if (option == ANALYZE) + { + std::filesystem::path dirPath = input; + FileDispatcher dispatcher(dirPath); + if (!dispatcher.initFileList()) + { + fprintf(stderr, "Failed to init file list\n"); + return 1; + } + std::mutex dispatchMutex; + std::vector allImages; + std::mutex imageMutex; + + settings.shouldCompare = true; + + std::vector threads; + for (int i = 0; i < numThreads; i++) + { + threads.emplace_back(analyzeImages, &allImages, &imageMutex, + &dispatcher, &dispatchMutex, + settings); + } + + for (int i = 0; i < numThreads; i++) + threads[i].join(); + + size_t lzSizes = 0; + size_t newSizes = 0; + size_t rawSizes = 0; + size_t totalImages = 0; + size_t invalidImages = 0; + for (CompressedImage currImage : allImages) + { + totalImages++; + if (currImage.isValid) + { + lzSizes += currImage.lzSize; + newSizes += currImage.compressedSize; + rawSizes += currImage.rawNumBytes; + } + else + { + fprintf(stderr, "Failed to solve %s\n", currImage.fileName.c_str()); + invalidImages++; + } + } + + fprintf(stderr, "RawSize: %zu\n", rawSizes); + fprintf(stderr, "LZsize: %zu\n", lzSizes); + fprintf(stderr, "SmolSize: %zu\n", newSizes); + fprintf(stderr, "Total Images: %zu\n", totalImages); + fprintf(stderr, "Invalid Images: %zu\n", invalidImages); + } + if (option == WRITE) + { + if (std::filesystem::exists(input)) + { + CompressedImage image; + if (settings.useFrames) + image = processImageFrames(input, settings); + else + image = processImage(input, settings); + if (image.isValid) + { + std::ofstream fileOut(output.c_str(), std::ios::out | std::ios::binary); + fileOut.write(reinterpret_cast(image.writeVec.data()), image.writeVec.size()*4); + fileOut.close(); + } + else + { + fprintf(stderr, "Failed to compress image %s\n", image.fileName.c_str()); + } + } + else + { + fprintf(stderr, "Input file %s doesn't exist\n", input.c_str()); + } + } + if (option == DECODE) + { + if (std::filesystem::exists(input)) + { + std::vector inData = readFileAsUInt(input); + std::vector image4bpp = readRawDataVecs(&inData); + std::vector charVec(image4bpp.size()*2); + for (size_t i = 0; i < image4bpp.size(); i++) + { + charVec[2*i] = image4bpp[i] & 0xff; + charVec[2*i + 1] = (image4bpp[i] >> 8) & 0xff; + } + std::ofstream fileOut(output.c_str(), std::ios::out | std::ios::binary); + std::copy(charVec.begin(), charVec.end(), std::ostreambuf_iterator(fileOut)); + fileOut.close(); + } + else + { + fprintf(stderr, "Input file %s doesn't exist\n", input.c_str()); + } + } + + return 0; +} diff --git a/tools/compresSmol/compressAlgo.cpp b/tools/compresSmol/compressAlgo.cpp new file mode 100644 index 0000000000..07ac59da81 --- /dev/null +++ b/tools/compresSmol/compressAlgo.cpp @@ -0,0 +1,1467 @@ +#include "compressAlgo.h" + +std::vector getShortCopies(std::vector input, size_t minLength) +{ + std::vector copies; + for (size_t startIndex = 1; startIndex < input.size(); startIndex++) + { + size_t longestLength = 0; + size_t longestOffset; + for (size_t searchOffset = 1; searchOffset <= startIndex && searchOffset < 32767; searchOffset++) + { + size_t currLength = 0; + while (input[startIndex + currLength] == input[startIndex + currLength - searchOffset] + && startIndex + currLength < input.size()) + currLength++; + if (currLength > longestLength) + { + longestLength = currLength; + longestOffset = searchOffset; + } + } + + if (longestLength > 32767) + longestLength = 32767; + if (longestLength >= minLength) + { + std::vector::const_iterator start = input.begin() + startIndex; + std::vector::const_iterator end = input.begin() + startIndex + longestLength; + copies.push_back(ShortCopy(startIndex, longestLength, longestOffset, std::vector(start, end))); + copies[copies.size() - 1].firstSymbol = input[startIndex - 1]; + startIndex += longestLength; + } + } + std::vector checkVec(input.size()); + for (ShortCopy copy : copies) + for (size_t i = 0; i <= copy.length; i++) + checkVec[copy.index + i - 1]++; + size_t currStart = 0; + size_t currLength = 1; + unsigned short prevSym = checkVec[0]; + for (size_t i = 1; i < checkVec.size(); i++) + { + unsigned short currSym = checkVec[i]; + if (currSym == 0 && prevSym == 0) + currLength++; + else if (currSym == 0 && prevSym == 1) + { + currStart = i; + currLength = 1; + } + else if (currSym == 1 && prevSym == 0) + { + std::vector::const_iterator start = input.begin() + currStart; + std::vector::const_iterator end = input.begin() + currStart + currLength; + copies.push_back(ShortCopy(currStart, currLength, 0, std::vector(start, end))); + } + prevSym = currSym; + } + if (prevSym == 0) + { + std::vector::const_iterator start = input.begin() + currStart; + std::vector::const_iterator end = input.begin() + currStart + currLength; + copies.push_back(ShortCopy(currStart, currLength, 0, std::vector(start, end))); + } + + return copies; +} + + +bool verifyShortCopies(std::vector *pCopies, std::vector *pImage) +{ + std::vector decodedImage(pImage->size()); + for (ShortCopy copy : (*pCopies)) + { + if (copy.offset == 0) + { + for (size_t i = 0; i < copy.length; i++) + decodedImage[copy.index + i] = copy.usSequence[i]; + } + else + { + decodedImage[copy.index - 1] = copy.firstSymbol; + for (size_t i = 0; i < copy.length; i++) + decodedImage[copy.index + i] = (*pImage)[copy.index + i - copy.offset]; + } + } + for (size_t i = 0; i < decodedImage.size(); i++) + if (decodedImage[i] != (*pImage)[i]) + return false; + return true; +} + +SortedShortElement::SortedShortElement() {} + +SortedShortElement::SortedShortElement(size_t index, ShortCopy copy) +{ + this->index = index; + this->copy = copy; + isCopy = true; +} + +std::vector getShortInstructions(std::vector copies, size_t lengthMod) +{ + std::vector instructions; + std::vector unsortedElements; + std::vector sortedElements; + + for (ShortCopy copy : copies) + unsortedElements.push_back(SortedShortElement(copy.index, copy)); + + while (unsortedElements.size() != 0) + { + size_t smallestIndex = 0; + for (size_t i = 0; i < unsortedElements.size(); i++) + { + if (unsortedElements[i].index < unsortedElements[smallestIndex].index) + { + smallestIndex = i; + } + } + sortedElements.push_back(unsortedElements[smallestIndex]); + unsortedElements.erase(unsortedElements.begin() + smallestIndex); + } + for (size_t i = 0; i < sortedElements.size(); i++) + { + ShortCompressionInstruction currInstruction; + currInstruction.index = sortedElements[i].index; + currInstruction.offset = sortedElements[i].copy.offset; + currInstruction.length = sortedElements[i].copy.length; + currInstruction.symbols = sortedElements[i].copy.usSequence; + currInstruction.firstSymbol = sortedElements[i].copy.firstSymbol; + currInstruction.buildBytes(); + instructions.push_back(currInstruction); + } + return instructions; +} + +void ShortCompressionInstruction::buildBytes() +{ + if (offset != 0) + { + // Current pattern either exists earlier in the image + // or it's a long run of the same value + size_t currLength = length; + loBytes.push_back(currLength & LO_LOW_BITS_MASK); + currLength = currLength >> LO_NUM_LOW_BITS; + if (currLength != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currLength & BYTE_MASK); + } + size_t currOffset = offset; + loBytes.push_back(currOffset & LO_LOW_BITS_MASK); + currOffset = currOffset >> LO_NUM_LOW_BITS; + if (currOffset != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currOffset & BYTE_MASK); + } + symShorts.push_back(firstSymbol); + } + else + { + // The current pattern doesn't exist earlier in the image + // it has to be written section by section + // Set LENGTH parameter to 0, and use OFFSET parameter as length + loBytes.push_back(0); + size_t currLength = length; + loBytes.push_back(currLength & LO_LOW_BITS_MASK); + currLength = currLength >> LO_NUM_LOW_BITS; + if (currLength != 0) + { + loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; + loBytes.push_back(currLength & BYTE_MASK); + } + for (unsigned short currSymbol : symbols) + symShorts.push_back(currSymbol); + } +} + +void CompressionInstruction::buildBytes() +{ + std::vector currBytes; + if (offset != 0) + { + size_t currLength = length; + currBytes.push_back(currLength & 0x7f); + currLength = currLength >> 7; + if (currLength != 0) + { + currBytes[currBytes.size() - 1] += 128; + currBytes.push_back(currLength & 0xff); + } + size_t currOffset = offset; + currBytes.push_back(currOffset & 0x7f); + currOffset = currOffset >> 7; + if (currOffset != 0) + { + currBytes[currBytes.size() - 1] += 128; + currBytes.push_back(currOffset & 0xff); + } + currBytes.push_back(firstSymbol); + } + else + { + currBytes.push_back(0); + size_t currLength = length; + currBytes.push_back(currLength & 0x7f); + currLength = currLength >> 7; + if (currLength != 0) + { + currBytes[currBytes.size() - 1] += 128; + currBytes.push_back(currLength & 0xff); + } + for (unsigned char currSymbol : symbols) + currBytes.push_back(currSymbol); + } + bytes = currBytes; +} + +std::vector getLosFromInstructions(std::vector instructions) +{ + std::vector loVec; + for (ShortCompressionInstruction instruction : instructions) + { + for (unsigned char uc : instruction.loBytes) + loVec.push_back(uc); + } + return loVec; +} + +std::vector getSymsFromInstructions(std::vector instructions) +{ + std::vector symvec; + for (ShortCompressionInstruction instruction : instructions) + { + for (unsigned short uc : instruction.symShorts) + symvec.push_back(uc); + } + return symvec; +} + +std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec) +{ + std::vector decodedImage; + size_t loIndex = 0; + size_t symIndex = 0; + while (loIndex < pLoVec->size()) + { + size_t currLength = 0; + size_t currOffset = 0; + currLength += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currLength += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + currOffset += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currOffset += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + if (currLength != 0) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + decodedImage.push_back(decodedImage[decodedImage.size() - currOffset]); + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + } + } + } + return decodedImage; +} + +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage) +{ + std::vector shorts = decodeBytesShort(pLoVec, pSymVec); + return compareVectorsShort(&shorts, pImage); +} + +bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2) +{ + if (pVec1->size() != pVec2->size()) + return false; + for (size_t i = 0; i < pVec1->size(); i++) + if ((*pVec1)[i] != (*pVec2)[i]) + return false; + return true; +} + +std::vector readFileAsUC(std::string filePath) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return std::vector(0); + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + std::vector ucVec(size); + iStream.read((char*)(&ucVec[0]), size); + iStream.close(); + return ucVec; +} + +CompressedImage processImage(std::string fileName, InputSettings settings) +{ + CompressedImage image; + std::vector input = readFileAsUC(fileName); + if (settings.useFrames) + { + /* + // Determine number of frames + size_t totalPixels = input.size()*2; + // Split input and append + size_t smallFrames = totalPixels/OVERWORLD_16X16; + size_t largeFrames = totalPixels/OVERWORLD_32X32; + */ + } + else + { + image = processImageData(input, settings, fileName); + } + return image; +} + +CompressedImage processImageFrames(std::string fileName, InputSettings settings) +{ + CompressedImage image; + std::vector input = readFileAsUC(fileName); + std::vector> allInputs(4); + size_t totalSize = input.size(); + size_t partialSize = totalSize/4; + size_t subIndex = 0; + size_t inputIndex = 0; + std::vector frameOffsets; + for (unsigned char currChar : input) + { + frameOffsets.push_back(image.otherBits.size()); + if (subIndex == partialSize) + { + subIndex = 0; + inputIndex++; + } + allInputs[inputIndex].push_back(currChar); + subIndex++; + } + for (size_t i = 0; i < 4; i++) + { + CompressedImage tempImage = processImageData(allInputs[i], settings, fileName); + for (unsigned int currVal : tempImage.writeVec) + image.otherBits.push_back(currVal); + } + unsigned int header = IS_FRAME_CONTAINER; + image.writeVec.push_back(header); + for (size_t i = 0; i < 4; i++) + image.writeVec.push_back((unsigned int)frameOffsets[i]); + for (unsigned int currVal : image.otherBits) + image.writeVec.push_back(currVal); + image.isValid = true; + + return image; +} + +CompressedImage processImageData(std::vector input, InputSettings settings, std::string fileName) +{ + CompressedImage bestImage; + CompressionMode someMode; + bool hasImage = false; + std::vector rawBase = input; + std::vector usBase(rawBase.size()/2); + memcpy(usBase.data(), rawBase.data(), rawBase.size()); + size_t baseLZsize = 0; + bool byteFail = false; + bool copyFail = false; + bool compressionFail = false; + bool uIntConversionFail = false; + if (settings.shouldCompare) + { + std::string lzName = fileName + ".lz"; + baseLZsize = getFileSize(lzName); + } + std::vector bestLO; + std::vector bestSym; + std::vector bestInstructions; + for (size_t minCodeLength = 2; minCodeLength <= 15; minCodeLength++) + { + std::vector shortCopies = getShortCopies(usBase, minCodeLength); + if (!verifyShortCopies(&shortCopies, &usBase)) + { + copyFail = true; + continue; + } + std::vector shortInstructions = getShortInstructions(shortCopies, minCodeLength-1); + std::vector loVec = getLosFromInstructions(shortInstructions); + std::vector symVec = getSymsFromInstructions(shortInstructions); + if (!verifyBytesShort(&loVec, &symVec, &usBase)) + { + byteFail = true; + continue; + } + CompressionMode mode = BASE_ONLY; + //std::vector modesToUse = {ENCODE_SYMS}; + std::vector modesToUse = {BASE_ONLY, ENCODE_SYMS, ENCODE_DELTA_SYMS, ENCODE_LO, ENCODE_BOTH, ENCODE_BOTH_DELTA_SYMS}; + if (fileName.find("test/compression/") != std::string::npos) + { + if (fileName.find("mode_0.4bpp") != std::string::npos) + modesToUse = {BASE_ONLY}; + else if (fileName.find("mode_1.4bpp") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + else if (fileName.find("mode_2.4bpp") != std::string::npos) + modesToUse = {ENCODE_DELTA_SYMS}; + else if (fileName.find("mode_3.4bpp") != std::string::npos) + modesToUse = {ENCODE_LO}; + else if (fileName.find("mode_4.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH}; + else if (fileName.find("mode_5.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH_DELTA_SYMS}; + else if (fileName.find("test/compression/table_") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + + if (modesToUse.size() == 1) + { + settings.canDeltaSyms = true; + settings.canEncodeLO = true; + settings.canEncodeSyms = true; + } + } + + for (CompressionMode currMode : modesToUse) + { + mode = currMode; + if (!settings.canDeltaSyms + && (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeLO + && (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeSyms + && (mode == ENCODE_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + CompressedImage image = fillCompressVecNew(loVec, symVec, mode,rawBase.size(), fileName); + if (!verifyCompressionShort(&image, &usBase)) + { + compressionFail = true; + continue; + } + std::vector uiVec = getUIntVecFromData(&image); + std::vector decodedImage = readRawDataVecs(&uiVec); + if (!compareVectorsShort(&decodedImage, &usBase)) + { + uIntConversionFail = true; + continue; + } + image.compressedSize = uiVec.size() * 4; + if (!hasImage) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + bestImage = image; + hasImage = true; + bestImage.writeVec = uiVec; + someMode = mode; + } + else if (image.compressedSize < bestImage.compressedSize) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + bestImage = image; + hasImage = true; + bestImage.writeVec = uiVec; + someMode = mode; + } + } + } + bestImage.mode = someMode; + bestImage.fileName = fileName; + bestImage.lzSize = baseLZsize; + bestImage.rawNumBytes = rawBase.size(); + if (hasImage) + bestImage.isValid = true; + else + { + fprintf(stderr, "Failed to compress image %s\nErrors: ", fileName.c_str()); + if (copyFail) + fprintf(stderr, "CopyProcessing "); + if (byteFail) + fprintf(stderr, "ByteConversion "); + if (compressionFail) + fprintf(stderr, "Compression "); + if (uIntConversionFail) + fprintf(stderr, "uIntConversion "); + printf("\n"); + } + return bestImage; +} + +CompressedImage getDataFromUIntVec(std::vector *pInput) +{ + CompressedImage image = readNewHeader(pInput); + + size_t readIndex = 2; + + bool loEncoded = isModeLoEncoded(image.mode); + bool symEncoded = isModeSymEncoded(image.mode); + + if (loEncoded) + { + image.loFreqs[0] = (*pInput)[readIndex]; + image.loFreqs[1] = (*pInput)[readIndex + 1]; + image.loFreqs[2] = (*pInput)[readIndex + 2]; + readIndex += 3; + } + if (symEncoded) + { + image.symFreqs[0] = (*pInput)[readIndex]; + image.symFreqs[1] = (*pInput)[readIndex + 1]; + image.symFreqs[2] = (*pInput)[readIndex + 2]; + readIndex += 3; + } + if (loEncoded || symEncoded) + { + for (size_t i = 0; i < image.bitreamSize; i++) + { + image.tANSbits.push_back((*pInput)[readIndex]); + readIndex++; + } + } + std::vector remainders; + while (readIndex < pInput->size()) + { + unsigned int currInt = (*pInput)[readIndex]; + for (size_t i = 0; i < 4; i++) + remainders.push_back((currInt >> (8*i)) & 0xff); + readIndex++; + } + size_t remIndex = 0; + if (!symEncoded) + { + for (size_t i = 0; i < image.symSize; i++) + { + unsigned short currSym = remainders[remIndex]; + remIndex++; + currSym += remainders[remIndex] << 8; + remIndex++; + image.symVec.push_back(currSym); + } + } + if (!loEncoded) + { + for (size_t i = 0; i < image.loSize; i++) + { + unsigned char currChar = remainders[remIndex]; + remIndex++; + image.loVec.push_back(currChar); + } + } + + return image; +} + +bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage) +{ + std::vector decodedImage = decodeImageShort(pInput); + return compareVectorsShort(&decodedImage, pImage); +} + +std::vector decodeImageShort(CompressedImage *pInput) +{ + DataVecs dataVecs = decodeDataVectorsNew(pInput); + return decodeBytesShort(&dataVecs.loVec, &dataVecs.symVec); +} + +DataVecs decodeDataVectorsNew(CompressedImage *pInput) +{ + CompressedImage headerValues = readNewHeader(&pInput->headers); + size_t loSize = headerValues.loSize; + size_t symSize = headerValues.symSize; + CompressionMode mode = headerValues.mode; + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + std::vector loFreqs = unpackFrequencies(&pInput->loFreqs[0]); + std::vector symFreqs = unpackFrequencies(&pInput->symFreqs[0]); + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + std::vector loDecode; + std::vector symDecode; + + std::vector loVec(loSize); + std::vector symVec(symSize); + std::vector loNibbles(loSize*2); + std::vector symNibbles(symSize*4); + + if (loEncoded) + { + loDecode = createDecodingTable(symbols, loFreqs); + } + if (symEncoded) + { + symDecode = createDecodingTable(symbols, symFreqs); + } + + std::vector allBits(pInput->tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : pInput->tANSbits) + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + + if (!symEncoded) + for (size_t i = 0; i < symSize; i++) + symVec[i] = pInput->symVec[i]; + if (!loEncoded) + for (size_t i = 0; i < loSize; i++) + loVec[i] = pInput->loVec[i]; + + size_t bitIndex = 0; + int currState = pInput->initialState; + if (loEncoded) + { + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, loSize*2); + } + if (loEncoded) + for (size_t i = 0; i < loVec.size(); i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + + if (symEncoded) + { + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, symSize*4); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + } + if (symEncoded) + for (size_t i = 0; i < symVec.size(); i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (j*4); + + DataVecs returnData; + returnData.loVec = loVec; + returnData.symVec = symVec; + return returnData; +} + +void analyzeImages(std::vector *allImages, std::mutex *imageMutex, FileDispatcher *dispatcher, std::mutex *dispatchMutex, InputSettings settings) +{ + std::string fileName = "Initial Value"; + while (fileName != "") + { + dispatchMutex->lock(); + fileName = dispatcher->requestFileName(); + dispatchMutex->unlock(); + if (fileName == "") + break; + std::string uncompressedFileName = fileName.substr(0, fileName.size()-3); + CompressedImage currImage = processImage(uncompressedFileName, settings); + + imageMutex->lock(); + allImages->push_back(currImage); + imageMutex->unlock(); + } +} + +ShortCopy::ShortCopy() {} +ShortCopy::ShortCopy(size_t index, size_t length, size_t offset, std::vector usSequence) +{ + this->index = index; + this->length = length; + this->offset = offset; + this->usSequence = usSequence; +} + +std::vector getNormalizedCounts(std::vector input) +{ + std::vector tempVec(16); + for (size_t i = 0; i < input.size(); i++) + tempVec[i] = input[i]; + tempVec = normalizeCounts(tempVec, TANS_TABLE_SIZE); + bool shouldAdjust = false; + for (int i = 0; i < 16; i++) + if (tempVec[i] == TANS_TABLE_SIZE) + { + shouldAdjust = true; + tempVec[i]--; + } + if (shouldAdjust) + for (size_t i = 0; i < 16; i++) + if (tempVec[i] == 0) + { + tempVec[i]++; + break; + } + std::vector returnVec(16); + for (size_t i = 0; i < 16; i++) + returnVec[i] = tempVec[i]; + return returnVec; +} + +std::vector getFreqWriteInts(std::vector input) +{ + std::vector returnVec(3); + for (size_t i = 0; i < 5; i++) + { + unsigned int val1 = input[i]; + unsigned int val2 = input[5 + i]; + unsigned int val3 = input[10 + i]; + val1 = val1 << (i*6); + val2 = val2 << (i*6); + val3 = val3 << (i*6); + returnVec[0] += val1; + returnVec[1] += val2; + returnVec[2] += val3; + } + unsigned int lastVal = input[15]; + returnVec[0] += (lastVal & 0x3) << 30; + returnVec[1] += (lastVal & 0xc) << 28; + returnVec[2] += (lastVal & 0x30) << 26; + return returnVec; +} + +std::vector unpackFrequencies(unsigned int pInts[3]) +{ + std::vector returnVec; + int freq15 = 0; + for (size_t i = 0; i < 3; i++) + { + for (size_t j = 0; j < 5; j++) + { + int currVal = (pInts[i] >> (6*j)) & 0x3f; + returnVec.push_back(currVal); + } + freq15 += ((pInts[i] >> 30) & 0x3) << (2*i); + } + returnVec.push_back(freq15); + return returnVec; +} + +int findInitialState(EncodeCol encodeCol, unsigned char firstSymbol) +{ + for (size_t i = 0; i < encodeCol.symbols.size(); i++) + { + if (encodeCol.symbols[i].symbol == firstSymbol) + return encodeCol.symbols[i].nextState; + } + return -1; +} +/* + mode 5 + + state 6 11 + bitstream 12 23 8628 max so far, divide by 4 + loLength 12 23 2922 max so far + symLength 14 37 14k max so far + imageSize 10 47 16384 max so far, divide by 16 + + u32:5 mode+lz + u32:10 image size, divided by 32 + u32:14 symlength, divided by 2 + + u32:6 state + u32:12 bitstream, in ints + u32:12 loLength, in bytes +*/ +std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength) +{ + if (initialState == -1) + initialState = 0; + std::vector returnVec(2); + + returnVec[0] += (unsigned int)mode; // 4 bits + returnVec[0] += (imageSize/IMAGE_SIZE_MODIFIER) << IMAGE_SIZE_OFFSET; // 14 bits + returnVec[0] += (symLength) << SYM_SIZE_OFFSET; // 14 bits + // 32 total + + returnVec[1] += initialState; // 6 bits + returnVec[1] += bitstreamSize << BITSTREAM_SIZE_OFFSET; // 13 bits + returnVec[1] += loLength << LO_SIZE_OFFSET; // 13 bits + + return returnVec; +} + +CompressedImage readNewHeader(std::vector *pInput) +{ + CompressedImage image; + std::vector headers(2); + headers[0] = (*pInput)[0]; + headers[1] = (*pInput)[1]; + image.mode = (CompressionMode)(headers[0] & MODE_MASK); + image.rawNumBytes = ((headers[0] >> IMAGE_SIZE_OFFSET) & IMAGE_SIZE_MASK) * IMAGE_SIZE_MODIFIER; + image.symSize = ((headers[0] >> SYM_SIZE_OFFSET) & SYM_SIZE_MASK); + + image.initialState = headers[1] & INITIAL_STATE_MASK; + image.bitreamSize = (headers[1] >> BITSTREAM_SIZE_OFFSET) & BITSTREAM_SIZE_MASK; + image.loSize = (headers[1] >> LO_SIZE_OFFSET) & LO_SIZE_MASK; + image.headers = headers; + return image; +} + +InputSettings::InputSettings() {} + +InputSettings::InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms) +{ + this->canEncodeLO = canEncodeLO; + this->canEncodeSyms = canEncodeSyms; + this->canDeltaSyms = canDeltaSyms; +} + +std::vector getUIntVecFromData(CompressedImage *pImage) +{ + CompressedImage otherImage = readNewHeader(&pImage->headers); + std::vector returnVec; + returnVec.push_back(pImage->headers[0]); + returnVec.push_back(pImage->headers[1]); + if (isModeLoEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + returnVec.push_back(pImage->loFreqs[i]); + if (isModeSymEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + returnVec.push_back(pImage->symFreqs[i]); + if (isModeLoEncoded(otherImage.mode) || isModeSymEncoded(otherImage.mode)) + for (unsigned int ui : pImage->tANSbits) + returnVec.push_back(ui); + unsigned int currInt = 0; + unsigned int currOffset = 0; + if (!isModeSymEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->symVec.size(); i++) + { + currInt += pImage->symVec[i] << (8*(currOffset % 4)); + currOffset += 2; + if (currOffset % 4 == 0) + { + returnVec.push_back(currInt); + currInt = 0; + } + } + } + if (!isModeLoEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->loVec.size(); i++) + { + currInt += 0; + currInt += pImage->loVec[i] << (8*(currOffset % 4)); + currOffset++; + if (currOffset % 4 == 0) + { + returnVec.push_back(currInt); + currInt = 0; + } + } + } + if (currOffset != 0) + returnVec.push_back(currInt); + return returnVec; +} + +bool verifyUIntVecShort(std::vector *pInput, std::vector *pImage) +{ + CompressedImage image = getDataFromUIntVec(pInput); + return verifyCompressionShort(&image, pImage); +} + +std::vector readFileAsUInt(std::string filePath) +{ + std::vector returnVec; + std::vector ucVec; + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open file %s for reading\n", filePath.c_str()); + return returnVec; + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + ucVec.resize(size); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + iStream.read((char*)(&ucVec[0]), size); + iStream.close(); + unsigned int *pUInt = reinterpret_cast(ucVec.data()); + for (size_t i = 0; i < ucVec.size()/4; i++) + returnVec.push_back(pUInt[i]); + return returnVec; +} + +bool isModeLoEncoded(CompressionMode mode) +{ + if (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +bool isModeSymEncoded(CompressionMode mode) +{ + if (mode == ENCODE_SYMS + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +bool isModeSymDelta(CompressionMode mode) +{ + if (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; +} + +CompressedImage fillCompressVecNew(std::vector loVec, std::vector symVec, CompressionMode mode, size_t imageBytes, std::string name) +{ + CompressedImage image; + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + + std::vector loNibbles(2*loVec.size()); + std::vector symNibbles(4*symVec.size()); + std::vector loDecode; + std::vector symDecode; + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + if (loEncoded) + { + for (size_t i = 0; i < loVec.size(); i++) + { + loNibbles[2*i] = (loVec)[i] & 0xf; + loNibbles[2*i + 1] = ((loVec)[i] >> 4) & 0xf; + } + std::vector loCounts(16); + for (unsigned char uc : loNibbles) + loCounts[uc]++; + std::vector loFreqs = getNormalizedCounts(loCounts); + std::vector freqs = getFreqWriteInts(loFreqs); + image.loFreqs[0] = freqs[0]; + image.loFreqs[1] = freqs[1]; + image.loFreqs[2] = freqs[2]; + loDecode = createDecodingTable(symbols, loFreqs); + } + if (symEncoded) + { + for (size_t i = 0; i < symVec.size(); i++) + { + for (size_t j = 0; j < 4; j++) + symNibbles[4*i + j] = (symVec[i] >> (4*j)) & 0xf; + } + std::vector symCounts(16); + if (symDelta) + deltaEncode(&symNibbles, symNibbles.size()); + for (unsigned char uc : symNibbles) + symCounts[uc]++; + std::vector symFreqs = getNormalizedCounts(symCounts); + symFreqs = getTestFreqs(symFreqs, name); + std::vector freqs = getFreqWriteInts(symFreqs); + image.symFreqs[0] = freqs[0]; + image.symFreqs[1] = freqs[1]; + image.symFreqs[2] = freqs[2]; + symDecode = createDecodingTable(symbols, symFreqs); + } + int currState = -1; + std::vector bitstream; + if (symEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < symNibbles.size(); i++) + reversedVec.push_back(symNibbles[symNibbles.size() - i - 1]); + std::vector symEncode = createEncodingTable(symDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(symEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(symEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + if (loEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < loNibbles.size(); i++) + reversedVec.push_back(loNibbles[loNibbles.size() - i - 1]); + std::vector loEncode = createEncodingTable(loDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(loEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(loEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + std::vector reversedBitstream(bitstream.size()); + for (size_t i = 0; i < bitstream.size(); i++) + reversedBitstream[reversedBitstream.size() - 1 - i] = bitstream[i]; + bitstream = reversedBitstream; + std::vector checkBits = bitstream; + int checkState = currState; + + size_t currBitIndex = 0; + if (loEncoded) + { + std::vector checkLoNibbles(loNibbles.size()); + currBitIndex = decodeNibbles(loDecode, &checkBits, &checkState, &checkLoNibbles, currBitIndex, loNibbles.size()); + for (size_t i = 0; i < loNibbles.size(); i++) + if (loNibbles[i] != checkLoNibbles[i]) + { + fprintf(stderr, "LO Mismatch\n"); + break; + } + } + if (symEncoded) + { + std::vector checkSymNibbles(symNibbles.size()); + currBitIndex = decodeNibbles(symDecode, &checkBits, &checkState, &checkSymNibbles, currBitIndex, symNibbles.size()); + for (size_t i = 0; i < symNibbles.size(); i++) + if (symNibbles[i] != checkSymNibbles[i]) + { + fprintf(stderr, "Symbol Mismatch\n"); + break; + } + } + + std::vector tANSbits; + unsigned int currInt = 0; + for (size_t i = 0; i < bitstream.size(); i++) + { + currInt += bitstream[i] << (i%32); + if ((i+1) % 32 == 0) + { + tANSbits.push_back(currInt); + currInt = 0; + } + } + if (bitstream.size() % 32 != 0) + tANSbits.push_back(currInt); + image.headers = getNewHeaders(mode, imageBytes, symVec.size(), currState, tANSbits.size(), loVec.size()); + image.tANSbits = tANSbits; + image.symVec = symVec; + image.loVec = loVec; + image.initialState = currState; + return image; +} + +size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles) +{ + for (size_t i = 0; i < numNibbles; i++) + { + (*nibbleVec)[i] = decodeTable[*currState].symbol; + int currK = decodeTable[*currState].k; + int nextState = decodeTable[*currState].y << currK; + for (size_t j = 0; j < currK; j++) + { + nextState += (*bits)[currBitIndex] << j; + currBitIndex++; + } + *currState = nextState - TANS_TABLE_SIZE; + } + return currBitIndex; +} + +std::vector readRawDataVecs(std::vector *pInput) +{ + std::vector imageVec; + CompressedImage readImage = readNewHeader(pInput); + bool loEncoded = isModeLoEncoded(readImage.mode); + bool symEncoded = isModeSymEncoded(readImage.mode); + bool symDelta = isModeSymDelta(readImage.mode); + size_t readIndex = 2; + std::vector tANSbits; + std::vector allBits; + std::vector symVec(readImage.symSize); + std::vector loVec(readImage.loSize); + std::vector symDecode(TANS_TABLE_SIZE); + std::vector loDecode(TANS_TABLE_SIZE); + int currState = readImage.initialState; + if (loEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.loFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector loFreqs = unpackFrequencies(&readImage.loFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < loFreqs[i]; j++) + { + loDecode[currCol].state = TANS_TABLE_SIZE + currCol; + loDecode[currCol].symbol = i; + loDecode[currCol].y = loFreqs[i] + j; + int currK = 0; + while ((loDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + loDecode[currCol].k = currK; + currCol++; + } + } + } + if (symEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.symFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector symFreqs = unpackFrequencies(&readImage.symFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < symFreqs[i]; j++) + { + symDecode[currCol].state = TANS_TABLE_SIZE + currCol; + symDecode[currCol].symbol = i; + symDecode[currCol].y = symFreqs[i] + j; + int currK = 0; + while ((symDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + symDecode[currCol].k = currK; + currCol++; + } + } + } + if (loEncoded || symEncoded) + { + tANSbits.resize(readImage.bitreamSize); + for (size_t i = 0; i < readImage.bitreamSize; i++) + tANSbits[i] = (*pInput)[readIndex + i]; + readIndex += readImage.bitreamSize; + allBits.resize(tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : tANSbits) + { + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + } + } + bool leftOverValues = false; + if (!symEncoded) + { + for (size_t i = 0; i < readImage.symSize; i++) + { + symVec[i] = ((*pInput)[readIndex] >> (16*(i%2))) & 0xffff; + if ((i+1) % 2 == 0) + { + readIndex++; + leftOverValues = false; + } + else + { + leftOverValues = true; + } + } + } + if (!loEncoded) + { + size_t offsetMod = 0; + if (leftOverValues) + offsetMod = 2; + for (size_t i = 0; i < readImage.loSize; i++) + { + loVec[i] = ((*pInput)[readIndex] >> (8*((i%4) + offsetMod))) & 0xff; + if ((i+offsetMod+1) % 4 == 0) + readIndex++; + } + } + size_t bitIndex = 0; + if (loEncoded) + { + std::vector loNibbles(readImage.loSize*2); + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, readImage.loSize*2); + for (size_t i = 0; i < readImage.loSize; i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + } + if (symEncoded) + { + std::vector symNibbles(readImage.symSize*4); + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, readImage.symSize*4); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + for (size_t i = 0; i < readImage.symSize; i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (4*j); + } + imageVec = decodeBytesShort(&loVec, &symVec); + return imageVec; +} + +void deltaEncode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char current =(*buffer)[i]; + (*buffer)[i] = (current-last) & 0xf; + last = current; + } +} + +void deltaDecode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char delta =(*buffer)[i]; + (*buffer)[i] = (delta+last) & 0xf; + last = (*buffer)[i]; + } +} + +std::vector getTestFreqs(std::vector freqs, std::string name) +{ + if (name.find("test/compression/table_") == std::string::npos) + return freqs; + if (name.find("table_63_1") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 63; + freqs[1] = 1; + } + if (name.find("table_62_2") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 62; + freqs[1] = 2; + } + if (name.find("table_61_3") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 61; + freqs[1] = 3; + } + if (name.find("table_60_4") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 60; + freqs[1] = 4; + } + if (name.find("table_59_5") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 59; + freqs[1] = 5; + } + if (name.find("table_58_6") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 58; + freqs[1] = 6; + } + if (name.find("table_57_7") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 57; + freqs[1] = 7; + } + if (name.find("table_56_8") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 56; + freqs[1] = 8; + } + if (name.find("table_55_9") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 55; + freqs[1] = 9; + } + if (name.find("table_54_10") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 54; + freqs[1] = 10; + } + if (name.find("table_53_11") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 53; + freqs[1] = 11; + } + if (name.find("table_52_12") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 52; + freqs[1] = 12; + } + if (name.find("table_51_13") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 51; + freqs[1] = 13; + } + if (name.find("table_50_14") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 50; + freqs[1] = 14; + } + if (name.find("table_49_15") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 49; + freqs[1] = 15; + } + if (name.find("table_48_16") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 48; + freqs[1] = 16; + } + if (name.find("table_47_17") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 47; + freqs[1] = 17; + } + if (name.find("table_46_18") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 46; + freqs[1] = 18; + } + if (name.find("table_45_19") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 45; + freqs[1] = 19; + } + if (name.find("table_44_20") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 44; + freqs[1] = 20; + } + if (name.find("table_43_21") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 43; + freqs[1] = 21; + } + if (name.find("table_42_22") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 42; + freqs[1] = 22; + } + if (name.find("table_41_23") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 41; + freqs[1] = 23; + } + if (name.find("table_40_24") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 40; + freqs[1] = 24; + } + if (name.find("table_39_25") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 39; + freqs[1] = 25; + } + if (name.find("table_38_26") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 38; + freqs[1] = 26; + } + if (name.find("table_37_27") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 37; + freqs[1] = 27; + } + if (name.find("table_36_28") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 36; + freqs[1] = 28; + } + if (name.find("table_35_29") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 35; + freqs[1] = 29; + } + if (name.find("table_34_30") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 34; + freqs[1] = 30; + } + if (name.find("table_33_31") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 33; + freqs[1] = 31; + } + if (name.find("table_32_32") != std::string::npos) + { + freqs.clear(); + freqs.resize(16); + freqs[0] = 32; + freqs[1] = 32; + } + return freqs; +} diff --git a/tools/compresSmol/compressAlgo.h b/tools/compresSmol/compressAlgo.h new file mode 100644 index 0000000000..e27c599cef --- /dev/null +++ b/tools/compresSmol/compressAlgo.h @@ -0,0 +1,178 @@ +#ifndef COMPRES_SMOL +#define COMPRES_SMOL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fileDispatcher.h" +#include "tANS.h" + +#define OVERWORLD_16X16 256 +#define OVERWORLD_32X32 1024 + +#define TANS_TABLE_SIZE 64 +#define LO_CONTINUE_BIT 0x80 +#define LO_LOW_BITS_MASK 0x7f +#define LO_NUM_LOW_BITS 0x7 +#define BYTE_MASK 0xff +#define SHORT_MASK 0xffff +#define NIBBLE_MASK 0xf +#define NUM_SHORT_BITS 0xf +#define LENGTH_MOD_MASK 0xf +#define INITIAL_STATE_MASK 0x3f +#define MODE_MASK 0x1f +#define IMAGE_SIZE_MASK 0x3fff +#define IMAGE_SIZE_OFFSET 4 +#define SYM_SIZE_MASK 0x3fff +#define SYM_SIZE_OFFSET 18 +#define BITSTREAM_SIZE_MASK 0x1fff +#define BITSTREAM_SIZE_OFFSET 6 +#define LO_SIZE_MASK 0x1fff +#define LO_SIZE_OFFSET 19 + +#define IMAGE_SIZE_MODIFIER 4 + +enum CompressionMode { + LZ77 = 0, + BASE_ONLY = 1, + ENCODE_SYMS = 2, + ENCODE_DELTA_SYMS = 3, + ENCODE_LO = 4, + ENCODE_BOTH = 5, + ENCODE_BOTH_DELTA_SYMS = 6, + IS_FRAME_CONTAINER = 7, + IS_TILEMAP = 8, +}; + +struct ShortCopy { + size_t index; + size_t length; + size_t offset; + unsigned short firstSymbol; + std::vector usSequence; + ShortCopy(); + ShortCopy(size_t index, size_t length, size_t offset, std::vector usSequence); +}; + +struct CompressionInstruction { + size_t length; + size_t offset; + size_t index; + unsigned char firstSymbol; + std::vector symbols; + std::vector bytes; + void buildBytes(); + bool verifyInstruction(); +}; + +struct ShortCompressionInstruction { + size_t length; + size_t offset; + size_t index; + unsigned short firstSymbol; + std::vector symbols; + std::vector loBytes; + std::vector symShorts; + void buildBytes(); + bool verifyInstruction(); +}; + +struct SortedShortElement { + size_t index; + ShortCopy copy; + bool isRun = false; + bool isCopy = false; + SortedShortElement(); + SortedShortElement(size_t index, ShortCopy copy); +}; + +struct CompressedImage { + std::string fileName; + CompressionMode mode; + size_t lzSize; + size_t loSize; + size_t symSize; + size_t bitreamSize = 0; + size_t rawNumBytes; + int initialState; + std::vector headers; + unsigned int loFreqs[3]; + unsigned int symFreqs[3]; + size_t compressedSize; + bool isValid = false; + std::vector writeVec; + std::vector tANSbits; + std::vector otherBits; + std::vector symVec; + std::vector loVec; +}; + +struct InputSettings { + bool canEncodeLO = true; + bool canEncodeSyms = true; + bool canDeltaSyms = true; + bool shouldCompare = false; + bool useFrames = false; + InputSettings(); + InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms); +}; + +struct DataVecs { + std::vector loVec; + std::vector symVec; +}; + +void analyzeImages(std::vector *allImages, std::mutex *imageMutex, FileDispatcher *dispatcher, std::mutex *dispatchMutex, InputSettings settings); + +CompressedImage processImage(std::string fileName, InputSettings settings); +CompressedImage processImageFrames(std::string fileName, InputSettings settings); +CompressedImage processImageData(std::vector input, InputSettings settings, std::string fileName); + +std::vector readFileAsUInt(std::string filePath); + +size_t getCompressedSize(CompressedImage *pImage); + +std::vector getShortCopies(std::vector input, size_t minLength); +bool verifyShortCopies(std::vector *pCopies, std::vector *pImage); + +std::vector getNormalizedCounts(std::vector input); +std::vector getFreqWriteInts(std::vector input); +std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength); +int findInitialState(EncodeCol encodeCol, unsigned char firstSymbol); +CompressedImage fillCompressVecNew(std::vector loVec, std::vector symVec, CompressionMode mode, size_t imageBytes, std::string name); +std::vector getShortInstructions(std::vector copies, size_t lengthMod); +std::vector getLosFromInstructions(std::vector instructions); +std::vector getSymsFromInstructions(std::vector instructions); +std::vector unpackFrequencies(unsigned int pInts[3]); +CompressedImage getDataFromUIntVec(std::vector *pInput); +CompressedImage readNewHeader(std::vector *pInput); +std::vector getUIntVecFromData(CompressedImage *pImage); + +std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec); +std::vector decodeImageShort(CompressedImage *pInput); +DataVecs decodeDataVectorsNew(CompressedImage *pInput); + +size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles); + +bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2); + +bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage); +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage); +bool verifyUIntVecShort(std::vector *pInput, std::vector *pImage); + +std::vector readRawDataVecs(std::vector *pInput); + +bool isModeLoEncoded(CompressionMode mode); +bool isModeSymEncoded(CompressionMode mode); +bool isModeSymDelta(CompressionMode mode); + +void deltaEncode(std::vector *buffer, int length); +void deltaDecode(std::vector *buffer, int length); + +std::vector getTestFreqs(std::vector freqs, std::string name); +#endif diff --git a/tools/compresSmol/compressSmolTiles.cpp b/tools/compresSmol/compressSmolTiles.cpp new file mode 100644 index 0000000000..f8c14e7b38 --- /dev/null +++ b/tools/compresSmol/compressSmolTiles.cpp @@ -0,0 +1,264 @@ +#include "compressSmolTiles.h" +#include + +std::vector readFileAsUS(std::string filePath) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return std::vector(0); + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + std::vector ucVec(size); + iStream.read((char*)(&ucVec[0]), size); + iStream.close(); + unsigned short *pUInt = reinterpret_cast(ucVec.data()); + std::vector returnVec; + for (size_t i = 0; i < ucVec.size()/2; i++) + returnVec.push_back(pUInt[i]); + return returnVec; +} + +void deltaEncodeTileNums(std::vector *pTileNums) +{ + unsigned short prevVal = 0; + for (size_t i = 0; i < pTileNums->size(); i++) + { + unsigned short current = (*pTileNums)[i]; + (*pTileNums)[i] = (current - prevVal); + prevVal = current; + } +} + +CompressionResult compressTileset(std::string fileName) +{ + CompressionResult result; + result.tilemapSize = 0; + std::vector tiles = readFileAsUS(fileName); + std::vector origTiles = tiles; + if (tiles.size() == 0) + return result; + result.tilemapSize = tiles.size()*2; + deltaEncodeTileNums(&tiles); + result.vecs = compressVector(&tiles); + result.header = getHeader(result); + result.writeVec = getWriteVecs(result); + if (!verifyTileCompression(result.writeVec, origTiles)) + { + fprintf(stderr, "Tilemap verification failed for %s\n", fileName.c_str()); + result.failed = true; + } + return result; +} + +void deltaDecodeTileNums(std::vector *pTileNums) +{ + unsigned short prevVal = 0; + for (size_t i = 0; i < pTileNums->size(); i++) + { + unsigned short delta = (*pTileNums)[i]; + (*pTileNums)[i] = (delta + prevVal); + prevVal = (*pTileNums)[i]; + } +} + +std::vector decompressVector(std::vector *pVec) +{ + std::vector returnVec; + for (size_t i = 0; i < pVec->size(); i+=3) + { + unsigned short length = (*pVec)[i]; + unsigned short offset = (*pVec)[i + 1]; + if (length != 0) + { + returnVec.push_back((*pVec)[i + 2]); + for (size_t j = 0; j < length; j++) + returnVec.push_back(returnVec[returnVec.size() - offset]); + } + else + { + returnVec.push_back((*pVec)[i + 2]); + } + } + return returnVec; +} + +CompressVectors compressVector(std::vector *pVec) +{ + CompressVectors vecs; + std::vector shortCopies = getShortCopies(*pVec, 2); + if (!verifyShortCopies(&shortCopies, pVec)) + { + fprintf(stderr, "Error getting tile-number compression\n"); + return vecs; + } + std::vector shortInstructions = getShortInstructions(shortCopies, 0); + std::vector loVec = getLosFromInstructions(shortInstructions); + std::vector symVec = getSymsFromInstructions(shortInstructions); + + if (!verifyBytesShort(&loVec, &symVec, pVec)) + { + fprintf(stderr, "Error verifying tile-number compression\n"); + return vecs; + } + vecs.loVec = loVec; + vecs.symVec = symVec; + + return vecs; +} + +size_t getTotalSize(std::vector *input) +{ + size_t totalSize = 0; + for (size_t i = 0; i < 3; i++) + { + if ((*input)[i].loVec.size() == 0) + return 0; + if ((*input)[i].symVec.size() == 0) + return 0; + totalSize += (*input)[i].loVec.size(); + totalSize += (*input)[i].symVec.size(); + } + return totalSize; +} + +TileHeader getHeader(CompressionResult compression) +{ + TileHeader header; + header.mode = IS_TILEMAP; + header.tilemapSize = compression.tilemapSize; + header.symbolSize = compression.vecs.symVec.size(); + header.loSize = compression.vecs.loVec.size(); + header.header[0] = header.mode; + header.header[0] |= header.tilemapSize << 4; + header.header[0] |= header.symbolSize << 18; + header.header[1] = header.loSize; + return header; +} + +std::vector getWriteVecs(CompressionResult compression) +{ + std::vector returnVec; + returnVec.push_back(compression.header.header[0]); + returnVec.push_back(compression.header.header[1]); + unsigned int tempInt = 0; + bool containsData = false; + for (size_t i = 0; i < compression.header.symbolSize; i++) + { + unsigned int currData = compression.vecs.symVec[i]; + if (containsData) + currData = currData << 16; + tempInt += currData; + containsData = true; + if ((i+1) % 2 == 0) + { + returnVec.push_back(tempInt); + tempInt = 0; + containsData = false; + } + } + if (containsData) + returnVec.push_back(tempInt); + containsData = false; + tempInt = 0; + size_t totalLOs = compression.header.loSize; + for (size_t i = 0; i < totalLOs; i++) + { + unsigned int currData = compression.vecs.loVec[i] << (8*(i % 4)); + tempInt += currData; + containsData = true; + if ((i+1) % 4 == 0) + { + returnVec.push_back(tempInt); + tempInt = 0; + containsData = false; + } + } + if (containsData) + { + returnVec.push_back(tempInt); + } + return returnVec; +} + +TileHeader readTileHeader(unsigned int *data) +{ + TileHeader header; + header.mode = (CompressionMode)(data[0] & 0xf); + header.tilemapSize = (data[0] >> 4) & 0x3fff; + header.symbolSize = (data[0] >> 18) & 0x3fff; + header.loSize = data[1]; + return header; +} + +bool verifyTileCompression(std::vector compression, std::vector input) +{ + TileHeader header = readTileHeader(compression.data()); + std::vector tileNumbers; + std::vector symVec; + std::vector loVec; + for (size_t i = 2; i < compression.size(); i++) + { + symVec.push_back(compression[i] & 0xffff); + symVec.push_back(compression[i] >> 16); + loVec.push_back(compression[i] & 0xff); + loVec.push_back((compression[i] >> 8) & 0xff); + loVec.push_back((compression[i] >> 16) & 0xff); + loVec.push_back((compression[i] >> 24) & 0xff); + } + size_t loCount = 0; + size_t symIndex = 0; + size_t loStartIndex = header.symbolSize*2 + (header.symbolSize % 2) * 2; + while (loCount < header.loSize) + { + size_t currLength = loVec[loStartIndex + loCount]; + loCount++; + if (currLength & LO_CONTINUE_BIT) + { + currLength -= LO_CONTINUE_BIT; + currLength += loVec[loStartIndex + loCount] << 7; + loCount++; + } + size_t currOffset = loVec[loStartIndex + loCount]; + loCount++; + if (currOffset & LO_CONTINUE_BIT) + { + currOffset -= LO_CONTINUE_BIT; + currOffset += loVec[loStartIndex + loCount] << 7; + loCount++; + } + if (currLength != 0) + { + tileNumbers.push_back(symVec[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + { + tileNumbers.push_back(tileNumbers[tileNumbers.size() - currOffset]); + } + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + tileNumbers.push_back(symVec[symIndex]); + symIndex++; + } + } + } + + deltaDecodeTileNums(&tileNumbers); + if (tileNumbers.size() != input.size()) + return false; + std::vector fullVec; + for (size_t i = 0; i < tileNumbers.size(); i++) + fullVec.push_back(tileNumbers[i]); + for (size_t i = 0; i < fullVec.size(); i++) + if (fullVec[i] != input[i]) + return false; + return true; +} diff --git a/tools/compresSmol/compressSmolTiles.h b/tools/compresSmol/compressSmolTiles.h new file mode 100644 index 0000000000..1585baad86 --- /dev/null +++ b/tools/compresSmol/compressSmolTiles.h @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include "compressAlgo.h" + +// LO size 1, 964, 11 bits +// LO size 2, 198, 9 bits +// LO size 3, 286, 10 bits +// 4 bits mode +// tilemap size 14 bits +// symbol size 14 bits + +struct VecSizes +{ + size_t tileSize; + size_t flipSize; + size_t palSize; +}; + +struct TileHeader +{ + CompressionMode mode; + unsigned int tilemapSize; + unsigned int symbolSize; + unsigned int loSize; + unsigned int header[2]; +}; + +struct CompressVectors +{ + std::vector loVec; + std::vector symVec; +}; + +struct CompressionResult +{ + size_t tilemapSize; + size_t compressedSize = 0; + CompressVectors vecs; + TileHeader header; + std::vector writeVec; + bool failed = false; +}; + +std::vector readFileAsUS(std::string filePath); + +CompressionResult compressTileset(std::string fileName); +void deltaEncodeTileNums(std::vector *pTileNums); +void deltaDecodeTileNums(std::vector *pTileNums); + +CompressVectors compressVector(std::vector *pVec); +std::vector refineCompression(std::vector *pVec); +std::vector decompressVector(std::vector *pVec); +size_t getTotalSize(std::vector *input); +TileHeader getHeader(CompressionResult compression); +TileHeader readTileHeader(unsigned int *data); +std::vector getWriteVecs(CompressionResult compression); + +bool verifyTileCompression(std::vector compression, std::vector input); diff --git a/tools/compresSmol/fileDispatcher.cpp b/tools/compresSmol/fileDispatcher.cpp new file mode 100644 index 0000000000..099dbad9bb --- /dev/null +++ b/tools/compresSmol/fileDispatcher.cpp @@ -0,0 +1,45 @@ +#include "fileDispatcher.h" + +FileDispatcher::FileDispatcher(std::filesystem::path inPath) +{ + setFilePath(inPath); +} + +void FileDispatcher::setFilePath(std::filesystem::path inPath) +{ + filePath = inPath; +} + +bool FileDispatcher::initFileList() +{ + std::string fileName; + for (const std::filesystem::directory_entry &dirEntry : std::filesystem::recursive_directory_iterator(filePath)) + { + if (dirEntry.is_regular_file()) + { + fileName = dirEntry.path().string(); + if (fileName.find(".4bpp.lz") == std::string::npos) + continue; + } + else + { + continue; + } + fileList.push_back(fileName); + } + + if (fileList.size() == 0) + return false; + else + return true; +} + +std::string FileDispatcher::requestFileName() +{ + if (currentIndex >= fileList.size()) + return ""; + std::string returnString = fileList[currentIndex]; + std::cout << "Dispatching index " << currentIndex << ": " << returnString << "\n"; + currentIndex++; + return returnString; +} diff --git a/tools/compresSmol/fileDispatcher.h b/tools/compresSmol/fileDispatcher.h new file mode 100644 index 0000000000..b9cc549203 --- /dev/null +++ b/tools/compresSmol/fileDispatcher.h @@ -0,0 +1,22 @@ +#ifndef FILE_DISPATCHER +#define FILE_DISPATCHER +#include +#include +#include +#include +#include +#include + +class FileDispatcher { + std::vector fileList; + int currentIndex = 0; + std::mutex requestMutex; + std::filesystem::path filePath; +public: + FileDispatcher(); + FileDispatcher(std::filesystem::path inPath); + void setFilePath(std::filesystem::path inPath); + bool initFileList(); + std::string requestFileName(); +}; +#endif diff --git a/tools/compresSmol/mainTiles.cpp b/tools/compresSmol/mainTiles.cpp new file mode 100644 index 0000000000..1fa083446a --- /dev/null +++ b/tools/compresSmol/mainTiles.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include "compressSmolTiles.h" + +int main(int argc, char *argv[]) +{ + if (argc == 3) + { + std::string inputName = argv[1]; + std::string outputName = argv[2]; + CompressionResult compression = compressTileset(inputName); + if (compression.failed) + return 1; + std::ofstream fileOut(outputName, std::ios::out | std::ios::binary); + fileOut.write(reinterpret_cast(compression.writeVec.data()), compression.writeVec.size()*4); + fileOut.close(); + return 0; + } + else if (argc == 2) + { + std::filesystem::path filePath = argv[1]; + std::string fileName; + std::vector fileList; + for (const std::filesystem::directory_entry &dirEntry : std::filesystem::recursive_directory_iterator(filePath)) + { + if (dirEntry.is_regular_file()) + { + fileName = dirEntry.path().string(); + if (fileName.find(".bin.lz") == std::string::npos) + continue; + } + else + { + continue; + } + fileList.push_back(fileName); + } + size_t totalSize = 0; + size_t lzSize = 0; + size_t rawSize = 0; + for (std::string fullName : fileList) + { + std::string baseName = fullName; + baseName.pop_back(); + baseName.pop_back(); + baseName.pop_back(); + CompressionResult compressedTilemap = compressTileset(baseName); + size_t currSize = 0; + currSize += compressedTilemap.writeVec.size() * 4; + if (currSize !=0) + { + totalSize += currSize; + lzSize += getFileSize(fullName); + rawSize += getFileSize(baseName); + } + else + { + printf("%s\n", baseName.c_str()); + } + } + printf("Raw size: %zu\n", rawSize); + printf("LZ size: %zu\n", lzSize); + printf("New size: %zu\n", totalSize); + return 0; + } + else + { + return 0; + } +} diff --git a/tools/compresSmol/tANS.cpp b/tools/compresSmol/tANS.cpp new file mode 100644 index 0000000000..40abd8a658 --- /dev/null +++ b/tools/compresSmol/tANS.cpp @@ -0,0 +1,318 @@ +#include "tANS.h" + +std::vector createDecodingTable(std::vector symbols, std::vector frequencies) +{ + std::vector table(TANS_TABLE_SIZE); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < frequencies[i]; j++) + { + table[currCol].state = TANS_TABLE_SIZE + currCol; + table[currCol].symbol = symbols[i]; + table[currCol].y = frequencies[i] + j; + int currK = 0; + while ((table[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + table[currCol].k = currK; + currCol++; + } + } + return table; +} + +std::vector createEncodingTable(std::vector decodeTable, std::vector symbols) +{ + std::vector encodeTable(decodeTable.size()); + for (int i = 0; i < decodeTable.size(); i++) + { + encodeTable[i].state = decodeTable.size() + i; + } + std::vector encodeHelpers; + + // Build the encoding helper tables, one per symbol + for (unsigned char symbol : symbols) + { + EncodeHelper newHelper; + newHelper.symbol = symbol; + encodeHelpers.push_back(newHelper); + } + + for (DecodeCol dCol : decodeTable) + { + unsigned char currSymbol = dCol.symbol; + int symbolIndex = 0; + while (encodeHelpers[symbolIndex].symbol != currSymbol) + { + symbolIndex++; + } + encodeHelpers[symbolIndex].states.push_back(dCol.state); + encodeHelpers[symbolIndex].yVals.push_back(dCol.y); + encodeHelpers[symbolIndex].kVals.push_back(dCol.k); + encodeHelpers[symbolIndex].yPrimVals.push_back(dCol.y << dCol.k); + } + // Build the encoding table, one column per state in decoding table + for (int helperNum = 0; helperNum < encodeHelpers.size(); helperNum++) + { + for (int i = 0; i < encodeHelpers[helperNum].states.size(); i++) + { + EncodeSymbolData currSymbol; + currSymbol.symbol = encodeHelpers[helperNum].symbol; + currSymbol.streamValue = 0; + currSymbol.numBits = encodeHelpers[helperNum].kVals[i]; + currSymbol.nextState = encodeHelpers[helperNum].states[i]; + int currIndex = encodeHelpers[helperNum].yPrimVals[i]-encodeTable.size(); + encodeTable[currIndex].symbols.push_back(currSymbol); + int limit = std::pow(2, currSymbol.numBits); + for (int j = 1; j < limit; j++) + { + currSymbol.streamValue++; + encodeTable[currIndex + j].symbols.push_back(currSymbol); + } + } + } + + return encodeTable; +} + +EncodedData encodeData(std::vector input, std::vector encodingTable) +{ + EncodedData data; + int state; + // Reverse the input, since ANS operates in FILO mode + std::vector reverseInput(input.size()); + for (int i = 0; i < input.size(); i++) + { + reverseInput[input.size() - 1 - i] = input[i]; + } + // Encode the string + int currentOffsetState = 0; + for (int i = 0; i < reverseInput.size(); i++) + { + unsigned char currChar = reverseInput[i]; + // Find correct encoding instruction for the symbol + for (EncodeSymbolData eSymbols : encodingTable[currentOffsetState].symbols) + { + if (eSymbols.symbol == currChar) + { + // Encode the symbol + state = eSymbols.nextState; + if (i == 0) + break; + int streamValue = eSymbols.streamValue; + int compVal = 1; + for (int numBit = eSymbols.numBits-1; numBit >= 0; numBit--) + { + unsigned char currBit = (streamValue >> numBit) & compVal; + data.bitStream.push_back(currBit); + } + break; + } + } + currentOffsetState = state - encodingTable.size(); + } + data.initialState = state; + + return data; +} + +int encodeSingleSymbol(EncodeCol currEncodeCol, unsigned char symbol, std::vector *bitstream) +{ + int newState; + for (EncodeSymbolData eSymbols : currEncodeCol.symbols) + { + if (eSymbols.symbol == symbol) + { + newState = eSymbols.nextState; + int streamValue = eSymbols.streamValue; + int compVal = 1; + for (int numBit = eSymbols.numBits-1; numBit >= 0; numBit--) + { + unsigned char currBit = (streamValue >> numBit) & compVal; + bitstream->push_back(currBit); + } + break; + } + } + return newState; +} + +std::vector decodeData(EncodedData *data, std::vector decodeTable, int numChars) +{ + unsigned int tableSize = decodeTable.size(); + unsigned int state = data->initialState; + std::vector returnVec(numChars); + returnVec[0] = decodeTable[state-tableSize].symbol; + for (int i = 1; i < numChars; i++) + { + unsigned int currY = decodeTable[state-tableSize].y; + unsigned int currK = decodeTable[state-tableSize].k; + unsigned int streamValue = 0; + // Horrible way of reading a value from the bitstream + for (int j = 0; j < currK; j++) + { + unsigned int tempVal; + bool val = data->bitStream.back(); + data->bitStream.pop_back(); + if (val) + tempVal = 1; + else + tempVal = 0; + streamValue += (tempVal << j); + } + // Calculate the next state and retrieve the symbol for that state + state = (currY << currK) + streamValue; + returnVec[i] = decodeTable[state-tableSize].symbol; + } + data->initialState = state; + return returnVec; +} + +std::vector normalizeCounts(std::vector counts, int tableSize) +{ + return normalizeCounts(counts, tableSize, false); +} +std::vector normalizeCounts(std::vector counts, int tableSize, bool fillZeros) +{ + int totalCount = 0; + for (int count : counts) + { + totalCount += count; + } + if (totalCount < tableSize) + { + for (int i = 0; i < counts.size(); i++) + { + counts[i] *= (int)ceil((float)tableSize/(float)totalCount); + } + } + if (fillZeros) + for (int i = 0; i < counts.size(); i++) + if (counts[i] == 0) + counts[i] = 1; + + totalCount = 0; + for (int count : counts) + { + totalCount += count; + } + + bool shouldContinue = true; + std::vector normCounts(counts.size()); + while (shouldContinue) + { + int smallestCount; + int smallestIndex; + int firstIndex; + int largestCount = 0; + for (int i = 0; i < counts.size(); i++) + { + if (counts[i] != 0) + { + firstIndex = i; + smallestIndex = i; + smallestCount = counts[i]; + break; + } + } + for (int i = firstIndex; i < counts.size(); i++) + { + if (counts[i] < smallestCount && counts[i] != 0) + { + smallestCount = counts[i]; + smallestIndex = i; + } + if (counts[i] > largestCount) + { + largestCount = counts[i]; + } + } + if (largestCount == 0) + { + shouldContinue = false; + } + else + { + float frac = float(smallestCount)/float(totalCount); + int newCount = std::round(frac*float(tableSize)); + if (newCount == 0 and counts[smallestIndex] != 0) + { + newCount = 1; + } + normCounts[smallestIndex] = newCount; + tableSize -= newCount; + totalCount -= smallestCount; + counts[smallestIndex] = 0; + } + } + return normCounts; +} + +void printEncodeTable(std::vector encodeTable, std::vector symbols) +{ + printf(" x: "); + for (int i = 0; i < encodeTable.size(); i++) + { + printf("%3zu ", i+encodeTable.size()); + } + printf("\n"); + for (int i = 0; i < symbols.size(); i++) + { + printf("%3hhu s: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].nextState); + } + printf("\n"); + printf("%3hhu b: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].streamValue); + } + printf("\n"); + printf("%3hhu k: ", symbols[i]); + for (int k = 0; k < encodeTable.size(); k++) + { + printf("%3i ", encodeTable[k].symbols[i].numBits); + } + printf("\n"); + } +} + +void printDecodeTable(std::vector decodeTable) +{ + printf("State: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.state); + printf("\n"); + printf(" Sym: "); + for (DecodeCol currCol : decodeTable) + printf("%3hhu ", currCol.symbol); + printf("\n"); + printf(" Y: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.y); + printf("\n"); + printf(" K: "); + for (DecodeCol currCol : decodeTable) + printf("%3i ", currCol.k); + printf("\n"); +} + +int getFileSize(std::string filePath) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading file size\n", filePath.c_str()); + return 0; + } + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + int returnSize = size; + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + iStream.close(); + return returnSize; +} diff --git a/tools/compresSmol/tANS.h b/tools/compresSmol/tANS.h new file mode 100644 index 0000000000..a85e068098 --- /dev/null +++ b/tools/compresSmol/tANS.h @@ -0,0 +1,63 @@ +#ifndef TANS_H +#define TANS_H +#include +#include +#include +#include +#include +#include +#include +#include + +#define TANS_TABLE_SIZE 64 + +struct DecodeCol { + int state; + unsigned char symbol; + int y; + int k; +}; + +struct EncodeHelper { + unsigned char symbol; + std::vector states; + std::vector yVals; + std::vector kVals; + std::vector yPrimVals; + int currentRepeat = 0; + int currentIndex = 0; +}; + +struct EncodeSymbolData { + unsigned char symbol; + int nextState; + int streamValue; + int numBits; +}; +struct EncodeCol { + int state; + std::vector symbols; +}; + +struct EncodedData { + int initialState; + std::vector bitStream; +}; + +std::vector createDecodingTable(std::vector symbols, std::vector frequencies); + +std::vector createEncodingTable(std::vector decodeTable, std::vector symbols); + +EncodedData encodeData(std::vector input, std::vector encodingTable); +std::vector decodeData(EncodedData *data, std::vector decodeTable, int numChars); + +std::vector normalizeCounts(std::vector counts, int tableSize); +std::vector normalizeCounts(std::vector counts, int tableSize, bool fillZeros); + +void printEncodeTable(std::vector encodeTable, std::vector symbols); +void printDecodeTable(std::vector decodeTable); + +int getFileSize(std::string filePath); +int encodeSingleSymbol(EncodeCol currEncodeCol, unsigned char symbol, std::vector *bitstream); + +#endif From fa342b2909d75163473da08fab462a119135c6e6 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 31 May 2025 07:45:46 +0100 Subject: [PATCH 016/248] Fixes Defiant/Competitive not resetting stat change animations and stat change related cleanup (#7004) --- data/battle_scripts_1.s | 223 ++++++++++++++------- include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 29 ++- src/battle_util.c | 3 +- test/battle/ability/defiant.c | 36 +++- test/battle/ability/soul_heart.c | 19 ++ test/battle/move_effect/octolock.c | 6 +- 7 files changed, 236 insertions(+), 82 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9625033c81..4acd4a5ffe 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -75,20 +75,22 @@ BattleScript_LowerAtkSpAtk:: jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkDoAnim jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd BattleScript_LowerAtkSpAtkDoAnim:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE + playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkTrySpAtk:: + playstatchangeanimation BS_EFFECT_BATTLER, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_EffectSpicyExtract:: @@ -110,7 +112,6 @@ BattleScript_SpicyExtract_RaiseAtk: attackanimation waitanimation BattleScript_SpicyExtract_SkipAttackAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown @@ -118,7 +119,6 @@ BattleScript_SpicyExtract_SkipAttackAnim: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtractDefenseDown: - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End @@ -126,6 +126,7 @@ BattleScript_EffectSpicyExtractDefenseDown: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtract_End: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectTidyUp:: @@ -194,18 +195,20 @@ BattleScript_FilletAwayTryAttack:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_BY_TWO + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpAtk:: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd printfromtable gStatUpStringIds @@ -214,6 +217,7 @@ BattleScript_FilletAwayEnd:: clearmoveresultflags MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectDoodle:: @@ -876,17 +880,20 @@ BattleScript_EffectOctolock:: goto BattleScript_MoveEnd BattleScript_OctolockEndTurn:: - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE + playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctolockTryLowerSpDef: + playstatchangeanimation BS_TARGET, BIT_SPDEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPDEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctlockTurnDmgEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE end2 BattleScript_EffectPoltergeist:: @@ -1014,19 +1021,21 @@ BattleScript_EffectDecorate:: BattleScript_DecorateBoost: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0x0 + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DecorateBoostSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DecorateBoostSpAtk: + playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCoaching:: @@ -1045,19 +1054,21 @@ EffectCoaching_CheckAllyStats: BattleScript_CoachingWorks: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, 0x0 + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoachingBoostDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoachingBoostDef: + playstatchangeanimation BS_TARGET, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectJungleHealing:: @@ -1272,26 +1283,29 @@ BattleScript_VCreateStatLoss:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_VCreateStatLossRet BattleScript_VCreateStatAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_SpectralThiefSteal:: @@ -1333,7 +1347,6 @@ BattleScript_EffectPartingShotTryAtk: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE @@ -1347,6 +1360,7 @@ BattleScript_EffectPartingShotTrySpAtk: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: + setbyte sSTAT_ANIM_PLAYED, FALSE moveendall goto BattleScript_MoveSwitchPursuitEnd @@ -1405,8 +1419,8 @@ BattleScript_EffectMagneticFluxTryDef: attackanimation waitanimation BattleScript_EffectMagneticFluxSkipAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, 0 + playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxTrySpDef @@ -1414,6 +1428,7 @@ BattleScript_EffectMagneticFluxSkipAnim: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxTrySpDef: + playstatchangeanimation BS_TARGET, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxLoop @@ -1421,6 +1436,7 @@ BattleScript_EffectMagneticFluxTrySpDef: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxLoop: + setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectMagneticFluxEnd setallytonexttarget BattleScript_EffectMagneticFluxStart BattleScript_EffectMagneticFluxEnd: @@ -1444,8 +1460,8 @@ BattleScript_EffectGearUpTryAtk: attackanimation waitanimation BattleScript_EffectGearUpSkipAnim: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0 + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpTrySpAtk @@ -1453,6 +1469,7 @@ BattleScript_EffectGearUpSkipAnim: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpTrySpAtk: + playstatchangeanimation BS_TARGET, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpLoop @@ -1460,6 +1477,7 @@ BattleScript_EffectGearUpTrySpAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpLoop: + setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectGearUpEnd setallytonexttarget BattleScript_EffectGearUpStart BattleScript_EffectGearUpEnd: @@ -1551,20 +1569,22 @@ BattleScript_RototillerLoop: jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats BattleScript_RototillerCheckAffected: jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0 + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: + playstatchangeanimation BS_TARGET, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerMoveTargetEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerMoveTargetEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE moveendto MOVEEND_NEXT_TARGET addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RototillerLoop @@ -1872,7 +1892,6 @@ BattleScript_VenomDrenchDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE @@ -1895,6 +1914,7 @@ BattleScript_VenomDrenchTryLowerSpeed:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectNobleRoar:: @@ -1907,7 +1927,6 @@ BattleScript_NobleRoarDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE @@ -1923,6 +1942,7 @@ BattleScript_NobleRoarTryLowerSpAtk:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectShellSmash:: @@ -1937,14 +1957,15 @@ BattleScript_EffectShellSmash:: BattleScript_ShellSmashTryDef:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpDef: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTryAttack jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTryAttack @@ -1952,25 +1973,29 @@ BattleScript_ShellSmashTrySpDef: waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTryAttack: setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_ATK | BIT_SPEED, STAT_CHANGE_BY_TWO + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_ATK | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpAtk: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpeed: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectLastResort:: @@ -1990,12 +2015,14 @@ BattleScript_EffectGrowth:: BattleScript_GrowthDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE goto BattleScript_GrowthAtk BattleScript_GrowthAtk2: + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE BattleScript_GrowthAtk: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk @@ -2004,9 +2031,11 @@ BattleScript_GrowthAtk: waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2 + playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_GrowthSpAtk BattleScript_GrowthSpAtk2: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE BattleScript_GrowthSpAtk: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd @@ -2014,6 +2043,7 @@ BattleScript_GrowthSpAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectSoak:: @@ -2064,13 +2094,14 @@ BattleScript_EffectShiftGear:: BattleScript_ShiftGearDoMoveAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, 10, BattleScript_ShiftGearSpeedBy1 - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_BY_TWO + playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_ShiftGearDoSpeed BattleScript_ShiftGearSpeedBy1: - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, 0 + playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE BattleScript_ShiftGearDoSpeed: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk @@ -2078,12 +2109,14 @@ BattleScript_ShiftGearDoSpeed: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearTryAtk: + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCoil:: @@ -2096,26 +2129,29 @@ BattleScript_EffectCoil:: BattleScript_CoilDoMoveAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryDef: + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryAcc: + playstatchangeanimation BS_ATTACKER, BIT_ACC, 0 setstatchanger STAT_ACC, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectQuiverDance:: @@ -2128,26 +2164,29 @@ BattleScript_EffectQuiverDance:: BattleScript_QuiverDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0 + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectVictoryDance:: @@ -2160,26 +2199,29 @@ BattleScript_EffectVictoryDance:: BattleScript_VictoryDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTryDef:: + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTrySpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectMeFirst:: @@ -2199,20 +2241,22 @@ BattleScript_EffectAttackSpAttackUp:: BattleScript_AttackSpAttackUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpTrySpAtk:: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectAttackAccUp:: @@ -2224,20 +2268,22 @@ BattleScript_EffectAttackAccUp:: BattleScript_AttackAccUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_ACC, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_ACC, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpTryAcc:: + playstatchangeanimation BS_ATTACKER, BIT_ACC, 0 setstatchanger STAT_ACC, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectMistyTerrain:: @@ -3563,26 +3609,29 @@ BattleScript_GeomancySecondTurn: BattleScript_GeomancyDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0 + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_FirstChargingTurn:: @@ -3983,7 +4032,6 @@ BattleScript_CurseTrySpeed:: setbyte sB_ANIM_TURN, 1 attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack @@ -3991,17 +4039,20 @@ BattleScript_CurseTrySpeed:: waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryAttack:: setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryDefense:: + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_GhostCurse:: jumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse @@ -4555,20 +4606,22 @@ BattleScript_EffectStockpile:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_EffectStockpileDef jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_EffectStockpileEnd BattleScript_EffectStockpileDef: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE stockpile 1 goto BattleScript_MoveEnd @@ -4714,7 +4767,6 @@ BattleScript_EffectMemento:: attackanimation waitanimation jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, TRUE @@ -4732,6 +4784,7 @@ BattleScript_EffectMementoTrySpAtk: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTryFaint: + setbyte sSTAT_ANIM_PLAYED, FALSE tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectMementoPrintNoEffect: @@ -4749,6 +4802,7 @@ BattleScript_MementoTargetProtectEnd: effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG + setbyte sSTAT_ANIM_PLAYED, FALSE tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd @@ -5077,7 +5131,6 @@ BattleScript_TickleDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE @@ -5093,6 +5146,7 @@ BattleScript_TickleTryLowerDef:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_CantLowerMultipleStats:: @@ -5111,20 +5165,22 @@ BattleScript_EffectCosmicPower:: BattleScript_CosmicPowerDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectBulkUp:: @@ -5136,20 +5192,22 @@ BattleScript_EffectBulkUp:: BattleScript_BulkUpDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCalmMind:: @@ -5163,20 +5221,22 @@ BattleScript_CalmMindDoMoveAnim:: attackanimation waitanimation BattleScript_CalmMindStatRaise:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_CantRaiseMultipleStats:: @@ -5196,20 +5256,22 @@ BattleScript_EffectDragonDanceFromStatUp:: BattleScript_DragonDanceDoMoveAnim:: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCamouflage:: @@ -5868,14 +5930,15 @@ BattleScript_WeaknessPolicy:: BattleScript_WeaknessPolicyAtk: playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicySpAtk printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicySpAtk: + playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicyRemoveItem @@ -5884,6 +5947,7 @@ BattleScript_WeaknessPolicySpAtk: BattleScript_WeaknessPolicyRemoveItem: removeitem BS_TARGET BattleScript_WeaknessPolicyEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_TargetItemStatRaise:: @@ -6175,7 +6239,6 @@ BattleScript_AngerShellActivates:: jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_RestoreAttackerButItFailed BattleScript_AngerShellTryDef:: - setbyte sSTAT_ANIM_PLAYED, FALSE modifybattlerstatstage BS_ATTACKER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON BattleScript_AngerShellTrySpDef: modifybattlerstatstage BS_ATTACKER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON @@ -6188,6 +6251,7 @@ BattleScript_AngerShellTrySpeed: modifybattlerstatstage BS_ATTACKER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON BattleScript_AngerShellRet: restoreattacker + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_WindPowerActivates:: @@ -6236,33 +6300,38 @@ BattleScript_AllStatsUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet BattleScript_AllStatsUpAtk:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpDef:: + playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpAtk:: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpRet:: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_RapidSpinAway:: @@ -6547,7 +6616,6 @@ BattleScript_PrintMonIsRootedRet:: return BattleScript_AtkDefDown:: - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE @@ -6563,10 +6631,10 @@ BattleScript_AtkDefDownTryDef: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownRet: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_DefSpDefDown:: - setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE @@ -6582,6 +6650,7 @@ BattleScript_DefSpDefDownTrySpDef:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownRet:: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_DefDownSpeedUp:: @@ -7355,14 +7424,22 @@ BattleScript_DrizzleActivates:: BattleScript_AbilityRaisesDefenderStat:: pause B_WAIT_TIME_SHORT + statbuffchange 0, BattleScript_AbilityCantRaiseDefenderStat call BattleScript_AbilityPopUp - statbuffchange 0, NULL setgraphicalstatchangevalues playanimation BS_ABILITY_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG return +BattleScript_AbilityCantRaiseDefenderStat:: + saveattacker + copybyte gBattlerAttacker, gBattlerTarget + printstring STRINGID_STATSWONTINCREASE + waitmessage B_WAIT_TIME_LONG + restoreattacker + return + BattleScript_AbilityPopUpTarget:: copybyte gBattlerAbility, gBattlerTarget BattleScript_AbilityPopUp:: @@ -7838,32 +7915,36 @@ BattleScript_CommanderActivates:: printstring STRINGID_COMMANDERACTIVATES waitmessage B_WAIT_TIME_LONG BattleScript_CommanderAtkIncrease: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderDefIncrease: + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpAtkIncrease: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpDefIncrease: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpeedIncrease: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd @@ -7871,6 +7952,7 @@ BattleScript_CommanderSpeedIncrease: waitmessage B_WAIT_TIME_LONG BattleScript_CommanderEnd: restoreattacker + setbyte sSTAT_ANIM_PLAYED, FALSE end3 BattleScript_HospitalityActivates:: @@ -9266,33 +9348,38 @@ BattleScript_EffectExtremeEvoboost:: BattleScript_ExtremeEvoboostAnim: attackanimation waitanimation - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0x0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostDef:: + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpeed:: + playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpAtk:: + playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostEnd:: + setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectHitSetRemoveTerrain:: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 2b0287be40..b892baedad 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -220,7 +220,7 @@ enum CmdVarious #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) // Cmd_statbuffchange -#define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. Set in every use of statbuffchange +#define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. If not set and unable to raise/lower stats, jump to failInstr. #define STAT_CHANGE_MIRROR_ARMOR (1 << 1) // Stat change redirection caused by Mirror Armor ability. #define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 5) #define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 6) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 88f3cfba54..de85c43950 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5961,6 +5961,13 @@ static void Cmd_playstatchangeanimation(void) u32 battler = GetBattlerForBattleScript(cmd->battler); u32 ability = GetBattlerAbility(battler); u32 stats = cmd->stats; + bool32 defiantCompetitiveAffected = FALSE; + + if (gBattleScripting.statAnimPlayed) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } // Handle Contrary and Simple if (ability == ABILITY_CONTRARY) @@ -5973,6 +5980,10 @@ static void Cmd_playstatchangeanimation(void) flags |= STAT_CHANGE_BY_TWO; RecordAbilityBattle(battler, ability); } + else if (ability == ABILITY_DEFIANT || ability == ABILITY_COMPETITIVE) + { + defiantCompetitiveAffected = TRUE; + } if (flags & STAT_CHANGE_NEGATIVE) // goes down { @@ -6007,6 +6018,8 @@ static void Cmd_playstatchangeanimation(void) { statAnimId = startingStatAnimId + currStat; changeableStatsCount++; + if (defiantCompetitiveAffected) // Force single stat animations + break; } } } @@ -6051,7 +6064,7 @@ static void Cmd_playstatchangeanimation(void) { gBattlescriptCurrInstr = cmd->nextInstr; } - else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) + else if (changeableStatsCount != 0) { BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); MarkBattlerForControllerExec(battler); @@ -12468,18 +12481,20 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } } + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE) // same as B_MSG_STAT_WONT_DECREASE + { + if (!(flags & STAT_CHANGE_ALLOW_PTR)) + return STAT_CHANGE_DIDNT_WORK; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + return STAT_CHANGE_WORKED; + } + gBattleMons[battler].statStages[statId] += statValue; if (gBattleMons[battler].statStages[statId] < MIN_STAT_STAGE) gBattleMons[battler].statStages[statId] = MIN_STAT_STAGE; if (gBattleMons[battler].statStages[statId] > MAX_STAT_STAGE) gBattleMons[battler].statStages[statId] = MAX_STAT_STAGE; - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_CHANGE_ALLOW_PTR) - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_CHANGE_ALLOW_PTR)) - return STAT_CHANGE_DIDNT_WORK; - return STAT_CHANGE_WORKED; } diff --git a/src/battle_util.c b/src/battle_util.c index 6d256dc998..23968c8c97 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1144,8 +1144,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) // Check Defiant and Competitive stat raise whenever a stat is lowered. else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH) - && ((targetAbility == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - || (targetAbility == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))) + && (targetAbility == ABILITY_DEFIANT || targetAbility == ABILITY_COMPETITIVE) && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget) && ((gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) || gBattleScripting.stickyWebStatDrop == 1) && !(gBattleScripting.stickyWebStatDrop == 1 && gSideTimers[targetSide].stickyWebBattlerSide == targetSide)) // Sticky Web must have been set by the foe diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 5ec4ebb093..2ff4597599 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -285,12 +285,11 @@ SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Mankey's Attack fell!"); ABILITY_POPUP(player, ABILITY_DEFIANT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Attack sharply rose!"); - + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Defense fell!"); ABILITY_POPUP(player, ABILITY_DEFIANT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -335,3 +334,36 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate if the pokemon lowers it's own stat EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); } } + +SINGLE_BATTLE_TEST("Defiant doesn't display ability popup when already at Maximum Attack") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); + ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM); + PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BELLY_DRUM); MOVE(opponent, MOVE_TICKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + // Maxed Attack + ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack fell!"); + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack rose!"); + // Maxed Attack + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Defense fell!"); + NONE_OF { + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); + } + MESSAGE("Mankey's Attack won't go any higher!"); + + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], MAX_STAT_STAGE); + } +} diff --git a/test/battle/ability/soul_heart.c b/test/battle/ability/soul_heart.c index 393fbb6c20..6f20acb53b 100644 --- a/test/battle/ability/soul_heart.c +++ b/test/battle/ability/soul_heart.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Soul Heart boosts Sp. Atk after opponent uses Memento") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MAGEARNA) { Ability(ABILITY_SOUL_HEART); } + } WHEN { + TURN { MOVE(player, MOVE_MEMENTO); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Wobbuffet fainted!"); + ABILITY_POPUP(opponent, ABILITY_SOUL_HEART); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 1); // -2 from Memento, +1 from Soul Heart + } +} + TO_DO_BATTLE_TEST("TODO: Write Soul Heart (Ability) test titles") diff --git a/test/battle/move_effect/octolock.c b/test/battle/move_effect/octolock.c index e93f6f29cb..6fa1406c32 100644 --- a/test/battle/move_effect/octolock.c +++ b/test/battle/move_effect/octolock.c @@ -78,10 +78,10 @@ SINGLE_BATTLE_TEST("Octolock Defense reduction is prevented by Big Pecks") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_OCTOLOCK, player); MESSAGE("The opposing Pidgey can no longer escape because of Octolock!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); NOT MESSAGE("The opposing Pidgey's Defense fell!"); ABILITY_POPUP(opponent, ABILITY_BIG_PECKS); MESSAGE("The opposing Pidgey's Big Pecks prevents Defense loss!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Pidgey's Sp. Def fell!"); } } @@ -145,10 +145,12 @@ SINGLE_BATTLE_TEST("Octolock triggers Defiant for both stat reductions") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Defense fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Attack sharply rose!"); - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Sp. Def fell!"); ABILITY_POPUP(opponent, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Bisharp's Attack sharply rose!"); } } From 21499cbee11a160439905ab6266052e1817846fb Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sat, 31 May 2025 09:03:12 +0200 Subject: [PATCH 017/248] Refactor field moves (#6660) --- asm/macros/event.inc | 9 +- data/event_scripts.s | 1 + data/script_cmd_table.inc | 2 +- data/scripts/field_move_scripts.inc | 15 +- data/scripts/secret_base.inc | 4 +- data/scripts/surf.inc | 2 +- include/constants/field_move.h | 28 ++++ include/field_move.h | 37 +++++ include/fldeff.h | 18 +-- include/fldeff_misc.h | 2 +- include/party_menu.h | 5 + src/data/party_menu.h | 49 ------- src/field_control_avatar.c | 9 +- src/field_move.c | 212 ++++++++++++++++++++++++++++ src/fldeff_cut.c | 2 +- src/fldeff_defog.c | 2 +- src/fldeff_dig.c | 2 +- src/fldeff_flash.c | 2 +- src/fldeff_misc.c | 2 +- src/fldeff_rocksmash.c | 2 +- src/fldeff_softboiled.c | 2 +- src/fldeff_strength.c | 2 +- src/fldeff_sweetscent.c | 2 +- src/fldeff_teleport.c | 2 +- src/party_menu.c | 51 ++----- src/scrcmd.c | 15 +- test/script.c | 3 +- 27 files changed, 349 insertions(+), 133 deletions(-) create mode 100644 include/constants/field_move.h create mode 100644 include/field_move.h create mode 100644 src/field_move.c diff --git a/asm/macros/event.inc b/asm/macros/event.inc index d3c1442f56..7ffdcccf0a 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1125,12 +1125,13 @@ .2byte \move .endm - @ Checks if at least one Pokemon in the player's party knows the specified move. If so, VAR_RESULT is set to the + @ Checks if at least one Pokemon in the player's party knows the specified field move and if the field move is unlocked. If so, VAR_RESULT is set to the @ (zero-indexed) slot number of the first Pokemon that knows the move. If not, VAR_RESULT is set to PARTY_SIZE. @ VAR_0x8004 is also set to this Pokemon's species. - .macro checkpartymove move:req - .byte SCR_OP_CHECKPARTYMOVE - .2byte \move + .macro checkfieldmove fieldMove:req, checkUnlocked=FALSE + .byte SCR_OP_CHECKFIELDMOVE + .byte \fieldMove + .byte \checkUnlocked .endm @ Converts STR_VAR_1, STR_VAR_2, or STR_VAR_3 to its corresponding index into sScriptStringVars (0, 1, or 2). diff --git a/data/event_scripts.s b/data/event_scripts.s index db5d329b67..9cedbb04d7 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -25,6 +25,7 @@ #include "constants/event_objects.h" #include "constants/event_object_movement.h" #include "constants/field_effects.h" +#include "constants/field_move.h" #include "constants/field_poison.h" #include "constants/field_specials.h" #include "constants/field_tasks.h" diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index 457ff8f670..e05260d3d4 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -146,7 +146,7 @@ gScriptCmdTable:: script_cmd_table_entry SCR_OP_GIVEMON ScrCmd_nop1, requests_effects=1 @ 0x79 script_cmd_table_entry SCR_OP_GIVEEGG ScrCmd_giveegg, requests_effects=1 @ 0x7a script_cmd_table_entry SCR_OP_SETMONMOVE ScrCmd_setmonmove, requests_effects=1 @ 0x7b - script_cmd_table_entry SCR_OP_CHECKPARTYMOVE ScrCmd_checkpartymove, requests_effects=1 @ 0x7c + script_cmd_table_entry SCR_OP_CHECKFIELDMOVE ScrCmd_checkfieldmove, requests_effects=1 @ 0x7c script_cmd_table_entry SCR_OP_BUFFERSPECIESNAME ScrCmd_bufferspeciesname, requests_effects=1 @ 0x7d script_cmd_table_entry SCR_OP_BUFFERLEADMONSPECIESNAME ScrCmd_bufferleadmonspeciesname, requests_effects=1 @ 0x7e script_cmd_table_entry SCR_OP_BUFFERPARTYMONNICK ScrCmd_bufferpartymonnick, requests_effects=1 @ 0x7f diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index 1845e10297..bfc6958138 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -1,8 +1,7 @@ @ Interact with cuttable tree EventScript_CutTree:: lockall - goto_if_unset FLAG_BADGE01_GET, EventScript_CheckTreeCantCut - checkpartymove MOVE_CUT + checkfieldmove FIELD_MOVE_CUT, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CheckTreeCantCut setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -64,8 +63,7 @@ EventScript_UseRockSmash:: @ Interact with smashable rock EventScript_RockSmash:: lockall - goto_if_unset FLAG_BADGE03_GET, EventScript_CantSmashRock - checkpartymove MOVE_ROCK_SMASH + checkfieldmove FIELD_MOVE_ROCK_SMASH, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSmashRock setfieldeffectargument 0, VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -225,9 +223,8 @@ Text_CantSmash: EventScript_StrengthBoulder:: lockall - goto_if_unset FLAG_BADGE04_GET, EventScript_CantStrength goto_if_set FLAG_SYS_USE_STRENGTH, EventScript_CheckActivatedBoulder - checkpartymove MOVE_STRENGTH + checkfieldmove FIELD_MOVE_STRENGTH, TRUE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantStrength setfieldeffectargument 0, VAR_RESULT msgbox Text_WantToStrength, MSGBOX_YESNO @@ -286,7 +283,7 @@ Text_StrengthActivated: EventScript_UseWaterfall:: lockall - checkpartymove MOVE_WATERFALL + checkfieldmove FIELD_MOVE_WATERFALL goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantWaterfall bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT @@ -321,7 +318,7 @@ Text_MonUsedWaterfall: EventScript_UseDive:: lockall - checkpartymove MOVE_DIVE + checkfieldmove FIELD_MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantDive copyvar 0x8004 VAR_RESULT bufferpartymonnick STR_VAR_1, VAR_RESULT @@ -348,7 +345,7 @@ EventScript_EndDive:: EventScript_UseDiveUnderwater:: lockall - checkpartymove MOVE_DIVE + checkfieldmove FIELD_MOVE_DIVE goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantSurface bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc index 15faddfa9d..ed5e859409 100644 --- a/data/scripts/secret_base.inc +++ b/data/scripts/secret_base.inc @@ -28,7 +28,7 @@ SecretBase_EventScript_CheckEntrance:: special GetSecretBaseTypeInFrontOfPlayer special CheckPlayerHasSecretBase goto_if_eq VAR_RESULT, TRUE, SecretBase_EventScript_AlreadyHasSecretBase - checkpartymove MOVE_SECRET_POWER + checkfieldmove FIELD_MOVE_SECRET_POWER setfieldeffectargument 0, VAR_RESULT buffermovename STR_VAR_2, MOVE_SECRET_POWER goto_if_eq VAR_0x8007, SECRET_BASE_RED_CAVE, SecretBase_EventScript_Cave @@ -186,7 +186,7 @@ SecretBase_EventScript_EnterPlayersBase:: end SecretBase_EventScript_AlreadyHasSecretBase:: - checkpartymove MOVE_SECRET_POWER + checkfieldmove FIELD_MOVE_SECRET_POWER goto_if_eq VAR_RESULT, PARTY_SIZE, SecretBase_EventScript_NoSecretPower setfieldeffectargument 0, VAR_RESULT setorcopyvar VAR_0x8004, VAR_RESULT diff --git a/data/scripts/surf.inc b/data/scripts/surf.inc index edb116f991..630b3f9e6e 100644 --- a/data/scripts/surf.inc +++ b/data/scripts/surf.inc @@ -1,5 +1,5 @@ EventScript_UseSurf:: - checkpartymove MOVE_SURF + checkfieldmove FIELD_MOVE_SURF goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_EndUseSurf bufferpartymonnick STR_VAR_1, VAR_RESULT setfieldeffectargument 0, VAR_RESULT diff --git a/include/constants/field_move.h b/include/constants/field_move.h new file mode 100644 index 0000000000..1d0fb83977 --- /dev/null +++ b/include/constants/field_move.h @@ -0,0 +1,28 @@ +#ifndef GUARD_CONSTANTS_FIELD_MOVE_H +#define GUARD_CONSTANTS_FIELD_MOVE_H + + +enum FieldMove +{ + FIELD_MOVE_CUT, + FIELD_MOVE_FLASH, + FIELD_MOVE_ROCK_SMASH, + FIELD_MOVE_STRENGTH, + FIELD_MOVE_SURF, + FIELD_MOVE_FLY, + FIELD_MOVE_DIVE, + FIELD_MOVE_WATERFALL, + FIELD_MOVE_TELEPORT, + FIELD_MOVE_DIG, + FIELD_MOVE_SECRET_POWER, + FIELD_MOVE_MILK_DRINK, + FIELD_MOVE_SOFT_BOILED, + FIELD_MOVE_SWEET_SCENT, +#if OW_DEFOG_FIELD_MOVE == TRUE + FIELD_MOVE_DEFOG, +#endif + FIELD_MOVES_COUNT +}; + + +#endif //GUARD_CONSTANTS_FIELD_MOVE_H diff --git a/include/field_move.h b/include/field_move.h new file mode 100644 index 0000000000..1608b60bcb --- /dev/null +++ b/include/field_move.h @@ -0,0 +1,37 @@ +#ifndef GUARD_FIELD_MOVE_H +#define GUARD_FIELD_MOVE_H + +#include "global.h" +#include "constants/field_move.h" + +struct FieldMoveInfo +{ + bool32 (*fieldMoveFunc)(void); + bool32 (*isUnlockedFunc)(void); + u16 moveID; + u8 partyMsgID; +}; + +extern const struct FieldMoveInfo gFieldMoveInfo[]; + +static inline bool32 SetUpFieldMove(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].fieldMoveFunc(); +} + +static inline bool32 IsFieldMoveUnlocked(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].isUnlockedFunc(); +} + +static inline u32 FieldMove_GetMoveId(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].moveID; +} + +static inline u32 FieldMove_GetPartyMsgID(enum FieldMove fieldMove) +{ + return gFieldMoveInfo[fieldMove].partyMsgID; +} + +#endif //GUARD_FIELD_MOVE_H diff --git a/include/fldeff.h b/include/fldeff.h index 9bad320c74..d1b9e279c3 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -2,7 +2,7 @@ #define GUARD_FLDEFF_H // cut -bool8 SetUpFieldMove_Cut(void); +bool32 SetUpFieldMove_Cut(void); bool8 FldEff_UseCutOnGrass(void); bool8 FldEff_UseCutOnTree(void); bool8 FldEff_CutGrass(void); @@ -18,41 +18,41 @@ void StopEscalator(void); bool8 IsEscalatorMoving(void); // soft-boiled -bool8 SetUpFieldMove_SoftBoiled(void); +bool32 SetUpFieldMove_SoftBoiled(void); void Task_TryUseSoftboiledOnPartyMon(u8 taskId); void ChooseMonForSoftboiled(u8 taskId); // flash -bool8 SetUpFieldMove_Flash(void); +bool32 SetUpFieldMove_Flash(void); void CB2_DoChangeMap(void); bool8 GetMapPairFadeToType(u8 _fromType, u8 _toType); bool8 GetMapPairFadeFromType(u8 _fromType, u8 _toType); // strength -bool8 SetUpFieldMove_Strength(void); +bool32 SetUpFieldMove_Strength(void); bool8 FldEff_UseStrength(void); // sweet scent -bool8 SetUpFieldMove_SweetScent(void); +bool32 SetUpFieldMove_SweetScent(void); bool8 FldEff_SweetScent(void); void StartSweetScentFieldEffect(void); // teleport -bool8 SetUpFieldMove_Teleport(void); +bool32 SetUpFieldMove_Teleport(void); bool8 FldEff_UseTeleport(void); // dig -bool8 SetUpFieldMove_Dig(void); +bool32 SetUpFieldMove_Dig(void); bool8 FldEff_UseDig(void); // rock smash bool8 CheckObjectGraphicsInFrontOfPlayer(u16 graphicsId); u8 CreateFieldMoveTask(void); -bool8 SetUpFieldMove_RockSmash(void); +bool32 SetUpFieldMove_RockSmash(void); bool8 FldEff_UseRockSmash(void); // defog -bool8 SetUpFieldMove_Defog(void); +bool32 SetUpFieldMove_Defog(void); bool8 FldEff_Defog(void); #endif // GUARD_FLDEFF_H diff --git a/include/fldeff_misc.h b/include/fldeff_misc.h index 61078466db..71fef15005 100644 --- a/include/fldeff_misc.h +++ b/include/fldeff_misc.h @@ -5,7 +5,7 @@ void ComputerScreenOpenEffect(u16 increment, u16 unused, u8 priority); void ComputerScreenCloseEffect(u16 increment, u16 unused, u8 priority); bool8 IsComputerScreenOpenEffectActive(void); bool8 IsComputerScreenCloseEffectActive(void); -bool8 SetUpFieldMove_SecretPower(void); +bool32 SetUpFieldMove_SecretPower(void); bool8 FldEff_UseSecretPowerCave(void); bool8 FldEff_SecretPowerCave(void); bool8 FldEff_UseSecretPowerTree(void); diff --git a/include/party_menu.h b/include/party_menu.h index 7c4af8c3a4..5aa9472dac 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -106,4 +106,9 @@ void BufferMoveDeleterNicknameAndMove(void); void GetNumMovesSelectedMonHas(void); void MoveDeleterChooseMoveToForget(void); +bool32 SetUpFieldMove_Surf(void); +bool32 SetUpFieldMove_Fly(void); +bool32 SetUpFieldMove_Waterfall(void); +bool32 SetUpFieldMove_Dive(void); + #endif // GUARD_PARTY_MENU_H diff --git a/src/data/party_menu.h b/src/data/party_menu.h index f8860ac4b0..655264f02d 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -785,55 +785,6 @@ static const u8 sPartyMenuActionCounts[] = [ACTIONS_ZYGARDE_CUBE] = ARRAY_COUNT(sPartyMenuAction_ZygardeCube), }; -static const u16 sFieldMoves[FIELD_MOVES_COUNT + 1] = -{ - [FIELD_MOVE_CUT] = MOVE_CUT, - [FIELD_MOVE_FLASH] = MOVE_FLASH, - [FIELD_MOVE_ROCK_SMASH] = MOVE_ROCK_SMASH, - [FIELD_MOVE_STRENGTH] = MOVE_STRENGTH, - [FIELD_MOVE_SURF] = MOVE_SURF, - [FIELD_MOVE_FLY] = MOVE_FLY, - [FIELD_MOVE_DIVE] = MOVE_DIVE, - [FIELD_MOVE_WATERFALL] = MOVE_WATERFALL, - [FIELD_MOVE_TELEPORT] = MOVE_TELEPORT, - [FIELD_MOVE_DIG] = MOVE_DIG, - [FIELD_MOVE_SECRET_POWER] = MOVE_SECRET_POWER, - [FIELD_MOVE_MILK_DRINK] = MOVE_MILK_DRINK, - [FIELD_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED, - [FIELD_MOVE_SWEET_SCENT] = MOVE_SWEET_SCENT, -#if OW_DEFOG_FIELD_MOVE == TRUE - [FIELD_MOVE_DEFOG] = MOVE_DEFOG, -#endif - // NOTE: This value is used as the terminal value for the table. There's no reason to do this, as the size of the table is known. - // Whichever move shares this value (MOVE_SWORDS_DANCE by default) if present will be treated as the end of the array rather than a field move. - [FIELD_MOVES_COUNT] = FIELD_MOVES_COUNT -}; - -struct -{ - bool8 (*fieldMoveFunc)(void); - u8 msgId; -} static const sFieldMoveCursorCallbacks[FIELD_MOVES_COUNT] = -{ - [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, PARTY_MSG_NOTHING_TO_CUT}, - [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, PARTY_MSG_CANT_SURF_HERE}, - [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_DIVE] = {SetUpFieldMove_Dive, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_SECRET_POWER] = {SetUpFieldMove_SecretPower, PARTY_MSG_CANT_USE_HERE}, - [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, - [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, - [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE}, -#if OW_DEFOG_FIELD_MOVE == TRUE - [FIELD_MOVE_DEFOG] = {SetUpFieldMove_Defog, PARTY_MSG_CANT_USE_HERE}, -#endif -}; - static const u8 *const sUnionRoomTradeMessages[] = { [UR_TRADE_MSG_NOT_MON_PARTNER_WANTS - 1] = gText_NotPkmnOtherTrainerWants, diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index a83990cc58..1cc1f8e122 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -12,6 +12,7 @@ #include "fieldmap.h" #include "field_control_avatar.h" #include "field_message_box.h" +#include "field_move.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_screen_effect.h" @@ -560,7 +561,7 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { - if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE + if (IsFieldMoveUnlocked(FIELD_MOVE_SURF) && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE && CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_SURF) ) return EventScript_UseSurf; @@ -569,7 +570,7 @@ static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metati && CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_WATERFALL) ) { - if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + if (IsFieldMoveUnlocked(FIELD_MOVE_WATERFALL) && IsPlayerSurfingNorth() == TRUE) return EventScript_UseWaterfall; else return EventScript_CannotUseWaterfall; @@ -582,7 +583,7 @@ static bool32 TrySetupDiveDownScript(void) if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; - if (FlagGet(FLAG_BADGE07_GET) && TrySetDiveWarp() == 2) + if (IsFieldMoveUnlocked(FIELD_MOVE_DIVE) && TrySetDiveWarp() == 2) { ScriptContext_SetupScript(EventScript_UseDive); return TRUE; @@ -595,7 +596,7 @@ static bool32 TrySetupDiveEmergeScript(void) if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; - if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) + if (IsFieldMoveUnlocked(FIELD_MOVE_DIVE) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) { ScriptContext_SetupScript(EventScript_UseDiveUnderwater); return TRUE; diff --git a/src/field_move.c b/src/field_move.c new file mode 100644 index 0000000000..ff9c986436 --- /dev/null +++ b/src/field_move.c @@ -0,0 +1,212 @@ +#include "global.h" +#include "event_data.h" +#include "field_move.h" +#include "fldeff.h" +#include "fldeff_misc.h" +#include "party_menu.h" +#include "constants/field_move.h" +#include "constants/moves.h" +#include "constants/party_menu.h" + +static bool32 IsFieldMoveUnlocked_Cut(void) +{ + return FlagGet(FLAG_BADGE01_GET); +} + +static bool32 IsFieldMoveUnlocked_Flash(void) +{ + return FlagGet(FLAG_BADGE02_GET); +} + +static bool32 IsFieldMoveUnlocked_RockSmash(void) +{ + return FlagGet(FLAG_BADGE03_GET); +} + +static bool32 IsFieldMoveUnlocked_Strength(void) +{ + return FlagGet(FLAG_BADGE04_GET); +} + +static bool32 IsFieldMoveUnlocked_Surf(void) +{ + return FlagGet(FLAG_BADGE05_GET); +} + +static bool32 IsFieldMoveUnlocked_Fly(void) +{ + return FlagGet(FLAG_BADGE06_GET); +} + +static bool32 IsFieldMoveUnlocked_Dive(void) +{ + return FlagGet(FLAG_BADGE07_GET); +} + +static bool32 IsFieldMoveUnlocked_Waterfall(void) +{ + return FlagGet(FLAG_BADGE08_GET); +} + +static bool32 IsFieldMoveUnlocked_Teleport(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_Dig(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SecretPower(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_MilkDrink(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SoftBoiled(void) +{ + return TRUE; +} + +static bool32 IsFieldMoveUnlocked_SweetScent(void) +{ + return TRUE; +} + +#if OW_DEFOG_FIELD_MOVE == TRUE +static bool32 IsFieldMoveUnlocked_Defog(void) +{ + return TRUE; +} +#endif + +const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] = +{ + [FIELD_MOVE_CUT] = + { + .fieldMoveFunc = SetUpFieldMove_Cut, + .isUnlockedFunc = IsFieldMoveUnlocked_Cut, + .moveID = MOVE_CUT, + .partyMsgID = PARTY_MSG_NOTHING_TO_CUT, + }, + + [FIELD_MOVE_FLASH] = + { + .fieldMoveFunc = SetUpFieldMove_Flash, + .isUnlockedFunc = IsFieldMoveUnlocked_Flash, + .moveID = MOVE_FLASH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_ROCK_SMASH] = + { + .fieldMoveFunc = SetUpFieldMove_RockSmash, + .isUnlockedFunc = IsFieldMoveUnlocked_RockSmash, + .moveID = MOVE_ROCK_SMASH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_STRENGTH] = + { + .fieldMoveFunc = SetUpFieldMove_Strength, + .isUnlockedFunc = IsFieldMoveUnlocked_Strength, + .moveID = MOVE_STRENGTH, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_SURF] = + { + .fieldMoveFunc = SetUpFieldMove_Surf, + .isUnlockedFunc = IsFieldMoveUnlocked_Surf, + .moveID = MOVE_SURF, + .partyMsgID = PARTY_MSG_CANT_SURF_HERE, + }, + + [FIELD_MOVE_FLY] = + { + .fieldMoveFunc = SetUpFieldMove_Fly, + .isUnlockedFunc = IsFieldMoveUnlocked_Fly, + .moveID = MOVE_FLY, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_DIVE] = + { + .fieldMoveFunc = SetUpFieldMove_Dive, + .isUnlockedFunc = IsFieldMoveUnlocked_Dive, + .moveID = MOVE_DIVE, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_WATERFALL] = + { + .fieldMoveFunc = SetUpFieldMove_Waterfall, + .isUnlockedFunc = IsFieldMoveUnlocked_Waterfall, + .moveID = MOVE_WATERFALL, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_TELEPORT] = + { + .fieldMoveFunc = SetUpFieldMove_Teleport, + .isUnlockedFunc = IsFieldMoveUnlocked_Teleport, + .moveID = MOVE_TELEPORT, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_DIG] = + { + .fieldMoveFunc = SetUpFieldMove_Dig, + .isUnlockedFunc = IsFieldMoveUnlocked_Dig, + .moveID = MOVE_DIG, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_SECRET_POWER] = + { + .fieldMoveFunc = SetUpFieldMove_SecretPower, + .isUnlockedFunc = IsFieldMoveUnlocked_SecretPower, + .moveID = MOVE_SECRET_POWER, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + + [FIELD_MOVE_MILK_DRINK] = + { + .fieldMoveFunc = SetUpFieldMove_SoftBoiled, + .isUnlockedFunc = IsFieldMoveUnlocked_MilkDrink, + .moveID = MOVE_MILK_DRINK, + .partyMsgID = PARTY_MSG_NOT_ENOUGH_HP, + }, + + [FIELD_MOVE_SOFT_BOILED] = + { + .fieldMoveFunc = SetUpFieldMove_SoftBoiled, + .isUnlockedFunc = IsFieldMoveUnlocked_SoftBoiled, + .moveID = MOVE_SOFT_BOILED, + .partyMsgID = PARTY_MSG_NOT_ENOUGH_HP, + }, + + [FIELD_MOVE_SWEET_SCENT] = + { + .fieldMoveFunc = SetUpFieldMove_SweetScent, + .isUnlockedFunc = IsFieldMoveUnlocked_SweetScent, + .moveID = MOVE_SWEET_SCENT, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, + +#if OW_DEFOG_FIELD_MOVE == TRUE + [FIELD_MOVE_DEFOG] = + { + .fieldMoveFunc = SetUpFieldMove_Defog, + .isUnlockedFunc = IsFieldMoveUnlocked_Defog, + .moveID = MOVE_DEFOG, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, +#endif + +}; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index a7eccf651c..4344186a54 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -135,7 +135,7 @@ static const struct SpriteTemplate sSpriteTemplate_CutGrass = }; // code -bool8 SetUpFieldMove_Cut(void) +bool32 SetUpFieldMove_Cut(void) { s16 x, y; u8 i, j; diff --git a/src/fldeff_defog.c b/src/fldeff_defog.c index bccf0d65f7..42c79bad1d 100644 --- a/src/fldeff_defog.c +++ b/src/fldeff_defog.c @@ -19,7 +19,7 @@ static void FieldCallback_Defog(void); static void FieldMove_Defog(void); static void EndDefogTask(u8 taskId); -bool8 SetUpFieldMove_Defog(void) +bool32 SetUpFieldMove_Defog(void) { if (gWeather.currWeather != WEATHER_FOG_HORIZONTAL && gWeather.currWeather != WEATHER_FOG_DIAGONAL) return FALSE; diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c index 63eb848bf2..646865f9c2 100644 --- a/src/fldeff_dig.c +++ b/src/fldeff_dig.c @@ -16,7 +16,7 @@ static void FieldCallback_Dig(void); static void StartDigFieldEffect(void); // text -bool8 SetUpFieldMove_Dig(void) +bool32 SetUpFieldMove_Dig(void) { if (CanUseDigOrEscapeRopeOnCurMap() == TRUE) { diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 788d3ca0fd..249163cca7 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -70,7 +70,7 @@ static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/cave_tran static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.lz"); static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.lz"); -bool8 SetUpFieldMove_Flash(void) +bool32 SetUpFieldMove_Flash(void) { // In Ruby and Sapphire, Registeel's tomb is opened by using Fly. In Emerald, // Flash is used instead. diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index d3e6982f29..f3d3f00a80 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -544,7 +544,7 @@ static void AdjustSecretPowerSpritePixelOffsets(void) } } -bool8 SetUpFieldMove_SecretPower(void) +bool32 SetUpFieldMove_SecretPower(void) { u8 mb; diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 39f64adb87..adb1136340 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -120,7 +120,7 @@ static void Task_DoFieldMove_RunFunc(u8 taskId) // Called when Rock Smash is used from the party menu // For interacting with a smashable rock in the field, see EventScript_RockSmash -bool8 SetUpFieldMove_RockSmash(void) +bool32 SetUpFieldMove_RockSmash(void) { // In Ruby and Sapphire, Regirock's tomb is opened by using Strength. In Emerald, // it is opened by using Rock Smash. diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c index 3a38f67f02..492577a50c 100644 --- a/src/fldeff_softboiled.c +++ b/src/fldeff_softboiled.c @@ -15,7 +15,7 @@ static void Task_DisplayHPRestoredMessage(u8 taskId); static void Task_FinishSoftboiled(u8 taskId); static void CantUseSoftboiledOnMon(u8 taskId); -bool8 SetUpFieldMove_SoftBoiled(void) +bool32 SetUpFieldMove_SoftBoiled(void) { u16 maxHp; u16 hp; diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index 9312150403..a0d278edc7 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -15,7 +15,7 @@ static void FieldCallback_Strength(void); static void StartStrengthFieldEffect(void); // text -bool8 SetUpFieldMove_Strength(void) +bool32 SetUpFieldMove_Strength(void) { if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) == TRUE) { diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 1be00baebc..bc86d683a3 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -25,7 +25,7 @@ static void FieldCallback_SweetScent(void); static void TrySweetScentEncounter(u8 taskId); static void FailSweetScentEncounter(u8 taskId); -bool8 SetUpFieldMove_SweetScent(void) +bool32 SetUpFieldMove_SweetScent(void) { gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; gPostMenuFieldCallback = FieldCallback_SweetScent; diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index 83028c3949..b76082b05f 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -11,7 +11,7 @@ static void FieldCallback_Teleport(void); static void StartTeleportFieldEffect(void); -bool8 SetUpFieldMove_Teleport(void) +bool32 SetUpFieldMove_Teleport(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE)) return FALSE; diff --git a/src/party_menu.c b/src/party_menu.c index 1fbb9e0edb..74f5531119 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -18,6 +18,7 @@ #include "evolution_scene.h" #include "field_control_avatar.h" #include "field_effect.h" +#include "field_move.h" #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_specials.h" @@ -69,6 +70,7 @@ #include "constants/battle.h" #include "constants/battle_frontier.h" #include "constants/field_effects.h" +#include "constants/field_move.h" #include "constants/form_change_types.h" #include "constants/item_effects.h" #include "constants/items.h" @@ -129,29 +131,6 @@ enum { ACTIONS_ZYGARDE_CUBE, }; -// In CursorCb_FieldMove, field moves <= FIELD_MOVE_WATERFALL are assumed to line up with the badge flags. -// Badge flag names are commented here for people searching for references to remove the badge requirement. -enum { - FIELD_MOVE_CUT, // FLAG_BADGE01_GET - FIELD_MOVE_FLASH, // FLAG_BADGE02_GET - FIELD_MOVE_ROCK_SMASH, // FLAG_BADGE03_GET - FIELD_MOVE_STRENGTH, // FLAG_BADGE04_GET - FIELD_MOVE_SURF, // FLAG_BADGE05_GET - FIELD_MOVE_FLY, // FLAG_BADGE06_GET - FIELD_MOVE_DIVE, // FLAG_BADGE07_GET - FIELD_MOVE_WATERFALL, // FLAG_BADGE08_GET - FIELD_MOVE_TELEPORT, - FIELD_MOVE_DIG, - FIELD_MOVE_SECRET_POWER, - FIELD_MOVE_MILK_DRINK, - FIELD_MOVE_SOFT_BOILED, - FIELD_MOVE_SWEET_SCENT, -#if OW_DEFOG_FIELD_MOVE == TRUE - FIELD_MOVE_DEFOG, -#endif - FIELD_MOVES_COUNT -}; - enum { PARTY_BOX_LEFT_COLUMN, PARTY_BOX_RIGHT_COLUMN, @@ -514,10 +493,6 @@ static void CursorCb_CatalogFan(u8); static void CursorCb_CatalogMower(u8); static void CursorCb_ChangeForm(u8); static void CursorCb_ChangeAbility(u8); -static bool8 SetUpFieldMove_Surf(void); -static bool8 SetUpFieldMove_Fly(void); -static bool8 SetUpFieldMove_Waterfall(void); -static bool8 SetUpFieldMove_Dive(void); void TryItemHoldFormChange(struct Pokemon *mon, s8 slotId); static void ShowMoveSelectWindow(u8 slot); static void Task_HandleWhichMoveInput(u8 taskId); @@ -2808,7 +2783,7 @@ static u8 DisplaySelectionWindow(u8 windowType) const u8 *text; u8 fontColorsId = (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3; if (sPartyMenuInternal->actions[i] >= MENU_FIELD_MOVES) - text = GetMoveName(sFieldMoves[sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES]); + text = GetMoveName(FieldMove_GetMoveId(sPartyMenuInternal->actions[i] - MENU_FIELD_MOVES)); else text = sCursorOptions[sPartyMenuInternal->actions[i]].text; @@ -2874,7 +2849,7 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) { for (j = 0; j != FIELD_MOVES_COUNT; j++) { - if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j]) + if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == FieldMove_GetMoveId(j)) { AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + MENU_FIELD_MOVES); break; @@ -3975,7 +3950,7 @@ static void CursorCb_FieldMove(u8 taskId) const struct MapHeader *mapHeader; PlaySE(SE_SELECT); - if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL) + if (gFieldMoveInfo[fieldMove].fieldMoveFunc == NULL) return; PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[0]); @@ -3985,19 +3960,19 @@ static void CursorCb_FieldMove(u8 taskId) if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED) DisplayPartyMenuStdMessage(PARTY_MSG_CANT_USE_HERE); else - DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); + DisplayPartyMenuStdMessage(FieldMove_GetPartyMsgID(fieldMove)); gTasks[taskId].func = Task_CancelAfterAorBPress; } else { // All field moves before WATERFALL are HMs. - if (fieldMove <= FIELD_MOVE_WATERFALL && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE) + if (!IsFieldMoveUnlocked(fieldMove)) { DisplayPartyMenuMessage(gText_CantUseUntilNewBadge, TRUE); gTasks[taskId].func = Task_ReturnToChooseMonAfterText; } - else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE) + else if (SetUpFieldMove(fieldMove) == TRUE) { switch (fieldMove) { @@ -4041,7 +4016,7 @@ static void CursorCb_FieldMove(u8 taskId) DisplayCantUseFlashMessage(); break; default: - DisplayPartyMenuStdMessage(sFieldMoveCursorCallbacks[fieldMove].msgId); + DisplayPartyMenuStdMessage(FieldMove_GetPartyMsgID(fieldMove)); break; } gTasks[taskId].func = Task_CancelAfterAorBPress; @@ -4172,7 +4147,7 @@ static void FieldCallback_Surf(void) FieldEffectStart(FLDEFF_USE_SURF); } -static bool8 SetUpFieldMove_Surf(void) +bool32 SetUpFieldMove_Surf(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_SURF)) return FALSE; @@ -4194,7 +4169,7 @@ static void DisplayCantUseSurfMessage(void) DisplayPartyMenuStdMessage(PARTY_MSG_CANT_SURF_HERE); } -static bool8 SetUpFieldMove_Fly(void) +bool32 SetUpFieldMove_Fly(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE)) return FALSE; @@ -4216,7 +4191,7 @@ static void FieldCallback_Waterfall(void) FieldEffectStart(FLDEFF_USE_WATERFALL); } -static bool8 SetUpFieldMove_Waterfall(void) +bool32 SetUpFieldMove_Waterfall(void) { s16 x, y; @@ -4239,7 +4214,7 @@ static void FieldCallback_Dive(void) FieldEffectStart(FLDEFF_USE_DIVE); } -static bool8 SetUpFieldMove_Dive(void) +bool32 SetUpFieldMove_Dive(void) { if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_DIVE)) return FALSE; diff --git a/src/scrcmd.c b/src/scrcmd.c index 87bc8e6298..4e8a43f940 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -14,6 +14,7 @@ #include "event_data.h" #include "field_door.h" #include "field_effect.h" +#include "field_move.h" #include "event_object_lock.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -2283,15 +2284,20 @@ bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) +bool8 ScrCmd_checkfieldmove(struct ScriptContext *ctx) { - u8 i; - u16 move = ScriptReadHalfword(ctx); + enum FieldMove fieldMove = ScriptReadByte(ctx); + bool32 doUnlockedCheck = ScriptReadByte(ctx); + u16 move; Script_RequestEffects(SCREFF_V1); gSpecialVar_Result = PARTY_SIZE; - for (i = 0; i < PARTY_SIZE; i++) + if (doUnlockedCheck && !IsFieldMoveUnlocked(fieldMove)) + return FALSE; + + move = FieldMove_GetMoveId(fieldMove); + for (u32 i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); if (!species) @@ -2303,6 +2309,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) break; } } + return FALSE; } diff --git a/test/script.c b/test/script.c index 5f185d72cf..cf21124c95 100644 --- a/test/script.c +++ b/test/script.c @@ -3,6 +3,7 @@ #include "test/overworld_script.h" #include "script.h" #include "constants/decorations.h" +#include "constants/field_move.h" #include "constants/moves.h" TEST("Script_HasNoEffect control flow") @@ -46,7 +47,7 @@ TEST("Script_HasNoEffect variables") checkpcitem ITEM_POTION, 1; checkdecorspace DECOR_SNORLAX_DOLL; checkdecor DECOR_SNORLAX_DOLL; - checkpartymove MOVE_CELEBRATE; + checkfieldmove 0, TRUE; // doesn't work with enums currently random 2; checkmoney 5000; getpokenewsactive POKENEWS_LILYCOVE; From eb81820ae3e49211e5c7f78b2f159f93f05aa82a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 31 May 2025 09:09:35 +0200 Subject: [PATCH 018/248] Clean up battlescript calls with func BattleScriptCall (#6873) --- include/battle_util.h | 1 + src/battle_dynamax.c | 3 +- src/battle_script_commands.c | 282 ++++++++++---------------- src/battle_util.c | 370 +++++++++++------------------------ src/battle_util2.c | 9 +- 5 files changed, 217 insertions(+), 448 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 2ce91c3f25..4870330361 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -222,6 +222,7 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler); void UpdateSentPokesToOpponentValue(u32 battler); void BattleScriptPush(const u8 *bsPtr); void BattleScriptPushCursor(void); +void BattleScriptCall(const u8 *bsPtr); void BattleScriptPop(void); u32 TrySetCantSelectMoveBattleScript(u32 battler); u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 93642f4c93..6f69ca7580 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -502,10 +502,9 @@ void BS_UndoDynamax(void) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - BattleScriptPushCursor(); UndoDynamax(battler); gBattleScripting.battler = battler; - gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + BattleScriptCall(BattleScript_DynamaxEnds_Ret); return; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index de85c43950..432eabfedb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1341,8 +1341,7 @@ static void Cmd_attackcanceler(void) } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicCoat; + BattleScriptCall(BattleScript_MagicCoat); } return; } @@ -1367,8 +1366,7 @@ static void Cmd_attackcanceler(void) { ClearDamageCalcResults(); SetAtkCancellerForCalledMove(); // Edge case for bouncing a powder move against a grass type pokemon. - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicBounce; + BattleScriptCall(BattleScript_MagicBounce); gBattlerAbility = battler; return; } @@ -1391,8 +1389,7 @@ static void Cmd_attackcanceler(void) gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleStruct->snatchedMoveIsUsed = TRUE; gBattleScripting.battler = gBattlerByTurnOrder[i]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SnatchedMove; + BattleScriptCall(BattleScript_SnatchedMove); return; } } @@ -1401,16 +1398,14 @@ static void Cmd_attackcanceler(void) { gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; gLastUsedAbility = ABILITY_LIGHTNING_ROD; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; + BattleScriptCall(BattleScript_TookAttack); RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) { gSpecialStatuses[gBattlerTarget].stormDrainRedirected = FALSE; gLastUsedAbility = ABILITY_STORM_DRAIN; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TookAttack; + BattleScriptCall(BattleScript_TookAttack); RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) @@ -2282,8 +2277,7 @@ static void Cmd_adjustdamage(void) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleMons[gBattlerAttacker].item) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GemActivates; + BattleScriptCall(BattleScript_GemActivates); gLastUsedItem = gBattleMons[gBattlerAttacker].item; } } @@ -2301,8 +2295,7 @@ static void Cmd_multihitresultmessage(void) if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_STURDIED) { gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + BattleScriptCall(BattleScript_SturdiedMsg); return; } else if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_HUNG_ON) @@ -2310,8 +2303,7 @@ static void Cmd_multihitresultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; gBattleStruct->moveResultFlags[gBattlerTarget] &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; } } @@ -2377,8 +2369,7 @@ static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, u32 moveType) && !gBattleStruct->printedStrongWindsWeakenedAttack) { gBattleStruct->printedStrongWindsWeakenedAttack = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackWeakenedByStrongWinds; + BattleScriptCall(BattleScript_AttackWeakenedByStrongWinds); return TRUE; } } @@ -2392,8 +2383,7 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) { gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; gBattleScripting.battler = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; + BattleScriptCall(BattleScript_TeraShellDistortingTypeMatchups); return TRUE; } return FALSE; @@ -2408,8 +2398,7 @@ static inline bool32 TryActivateWeakenessBerry(u32 battlerDef) gBattleScripting.battler = battlerDef; gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->partyState[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]].ateBerry = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + BattleScriptCall(BattleScript_BerryReduceDmg); return TRUE; } @@ -2653,8 +2642,7 @@ static void Cmd_datahpupdate(void) if (gDisableStructs[battler].substituteHP == 0) { gBattlescriptCurrInstr = cmd->nextInstr; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; + BattleScriptCall(BattleScript_SubstituteFade); return; } } @@ -2868,11 +2856,10 @@ static void Cmd_resultmessage(void) gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; u32 side = GetBattlerSide(gBattlerTarget); if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species; + gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage; + BattleScriptCall(BattleScript_IceFaceNullsDamage); return; } @@ -2883,8 +2870,7 @@ static void Cmd_resultmessage(void) { gMultiHitCounter = 0; *moveResultFlags &= ~MOVE_RESULT_MISSED; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); return; } @@ -2962,8 +2948,7 @@ static void Cmd_resultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; default: if (*moveResultFlags & MOVE_RESULT_ONE_HIT_KO) @@ -2971,22 +2956,19 @@ static void Cmd_resultmessage(void) *moveResultFlags &= ~MOVE_RESULT_ONE_HIT_KO; *moveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; *moveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; + BattleScriptCall(BattleScript_OneHitKOMsg); return; } else if (*moveResultFlags & MOVE_RESULT_STURDIED) { *moveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + BattleScriptCall(BattleScript_SturdiedMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FOE_ENDURED) { *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EnduredMsg; + BattleScriptCall(BattleScript_EnduredMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FOE_HUNG_ON) @@ -2994,8 +2976,7 @@ static void Cmd_resultmessage(void) gLastUsedItem = gBattleMons[gBattlerTarget].item; gPotentialItemEffectBattler = gBattlerTarget; *moveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + BattleScriptCall(BattleScript_HangedOnMsg); return; } else if (*moveResultFlags & MOVE_RESULT_FAILED) @@ -3005,8 +2986,7 @@ static void Cmd_resultmessage(void) else if (B_AFFECTION_MECHANICS == TRUE && (*moveResultFlags & MOVE_RESULT_FOE_ENDURED_AFFECTION)) { *moveResultFlags &= ~MOVE_RESULT_FOE_ENDURED_AFFECTION; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AffectionBasedEndurance; + BattleScriptCall(BattleScript_AffectionBasedEndurance); return; } } @@ -4704,10 +4684,9 @@ static void Cmd_dofaintanimation(void) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - BattleScriptPushCursor(); UndoDynamax(battler); gBattleScripting.battler = battler; - gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + BattleScriptCall(BattleScript_DynamaxEnds_Ret); return; } @@ -5179,9 +5158,8 @@ static void Cmd_getexp(void) PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, expBattler, *expMonId); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL)); - BattleScriptPushCursor(); gLeveledUpInBattle |= 1 << *expMonId; - gBattlescriptCurrInstr = BattleScript_LevelUp; + BattleScriptCall(BattleScript_LevelUp); gBattleStruct->battlerExpReward = T1_READ_32(&gBattleResources->bufferB[expBattler][2]); AdjustFriendship(&gPlayerParty[*expMonId], FRIENDSHIP_EVENT_GROW_LEVEL); @@ -6087,8 +6065,7 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef) if (GetBattlerAbility(battlerDef) == ABILITY_STICKY_HOLD && IsBattlerAlive(battlerDef)) { gBattlerAbility = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; + BattleScriptCall(BattleScript_StickyHoldActivates); } else { @@ -6111,8 +6088,7 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef) gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[battlerDef]; } - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KnockedOff; + BattleScriptCall(BattleScript_KnockedOff); } return TRUE; } @@ -6225,8 +6201,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move StealTargetItem(battlerAtk, battlerDef); gBattleScripting.battler = gBattlerAbility = battlerAtk; gEffectBattler = battlerDef; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MagicianActivates; + BattleScriptCall(BattleScript_MagicianActivates); effect = TRUE; } break; @@ -6259,8 +6234,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move SET_STATCHANGER(stat, numMonsFainted, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget; + BattleScriptCall(BattleScript_RaiseStatOnFaintingTarget); effect = TRUE; } } @@ -6285,8 +6259,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species); gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species; gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattleBondActivatesOnMoveEndAttacker; + BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker); effect = TRUE; } else @@ -6316,8 +6289,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move gLastUsedAbility = abilityAtk; gBattlerAbility = battlerAtk; gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectBattleBondStatIncrease; + BattleScriptCall(BattleScript_EffectBattleBondStatIncrease); effect = TRUE; } } @@ -6376,8 +6348,7 @@ static void Cmd_moveend(void) if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; + BattleScriptCall(BattleScript_SpikyShieldEffect); effect = 1; } break; @@ -6392,8 +6363,7 @@ static void Cmd_moveend(void) gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; else gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; + BattleScriptCall(BattleScript_KingsShieldEffect); effect = 1; } break; @@ -6403,8 +6373,7 @@ static void Cmd_moveend(void) gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; + BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; } break; @@ -6414,8 +6383,7 @@ static void Cmd_moveend(void) gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_BURN | MOVE_EFFECT_AFFECTS_USER; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; + BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; } break; @@ -6429,8 +6397,7 @@ static void Cmd_moveend(void) gBattlerAttacker = gBattlerTarget; gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; + BattleScriptCall(BattleScript_KingsShieldEffect); effect = 1; } break; @@ -6442,8 +6409,7 @@ static void Cmd_moveend(void) gBattlerAttacker = gBattlerTarget; gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; + BattleScriptCall(BattleScript_KingsShieldEffect); effect = 1; } break; @@ -6460,8 +6426,7 @@ static void Cmd_moveend(void) gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); MarkBattlerForControllerExec(gBattlerAttacker); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BeakBlastBurn; + BattleScriptCall(BattleScript_BeakBlastBurn); effect = 1; } } @@ -6483,14 +6448,12 @@ static void Cmd_moveend(void) gBattleStruct->moveDamage[gBattlerAttacker] *= -1; gHitMarker |= HITMARKER_PASSIVE_DAMAGE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectAbsorbLiquidOoze; + BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectAbsorb; + BattleScriptCall(BattleScript_EffectAbsorb); } } gBattleScripting.moveendState++; @@ -6506,8 +6469,7 @@ static void Cmd_moveend(void) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RageIsBuilding; + BattleScriptCall(BattleScript_RageIsBuilding); effect = TRUE; } gBattleScripting.moveendState++; @@ -6603,23 +6565,22 @@ static void Cmd_moveend(void) } effect = TRUE; - BattleScriptPushCursor(); if (targetAbility == ABILITY_SUCTION_CUPS) { - gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet; + BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet); } else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) { - gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet; + BattleScriptCall(BattleScript_PrintMonIsRootedRet); } else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) { - gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed; + BattleScriptCall(BattleScript_HitSwitchTargetDynamaxed); } else { gBattleScripting.switchCase = B_SWITCH_HIT; - gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget; + BattleScriptCall(BattleScript_TryHitSwitchTarget); } } break; @@ -6899,11 +6860,10 @@ static void Cmd_moveend(void) gBattleScripting.multihitString[4]++; if (gMultiHitCounter == 0) { - BattleScriptPushCursor(); if (GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) - gBattlescriptCurrInstr = BattleScript_ScaleShot; + BattleScriptCall(BattleScript_ScaleShot); else - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); effect = TRUE; } else @@ -6936,8 +6896,7 @@ static void Cmd_moveend(void) } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + BattleScriptCall(BattleScript_MultiHitPrintStrings); effect = TRUE; } } @@ -6959,8 +6918,7 @@ static void Cmd_moveend(void) gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + BattleScriptCall(BattleScript_DefrostedViaFireMove); effect = TRUE; } if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE @@ -6972,8 +6930,7 @@ static void Cmd_moveend(void) gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; + BattleScriptCall(BattleScript_FrostbiteHealedViaFireMove); effect = TRUE; } gBattleScripting.moveendState++; @@ -7002,8 +6959,7 @@ static void Cmd_moveend(void) if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RecoilIfMiss; + BattleScriptCall(BattleScript_RecoilIfMiss); effect = TRUE; } break; @@ -7011,8 +6967,7 @@ static void Cmd_moveend(void) if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleStruct->moveDamage[gBattlerTarget] * max(1, GetMoveRecoil(gCurrentMove)) / 100); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + BattleScriptCall(BattleScript_MoveEffectRecoil); effect = TRUE; } break; @@ -7020,8 +6975,7 @@ static void Cmd_moveend(void) if (!IsAbilityOnField(ABILITY_DAMP)) { gBattleStruct->moveDamage[gBattlerAttacker] = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FaintAttackerForExplosion; + BattleScriptCall(BattleScript_FaintAttackerForExplosion); effect = TRUE; } break; @@ -7032,16 +6986,14 @@ static void Cmd_moveend(void) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MaxHp50Recoil; + BattleScriptCall(BattleScript_MaxHp50Recoil); effect = TRUE; } break; case EFFECT_RAPID_SPIN: if (IsBattlerTurnDamaged(gBattlerTarget)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RapidSpinAway; + BattleScriptCall(BattleScript_RapidSpinAway); effect = TRUE; } break; @@ -7054,8 +7006,7 @@ static void Cmd_moveend(void) { SET_STATCHANGER(STAT_ATK, GetGenConfig(GEN_CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + BattleScriptCall(BattleScript_FellStingerRaisesStat); effect = TRUE; } break; @@ -7115,8 +7066,7 @@ static void Cmd_moveend(void) gLastUsedItem = gBattleMons[battler].item; effect = TRUE; gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; + BattleScriptCall(BattleScript_EjectButtonActivates); gAiLogicData->ejectButtonSwitch = TRUE; break; // Only the fastest Eject Button activates } @@ -7169,8 +7119,7 @@ static void Cmd_moveend(void) gLastUsedItem = gBattleMons[battler].item; effect = TRUE; gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivates; + BattleScriptCall(BattleScript_EjectPackActivates); gAiLogicData->ejectPackSwitch = TRUE; break; // Only the fastest Eject item activates } @@ -7189,8 +7138,7 @@ static void Cmd_moveend(void) if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_WHITE_HERB && RestoreWhiteHerbStats(i)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; + BattleScriptCall(BattleScript_WhiteHerbRet); effect = TRUE; break; } @@ -7232,13 +7180,12 @@ static void Cmd_moveend(void) SaveBattlerAttacker(gBattlerAttacker); gBattleScripting.battler = battler; gEffectBattler = gBattlerAttacker; - BattleScriptPushCursor(); if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG || GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; + BattleScriptCall(BattleScript_RedCardActivationNoSwitch); else - gBattlescriptCurrInstr = BattleScript_RedCardActivates; + BattleScriptCall(BattleScript_RedCardActivates); break; // Only fastest red card activates } } @@ -7281,8 +7228,7 @@ static void Cmd_moveend(void) StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item gEffectBattler = gBattlerAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_Pickpocket; // Includes sticky hold check to print separate string + BattleScriptCall(BattleScript_Pickpocket); // Includes sticky hold check to print separate string effect = TRUE; break; // Pickpocket activates on fastest mon, so exit loop. } @@ -7325,12 +7271,11 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.battler = battler; - BattleScriptPushCursor(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || IsOnPlayerSide(battler)) - gBattlescriptCurrInstr = BattleScript_EmergencyExit; + BattleScriptCall(BattleScript_EmergencyExit); else - gBattlescriptCurrInstr = BattleScript_EmergencyExitWild; + BattleScriptCall(BattleScript_EmergencyExitWild); break; // Only the fastest Emergency Exit / Wimp Out activates } @@ -7348,8 +7293,7 @@ static void Cmd_moveend(void) && !NoAliveMonsForBattlerSide(gBattlerTarget)) { effect = TRUE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EffectHitEscape; + BattleScriptCall(BattleScript_EffectHitEscape); } gBattleScripting.moveendState++; break; @@ -7370,8 +7314,7 @@ static void Cmd_moveend(void) gLastUsedAbility = gBattleMons[BATTLE_PARTNER(i)].ability; gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(i); gBattlerAttacker = i; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; + BattleScriptCall(BattleScript_SymbiosisActivates); effect = TRUE; } } @@ -8168,15 +8111,14 @@ static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) gBattleScripting.battler = battler; gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; - BattleScriptPushCursor(); if (gBattlescriptCurrInstr[1] == BS_TARGET) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnTarget; + BattleScriptCall(BattleScript_DmgHazardsOnTarget); else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnAttacker; + BattleScriptCall(BattleScript_DmgHazardsOnAttacker); else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnBattlerScripting; + BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting); else - gBattlescriptCurrInstr = BattleScript_DmgHazardsOnFaintedBattler; + BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler); } bool32 DoSwitchInAbilities(u32 battler) @@ -8208,8 +8150,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gSpecialStatuses[battler].announceNeutralizingGas = TRUE; gDisableStructs[battler].neutralizingGas = TRUE; gBattlerAbility = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SwitchInAbilityMsgRet; + BattleScriptCall(BattleScript_SwitchInAbilityMsgRet); } // Healing Wish activates before hazards. // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. @@ -8219,14 +8160,12 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattlerAttacker = battler; if (gBattleStruct->battlerState[battler].storedHealingWish) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_HealingWishActivates; + BattleScriptCall(BattleScript_HealingWishActivates); gBattleStruct->battlerState[battler].storedHealingWish = FALSE; } else // Lunar Dance { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LunarDanceActivates; + BattleScriptCall(BattleScript_LunarDanceActivates); gBattleStruct->battlerState[battler].storedLunarDance = FALSE; } } @@ -8265,8 +8204,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_TOXIC_SPIKES; gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0; gBattleScripting.battler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicSpikesAbsorbed; + BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); } else if (IsBattlerAffectedByHazards(battler, TRUE)) { @@ -8283,11 +8221,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); gBattleScripting.battler = battler; - BattleScriptPushCursor(); if (tspikes == 0) - gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; + BattleScriptCall(BattleScript_ToxicSpikesPoisoned); else - gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; + BattleScriptCall(BattleScript_ToxicSpikesBadlyPoisoned); } } } @@ -8299,8 +8236,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gDisableStructs[battler].stickyWebDone = TRUE; gBattleScripting.battler = battler; SET_STATCHANGER(STAT_SPEED, 1, TRUE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn; + BattleScriptCall(BattleScript_StickyWebOnSwitchIn); } else if (!(gDisableStructs[battler].steelSurgeDone) && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEELSURGE) @@ -8318,9 +8254,8 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->zmove.healReplacement = FALSE; gBattleStruct->moveDamage[battler] = -1 * (gBattleMons[battler].maxHP); gBattleScripting.battler = battler; - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; - gBattlescriptCurrInstr = BattleScript_HealReplacementZMove; + BattleScriptCall(BattleScript_HealReplacementZMove); return TRUE; } else @@ -9699,8 +9634,7 @@ static void RemoveAllTerrains(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);\ *sideStatuses &= ~status; \ sideTimer->structField = 0; \ - BattleScriptPushCursor(); \ - gBattlescriptCurrInstr = battlescript; \ + BattleScriptCall(battlescript); \ } \ else \ { \ @@ -9741,15 +9675,13 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) if (gBattleWeather & B_WEATHER_FOG) { gBattleWeather &= ~B_WEATHER_FOG; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FogEnded_Ret; + BattleScriptCall(BattleScript_FogEnded_Ret); return TRUE; } if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { RemoveAllTerrains(); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TerrainEnds_Ret; + BattleScriptCall(BattleScript_TerrainEnds_Ret); return TRUE; } } @@ -9785,8 +9717,7 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear) gBattlerTarget = i; gDisableStructs[i].substituteHP = 0; gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SubstituteFade; + BattleScriptCall(BattleScript_SubstituteFade); } gBattlerAttacker = saveBattler; return TRUE; @@ -10174,16 +10105,15 @@ static void Cmd_various(void) { gLastUsedItem = gBattleMons[gBattlerTarget].item; RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); - BattleScriptPushCursor(); // If Frisk identifies two mons' items, show the pop-up only once. if (gBattleStruct->friskedAbility) { - gBattlescriptCurrInstr = BattleScript_FriskMsg; + BattleScriptCall(BattleScript_FriskMsg); } else { gBattleStruct->friskedAbility = TRUE; - gBattlescriptCurrInstr = BattleScript_FriskMsgWithPopup; + BattleScriptCall(BattleScript_FriskMsgWithPopup); } return; } @@ -10624,8 +10554,7 @@ static void Cmd_various(void) { SET_STATCHANGER(STAT_SPATK, 1, FALSE); PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ScriptingAbilityStatRaise; + BattleScriptCall(BattleScript_ScriptingAbilityStatRaise); return; } } @@ -11172,8 +11101,7 @@ static void Cmd_various(void) VARIOUS_ARGS(const u8 *failInstr); if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); } else { @@ -14351,50 +14279,43 @@ static void Cmd_rapidspinfree(void) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; gBattlerTarget = gBattleStruct->wrappedBy[gBattlerAttacker]; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WrapFree; + BattleScriptCall(BattleScript_WrapFree); } else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) { gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED; gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_LeechSeedFree; + BattleScriptCall(BattleScript_LeechSeedFree); } else if (gSideStatuses[atkSide] & SIDE_STATUS_SPIKES) { gSideStatuses[atkSide] &= ~SIDE_STATUS_SPIKES; gSideTimers[atkSide].spikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikesFree; + BattleScriptCall(BattleScript_SpikesFree); } else if (gSideStatuses[atkSide] & SIDE_STATUS_TOXIC_SPIKES) { gSideStatuses[atkSide] &= ~SIDE_STATUS_TOXIC_SPIKES; gSideTimers[atkSide].toxicSpikesAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicSpikesFree; + BattleScriptCall(BattleScript_ToxicSpikesFree); } else if (gSideStatuses[atkSide] & SIDE_STATUS_STICKY_WEB) { gSideStatuses[atkSide] &= ~SIDE_STATUS_STICKY_WEB; gSideTimers[atkSide].stickyWebAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyWebFree; + BattleScriptCall(BattleScript_StickyWebFree); } else if (gSideStatuses[atkSide] & SIDE_STATUS_STEALTH_ROCK) { gSideStatuses[atkSide] &= ~SIDE_STATUS_STEALTH_ROCK; gSideTimers[atkSide].stealthRockAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StealthRockFree; + BattleScriptCall(BattleScript_StealthRockFree); } else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE) { gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE; gSideTimers[atkSide].steelsurgeAmount = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SteelsurgeFree; + BattleScriptCall(BattleScript_SteelsurgeFree); } else { @@ -16686,15 +16607,13 @@ void BS_DoStockpileStatChangesWearOff(void) { SET_STATCHANGER(STAT_DEF, abs(gDisableStructs[battler].stockpileDef), TRUE); gDisableStructs[battler].stockpileDef = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = cmd->statChangeInstr; + BattleScriptCall(cmd->statChangeInstr); } else if (gDisableStructs[battler].stockpileSpDef) { SET_STATCHANGER(STAT_SPDEF, abs(gDisableStructs[battler].stockpileSpDef), TRUE); gDisableStructs[battler].stockpileSpDef = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = cmd->statChangeInstr; + BattleScriptCall(cmd->statChangeInstr); } else { @@ -16857,8 +16776,7 @@ void BS_TrySymbiosis(void) gLastUsedAbility = gBattleMons[partner].ability; gBattleScripting.battler = gBattlerAbility = partner; gEffectBattler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; + BattleScriptCall(BattleScript_SymbiosisActivates); return; } @@ -17841,14 +17759,12 @@ void BS_TryActivateGulpMissile(void) switch(gBattleMons[gBattlerTarget].species) { case SPECIES_CRAMORANT_GORGING: - BattleScriptPushCursor(); TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); - gBattlescriptCurrInstr = BattleScript_GulpMissileGorging; + BattleScriptCall(BattleScript_GulpMissileGorging); return; case SPECIES_CRAMORANT_GULPING: - BattleScriptPushCursor(); TryBattleFormChange(gBattlerTarget, FORM_CHANGE_HIT_BY_MOVE); - gBattlescriptCurrInstr = BattleScript_GulpMissileGulping; + BattleScriptCall(BattleScript_GulpMissileGulping); return; } } @@ -18306,8 +18222,7 @@ void BS_SpectralThiefPrintStats(void) stat, MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StatUpMsg; + BattleScriptCall(BattleScript_StatUpMsg); return; } } @@ -18688,8 +18603,7 @@ void BS_TryIntimidatEjectpack(void) gBattleScripting.battler = affectedBattler; gLastUsedItem = gBattleMons[affectedBattler].item; RecordItemEffectBattle(affectedBattler, HOLD_EFFECT_EJECT_PACK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; + BattleScriptCall(BattleScript_EjectPackActivate_Ret); } } diff --git a/src/battle_util.c b/src/battle_util.c index 23968c8c97..e2b0eb41e9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1150,8 +1150,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) && !(gBattleScripting.stickyWebStatDrop == 1 && gSideTimers[targetSide].stickyWebBattlerSide == targetSide)) // Sticky Web must have been set by the foe { gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat; + BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); if (targetAbility == ABILITY_DEFIANT) SET_STATCHANGER(STAT_ATK, 2, FALSE); else @@ -1161,8 +1160,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) { gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityRaisesDefenderStat; + BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); SET_STATCHANGER(STAT_SPEED, 1, FALSE); } @@ -1231,6 +1229,12 @@ void BattleScriptPushCursor(void) gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = gBattlescriptCurrInstr; } +void BattleScriptCall(const u8 *bsPtr) +{ + BattleScriptPushCursor(); + gBattlescriptCurrInstr = bsPtr; +} + void BattleScriptPop(void) { if (gBattleResources->battleScriptsStack->size != 0) @@ -1819,8 +1823,7 @@ static inline bool32 TryFormChangeBeforeMove(void) if (!result) return FALSE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerFormChange; + BattleScriptCall(BattleScript_AttackerFormChange); return TRUE; } @@ -1890,9 +1893,8 @@ static void CancellerAsleep(u32 *effect) TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); *effect = 2; } else @@ -1921,9 +1923,8 @@ static void CancellerAsleep(u32 *effect) { TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); *effect = 2; } } @@ -1943,8 +1944,7 @@ static void CancellerFrozen(u32 *effect) else // unfreeze { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } *effect = 2; @@ -2040,7 +2040,7 @@ static void CancellerInLove(u32 *effect) gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); if (!RandomPercentage(RNG_INFATUATION, 50)) { - BattleScriptPushCursor(); + BattleScriptCall(BattleScript_MoveUsedIsInLove); } else { @@ -2048,8 +2048,8 @@ static void CancellerInLove(u32 *effect) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; *effect = 1; } } @@ -2155,18 +2155,17 @@ static void CancellerConfused(u32 *effect) gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else { gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; - BattleScriptPushCursor(); + BattleScriptCall(BattleScript_MoveUsedIsConfused); } - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else // snapped out of confusion { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore; + BattleScriptCall(BattleScript_MoveUsedIsConfusedNoMore); } *effect = 1; } @@ -2225,8 +2224,7 @@ static void CancellerThaw(u32 *effect) if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } *effect = 2; @@ -2236,8 +2234,7 @@ static void CancellerThaw(u32 *effect) if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfrostbite; + BattleScriptCall(BattleScript_MoveUsedUnfrostbite); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; } *effect = 2; @@ -2271,8 +2268,7 @@ static void CancellerWeatherPrimal(u32 *effect) gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; + BattleScriptCall(BattleScript_PrimalWeatherBlocksMove); } } } @@ -2282,8 +2278,7 @@ static void CancellerDynamaxBlocked(u32 *effect) if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; + BattleScriptCall(BattleScript_MoveBlockedByDynamax); *effect = 1; } } @@ -2313,10 +2308,9 @@ static void CancellerProtean(u32 *effect) gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE; PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlerAbility = gBattlerAttacker; - BattleScriptPushCursor(); PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; - gBattlescriptCurrInstr = BattleScript_ProteanActivates; + BattleScriptCall(BattleScript_ProteanActivates); *effect = 1; } } @@ -2430,26 +2424,17 @@ static void CancellerZMoves(u32 *effect) if (gProtectStructs[gBattlerAttacker].powderSelfDmg) { if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivatePowder; - } + BattleScriptCall(BattleScript_ZMoveActivatePowder); } else if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) { if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; - } + BattleScriptCall(BattleScript_ZMoveActivateStatus); } else { if (!alreadyUsed) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; - } + BattleScriptCall(BattleScript_ZMoveActivateDamaging); } *effect = 1; } @@ -4356,8 +4341,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4370,8 +4354,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4384,8 +4367,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_DEF, 2, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4398,8 +4380,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4414,8 +4395,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_SPATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4430,8 +4410,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WeakArmorActivates; + BattleScriptCall(BattleScript_WeakArmorActivates); effect++; } break; @@ -4448,8 +4427,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; gDisableStructs[gBattlerAttacker].disableTimer = 4; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gChosenMove); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CursedBodyActivates; + BattleScriptCall(BattleScript_CursedBodyActivates); effect++; } break; @@ -4473,8 +4451,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MummyActivates; + BattleScriptCall(BattleScript_MummyActivates); effect++; break; } @@ -4497,8 +4474,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gLastUsedAbility; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates; + BattleScriptCall(BattleScript_WanderingSpiritActivates); effect++; break; } @@ -4511,8 +4487,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { SET_STATCHANGER(STAT_ATK, MAX_STAT_STAGE - gBattleMons[battler].statStages[STAT_ATK], FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetsStatWasMaxedOut; + BattleScriptCall(BattleScript_TargetsStatWasMaxedOut); effect++; } break; @@ -4528,8 +4503,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { SET_BATTLER_TYPE(battler, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; + BattleScriptCall(BattleScript_ColorChangeActivates); effect++; } break; @@ -4545,8 +4519,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { SET_STATCHANGER(STAT_SPEED, 1, TRUE); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GooeyActivates; + BattleScriptCall(BattleScript_GooeyActivates); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4564,8 +4537,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; + BattleScriptCall(BattleScript_RoughSkinActivates); effect++; } break; @@ -4579,8 +4551,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if ((battler = IsAbilityOnField(ABILITY_DAMP))) { gBattleScripting.battler = battler - 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_DampPreventsAftermath; + BattleScriptCall(BattleScript_DampPreventsAftermath); } else { @@ -4588,8 +4559,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; + BattleScriptCall(BattleScript_AftermathDmg); } effect++; } @@ -4605,8 +4575,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.battler = gBattlerTarget; gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget]; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AftermathDmg; + BattleScriptCall(BattleScript_AftermathDmg); effect++; } break; @@ -4650,8 +4619,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4672,8 +4640,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4693,8 +4660,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4712,8 +4678,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4733,8 +4698,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + BattleScriptCall(BattleScript_CuteCharmActivates); effect++; } break; @@ -4742,8 +4706,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON && IsBattlerTurnDamaged(gBattlerTarget)) { gBattleScripting.battler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IllusionOff; + BattleScriptCall(BattleScript_IllusionOff); effect++; } break; @@ -4754,8 +4717,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget)) { gEffectBattler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CottonDownActivates; + BattleScriptCall(BattleScript_CottonDownActivates); effect++; } break; @@ -4768,8 +4730,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = battler; SET_STATCHANGER(STAT_SPEED, 6, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4781,15 +4742,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BlockedByPrimalWeatherRet; + BattleScriptCall(BattleScript_BlockedByPrimalWeatherRet); effect++; } else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, TRUE)) { gBattleScripting.battler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SandSpitActivates; + BattleScriptCall(BattleScript_SandSpitActivates); effect++; } } @@ -4810,8 +4769,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } gStatuses3[gBattlerAttacker] |= STATUS3_PERISH_SONG; gDisableStructs[gBattlerAttacker].perishSongTimer = 3; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_PerishBodyActivates; + BattleScriptCall(BattleScript_PerishBodyActivates); effect++; } break; @@ -4833,14 +4791,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { case SPECIES_CRAMORANT_GORGING: TryBattleFormChange(battler, FORM_CHANGE_HIT_BY_MOVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GulpMissileGorging; + BattleScriptCall(BattleScript_GulpMissileGorging); effect++; break; case SPECIES_CRAMORANT_GULPING: TryBattleFormChange(battler, FORM_CHANGE_HIT_BY_MOVE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_GulpMissileGulping; + BattleScriptCall(BattleScript_GulpMissileGulping); effect++; break; } @@ -4853,8 +4809,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerAlive(gBattlerTarget) && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SeedSowerActivates; + BattleScriptCall(BattleScript_SeedSowerActivates); effect++; } break; @@ -4867,8 +4822,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gEffectBattler = gBattlerTarget; SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseRet; + BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; @@ -4881,8 +4835,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && HadMoreThanHalfHpNowDoesnt(gBattlerTarget) && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AngerShellActivates; + BattleScriptCall(BattleScript_AngerShellActivates); effect++; } break; @@ -4896,8 +4849,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WindPowerActivates; + BattleScriptCall(BattleScript_WindPowerActivates); effect++; } break; @@ -4910,8 +4862,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (gSideTimers[GetBattlerSide(gBattlerAttacker)].toxicSpikesAmount != 2)) { SWAP(gBattlerAttacker, gBattlerTarget, i); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ToxicDebrisActivates; + BattleScriptCall(BattleScript_ToxicDebrisActivates); effect++; } break; @@ -4932,8 +4883,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4948,8 +4898,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } @@ -4974,8 +4923,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerFormChange; + BattleScriptCall(BattleScript_AttackerFormChange); effect++; } break; @@ -4987,8 +4935,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + BattleScriptCall(BattleScript_AbilityStatusEffect); effect++; } break; @@ -5115,23 +5062,19 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { case 1: // status cleared gBattleMons[battler].status1 = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; + BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 2: // get rid of confusion RemoveConfusionStatus(battler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; + BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 3: // get rid of infatuation gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattlerGotOverItsInfatuation; + BattleScriptCall(BattleScript_BattlerGotOverItsInfatuation); break; case 4: // get rid of taunt gDisableStructs[battler].tauntTimer = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BattlerShookOffTaunt; + BattleScriptCall(BattleScript_BattlerShookOffTaunt); break; } @@ -5155,7 +5098,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->synchronizeMoveEffect, STATUS_CHECK_TRIGGER); - BattleScriptPushCursor(); gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); @@ -5167,13 +5109,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + BattleScriptCall(BattleScript_SynchronizeActivates); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } else // Synchronize ability pop up still shows up even if status fails { - gBattlescriptCurrInstr = BattleScript_AbilityPopUp; + BattleScriptCall(BattleScript_AbilityPopUp); } } break; @@ -5189,7 +5131,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->synchronizeMoveEffect, STATUS_CHECK_TRIGGER); - BattleScriptPushCursor(); gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); @@ -5201,13 +5142,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + BattleScriptCall(BattleScript_SynchronizeActivates); gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } else // Synchronize ability pop up still shows up even if status fails { - gBattlescriptCurrInstr = BattleScript_AbilityPopUp; + BattleScriptCall(BattleScript_AbilityPopUp); } } break; @@ -5526,8 +5467,7 @@ void BattleScriptExecute(const u8 *BS_ptr) void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BS_ptr; + BattleScriptCall(BS_ptr); gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc; gBattleMainFunc = RunBattleScriptCommands; } @@ -5894,11 +5834,10 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, e } else { - BattleScriptPushCursor(); if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - gBattlescriptCurrInstr = BattleScript_BerryConfuseHealRet; + BattleScriptCall(BattleScript_BerryConfuseHealRet); else - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); } return ITEM_HP_CHANGE; @@ -5921,14 +5860,9 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -5972,15 +5906,9 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } - + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -5997,8 +5925,7 @@ static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, enum ItemCaseId } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MicleBerryActivateRet; + BattleScriptCall(BattleScript_MicleBerryActivateRet); } return ITEM_EFFECT_OTHER; } @@ -6018,8 +5945,7 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battler) if (GetBattlerAbility(battler) == ABILITY_RIPEN) gBattleStruct->moveDamage[battler] *= 2; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); return ITEM_HP_CHANGE; } return ITEM_NO_EFFECT; @@ -6047,8 +5973,7 @@ static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 ca gBattleScripting.battler = battler; gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -6065,14 +5990,9 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) - { BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; - } + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -6094,8 +6014,7 @@ static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) } else { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; + BattleScriptCall(BattleScript_EjectPackActivate_Ret); } return ITEM_STATS_CHANGE; } @@ -6113,14 +6032,9 @@ static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerserkGeneRet; - } + BattleScriptCall(BattleScript_BerserkGeneRet); return ITEM_STATS_CHANGE; } @@ -6152,14 +6066,10 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, enum ItemCaseId caseID) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_BerryPPHealEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryPPHealRet; - } + BattleScriptCall(BattleScript_BerryPPHealRet); + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(battler); if (MOVE_IS_PERMANENT(battler, i)) @@ -6187,14 +6097,9 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 pe gBattlerAbility = battler; // in SWSH, berry juice shows ability pop up but has no effect. This is mimicked here if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; - } + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); return ITEM_HP_CHANGE; } @@ -6279,14 +6184,9 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) gProtectStructs[battler].eatMirrorHerb = 0; ChooseStatBoostAnimation(battler); if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MirrorHerbCopyStatChange; - } + BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); effect = ITEM_STATS_CHANGE; } return effect; @@ -6304,14 +6204,9 @@ static inline u32 TryBoosterEnergy(u32 battler, enum ItemCaseId caseID) gBattlerAbility = gBattleScripting.battler = battler; gDisableStructs[battler].boosterEnergyActivates = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_BoosterEnergyEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BoosterEnergyRet; - } + BattleScriptCall(BattleScript_BoosterEnergyRet); return ITEM_EFFECT_OTHER; } @@ -6421,8 +6316,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureParRet; + BattleScriptCall(BattleScript_BerryCureParRet); effect = ITEM_STATUS_CHANGE; } break; @@ -6430,8 +6324,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet; + BattleScriptCall(BattleScript_BerryCurePsnRet); effect = ITEM_STATUS_CHANGE; } break; @@ -6439,8 +6332,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_BURN && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; + BattleScriptCall(BattleScript_BerryCureBrnRet); effect = ITEM_STATUS_CHANGE; } break; @@ -6448,15 +6340,13 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_FREEZE && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; + BattleScriptCall(BattleScript_BerryCureFrzRet); effect = ITEM_STATUS_CHANGE; } if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureFrbRet; + BattleScriptCall(BattleScript_BerryCureFrbRet); effect = ITEM_STATUS_CHANGE; } break; @@ -6465,8 +6355,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) { gBattleMons[battler].status1 &= ~STATUS1_SLEEP; gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; + BattleScriptCall(BattleScript_BerryCureSlpRet); effect = ITEM_STATUS_CHANGE; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } @@ -6475,8 +6364,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status2 & STATUS2_CONFUSION && !UnnerveOn(battler, gLastUsedItem)) { RemoveConfusionStatus(battler); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; + BattleScriptCall(BattleScript_BerryCureConfusionRet); effect = ITEM_EFFECT_OTHER; } break; @@ -6485,8 +6373,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) { gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MentalHerbCureRet; + BattleScriptCall(BattleScript_MentalHerbCureRet); effect = ITEM_EFFECT_OTHER; } break; @@ -6517,9 +6404,8 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) gBattleMons[battler].status1 = 0; RemoveConfusionStatus(battler); - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; + BattleScriptCall(BattleScript_BerryCureChosenStatusRet); effect = ITEM_STATUS_CHANGE; } break; @@ -6531,8 +6417,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; gBattleScripting.battler = battler; gPotentialItemEffectBattler = battler; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryFocusEnergyRet; + BattleScriptCall(BattleScript_BerryFocusEnergyRet); effect = ITEM_EFFECT_OTHER; } break; @@ -6595,14 +6480,9 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) gBattleMons[battler].status1 = 0; RemoveConfusionStatus(battler); if (caseId == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseId == ITEMEFFECT_NORMAL) - { BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; - } + BattleScriptCall(BattleScript_BerryCureChosenStatusRet); effect = ITEM_STATUS_CHANGE; } @@ -7100,8 +6980,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gLastUsedItem = atkItem; SET_STATCHANGER(STAT_SPEED, 2, FALSE); effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; + BattleScriptCall(BattleScript_AttackerItemStatRaise); } break; default: @@ -7129,8 +7008,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleScripting.savedDmg / atkHoldEffectParam) * -1; if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = -1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret; + BattleScriptCall(BattleScript_ItemHealHP_Ret); effect = ITEM_HP_CHANGE; } break; @@ -7147,8 +7025,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHurtRet; + BattleScriptCall(BattleScript_ItemHurtRet); gLastUsedItem = atkItem; } break; @@ -7163,8 +7040,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleScripting.battler = gBattlerAttacker; SET_STATCHANGER(STAT_SPATK, 1, FALSE); effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; + BattleScriptCall(BattleScript_AttackerItemStatRaise); } break; default: @@ -7181,8 +7057,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) if (IsBattlerTurnDamaged(gBattlerTarget)) { effect = ITEM_EFFECT_OTHER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AirBaloonMsgPop; + BattleScriptCall(BattleScript_AirBaloonMsgPop); } break; case HOLD_EFFECT_ROCKY_HELMET: @@ -7196,8 +7071,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RockyHelmetActivates; + BattleScriptCall(BattleScript_RockyHelmetActivates); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); RecordItemEffectBattle(battler, HOLD_EFFECT_ROCKY_HELMET); } @@ -7208,8 +7082,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) { effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WeaknessPolicy; + BattleScriptCall(BattleScript_WeaknessPolicy); } break; case HOLD_EFFECT_SNOWBALL: @@ -7218,8 +7091,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && moveType == TYPE_ICE) { effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + BattleScriptCall(BattleScript_TargetItemStatRaise); SET_STATCHANGER(STAT_ATK, 1, FALSE); } break; @@ -7229,8 +7101,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && moveType == TYPE_WATER) { effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + BattleScriptCall(BattleScript_TargetItemStatRaise); SET_STATCHANGER(STAT_SPDEF, 1, FALSE); } break; @@ -7240,8 +7111,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && moveType == TYPE_ELECTRIC) { effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + BattleScriptCall(BattleScript_TargetItemStatRaise); SET_STATCHANGER(STAT_ATK, 1, FALSE); } break; @@ -7251,8 +7121,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && moveType == TYPE_WATER) { effect = ITEM_STATS_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + BattleScriptCall(BattleScript_TargetItemStatRaise); SET_STATCHANGER(STAT_SPATK, 1, FALSE); } break; @@ -7273,8 +7142,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleStruct->moveDamage[gBattlerAttacker] *= 2; effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); RecordItemEffectBattle(battler, HOLD_EFFECT_JABOCA_BERRY); } @@ -7293,8 +7161,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattleStruct->moveDamage[gBattlerAttacker] *= 2; effect = ITEM_HP_CHANGE; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_JabocaRowapBerryActivates; + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); RecordItemEffectBattle(battler, HOLD_EFFECT_ROWAP_BERRY); } @@ -7330,8 +7197,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) // No sticky hold checks. gEffectBattler = battler; // gEffectBattler = target StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker takes target's barb - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyBarbTransfer; + BattleScriptCall(BattleScript_StickyBarbTransfer); effect = ITEM_EFFECT_OTHER; } break; @@ -7392,10 +7258,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_WHITE_HERB: effect = RestoreWhiteHerbStats(battler); if (effect != 0) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - } + BattleScriptCall(BattleScript_WhiteHerbRet); break; default: break; @@ -10319,14 +10182,9 @@ bool32 TryClearIllusion(u32 battler, u32 caseID) gBattleScripting.battler = battler; if (caseID == ABILITYEFFECT_ON_SWITCHIN) - { BattleScriptPushCursorAndCallback(BattleScript_IllusionOffEnd3); - } else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IllusionOff; - } + BattleScriptCall(BattleScript_IllusionOff); return TRUE; } diff --git a/src/battle_util2.c b/src/battle_util2.c index fd2312bb5b..607aebfba6 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -141,9 +141,8 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) // Wake up from Uproar gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; } else @@ -171,9 +170,8 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) { // Wake up gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); - BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; - gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; + BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; } } @@ -192,8 +190,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) { // Unfreeze gBattleMons[battler].status1 &= ~(STATUS1_FREEZE); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; + BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; From 096493aa359f66aade500f10f5e8d697b9d12c4e Mon Sep 17 00:00:00 2001 From: jfb1337 <184441704+jfb1337@users.noreply.github.com> Date: Sat, 31 May 2025 08:47:25 +0100 Subject: [PATCH 019/248] AI: Add AI_SMART_TERA flag to make smarter decisions about when to terastalize. (#6705) Co-authored-by: jfb1337 <> Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- docs/tutorials/ai_flags.md | 5 +- include/battle.h | 1 + include/battle_ai_util.h | 13 +- include/config/ai.h | 4 + include/constants/battle_ai.h | 8 +- include/random.h | 1 + src/battle_ai_main.c | 23 +- src/battle_ai_util.c | 290 ++++++++++++++++++++++++- src/battle_controller_opponent.c | 4 +- src/battle_controller_player_partner.c | 4 +- test/battle/ai/ai_smart_tera.c | 73 +++++++ 11 files changed, 402 insertions(+), 24 deletions(-) create mode 100644 test/battle/ai/ai_smart_tera.c diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index b0ecc8d77a..af3d3c0718 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -33,7 +33,7 @@ Expansion has a few "composite" AI flags. This means that these flags have no un `AI_FLAG_BASIC_TRAINER` is expansion's version of generic, normal AI behaviour. It includes `AI_FLAG_CHECK_BAD_MOVE` (don't use bad moves), `AI_FLAG_TRY_TO_FAINT` (faint the player where possible), and `AI_FLAG_CHECK_VIABILITY` (choose the most effective move to use in the current context). Trainers with this flag will still be smarter than they are in vanilla as there have been dramatic improvements made to move selection, but not incredibly so. Trainers with this flag should feel like normal trainers. In general we recommend these three flags be used in all cases, unless you specifically want a trainer who makes obvious mistakes in battle. -`AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), and `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing. +`AI_FLAG_SMART_TRAINER` is expansion's version of a "smart AI". It includes everything in `AI_FLAG_BASIC_TRAINER` along with `AI_FLAG_SMART_SWITCHING` (make smart decisions about when to switch), `AI_FLAG_SMART_MON_CHOICES` (make smart decisions about what mon to send in after a switch / KO), `AI_FLAG_OMNISCIENT` (awareness of what moves, items, and abilities the player's mons have to better inform decisions), and `AI_FLAG_SMART_TERA` (make smart decisions about when to terastalize). Expansion will keep this updated to represent the most objectively intelligent behaviour our flags are capable of producing. `AI_FLAG_PREDICTION` will enable all of the prediction flags at once, so the AI can perform as well as possible. It is best paired with the flags in `AI_FLAG_SMART_TRAINER` for optimal behaviour. This currently includes `AI_FLAG_PREDICT_SWITCH` and `AI_FLAG_PREDICT_INCOMING_MON`, but will likely be expanded in the future. @@ -180,6 +180,9 @@ AI will determine whether it would switch out in the player's situation or not, ## `AI_FLAG_PREDICT_INCOMING_MON` This flag requires `AI_FLAG_PREDICT_SWITCH` to function. If the AI predicts that the player will switch, this flag allows the AI to run its move scoring calculation against the Pokémon it expects the player to switch into, instead of the Pokémon that it expects to switch out. +## `AI_FLAG_SMART_TERA` +AI will make smarter decisions about when to terastalize (over the default behaviour to always tera when available). This considers factors such as whether tera allows the AI to KO the opponent, whether it can save itself from a KO or a big hit, and how many remaining pokemon could terastalize. This behavior is not currently supported in double battles. + ## `AI_FLAG_PREDICT_MOVE` AI will predict what move the player is going to use based on what move it would use in the same situation. Generally works best if also using `AI_FLAG_OMNISCIENT`. diff --git a/include/battle.h b/include/battle.h index 6b9609758b..0c36e07383 100644 --- a/include/battle.h +++ b/include/battle.h @@ -791,6 +791,7 @@ struct AiBattleData u8 playerStallMons[PARTY_SIZE]; u8 chosenMoveIndex[MAX_BATTLERS_COUNT]; u8 chosenTarget[MAX_BATTLERS_COUNT]; + u16 aiUsingGimmick:6; u8 actionFlee:1; u8 choiceWatch:1; u8 padding:6; diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 66fe8d550d..345212ec47 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -38,6 +38,12 @@ enum WeatherState WEATHER_INACTIVE_AND_BLOCKED, }; +enum AIConsiderGimmick +{ + NO_GIMMICK, + USE_GIMMICK, +}; + static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations) { return move == MOVE_NONE @@ -108,6 +114,9 @@ bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); +void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); +bool32 IsAIUsingGimmick(u32 battler); +void DecideTerastal(u32 battler); u32 AI_GetBattlerAbility(u32 battler); // stat stage checks @@ -129,8 +138,8 @@ bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower); -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather); +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather); bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); diff --git a/include/config/ai.h b/include/config/ai.h index db98f72ee9..987e1fff5e 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -64,6 +64,10 @@ #define PREDICT_SWITCH_CHANCE 50 #define PREDICT_MOVE_CHANCE 100 +// AI Terastalization chances +#define AI_CONSERVE_TERA_CHANCE_PER_MON 10 // Chance for AI with smart tera flag to decide not to tera before considering defensive benefit is this*(X-1), where X is the number of alive pokemon that could tera +#define AI_TERA_PREDICT_CHANCE 40 // Chance for AI with smart tera flag to tera in the situation where tera would save it from a KO, but could be punished by a KO from a different move. + // AI PP Stall detection chance per roll #define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 // Score reduction if any roll for PP stall detection passes diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index d7b70af874..754c145d32 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -32,16 +32,16 @@ #define AI_FLAG_PREDICT_INCOMING_MON (1 << 24) // AI will score against the predicting incoming mon if it predicts the player to switch. Requires AI_FLAG_PREDICT_SWITCH #define AI_FLAG_PP_STALL_PREVENTION (1 << 25) // AI keeps track of the player's switches where the incoming mon is immune to the chosen move #define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT +#define AI_FLAG_SMART_TERA (1 << 27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). + +#define AI_FLAG_COUNT 28 // Flags at and after 32 need different formatting, as in // #define AI_FLAG_PLACEHOLDER ((u64)1 << 32) - -#define AI_FLAG_COUNT 27 - // The following options are enough to have a basic/smart trainer. Any other addtion could make the trainer worse/better depending on the flag #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) -#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_WEIGH_ABILITY_PREDICTION) +#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_WEIGH_ABILITY_PREDICTION | AI_FLAG_SMART_TERA) #define AI_FLAG_PREDICTION (AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON | AI_FLAG_PREDICT_MOVE) // 'other' ai logic flags diff --git a/include/random.h b/include/random.h index b9a0ab4311..dc3c73cc3a 100644 --- a/include/random.h +++ b/include/random.h @@ -190,6 +190,7 @@ enum RandomTag RNG_AI_SWITCH_TRAPPER, RNG_AI_SWITCH_FREE_TURN, RNG_AI_SWITCH_ALL_MOVES_BAD, + RNG_AI_CONSERVE_TERA, RNG_AI_SWITCH_ALL_SCORES_BAD, RNG_AI_PP_STALL_DISREGARD_MOVE, RNG_SHELL_SIDE_ARM, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2805a10692..539b18f1b7 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -399,15 +399,36 @@ void ComputeBattlerDecisions(u32 battler) } } +void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) +{ + // After choosing a move for battlerAtk assuming that a gimmick will be used, reconsider whether the gimmick is necessary. + + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !ShouldUseZMove(battlerAtk, battlerDef, move)) + SetAIUsingGimmick(battlerAtk, NO_GIMMICK); + + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_TERA && GetMoveEffect(move) == EFFECT_PROTECT) + SetAIUsingGimmick(battlerAtk, NO_GIMMICK); +} + u32 BattleAI_ChooseMoveIndex(u32 battler) { u32 chosenMoveIndex; + SetAIUsingGimmick(battler, USE_GIMMICK); + + if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + DecideTerastal(battler); + + if (!IsDoubleBattle()) chosenMoveIndex = ChooseMoveOrAction_Singles(battler); else chosenMoveIndex = ChooseMoveOrAction_Doubles(battler); + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) + ReconsiderGimmick(battler, gBattlerTarget, gBattleMons[battler].moves[chosenMoveIndex]); + + // Clear protect structures, some flags may be set during AI calcs // e.g. pranksterElevated from GetBattleMovePriority memset(&gProtectStructs, 0, MAX_BATTLERS_COUNT * sizeof(struct ProtectStruct)); @@ -555,7 +576,7 @@ static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u continue; // Also get effectiveness of status moves - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, TRUE, weather); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, USE_GIMMICK, NO_GIMMICK, weather); aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = Ai_SetMoveAccuracy(aiData, battlerAtk, battlerDef, move); aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = dmg; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e71f11c70f..4b24ea76c8 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -446,7 +446,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) } // To save computation time this function has 2 variants. One saves, sets and restores battlers, while the other doesn't. -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower) +struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef) { struct SimulatedDamage dmg; @@ -454,7 +454,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerZPower, AI_GetWeather()); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerGimmickAtk, considerGimmickDef, AI_GetWeather()); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -732,14 +732,15 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo return FALSE; } -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower, u32 weather) +struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather) { struct SimulatedDamage simDamage; s32 moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); uq4_12_t effectivenessMultiplier; bool32 isDamageMoveUnusable = FALSE; - bool32 toggledGimmick = FALSE; + bool32 toggledGimmickAtk = FALSE; + bool32 toggledGimmickDef = FALSE; struct AiLogicData *aiData = gAiLogicData; gAiLogicData->aiCalcInProgress = TRUE; @@ -748,16 +749,23 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u // Temporarily enable gimmicks for damage calcs if planned if (gBattleStruct->gimmick.usableGimmick[battlerAtk] && GetActiveGimmick(battlerAtk) == GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !considerZPower)) + && gBattleStruct->gimmick.usableGimmick[battlerAtk] != GIMMICK_NONE && considerGimmickAtk == USE_GIMMICK) { // Set Z-Move variables if needed if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && IsViableZMove(battlerAtk, move)) gBattleStruct->zmove.baseMoves[battlerAtk] = move; - toggledGimmick = TRUE; + toggledGimmickAtk = TRUE; SetActiveGimmick(battlerAtk, gBattleStruct->gimmick.usableGimmick[battlerAtk]); } + if (gBattleStruct->gimmick.usableGimmick[battlerDef] && GetActiveGimmick(battlerDef) == GIMMICK_NONE + && gBattleStruct->gimmick.usableGimmick[battlerDef] != GIMMICK_NONE && considerGimmickDef == USE_GIMMICK) + { + toggledGimmickDef = TRUE; + SetActiveGimmick(battlerDef, gBattleStruct->gimmick.usableGimmick[battlerDef]); + } + SetDynamicMoveCategory(battlerAtk, battlerDef, move); SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); @@ -860,8 +868,10 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u gBattleStruct->dynamicMoveType = 0; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->zmove.baseMoves[battlerAtk] = MOVE_NONE; - if (toggledGimmick) + if (toggledGimmickAtk) SetActiveGimmick(battlerAtk, GIMMICK_NONE); + if (toggledGimmickDef) + SetActiveGimmick(battlerDef, GIMMICK_NONE); gAiLogicData->aiCalcInProgress = FALSE; return simDamage; } @@ -3921,8 +3931,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather()); - + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); @@ -4461,7 +4470,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) return FALSE; - dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, FALSE); + dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK); if (!IsBattleMoveStatus(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) return FALSE; // don't waste damaging z move if can otherwise faint target @@ -4472,6 +4481,267 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; } +void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use) +{ + if (use == USE_GIMMICK) + gAiBattleData->aiUsingGimmick |= (1<aiUsingGimmick &= ~(1<aiUsingGimmick & (1<gimmick.usableGimmick[battler] != GIMMICK_TERA) + return; + + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + return; + + // TODO: Currently only single battles are considered. + if (IsDoubleBattle()) + return; + + // TODO: A lot of these checks are most effective for an omnicient ai. + // If we don't have enough information about the opponent's moves, consider simpler checks based on type effectivness. + + u32 opposingBattler = GetOppositeBattler(battler); + + // Default calculations automatically assume gimmicks for the attacker, but not the defender. + // Consider calcs for the other possibilities. + struct AltTeraCalcs altCalcs; + + struct SimulatedDamage noDmg = {0}; + + uq4_12_t effectivenessTakenWithTera[MAX_MON_MOVES]; + + u16* aiMoves = GetMovesArray(battler); + u16* oppMoves = GetMovesArray(opposingBattler); + + uq4_12_t effectiveness; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (!IsMoveUnusable(i, aiMoves[i], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[i])) + altCalcs.dealtWithoutTera[i] = AI_CalcDamage(aiMoves[i], battler, opposingBattler, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); + else + altCalcs.dealtWithoutTera[i] = noDmg; + + + if (!IsMoveUnusable(i, oppMoves[i], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[i])) + { + altCalcs.takenWithTera[i] = AI_CalcDamage(oppMoves[i], opposingBattler, battler, &effectiveness, USE_GIMMICK, USE_GIMMICK, AI_GetWeather()); + effectivenessTakenWithTera[i] = effectiveness; + } + else + { + altCalcs.takenWithTera[i] = noDmg; + effectivenessTakenWithTera[i] = Q_4_12(0.0); + } + } + + + enum AIConsiderGimmick res = ShouldTeraFromCalcs(battler, opposingBattler, &altCalcs); + + + if (res == USE_GIMMICK) + { + // Damage calcs for damage received assumed we wouldn't tera. Adjust that so that further AI decisions are more accurate. + for (int i = 0; i < MAX_MON_MOVES; i++) + { + gAiLogicData->simulatedDmg[opposingBattler][battler][i] = altCalcs.takenWithTera[i]; + gAiLogicData->effectiveness[opposingBattler][battler][i] = effectivenessTakenWithTera[i]; + } + } + else + { + // Damage calcs for damage dealt assumed we would tera. Adjust that so that further AI decisions are more accurate. + for (int i = 0; i < MAX_MON_MOVES; i++) + gAiLogicData->simulatedDmg[battler][opposingBattler][i] = altCalcs.dealtWithoutTera[i]; + } + + SetAIUsingGimmick(battler, res); + return; +} + +// macros are not expanded recursively +#define dealtWithTera gAiLogicData->simulatedDmg[battler][opposingBattler] +#define dealtWithoutTera altCalcs->dealtWithoutTera +#define takenWithTera altCalcs->takenWithTera +#define takenWithoutTera gAiLogicData->simulatedDmg[opposingBattler][battler] + +enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, struct AltTeraCalcs *altCalcs) { + struct Pokemon* party = GetBattlerParty(battler); + + // Check how many pokemon we have that could tera + int numPossibleTera = 0; + for (int i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + && GetMonData(&party[i], MON_DATA_TERA_TYPE) > 0) + numPossibleTera++; + } + + u16 aiHp = gBattleMons[battler].hp; + u16 oppHp = gBattleMons[opposingBattler].hp; + + u16* aiMoves = GetMovesArray(battler); + u16* oppMoves = GetMovesArray(opposingBattler); + + // Check whether tera enables a KO + bool32 hasKoWithout = FALSE; + u16 killingMove = MOVE_NONE; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (dealtWithTera[i].median >= oppHp) + { + u16 move = aiMoves[i]; + if (killingMove == MOVE_NONE || GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove)) + killingMove = move; + } + if (dealtWithoutTera[i].median >= oppHp) + hasKoWithout = TRUE; + } + + bool32 enablesKo = (killingMove != MOVE_NONE) && !hasKoWithout; + + // Check whether tera saves us from a KO + bool32 savedFromKo = FALSE; + bool32 getsKodRegardlessBySingleMove = FALSE; + + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum >= aiHp) + getsKodRegardlessBySingleMove = TRUE; + + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum < aiHp) + savedFromKo = TRUE; + } + + if (getsKodRegardlessBySingleMove) + savedFromKo = FALSE; + + // Check whether opponent can punish tera by ko'ing + u16 hardPunishingMove = MOVE_NONE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithTera[i].maximum >= aiHp) + { + u16 move = oppMoves[i]; + if (hardPunishingMove == MOVE_NONE || GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], move) > GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + hardPunishingMove = move; + } + } + + // Check whether there is a move that deals over half hp, and all such moves are reduced to under 1/4 hp by tera + // (e.g. a weakness becomes a resistance, a 4x weakness becomes neutral, etc) + bool32 takesBigHit = FALSE; + bool32 savedFromAllBigHits = TRUE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithoutTera[i].median > aiHp/2) + { + takesBigHit = TRUE; + if (takenWithTera[i].median > aiHp/4) + savedFromAllBigHits = FALSE; + } + } + + // Check for any benefit whatsoever. Only used for the last possible mon that could tera. + bool32 anyOffensiveBenefit = FALSE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (dealtWithTera[i].median > dealtWithoutTera[i].median) + anyOffensiveBenefit = TRUE; + } + + bool32 anyDefensiveBenefit = FALSE; + bool32 anyDefensiveDrawback = FALSE; + for (int i = 0; i < MAX_MON_MOVES; i++) + { + if (takenWithTera[i].median < takenWithoutTera[i].median) + anyDefensiveBenefit = TRUE; + + if (takenWithTera[i].median > takenWithoutTera[i].median) + anyDefensiveDrawback = TRUE; + } + + // Make decisions + // This is done after all loops to minimize the possibility of a timing attack in which the player could + // determine whether the AI will tera based on the time taken to select a move. + + if (enablesKo) + { + if (hardPunishingMove == MOVE_NONE) + { + return USE_GIMMICK; + } + else + { + // will we go first? + if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + return USE_GIMMICK; + } + } + + // Decide to conserve tera based on number of possible later oppotunities + u16 conserveTeraChance = AI_CONSERVE_TERA_CHANCE_PER_MON * (numPossibleTera-1); + if (RandomPercentage(RNG_AI_CONSERVE_TERA, conserveTeraChance)) + return NO_GIMMICK; + + if (savedFromKo) + { + if (hardPunishingMove == MOVE_NONE) + { + return USE_GIMMICK; + } + else + { + // If tera saves us from a ko from one move, but enables a ko otherwise, randomly predict + // savesFromKo being true ensures opponent doesn't have a ko if we don't tera + if (Random() % 100 < AI_TERA_PREDICT_CHANCE) + return USE_GIMMICK; + } + } + + if (hardPunishingMove != MOVE_NONE) + return NO_GIMMICK; + + if (takesBigHit && savedFromAllBigHits) + return USE_GIMMICK; + + // No strongly compelling reason to tera. Conserve it if possible. + if (numPossibleTera > 1) + return NO_GIMMICK; + + if (anyOffensiveBenefit || (anyDefensiveBenefit && !anyDefensiveDrawback)) + return USE_GIMMICK; + + // TODO: Effects other than direct damage are not yet considered. For example, may want to tera poison to avoid a Toxic. + + + return NO_GIMMICK; +} +#undef dealtWithTera +#undef dealtWithoutTera +#undef takenWithTera +#undef takenWithoutTera + + bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId) { return (gBattleMons[battlerId].status1 & STATUS1_SLEEP) || gAiLogicData->abilities[battlerId] == ABILITY_COMATOSE; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 03c78fb9e9..7dfb46efd4 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -522,9 +522,7 @@ static void OpponentHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } // If opponent can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE - && !ShouldUseZMove(battler, gBattlerTarget, moveInfo->moves[chosenMoveIndex]))) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index ad5aa15312..6aa5746f85 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -328,9 +328,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } // If partner can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE - && !(gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_Z_MOVE - && !ShouldUseZMove(battler, gBattlerTarget, moveInfo->moves[chosenMoveIndex]))) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c new file mode 100644 index 0000000000..e82b09151e --- /dev/null +++ b/test/battle/ai/ai_smart_tera.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will tera if it enables a ko") +{ + KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + ASSUME(GetMovePower(MOVE_AQUA_TAIL) == 90); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_AQUA_TAIL, MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SEED_BOMB); } + } SCENE { + MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets outsped and ko'd") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { HP(60); Speed(1); Moves(MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { } + } SCENE { + NOT MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by priority") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(1); Moves(MOVE_QUICK_ATTACK, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); Moves(MOVE_SEED_BOMB, MOVE_AQUA_TAIL); TeraType(TYPE_GRASS); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { } + } SCENE { + NOT MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") +{ + KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. + PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { MOVE(player, MOVE_SEED_BOMB); } + } SCENE { + MESSAGE("The opposing Wobbuffet terastilized into the Fire type!"); + } +} \ No newline at end of file From 7f4f391e9bb73e699523958c6ada62aff3db54f4 Mon Sep 17 00:00:00 2001 From: ShinyVolcarona Date: Sat, 31 May 2025 05:34:24 -0400 Subject: [PATCH 020/248] New Attack Animations: 25w20a (#6886) --- data/battle_anim_scripts.s | 1046 ++++++++++++++++++++++++++++++++++- src/battle_anim_effects_2.c | 2 +- src/battle_anim_electric.c | 63 ++- src/battle_anim_flying.c | 11 + src/battle_anim_new.c | 11 + src/battle_anim_rock.c | 11 + 6 files changed, 1116 insertions(+), 28 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 49563e91e2..9a4d6cee98 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -13104,7 +13104,69 @@ gBattleAnimMove_DoubleIronBash:: @@@@@@@@@@@@@@@@@@@@@@@ GEN 8 @@@@@@@@@@@@@@@@@@@@@@@ gBattleAnimMove_DynamaxCannon:: - goto gBattleAnimMove_HyperBeam + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ORBS @hyper beam + loadspritegfx ANIM_TAG_WATER_GUN @water gun colour + loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_SPARK_2 @spark + loadspritegfx ANIM_TAG_LEAF @green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB(30, 2, 11) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(30, 2, 11) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(30, 2, 11) + setalpha 8, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 15, 0 + waitforvisualfinish + loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 14, 10 + createsprite gGrowingChargeOrb3SpriteTemplate, ANIM_ATTACKER, 2, 0 @;Charge circle + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + call LightThatBurnsTheSkyGreenSparks + delay 20 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 15, 0, 0 + fadetobg BG_DYNAMAX_CANNON + waitbgfadein + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 4, 10) @Pinkish Red + panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER SOUND_PAN_TARGET 2 0 + createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 87, 1 + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 4, 81, 1 + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + call DynamaxCannonLaunch + waitforvisualfinish + restorebg + waitbgfadein + blendoff + end + +DynamaxCannonLaunch: + createsprite gSpriteTemplate_DynamaxCannonOrb, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gSpriteTemplate_DynamaxCannonOrb, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + return gBattleAnimMove_SnipeShot:: loadspritegfx ANIM_TAG_IMPACT_2 @@ -13574,10 +13636,202 @@ gBattleAnimMove_PyroBall:: end gBattleAnimMove_BehemothBlade:: - goto gBattleAnimMove_SacredSword + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + loadspritegfx ANIM_TAG_HYDRO_PUMP @Blue Colour + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade + monbg ANIM_ATTACKER + setalpha 12, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, 0 + waitforvisualfinish + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, 0x2715, 2, 2, RGB(18, 31, 31), 16, 0, 0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + loadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 + delay 24 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + createsprite gSacredSwordBladesTemplate, ANIM_TARGET, 1, 0, 10, 0, 0xFF00, 10 + createsprite gSacredSwordCutTemplate, ANIM_ATTACKER, 2, 40, 0xffe0, 0 + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + loadspritegfx ANIM_TAG_WHITE_STREAK + call BehemothBladeSlashes + unloadspritegfx ANIM_TAG_WHITE_STREAK + waitforvisualfinish + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER_FORCE, 8, 0, 40, 1 + call OpposingExplosion2 + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +OpposingExplosion2: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + return + +BehemothBladeSlashes: + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -10, 3 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, 24, -19 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -28, -15 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 2 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -6, -30 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -20, 6 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -28, -15 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 2 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -6, -30 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + createsprite gAcrobaticsSlashesSpriteTemplate, ANIM_TARGET, 2, -20, 6 + playsewithpan SE_SHINY, SOUND_PAN_TARGET + delay 1 + return gBattleAnimMove_BehemothBash:: - goto gBattleAnimMove_SunsteelStrike + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + loadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 + delay 24 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_METEOR @superpower + loadspritegfx ANIM_TAG_GOLD_RING @beam + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + loadspritegfx ANIM_TAG_IMPACT @hit + playsewithpan SE_ORB, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, 0 + waitforvisualfinish + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + call BehemothBashBeam + stopsound + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 20 + delay 20 + createsprite gSunsteelStrikeRedImpactTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 + waitforvisualfinish + unloadspritegfx ANIM_TAG_METEOR @superpower + unloadspritegfx ANIM_TAG_GOLD_RING @beam + unloadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + unloadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect + clearmonbg ANIM_TARGET + blendoff + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_RIGHT, 8, 0, 40, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_ATTACKER_FORCE, 8, 0, 40, 1 + call OpposingExplosion1 + call OpposingExplosion1 + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +BehemothBashBeam: + createsprite gSunsteelStrikeYellowBeamTemplate, ANIM_TARGET, 2, 20 + delay 1 + createsprite gSunsteelStrikeRedBeamTemplate, ANIM_TARGET, 2, 20 + delay 1 + return +OpposingExplosion1: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 24, -24, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -16, 16, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, -24, -12, 1, 1 + delay 6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 16, 16, 1, 1 + delay 6 + return gBattleAnimMove_AuraWheel:: loadspritegfx ANIM_TAG_IMPACT @@ -13967,7 +14221,88 @@ BasicExplosion: return gBattleAnimMove_Eternabeam:: - goto gBattleAnimMove_HyperBeam + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_PURPLE_DRAKE + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(11, 1, 22) + fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + createsprite gDevastatingDrakeDrakeUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0x04E0, 36, 21, 1, ANIM_ATTACKER + waitforvisualfinish + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_SOLAR_BEAM, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + call OblivionWingBeam + call OblivionWingBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 4, 0, 12, RGB(31, 4, 10) @Pinkish Red + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + visible ANIM_ATTACKER + waitforvisualfinish + restorebg + waitbgfadein + blendoff + end +EternabeamGeyser: + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, 5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -15, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, 18, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, -11, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -31, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -21, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, 2, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, -11, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 3, -27, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -11, -47, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 8, -47, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, -6, -14, ANIM_TARGET, 0 + delay 0 + createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0, -27, ANIM_TARGET, 0 + delay 0 + return gBattleAnimMove_SteelBeam:: loadspritegfx ANIM_TAG_CLAW_SLASH @@ -18263,24 +18598,697 @@ SaltCureEffect: playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET return +gBattleAnimMove_GlaiveRush:: + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + call SetHighSpeedBg + setalpha 12, 8 + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 + delay 22 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, 0x2715, 2, 2, RGB(18, 31, 31), 16, 0, 0 + waitforvisualfinish + delay 1 + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_DRAGON_ASCENT + monbg ANIM_ATTACKER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_DRAGON_ASCENT, 0, 10, 10, RGB(0, 0, 31) @Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 0, 16, RGB_WHITE + delay 4 + createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 + waitforvisualfinish + createvisualtask SoundTask_PlaySE2WithPanning, 5, 238, SOUND_PAN_ATTACKER + createsprite gGlaiveRushSpriteTemplate, ANIM_TARGET, 2 + delay 14 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) + waitforvisualfinish + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 15, 0, RGB_WHITE + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetHighSpeedBg + end + +gBattleAnimMove_ArmorCannon:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL + monbg ANIM_ATTACKER + setalpha 13, 8 + fadetobg BG_FIRE + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 2560, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 12, 12, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(31, 0, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLASH_CANNON_BALL, 0, 15, 15, RGB(31, 16, 0) + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 + delay 25 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 15 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 10 + delay 6 + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 6, 5 + waitforvisualfinish + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 21 + clearmonbg ANIM_ATTACKER + waitforvisualfinish + loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect + call FireSpreadEffect + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_TripleDive:: + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_SPLASH + playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + createsprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0 + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 131, 1 + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + delay 12 + call RisingWaterHitEffect + waitforvisualfinish + visible ANIM_ATTACKER + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +gBattleAnimMove_Doodle:: + loadspritegfx ANIM_TAG_PENCIL + monbg ANIM_TARGET + createvisualtask AnimTask_SketchDrawMon, 2 + createsprite gPencilSpriteTemplate, ANIM_TARGET, 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + delay 12 + call GrowthEffect + waitforvisualfinish + call GrowthEffect + waitforvisualfinish + end + +gBattleAnimMove_Ruination:: + setalpha 0, 16 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 1, 0, 20, 1 + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 48, 1 + createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATTACKER, RGB(31, 6, 1), 12, 4, 1 + waitforvisualfinish + delay 20 + delay 1 + createvisualtask AnimTask_InitMementoShadow, 2 + delay 1 + createvisualtask AnimTask_MoveAttackerMementoShadow, 5 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_MementoHandleBg, 2 + delay 12 + setalpha 0, 16 + delay 1 + monbg_static ANIM_TARGET + createvisualtask AnimTask_MoveTargetMementoShadow, 5 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg_static ANIM_TARGET + delay 1 + blendoff + delay 1 + end + +gBattleAnimMove_CollisionCourse:: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRICITY + monbg ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 8, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB(31, 0, 0) + waitforvisualfinish + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 6 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 10 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + clearmonbg ANIM_ATTACKER + createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 0 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 1 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 2 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 3 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 4 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER + delay 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 8, 0, RGB_BLACK + call SetImpactBackground + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gFireSpreadSpriteTemplate, ANIM_ATTACKER, 2, 1, 16, 16 + delay 2 + createsprite gFireSpreadSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, -16 + delay 8 + createvisualtask AnimTask_VoltTackleAttackerReappear, 5 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 + waitforvisualfinish + call FireSpreadEffect + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadein + end + +gBattleAnimMove_ElectroDrift:: + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRICITY + loadspritegfx ANIM_TAG_LIGHTNING + monbg ANIM_ATTACKER + waitforvisualfinish + fadetobg BG_THUNDER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -256, 0, 1, -1 + waitbgfadein + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 + delay 10 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + delay 0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + delay 8 + createvisualtask AnimTask_VoltTackleBolt, 5, 0 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 1 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 2 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 3 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_VoltTackleBolt, 5, 4 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + delay 2 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 5 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 + delay 10 + createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 + delay 2 + createvisualtask AnimTask_VoltTackleAttackerReappear, 5 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 + call ElectricityEffect + waitforvisualfinish + blendoff + delay 2 + call UnsetPsychicBg + end + +gBattleAnimMove_Psyblade:: + loadspritegfx ANIM_TAG_SLASH + loadspritegfx ANIM_TAG_CROSS_IMPACT + loadspritegfx ANIM_TAG_LEER + call SetPsychicBackground + waitbgfadein + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 12 + createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 24, -12 + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 15, 0, 40, 1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 10, 10, RGB_RED + createsprite gSpriteTemplate_LargeCrossImpact, ANIM_TARGET, 2, 0, 0, 1, 36 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_MightyCleave:: + loadspritegfx ANIM_TAG_SLASH + loadspritegfx ANIM_TAG_CROSS_IMPACT + loadspritegfx ANIM_TAG_LEER + loadspritegfx ANIM_TAG_ROCKS + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 38, 1 + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + call MightyCleaveDiggingRun + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 12 + createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 24, -12 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 15, 0, 40, 1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 10, 10, RGB_RED + createsprite gSpriteTemplate_LargeCrossImpact, ANIM_TARGET, 2, 0, 0, 1, 36 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + waitbgfadein + call UnsetPsychicBg + waitforvisualfinish + end +MightyCleaveDiggingRun: + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 12, 4, -16, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 16, 4, -10, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 14, 4, -18, 18 + createsprite gRockPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 12, 4, -16, 18 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 5 + return + +gBattleAnimMove_SupercellSlam:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, ANIM_ATTACKER, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 10 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, ANIM_ATTACKER, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 20 + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 7, 7, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + waitforvisualfinish + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) + delay 4 + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER + waitforvisualfinish + delay 11 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, -31, 2, 0, 6, RGB(31, 31, 22) + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +gBattleAnimMove_BlazingTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SMALL_EMBER + fadetobg BG_FIRE + waitbgfadeout + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + call FireSpreadEffect + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_WickedTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_THIN_RING + fadetobg BG_DARK + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, 0 + createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, 0 + createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_NoxiousTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + fadetobg BG_GUNK_SHOT + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 2, 0, 12, RGB(30, 0, 31) + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + delay 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -8, -44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -46, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20 + delay 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 0, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20 + delay 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_CombatTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_METEOR + fadetobg BG_IN_AIR + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0, 0x1000, 0, -1 + waitbgfadein + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gSuperpowerFireballSpriteTemplate, ANIM_TARGET, 3, ANIM_ATTACKER + delay 4 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + call UnsetPsychicBg + end + +gBattleAnimMove_MagicalTorque:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_DUCK + loadspritegfx ANIM_TAG_RED_HEART + fadetobg BG_TWINKLE_TACKLE + waitbgfadeout + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 + delay 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end + gBattleAnimMove_TeraBlast:: gBattleAnimMove_OrderUp:: -gBattleAnimMove_GlaiveRush:: -gBattleAnimMove_TripleDive:: -gBattleAnimMove_Doodle:: -gBattleAnimMove_Ruination:: -gBattleAnimMove_CollisionCourse:: -gBattleAnimMove_ElectroDrift:: -gBattleAnimMove_ArmorCannon:: -gBattleAnimMove_BlazingTorque:: -gBattleAnimMove_WickedTorque:: -gBattleAnimMove_NoxiousTorque:: -gBattleAnimMove_CombatTorque:: -gBattleAnimMove_MagicalTorque:: -gBattleAnimMove_Psyblade:: gBattleAnimMove_MatchaGotcha:: -gBattleAnimMove_MightyCleave:: -gBattleAnimMove_SupercellSlam:: end @to do @@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@ diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index e0583c7cf8..93dddfc6d9 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -2581,7 +2581,7 @@ static void AnimPencil_Step(struct Sprite *sprite) sprite->y -= 1; sprite->data[2]++; if (sprite->data[2] % 10 == 0) - PlaySE12WithPanning(SE_M_SKETCH, sprite->data[6]); + PlaySE12WithPanning((gAnimMoveIndex == MOVE_DOODLE) ? SE_M_REVERSAL : SE_M_SKETCH, sprite->data[6]); } sprite->data[4] += sprite->data[3]; if (sprite->data[4] > 31) diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index bc8d321458..593f3830ba 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -343,6 +343,19 @@ static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = AFFINEANIMCMD_END, }; +static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_3[] = +{ + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 60), + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFC, 0, 5), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5), + AFFINEANIMCMD_LOOP(10), + AFFINEANIMCMD_FRAME(-4, -4, 0, 60), + AFFINEANIMCMD_END, +}; + static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_4[] = { AFFINEANIMCMD_FRAME(5, 5, 0, 0), @@ -368,6 +381,11 @@ const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb2[] = sAffineAnim_GrowingElectricOrb_4, }; +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb3[] = +{ + sAffineAnim_GrowingElectricOrb_3, +}; + const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -391,6 +409,18 @@ const struct SpriteTemplate gGrowingChargeOrb2SpriteTemplate = .callback = AnimGrowingChargeOrb, }; +// For Dynamax Cannon - orb gets smaller at the end +const struct SpriteTemplate gGrowingChargeOrb3SpriteTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb3, + .callback = AnimGrowingChargeOrb, +}; + static const union AnimCmd sAnim_ElectricPuff[] = { ANIMCMD_FRAME(0, 3), @@ -492,6 +522,17 @@ const struct SpriteTemplate gFairyLockChainsSpriteTemplate = .callback = AnimVoltTackleBolt, }; +const struct SpriteTemplate gCollisionCourseSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimVoltTackleBolt, +}; + const struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -1256,19 +1297,25 @@ void AnimTask_VoltTackleBolt(u8 taskId) static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId) { u32 spriteId; - bool32 isFairyLock = (gAnimMoveIndex == MOVE_FAIRY_LOCK); - - if (isFairyLock) - spriteId = CreateSprite(&gFairyLockChainsSpriteTemplate, task->data[3], task->data[5] + 10, 35); - else - spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); + switch(gAnimMoveIndex) + { + case MOVE_FAIRY_LOCK: + spriteId = CreateSprite(&gFairyLockChainsSpriteTemplate, task->data[3], task->data[5] + 10, 35); + break; + case MOVE_COLLISION_COURSE: + spriteId = CreateSprite(&gCollisionCourseSpriteTemplate, task->data[3], task->data[5], 35); + break; + default: + spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); + } + bool32 doDestroyOamMatrix = (gAnimMoveIndex == MOVE_FAIRY_LOCK) || (gAnimMoveIndex == MOVE_COLLISION_COURSE); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 7; - gSprites[spriteId].data[1] = isFairyLock ? 25 : 12; // How long the chains / bolts stay on screen. - gSprites[spriteId].data[2] = isFairyLock; // Whether to destroy the Oam Matrix. + gSprites[spriteId].data[1] = (gAnimMoveIndex == MOVE_FAIRY_LOCK) ? 25 : 12; // How long the chains / bolts stay on screen. + gSprites[spriteId].data[2] = doDestroyOamMatrix; // Whether to destroy the Oam Matrix. task->data[7]++; } diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 2a346bb2ee..10afc34759 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -356,6 +356,17 @@ const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = .callback = AnimSkyAttackBird, }; +const struct SpriteTemplate gGlaiveRushSpriteTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_ASCENT, + .paletteTag = ANIM_TAG_DRAGON_ASCENT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSkyAttackBird, +}; + // same as AnimEllipticalGust but centered on targets in a double battle static void AnimEllipticalGustCentered(struct Sprite *sprite) { diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 40d3602e6c..8df4c3a566 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -4403,6 +4403,17 @@ const struct SpriteTemplate gUTurnBallBackSpriteTemplate = .callback = AnimAbsorptionOrb, }; +// dynamax cannon +const struct SpriteTemplate gSpriteTemplate_DynamaxCannonOrb = { + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_HydroCannonBall, + .callback = AnimShadowBall +}; + // wicked blow static const union AffineAnimCmd sSpriteAffineAnim_DrainPunchFist[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 1), //Double sprite size diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 4ac83e4446..3408e797fc 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -1078,3 +1078,14 @@ const struct SpriteTemplate gSaltCureSwirlSpriteTemplate = .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex, }; + +const struct SpriteTemplate gRockPlumeSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlyingRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDirtPlumeParticle, +}; From ede15918cfda0ff7575c4f9187e11e63940a1226 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 31 May 2025 15:52:53 +0200 Subject: [PATCH 021/248] Refactors Final Gambit + Tests (#7005) --- asm/macros/battle_script.inc | 4 -- data/battle_scripts_1.s | 25 +------- include/battle_scripts.h | 2 +- include/constants/battle_script_commands.h | 3 +- src/battle_ai_util.c | 3 - src/battle_script_commands.c | 56 ++++++++++------- src/battle_util.c | 3 + src/data/battle_move_effects.h | 2 +- test/battle/move_effect/final_gambit.c | 72 +++++++++++++++++++++- 9 files changed, 112 insertions(+), 58 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e671bc1649..9921af639c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2449,10 +2449,6 @@ manipulatedamage DMG_FULL_ATTACKER_HP .endm - .macro dmgtocurrattackerhp - manipulatedamage DMG_CURR_ATTACKER_HP - .endm - .macro jumpifflowerveil jumpInstr:req jumpifnottype BS_TARGET, TYPE_GRASS, 1f jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4acd4a5ffe..c244a50d08 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1812,33 +1812,12 @@ BattleScript_AutotomizeWeightLoss:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFinalGambit:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - dmgtocurrattackerhp - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - resultmessage - waitmessage B_WAIT_TIME_LONG - setadditionaleffects - tryfaintmon BS_TARGET - jumpifmovehadnoeffect BattleScript_MoveEnd +BattleScript_FinalGambit:: setatkhptozero healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER - goto BattleScript_MoveEnd + return BattleScript_TryHitSwitchTarget:: forcerandomswitch BattleScript_HitSwitchTargetForceRandomSwitchFailed diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 75d7495498..8c6d34b0f0 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -788,7 +788,7 @@ extern const u8 BattleScript_TryHitSwitchTarget[]; extern const u8 BattleScript_HitSwitchTargetDynamaxed[]; extern const u8 BattleScript_AbilityPreventsPhasingOutRet[]; extern const u8 BattleScript_PrintMonIsRootedRet[]; -extern const u8 BattleScript_EffectFinalGambit[]; +extern const u8 BattleScript_FinalGambit[]; extern const u8 BattleScript_EffectAutotomize[]; extern const u8 BattleScript_EffectCopycat[]; extern const u8 BattleScript_EffectDefog[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index b892baedad..e09ff706ec 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -213,8 +213,7 @@ enum CmdVarious #define DMG_DOUBLED 2 #define DMG_1_8_TARGET_HP 3 #define DMG_FULL_ATTACKER_HP 4 -#define DMG_CURR_ATTACKER_HP 5 -#define DMG_BIG_ROOT 6 +#define DMG_BIG_ROOT 5 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 4b24ea76c8..b537211c87 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -656,9 +656,6 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal // If target has less HP than user, Endeavor does no damage median = maximum = minimum = max(0, gBattleMons[damageCalcData->battlerDef].hp - gBattleMons[damageCalcData->battlerAtk].hp); break; - case EFFECT_FINAL_GAMBIT: - median = maximum = minimum = gBattleMons[damageCalcData->battlerAtk].hp; - break; case EFFECT_BEAT_UP: if (B_BEAT_UP >= GEN_5) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 432eabfedb..b51abc82b2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6433,28 +6433,41 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ABSORB: - if (moveEffect == EFFECT_ABSORB - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) - && IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget)) + if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE + || !IsBattlerTurnDamaged(gBattlerTarget)) { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); - gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; + gBattleScripting.moveendState++; + break; + } + switch (moveEffect) + { + case EFFECT_ABSORB: + if (!(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) && IsBattlerAlive(gBattlerAttacker)) + { + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); + gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; + effect = TRUE; + if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) + { + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; + gHitMarker |= HITMARKER_PASSIVE_DAMAGE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; + BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; + BattleScriptCall(BattleScript_EffectAbsorb); + } + } + break; + case EFFECT_FINAL_GAMBIT: + BattleScriptCall(BattleScript_FinalGambit); effect = TRUE; - if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) - { - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - gHitMarker |= HITMARKER_PASSIVE_DAMAGE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; - BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; - BattleScriptCall(BattleScript_EffectAbsorb); - } + break; + default: + break; } gBattleScripting.moveendState++; break; @@ -11845,9 +11858,6 @@ static void Cmd_manipulatedamage(void) case DMG_BIG_ROOT: gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); break; - case DMG_CURR_ATTACKER_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerAttacker); - break; } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index e2b0eb41e9..d0f5544645 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9333,6 +9333,9 @@ static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalc case EFFECT_SUPER_FANG: dmg = GetNonDynamaxHP(damageCalcData->battlerDef) / 2; break; + case EFFECT_FINAL_GAMBIT: + dmg = GetNonDynamaxHP(damageCalcData->battlerAtk); + break; default: return INT32_MAX; } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 06b1fb3fd6..a79eb441c1 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1564,7 +1564,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FINAL_GAMBIT] = { - .battleScript = BattleScript_EffectFinalGambit, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, diff --git a/test/battle/move_effect/final_gambit.c b/test/battle/move_effect/final_gambit.c index be815abf5a..5eba955b28 100644 --- a/test/battle/move_effect/final_gambit.c +++ b/test/battle/move_effect/final_gambit.c @@ -1,4 +1,74 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Final Gambit (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); +} + +SINGLE_BATTLE_TEST("Final Gambit faints user and target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_FINAL_GAMBIT); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + HP_BAR(opponent); + HP_BAR(player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_EQ(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if target protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if attacker fails to attack") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} + +SINGLE_BATTLE_TEST("Final Gambit does not faint user if target is immune") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_FINAL_GAMBIT); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + } THEN { + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_NE(GetMonData(&gEnemyParty[0], MON_DATA_HP), 0); + } +} From 0917af214c7d56b81864680b957aec902136c663 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 31 May 2025 19:47:54 +0200 Subject: [PATCH 022/248] Replace all usages of lz compression with smol (#7032) Co-authored-by: Hedara --- src/battle_script_commands.c | 2 +- src/battle_transition.c | 28 +- src/battle_transition_frontier.c | 6 +- src/berry_crush.c | 14 +- src/cable_car.c | 8 +- src/credits.c | 2 +- src/data.c | 4 +- src/data/graphics/battle_environment.h | 84 +- src/data/graphics/berries.h | 142 +- src/data/graphics/berry_fix.h | 24 +- src/data/graphics/decorations.h | 84 +- src/data/graphics/intro_scene.h | 54 +- src/data/graphics/items.h | 1262 ++-- src/data/graphics/mail.h | 48 +- src/data/graphics/pokeballs.h | 58 +- src/data/graphics/pokemon.h | 7236 ++++++++++---------- src/data/graphics/rayquaza_scene.h | 78 +- src/data/graphics/slot_machine.h | 4 +- src/data/graphics/trainers.h | 186 +- src/data/region_map/city_map_tilemaps.h | 44 +- src/data/tilesets/graphics.h | 144 +- src/data/trade.h | 6 +- src/data/wallpapers.h | 180 +- src/decompress.c | 2 +- src/dexnav.c | 18 +- src/diploma.c | 4 +- src/dodrio_berry_picking.c | 36 +- src/easy_chat.c | 4 +- src/evolution_graphics.c | 2 +- src/evolution_scene.c | 6 +- src/expansion_intro.c | 12 +- src/fldeff_flash.c | 4 +- src/frontier_pass.c | 16 +- src/graphics.c | 1484 ++-- src/hall_of_fame.c | 2 +- src/intro.c | 24 +- src/intro_credits_graphics.c | 32 +- src/link.c | 4 +- src/link_rfu_3.c | 2 +- src/list_menu.c | 6 +- src/main_menu.c | 4 +- src/match_call.c | 2 +- src/minigame_countdown.c | 4 +- src/mystery_gift_menu.c | 2 +- src/mystery_gift_view.c | 42 +- src/pokedex_area_region_map.c | 8 +- src/pokedex_area_screen.c | 4 +- src/pokedex_cry_screen.c | 2 +- src/pokedex_plus_hgss.c | 48 +- src/pokemon_jump.c | 22 +- src/pokemon_storage_system.c | 6 +- src/pokenav_conditions_gfx.c | 4 +- src/pokenav_conditions_search_results.c | 4 +- src/pokenav_list.c | 2 +- src/pokenav_main_menu.c | 4 +- src/pokenav_match_call_gfx.c | 8 +- src/pokenav_menu_handler_gfx.c | 10 +- src/pokenav_region_map.c | 2 +- src/pokenav_ribbons_list.c | 4 +- src/pokenav_ribbons_summary.c | 4 +- src/region_map.c | 14 +- src/roulette.c | 18 +- src/save_failed_screen.c | 2 +- src/slot_machine.c | 2 +- src/starter_choose.c | 10 +- src/title_screen.c | 8 +- src/trainer_card.c | 6 +- src/union_room_chat.c | 8 +- src/use_pokeblock.c | 4 +- src/wallclock.c | 2 +- src/wireless_communication_status_screen.c | 4 +- tools/preproc/c_file.cpp | 2 +- tools/scaninc/c_file.cpp | 2 +- 73 files changed, 5812 insertions(+), 5812 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b51abc82b2..1563b17bd2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -927,7 +927,7 @@ static const struct WindowTemplate sUnusedWinTemplate = }; static const u16 sLevelUpBanner_Pal[] = INCBIN_U16("graphics/battle_interface/level_up_banner.gbapal"); -static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.lz"); +static const u32 sLevelUpBanner_Gfx[] = INCBIN_U32("graphics/battle_interface/level_up_banner.4bpp.smol"); static const struct OamData sOamData_MonIconOnLvlUpBanner = { diff --git a/src/battle_transition.c b/src/battle_transition.c index ae91f17228..6f58daf216 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -302,10 +302,10 @@ static const u8 sUnusedBrendan_Gfx[] = INCBIN_U8("graphics/battle_transitions/un static const u8 sUnusedLass_Gfx[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp"); static const u32 sShrinkingBoxTileset[] = INCBIN_U32("graphics/battle_transitions/shrinking_box.4bpp"); static const u16 sEvilTeam_Palette[] = INCBIN_U16("graphics/battle_transitions/evil_team.gbapal"); -static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.lz"); -static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.lz"); -static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.lz"); -static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.lz"); +static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.smol"); +static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.smolTM"); +static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.smol"); +static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.smolTM"); static const u32 sRegis_Tileset[] = INCBIN_U32("graphics/battle_transitions/regis.4bpp"); static const u16 sRegice_Palette[] = INCBIN_U16("graphics/battle_transitions/regice.gbapal"); static const u16 sRegisteel_Palette[] = INCBIN_U16("graphics/battle_transitions/registeel.gbapal"); @@ -314,10 +314,10 @@ static const u32 sRegice_Tilemap[] = INCBIN_U32("graphics/battle_transitions/reg static const u32 sRegisteel_Tilemap[] = INCBIN_U32("graphics/battle_transitions/registeel.bin"); static const u32 sRegirock_Tilemap[] = INCBIN_U32("graphics/battle_transitions/regirock.bin"); static const u16 sUnused_Palette[] = INCBIN_U16("graphics/battle_transitions/unused.gbapal"); -static const u32 sKyogre_Tileset[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.lz"); -static const u32 sKyogre_Tilemap[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.lz"); -static const u32 sGroudon_Tileset[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.lz"); -static const u32 sGroudon_Tilemap[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.lz"); +static const u32 sKyogre_Tileset[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.smol"); +static const u32 sKyogre_Tilemap[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.smolTM"); +static const u32 sGroudon_Tileset[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.smol"); +static const u32 sGroudon_Tilemap[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.smolTM"); static const u16 sKyogre1_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt1.gbapal"); static const u16 sKyogre2_Palette[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt2.gbapal"); static const u16 sGroudon1_Palette[] = INCBIN_U16("graphics/battle_transitions/groudon_pt1.gbapal"); @@ -326,13 +326,13 @@ static const u16 sRayquaza_Palette[] = INCBIN_U16("graphics/battle_transitions/r static const u32 sRayquaza_Tileset[] = INCBIN_U32("graphics/battle_transitions/rayquaza.4bpp"); static const u32 sRayquaza_Tilemap[] = INCBIN_U32("graphics/battle_transitions/rayquaza.bin"); static const u16 sFrontierLogo_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_logo.gbapal"); -static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.lz"); -static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.lz"); +static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.smol"); +static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.smolTM"); static const u16 sFrontierSquares_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_squares_blanktiles.gbapal"); -static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz"); -static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz"); -static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz"); -static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz"); +static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.smol"); +static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.smol"); +static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.smol"); +static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.smol"); static const u32 sFrontierSquares_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin"); // All battle transitions use the same intro diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c index c426e6e60c..bef484d416 100644 --- a/src/battle_transition_frontier.c +++ b/src/battle_transition_frontier.c @@ -45,9 +45,9 @@ static bool8 CirclesSymmetricSpiralInSeq_End(struct Task *task); #define PALTAG_LOGO_CIRCLES 0x2E90 -static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.lz"); -static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin.lz"); -static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.lz"); +static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.smol"); +static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin.smolTM"); +static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.smol"); static const u16 sLogo_Pal[] = INCBIN_U16("graphics/battle_transitions/frontier_logo_circles.gbapal"); static const struct OamData sOamData_LogoCircles = diff --git a/src/berry_crush.c b/src/berry_crush.c index 3a2274f189..a571511ee2 100644 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -582,13 +582,13 @@ static const u32 sPressingSpeedConversionTable[] = static const u16 sCrusherBase_Pal[] = INCBIN_U16("graphics/berry_crush/crusher_base.gbapal"); static const u16 sEffects_Pal[] = INCBIN_U16("graphics/berry_crush/effects.gbapal"); static const u16 sTimerDigits_Pal[] = INCBIN_U16("graphics/berry_crush/timer_digits.gbapal"); -static const u32 sCrusherBase_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.lz"); -static const u32 sImpact_Gfx[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.lz"); -static const u32 sSparkle_Gfx[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.lz"); -static const u32 sTimerDigits_Gfx[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.lz"); -static const u8 sCrusherTop_Tilemap[] = INCBIN_U8("graphics/berry_crush/crusher_top.bin.lz"); -static const u8 sContainerCap_Tilemap[] = INCBIN_U8("graphics/berry_crush/container_cap.bin.lz"); -static const u8 sBg_Tilemap[] = INCBIN_U8("graphics/berry_crush/bg.bin.lz"); +static const u32 sCrusherBase_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.smol"); +static const u32 sImpact_Gfx[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.smol"); +static const u32 sSparkle_Gfx[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.smol"); +static const u32 sTimerDigits_Gfx[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.smol"); +static const u8 sCrusherTop_Tilemap[] = INCBIN_U8("graphics/berry_crush/crusher_top.bin.smolTM"); +static const u8 sContainerCap_Tilemap[] = INCBIN_U8("graphics/berry_crush/container_cap.bin.smolTM"); +static const u8 sBg_Tilemap[] = INCBIN_U8("graphics/berry_crush/bg.bin.smolTM"); // Takes the number of players - 2 and a player id and returns the // index into sPlayerCoords where that player should be seated diff --git a/src/cable_car.c b/src/cable_car.c index b5d3d0f53f..3ff3faf971 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -131,11 +131,11 @@ static const struct BgTemplate sBgTemplates[4] = { }, }; -static const u16 sGround_Tilemap[] = INCBIN_U16("graphics/cable_car/ground.bin.lz"); -static const u16 sTrees_Tilemap[] = INCBIN_U16("graphics/cable_car/trees.bin.lz"); -static const u16 sBgMountains_Tilemap[] = INCBIN_U16("graphics/cable_car/bg_mountains.bin.lz"); +static const u16 sGround_Tilemap[] = INCBIN_U16("graphics/cable_car/ground.bin.smolTM"); +static const u16 sTrees_Tilemap[] = INCBIN_U16("graphics/cable_car/trees.bin.smolTM"); +static const u16 sBgMountains_Tilemap[] = INCBIN_U16("graphics/cable_car/bg_mountains.bin.smolTM"); static const u16 sPylonTop_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_top.bin"); -static const u16 sPylonPole_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_pole.bin.lz"); +static const u16 sPylonPole_Tilemap[] = INCBIN_U16("graphics/cable_car/pylon_pole.bin.smolTM"); static const struct CompressedSpriteSheet sSpriteSheets[] = { { gCableCar_Gfx, 0x800, TAG_CABLE_CAR }, diff --git a/src/credits.c b/src/credits.c index f48717a2a8..7977db6e5d 100644 --- a/src/credits.c +++ b/src/credits.c @@ -86,7 +86,7 @@ EWRAM_DATA bool8 gHasHallOfFameRecords = 0; static EWRAM_DATA struct CreditsData *sCreditsData = {0}; static const u16 sCredits_Pal[] = INCBIN_U16("graphics/credits/credits.gbapal"); -static const u32 sCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.lz"); +static const u32 sCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.smol"); static void SpriteCB_CreditsMonBg(struct Sprite *); static void Task_WaitPaletteFade(u8); diff --git a/src/data.c b/src/data.c index f5035262c5..7b99254a8e 100644 --- a/src/data.c +++ b/src/data.c @@ -12,8 +12,8 @@ #include "constants/battle_ai.h" const u16 gMinigameDigits_Pal[] = INCBIN_U16("graphics/link/minigame_digits.gbapal"); -const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.lz"); -static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.lz"); // Unused +const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.smol"); +static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.smol"); // Unused #define BATTLER_OFFSET(i) (gHeap + 0x8000 + MON_PIC_SIZE * (i)) diff --git a/src/data/graphics/battle_environment.h b/src/data/graphics/battle_environment.h index 29339011f5..d220611c6d 100644 --- a/src/data/graphics/battle_environment.h +++ b/src/data/graphics/battle_environment.h @@ -1,46 +1,46 @@ -const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM"); const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal"); -const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.lz"); +const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol"); const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles -const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.lz"); +const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.lz"); -const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.lz"); +const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.smol"); +const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.smolTM"); -const u32 gBattleEnvironmentTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/tiles.4bpp.lz"); -const u32 gBattleEnvironmentTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/map.bin.lz"); +const u32 gBattleEnvironmentTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/tiles.4bpp.smol"); +const u32 gBattleEnvironmentTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/map.bin.smolTM"); const u16 gBattleEnvironmentPalette_Building[] = INCBIN_U16("graphics/battle_environment/building/palette.gbapal"); @@ -57,32 +57,32 @@ const u16 gBattleEnvironmentPalette_StadiumDrake[] = INCBIN_U16("graphics/battle const u16 gBattleEnvironmentPalette_StadiumWallace[] = INCBIN_U16("graphics/battle_environment/stadium/palette7.gbapal"); const u16 gBattleEnvironmentPalette_Rayquaza[] = INCBIN_U16("graphics/battle_environment/sky/palette.gbapal"); -const u32 gBattleEnvironmentAnimTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/anim_map.bin.smolTM"); -const u32 gBattleEnvironmentAnimTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_tiles.4bpp.lz"); -const u32 gBattleEnvironmentAnimTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_map.bin.lz"); +const u32 gBattleEnvironmentAnimTiles_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_tiles.4bpp.smol"); +const u32 gBattleEnvironmentAnimTilemap_Rayquaza[] = INCBIN_U32("graphics/battle_environment/sky/anim_map.bin.smolTM"); diff --git a/src/data/graphics/berries.h b/src/data/graphics/berries.h index 3001337dfa..d76a524ae1 100644 --- a/src/data/graphics/berries.h +++ b/src/data/graphics/berries.h @@ -1,78 +1,78 @@ -const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.lz"); +const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.smol"); const u16 gBerryCheck_Pal[] = INCBIN_U16("graphics/bag/check_berry.gbapal"); -const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.lz"); -const u32 gBerryTag_Tilemap[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.lz"); +const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.smolTM"); +const u32 gBerryTag_Tilemap[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.smolTM"); -const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.lz"); +const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.smol"); -const u32 gBerryPic_Cheri[] = INCBIN_U32("graphics/berries/cheri.4bpp.lz"); -const u32 gBerryPic_Chesto[] = INCBIN_U32("graphics/berries/chesto.4bpp.lz"); -const u32 gBerryPic_Pecha[] = INCBIN_U32("graphics/berries/pecha.4bpp.lz"); -const u32 gBerryPic_Rawst[] = INCBIN_U32("graphics/berries/rawst.4bpp.lz"); -const u32 gBerryPic_Aspear[] = INCBIN_U32("graphics/berries/aspear.4bpp.lz"); -const u32 gBerryPic_Leppa[] = INCBIN_U32("graphics/berries/leppa.4bpp.lz"); -const u32 gBerryPic_Oran[] = INCBIN_U32("graphics/berries/oran.4bpp.lz"); -const u32 gBerryPic_Persim[] = INCBIN_U32("graphics/berries/persim.4bpp.lz"); -const u32 gBerryPic_Lum[] = INCBIN_U32("graphics/berries/lum.4bpp.lz"); -const u32 gBerryPic_Sitrus[] = INCBIN_U32("graphics/berries/sitrus.4bpp.lz"); -const u32 gBerryPic_Figy[] = INCBIN_U32("graphics/berries/figy.4bpp.lz"); -const u32 gBerryPic_Wiki[] = INCBIN_U32("graphics/berries/wiki.4bpp.lz"); -const u32 gBerryPic_Mago[] = INCBIN_U32("graphics/berries/mago.4bpp.lz"); -const u32 gBerryPic_Aguav[] = INCBIN_U32("graphics/berries/aguav.4bpp.lz"); -const u32 gBerryPic_Iapapa[] = INCBIN_U32("graphics/berries/iapapa.4bpp.lz"); -const u32 gBerryPic_Razz[] = INCBIN_U32("graphics/berries/razz.4bpp.lz"); -const u32 gBerryPic_Bluk[] = INCBIN_U32("graphics/berries/bluk.4bpp.lz"); -const u32 gBerryPic_Nanab[] = INCBIN_U32("graphics/berries/nanab.4bpp.lz"); -const u32 gBerryPic_Wepear[] = INCBIN_U32("graphics/berries/wepear.4bpp.lz"); -const u32 gBerryPic_Pinap[] = INCBIN_U32("graphics/berries/pinap.4bpp.lz"); -const u32 gBerryPic_Pomeg[] = INCBIN_U32("graphics/berries/pomeg.4bpp.lz"); -const u32 gBerryPic_Kelpsy[] = INCBIN_U32("graphics/berries/kelpsy.4bpp.lz"); -const u32 gBerryPic_Qualot[] = INCBIN_U32("graphics/berries/qualot.4bpp.lz"); -const u32 gBerryPic_Hondew[] = INCBIN_U32("graphics/berries/hondew.4bpp.lz"); -const u32 gBerryPic_Grepa[] = INCBIN_U32("graphics/berries/grepa.4bpp.lz"); -const u32 gBerryPic_Tamato[] = INCBIN_U32("graphics/berries/tamato.4bpp.lz"); -const u32 gBerryPic_Cornn[] = INCBIN_U32("graphics/berries/cornn.4bpp.lz"); -const u32 gBerryPic_Magost[] = INCBIN_U32("graphics/berries/magost.4bpp.lz"); -const u32 gBerryPic_Rabuta[] = INCBIN_U32("graphics/berries/rabuta.4bpp.lz"); -const u32 gBerryPic_Nomel[] = INCBIN_U32("graphics/berries/nomel.4bpp.lz"); -const u32 gBerryPic_Spelon[] = INCBIN_U32("graphics/berries/spelon.4bpp.lz"); -const u32 gBerryPic_Pamtre[] = INCBIN_U32("graphics/berries/pamtre.4bpp.lz"); -const u32 gBerryPic_Watmel[] = INCBIN_U32("graphics/berries/watmel.4bpp.lz"); -const u32 gBerryPic_Durin[] = INCBIN_U32("graphics/berries/durin.4bpp.lz"); -const u32 gBerryPic_Belue[] = INCBIN_U32("graphics/berries/belue.4bpp.lz"); -const u32 gBerryPic_Chilan[] = INCBIN_U32("graphics/berries/chilan.4bpp.lz"); -const u32 gBerryPic_Occa[] = INCBIN_U32("graphics/berries/occa.4bpp.lz"); -const u32 gBerryPic_Passho[] = INCBIN_U32("graphics/berries/passho.4bpp.lz"); -const u32 gBerryPic_Wacan[] = INCBIN_U32("graphics/berries/wacan.4bpp.lz"); -const u32 gBerryPic_Rindo[] = INCBIN_U32("graphics/berries/rindo.4bpp.lz"); -const u32 gBerryPic_Yache[] = INCBIN_U32("graphics/berries/yache.4bpp.lz"); -const u32 gBerryPic_Chople[] = INCBIN_U32("graphics/berries/chople.4bpp.lz"); -const u32 gBerryPic_Kebia[] = INCBIN_U32("graphics/berries/kebia.4bpp.lz"); -const u32 gBerryPic_Shuca[] = INCBIN_U32("graphics/berries/shuca.4bpp.lz"); -const u32 gBerryPic_Coba[] = INCBIN_U32("graphics/berries/coba.4bpp.lz"); -const u32 gBerryPic_Payapa[] = INCBIN_U32("graphics/berries/payapa.4bpp.lz"); -const u32 gBerryPic_Tanga[] = INCBIN_U32("graphics/berries/tanga.4bpp.lz"); -const u32 gBerryPic_Charti[] = INCBIN_U32("graphics/berries/charti.4bpp.lz"); -const u32 gBerryPic_Kasib[] = INCBIN_U32("graphics/berries/kasib.4bpp.lz"); -const u32 gBerryPic_Haban[] = INCBIN_U32("graphics/berries/haban.4bpp.lz"); -const u32 gBerryPic_Colbur[] = INCBIN_U32("graphics/berries/colbur.4bpp.lz"); -const u32 gBerryPic_Babiri[] = INCBIN_U32("graphics/berries/babiri.4bpp.lz"); -const u32 gBerryPic_Roseli[] = INCBIN_U32("graphics/berries/roseli.4bpp.lz"); -const u32 gBerryPic_Liechi[] = INCBIN_U32("graphics/berries/liechi.4bpp.lz"); -const u32 gBerryPic_Ganlon[] = INCBIN_U32("graphics/berries/ganlon.4bpp.lz"); -const u32 gBerryPic_Salac[] = INCBIN_U32("graphics/berries/salac.4bpp.lz"); -const u32 gBerryPic_Petaya[] = INCBIN_U32("graphics/berries/petaya.4bpp.lz"); -const u32 gBerryPic_Apicot[] = INCBIN_U32("graphics/berries/apicot.4bpp.lz"); -const u32 gBerryPic_Lansat[] = INCBIN_U32("graphics/berries/lansat.4bpp.lz"); -const u32 gBerryPic_Starf[] = INCBIN_U32("graphics/berries/starf.4bpp.lz"); -const u32 gBerryPic_Enigma[] = INCBIN_U32("graphics/berries/enigma.4bpp.lz"); -const u32 gBerryPic_Micle[] = INCBIN_U32("graphics/berries/micle.4bpp.lz"); -const u32 gBerryPic_Custap[] = INCBIN_U32("graphics/berries/custap.4bpp.lz"); -const u32 gBerryPic_Jaboca[] = INCBIN_U32("graphics/berries/jaboca.4bpp.lz"); -const u32 gBerryPic_Rowap[] = INCBIN_U32("graphics/berries/rowap.4bpp.lz"); -const u32 gBerryPic_Kee[] = INCBIN_U32("graphics/berries/kee.4bpp.lz"); -const u32 gBerryPic_Maranga[] = INCBIN_U32("graphics/berries/maranga.4bpp.lz"); +const u32 gBerryPic_Cheri[] = INCBIN_U32("graphics/berries/cheri.4bpp.smol"); +const u32 gBerryPic_Chesto[] = INCBIN_U32("graphics/berries/chesto.4bpp.smol"); +const u32 gBerryPic_Pecha[] = INCBIN_U32("graphics/berries/pecha.4bpp.smol"); +const u32 gBerryPic_Rawst[] = INCBIN_U32("graphics/berries/rawst.4bpp.smol"); +const u32 gBerryPic_Aspear[] = INCBIN_U32("graphics/berries/aspear.4bpp.smol"); +const u32 gBerryPic_Leppa[] = INCBIN_U32("graphics/berries/leppa.4bpp.smol"); +const u32 gBerryPic_Oran[] = INCBIN_U32("graphics/berries/oran.4bpp.smol"); +const u32 gBerryPic_Persim[] = INCBIN_U32("graphics/berries/persim.4bpp.smol"); +const u32 gBerryPic_Lum[] = INCBIN_U32("graphics/berries/lum.4bpp.smol"); +const u32 gBerryPic_Sitrus[] = INCBIN_U32("graphics/berries/sitrus.4bpp.smol"); +const u32 gBerryPic_Figy[] = INCBIN_U32("graphics/berries/figy.4bpp.smol"); +const u32 gBerryPic_Wiki[] = INCBIN_U32("graphics/berries/wiki.4bpp.smol"); +const u32 gBerryPic_Mago[] = INCBIN_U32("graphics/berries/mago.4bpp.smol"); +const u32 gBerryPic_Aguav[] = INCBIN_U32("graphics/berries/aguav.4bpp.smol"); +const u32 gBerryPic_Iapapa[] = INCBIN_U32("graphics/berries/iapapa.4bpp.smol"); +const u32 gBerryPic_Razz[] = INCBIN_U32("graphics/berries/razz.4bpp.smol"); +const u32 gBerryPic_Bluk[] = INCBIN_U32("graphics/berries/bluk.4bpp.smol"); +const u32 gBerryPic_Nanab[] = INCBIN_U32("graphics/berries/nanab.4bpp.smol"); +const u32 gBerryPic_Wepear[] = INCBIN_U32("graphics/berries/wepear.4bpp.smol"); +const u32 gBerryPic_Pinap[] = INCBIN_U32("graphics/berries/pinap.4bpp.smol"); +const u32 gBerryPic_Pomeg[] = INCBIN_U32("graphics/berries/pomeg.4bpp.smol"); +const u32 gBerryPic_Kelpsy[] = INCBIN_U32("graphics/berries/kelpsy.4bpp.smol"); +const u32 gBerryPic_Qualot[] = INCBIN_U32("graphics/berries/qualot.4bpp.smol"); +const u32 gBerryPic_Hondew[] = INCBIN_U32("graphics/berries/hondew.4bpp.smol"); +const u32 gBerryPic_Grepa[] = INCBIN_U32("graphics/berries/grepa.4bpp.smol"); +const u32 gBerryPic_Tamato[] = INCBIN_U32("graphics/berries/tamato.4bpp.smol"); +const u32 gBerryPic_Cornn[] = INCBIN_U32("graphics/berries/cornn.4bpp.smol"); +const u32 gBerryPic_Magost[] = INCBIN_U32("graphics/berries/magost.4bpp.smol"); +const u32 gBerryPic_Rabuta[] = INCBIN_U32("graphics/berries/rabuta.4bpp.smol"); +const u32 gBerryPic_Nomel[] = INCBIN_U32("graphics/berries/nomel.4bpp.smol"); +const u32 gBerryPic_Spelon[] = INCBIN_U32("graphics/berries/spelon.4bpp.smol"); +const u32 gBerryPic_Pamtre[] = INCBIN_U32("graphics/berries/pamtre.4bpp.smol"); +const u32 gBerryPic_Watmel[] = INCBIN_U32("graphics/berries/watmel.4bpp.smol"); +const u32 gBerryPic_Durin[] = INCBIN_U32("graphics/berries/durin.4bpp.smol"); +const u32 gBerryPic_Belue[] = INCBIN_U32("graphics/berries/belue.4bpp.smol"); +const u32 gBerryPic_Chilan[] = INCBIN_U32("graphics/berries/chilan.4bpp.smol"); +const u32 gBerryPic_Occa[] = INCBIN_U32("graphics/berries/occa.4bpp.smol"); +const u32 gBerryPic_Passho[] = INCBIN_U32("graphics/berries/passho.4bpp.smol"); +const u32 gBerryPic_Wacan[] = INCBIN_U32("graphics/berries/wacan.4bpp.smol"); +const u32 gBerryPic_Rindo[] = INCBIN_U32("graphics/berries/rindo.4bpp.smol"); +const u32 gBerryPic_Yache[] = INCBIN_U32("graphics/berries/yache.4bpp.smol"); +const u32 gBerryPic_Chople[] = INCBIN_U32("graphics/berries/chople.4bpp.smol"); +const u32 gBerryPic_Kebia[] = INCBIN_U32("graphics/berries/kebia.4bpp.smol"); +const u32 gBerryPic_Shuca[] = INCBIN_U32("graphics/berries/shuca.4bpp.smol"); +const u32 gBerryPic_Coba[] = INCBIN_U32("graphics/berries/coba.4bpp.smol"); +const u32 gBerryPic_Payapa[] = INCBIN_U32("graphics/berries/payapa.4bpp.smol"); +const u32 gBerryPic_Tanga[] = INCBIN_U32("graphics/berries/tanga.4bpp.smol"); +const u32 gBerryPic_Charti[] = INCBIN_U32("graphics/berries/charti.4bpp.smol"); +const u32 gBerryPic_Kasib[] = INCBIN_U32("graphics/berries/kasib.4bpp.smol"); +const u32 gBerryPic_Haban[] = INCBIN_U32("graphics/berries/haban.4bpp.smol"); +const u32 gBerryPic_Colbur[] = INCBIN_U32("graphics/berries/colbur.4bpp.smol"); +const u32 gBerryPic_Babiri[] = INCBIN_U32("graphics/berries/babiri.4bpp.smol"); +const u32 gBerryPic_Roseli[] = INCBIN_U32("graphics/berries/roseli.4bpp.smol"); +const u32 gBerryPic_Liechi[] = INCBIN_U32("graphics/berries/liechi.4bpp.smol"); +const u32 gBerryPic_Ganlon[] = INCBIN_U32("graphics/berries/ganlon.4bpp.smol"); +const u32 gBerryPic_Salac[] = INCBIN_U32("graphics/berries/salac.4bpp.smol"); +const u32 gBerryPic_Petaya[] = INCBIN_U32("graphics/berries/petaya.4bpp.smol"); +const u32 gBerryPic_Apicot[] = INCBIN_U32("graphics/berries/apicot.4bpp.smol"); +const u32 gBerryPic_Lansat[] = INCBIN_U32("graphics/berries/lansat.4bpp.smol"); +const u32 gBerryPic_Starf[] = INCBIN_U32("graphics/berries/starf.4bpp.smol"); +const u32 gBerryPic_Enigma[] = INCBIN_U32("graphics/berries/enigma.4bpp.smol"); +const u32 gBerryPic_Micle[] = INCBIN_U32("graphics/berries/micle.4bpp.smol"); +const u32 gBerryPic_Custap[] = INCBIN_U32("graphics/berries/custap.4bpp.smol"); +const u32 gBerryPic_Jaboca[] = INCBIN_U32("graphics/berries/jaboca.4bpp.smol"); +const u32 gBerryPic_Rowap[] = INCBIN_U32("graphics/berries/rowap.4bpp.smol"); +const u32 gBerryPic_Kee[] = INCBIN_U32("graphics/berries/kee.4bpp.smol"); +const u32 gBerryPic_Maranga[] = INCBIN_U32("graphics/berries/maranga.4bpp.smol"); const u16 gBerryPalette_Cheri[] = INCBIN_U16("graphics/berries/cheri.gbapal"); const u16 gBerryPalette_Chesto[] = INCBIN_U16("graphics/berries/chesto.gbapal"); diff --git a/src/data/graphics/berry_fix.h b/src/data/graphics/berry_fix.h index 0c26f7e92b..3fbedb5f2c 100644 --- a/src/data/graphics/berry_fix.h +++ b/src/data/graphics/berry_fix.h @@ -1,23 +1,23 @@ const u16 gBerryFixGbaConnect_Pal[] = INCBIN_U16("graphics/berry_fix/gba_connect.gbapal"); -const u32 gBerryFixGbaConnect_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_connect.4bpp.lz"); -const u32 gBerryFixGbaConnect_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_connect.bin.lz"); +const u32 gBerryFixGbaConnect_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_connect.4bpp.smol"); +const u32 gBerryFixGbaConnect_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_connect.bin.smolTM"); const u16 gBerryFixGameboyLogo_Pal[] = INCBIN_U16("graphics/berry_fix/logo.gbapal"); -const u32 gBerryFixGameboyLogo_Gfx[] = INCBIN_U32("graphics/berry_fix/logo.4bpp.lz"); -const u32 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U32("graphics/berry_fix/logo.bin.lz"); +const u32 gBerryFixGameboyLogo_Gfx[] = INCBIN_U32("graphics/berry_fix/logo.4bpp.smol"); +const u32 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U32("graphics/berry_fix/logo.bin.smolTM"); const u16 gBerryFixGbaTransfer_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer.gbapal"); -const u32 gBerryFixGbaTransfer_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer.4bpp.lz"); -const u32 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer.bin.lz"); +const u32 gBerryFixGbaTransfer_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer.4bpp.smol"); +const u32 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer.bin.smolTM"); const u16 gBerryFixGbaTransferHighlight_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer_highlight.gbapal"); -const u32 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.4bpp.lz"); -const u32 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.bin.lz"); +const u32 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.4bpp.smol"); +const u32 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_highlight.bin.smolTM"); const u16 gBerryFixGbaTransferError_Pal[] = INCBIN_U16("graphics/berry_fix/gba_transfer_error.gbapal"); -const u32 gBerryFixGbaTransferError_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.4bpp.lz"); -const u32 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.bin.lz"); +const u32 gBerryFixGbaTransferError_Gfx[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.4bpp.smol"); +const u32 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U32("graphics/berry_fix/gba_transfer_error.bin.smolTM"); const u16 gBerryFixWindow_Pal[] = INCBIN_U16("graphics/berry_fix/window.gbapal"); -const u32 gBerryFixWindow_Gfx[] = INCBIN_U32("graphics/berry_fix/window.4bpp.lz"); -const u32 gBerryFixWindow_Tilemap[] = INCBIN_U32("graphics/berry_fix/window.bin.lz"); +const u32 gBerryFixWindow_Gfx[] = INCBIN_U32("graphics/berry_fix/window.4bpp.smol"); +const u32 gBerryFixWindow_Tilemap[] = INCBIN_U32("graphics/berry_fix/window.bin.smolTM"); diff --git a/src/data/graphics/decorations.h b/src/data/graphics/decorations.h index b8e1343ee5..e581d6816d 100644 --- a/src/data/graphics/decorations.h +++ b/src/data/graphics/decorations.h @@ -1,125 +1,125 @@ -const u32 gDecorIcon_HeavyDesk[] = INCBIN_U32("graphics/decorations/heavy_desk.4bpp.lz"); +const u32 gDecorIcon_HeavyDesk[] = INCBIN_U32("graphics/decorations/heavy_desk.4bpp.smol"); const u16 gDecorIconPalette_HeavyDesk[] = INCBIN_U16("graphics/decorations/heavy_desk.gbapal"); -const u32 gDecorIcon_RaggedDesk[] = INCBIN_U32("graphics/decorations/ragged_desk.4bpp.lz"); +const u32 gDecorIcon_RaggedDesk[] = INCBIN_U32("graphics/decorations/ragged_desk.4bpp.smol"); const u16 gDecorIconPalette_RaggedDesk[] = INCBIN_U16("graphics/decorations/ragged_desk.gbapal"); -const u32 gDecorIcon_ComfortDesk[] = INCBIN_U32("graphics/decorations/comfort_desk.4bpp.lz"); +const u32 gDecorIcon_ComfortDesk[] = INCBIN_U32("graphics/decorations/comfort_desk.4bpp.smol"); const u16 gDecorIconPalette_ComfortDesk[] = INCBIN_U16("graphics/decorations/comfort_desk.gbapal"); -const u32 gDecorIcon_PrettyDesk[] = INCBIN_U32("graphics/decorations/pretty_desk.4bpp.lz"); +const u32 gDecorIcon_PrettyDesk[] = INCBIN_U32("graphics/decorations/pretty_desk.4bpp.smol"); const u16 gDecorIconPalette_PrettyDesk[] = INCBIN_U16("graphics/decorations/pretty_desk.gbapal"); -const u32 gDecorIcon_BrickDesk[] = INCBIN_U32("graphics/decorations/brick_desk.4bpp.lz"); +const u32 gDecorIcon_BrickDesk[] = INCBIN_U32("graphics/decorations/brick_desk.4bpp.smol"); const u16 gDecorIconPalette_BrickDesk[] = INCBIN_U16("graphics/decorations/brick_desk.gbapal"); -const u32 gDecorIcon_CampDesk[] = INCBIN_U32("graphics/decorations/camp_desk.4bpp.lz"); +const u32 gDecorIcon_CampDesk[] = INCBIN_U32("graphics/decorations/camp_desk.4bpp.smol"); const u16 gDecorIconPalette_CampDesk[] = INCBIN_U16("graphics/decorations/camp_desk.gbapal"); -const u32 gDecorIcon_HardDesk[] = INCBIN_U32("graphics/decorations/hard_desk.4bpp.lz"); +const u32 gDecorIcon_HardDesk[] = INCBIN_U32("graphics/decorations/hard_desk.4bpp.smol"); const u16 gDecorIconPalette_HardDesk[] = INCBIN_U16("graphics/decorations/hard_desk.gbapal"); -const u32 gDecorIcon_RedPlant[] = INCBIN_U32("graphics/decorations/red_plant.4bpp.lz"); +const u32 gDecorIcon_RedPlant[] = INCBIN_U32("graphics/decorations/red_plant.4bpp.smol"); const u16 gDecorIconPalette_RedPlant[] = INCBIN_U16("graphics/decorations/red_plant.gbapal"); -const u32 gDecorIcon_TropicalPlant[] = INCBIN_U32("graphics/decorations/tropical_plant.4bpp.lz"); +const u32 gDecorIcon_TropicalPlant[] = INCBIN_U32("graphics/decorations/tropical_plant.4bpp.smol"); const u16 gDecorIconPalette_TropicalPlant[] = INCBIN_U16("graphics/decorations/tropical_plant.gbapal"); -const u32 gDecorIcon_PrettyFlowers[] = INCBIN_U32("graphics/decorations/pretty_flowers.4bpp.lz"); +const u32 gDecorIcon_PrettyFlowers[] = INCBIN_U32("graphics/decorations/pretty_flowers.4bpp.smol"); const u16 gDecorIconPalette_PrettyFlowers[] = INCBIN_U16("graphics/decorations/pretty_flowers.gbapal"); -const u32 gDecorIcon_ColorfulPlant[] = INCBIN_U32("graphics/decorations/colorful_plant.4bpp.lz"); +const u32 gDecorIcon_ColorfulPlant[] = INCBIN_U32("graphics/decorations/colorful_plant.4bpp.smol"); const u16 gDecorIconPalette_ColorfulPlant[] = INCBIN_U16("graphics/decorations/colorful_plant.gbapal"); -const u32 gDecorIcon_BigPlant[] = INCBIN_U32("graphics/decorations/big_plant.4bpp.lz"); +const u32 gDecorIcon_BigPlant[] = INCBIN_U32("graphics/decorations/big_plant.4bpp.smol"); const u16 gDecorIconPalette_BigPlant[] = INCBIN_U16("graphics/decorations/big_plant.gbapal"); -const u32 gDecorIcon_GorgeousPlant[] = INCBIN_U32("graphics/decorations/gorgeous_plant.4bpp.lz"); +const u32 gDecorIcon_GorgeousPlant[] = INCBIN_U32("graphics/decorations/gorgeous_plant.4bpp.smol"); const u16 gDecorIconPalette_GorgeousPlant[] = INCBIN_U16("graphics/decorations/gorgeous_plant.gbapal"); -const u32 gDecorIcon_RedBrick[] = INCBIN_U32("graphics/decorations/red_brick.4bpp.lz"); +const u32 gDecorIcon_RedBrick[] = INCBIN_U32("graphics/decorations/red_brick.4bpp.smol"); const u16 gDecorIconPalette_RedBrick[] = INCBIN_U16("graphics/decorations/red_brick.gbapal"); -const u32 gDecorIcon_YellowBrick[] = INCBIN_U32("graphics/decorations/yellow_brick.4bpp.lz"); +const u32 gDecorIcon_YellowBrick[] = INCBIN_U32("graphics/decorations/yellow_brick.4bpp.smol"); const u16 gDecorIconPalette_YellowBrick[] = INCBIN_U16("graphics/decorations/yellow_brick.gbapal"); -const u32 gDecorIcon_BlueBrick[] = INCBIN_U32("graphics/decorations/blue_brick.4bpp.lz"); +const u32 gDecorIcon_BlueBrick[] = INCBIN_U32("graphics/decorations/blue_brick.4bpp.smol"); const u16 gDecorIconPalette_BlueBrick[] = INCBIN_U16("graphics/decorations/blue_brick.gbapal"); -const u32 gDecorIcon_RedTent[] = INCBIN_U32("graphics/decorations/red_tent.4bpp.lz"); +const u32 gDecorIcon_RedTent[] = INCBIN_U32("graphics/decorations/red_tent.4bpp.smol"); const u16 gDecorIconPalette_RedTent[] = INCBIN_U16("graphics/decorations/red_tent.gbapal"); -const u32 gDecorIcon_BlueTent[] = INCBIN_U32("graphics/decorations/blue_tent.4bpp.lz"); +const u32 gDecorIcon_BlueTent[] = INCBIN_U32("graphics/decorations/blue_tent.4bpp.smol"); const u16 gDecorIconPalette_BlueTent[] = INCBIN_U16("graphics/decorations/blue_tent.gbapal"); -const u32 gDecorIcon_SolidBoard[] = INCBIN_U32("graphics/decorations/solid_board.4bpp.lz"); +const u32 gDecorIcon_SolidBoard[] = INCBIN_U32("graphics/decorations/solid_board.4bpp.smol"); const u16 gDecorIconPalette_SolidBoard[] = INCBIN_U16("graphics/decorations/solid_board.gbapal"); -const u32 gDecorIcon_Slide[] = INCBIN_U32("graphics/decorations/slide.4bpp.lz"); +const u32 gDecorIcon_Slide[] = INCBIN_U32("graphics/decorations/slide.4bpp.smol"); const u16 gDecorIconPalette_Slide[] = INCBIN_U16("graphics/decorations/slide.gbapal"); -const u32 gDecorIcon_Tire[] = INCBIN_U32("graphics/decorations/tire.4bpp.lz"); +const u32 gDecorIcon_Tire[] = INCBIN_U32("graphics/decorations/tire.4bpp.smol"); const u16 gDecorIconPalette_Tire[] = INCBIN_U16("graphics/decorations/tire.gbapal"); -const u32 gDecorIcon_Stand[] = INCBIN_U32("graphics/decorations/stand.4bpp.lz"); +const u32 gDecorIcon_Stand[] = INCBIN_U32("graphics/decorations/stand.4bpp.smol"); const u16 gDecorIconPalette_Stand[] = INCBIN_U16("graphics/decorations/stand.gbapal"); -const u32 gDecorIcon_BreakableDoor[] = INCBIN_U32("graphics/decorations/breakable_door.4bpp.lz"); +const u32 gDecorIcon_BreakableDoor[] = INCBIN_U32("graphics/decorations/breakable_door.4bpp.smol"); const u16 gDecorIconPalette_BreakableDoor[] = INCBIN_U16("graphics/decorations/breakable_door.gbapal"); -const u32 gDecorIcon_SandOrnament[] = INCBIN_U32("graphics/decorations/sand_ornament.4bpp.lz"); +const u32 gDecorIcon_SandOrnament[] = INCBIN_U32("graphics/decorations/sand_ornament.4bpp.smol"); const u16 gDecorIconPalette_SandOrnament[] = INCBIN_U16("graphics/decorations/sand_ornament.gbapal"); -const u32 gDecorIcon_GlassOrnament[] = INCBIN_U32("graphics/decorations/glass_ornament.4bpp.lz"); +const u32 gDecorIcon_GlassOrnament[] = INCBIN_U32("graphics/decorations/glass_ornament.4bpp.smol"); const u16 gDecorIconPalette_GlassOrnament[] = INCBIN_U16("graphics/decorations/glass_ornament.gbapal"); -const u32 gDecorIcon_SurfMat[] = INCBIN_U32("graphics/decorations/surf_mat.4bpp.lz"); +const u32 gDecorIcon_SurfMat[] = INCBIN_U32("graphics/decorations/surf_mat.4bpp.smol"); const u16 gDecorIconPalette_SurfMat[] = INCBIN_U16("graphics/decorations/surf_mat.gbapal"); -const u32 gDecorIcon_ThunderMat[] = INCBIN_U32("graphics/decorations/thunder_mat.4bpp.lz"); +const u32 gDecorIcon_ThunderMat[] = INCBIN_U32("graphics/decorations/thunder_mat.4bpp.smol"); const u16 gDecorIconPalette_ThunderMat[] = INCBIN_U16("graphics/decorations/thunder_mat.gbapal"); -const u32 gDecorIcon_FireBlastMat[] = INCBIN_U32("graphics/decorations/fire_blast_mat.4bpp.lz"); +const u32 gDecorIcon_FireBlastMat[] = INCBIN_U32("graphics/decorations/fire_blast_mat.4bpp.smol"); const u16 gDecorIconPalette_FireBlastMat[] = INCBIN_U16("graphics/decorations/fire_blast_mat.gbapal"); -const u32 gDecorIcon_PowderSnowMat[] = INCBIN_U32("graphics/decorations/powder_snow_mat.4bpp.lz"); +const u32 gDecorIcon_PowderSnowMat[] = INCBIN_U32("graphics/decorations/powder_snow_mat.4bpp.smol"); const u16 gDecorIconPalette_PowderSnowMat[] = INCBIN_U16("graphics/decorations/powder_snow_mat.gbapal"); -const u32 gDecorIcon_AttractMat[] = INCBIN_U32("graphics/decorations/attract_mat.4bpp.lz"); +const u32 gDecorIcon_AttractMat[] = INCBIN_U32("graphics/decorations/attract_mat.4bpp.smol"); const u16 gDecorIconPalette_AttractMat[] = INCBIN_U16("graphics/decorations/attract_mat.gbapal"); -const u32 gDecorIcon_FissureMat[] = INCBIN_U32("graphics/decorations/fissure_mat.4bpp.lz"); +const u32 gDecorIcon_FissureMat[] = INCBIN_U32("graphics/decorations/fissure_mat.4bpp.smol"); const u16 gDecorIconPalette_FissureMat[] = INCBIN_U16("graphics/decorations/fissure_mat.gbapal"); -const u32 gDecorIcon_SpikesMat[] = INCBIN_U32("graphics/decorations/spikes_mat.4bpp.lz"); +const u32 gDecorIcon_SpikesMat[] = INCBIN_U32("graphics/decorations/spikes_mat.4bpp.smol"); const u16 gDecorIconPalette_SpikesMat[] = INCBIN_U16("graphics/decorations/spikes_mat.gbapal"); -const u32 gDecorIcon_SnorlaxDoll[] = INCBIN_U32("graphics/decorations/snorlax_doll.4bpp.lz"); +const u32 gDecorIcon_SnorlaxDoll[] = INCBIN_U32("graphics/decorations/snorlax_doll.4bpp.smol"); const u16 gDecorIconPalette_SnorlaxDoll[] = INCBIN_U16("graphics/decorations/snorlax_doll.gbapal"); -const u32 gDecorIcon_RhydonDoll[] = INCBIN_U32("graphics/decorations/rhydon_doll.4bpp.lz"); +const u32 gDecorIcon_RhydonDoll[] = INCBIN_U32("graphics/decorations/rhydon_doll.4bpp.smol"); const u16 gDecorIconPalette_RhydonDoll[] = INCBIN_U16("graphics/decorations/rhydon_doll.gbapal"); -const u32 gDecorIcon_LaprasDoll[] = INCBIN_U32("graphics/decorations/lapras_doll.4bpp.lz"); +const u32 gDecorIcon_LaprasDoll[] = INCBIN_U32("graphics/decorations/lapras_doll.4bpp.smol"); const u16 gDecorIconPalette_LaprasDoll[] = INCBIN_U16("graphics/decorations/lapras_doll.gbapal"); -const u32 gDecorIcon_VenusaurDoll[] = INCBIN_U32("graphics/decorations/venusaur_doll.4bpp.lz"); +const u32 gDecorIcon_VenusaurDoll[] = INCBIN_U32("graphics/decorations/venusaur_doll.4bpp.smol"); const u16 gDecorIconPalette_VenusaurDoll[] = INCBIN_U16("graphics/decorations/venusaur_doll.gbapal"); -const u32 gDecorIcon_CharizardDoll[] = INCBIN_U32("graphics/decorations/charizard_doll.4bpp.lz"); +const u32 gDecorIcon_CharizardDoll[] = INCBIN_U32("graphics/decorations/charizard_doll.4bpp.smol"); const u16 gDecorIconPalette_CharizardDoll[] = INCBIN_U16("graphics/decorations/charizard_doll.gbapal"); -const u32 gDecorIcon_BlastoiseDoll[] = INCBIN_U32("graphics/decorations/blastoise_doll.4bpp.lz"); +const u32 gDecorIcon_BlastoiseDoll[] = INCBIN_U32("graphics/decorations/blastoise_doll.4bpp.smol"); const u16 gDecorIconPalette_BlastoiseDoll[] = INCBIN_U16("graphics/decorations/blastoise_doll.gbapal"); -const u32 gDecorIcon_WailmerDoll[] = INCBIN_U32("graphics/decorations/wailmer_doll.4bpp.lz"); +const u32 gDecorIcon_WailmerDoll[] = INCBIN_U32("graphics/decorations/wailmer_doll.4bpp.smol"); const u16 gDecorIconPalette_WailmerDoll[] = INCBIN_U16("graphics/decorations/wailmer_doll.gbapal"); -const u32 gDecorIcon_RegiceDoll[] = INCBIN_U32("graphics/decorations/regice_doll.4bpp.lz"); +const u32 gDecorIcon_RegiceDoll[] = INCBIN_U32("graphics/decorations/regice_doll.4bpp.smol"); const u16 gDecorIconPalette_RegiceDoll[] = INCBIN_U16("graphics/decorations/regice_doll.gbapal"); -const u32 gDecorIcon_RegirockDoll[] = INCBIN_U32("graphics/decorations/regirock_doll.4bpp.lz"); +const u32 gDecorIcon_RegirockDoll[] = INCBIN_U32("graphics/decorations/regirock_doll.4bpp.smol"); const u16 gDecorIconPalette_RegirockDoll[] = INCBIN_U16("graphics/decorations/regirock_doll.gbapal"); -const u32 gDecorIcon_RegisteelDoll[] = INCBIN_U32("graphics/decorations/registeel_doll.4bpp.lz"); +const u32 gDecorIcon_RegisteelDoll[] = INCBIN_U32("graphics/decorations/registeel_doll.4bpp.smol"); const u16 gDecorIconPalette_RegisteelDoll[] = INCBIN_U16("graphics/decorations/registeel_doll.gbapal"); diff --git a/src/data/graphics/intro_scene.h b/src/data/graphics/intro_scene.h index cb7706c9a3..792f6b3d26 100644 --- a/src/data/graphics/intro_scene.h +++ b/src/data/graphics/intro_scene.h @@ -6,42 +6,42 @@ const u16 gIntroTorchic_Pal[] = INCBIN_U16("graphics/intro/scene_2/torchic.gbapa const u16 gIntroManectric_Pal[] = INCBIN_U16("graphics/intro/scene_2/manectric.gbapal"); const u16 gIntroFlygon_Pal[] = INCBIN_U16("graphics/intro/scene_2/flygon.gbapal"); -const u32 gIntroVolbeat_Gfx[] = INCBIN_U32("graphics/intro/scene_2/volbeat.4bpp.lz"); -const u32 gIntroTorchic_Gfx[] = INCBIN_U32("graphics/intro/scene_2/torchic.4bpp.lz"); -const u32 gIntroManectric_Gfx[] = INCBIN_U32("graphics/intro/scene_2/manectric.4bpp.lz"); -const u32 gIntroFlygon_Gfx[] = INCBIN_U32("graphics/intro/scene_2/flygon.4bpp.lz"); -const u32 gIntroBrendan_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan.4bpp.lz"); -const u32 gIntroMay_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may.4bpp.lz"); +const u32 gIntroVolbeat_Gfx[] = INCBIN_U32("graphics/intro/scene_2/volbeat.4bpp.smol"); +const u32 gIntroTorchic_Gfx[] = INCBIN_U32("graphics/intro/scene_2/torchic.4bpp.smol"); +const u32 gIntroManectric_Gfx[] = INCBIN_U32("graphics/intro/scene_2/manectric.4bpp.smol"); +const u32 gIntroFlygon_Gfx[] = INCBIN_U32("graphics/intro/scene_2/flygon.4bpp.smol"); +const u32 gIntroBrendan_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan.4bpp.smol"); +const u32 gIntroMay_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may.4bpp.smol"); -const u32 gIntroGroudon_Gfx[] = INCBIN_U32("graphics/intro/scene_3/groudon.8bpp.lz"); -const u32 gIntroGroudon_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon.bin.lz"); +const u32 gIntroGroudon_Gfx[] = INCBIN_U32("graphics/intro/scene_3/groudon.8bpp.smol"); +const u32 gIntroGroudon_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon.bin.smolTM"); -const u32 gIntroKyogre_Gfx[] = INCBIN_U32("graphics/intro/scene_3/kyogre.8bpp.lz"); -const u32 gIntroKyogre_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre.bin.lz"); +const u32 gIntroKyogre_Gfx[] = INCBIN_U32("graphics/intro/scene_3/kyogre.8bpp.smol"); +const u32 gIntroKyogre_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre.bin.smolTM"); -const u32 gIntroLegendBg_Gfx[] = INCBIN_U32("graphics/intro/scene_3/legend_bg.4bpp.lz"); // groudon/kyogre bg -const u32 gIntroGroudonBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon_bg.bin.lz"); -const u32 gIntroKyogreBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre_bg.bin.lz"); +const u32 gIntroLegendBg_Gfx[] = INCBIN_U32("graphics/intro/scene_3/legend_bg.4bpp.smol"); // groudon/kyogre bg +const u32 gIntroGroudonBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon_bg.bin.smolTM"); +const u32 gIntroKyogreBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre_bg.bin.smolTM"); -const u32 gIntroClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/clouds.4bpp.lz"); -const u32 gIntroCloudsLeft_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_left.bin.lz"); -const u32 gIntroCloudsRight_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_right.bin.lz"); -const u32 gIntroCloudsSun_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_sun.bin.lz"); +const u32 gIntroClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/clouds.4bpp.smol"); +const u32 gIntroCloudsLeft_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_left.bin.smolTM"); +const u32 gIntroCloudsRight_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_right.bin.smolTM"); +const u32 gIntroCloudsSun_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_sun.bin.smolTM"); -const u32 gIntroLightning_Gfx[] = INCBIN_U32("graphics/intro/scene_3/lightning.4bpp.lz"); +const u32 gIntroLightning_Gfx[] = INCBIN_U32("graphics/intro/scene_3/lightning.4bpp.smol"); const u16 gIntroLightning_Pal[] = INCBIN_U16("graphics/intro/scene_3/lightning.gbapal"); -const u32 gIntroRayquaza_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.4bpp.lz"); -const u32 gIntroRayquaza_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.bin.lz"); +const u32 gIntroRayquaza_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.4bpp.smol"); +const u32 gIntroRayquaza_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.bin.smolTM"); -const u32 gIntroUnused1_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_1.bin.lz"); -const u32 gIntroUnused2_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_2.bin.lz"); +const u32 gIntroUnused1_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_1.bin.smolTM"); +const u32 gIntroUnused2_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_2.bin.smolTM"); -const u32 gIntroRayquazaClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.4bpp.lz"); -const u32 gIntroRayquazaClouds_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.bin.lz"); +const u32 gIntroRayquazaClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.4bpp.smol"); +const u32 gIntroRayquazaClouds_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.bin.smolTM"); -const u32 gIntroBubbles_Gfx[] = INCBIN_U32("graphics/intro/scene_3/bubbles.4bpp.lz"); +const u32 gIntroBubbles_Gfx[] = INCBIN_U32("graphics/intro/scene_3/bubbles.4bpp.smol"); const u16 gIntroBubbles_Pal[] = INCBIN_U16("graphics/intro/scene_3/bubbles.gbapal"); -const u32 gIntroFlygonSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_1/flygon.4bpp.lz"); -const u32 gIntroSparkle_Gfx[] = INCBIN_U32("graphics/intro/scene_1/sparkle.4bpp.lz"); +const u32 gIntroFlygonSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_1/flygon.4bpp.smol"); +const u32 gIntroSparkle_Gfx[] = INCBIN_U32("graphics/intro/scene_1/sparkle.4bpp.smol"); diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 403530effc..31a78d8c6b 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -1,139 +1,139 @@ -const u32 gItemIcon_QuestionMark[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.lz"); +const u32 gItemIcon_QuestionMark[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.smol"); const u16 gItemIconPalette_QuestionMark[] = INCBIN_U16("graphics/items/icon_palettes/question_mark.gbapal"); -const u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.lz"); +const u32 gItemIcon_ReturnToFieldArrow[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.smol"); const u16 gItemIconPalette_ReturnToFieldArrow[] = INCBIN_U16("graphics/items/icon_palettes/return_to_field_arrow.gbapal"); // Poké Balls -const u32 gItemIcon_StrangeBall[] = INCBIN_U32("graphics/items/icons/strange_ball.4bpp.lz"); +const u32 gItemIcon_StrangeBall[] = INCBIN_U32("graphics/items/icons/strange_ball.4bpp.smol"); const u16 gItemIconPalette_StrangeBall[] = INCBIN_U16("graphics/items/icon_palettes/strange_ball.gbapal"); -const u32 gItemIcon_PokeBall[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.lz"); +const u32 gItemIcon_PokeBall[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.smol"); const u16 gItemIconPalette_PokeBall[] = INCBIN_U16("graphics/items/icon_palettes/poke_ball.gbapal"); -const u32 gItemIcon_GreatBall[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.lz"); +const u32 gItemIcon_GreatBall[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.smol"); const u16 gItemIconPalette_GreatBall[] = INCBIN_U16("graphics/items/icon_palettes/great_ball.gbapal"); -const u32 gItemIcon_UltraBall[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.lz"); +const u32 gItemIcon_UltraBall[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.smol"); const u16 gItemIconPalette_UltraBall[] = INCBIN_U16("graphics/items/icon_palettes/ultra_ball.gbapal"); -const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.lz"); +const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.smol"); const u16 gItemIconPalette_MasterBall[] = INCBIN_U16("graphics/items/icon_palettes/master_ball.gbapal"); -const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.lz"); +const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.smol"); -const u32 gItemIcon_HealBall[] = INCBIN_U32("graphics/items/icons/heal_ball.4bpp.lz"); +const u32 gItemIcon_HealBall[] = INCBIN_U32("graphics/items/icons/heal_ball.4bpp.smol"); const u16 gItemIconPalette_HealBall[] = INCBIN_U16("graphics/items/icon_palettes/heal_ball.gbapal"); -const u32 gItemIcon_NetBall[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.lz"); +const u32 gItemIcon_NetBall[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.smol"); const u16 gItemIconPalette_NetBall[] = INCBIN_U16("graphics/items/icon_palettes/net_ball.gbapal"); -const u32 gItemIcon_NestBall[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.lz"); +const u32 gItemIcon_NestBall[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.smol"); const u16 gItemIconPalette_NestBall[] = INCBIN_U16("graphics/items/icon_palettes/nest_ball.gbapal"); -const u32 gItemIcon_DiveBall[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.lz"); +const u32 gItemIcon_DiveBall[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.smol"); const u16 gItemIconPalette_DiveBall[] = INCBIN_U16("graphics/items/icon_palettes/dive_ball.gbapal"); -const u32 gItemIcon_DuskBall[] = INCBIN_U32("graphics/items/icons/dusk_ball.4bpp.lz"); +const u32 gItemIcon_DuskBall[] = INCBIN_U32("graphics/items/icons/dusk_ball.4bpp.smol"); const u16 gItemIconPalette_DuskBall[] = INCBIN_U16("graphics/items/icon_palettes/dusk_ball.gbapal"); -const u32 gItemIcon_TimerBall[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.lz"); +const u32 gItemIcon_TimerBall[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.smol"); -const u32 gItemIcon_QuickBall[] = INCBIN_U32("graphics/items/icons/quick_ball.4bpp.lz"); +const u32 gItemIcon_QuickBall[] = INCBIN_U32("graphics/items/icons/quick_ball.4bpp.smol"); const u16 gItemIconPalette_QuickBall[] = INCBIN_U16("graphics/items/icon_palettes/quick_ball.gbapal"); -const u32 gItemIcon_RepeatBall[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.lz"); +const u32 gItemIcon_RepeatBall[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.smol"); const u16 gItemIconPalette_RepeatBall[] = INCBIN_U16("graphics/items/icon_palettes/repeat_ball.gbapal"); -const u32 gItemIcon_LuxuryBall[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.lz"); +const u32 gItemIcon_LuxuryBall[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.smol"); const u16 gItemIconPalette_LuxuryBall[] = INCBIN_U16("graphics/items/icon_palettes/luxury_ball.gbapal"); -const u32 gItemIcon_LevelBall[] = INCBIN_U32("graphics/items/icons/level_ball.4bpp.lz"); +const u32 gItemIcon_LevelBall[] = INCBIN_U32("graphics/items/icons/level_ball.4bpp.smol"); const u16 gItemIconPalette_LevelBall[] = INCBIN_U16("graphics/items/icon_palettes/level_ball.gbapal"); -const u32 gItemIcon_LureBall[] = INCBIN_U32("graphics/items/icons/lure_ball.4bpp.lz"); +const u32 gItemIcon_LureBall[] = INCBIN_U32("graphics/items/icons/lure_ball.4bpp.smol"); const u16 gItemIconPalette_LureBall[] = INCBIN_U16("graphics/items/icon_palettes/lure_ball.gbapal"); -const u32 gItemIcon_MoonBall[] = INCBIN_U32("graphics/items/icons/moon_ball.4bpp.lz"); +const u32 gItemIcon_MoonBall[] = INCBIN_U32("graphics/items/icons/moon_ball.4bpp.smol"); const u16 gItemIconPalette_MoonBall[] = INCBIN_U16("graphics/items/icon_palettes/moon_ball.gbapal"); -const u32 gItemIcon_FriendBall[] = INCBIN_U32("graphics/items/icons/friend_ball.4bpp.lz"); +const u32 gItemIcon_FriendBall[] = INCBIN_U32("graphics/items/icons/friend_ball.4bpp.smol"); const u16 gItemIconPalette_FriendBall[] = INCBIN_U16("graphics/items/icon_palettes/friend_ball.gbapal"); -const u32 gItemIcon_LoveBall[] = INCBIN_U32("graphics/items/icons/love_ball.4bpp.lz"); +const u32 gItemIcon_LoveBall[] = INCBIN_U32("graphics/items/icons/love_ball.4bpp.smol"); const u16 gItemIconPalette_LoveBall[] = INCBIN_U16("graphics/items/icon_palettes/love_ball.gbapal"); -const u32 gItemIcon_FastBall[] = INCBIN_U32("graphics/items/icons/fast_ball.4bpp.lz"); +const u32 gItemIcon_FastBall[] = INCBIN_U32("graphics/items/icons/fast_ball.4bpp.smol"); const u16 gItemIconPalette_FastBall[] = INCBIN_U16("graphics/items/icon_palettes/fast_ball.gbapal"); -const u32 gItemIcon_HeavyBall[] = INCBIN_U32("graphics/items/icons/heavy_ball.4bpp.lz"); +const u32 gItemIcon_HeavyBall[] = INCBIN_U32("graphics/items/icons/heavy_ball.4bpp.smol"); const u16 gItemIconPalette_HeavyBall[] = INCBIN_U16("graphics/items/icon_palettes/heavy_ball.gbapal"); -const u32 gItemIcon_DreamBall[] = INCBIN_U32("graphics/items/icons/dream_ball.4bpp.lz"); +const u32 gItemIcon_DreamBall[] = INCBIN_U32("graphics/items/icons/dream_ball.4bpp.smol"); const u16 gItemIconPalette_DreamBall[] = INCBIN_U16("graphics/items/icon_palettes/dream_ball.gbapal"); -const u32 gItemIcon_SafariBall[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.lz"); +const u32 gItemIcon_SafariBall[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.smol"); const u16 gItemIconPalette_SafariBall[] = INCBIN_U16("graphics/items/icon_palettes/safari_ball.gbapal"); -const u32 gItemIcon_SportBall[] = INCBIN_U32("graphics/items/icons/sport_ball.4bpp.lz"); +const u32 gItemIcon_SportBall[] = INCBIN_U32("graphics/items/icons/sport_ball.4bpp.smol"); const u16 gItemIconPalette_SportBall[] = INCBIN_U16("graphics/items/icon_palettes/sport_ball.gbapal"); -const u32 gItemIcon_ParkBall[] = INCBIN_U32("graphics/items/icons/park_ball.4bpp.lz"); +const u32 gItemIcon_ParkBall[] = INCBIN_U32("graphics/items/icons/park_ball.4bpp.smol"); const u16 gItemIconPalette_ParkBall[] = INCBIN_U16("graphics/items/icon_palettes/park_ball.gbapal"); -const u32 gItemIcon_BeastBall[] = INCBIN_U32("graphics/items/icons/beast_ball.4bpp.lz"); +const u32 gItemIcon_BeastBall[] = INCBIN_U32("graphics/items/icons/beast_ball.4bpp.smol"); const u16 gItemIconPalette_BeastBall[] = INCBIN_U16("graphics/items/icon_palettes/beast_ball.gbapal"); -const u32 gItemIcon_CherishBall[] = INCBIN_U32("graphics/items/icons/cherish_ball.4bpp.lz"); +const u32 gItemIcon_CherishBall[] = INCBIN_U32("graphics/items/icons/cherish_ball.4bpp.smol"); const u16 gItemIconPalette_CherishBall[] = INCBIN_U16("graphics/items/icon_palettes/cherish_ball.gbapal"); // Medicine -const u32 gItemIcon_Potion[] = INCBIN_U32("graphics/items/icons/potion.4bpp.lz"); +const u32 gItemIcon_Potion[] = INCBIN_U32("graphics/items/icons/potion.4bpp.smol"); const u16 gItemIconPalette_Potion[] = INCBIN_U16("graphics/items/icon_palettes/potion.gbapal"); const u16 gItemIconPalette_SuperPotion[] = INCBIN_U16("graphics/items/icon_palettes/super_potion.gbapal"); const u16 gItemIconPalette_HyperPotion[] = INCBIN_U16("graphics/items/icon_palettes/hyper_potion.gbapal"); -const u32 gItemIcon_LargePotion[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.lz"); +const u32 gItemIcon_LargePotion[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.smol"); const u16 gItemIconPalette_MaxPotion[] = INCBIN_U16("graphics/items/icon_palettes/max_potion.gbapal"); const u16 gItemIconPalette_FullRestore[] = INCBIN_U16("graphics/items/icon_palettes/full_restore.gbapal"); -const u32 gItemIcon_Revive[] = INCBIN_U32("graphics/items/icons/revive.4bpp.lz"); +const u32 gItemIcon_Revive[] = INCBIN_U32("graphics/items/icons/revive.4bpp.smol"); const u16 gItemIconPalette_Revive[] = INCBIN_U16("graphics/items/icon_palettes/revive.gbapal"); -const u32 gItemIcon_MaxRevive[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.lz"); +const u32 gItemIcon_MaxRevive[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.smol"); -const u32 gItemIcon_FreshWater[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.lz"); +const u32 gItemIcon_FreshWater[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.smol"); const u16 gItemIconPalette_FreshWater[] = INCBIN_U16("graphics/items/icon_palettes/fresh_water.gbapal"); -const u32 gItemIcon_SodaPop[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.lz"); +const u32 gItemIcon_SodaPop[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.smol"); const u16 gItemIconPalette_SodaPop[] = INCBIN_U16("graphics/items/icon_palettes/soda_pop.gbapal"); -const u32 gItemIcon_Lemonade[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.lz"); +const u32 gItemIcon_Lemonade[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.smol"); const u16 gItemIconPalette_Lemonade[] = INCBIN_U16("graphics/items/icon_palettes/lemonade.gbapal"); -const u32 gItemIcon_MoomooMilk[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.lz"); +const u32 gItemIcon_MoomooMilk[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.smol"); const u16 gItemIconPalette_MoomooMilk[] = INCBIN_U16("graphics/items/icon_palettes/moomoo_milk.gbapal"); -const u32 gItemIcon_Powder[] = INCBIN_U32("graphics/items/icons/powder.4bpp.lz"); +const u32 gItemIcon_Powder[] = INCBIN_U32("graphics/items/icons/powder.4bpp.smol"); const u16 gItemIconPalette_EnergyPowder[] = INCBIN_U16("graphics/items/icon_palettes/energy_powder.gbapal"); -const u32 gItemIcon_EnergyRoot[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.lz"); +const u32 gItemIcon_EnergyRoot[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.smol"); const u16 gItemIconPalette_EnergyRoot[] = INCBIN_U16("graphics/items/icon_palettes/energy_root.gbapal"); const u16 gItemIconPalette_HealPowder[] = INCBIN_U16("graphics/items/icon_palettes/heal_powder.gbapal"); -const u32 gItemIcon_RevivalHerb[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.lz"); +const u32 gItemIcon_RevivalHerb[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.smol"); const u16 gItemIconPalette_RevivalHerb[] = INCBIN_U16("graphics/items/icon_palettes/revival_herb.gbapal"); -const u32 gItemIcon_Antidote[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.lz"); +const u32 gItemIcon_Antidote[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.smol"); const u16 gItemIconPalette_Antidote[] = INCBIN_U16("graphics/items/icon_palettes/antidote.gbapal"); -const u32 gItemIcon_StatusHeal[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.lz"); +const u32 gItemIcon_StatusHeal[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.smol"); const u16 gItemIconPalette_ParalyzeHeal[] = INCBIN_U16("graphics/items/icon_palettes/paralyze_heal.gbapal"); const u16 gItemIconPalette_BurnHeal[] = INCBIN_U16("graphics/items/icon_palettes/burn_heal.gbapal"); @@ -142,10 +142,10 @@ const u16 gItemIconPalette_IceHeal[] = INCBIN_U16("graphics/items/icon_palettes/ const u16 gItemIconPalette_Awakening[] = INCBIN_U16("graphics/items/icon_palettes/awakening.gbapal"); -const u32 gItemIcon_FullHeal[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.lz"); +const u32 gItemIcon_FullHeal[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.smol"); const u16 gItemIconPalette_FullHeal[] = INCBIN_U16("graphics/items/icon_palettes/full_heal.gbapal"); -const u32 gItemIcon_Ether[] = INCBIN_U32("graphics/items/icons/ether.4bpp.lz"); +const u32 gItemIcon_Ether[] = INCBIN_U32("graphics/items/icons/ether.4bpp.smol"); const u16 gItemIconPalette_Ether[] = INCBIN_U16("graphics/items/icon_palettes/ether.gbapal"); const u16 gItemIconPalette_MaxEther[] = INCBIN_U16("graphics/items/icon_palettes/max_ether.gbapal"); @@ -154,50 +154,50 @@ const u16 gItemIconPalette_Elixir[] = INCBIN_U16("graphics/items/icon_palettes/e const u16 gItemIconPalette_MaxElixir[] = INCBIN_U16("graphics/items/icon_palettes/max_elixir.gbapal"); -const u32 gItemIcon_BerryJuice[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.lz"); +const u32 gItemIcon_BerryJuice[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.smol"); const u16 gItemIconPalette_BerryJuice[] = INCBIN_U16("graphics/items/icon_palettes/berry_juice.gbapal"); -const u32 gItemIcon_SacredAsh[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.lz"); +const u32 gItemIcon_SacredAsh[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.smol"); const u16 gItemIconPalette_SacredAsh[] = INCBIN_U16("graphics/items/icon_palettes/sacred_ash.gbapal"); -const u32 gItemIcon_SweetHeart[] = INCBIN_U32("graphics/items/icons/sweet_heart.4bpp.lz"); +const u32 gItemIcon_SweetHeart[] = INCBIN_U32("graphics/items/icons/sweet_heart.4bpp.smol"); const u16 gItemIconPalette_SweetHeart[] = INCBIN_U16("graphics/items/icon_palettes/sweet_heart.gbapal"); -const u32 gItemIcon_MaxHoney[] = INCBIN_U32("graphics/items/icons/max_honey.4bpp.lz"); +const u32 gItemIcon_MaxHoney[] = INCBIN_U32("graphics/items/icons/max_honey.4bpp.smol"); const u16 gItemIconPalette_MaxHoney[] = INCBIN_U16("graphics/items/icon_palettes/max_honey.gbapal"); // Regional Specialties -const u32 gItemIcon_PewterCrunchies[] = INCBIN_U32("graphics/items/icons/pewter_crunchies.4bpp.lz"); +const u32 gItemIcon_PewterCrunchies[] = INCBIN_U32("graphics/items/icons/pewter_crunchies.4bpp.smol"); const u16 gItemIconPalette_PewterCrunchies[] = INCBIN_U16("graphics/items/icon_palettes/pewter_crunchies.gbapal"); -const u32 gItemIcon_RageCandyBar[] = INCBIN_U32("graphics/items/icons/rage_candy_bar.4bpp.lz"); +const u32 gItemIcon_RageCandyBar[] = INCBIN_U32("graphics/items/icons/rage_candy_bar.4bpp.smol"); const u16 gItemIconPalette_RageCandyBar[] = INCBIN_U16("graphics/items/icon_palettes/rage_candy_bar.gbapal"); -const u32 gItemIcon_LavaCookie[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.lz"); +const u32 gItemIcon_LavaCookie[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.smol"); const u16 gItemIconPalette_LavaCookieAndLetter[] = INCBIN_U16("graphics/items/icon_palettes/lava_cookie_and_letter.gbapal"); -const u32 gItemIcon_OldGateau[] = INCBIN_U32("graphics/items/icons/old_gateau.4bpp.lz"); +const u32 gItemIcon_OldGateau[] = INCBIN_U32("graphics/items/icons/old_gateau.4bpp.smol"); const u16 gItemIconPalette_OldGateau[] = INCBIN_U16("graphics/items/icon_palettes/old_gateau.gbapal"); -const u32 gItemIcon_Casteliacone[] = INCBIN_U32("graphics/items/icons/casteliacone.4bpp.lz"); +const u32 gItemIcon_Casteliacone[] = INCBIN_U32("graphics/items/icons/casteliacone.4bpp.smol"); const u16 gItemIconPalette_Casteliacone[] = INCBIN_U16("graphics/items/icon_palettes/casteliacone.gbapal"); -const u32 gItemIcon_LumioseGalette[] = INCBIN_U32("graphics/items/icons/lumiose_galette.4bpp.lz"); +const u32 gItemIcon_LumioseGalette[] = INCBIN_U32("graphics/items/icons/lumiose_galette.4bpp.smol"); const u16 gItemIconPalette_LumioseGalette[] = INCBIN_U16("graphics/items/icon_palettes/lumiose_galette.gbapal"); -const u32 gItemIcon_ShalourSable[] = INCBIN_U32("graphics/items/icons/shalour_sable.4bpp.lz"); +const u32 gItemIcon_ShalourSable[] = INCBIN_U32("graphics/items/icons/shalour_sable.4bpp.smol"); const u16 gItemIconPalette_ShalourSable[] = INCBIN_U16("graphics/items/icon_palettes/shalour_sable.gbapal"); -const u32 gItemIcon_BigMalasada[] = INCBIN_U32("graphics/items/icons/big_malasada.4bpp.lz"); +const u32 gItemIcon_BigMalasada[] = INCBIN_U32("graphics/items/icons/big_malasada.4bpp.smol"); const u16 gItemIconPalette_BigMalasada[] = INCBIN_U16("graphics/items/icon_palettes/big_malasada.gbapal"); // Vitamins -const u32 gItemIcon_HPUp[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.lz"); +const u32 gItemIcon_HPUp[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.smol"); const u16 gItemIconPalette_HPUp[] = INCBIN_U16("graphics/items/icon_palettes/hp_up.gbapal"); -const u32 gItemIcon_Vitamin[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.lz"); +const u32 gItemIcon_Vitamin[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.smol"); const u16 gItemIconPalette_Protein[] = INCBIN_U16("graphics/items/icon_palettes/protein.gbapal"); const u16 gItemIconPalette_Iron[] = INCBIN_U16("graphics/items/icon_palettes/iron.gbapal"); @@ -208,43 +208,43 @@ const u16 gItemIconPalette_Zinc[] = INCBIN_U16("graphics/items/icon_palettes/zin const u16 gItemIconPalette_Carbos[] = INCBIN_U16("graphics/items/icon_palettes/carbos.gbapal"); -const u32 gItemIcon_PPUp[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.lz"); +const u32 gItemIcon_PPUp[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.smol"); const u16 gItemIconPalette_PPUp[] = INCBIN_U16("graphics/items/icon_palettes/pp_up.gbapal"); -const u32 gItemIcon_PPMax[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.lz"); +const u32 gItemIcon_PPMax[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.smol"); const u16 gItemIconPalette_PPMax[] = INCBIN_U16("graphics/items/icon_palettes/pp_max.gbapal"); // EV Feathers -const u32 gItemIcon_HealthFeather[] = INCBIN_U32("graphics/items/icons/health_feather.4bpp.lz"); +const u32 gItemIcon_HealthFeather[] = INCBIN_U32("graphics/items/icons/health_feather.4bpp.smol"); const u16 gItemIconPalette_HealthFeather[] = INCBIN_U16("graphics/items/icon_palettes/health_feather.gbapal"); -const u32 gItemIcon_MuscleFeather[] = INCBIN_U32("graphics/items/icons/muscle_feather.4bpp.lz"); +const u32 gItemIcon_MuscleFeather[] = INCBIN_U32("graphics/items/icons/muscle_feather.4bpp.smol"); const u16 gItemIconPalette_MuscleFeather[] = INCBIN_U16("graphics/items/icon_palettes/muscle_feather.gbapal"); -const u32 gItemIcon_ResistFeather[] = INCBIN_U32("graphics/items/icons/resist_feather.4bpp.lz"); +const u32 gItemIcon_ResistFeather[] = INCBIN_U32("graphics/items/icons/resist_feather.4bpp.smol"); const u16 gItemIconPalette_ResistFeather[] = INCBIN_U16("graphics/items/icon_palettes/resist_feather.gbapal"); -const u32 gItemIcon_GeniusFeather[] = INCBIN_U32("graphics/items/icons/genius_feather.4bpp.lz"); +const u32 gItemIcon_GeniusFeather[] = INCBIN_U32("graphics/items/icons/genius_feather.4bpp.smol"); const u16 gItemIconPalette_GeniusFeather[] = INCBIN_U16("graphics/items/icon_palettes/genius_feather.gbapal"); -const u32 gItemIcon_CleverFeather[] = INCBIN_U32("graphics/items/icons/clever_feather.4bpp.lz"); +const u32 gItemIcon_CleverFeather[] = INCBIN_U32("graphics/items/icons/clever_feather.4bpp.smol"); const u16 gItemIconPalette_CleverFeather[] = INCBIN_U16("graphics/items/icon_palettes/clever_feather.gbapal"); -const u32 gItemIcon_SwiftFeather[] = INCBIN_U32("graphics/items/icons/swift_feather.4bpp.lz"); +const u32 gItemIcon_SwiftFeather[] = INCBIN_U32("graphics/items/icons/swift_feather.4bpp.smol"); const u16 gItemIconPalette_SwiftFeather[] = INCBIN_U16("graphics/items/icon_palettes/swift_feather.gbapal"); // Ability Modifiers -const u32 gItemIcon_AbilityCapsule[] = INCBIN_U32("graphics/items/icons/ability_capsule.4bpp.lz"); +const u32 gItemIcon_AbilityCapsule[] = INCBIN_U32("graphics/items/icons/ability_capsule.4bpp.smol"); const u16 gItemIconPalette_AbilityCapsule[] = INCBIN_U16("graphics/items/icon_palettes/ability_capsule.gbapal"); -const u32 gItemIcon_AbilityPatch[] = INCBIN_U32("graphics/items/icons/ability_patch.4bpp.lz"); +const u32 gItemIcon_AbilityPatch[] = INCBIN_U32("graphics/items/icons/ability_patch.4bpp.smol"); const u16 gItemIconPalette_AbilityPatch[] = INCBIN_U16("graphics/items/icon_palettes/ability_patch.gbapal"); // Mints -const u32 gItemIcon_Mint[] = INCBIN_U32("graphics/items/icons/mint.4bpp.lz"); +const u32 gItemIcon_Mint[] = INCBIN_U32("graphics/items/icons/mint.4bpp.smol"); const u16 gItemIconPalette_RedMint[] = INCBIN_U16("graphics/items/icon_palettes/red_mint.gbapal"); const u16 gItemIconPalette_BlueMint[] = INCBIN_U16("graphics/items/icon_palettes/blue_mint.gbapal"); const u16 gItemIconPalette_LightBlueMint[] = INCBIN_U16("graphics/items/icon_palettes/light_blue_mint.gbapal"); @@ -254,22 +254,22 @@ const u16 gItemIconPalette_YellowMint[] = INCBIN_U16("graphics/items/icon_palett // Candy -const u32 gItemIcon_RareCandy[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.lz"); +const u32 gItemIcon_RareCandy[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.smol"); const u16 gItemIconPalette_RareCandy[] = INCBIN_U16("graphics/items/icon_palettes/rare_candy.gbapal"); -const u32 gItemIcon_ExpCandyXS[] = INCBIN_U32("graphics/items/icons/exp_candy_xs.4bpp.lz"); -const u32 gItemIcon_ExpCandyS[] = INCBIN_U32("graphics/items/icons/exp_candy_s.4bpp.lz"); -const u32 gItemIcon_ExpCandyM[] = INCBIN_U32("graphics/items/icons/exp_candy_m.4bpp.lz"); -const u32 gItemIcon_ExpCandyL[] = INCBIN_U32("graphics/items/icons/exp_candy_l.4bpp.lz"); -const u32 gItemIcon_ExpCandyXL[] = INCBIN_U32("graphics/items/icons/exp_candy_xl.4bpp.lz"); +const u32 gItemIcon_ExpCandyXS[] = INCBIN_U32("graphics/items/icons/exp_candy_xs.4bpp.smol"); +const u32 gItemIcon_ExpCandyS[] = INCBIN_U32("graphics/items/icons/exp_candy_s.4bpp.smol"); +const u32 gItemIcon_ExpCandyM[] = INCBIN_U32("graphics/items/icons/exp_candy_m.4bpp.smol"); +const u32 gItemIcon_ExpCandyL[] = INCBIN_U32("graphics/items/icons/exp_candy_l.4bpp.smol"); +const u32 gItemIcon_ExpCandyXL[] = INCBIN_U32("graphics/items/icons/exp_candy_xl.4bpp.smol"); const u16 gItemIconPalette_ExpCandies[] = INCBIN_U16("graphics/items/icon_palettes/exp_candies.gbapal"); -const u32 gItemIcon_DynamaxCandy[] = INCBIN_U32("graphics/items/icons/dynamax_candy.4bpp.lz"); +const u32 gItemIcon_DynamaxCandy[] = INCBIN_U32("graphics/items/icons/dynamax_candy.4bpp.smol"); const u16 gItemIconPalette_DynamaxCandy[] = INCBIN_U16("graphics/items/icon_palettes/dynamax_candy.gbapal"); // Medicinal Flutes -const u32 gItemIcon_Flute[] = INCBIN_U32("graphics/items/icons/flute.4bpp.lz"); +const u32 gItemIcon_Flute[] = INCBIN_U32("graphics/items/icons/flute.4bpp.smol"); const u16 gItemIconPalette_BlueFlute[] = INCBIN_U16("graphics/items/icon_palettes/blue_flute.gbapal"); const u16 gItemIconPalette_YellowFlute[] = INCBIN_U16("graphics/items/icon_palettes/yellow_flute.gbapal"); @@ -284,31 +284,31 @@ const u16 gItemIconPalette_WhiteFlute[] = INCBIN_U16("graphics/items/icon_palett // Encounter Modifiers -const u32 gItemIcon_Repel[] = INCBIN_U32("graphics/items/icons/repel.4bpp.lz"); +const u32 gItemIcon_Repel[] = INCBIN_U32("graphics/items/icons/repel.4bpp.smol"); const u16 gItemIconPalette_Repel[] = INCBIN_U16("graphics/items/icon_palettes/repel.gbapal"); const u16 gItemIconPalette_SuperRepel[] = INCBIN_U16("graphics/items/icon_palettes/super_repel.gbapal"); const u16 gItemIconPalette_MaxRepel[] = INCBIN_U16("graphics/items/icon_palettes/max_repel.gbapal"); -const u32 gItemIcon_Lure[] = INCBIN_U32("graphics/items/icons/lure.4bpp.lz"); +const u32 gItemIcon_Lure[] = INCBIN_U32("graphics/items/icons/lure.4bpp.smol"); const u16 gItemIconPalette_Lure[] = INCBIN_U16("graphics/items/icon_palettes/lure.gbapal"); const u16 gItemIconPalette_SuperLure[] = INCBIN_U16("graphics/items/icon_palettes/super_lure.gbapal"); const u16 gItemIconPalette_MaxLure[] = INCBIN_U16("graphics/items/icon_palettes/max_lure.gbapal"); -const u32 gItemIcon_EscapeRope[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.lz"); +const u32 gItemIcon_EscapeRope[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.smol"); const u16 gItemIconPalette_EscapeRope[] = INCBIN_U16("graphics/items/icon_palettes/escape_rope.gbapal"); // X Items -const u32 gItemIcon_BattleStatItem[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.lz"); +const u32 gItemIcon_BattleStatItem[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.smol"); const u16 gItemIconPalette_XAttack[] = INCBIN_U16("graphics/items/icon_palettes/x_attack.gbapal"); const u16 gItemIconPalette_XDefend[] = INCBIN_U16("graphics/items/icon_palettes/x_defend.gbapal"); const u16 gItemIconPalette_XSpecial[] = INCBIN_U16("graphics/items/icon_palettes/x_special.gbapal"); -const u32 gItemIcon_XSpecialDefense[] = INCBIN_U32("graphics/items/icons/x_special_defense.4bpp.lz"); +const u32 gItemIcon_XSpecialDefense[] = INCBIN_U32("graphics/items/icons/x_special_defense.4bpp.smol"); const u16 gItemIconPalette_XSpecialDefense[] = INCBIN_U16("graphics/items/icon_palettes/x_special_defense.gbapal"); const u16 gItemIconPalette_XSpeed[] = INCBIN_U16("graphics/items/icon_palettes/x_speed.gbapal"); @@ -321,60 +321,60 @@ const u16 gItemIconPalette_GuardSpec[] = INCBIN_U16("graphics/items/icon_palette // Escape Items -const u32 gItemIcon_PokeDoll[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.lz"); +const u32 gItemIcon_PokeDoll[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.smol"); const u16 gItemIconPalette_PokeDoll[] = INCBIN_U16("graphics/items/icon_palettes/poke_doll.gbapal"); -const u32 gItemIcon_FluffyTail[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.lz"); +const u32 gItemIcon_FluffyTail[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.smol"); const u16 gItemIconPalette_FluffyTail[] = INCBIN_U16("graphics/items/icon_palettes/fluffy_tail.gbapal"); -const u32 gItemIcon_PokeToy[] = INCBIN_U32("graphics/items/icons/poke_toy.4bpp.lz"); +const u32 gItemIcon_PokeToy[] = INCBIN_U32("graphics/items/icons/poke_toy.4bpp.smol"); const u16 gItemIconPalette_PokeToy[] = INCBIN_U16("graphics/items/icon_palettes/poke_toy.gbapal"); -const u32 gItemIcon_MaxMushrooms[] = INCBIN_U32("graphics/items/icons/max_mushrooms.4bpp.lz"); +const u32 gItemIcon_MaxMushrooms[] = INCBIN_U32("graphics/items/icons/max_mushrooms.4bpp.smol"); const u16 gItemIconPalette_MaxMushrooms[] = INCBIN_U16("graphics/items/icon_palettes/max_mushrooms.gbapal"); // Treasures -const u32 gItemIcon_BottleCap[] = INCBIN_U32("graphics/items/icons/bottle_cap.4bpp.lz"); +const u32 gItemIcon_BottleCap[] = INCBIN_U32("graphics/items/icons/bottle_cap.4bpp.smol"); const u16 gItemIconPalette_BottleCap[] = INCBIN_U16("graphics/items/icon_palettes/bottle_cap.gbapal"); const u16 gItemIconPalette_GoldBottleCap[] = INCBIN_U16("graphics/items/icon_palettes/gold_bottle_cap.gbapal"); -const u32 gItemIcon_Nugget[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.lz"); +const u32 gItemIcon_Nugget[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.smol"); const u16 gItemIconPalette_Nugget[] = INCBIN_U16("graphics/items/icon_palettes/nugget.gbapal"); -const u32 gItemIcon_BigNugget[] = INCBIN_U32("graphics/items/icons/big_nugget.4bpp.lz"); +const u32 gItemIcon_BigNugget[] = INCBIN_U32("graphics/items/icons/big_nugget.4bpp.smol"); const u16 gItemIconPalette_BigNugget[] = INCBIN_U16("graphics/items/icon_palettes/big_nugget.gbapal"); -const u32 gItemIcon_TinyMushroom[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.lz"); +const u32 gItemIcon_TinyMushroom[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.smol"); const u16 gItemIconPalette_Mushroom[] = INCBIN_U16("graphics/items/icon_palettes/mushroom.gbapal"); -const u32 gItemIcon_BigMushroom[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.lz"); +const u32 gItemIcon_BigMushroom[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.smol"); -const u32 gItemIcon_BalmMushroom[] = INCBIN_U32("graphics/items/icons/balm_mushroom.4bpp.lz"); +const u32 gItemIcon_BalmMushroom[] = INCBIN_U32("graphics/items/icons/balm_mushroom.4bpp.smol"); const u16 gItemIconPalette_BalmMushroom[] = INCBIN_U16("graphics/items/icon_palettes/balm_mushroom.gbapal"); -const u32 gItemIcon_Pearl[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.lz"); +const u32 gItemIcon_Pearl[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.smol"); const u16 gItemIconPalette_Pearl[] = INCBIN_U16("graphics/items/icon_palettes/pearl.gbapal"); -const u32 gItemIcon_BigPearl[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.lz"); +const u32 gItemIcon_BigPearl[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.smol"); -const u32 gItemIcon_PearlString[] = INCBIN_U32("graphics/items/icons/pearl_string.4bpp.lz"); +const u32 gItemIcon_PearlString[] = INCBIN_U32("graphics/items/icons/pearl_string.4bpp.smol"); const u16 gItemIconPalette_PearlString[] = INCBIN_U16("graphics/items/icon_palettes/pearl_string.gbapal"); -const u32 gItemIcon_Stardust[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.lz"); +const u32 gItemIcon_Stardust[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.smol"); const u16 gItemIconPalette_Star[] = INCBIN_U16("graphics/items/icon_palettes/star.gbapal"); -const u32 gItemIcon_StarPiece[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.lz"); +const u32 gItemIcon_StarPiece[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.smol"); -const u32 gItemIcon_CometShard[] = INCBIN_U32("graphics/items/icons/comet_shard.4bpp.lz"); +const u32 gItemIcon_CometShard[] = INCBIN_U32("graphics/items/icons/comet_shard.4bpp.smol"); const u16 gItemIconPalette_CometShard[] = INCBIN_U16("graphics/items/icon_palettes/comet_shard.gbapal"); const u16 gItemIconPalette_ShoalSalt[] = INCBIN_U16("graphics/items/icon_palettes/shoal_salt.gbapal"); -const u32 gItemIcon_ShoalShell[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.lz"); +const u32 gItemIcon_ShoalShell[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.smol"); const u16 gItemIconPalette_Shell[] = INCBIN_U16("graphics/items/icon_palettes/shell.gbapal"); -const u32 gItemIcon_Shard[] = INCBIN_U32("graphics/items/icons/shard.4bpp.lz"); +const u32 gItemIcon_Shard[] = INCBIN_U32("graphics/items/icons/shard.4bpp.smol"); const u16 gItemIconPalette_RedShard[] = INCBIN_U16("graphics/items/icon_palettes/red_shard.gbapal"); const u16 gItemIconPalette_BlueShard[] = INCBIN_U16("graphics/items/icon_palettes/blue_shard.gbapal"); @@ -383,87 +383,87 @@ const u16 gItemIconPalette_YellowShard[] = INCBIN_U16("graphics/items/icon_palet const u16 gItemIconPalette_GreenShard[] = INCBIN_U16("graphics/items/icon_palettes/green_shard.gbapal"); -const u32 gItemIcon_HeartScale[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.lz"); +const u32 gItemIcon_HeartScale[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.smol"); const u16 gItemIconPalette_HeartScale[] = INCBIN_U16("graphics/items/icon_palettes/heart_scale.gbapal"); -const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); +const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.smol"); const u16 gItemIconPalette_Honey[] = INCBIN_U16("graphics/items/icon_palettes/honey.gbapal"); -const u32 gItemIcon_RareBone[] = INCBIN_U32("graphics/items/icons/rare_bone.4bpp.lz"); +const u32 gItemIcon_RareBone[] = INCBIN_U32("graphics/items/icons/rare_bone.4bpp.smol"); const u16 gItemIconPalette_RareBone[] = INCBIN_U16("graphics/items/icon_palettes/rare_bone.gbapal"); -const u32 gItemIcon_OddKeystone[] = INCBIN_U32("graphics/items/icons/odd_keystone.4bpp.lz"); +const u32 gItemIcon_OddKeystone[] = INCBIN_U32("graphics/items/icons/odd_keystone.4bpp.smol"); const u16 gItemIconPalette_OddKeystone[] = INCBIN_U16("graphics/items/icon_palettes/odd_keystone.gbapal"); -const u32 gItemIcon_PrettyFeather[] = INCBIN_U32("graphics/items/icons/pretty_feather.4bpp.lz"); +const u32 gItemIcon_PrettyFeather[] = INCBIN_U32("graphics/items/icons/pretty_feather.4bpp.smol"); const u16 gItemIconPalette_PrettyFeather[] = INCBIN_U16("graphics/items/icon_palettes/pretty_feather.gbapal"); -const u32 gItemIcon_RelicCoin[] = INCBIN_U32("graphics/items/icons/relic_coin.4bpp.lz"); +const u32 gItemIcon_RelicCoin[] = INCBIN_U32("graphics/items/icons/relic_coin.4bpp.smol"); const u16 gItemIconPalette_RelicCopper[] = INCBIN_U16("graphics/items/icon_palettes/relic_copper.gbapal"); const u16 gItemIconPalette_RelicSilver[] = INCBIN_U16("graphics/items/icon_palettes/relic_silver.gbapal"); const u16 gItemIconPalette_RelicGold[] = INCBIN_U16("graphics/items/icon_palettes/relic_gold.gbapal"); -const u32 gItemIcon_RelicVase[] = INCBIN_U32("graphics/items/icons/relic_vase.4bpp.lz"); +const u32 gItemIcon_RelicVase[] = INCBIN_U32("graphics/items/icons/relic_vase.4bpp.smol"); const u16 gItemIconPalette_Relics[] = INCBIN_U16("graphics/items/icon_palettes/relics.gbapal"); -const u32 gItemIcon_RelicBand[] = INCBIN_U32("graphics/items/icons/relic_band.4bpp.lz"); -const u32 gItemIcon_RelicStatue[] = INCBIN_U32("graphics/items/icons/relic_statue.4bpp.lz"); -const u32 gItemIcon_RelicCrown[] = INCBIN_U32("graphics/items/icons/relic_crown.4bpp.lz"); +const u32 gItemIcon_RelicBand[] = INCBIN_U32("graphics/items/icons/relic_band.4bpp.smol"); +const u32 gItemIcon_RelicStatue[] = INCBIN_U32("graphics/items/icons/relic_statue.4bpp.smol"); +const u32 gItemIcon_RelicCrown[] = INCBIN_U32("graphics/items/icons/relic_crown.4bpp.smol"); -const u32 gItemIcon_StrangeSouvenir[] = INCBIN_U32("graphics/items/icons/strange_souvenir.4bpp.lz"); +const u32 gItemIcon_StrangeSouvenir[] = INCBIN_U32("graphics/items/icons/strange_souvenir.4bpp.smol"); const u16 gItemIconPalette_StrangeSouvenir[] = INCBIN_U16("graphics/items/icon_palettes/strange_souvenir.gbapal"); // Fossils -const u32 gItemIcon_HelixFossil[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.lz"); +const u32 gItemIcon_HelixFossil[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.smol"); const u16 gItemIconPalette_KantoFossil[] = INCBIN_U16("graphics/items/icon_palettes/kanto_fossil.gbapal"); -const u32 gItemIcon_DomeFossil[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.lz"); +const u32 gItemIcon_DomeFossil[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.smol"); -const u32 gItemIcon_OldAmber[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.lz"); +const u32 gItemIcon_OldAmber[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.smol"); const u16 gItemIconPalette_OldAmber[] = INCBIN_U16("graphics/items/icon_palettes/old_amber.gbapal"); -const u32 gItemIcon_RootFossil[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.lz"); +const u32 gItemIcon_RootFossil[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.smol"); const u16 gItemIconPalette_HoennFossil[] = INCBIN_U16("graphics/items/icon_palettes/hoenn_fossil.gbapal"); -const u32 gItemIcon_ClawFossil[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.lz"); +const u32 gItemIcon_ClawFossil[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.smol"); -const u32 gItemIcon_ArmorFossil[] = INCBIN_U32("graphics/items/icons/armor_fossil.4bpp.lz"); +const u32 gItemIcon_ArmorFossil[] = INCBIN_U32("graphics/items/icons/armor_fossil.4bpp.smol"); const u16 gItemIconPalette_ArmorFossil[] = INCBIN_U16("graphics/items/icon_palettes/armor_fossil.gbapal"); -const u32 gItemIcon_SkullFossil[] = INCBIN_U32("graphics/items/icons/skull_fossil.4bpp.lz"); +const u32 gItemIcon_SkullFossil[] = INCBIN_U32("graphics/items/icons/skull_fossil.4bpp.smol"); const u16 gItemIconPalette_SkullFossil[] = INCBIN_U16("graphics/items/icon_palettes/skull_fossil.gbapal"); -const u32 gItemIcon_CoverFossil[] = INCBIN_U32("graphics/items/icons/cover_fossil.4bpp.lz"); +const u32 gItemIcon_CoverFossil[] = INCBIN_U32("graphics/items/icons/cover_fossil.4bpp.smol"); const u16 gItemIconPalette_CoverFossil[] = INCBIN_U16("graphics/items/icon_palettes/cover_fossil.gbapal"); -const u32 gItemIcon_PlumeFossil[] = INCBIN_U32("graphics/items/icons/plume_fossil.4bpp.lz"); +const u32 gItemIcon_PlumeFossil[] = INCBIN_U32("graphics/items/icons/plume_fossil.4bpp.smol"); const u16 gItemIconPalette_PlumeFossil[] = INCBIN_U16("graphics/items/icon_palettes/plume_fossil.gbapal"); -const u32 gItemIcon_JawFossil[] = INCBIN_U32("graphics/items/icons/jaw_fossil.4bpp.lz"); +const u32 gItemIcon_JawFossil[] = INCBIN_U32("graphics/items/icons/jaw_fossil.4bpp.smol"); const u16 gItemIconPalette_JawFossil[] = INCBIN_U16("graphics/items/icon_palettes/jaw_fossil.gbapal"); -const u32 gItemIcon_SailFossil[] = INCBIN_U32("graphics/items/icons/sail_fossil.4bpp.lz"); +const u32 gItemIcon_SailFossil[] = INCBIN_U32("graphics/items/icons/sail_fossil.4bpp.smol"); const u16 gItemIconPalette_SailFossil[] = INCBIN_U16("graphics/items/icon_palettes/sail_fossil.gbapal"); -const u32 gItemIcon_FossilizedBird[] = INCBIN_U32("graphics/items/icons/fossilized_bird.4bpp.lz"); +const u32 gItemIcon_FossilizedBird[] = INCBIN_U32("graphics/items/icons/fossilized_bird.4bpp.smol"); const u16 gItemIconPalette_FossilizedBird[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_bird.gbapal"); -const u32 gItemIcon_FossilizedFish[] = INCBIN_U32("graphics/items/icons/fossilized_fish.4bpp.lz"); +const u32 gItemIcon_FossilizedFish[] = INCBIN_U32("graphics/items/icons/fossilized_fish.4bpp.smol"); const u16 gItemIconPalette_FossilizedFish[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_fish.gbapal"); -const u32 gItemIcon_FossilizedDrake[] = INCBIN_U32("graphics/items/icons/fossilized_drake.4bpp.lz"); +const u32 gItemIcon_FossilizedDrake[] = INCBIN_U32("graphics/items/icons/fossilized_drake.4bpp.smol"); const u16 gItemIconPalette_FossilizedDrake[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_drake.gbapal"); -const u32 gItemIcon_FossilizedDino[] = INCBIN_U32("graphics/items/icons/fossilized_dino.4bpp.lz"); +const u32 gItemIcon_FossilizedDino[] = INCBIN_U32("graphics/items/icons/fossilized_dino.4bpp.smol"); const u16 gItemIconPalette_FossilizedDino[] = INCBIN_U16("graphics/items/icon_palettes/fossilized_dino.gbapal"); // Mulch -const u32 gItemIcon_Mulch[] = INCBIN_U32("graphics/items/icons/mulch.4bpp.lz"); +const u32 gItemIcon_Mulch[] = INCBIN_U32("graphics/items/icons/mulch.4bpp.smol"); const u16 gItemIconPalette_GrowthMulch[] = INCBIN_U16("graphics/items/icon_palettes/growth_mulch.gbapal"); const u16 gItemIconPalette_DampMulch[] = INCBIN_U16("graphics/items/icon_palettes/damp_mulch.gbapal"); -const u32 gItemIcon_StableMulch[] = INCBIN_U32("graphics/items/icons/stable_mulch.4bpp.lz"); +const u32 gItemIcon_StableMulch[] = INCBIN_U32("graphics/items/icons/stable_mulch.4bpp.smol"); const u16 gItemIconPalette_StableMulch[] = INCBIN_U16("graphics/items/icon_palettes/stable_mulch.gbapal"); const u16 gItemIconPalette_GooeyMulch[] = INCBIN_U16("graphics/items/icon_palettes/gooey_mulch.gbapal"); @@ -474,723 +474,723 @@ const u16 gItemIconPalette_AmazeMulch[] = INCBIN_U16("graphics/items/icon_palett // Apricorns -const u32 gItemIcon_RedApricorn[] = INCBIN_U32("graphics/items/icons/red_apricorn.4bpp.lz"); +const u32 gItemIcon_RedApricorn[] = INCBIN_U32("graphics/items/icons/red_apricorn.4bpp.smol"); const u16 gItemIconPalette_RedApricorn[] = INCBIN_U16("graphics/items/icon_palettes/red_apricorn.gbapal"); -const u32 gItemIcon_BlueApricorn[] = INCBIN_U32("graphics/items/icons/blue_apricorn.4bpp.lz"); +const u32 gItemIcon_BlueApricorn[] = INCBIN_U32("graphics/items/icons/blue_apricorn.4bpp.smol"); const u16 gItemIconPalette_BlueApricorn[] = INCBIN_U16("graphics/items/icon_palettes/blue_apricorn.gbapal"); -const u32 gItemIcon_YellowApricorn[] = INCBIN_U32("graphics/items/icons/yellow_apricorn.4bpp.lz"); +const u32 gItemIcon_YellowApricorn[] = INCBIN_U32("graphics/items/icons/yellow_apricorn.4bpp.smol"); const u16 gItemIconPalette_YellowApricorn[] = INCBIN_U16("graphics/items/icon_palettes/yellow_apricorn.gbapal"); -const u32 gItemIcon_GreenApricorn[] = INCBIN_U32("graphics/items/icons/green_apricorn.4bpp.lz"); +const u32 gItemIcon_GreenApricorn[] = INCBIN_U32("graphics/items/icons/green_apricorn.4bpp.smol"); const u16 gItemIconPalette_GreenApricorn[] = INCBIN_U16("graphics/items/icon_palettes/green_apricorn.gbapal"); -const u32 gItemIcon_PinkApricorn[] = INCBIN_U32("graphics/items/icons/pink_apricorn.4bpp.lz"); +const u32 gItemIcon_PinkApricorn[] = INCBIN_U32("graphics/items/icons/pink_apricorn.4bpp.smol"); const u16 gItemIconPalette_PinkApricorn[] = INCBIN_U16("graphics/items/icon_palettes/pink_apricorn.gbapal"); -const u32 gItemIcon_WhiteApricorn[] = INCBIN_U32("graphics/items/icons/white_apricorn.4bpp.lz"); +const u32 gItemIcon_WhiteApricorn[] = INCBIN_U32("graphics/items/icons/white_apricorn.4bpp.smol"); const u16 gItemIconPalette_WhiteApricorn[] = INCBIN_U16("graphics/items/icon_palettes/white_apricorn.gbapal"); -const u32 gItemIcon_BlackApricorn[] = INCBIN_U32("graphics/items/icons/black_apricorn.4bpp.lz"); +const u32 gItemIcon_BlackApricorn[] = INCBIN_U32("graphics/items/icons/black_apricorn.4bpp.smol"); const u16 gItemIconPalette_BlackApricorn[] = INCBIN_U16("graphics/items/icon_palettes/black_apricorn.gbapal"); -const u32 gItemIcon_WishingPiece[] = INCBIN_U32("graphics/items/icons/wishing_piece.4bpp.lz"); +const u32 gItemIcon_WishingPiece[] = INCBIN_U32("graphics/items/icons/wishing_piece.4bpp.smol"); const u16 gItemIconPalette_WishingPiece[] = INCBIN_U16("graphics/items/icon_palettes/wishing_piece.gbapal"); -const u32 gItemIcon_GalaricaTwig[] = INCBIN_U32("graphics/items/icons/galarica_twig.4bpp.lz"); +const u32 gItemIcon_GalaricaTwig[] = INCBIN_U32("graphics/items/icons/galarica_twig.4bpp.smol"); const u16 gItemIconPalette_GalaricaItem[] = INCBIN_U16("graphics/items/icon_palettes/galarica_item.gbapal"); -const u32 gItemIcon_ArmoriteOre[] = INCBIN_U32("graphics/items/icons/armorite_ore.4bpp.lz"); +const u32 gItemIcon_ArmoriteOre[] = INCBIN_U32("graphics/items/icons/armorite_ore.4bpp.smol"); const u16 gItemIconPalette_ArmoriteOre[] = INCBIN_U16("graphics/items/icon_palettes/armorite_ore.gbapal"); -const u32 gItemIcon_DyniteOre[] = INCBIN_U32("graphics/items/icons/dynite_ore.4bpp.lz"); +const u32 gItemIcon_DyniteOre[] = INCBIN_U32("graphics/items/icons/dynite_ore.4bpp.smol"); const u16 gItemIconPalette_DyniteOre[] = INCBIN_U16("graphics/items/icon_palettes/dynite_ore.gbapal"); // Mail -const u32 gItemIcon_OrangeMail[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.lz"); +const u32 gItemIcon_OrangeMail[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.smol"); const u16 gItemIconPalette_OrangeMail[] = INCBIN_U16("graphics/items/icon_palettes/orange_mail.gbapal"); -const u32 gItemIcon_HarborMail[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.lz"); +const u32 gItemIcon_HarborMail[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.smol"); const u16 gItemIconPalette_HarborMail[] = INCBIN_U16("graphics/items/icon_palettes/harbor_mail.gbapal"); -const u32 gItemIcon_GlitterMail[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.lz"); +const u32 gItemIcon_GlitterMail[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.smol"); const u16 gItemIconPalette_GlitterMail[] = INCBIN_U16("graphics/items/icon_palettes/glitter_mail.gbapal"); -const u32 gItemIcon_MechMail[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.lz"); +const u32 gItemIcon_MechMail[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.smol"); const u16 gItemIconPalette_MechMail[] = INCBIN_U16("graphics/items/icon_palettes/mech_mail.gbapal"); -const u32 gItemIcon_WoodMail[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.lz"); +const u32 gItemIcon_WoodMail[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.smol"); const u16 gItemIconPalette_WoodMail[] = INCBIN_U16("graphics/items/icon_palettes/wood_mail.gbapal"); -const u32 gItemIcon_WaveMail[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.lz"); +const u32 gItemIcon_WaveMail[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.smol"); const u16 gItemIconPalette_WaveMail[] = INCBIN_U16("graphics/items/icon_palettes/wave_mail.gbapal"); -const u32 gItemIcon_BeadMail[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.lz"); +const u32 gItemIcon_BeadMail[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.smol"); const u16 gItemIconPalette_BeadMail[] = INCBIN_U16("graphics/items/icon_palettes/bead_mail.gbapal"); -const u32 gItemIcon_ShadowMail[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.lz"); +const u32 gItemIcon_ShadowMail[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.smol"); const u16 gItemIconPalette_ShadowMail[] = INCBIN_U16("graphics/items/icon_palettes/shadow_mail.gbapal"); -const u32 gItemIcon_TropicMail[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.lz"); +const u32 gItemIcon_TropicMail[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.smol"); const u16 gItemIconPalette_TropicMail[] = INCBIN_U16("graphics/items/icon_palettes/tropic_mail.gbapal"); -const u32 gItemIcon_DreamMail[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.lz"); +const u32 gItemIcon_DreamMail[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.smol"); const u16 gItemIconPalette_DreamMail[] = INCBIN_U16("graphics/items/icon_palettes/dream_mail.gbapal"); -const u32 gItemIcon_FabMail[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.lz"); +const u32 gItemIcon_FabMail[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.smol"); const u16 gItemIconPalette_FabMail[] = INCBIN_U16("graphics/items/icon_palettes/fab_mail.gbapal"); -const u32 gItemIcon_RetroMail[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.lz"); +const u32 gItemIcon_RetroMail[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.smol"); const u16 gItemIconPalette_RetroMail[] = INCBIN_U16("graphics/items/icon_palettes/retro_mail.gbapal"); // Evolution Items -const u32 gItemIcon_FireStone[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.lz"); +const u32 gItemIcon_FireStone[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.smol"); const u16 gItemIconPalette_FireStone[] = INCBIN_U16("graphics/items/icon_palettes/fire_stone.gbapal"); -const u32 gItemIcon_WaterStone[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.lz"); +const u32 gItemIcon_WaterStone[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.smol"); const u16 gItemIconPalette_WaterStone[] = INCBIN_U16("graphics/items/icon_palettes/water_stone.gbapal"); -const u32 gItemIcon_ThunderStone[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.lz"); +const u32 gItemIcon_ThunderStone[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.smol"); const u16 gItemIconPalette_ThunderStone[] = INCBIN_U16("graphics/items/icon_palettes/thunder_stone.gbapal"); -const u32 gItemIcon_LeafStone[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.lz"); +const u32 gItemIcon_LeafStone[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.smol"); const u16 gItemIconPalette_LeafStone[] = INCBIN_U16("graphics/items/icon_palettes/leaf_stone.gbapal"); -const u32 gItemIcon_IceStone[] = INCBIN_U32("graphics/items/icons/ice_stone.4bpp.lz"); +const u32 gItemIcon_IceStone[] = INCBIN_U32("graphics/items/icons/ice_stone.4bpp.smol"); const u16 gItemIconPalette_IceStone[] = INCBIN_U16("graphics/items/icon_palettes/ice_stone.gbapal"); -const u32 gItemIcon_SunStone[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.lz"); +const u32 gItemIcon_SunStone[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.smol"); const u16 gItemIconPalette_SunStone[] = INCBIN_U16("graphics/items/icon_palettes/sun_stone.gbapal"); -const u32 gItemIcon_MoonStone[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.lz"); +const u32 gItemIcon_MoonStone[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.smol"); const u16 gItemIconPalette_MoonStone[] = INCBIN_U16("graphics/items/icon_palettes/moon_stone.gbapal"); -const u32 gItemIcon_ShinyStone[] = INCBIN_U32("graphics/items/icons/shiny_stone.4bpp.lz"); +const u32 gItemIcon_ShinyStone[] = INCBIN_U32("graphics/items/icons/shiny_stone.4bpp.smol"); const u16 gItemIconPalette_ShinyStone[] = INCBIN_U16("graphics/items/icon_palettes/shiny_stone.gbapal"); -const u32 gItemIcon_DuskStone[] = INCBIN_U32("graphics/items/icons/dusk_stone.4bpp.lz"); +const u32 gItemIcon_DuskStone[] = INCBIN_U32("graphics/items/icons/dusk_stone.4bpp.smol"); const u16 gItemIconPalette_DuskStone[] = INCBIN_U16("graphics/items/icon_palettes/dusk_stone.gbapal"); -const u32 gItemIcon_DawnStone[] = INCBIN_U32("graphics/items/icons/dawn_stone.4bpp.lz"); +const u32 gItemIcon_DawnStone[] = INCBIN_U32("graphics/items/icons/dawn_stone.4bpp.smol"); const u16 gItemIconPalette_DawnStone[] = INCBIN_U16("graphics/items/icon_palettes/dawn_stone.gbapal"); -const u32 gItemIcon_SweetApple[] = INCBIN_U32("graphics/items/icons/sweet_apple.4bpp.lz"); +const u32 gItemIcon_SweetApple[] = INCBIN_U32("graphics/items/icons/sweet_apple.4bpp.smol"); const u16 gItemIconPalette_SweetApple[] = INCBIN_U16("graphics/items/icon_palettes/sweet_apple.gbapal"); -const u32 gItemIcon_TartApple[] = INCBIN_U32("graphics/items/icons/tart_apple.4bpp.lz"); +const u32 gItemIcon_TartApple[] = INCBIN_U32("graphics/items/icons/tart_apple.4bpp.smol"); const u16 gItemIconPalette_TartApple[] = INCBIN_U16("graphics/items/icon_palettes/tart_apple.gbapal"); -const u32 gItemIcon_CrackedPot[] = INCBIN_U32("graphics/items/icons/cracked_pot.4bpp.lz"); -const u32 gItemIcon_ChippedPot[] = INCBIN_U32("graphics/items/icons/chipped_pot.4bpp.lz"); +const u32 gItemIcon_CrackedPot[] = INCBIN_U32("graphics/items/icons/cracked_pot.4bpp.smol"); +const u32 gItemIcon_ChippedPot[] = INCBIN_U32("graphics/items/icons/chipped_pot.4bpp.smol"); const u16 gItemIconPalette_Pot[] = INCBIN_U16("graphics/items/icon_palettes/pot.gbapal"); -const u32 gItemIcon_GalaricaCuff[] = INCBIN_U32("graphics/items/icons/galarica_cuff.4bpp.lz"); +const u32 gItemIcon_GalaricaCuff[] = INCBIN_U32("graphics/items/icons/galarica_cuff.4bpp.smol"); -const u32 gItemIcon_GalaricaWreath[] = INCBIN_U32("graphics/items/icons/galarica_wreath.4bpp.lz"); +const u32 gItemIcon_GalaricaWreath[] = INCBIN_U32("graphics/items/icons/galarica_wreath.4bpp.smol"); -const u32 gItemIcon_DragonScale[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.lz"); +const u32 gItemIcon_DragonScale[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.smol"); const u16 gItemIconPalette_DragonScale[] = INCBIN_U16("graphics/items/icon_palettes/dragon_scale.gbapal"); -const u32 gItemIcon_Upgrade[] = INCBIN_U32("graphics/items/icons/upgrade.4bpp.lz"); +const u32 gItemIcon_Upgrade[] = INCBIN_U32("graphics/items/icons/upgrade.4bpp.smol"); const u16 gItemIconPalette_Upgrade[] = INCBIN_U16("graphics/items/icon_palettes/upgrade.gbapal"); -const u32 gItemIcon_Protector[] = INCBIN_U32("graphics/items/icons/protector.4bpp.lz"); +const u32 gItemIcon_Protector[] = INCBIN_U32("graphics/items/icons/protector.4bpp.smol"); const u16 gItemIconPalette_Protector[] = INCBIN_U16("graphics/items/icon_palettes/protector.gbapal"); -const u32 gItemIcon_Electirizer[] = INCBIN_U32("graphics/items/icons/electirizer.4bpp.lz"); +const u32 gItemIcon_Electirizer[] = INCBIN_U32("graphics/items/icons/electirizer.4bpp.smol"); const u16 gItemIconPalette_Electirizer[] = INCBIN_U16("graphics/items/icon_palettes/electirizer.gbapal"); -const u32 gItemIcon_Magmarizer[] = INCBIN_U32("graphics/items/icons/magmarizer.4bpp.lz"); +const u32 gItemIcon_Magmarizer[] = INCBIN_U32("graphics/items/icons/magmarizer.4bpp.smol"); const u16 gItemIconPalette_Magmarizer[] = INCBIN_U16("graphics/items/icon_palettes/magmarizer.gbapal"); -const u32 gItemIcon_DubiousDisc[] = INCBIN_U32("graphics/items/icons/dubious_disc.4bpp.lz"); +const u32 gItemIcon_DubiousDisc[] = INCBIN_U32("graphics/items/icons/dubious_disc.4bpp.smol"); const u16 gItemIconPalette_DubiousDisc[] = INCBIN_U16("graphics/items/icon_palettes/dubious_disc.gbapal"); -const u32 gItemIcon_ReaperCloth[] = INCBIN_U32("graphics/items/icons/reaper_cloth.4bpp.lz"); +const u32 gItemIcon_ReaperCloth[] = INCBIN_U32("graphics/items/icons/reaper_cloth.4bpp.smol"); const u16 gItemIconPalette_ReaperCloth[] = INCBIN_U16("graphics/items/icon_palettes/reaper_cloth.gbapal"); -const u32 gItemIcon_PrismScale[] = INCBIN_U32("graphics/items/icons/prism_scale.4bpp.lz"); +const u32 gItemIcon_PrismScale[] = INCBIN_U32("graphics/items/icons/prism_scale.4bpp.smol"); const u16 gItemIconPalette_PrismScale[] = INCBIN_U16("graphics/items/icon_palettes/prism_scale.gbapal"); -const u32 gItemIcon_WhippedDream[] = INCBIN_U32("graphics/items/icons/whipped_dream.4bpp.lz"); +const u32 gItemIcon_WhippedDream[] = INCBIN_U32("graphics/items/icons/whipped_dream.4bpp.smol"); const u16 gItemIconPalette_WhippedDream[] = INCBIN_U16("graphics/items/icon_palettes/whipped_dream.gbapal"); -const u32 gItemIcon_Sachet[] = INCBIN_U32("graphics/items/icons/sachet.4bpp.lz"); +const u32 gItemIcon_Sachet[] = INCBIN_U32("graphics/items/icons/sachet.4bpp.smol"); const u16 gItemIconPalette_Sachet[] = INCBIN_U16("graphics/items/icon_palettes/sachet.gbapal"); -const u32 gItemIcon_OvalStone[] = INCBIN_U32("graphics/items/icons/oval_stone.4bpp.lz"); +const u32 gItemIcon_OvalStone[] = INCBIN_U32("graphics/items/icons/oval_stone.4bpp.smol"); const u16 gItemIconPalette_OvalStone[] = INCBIN_U16("graphics/items/icon_palettes/oval_stone.gbapal"); -const u32 gItemIcon_StrawberrySweet[] = INCBIN_U32("graphics/items/icons/strawberry_sweet.4bpp.lz"); +const u32 gItemIcon_StrawberrySweet[] = INCBIN_U32("graphics/items/icons/strawberry_sweet.4bpp.smol"); const u16 gItemIconPalette_StrawberrySweet[] = INCBIN_U16("graphics/items/icon_palettes/strawberry_sweet.gbapal"); -const u32 gItemIcon_LoveSweet[] = INCBIN_U32("graphics/items/icons/love_sweet.4bpp.lz"); +const u32 gItemIcon_LoveSweet[] = INCBIN_U32("graphics/items/icons/love_sweet.4bpp.smol"); const u16 gItemIconPalette_LoveSweet[] = INCBIN_U16("graphics/items/icon_palettes/love_sweet.gbapal"); -const u32 gItemIcon_BerrySweet[] = INCBIN_U32("graphics/items/icons/berry_sweet.4bpp.lz"); +const u32 gItemIcon_BerrySweet[] = INCBIN_U32("graphics/items/icons/berry_sweet.4bpp.smol"); const u16 gItemIconPalette_BerrySweet[] = INCBIN_U16("graphics/items/icon_palettes/berry_sweet.gbapal"); -const u32 gItemIcon_CloverSweet[] = INCBIN_U32("graphics/items/icons/clover_sweet.4bpp.lz"); +const u32 gItemIcon_CloverSweet[] = INCBIN_U32("graphics/items/icons/clover_sweet.4bpp.smol"); const u16 gItemIconPalette_CloverSweet[] = INCBIN_U16("graphics/items/icon_palettes/clover_sweet.gbapal"); -const u32 gItemIcon_FlowerSweet[] = INCBIN_U32("graphics/items/icons/flower_sweet.4bpp.lz"); +const u32 gItemIcon_FlowerSweet[] = INCBIN_U32("graphics/items/icons/flower_sweet.4bpp.smol"); const u16 gItemIconPalette_FlowerSweet[] = INCBIN_U16("graphics/items/icon_palettes/flower_sweet.gbapal"); -const u32 gItemIcon_StarSweet[] = INCBIN_U32("graphics/items/icons/star_sweet.4bpp.lz"); +const u32 gItemIcon_StarSweet[] = INCBIN_U32("graphics/items/icons/star_sweet.4bpp.smol"); const u16 gItemIconPalette_StarSweet[] = INCBIN_U16("graphics/items/icon_palettes/star_sweet.gbapal"); -const u32 gItemIcon_RibbonSweet[] = INCBIN_U32("graphics/items/icons/ribbon_sweet.4bpp.lz"); +const u32 gItemIcon_RibbonSweet[] = INCBIN_U32("graphics/items/icons/ribbon_sweet.4bpp.smol"); const u16 gItemIconPalette_RibbonSweet[] = INCBIN_U16("graphics/items/icon_palettes/ribbon_sweet.gbapal"); -const u32 gItemIcon_Everstone[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.lz"); +const u32 gItemIcon_Everstone[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.smol"); const u16 gItemIconPalette_Everstone[] = INCBIN_U16("graphics/items/icon_palettes/everstone.gbapal"); -const u32 gItemIcon_BlackAugurite[] = INCBIN_U32("graphics/items/icons/black_augurite.4bpp.lz"); +const u32 gItemIcon_BlackAugurite[] = INCBIN_U32("graphics/items/icons/black_augurite.4bpp.smol"); const u16 gItemIconPalette_BlackAugurite[] = INCBIN_U16("graphics/items/icon_palettes/black_augurite.gbapal"); -const u32 gItemIcon_LinkingCord[] = INCBIN_U32("graphics/items/icons/linking_cord.4bpp.lz"); +const u32 gItemIcon_LinkingCord[] = INCBIN_U32("graphics/items/icons/linking_cord.4bpp.smol"); const u16 gItemIconPalette_LinkingCord[] = INCBIN_U16("graphics/items/icon_palettes/linking_cord.gbapal"); -const u32 gItemIcon_PeatBlock[] = INCBIN_U32("graphics/items/icons/peat_block.4bpp.lz"); +const u32 gItemIcon_PeatBlock[] = INCBIN_U32("graphics/items/icons/peat_block.4bpp.smol"); const u16 gItemIconPalette_PeatBlock[] = INCBIN_U16("graphics/items/icon_palettes/peat_block.gbapal"); -const u32 gItemIcon_SyrupyApple[] = INCBIN_U32("graphics/items/icons/syrupy_apple.4bpp.lz"); +const u32 gItemIcon_SyrupyApple[] = INCBIN_U32("graphics/items/icons/syrupy_apple.4bpp.smol"); const u16 gItemIconPalette_SyrupyApple[] = INCBIN_U16("graphics/items/icon_palettes/syrupy_apple.gbapal"); -const u32 gItemIcon_UnremarkableTeacup[] = INCBIN_U32("graphics/items/icons/unremarkable_teacup.4bpp.lz"); +const u32 gItemIcon_UnremarkableTeacup[] = INCBIN_U32("graphics/items/icons/unremarkable_teacup.4bpp.smol"); const u16 gItemIconPalette_UnremarkableTeacup[] = INCBIN_U16("graphics/items/icon_palettes/unremarkable_teacup.gbapal"); -const u32 gItemIcon_MasterpieceTeacup[] = INCBIN_U32("graphics/items/icons/masterpiece_teacup.4bpp.lz"); +const u32 gItemIcon_MasterpieceTeacup[] = INCBIN_U32("graphics/items/icons/masterpiece_teacup.4bpp.smol"); const u16 gItemIconPalette_MasterpieceTeacup[] = INCBIN_U16("graphics/items/icon_palettes/masterpiece_teacup.gbapal"); -const u32 gItemIcon_MetalAlloy[] = INCBIN_U32("graphics/items/icons/metal_alloy.4bpp.lz"); +const u32 gItemIcon_MetalAlloy[] = INCBIN_U32("graphics/items/icons/metal_alloy.4bpp.smol"); const u16 gItemIconPalette_MetalAlloy[] = INCBIN_U16("graphics/items/icon_palettes/metal_alloy.gbapal"); // Nectars -const u32 gItemIcon_RedNectar[] = INCBIN_U32("graphics/items/icons/red_nectar.4bpp.lz"); +const u32 gItemIcon_RedNectar[] = INCBIN_U32("graphics/items/icons/red_nectar.4bpp.smol"); const u16 gItemIconPalette_RedNectar[] = INCBIN_U16("graphics/items/icon_palettes/red_nectar.gbapal"); -const u32 gItemIcon_YellowNectar[] = INCBIN_U32("graphics/items/icons/yellow_nectar.4bpp.lz"); +const u32 gItemIcon_YellowNectar[] = INCBIN_U32("graphics/items/icons/yellow_nectar.4bpp.smol"); const u16 gItemIconPalette_YellowNectar[] = INCBIN_U16("graphics/items/icon_palettes/yellow_nectar.gbapal"); -const u32 gItemIcon_PinkNectar[] = INCBIN_U32("graphics/items/icons/pink_nectar.4bpp.lz"); +const u32 gItemIcon_PinkNectar[] = INCBIN_U32("graphics/items/icons/pink_nectar.4bpp.smol"); const u16 gItemIconPalette_PinkNectar[] = INCBIN_U16("graphics/items/icon_palettes/pink_nectar.gbapal"); -const u32 gItemIcon_PurpleNectar[] = INCBIN_U32("graphics/items/icons/purple_nectar.4bpp.lz"); +const u32 gItemIcon_PurpleNectar[] = INCBIN_U32("graphics/items/icons/purple_nectar.4bpp.smol"); const u16 gItemIconPalette_PurpleNectar[] = INCBIN_U16("graphics/items/icon_palettes/purple_nectar.gbapal"); // Plates -const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.lz"); +const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.smol"); const u16 gItemIconPalette_FlamePlate[] = INCBIN_U16("graphics/items/icon_palettes/flame_plate.gbapal"); -const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.lz"); +const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.smol"); const u16 gItemIconPalette_SplashPlate[] = INCBIN_U16("graphics/items/icon_palettes/splash_plate.gbapal"); -const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.lz"); +const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.smol"); const u16 gItemIconPalette_ZapPlate[] = INCBIN_U16("graphics/items/icon_palettes/zap_plate.gbapal"); -const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.lz"); +const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.smol"); const u16 gItemIconPalette_MeadowPlate[] = INCBIN_U16("graphics/items/icon_palettes/meadow_plate.gbapal"); -const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.lz"); +const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.smol"); const u16 gItemIconPalette_IciclePlate[] = INCBIN_U16("graphics/items/icon_palettes/icicle_plate.gbapal"); -const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.lz"); +const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.smol"); const u16 gItemIconPalette_FistPlate[] = INCBIN_U16("graphics/items/icon_palettes/fist_plate.gbapal"); -const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.lz"); +const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.smol"); const u16 gItemIconPalette_ToxicPlate[] = INCBIN_U16("graphics/items/icon_palettes/toxic_plate.gbapal"); -const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.lz"); +const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.smol"); const u16 gItemIconPalette_EarthPlate[] = INCBIN_U16("graphics/items/icon_palettes/earth_plate.gbapal"); -const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.lz"); +const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.smol"); const u16 gItemIconPalette_SkyPlate[] = INCBIN_U16("graphics/items/icon_palettes/sky_plate.gbapal"); -const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.lz"); +const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.smol"); const u16 gItemIconPalette_MindPlate[] = INCBIN_U16("graphics/items/icon_palettes/mind_plate.gbapal"); -const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.lz"); +const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.smol"); const u16 gItemIconPalette_InsectPlate[] = INCBIN_U16("graphics/items/icon_palettes/insect_plate.gbapal"); -const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.lz"); +const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.smol"); const u16 gItemIconPalette_StonePlate[] = INCBIN_U16("graphics/items/icon_palettes/stone_plate.gbapal"); -const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.lz"); +const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.smol"); const u16 gItemIconPalette_SpookyPlate[] = INCBIN_U16("graphics/items/icon_palettes/spooky_plate.gbapal"); -const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.lz"); +const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.smol"); const u16 gItemIconPalette_DracoPlate[] = INCBIN_U16("graphics/items/icon_palettes/draco_plate.gbapal"); -const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.lz"); +const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.smol"); const u16 gItemIconPalette_DreadPlate[] = INCBIN_U16("graphics/items/icon_palettes/dread_plate.gbapal"); -const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); +const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.smol"); const u16 gItemIconPalette_IronPlate[] = INCBIN_U16("graphics/items/icon_palettes/iron_plate.gbapal"); -const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.lz"); +const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.smol"); const u16 gItemIconPalette_PixiePlate[] = INCBIN_U16("graphics/items/icon_palettes/pixie_plate.gbapal"); // Drives -const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.lz"); +const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.smol"); const u16 gItemIconPalette_DouseDrive[] = INCBIN_U16("graphics/items/icon_palettes/douse_drive.gbapal"); -const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.lz"); +const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.smol"); const u16 gItemIconPalette_ShockDrive[] = INCBIN_U16("graphics/items/icon_palettes/shock_drive.gbapal"); -const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.lz"); +const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.smol"); const u16 gItemIconPalette_BurnDrive[] = INCBIN_U16("graphics/items/icon_palettes/burn_drive.gbapal"); -const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.lz"); +const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.smol"); const u16 gItemIconPalette_ChillDrive[] = INCBIN_U16("graphics/items/icon_palettes/chill_drive.gbapal"); // Memories -const u32 gItemIcon_FireMemory[] = INCBIN_U32("graphics/items/icons/fire_memory.4bpp.lz"); +const u32 gItemIcon_FireMemory[] = INCBIN_U32("graphics/items/icons/fire_memory.4bpp.smol"); const u16 gItemIconPalette_FireMemory[] = INCBIN_U16("graphics/items/icon_palettes/fire_memory.gbapal"); -const u32 gItemIcon_WaterMemory[] = INCBIN_U32("graphics/items/icons/water_memory.4bpp.lz"); +const u32 gItemIcon_WaterMemory[] = INCBIN_U32("graphics/items/icons/water_memory.4bpp.smol"); const u16 gItemIconPalette_WaterMemory[] = INCBIN_U16("graphics/items/icon_palettes/water_memory.gbapal"); -const u32 gItemIcon_ElectricMemory[] = INCBIN_U32("graphics/items/icons/electric_memory.4bpp.lz"); +const u32 gItemIcon_ElectricMemory[] = INCBIN_U32("graphics/items/icons/electric_memory.4bpp.smol"); const u16 gItemIconPalette_ElectricMemory[] = INCBIN_U16("graphics/items/icon_palettes/electric_memory.gbapal"); -const u32 gItemIcon_GrassMemory[] = INCBIN_U32("graphics/items/icons/grass_memory.4bpp.lz"); +const u32 gItemIcon_GrassMemory[] = INCBIN_U32("graphics/items/icons/grass_memory.4bpp.smol"); const u16 gItemIconPalette_GrassMemory[] = INCBIN_U16("graphics/items/icon_palettes/grass_memory.gbapal"); -const u32 gItemIcon_IceMemory[] = INCBIN_U32("graphics/items/icons/ice_memory.4bpp.lz"); +const u32 gItemIcon_IceMemory[] = INCBIN_U32("graphics/items/icons/ice_memory.4bpp.smol"); const u16 gItemIconPalette_IceMemory[] = INCBIN_U16("graphics/items/icon_palettes/ice_memory.gbapal"); -const u32 gItemIcon_FightingMemory[] = INCBIN_U32("graphics/items/icons/fighting_memory.4bpp.lz"); +const u32 gItemIcon_FightingMemory[] = INCBIN_U32("graphics/items/icons/fighting_memory.4bpp.smol"); const u16 gItemIconPalette_FightingMemory[] = INCBIN_U16("graphics/items/icon_palettes/fighting_memory.gbapal"); -const u32 gItemIcon_PoisonMemory[] = INCBIN_U32("graphics/items/icons/poison_memory.4bpp.lz"); +const u32 gItemIcon_PoisonMemory[] = INCBIN_U32("graphics/items/icons/poison_memory.4bpp.smol"); const u16 gItemIconPalette_PoisonMemory[] = INCBIN_U16("graphics/items/icon_palettes/poison_memory.gbapal"); -const u32 gItemIcon_GroundMemory[] = INCBIN_U32("graphics/items/icons/ground_memory.4bpp.lz"); +const u32 gItemIcon_GroundMemory[] = INCBIN_U32("graphics/items/icons/ground_memory.4bpp.smol"); const u16 gItemIconPalette_GroundMemory[] = INCBIN_U16("graphics/items/icon_palettes/ground_memory.gbapal"); -const u32 gItemIcon_FlyingMemory[] = INCBIN_U32("graphics/items/icons/flying_memory.4bpp.lz"); +const u32 gItemIcon_FlyingMemory[] = INCBIN_U32("graphics/items/icons/flying_memory.4bpp.smol"); const u16 gItemIconPalette_FlyingMemory[] = INCBIN_U16("graphics/items/icon_palettes/flying_memory.gbapal"); -const u32 gItemIcon_PsychicMemory[] = INCBIN_U32("graphics/items/icons/psychic_memory.4bpp.lz"); +const u32 gItemIcon_PsychicMemory[] = INCBIN_U32("graphics/items/icons/psychic_memory.4bpp.smol"); const u16 gItemIconPalette_PsychicMemory[] = INCBIN_U16("graphics/items/icon_palettes/psychic_memory.gbapal"); -const u32 gItemIcon_BugMemory[] = INCBIN_U32("graphics/items/icons/bug_memory.4bpp.lz"); +const u32 gItemIcon_BugMemory[] = INCBIN_U32("graphics/items/icons/bug_memory.4bpp.smol"); const u16 gItemIconPalette_BugMemory[] = INCBIN_U16("graphics/items/icon_palettes/bug_memory.gbapal"); -const u32 gItemIcon_RockMemory[] = INCBIN_U32("graphics/items/icons/rock_memory.4bpp.lz"); +const u32 gItemIcon_RockMemory[] = INCBIN_U32("graphics/items/icons/rock_memory.4bpp.smol"); const u16 gItemIconPalette_RockMemory[] = INCBIN_U16("graphics/items/icon_palettes/rock_memory.gbapal"); -const u32 gItemIcon_GhostMemory[] = INCBIN_U32("graphics/items/icons/ghost_memory.4bpp.lz"); +const u32 gItemIcon_GhostMemory[] = INCBIN_U32("graphics/items/icons/ghost_memory.4bpp.smol"); const u16 gItemIconPalette_GhostMemory[] = INCBIN_U16("graphics/items/icon_palettes/ghost_memory.gbapal"); -const u32 gItemIcon_DragonMemory[] = INCBIN_U32("graphics/items/icons/dragon_memory.4bpp.lz"); +const u32 gItemIcon_DragonMemory[] = INCBIN_U32("graphics/items/icons/dragon_memory.4bpp.smol"); const u16 gItemIconPalette_DragonMemory[] = INCBIN_U16("graphics/items/icon_palettes/dragon_memory.gbapal"); -const u32 gItemIcon_DarkMemory[] = INCBIN_U32("graphics/items/icons/dark_memory.4bpp.lz"); +const u32 gItemIcon_DarkMemory[] = INCBIN_U32("graphics/items/icons/dark_memory.4bpp.smol"); const u16 gItemIconPalette_DarkMemory[] = INCBIN_U16("graphics/items/icon_palettes/dark_memory.gbapal"); -const u32 gItemIcon_SteelMemory[] = INCBIN_U32("graphics/items/icons/steel_memory.4bpp.lz"); +const u32 gItemIcon_SteelMemory[] = INCBIN_U32("graphics/items/icons/steel_memory.4bpp.smol"); const u16 gItemIconPalette_SteelMemory[] = INCBIN_U16("graphics/items/icon_palettes/steel_memory.gbapal"); -const u32 gItemIcon_FairyMemory[] = INCBIN_U32("graphics/items/icons/fairy_memory.4bpp.lz"); +const u32 gItemIcon_FairyMemory[] = INCBIN_U32("graphics/items/icons/fairy_memory.4bpp.smol"); const u16 gItemIconPalette_FairyMemory[] = INCBIN_U16("graphics/items/icon_palettes/fairy_memory.gbapal"); -const u32 gItemIcon_RustedSword[] = INCBIN_U32("graphics/items/icons/rusted_sword.4bpp.lz"); -const u32 gItemIcon_RustedShield[] = INCBIN_U32("graphics/items/icons/rusted_shield.4bpp.lz"); +const u32 gItemIcon_RustedSword[] = INCBIN_U32("graphics/items/icons/rusted_sword.4bpp.smol"); +const u32 gItemIcon_RustedShield[] = INCBIN_U32("graphics/items/icons/rusted_shield.4bpp.smol"); const u16 gItemIconPalette_RustedWeapons[] = INCBIN_U16("graphics/items/icon_palettes/rusted_weapons.gbapal"); // Colored Orbs -const u32 gItemIcon_RedOrb[] = INCBIN_U32("graphics/items/icons/red_orb.4bpp.lz"); +const u32 gItemIcon_RedOrb[] = INCBIN_U32("graphics/items/icons/red_orb.4bpp.smol"); const u16 gItemIconPalette_RedOrb[] = INCBIN_U16("graphics/items/icon_palettes/red_orb.gbapal"); -const u32 gItemIcon_BlueOrb[] = INCBIN_U32("graphics/items/icons/blue_orb.4bpp.lz"); +const u32 gItemIcon_BlueOrb[] = INCBIN_U32("graphics/items/icons/blue_orb.4bpp.smol"); const u16 gItemIconPalette_BlueOrb[] = INCBIN_U16("graphics/items/icon_palettes/blue_orb.gbapal"); // Mega Stones -const u32 gItemIcon_Venusaurite[] = INCBIN_U32("graphics/items/icons/venusaurite.4bpp.lz"); +const u32 gItemIcon_Venusaurite[] = INCBIN_U32("graphics/items/icons/venusaurite.4bpp.smol"); const u16 gItemIconPalette_Venusaurite[] = INCBIN_U16("graphics/items/icon_palettes/venusaurite.gbapal"); -const u32 gItemIcon_CharizarditeX[] = INCBIN_U32("graphics/items/icons/charizardite_x.4bpp.lz"); +const u32 gItemIcon_CharizarditeX[] = INCBIN_U32("graphics/items/icons/charizardite_x.4bpp.smol"); const u16 gItemIconPalette_CharizarditeX[] = INCBIN_U16("graphics/items/icon_palettes/charizardite_x.gbapal"); -const u32 gItemIcon_CharizarditeY[] = INCBIN_U32("graphics/items/icons/charizardite_y.4bpp.lz"); +const u32 gItemIcon_CharizarditeY[] = INCBIN_U32("graphics/items/icons/charizardite_y.4bpp.smol"); const u16 gItemIconPalette_CharizarditeY[] = INCBIN_U16("graphics/items/icon_palettes/charizardite_y.gbapal"); -const u32 gItemIcon_Blastoisinite[] = INCBIN_U32("graphics/items/icons/blastoisinite.4bpp.lz"); +const u32 gItemIcon_Blastoisinite[] = INCBIN_U32("graphics/items/icons/blastoisinite.4bpp.smol"); const u16 gItemIconPalette_Blastoisinite[] = INCBIN_U16("graphics/items/icon_palettes/blastoisinite.gbapal"); -const u32 gItemIcon_Beedrillite[] = INCBIN_U32("graphics/items/icons/beedrillite.4bpp.lz"); +const u32 gItemIcon_Beedrillite[] = INCBIN_U32("graphics/items/icons/beedrillite.4bpp.smol"); const u16 gItemIconPalette_Beedrillite[] = INCBIN_U16("graphics/items/icon_palettes/beedrillite.gbapal"); -const u32 gItemIcon_Pidgeotite[] = INCBIN_U32("graphics/items/icons/pidgeotite.4bpp.lz"); +const u32 gItemIcon_Pidgeotite[] = INCBIN_U32("graphics/items/icons/pidgeotite.4bpp.smol"); const u16 gItemIconPalette_Pidgeotite[] = INCBIN_U16("graphics/items/icon_palettes/pidgeotite.gbapal"); -const u32 gItemIcon_Alakazite[] = INCBIN_U32("graphics/items/icons/alakazite.4bpp.lz"); +const u32 gItemIcon_Alakazite[] = INCBIN_U32("graphics/items/icons/alakazite.4bpp.smol"); const u16 gItemIconPalette_Alakazite[] = INCBIN_U16("graphics/items/icon_palettes/alakazite.gbapal"); -const u32 gItemIcon_Slowbronite[] = INCBIN_U32("graphics/items/icons/slowbronite.4bpp.lz"); +const u32 gItemIcon_Slowbronite[] = INCBIN_U32("graphics/items/icons/slowbronite.4bpp.smol"); const u16 gItemIconPalette_Slowbronite[] = INCBIN_U16("graphics/items/icon_palettes/slowbronite.gbapal"); -const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.lz"); +const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.smol"); const u16 gItemIconPalette_Gengarite[] = INCBIN_U16("graphics/items/icon_palettes/gengarite.gbapal"); -const u32 gItemIcon_Kangaskhanite[] = INCBIN_U32("graphics/items/icons/kangaskhanite.4bpp.lz"); +const u32 gItemIcon_Kangaskhanite[] = INCBIN_U32("graphics/items/icons/kangaskhanite.4bpp.smol"); const u16 gItemIconPalette_Kangaskhanite[] = INCBIN_U16("graphics/items/icon_palettes/kangaskhanite.gbapal"); -const u32 gItemIcon_Pinsirite[] = INCBIN_U32("graphics/items/icons/pinsirite.4bpp.lz"); +const u32 gItemIcon_Pinsirite[] = INCBIN_U32("graphics/items/icons/pinsirite.4bpp.smol"); const u16 gItemIconPalette_Pinsirite[] = INCBIN_U16("graphics/items/icon_palettes/pinsirite.gbapal"); -const u32 gItemIcon_Gyaradosite[] = INCBIN_U32("graphics/items/icons/gyaradosite.4bpp.lz"); +const u32 gItemIcon_Gyaradosite[] = INCBIN_U32("graphics/items/icons/gyaradosite.4bpp.smol"); const u16 gItemIconPalette_Gyaradosite[] = INCBIN_U16("graphics/items/icon_palettes/gyaradosite.gbapal"); -const u32 gItemIcon_Aerodactylite[] = INCBIN_U32("graphics/items/icons/aerodactylite.4bpp.lz"); +const u32 gItemIcon_Aerodactylite[] = INCBIN_U32("graphics/items/icons/aerodactylite.4bpp.smol"); const u16 gItemIconPalette_Aerodactylite[] = INCBIN_U16("graphics/items/icon_palettes/aerodactylite.gbapal"); -const u32 gItemIcon_MewtwoniteX[] = INCBIN_U32("graphics/items/icons/mewtwonite_x.4bpp.lz"); +const u32 gItemIcon_MewtwoniteX[] = INCBIN_U32("graphics/items/icons/mewtwonite_x.4bpp.smol"); const u16 gItemIconPalette_MewtwoniteX[] = INCBIN_U16("graphics/items/icon_palettes/mewtwonite_x.gbapal"); -const u32 gItemIcon_MewtwoniteY[] = INCBIN_U32("graphics/items/icons/mewtwonite_y.4bpp.lz"); +const u32 gItemIcon_MewtwoniteY[] = INCBIN_U32("graphics/items/icons/mewtwonite_y.4bpp.smol"); const u16 gItemIconPalette_MewtwoniteY[] = INCBIN_U16("graphics/items/icon_palettes/mewtwonite_y.gbapal"); -const u32 gItemIcon_Ampharosite[] = INCBIN_U32("graphics/items/icons/ampharosite.4bpp.lz"); +const u32 gItemIcon_Ampharosite[] = INCBIN_U32("graphics/items/icons/ampharosite.4bpp.smol"); const u16 gItemIconPalette_Ampharosite[] = INCBIN_U16("graphics/items/icon_palettes/ampharosite.gbapal"); -const u32 gItemIcon_Steelixite[] = INCBIN_U32("graphics/items/icons/steelixite.4bpp.lz"); +const u32 gItemIcon_Steelixite[] = INCBIN_U32("graphics/items/icons/steelixite.4bpp.smol"); const u16 gItemIconPalette_Steelixite[] = INCBIN_U16("graphics/items/icon_palettes/steelixite.gbapal"); -const u32 gItemIcon_Scizorite[] = INCBIN_U32("graphics/items/icons/scizorite.4bpp.lz"); +const u32 gItemIcon_Scizorite[] = INCBIN_U32("graphics/items/icons/scizorite.4bpp.smol"); const u16 gItemIconPalette_Scizorite[] = INCBIN_U16("graphics/items/icon_palettes/scizorite.gbapal"); -const u32 gItemIcon_Heracronite[] = INCBIN_U32("graphics/items/icons/heracronite.4bpp.lz"); +const u32 gItemIcon_Heracronite[] = INCBIN_U32("graphics/items/icons/heracronite.4bpp.smol"); const u16 gItemIconPalette_Heracronite[] = INCBIN_U16("graphics/items/icon_palettes/heracronite.gbapal"); -const u32 gItemIcon_Houndoominite[] = INCBIN_U32("graphics/items/icons/houndoominite.4bpp.lz"); +const u32 gItemIcon_Houndoominite[] = INCBIN_U32("graphics/items/icons/houndoominite.4bpp.smol"); const u16 gItemIconPalette_Houndoominite[] = INCBIN_U16("graphics/items/icon_palettes/houndoominite.gbapal"); -const u32 gItemIcon_Tyranitarite[] = INCBIN_U32("graphics/items/icons/tyranitarite.4bpp.lz"); +const u32 gItemIcon_Tyranitarite[] = INCBIN_U32("graphics/items/icons/tyranitarite.4bpp.smol"); const u16 gItemIconPalette_Tyranitarite[] = INCBIN_U16("graphics/items/icon_palettes/tyranitarite.gbapal"); -const u32 gItemIcon_Sceptilite[] = INCBIN_U32("graphics/items/icons/sceptilite.4bpp.lz"); +const u32 gItemIcon_Sceptilite[] = INCBIN_U32("graphics/items/icons/sceptilite.4bpp.smol"); const u16 gItemIconPalette_Sceptilite[] = INCBIN_U16("graphics/items/icon_palettes/sceptilite.gbapal"); -const u32 gItemIcon_Blazikenite[] = INCBIN_U32("graphics/items/icons/blazikenite.4bpp.lz"); +const u32 gItemIcon_Blazikenite[] = INCBIN_U32("graphics/items/icons/blazikenite.4bpp.smol"); const u16 gItemIconPalette_Blazikenite[] = INCBIN_U16("graphics/items/icon_palettes/blazikenite.gbapal"); -const u32 gItemIcon_Swampertite[] = INCBIN_U32("graphics/items/icons/swampertite.4bpp.lz"); +const u32 gItemIcon_Swampertite[] = INCBIN_U32("graphics/items/icons/swampertite.4bpp.smol"); const u16 gItemIconPalette_Swampertite[] = INCBIN_U16("graphics/items/icon_palettes/swampertite.gbapal"); -const u32 gItemIcon_Gardevoirite[] = INCBIN_U32("graphics/items/icons/gardevoirite.4bpp.lz"); +const u32 gItemIcon_Gardevoirite[] = INCBIN_U32("graphics/items/icons/gardevoirite.4bpp.smol"); const u16 gItemIconPalette_Gardevoirite[] = INCBIN_U16("graphics/items/icon_palettes/gardevoirite.gbapal"); -const u32 gItemIcon_Sablenite[] = INCBIN_U32("graphics/items/icons/sablenite.4bpp.lz"); +const u32 gItemIcon_Sablenite[] = INCBIN_U32("graphics/items/icons/sablenite.4bpp.smol"); const u16 gItemIconPalette_Sablenite[] = INCBIN_U16("graphics/items/icon_palettes/sablenite.gbapal"); -const u32 gItemIcon_Mawilite[] = INCBIN_U32("graphics/items/icons/mawilite.4bpp.lz"); +const u32 gItemIcon_Mawilite[] = INCBIN_U32("graphics/items/icons/mawilite.4bpp.smol"); const u16 gItemIconPalette_Mawilite[] = INCBIN_U16("graphics/items/icon_palettes/mawilite.gbapal"); -const u32 gItemIcon_Aggronite[] = INCBIN_U32("graphics/items/icons/aggronite.4bpp.lz"); +const u32 gItemIcon_Aggronite[] = INCBIN_U32("graphics/items/icons/aggronite.4bpp.smol"); const u16 gItemIconPalette_Aggronite[] = INCBIN_U16("graphics/items/icon_palettes/aggronite.gbapal"); -const u32 gItemIcon_Medichamite[] = INCBIN_U32("graphics/items/icons/medichamite.4bpp.lz"); +const u32 gItemIcon_Medichamite[] = INCBIN_U32("graphics/items/icons/medichamite.4bpp.smol"); const u16 gItemIconPalette_Medichamite[] = INCBIN_U16("graphics/items/icon_palettes/medichamite.gbapal"); -const u32 gItemIcon_Manectite[] = INCBIN_U32("graphics/items/icons/manectite.4bpp.lz"); +const u32 gItemIcon_Manectite[] = INCBIN_U32("graphics/items/icons/manectite.4bpp.smol"); const u16 gItemIconPalette_Manectite[] = INCBIN_U16("graphics/items/icon_palettes/manectite.gbapal"); -const u32 gItemIcon_Sharpedonite[] = INCBIN_U32("graphics/items/icons/sharpedonite.4bpp.lz"); +const u32 gItemIcon_Sharpedonite[] = INCBIN_U32("graphics/items/icons/sharpedonite.4bpp.smol"); const u16 gItemIconPalette_Sharpedonite[] = INCBIN_U16("graphics/items/icon_palettes/sharpedonite.gbapal"); -const u32 gItemIcon_Cameruptite[] = INCBIN_U32("graphics/items/icons/cameruptite.4bpp.lz"); +const u32 gItemIcon_Cameruptite[] = INCBIN_U32("graphics/items/icons/cameruptite.4bpp.smol"); const u16 gItemIconPalette_Cameruptite[] = INCBIN_U16("graphics/items/icon_palettes/cameruptite.gbapal"); -const u32 gItemIcon_Altarianite[] = INCBIN_U32("graphics/items/icons/altarianite.4bpp.lz"); +const u32 gItemIcon_Altarianite[] = INCBIN_U32("graphics/items/icons/altarianite.4bpp.smol"); const u16 gItemIconPalette_Altarianite[] = INCBIN_U16("graphics/items/icon_palettes/altarianite.gbapal"); -const u32 gItemIcon_Banettite[] = INCBIN_U32("graphics/items/icons/banettite.4bpp.lz"); +const u32 gItemIcon_Banettite[] = INCBIN_U32("graphics/items/icons/banettite.4bpp.smol"); const u16 gItemIconPalette_Banettite[] = INCBIN_U16("graphics/items/icon_palettes/banettite.gbapal"); -const u32 gItemIcon_Absolite[] = INCBIN_U32("graphics/items/icons/absolite.4bpp.lz"); +const u32 gItemIcon_Absolite[] = INCBIN_U32("graphics/items/icons/absolite.4bpp.smol"); const u16 gItemIconPalette_Absolite[] = INCBIN_U16("graphics/items/icon_palettes/absolite.gbapal"); -const u32 gItemIcon_Glalitite[] = INCBIN_U32("graphics/items/icons/glalitite.4bpp.lz"); +const u32 gItemIcon_Glalitite[] = INCBIN_U32("graphics/items/icons/glalitite.4bpp.smol"); const u16 gItemIconPalette_Glalitite[] = INCBIN_U16("graphics/items/icon_palettes/glalitite.gbapal"); -const u32 gItemIcon_Salamencite[] = INCBIN_U32("graphics/items/icons/salamencite.4bpp.lz"); +const u32 gItemIcon_Salamencite[] = INCBIN_U32("graphics/items/icons/salamencite.4bpp.smol"); const u16 gItemIconPalette_Salamencite[] = INCBIN_U16("graphics/items/icon_palettes/salamencite.gbapal"); -const u32 gItemIcon_Metagrossite[] = INCBIN_U32("graphics/items/icons/metagrossite.4bpp.lz"); +const u32 gItemIcon_Metagrossite[] = INCBIN_U32("graphics/items/icons/metagrossite.4bpp.smol"); const u16 gItemIconPalette_Metagrossite[] = INCBIN_U16("graphics/items/icon_palettes/metagrossite.gbapal"); -const u32 gItemIcon_Latiasite[] = INCBIN_U32("graphics/items/icons/latiasite.4bpp.lz"); +const u32 gItemIcon_Latiasite[] = INCBIN_U32("graphics/items/icons/latiasite.4bpp.smol"); const u16 gItemIconPalette_Latiasite[] = INCBIN_U16("graphics/items/icon_palettes/latiasite.gbapal"); -const u32 gItemIcon_Latiosite[] = INCBIN_U32("graphics/items/icons/latiosite.4bpp.lz"); +const u32 gItemIcon_Latiosite[] = INCBIN_U32("graphics/items/icons/latiosite.4bpp.smol"); const u16 gItemIconPalette_Latiosite[] = INCBIN_U16("graphics/items/icon_palettes/latiosite.gbapal"); -const u32 gItemIcon_Lopunnite[] = INCBIN_U32("graphics/items/icons/lopunnite.4bpp.lz"); +const u32 gItemIcon_Lopunnite[] = INCBIN_U32("graphics/items/icons/lopunnite.4bpp.smol"); const u16 gItemIconPalette_Lopunnite[] = INCBIN_U16("graphics/items/icon_palettes/lopunnite.gbapal"); -const u32 gItemIcon_Garchompite[] = INCBIN_U32("graphics/items/icons/garchompite.4bpp.lz"); +const u32 gItemIcon_Garchompite[] = INCBIN_U32("graphics/items/icons/garchompite.4bpp.smol"); const u16 gItemIconPalette_Garchompite[] = INCBIN_U16("graphics/items/icon_palettes/garchompite.gbapal"); -const u32 gItemIcon_Lucarionite[] = INCBIN_U32("graphics/items/icons/lucarionite.4bpp.lz"); +const u32 gItemIcon_Lucarionite[] = INCBIN_U32("graphics/items/icons/lucarionite.4bpp.smol"); const u16 gItemIconPalette_Lucarionite[] = INCBIN_U16("graphics/items/icon_palettes/lucarionite.gbapal"); -const u32 gItemIcon_Abomasite[] = INCBIN_U32("graphics/items/icons/abomasite.4bpp.lz"); +const u32 gItemIcon_Abomasite[] = INCBIN_U32("graphics/items/icons/abomasite.4bpp.smol"); const u16 gItemIconPalette_Abomasite[] = INCBIN_U16("graphics/items/icon_palettes/abomasite.gbapal"); -const u32 gItemIcon_Galladite[] = INCBIN_U32("graphics/items/icons/galladite.4bpp.lz"); +const u32 gItemIcon_Galladite[] = INCBIN_U32("graphics/items/icons/galladite.4bpp.smol"); const u16 gItemIconPalette_Galladite[] = INCBIN_U16("graphics/items/icon_palettes/galladite.gbapal"); -const u32 gItemIcon_Audinite[] = INCBIN_U32("graphics/items/icons/audinite.4bpp.lz"); +const u32 gItemIcon_Audinite[] = INCBIN_U32("graphics/items/icons/audinite.4bpp.smol"); const u16 gItemIconPalette_Audinite[] = INCBIN_U16("graphics/items/icon_palettes/audinite.gbapal"); -const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp.lz"); +const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp.smol"); const u16 gItemIconPalette_Diancite[] = INCBIN_U16("graphics/items/icon_palettes/diancite.gbapal"); // Gems -const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.lz"); +const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.smol"); const u16 gItemIconPalette_NormalGem[] = INCBIN_U16("graphics/items/icon_palettes/normal_gem.gbapal"); -const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.lz"); +const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.smol"); const u16 gItemIconPalette_FireGem[] = INCBIN_U16("graphics/items/icon_palettes/fire_gem.gbapal"); -const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.lz"); +const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.smol"); const u16 gItemIconPalette_WaterGem[] = INCBIN_U16("graphics/items/icon_palettes/water_gem.gbapal"); -const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.lz"); +const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.smol"); const u16 gItemIconPalette_ElectricGem[] = INCBIN_U16("graphics/items/icon_palettes/electric_gem.gbapal"); -const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.lz"); +const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.smol"); const u16 gItemIconPalette_GrassGem[] = INCBIN_U16("graphics/items/icon_palettes/grass_gem.gbapal"); -const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.lz"); +const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.smol"); const u16 gItemIconPalette_IceGem[] = INCBIN_U16("graphics/items/icon_palettes/ice_gem.gbapal"); -const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.lz"); +const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.smol"); const u16 gItemIconPalette_FightingGem[] = INCBIN_U16("graphics/items/icon_palettes/fighting_gem.gbapal"); -const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.lz"); +const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.smol"); const u16 gItemIconPalette_PoisonGem[] = INCBIN_U16("graphics/items/icon_palettes/poison_gem.gbapal"); -const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.lz"); +const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.smol"); const u16 gItemIconPalette_GroundGem[] = INCBIN_U16("graphics/items/icon_palettes/ground_gem.gbapal"); -const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.lz"); +const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.smol"); const u16 gItemIconPalette_FlyingGem[] = INCBIN_U16("graphics/items/icon_palettes/flying_gem.gbapal"); -const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.lz"); +const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.smol"); const u16 gItemIconPalette_PsychicGem[] = INCBIN_U16("graphics/items/icon_palettes/psychic_gem.gbapal"); -const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.lz"); +const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.smol"); const u16 gItemIconPalette_BugGem[] = INCBIN_U16("graphics/items/icon_palettes/bug_gem.gbapal"); -const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.lz"); +const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.smol"); const u16 gItemIconPalette_RockGem[] = INCBIN_U16("graphics/items/icon_palettes/rock_gem.gbapal"); -const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.lz"); +const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.smol"); const u16 gItemIconPalette_GhostGem[] = INCBIN_U16("graphics/items/icon_palettes/ghost_gem.gbapal"); -const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.lz"); +const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.smol"); const u16 gItemIconPalette_DragonGem[] = INCBIN_U16("graphics/items/icon_palettes/dragon_gem.gbapal"); -const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.lz"); +const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.smol"); const u16 gItemIconPalette_DarkGem[] = INCBIN_U16("graphics/items/icon_palettes/dark_gem.gbapal"); -const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.lz"); +const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.smol"); const u16 gItemIconPalette_SteelGem[] = INCBIN_U16("graphics/items/icon_palettes/steel_gem.gbapal"); -const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.lz"); +const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.smol"); const u16 gItemIconPalette_FairyGem[] = INCBIN_U16("graphics/items/icon_palettes/fairy_gem.gbapal"); // Z-Crystals -const u32 gItemIcon_NormaliumZ[] = INCBIN_U32("graphics/items/icons/normalium_z.4bpp.lz"); +const u32 gItemIcon_NormaliumZ[] = INCBIN_U32("graphics/items/icons/normalium_z.4bpp.smol"); const u16 gItemIconPalette_NormaliumZ[] = INCBIN_U16("graphics/items/icon_palettes/normalium_z.gbapal"); -const u32 gItemIcon_FiriumZ[] = INCBIN_U32("graphics/items/icons/firium_z.4bpp.lz"); +const u32 gItemIcon_FiriumZ[] = INCBIN_U32("graphics/items/icons/firium_z.4bpp.smol"); const u16 gItemIconPalette_FiriumZ[] = INCBIN_U16("graphics/items/icon_palettes/firium_z.gbapal"); -const u32 gItemIcon_WateriumZ[] = INCBIN_U32("graphics/items/icons/waterium_z.4bpp.lz"); +const u32 gItemIcon_WateriumZ[] = INCBIN_U32("graphics/items/icons/waterium_z.4bpp.smol"); const u16 gItemIconPalette_WateriumZ[] = INCBIN_U16("graphics/items/icon_palettes/waterium_z.gbapal"); -const u32 gItemIcon_ElectriumZ[] = INCBIN_U32("graphics/items/icons/electrium_z.4bpp.lz"); +const u32 gItemIcon_ElectriumZ[] = INCBIN_U32("graphics/items/icons/electrium_z.4bpp.smol"); const u16 gItemIconPalette_ElectriumZ[] = INCBIN_U16("graphics/items/icon_palettes/electrium_z.gbapal"); -const u32 gItemIcon_GrassiumZ[] = INCBIN_U32("graphics/items/icons/grassium_z.4bpp.lz"); +const u32 gItemIcon_GrassiumZ[] = INCBIN_U32("graphics/items/icons/grassium_z.4bpp.smol"); const u16 gItemIconPalette_GrassiumZ[] = INCBIN_U16("graphics/items/icon_palettes/grassium_z.gbapal"); -const u32 gItemIcon_IciumZ[] = INCBIN_U32("graphics/items/icons/icium_z.4bpp.lz"); +const u32 gItemIcon_IciumZ[] = INCBIN_U32("graphics/items/icons/icium_z.4bpp.smol"); const u16 gItemIconPalette_IciumZ[] = INCBIN_U16("graphics/items/icon_palettes/icium_z.gbapal"); -const u32 gItemIcon_FightiniumZ[] = INCBIN_U32("graphics/items/icons/fightinium_z.4bpp.lz"); +const u32 gItemIcon_FightiniumZ[] = INCBIN_U32("graphics/items/icons/fightinium_z.4bpp.smol"); const u16 gItemIconPalette_FightiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/fightinium_z.gbapal"); -const u32 gItemIcon_PoisoniumZ[] = INCBIN_U32("graphics/items/icons/poisonium_z.4bpp.lz"); +const u32 gItemIcon_PoisoniumZ[] = INCBIN_U32("graphics/items/icons/poisonium_z.4bpp.smol"); const u16 gItemIconPalette_PoisoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/poisonium_z.gbapal"); -const u32 gItemIcon_GroundiumZ[] = INCBIN_U32("graphics/items/icons/groundium_z.4bpp.lz"); +const u32 gItemIcon_GroundiumZ[] = INCBIN_U32("graphics/items/icons/groundium_z.4bpp.smol"); const u16 gItemIconPalette_GroundiumZ[] = INCBIN_U16("graphics/items/icon_palettes/groundium_z.gbapal"); -const u32 gItemIcon_FlyiniumZ[] = INCBIN_U32("graphics/items/icons/flyinium_z.4bpp.lz"); +const u32 gItemIcon_FlyiniumZ[] = INCBIN_U32("graphics/items/icons/flyinium_z.4bpp.smol"); const u16 gItemIconPalette_FlyiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/flyinium_z.gbapal"); -const u32 gItemIcon_PsychiumZ[] = INCBIN_U32("graphics/items/icons/psychium_z.4bpp.lz"); +const u32 gItemIcon_PsychiumZ[] = INCBIN_U32("graphics/items/icons/psychium_z.4bpp.smol"); const u16 gItemIconPalette_PsychiumZ[] = INCBIN_U16("graphics/items/icon_palettes/psychium_z.gbapal"); -const u32 gItemIcon_BuginiumZ[] = INCBIN_U32("graphics/items/icons/buginium_z.4bpp.lz"); +const u32 gItemIcon_BuginiumZ[] = INCBIN_U32("graphics/items/icons/buginium_z.4bpp.smol"); const u16 gItemIconPalette_BuginiumZ[] = INCBIN_U16("graphics/items/icon_palettes/buginium_z.gbapal"); -const u32 gItemIcon_RockiumZ[] = INCBIN_U32("graphics/items/icons/rockium_z.4bpp.lz"); +const u32 gItemIcon_RockiumZ[] = INCBIN_U32("graphics/items/icons/rockium_z.4bpp.smol"); const u16 gItemIconPalette_RockiumZ[] = INCBIN_U16("graphics/items/icon_palettes/rockium_z.gbapal"); -const u32 gItemIcon_GhostiumZ[] = INCBIN_U32("graphics/items/icons/ghostium_z.4bpp.lz"); +const u32 gItemIcon_GhostiumZ[] = INCBIN_U32("graphics/items/icons/ghostium_z.4bpp.smol"); const u16 gItemIconPalette_GhostiumZ[] = INCBIN_U16("graphics/items/icon_palettes/ghostium_z.gbapal"); -const u32 gItemIcon_DragoniumZ[] = INCBIN_U32("graphics/items/icons/dragonium_z.4bpp.lz"); +const u32 gItemIcon_DragoniumZ[] = INCBIN_U32("graphics/items/icons/dragonium_z.4bpp.smol"); const u16 gItemIconPalette_DragoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/dragonium_z.gbapal"); -const u32 gItemIcon_DarkiniumZ[] = INCBIN_U32("graphics/items/icons/darkinium_z.4bpp.lz"); +const u32 gItemIcon_DarkiniumZ[] = INCBIN_U32("graphics/items/icons/darkinium_z.4bpp.smol"); const u16 gItemIconPalette_DarkiniumZ[] = INCBIN_U16("graphics/items/icon_palettes/darkinium_z.gbapal"); -const u32 gItemIcon_SteeliumZ[] = INCBIN_U32("graphics/items/icons/steelium_z.4bpp.lz"); +const u32 gItemIcon_SteeliumZ[] = INCBIN_U32("graphics/items/icons/steelium_z.4bpp.smol"); const u16 gItemIconPalette_SteeliumZ[] = INCBIN_U16("graphics/items/icon_palettes/steelium_z.gbapal"); -const u32 gItemIcon_FairiumZ[] = INCBIN_U32("graphics/items/icons/fairium_z.4bpp.lz"); +const u32 gItemIcon_FairiumZ[] = INCBIN_U32("graphics/items/icons/fairium_z.4bpp.smol"); const u16 gItemIconPalette_FairiumZ[] = INCBIN_U16("graphics/items/icon_palettes/fairium_z.gbapal"); -const u32 gItemIcon_PikaniumZ[] = INCBIN_U32("graphics/items/icons/pikanium_z.4bpp.lz"); +const u32 gItemIcon_PikaniumZ[] = INCBIN_U32("graphics/items/icons/pikanium_z.4bpp.smol"); const u16 gItemIconPalette_PikaniumZ[] = INCBIN_U16("graphics/items/icon_palettes/pikanium_z.gbapal"); -const u32 gItemIcon_EeviumZ[] = INCBIN_U32("graphics/items/icons/eevium_z.4bpp.lz"); +const u32 gItemIcon_EeviumZ[] = INCBIN_U32("graphics/items/icons/eevium_z.4bpp.smol"); const u16 gItemIconPalette_EeviumZ[] = INCBIN_U16("graphics/items/icon_palettes/eevium_z.gbapal"); -const u32 gItemIcon_SnorliumZ[] = INCBIN_U32("graphics/items/icons/snorlium_z.4bpp.lz"); +const u32 gItemIcon_SnorliumZ[] = INCBIN_U32("graphics/items/icons/snorlium_z.4bpp.smol"); const u16 gItemIconPalette_SnorliumZ[] = INCBIN_U16("graphics/items/icon_palettes/snorlium_z.gbapal"); -const u32 gItemIcon_MewniumZ[] = INCBIN_U32("graphics/items/icons/mewnium_z.4bpp.lz"); +const u32 gItemIcon_MewniumZ[] = INCBIN_U32("graphics/items/icons/mewnium_z.4bpp.smol"); const u16 gItemIconPalette_MewniumZ[] = INCBIN_U16("graphics/items/icon_palettes/mewnium_z.gbapal"); -const u32 gItemIcon_DecidiumZ[] = INCBIN_U32("graphics/items/icons/decidium_z.4bpp.lz"); +const u32 gItemIcon_DecidiumZ[] = INCBIN_U32("graphics/items/icons/decidium_z.4bpp.smol"); const u16 gItemIconPalette_DecidiumZ[] = INCBIN_U16("graphics/items/icon_palettes/decidium_z.gbapal"); -const u32 gItemIcon_InciniumZ[] = INCBIN_U32("graphics/items/icons/incinium_z.4bpp.lz"); +const u32 gItemIcon_InciniumZ[] = INCBIN_U32("graphics/items/icons/incinium_z.4bpp.smol"); const u16 gItemIconPalette_InciniumZ[] = INCBIN_U16("graphics/items/icon_palettes/incinium_z.gbapal"); -const u32 gItemIcon_PrimariumZ[] = INCBIN_U32("graphics/items/icons/primarium_z.4bpp.lz"); +const u32 gItemIcon_PrimariumZ[] = INCBIN_U32("graphics/items/icons/primarium_z.4bpp.smol"); const u16 gItemIconPalette_PrimariumZ[] = INCBIN_U16("graphics/items/icon_palettes/primarium_z.gbapal"); -const u32 gItemIcon_LycaniumZ[] = INCBIN_U32("graphics/items/icons/lycanium_z.4bpp.lz"); +const u32 gItemIcon_LycaniumZ[] = INCBIN_U32("graphics/items/icons/lycanium_z.4bpp.smol"); const u16 gItemIconPalette_LycaniumZ[] = INCBIN_U16("graphics/items/icon_palettes/lycanium_z.gbapal"); -const u32 gItemIcon_MimikiumZ[] = INCBIN_U32("graphics/items/icons/mimikium_z.4bpp.lz"); +const u32 gItemIcon_MimikiumZ[] = INCBIN_U32("graphics/items/icons/mimikium_z.4bpp.smol"); const u16 gItemIconPalette_MimikiumZ[] = INCBIN_U16("graphics/items/icon_palettes/mimikium_z.gbapal"); -const u32 gItemIcon_KommoniumZ[] = INCBIN_U32("graphics/items/icons/kommonium_z.4bpp.lz"); +const u32 gItemIcon_KommoniumZ[] = INCBIN_U32("graphics/items/icons/kommonium_z.4bpp.smol"); const u16 gItemIconPalette_KommoniumZ[] = INCBIN_U16("graphics/items/icon_palettes/kommonium_z.gbapal"); -const u32 gItemIcon_TapuniumZ[] = INCBIN_U32("graphics/items/icons/tapunium_z.4bpp.lz"); +const u32 gItemIcon_TapuniumZ[] = INCBIN_U32("graphics/items/icons/tapunium_z.4bpp.smol"); const u16 gItemIconPalette_TapuniumZ[] = INCBIN_U16("graphics/items/icon_palettes/tapunium_z.gbapal"); -const u32 gItemIcon_SolganiumZ[] = INCBIN_U32("graphics/items/icons/solganium_z.4bpp.lz"); +const u32 gItemIcon_SolganiumZ[] = INCBIN_U32("graphics/items/icons/solganium_z.4bpp.smol"); const u16 gItemIconPalette_SolganiumZ[] = INCBIN_U16("graphics/items/icon_palettes/solganium_z.gbapal"); -const u32 gItemIcon_LunaliumZ[] = INCBIN_U32("graphics/items/icons/lunalium_z.4bpp.lz"); +const u32 gItemIcon_LunaliumZ[] = INCBIN_U32("graphics/items/icons/lunalium_z.4bpp.smol"); const u16 gItemIconPalette_LunaliumZ[] = INCBIN_U16("graphics/items/icon_palettes/lunalium_z.gbapal"); -const u32 gItemIcon_MarshadiumZ[] = INCBIN_U32("graphics/items/icons/marshadium_z.4bpp.lz"); +const u32 gItemIcon_MarshadiumZ[] = INCBIN_U32("graphics/items/icons/marshadium_z.4bpp.smol"); const u16 gItemIconPalette_MarshadiumZ[] = INCBIN_U16("graphics/items/icon_palettes/marshadium_z.gbapal"); -const u32 gItemIcon_AloraichiumZ[] = INCBIN_U32("graphics/items/icons/aloraichium_z.4bpp.lz"); +const u32 gItemIcon_AloraichiumZ[] = INCBIN_U32("graphics/items/icons/aloraichium_z.4bpp.smol"); const u16 gItemIconPalette_AloraichiumZ[] = INCBIN_U16("graphics/items/icon_palettes/aloraichium_z.gbapal"); -const u32 gItemIcon_PikashuniumZ[] = INCBIN_U32("graphics/items/icons/pikashunium_z.4bpp.lz"); +const u32 gItemIcon_PikashuniumZ[] = INCBIN_U32("graphics/items/icons/pikashunium_z.4bpp.smol"); const u16 gItemIconPalette_PikashuniumZ[] = INCBIN_U16("graphics/items/icon_palettes/pikashunium_z.gbapal"); -const u32 gItemIcon_UltranecroziumZ[] = INCBIN_U32("graphics/items/icons/ultranecrozium_z.4bpp.lz"); +const u32 gItemIcon_UltranecroziumZ[] = INCBIN_U32("graphics/items/icons/ultranecrozium_z.4bpp.smol"); const u16 gItemIconPalette_UltranecroziumZ[] = INCBIN_U16("graphics/items/icon_palettes/ultranecrozium_z.gbapal"); // Species-specific Held Items -const u32 gItemIcon_LightBall[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.lz"); +const u32 gItemIcon_LightBall[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.smol"); const u16 gItemIconPalette_LightBall[] = INCBIN_U16("graphics/items/icon_palettes/light_ball.gbapal"); -const u32 gItemIcon_Leek[] = INCBIN_U32("graphics/items/icons/leek.4bpp.lz"); +const u32 gItemIcon_Leek[] = INCBIN_U32("graphics/items/icons/leek.4bpp.smol"); const u16 gItemIconPalette_Leek[] = INCBIN_U16("graphics/items/icon_palettes/leek.gbapal"); -const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.lz"); +const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.smol"); const u16 gItemIconPalette_ThickClub[] = INCBIN_U16("graphics/items/icon_palettes/thick_club.gbapal"); -const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.lz"); +const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.smol"); const u16 gItemIconPalette_LuckyPunch[] = INCBIN_U16("graphics/items/icon_palettes/lucky_punch.gbapal"); -const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.lz"); +const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.smol"); const u16 gItemIconPalette_MetalPowder[] = INCBIN_U16("graphics/items/icon_palettes/metal_powder.gbapal"); -const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.lz"); +const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.smol"); const u16 gItemIconPalette_QuickPowder[] = INCBIN_U16("graphics/items/icon_palettes/quick_powder.gbapal"); -const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.lz"); +const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.smol"); const u16 gItemIconPalette_DeepSeaScale[] = INCBIN_U16("graphics/items/icon_palettes/deep_sea_scale.gbapal"); -const u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.lz"); +const u32 gItemIcon_DeepSeaTooth[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.smol"); const u16 gItemIconPalette_DeepSeaTooth[] = INCBIN_U16("graphics/items/icon_palettes/deep_sea_tooth.gbapal"); -const u32 gItemIcon_SoulDew[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.lz"); +const u32 gItemIcon_SoulDew[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.smol"); const u16 gItemIconPalette_SoulDew[] = INCBIN_U16("graphics/items/icon_palettes/soul_dew.gbapal"); -const u32 gItemIcon_AdamantOrb[] = INCBIN_U32("graphics/items/icons/adamant_orb.4bpp.lz"); +const u32 gItemIcon_AdamantOrb[] = INCBIN_U32("graphics/items/icons/adamant_orb.4bpp.smol"); const u16 gItemIconPalette_AdamantOrb[] = INCBIN_U16("graphics/items/icon_palettes/adamant_orb.gbapal"); -const u32 gItemIcon_LustrousOrb[] = INCBIN_U32("graphics/items/icons/lustrous_orb.4bpp.lz"); +const u32 gItemIcon_LustrousOrb[] = INCBIN_U32("graphics/items/icons/lustrous_orb.4bpp.smol"); const u16 gItemIconPalette_LustrousOrb[] = INCBIN_U16("graphics/items/icon_palettes/lustrous_orb.gbapal"); -const u32 gItemIcon_GriseousOrb[] = INCBIN_U32("graphics/items/icons/griseous_orb.4bpp.lz"); +const u32 gItemIcon_GriseousOrb[] = INCBIN_U32("graphics/items/icons/griseous_orb.4bpp.smol"); const u16 gItemIconPalette_GriseousOrb[] = INCBIN_U16("graphics/items/icon_palettes/griseous_orb.gbapal"); // Incenses -const u32 gItemIcon_SeaIncense[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.lz"); +const u32 gItemIcon_SeaIncense[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.smol"); const u16 gItemIconPalette_SeaIncense[] = INCBIN_U16("graphics/items/icon_palettes/sea_incense.gbapal"); -const u32 gItemIcon_LaxIncense[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.lz"); +const u32 gItemIcon_LaxIncense[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.smol"); const u16 gItemIconPalette_LaxIncense[] = INCBIN_U16("graphics/items/icon_palettes/lax_incense.gbapal"); -const u32 gItemIcon_OddIncense[] = INCBIN_U32("graphics/items/icons/odd_incense.4bpp.lz"); +const u32 gItemIcon_OddIncense[] = INCBIN_U32("graphics/items/icons/odd_incense.4bpp.smol"); const u16 gItemIconPalette_OddIncense[] = INCBIN_U16("graphics/items/icon_palettes/odd_incense.gbapal"); -const u32 gItemIcon_RockIncense[] = INCBIN_U32("graphics/items/icons/rock_incense.4bpp.lz"); +const u32 gItemIcon_RockIncense[] = INCBIN_U32("graphics/items/icons/rock_incense.4bpp.smol"); const u16 gItemIconPalette_RockIncense[] = INCBIN_U16("graphics/items/icon_palettes/rock_incense.gbapal"); -const u32 gItemIcon_FullIncense[] = INCBIN_U32("graphics/items/icons/full_incense.4bpp.lz"); +const u32 gItemIcon_FullIncense[] = INCBIN_U32("graphics/items/icons/full_incense.4bpp.smol"); const u16 gItemIconPalette_FullIncense[] = INCBIN_U16("graphics/items/icon_palettes/full_incense.gbapal"); -const u32 gItemIcon_WaveIncense[] = INCBIN_U32("graphics/items/icons/wave_incense.4bpp.lz"); +const u32 gItemIcon_WaveIncense[] = INCBIN_U32("graphics/items/icons/wave_incense.4bpp.smol"); const u16 gItemIconPalette_WaveIncense[] = INCBIN_U16("graphics/items/icon_palettes/wave_incense.gbapal"); -const u32 gItemIcon_RoseIncense[] = INCBIN_U32("graphics/items/icons/rose_incense.4bpp.lz"); +const u32 gItemIcon_RoseIncense[] = INCBIN_U32("graphics/items/icons/rose_incense.4bpp.smol"); const u16 gItemIconPalette_RoseIncense[] = INCBIN_U16("graphics/items/icon_palettes/rose_incense.gbapal"); -const u32 gItemIcon_LuckIncense[] = INCBIN_U32("graphics/items/icons/luck_incense.4bpp.lz"); +const u32 gItemIcon_LuckIncense[] = INCBIN_U32("graphics/items/icons/luck_incense.4bpp.smol"); const u16 gItemIconPalette_LuckIncense[] = INCBIN_U16("graphics/items/icon_palettes/luck_incense.gbapal"); -const u32 gItemIcon_PureIncense[] = INCBIN_U32("graphics/items/icons/pure_incense.4bpp.lz"); +const u32 gItemIcon_PureIncense[] = INCBIN_U32("graphics/items/icons/pure_incense.4bpp.smol"); const u16 gItemIconPalette_PureIncense[] = INCBIN_U16("graphics/items/icon_palettes/pure_incense.gbapal"); // Contest Scarves -const u32 gItemIcon_Scarf[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.lz"); +const u32 gItemIcon_Scarf[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.smol"); const u16 gItemIconPalette_RedScarf[] = INCBIN_U16("graphics/items/icon_palettes/red_scarf.gbapal"); const u16 gItemIconPalette_BlueScarf[] = INCBIN_U16("graphics/items/icon_palettes/blue_scarf.gbapal"); @@ -1203,513 +1203,513 @@ const u16 gItemIconPalette_YellowScarf[] = INCBIN_U16("graphics/items/icon_palet // EV Gain Modifiers -const u32 gItemIcon_MachoBrace[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.lz"); +const u32 gItemIcon_MachoBrace[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.smol"); const u16 gItemIconPalette_MachoBrace[] = INCBIN_U16("graphics/items/icon_palettes/macho_brace.gbapal"); -const u32 gItemIcon_PowerWeight[] = INCBIN_U32("graphics/items/icons/power_weight.4bpp.lz"); +const u32 gItemIcon_PowerWeight[] = INCBIN_U32("graphics/items/icons/power_weight.4bpp.smol"); const u16 gItemIconPalette_PowerWeight[] = INCBIN_U16("graphics/items/icon_palettes/power_weight.gbapal"); -const u32 gItemIcon_PowerBracer[] = INCBIN_U32("graphics/items/icons/power_bracer.4bpp.lz"); +const u32 gItemIcon_PowerBracer[] = INCBIN_U32("graphics/items/icons/power_bracer.4bpp.smol"); const u16 gItemIconPalette_PowerBracer[] = INCBIN_U16("graphics/items/icon_palettes/power_bracer.gbapal"); -const u32 gItemIcon_PowerBelt[] = INCBIN_U32("graphics/items/icons/power_belt.4bpp.lz"); +const u32 gItemIcon_PowerBelt[] = INCBIN_U32("graphics/items/icons/power_belt.4bpp.smol"); const u16 gItemIconPalette_PowerBelt[] = INCBIN_U16("graphics/items/icon_palettes/power_belt.gbapal"); -const u32 gItemIcon_PowerLens[] = INCBIN_U32("graphics/items/icons/power_lens.4bpp.lz"); +const u32 gItemIcon_PowerLens[] = INCBIN_U32("graphics/items/icons/power_lens.4bpp.smol"); const u16 gItemIconPalette_PowerLens[] = INCBIN_U16("graphics/items/icon_palettes/power_lens.gbapal"); -const u32 gItemIcon_PowerBand[] = INCBIN_U32("graphics/items/icons/power_band.4bpp.lz"); +const u32 gItemIcon_PowerBand[] = INCBIN_U32("graphics/items/icons/power_band.4bpp.smol"); const u16 gItemIconPalette_PowerBand[] = INCBIN_U16("graphics/items/icon_palettes/power_band.gbapal"); -const u32 gItemIcon_PowerAnklet[] = INCBIN_U32("graphics/items/icons/power_anklet.4bpp.lz"); +const u32 gItemIcon_PowerAnklet[] = INCBIN_U32("graphics/items/icons/power_anklet.4bpp.smol"); const u16 gItemIconPalette_PowerAnklet[] = INCBIN_U16("graphics/items/icon_palettes/power_anklet.gbapal"); // Type-boosting Held Items -const u32 gItemIcon_SilkScarf[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.lz"); +const u32 gItemIcon_SilkScarf[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.smol"); const u16 gItemIconPalette_SilkScarf[] = INCBIN_U16("graphics/items/icon_palettes/silk_scarf.gbapal"); -const u32 gItemIcon_Charcoal[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.lz"); +const u32 gItemIcon_Charcoal[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.smol"); const u16 gItemIconPalette_Charcoal[] = INCBIN_U16("graphics/items/icon_palettes/charcoal.gbapal"); -const u32 gItemIcon_MysticWater[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.lz"); +const u32 gItemIcon_MysticWater[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.smol"); const u16 gItemIconPalette_MysticWater[] = INCBIN_U16("graphics/items/icon_palettes/mystic_water.gbapal"); -const u32 gItemIcon_Magnet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.lz"); +const u32 gItemIcon_Magnet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.smol"); const u16 gItemIconPalette_Magnet[] = INCBIN_U16("graphics/items/icon_palettes/magnet.gbapal"); -const u32 gItemIcon_MiracleSeed[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.lz"); +const u32 gItemIcon_MiracleSeed[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.smol"); const u16 gItemIconPalette_MiracleSeed[] = INCBIN_U16("graphics/items/icon_palettes/miracle_seed.gbapal"); -const u32 gItemIcon_NeverMeltIce[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.lz"); +const u32 gItemIcon_NeverMeltIce[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.smol"); const u16 gItemIconPalette_NeverMeltIce[] = INCBIN_U16("graphics/items/icon_palettes/never_melt_ice.gbapal"); -const u32 gItemIcon_BlackBelt[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.lz"); +const u32 gItemIcon_BlackBelt[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.smol"); const u16 gItemIconPalette_BlackTypeEnhancingItem[] = INCBIN_U16("graphics/items/icon_palettes/black_type_enhancing_item.gbapal"); -const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.lz"); +const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.smol"); const u16 gItemIconPalette_PoisonBarb[] = INCBIN_U16("graphics/items/icon_palettes/poison_barb.gbapal"); -const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.lz"); +const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.smol"); const u16 gItemIconPalette_SoftSand[] = INCBIN_U16("graphics/items/icon_palettes/soft_sand.gbapal"); -const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.lz"); +const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.smol"); const u16 gItemIconPalette_SharpBeak[] = INCBIN_U16("graphics/items/icon_palettes/sharp_beak.gbapal"); -const u32 gItemIcon_TwistedSpoon[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.lz"); +const u32 gItemIcon_TwistedSpoon[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.smol"); const u16 gItemIconPalette_TwistedSpoon[] = INCBIN_U16("graphics/items/icon_palettes/twisted_spoon.gbapal"); -const u32 gItemIcon_SilverPowder[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.lz"); +const u32 gItemIcon_SilverPowder[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.smol"); const u16 gItemIconPalette_SilverPowder[] = INCBIN_U16("graphics/items/icon_palettes/silver_powder.gbapal"); -const u32 gItemIcon_HardStone[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.lz"); +const u32 gItemIcon_HardStone[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.smol"); const u16 gItemIconPalette_HardStone[] = INCBIN_U16("graphics/items/icon_palettes/hard_stone.gbapal"); -const u32 gItemIcon_SpellTag[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.lz"); +const u32 gItemIcon_SpellTag[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.smol"); const u16 gItemIconPalette_SpellTag[] = INCBIN_U16("graphics/items/icon_palettes/spell_tag.gbapal"); -const u32 gItemIcon_DragonFang[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.lz"); +const u32 gItemIcon_DragonFang[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.smol"); const u16 gItemIconPalette_DragonFang[] = INCBIN_U16("graphics/items/icon_palettes/dragon_fang.gbapal"); -const u32 gItemIcon_BlackGlasses[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.lz"); +const u32 gItemIcon_BlackGlasses[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.smol"); -const u32 gItemIcon_MetalCoat[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.lz"); +const u32 gItemIcon_MetalCoat[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.smol"); const u16 gItemIconPalette_MetalCoat[] = INCBIN_U16("graphics/items/icon_palettes/metal_coat.gbapal"); // Choice Items -const u32 gItemIcon_ChoiceBand[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.lz"); +const u32 gItemIcon_ChoiceBand[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.smol"); const u16 gItemIconPalette_ChoiceBand[] = INCBIN_U16("graphics/items/icon_palettes/choice_band.gbapal"); -const u32 gItemIcon_ChoiceSpecs[] = INCBIN_U32("graphics/items/icons/choice_specs.4bpp.lz"); +const u32 gItemIcon_ChoiceSpecs[] = INCBIN_U32("graphics/items/icons/choice_specs.4bpp.smol"); const u16 gItemIconPalette_ChoiceSpecs[] = INCBIN_U16("graphics/items/icon_palettes/choice_specs.gbapal"); -const u32 gItemIcon_ChoiceScarf[] = INCBIN_U32("graphics/items/icons/choice_scarf.4bpp.lz"); +const u32 gItemIcon_ChoiceScarf[] = INCBIN_U32("graphics/items/icons/choice_scarf.4bpp.smol"); const u16 gItemIconPalette_ChoiceScarf[] = INCBIN_U16("graphics/items/icon_palettes/choice_scarf.gbapal"); // Status Orbs -const u32 gItemIcon_FlameOrb[] = INCBIN_U32("graphics/items/icons/flame_orb.4bpp.lz"); +const u32 gItemIcon_FlameOrb[] = INCBIN_U32("graphics/items/icons/flame_orb.4bpp.smol"); const u16 gItemIconPalette_FlameOrb[] = INCBIN_U16("graphics/items/icon_palettes/flame_orb.gbapal"); -const u32 gItemIcon_ToxicOrb[] = INCBIN_U32("graphics/items/icons/toxic_orb.4bpp.lz"); +const u32 gItemIcon_ToxicOrb[] = INCBIN_U32("graphics/items/icons/toxic_orb.4bpp.smol"); const u16 gItemIconPalette_ToxicOrb[] = INCBIN_U16("graphics/items/icon_palettes/toxic_orb.gbapal"); // Weather Rocks -const u32 gItemIcon_DampRock[] = INCBIN_U32("graphics/items/icons/damp_rock.4bpp.lz"); +const u32 gItemIcon_DampRock[] = INCBIN_U32("graphics/items/icons/damp_rock.4bpp.smol"); const u16 gItemIconPalette_DampRock[] = INCBIN_U16("graphics/items/icon_palettes/damp_rock.gbapal"); -const u32 gItemIcon_HeatRock[] = INCBIN_U32("graphics/items/icons/heat_rock.4bpp.lz"); +const u32 gItemIcon_HeatRock[] = INCBIN_U32("graphics/items/icons/heat_rock.4bpp.smol"); const u16 gItemIconPalette_HeatRock[] = INCBIN_U16("graphics/items/icon_palettes/heat_rock.gbapal"); -const u32 gItemIcon_SmoothRock[] = INCBIN_U32("graphics/items/icons/smooth_rock.4bpp.lz"); +const u32 gItemIcon_SmoothRock[] = INCBIN_U32("graphics/items/icons/smooth_rock.4bpp.smol"); const u16 gItemIconPalette_SmoothRock[] = INCBIN_U16("graphics/items/icon_palettes/smooth_rock.gbapal"); -const u32 gItemIcon_IcyRock[] = INCBIN_U32("graphics/items/icons/icy_rock.4bpp.lz"); +const u32 gItemIcon_IcyRock[] = INCBIN_U32("graphics/items/icons/icy_rock.4bpp.smol"); const u16 gItemIconPalette_IcyRock[] = INCBIN_U16("graphics/items/icon_palettes/icy_rock.gbapal"); // Terrain Seeds -const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.lz"); +const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.smol"); const u16 gItemIconPalette_ElectricSeed[] = INCBIN_U16("graphics/items/icon_palettes/electric_seed.gbapal"); -const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.lz"); +const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.smol"); const u16 gItemIconPalette_PsychicSeed[] = INCBIN_U16("graphics/items/icon_palettes/psychic_seed.gbapal"); -const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.lz"); +const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.smol"); const u16 gItemIconPalette_MistySeed[] = INCBIN_U16("graphics/items/icon_palettes/misty_seed.gbapal"); -const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.lz"); +const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.smol"); const u16 gItemIconPalette_GrassySeed[] = INCBIN_U16("graphics/items/icon_palettes/grassy_seed.gbapal"); // Type-activated Stat Modifiers -const u32 gItemIcon_AbsorbBulb[] = INCBIN_U32("graphics/items/icons/absorb_bulb.4bpp.lz"); +const u32 gItemIcon_AbsorbBulb[] = INCBIN_U32("graphics/items/icons/absorb_bulb.4bpp.smol"); const u16 gItemIconPalette_AbsorbBulb[] = INCBIN_U16("graphics/items/icon_palettes/absorb_bulb.gbapal"); -const u32 gItemIcon_CellBattery[] = INCBIN_U32("graphics/items/icons/cell_battery.4bpp.lz"); +const u32 gItemIcon_CellBattery[] = INCBIN_U32("graphics/items/icons/cell_battery.4bpp.smol"); const u16 gItemIconPalette_CellBattery[] = INCBIN_U16("graphics/items/icon_palettes/cell_battery.gbapal"); -const u32 gItemIcon_LuminousMoss[] = INCBIN_U32("graphics/items/icons/luminous_moss.4bpp.lz"); +const u32 gItemIcon_LuminousMoss[] = INCBIN_U32("graphics/items/icons/luminous_moss.4bpp.smol"); const u16 gItemIconPalette_LuminousMoss[] = INCBIN_U16("graphics/items/icon_palettes/luminous_moss.gbapal"); -const u32 gItemIcon_Snowball[] = INCBIN_U32("graphics/items/icons/snowball.4bpp.lz"); +const u32 gItemIcon_Snowball[] = INCBIN_U32("graphics/items/icons/snowball.4bpp.smol"); const u16 gItemIconPalette_Snowball[] = INCBIN_U16("graphics/items/icon_palettes/snowball.gbapal"); // Misc. Held Items -const u32 gItemIcon_BrightPowder[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.lz"); +const u32 gItemIcon_BrightPowder[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.smol"); const u16 gItemIconPalette_BrightPowder[] = INCBIN_U16("graphics/items/icon_palettes/bright_powder.gbapal"); -const u32 gItemIcon_InBattleHerb[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.lz"); +const u32 gItemIcon_InBattleHerb[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.smol"); const u16 gItemIconPalette_WhiteHerb[] = INCBIN_U16("graphics/items/icon_palettes/white_herb.gbapal"); -const u32 gItemIcon_ExpShare[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.lz"); +const u32 gItemIcon_ExpShare[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.smol"); const u16 gItemIconPalette_ExpShare[] = INCBIN_U16("graphics/items/icon_palettes/exp_share.gbapal"); -const u32 gItemIcon_QuickClaw[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.lz"); +const u32 gItemIcon_QuickClaw[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.smol"); const u16 gItemIconPalette_QuickClaw[] = INCBIN_U16("graphics/items/icon_palettes/quick_claw.gbapal"); -const u32 gItemIcon_SootheBell[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.lz"); +const u32 gItemIcon_SootheBell[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.smol"); const u16 gItemIconPalette_SootheBell[] = INCBIN_U16("graphics/items/icon_palettes/soothe_bell.gbapal"); const u16 gItemIconPalette_MentalHerb[] = INCBIN_U16("graphics/items/icon_palettes/mental_herb.gbapal"); -const u32 gItemIcon_KingsRock[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.lz"); +const u32 gItemIcon_KingsRock[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.smol"); const u16 gItemIconPalette_KingsRock[] = INCBIN_U16("graphics/items/icon_palettes/kings_rock.gbapal"); -const u32 gItemIcon_AmuletCoin[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.lz"); +const u32 gItemIcon_AmuletCoin[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.smol"); const u16 gItemIconPalette_AmuletCoin[] = INCBIN_U16("graphics/items/icon_palettes/amulet_coin.gbapal"); -const u32 gItemIcon_CleanseTag[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.lz"); +const u32 gItemIcon_CleanseTag[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.smol"); const u16 gItemIconPalette_CleanseTag[] = INCBIN_U16("graphics/items/icon_palettes/cleanse_tag.gbapal"); -const u32 gItemIcon_SmokeBall[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.lz"); +const u32 gItemIcon_SmokeBall[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.smol"); const u16 gItemIconPalette_SmokeBall[] = INCBIN_U16("graphics/items/icon_palettes/smoke_ball.gbapal"); -const u32 gItemIcon_FocusBand[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.lz"); +const u32 gItemIcon_FocusBand[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.smol"); const u16 gItemIconPalette_FocusBand[] = INCBIN_U16("graphics/items/icon_palettes/focus_band.gbapal"); -const u32 gItemIcon_LuckyEgg[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.lz"); +const u32 gItemIcon_LuckyEgg[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.smol"); const u16 gItemIconPalette_LuckyEgg[] = INCBIN_U16("graphics/items/icon_palettes/lucky_egg.gbapal"); -const u32 gItemIcon_ScopeLens[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.lz"); +const u32 gItemIcon_ScopeLens[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.smol"); const u16 gItemIconPalette_ScopeLens[] = INCBIN_U16("graphics/items/icon_palettes/scope_lens.gbapal"); -const u32 gItemIcon_Leftovers[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.lz"); +const u32 gItemIcon_Leftovers[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.smol"); const u16 gItemIconPalette_Leftovers[] = INCBIN_U16("graphics/items/icon_palettes/leftovers.gbapal"); -const u32 gItemIcon_ShellBell[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.lz"); +const u32 gItemIcon_ShellBell[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.smol"); -const u32 gItemIcon_WideLens[] = INCBIN_U32("graphics/items/icons/wide_lens.4bpp.lz"); +const u32 gItemIcon_WideLens[] = INCBIN_U32("graphics/items/icons/wide_lens.4bpp.smol"); const u16 gItemIconPalette_WideLens[] = INCBIN_U16("graphics/items/icon_palettes/wide_lens.gbapal"); -const u32 gItemIcon_MuscleBand[] = INCBIN_U32("graphics/items/icons/muscle_band.4bpp.lz"); +const u32 gItemIcon_MuscleBand[] = INCBIN_U32("graphics/items/icons/muscle_band.4bpp.smol"); const u16 gItemIconPalette_MuscleBand[] = INCBIN_U16("graphics/items/icon_palettes/muscle_band.gbapal"); -const u32 gItemIcon_WiseGlasses[] = INCBIN_U32("graphics/items/icons/wise_glasses.4bpp.lz"); +const u32 gItemIcon_WiseGlasses[] = INCBIN_U32("graphics/items/icons/wise_glasses.4bpp.smol"); const u16 gItemIconPalette_WiseGlasses[] = INCBIN_U16("graphics/items/icon_palettes/wise_glasses.gbapal"); -const u32 gItemIcon_ExpertBelt[] = INCBIN_U32("graphics/items/icons/expert_belt.4bpp.lz"); +const u32 gItemIcon_ExpertBelt[] = INCBIN_U32("graphics/items/icons/expert_belt.4bpp.smol"); const u16 gItemIconPalette_ExpertBelt[] = INCBIN_U16("graphics/items/icon_palettes/expert_belt.gbapal"); -const u32 gItemIcon_LightClay[] = INCBIN_U32("graphics/items/icons/light_clay.4bpp.lz"); +const u32 gItemIcon_LightClay[] = INCBIN_U32("graphics/items/icons/light_clay.4bpp.smol"); const u16 gItemIconPalette_LightClay[] = INCBIN_U16("graphics/items/icon_palettes/light_clay.gbapal"); -const u32 gItemIcon_LifeOrb[] = INCBIN_U32("graphics/items/icons/life_orb.4bpp.lz"); +const u32 gItemIcon_LifeOrb[] = INCBIN_U32("graphics/items/icons/life_orb.4bpp.smol"); const u16 gItemIconPalette_LifeOrb[] = INCBIN_U16("graphics/items/icon_palettes/life_orb.gbapal"); -const u32 gItemIcon_PowerHerb[] = INCBIN_U32("graphics/items/icons/power_herb.4bpp.lz"); +const u32 gItemIcon_PowerHerb[] = INCBIN_U32("graphics/items/icons/power_herb.4bpp.smol"); const u16 gItemIconPalette_PowerHerb[] = INCBIN_U16("graphics/items/icon_palettes/power_herb.gbapal"); -const u32 gItemIcon_FocusSash[] = INCBIN_U32("graphics/items/icons/focus_sash.4bpp.lz"); +const u32 gItemIcon_FocusSash[] = INCBIN_U32("graphics/items/icons/focus_sash.4bpp.smol"); const u16 gItemIconPalette_FocusSash[] = INCBIN_U16("graphics/items/icon_palettes/focus_sash.gbapal"); -const u32 gItemIcon_ZoomLens[] = INCBIN_U32("graphics/items/icons/zoom_lens.4bpp.lz"); +const u32 gItemIcon_ZoomLens[] = INCBIN_U32("graphics/items/icons/zoom_lens.4bpp.smol"); const u16 gItemIconPalette_ZoomLens[] = INCBIN_U16("graphics/items/icon_palettes/zoom_lens.gbapal"); -const u32 gItemIcon_Metronome[] = INCBIN_U32("graphics/items/icons/metronome.4bpp.lz"); +const u32 gItemIcon_Metronome[] = INCBIN_U32("graphics/items/icons/metronome.4bpp.smol"); const u16 gItemIconPalette_Metronome[] = INCBIN_U16("graphics/items/icon_palettes/metronome.gbapal"); -const u32 gItemIcon_IronBall[] = INCBIN_U32("graphics/items/icons/iron_ball.4bpp.lz"); +const u32 gItemIcon_IronBall[] = INCBIN_U32("graphics/items/icons/iron_ball.4bpp.smol"); const u16 gItemIconPalette_IronBall[] = INCBIN_U16("graphics/items/icon_palettes/iron_ball.gbapal"); -const u32 gItemIcon_LaggingTail[] = INCBIN_U32("graphics/items/icons/lagging_tail.4bpp.lz"); +const u32 gItemIcon_LaggingTail[] = INCBIN_U32("graphics/items/icons/lagging_tail.4bpp.smol"); const u16 gItemIconPalette_LaggingTail[] = INCBIN_U16("graphics/items/icon_palettes/lagging_tail.gbapal"); -const u32 gItemIcon_DestinyKnot[] = INCBIN_U32("graphics/items/icons/destiny_knot.4bpp.lz"); +const u32 gItemIcon_DestinyKnot[] = INCBIN_U32("graphics/items/icons/destiny_knot.4bpp.smol"); const u16 gItemIconPalette_DestinyKnot[] = INCBIN_U16("graphics/items/icon_palettes/destiny_knot.gbapal"); -const u32 gItemIcon_BlackSludge[] = INCBIN_U32("graphics/items/icons/black_sludge.4bpp.lz"); +const u32 gItemIcon_BlackSludge[] = INCBIN_U32("graphics/items/icons/black_sludge.4bpp.smol"); const u16 gItemIconPalette_BlackSludge[] = INCBIN_U16("graphics/items/icon_palettes/black_sludge.gbapal"); -const u32 gItemIcon_GripClaw[] = INCBIN_U32("graphics/items/icons/grip_claw.4bpp.lz"); +const u32 gItemIcon_GripClaw[] = INCBIN_U32("graphics/items/icons/grip_claw.4bpp.smol"); const u16 gItemIconPalette_GripClaw[] = INCBIN_U16("graphics/items/icon_palettes/grip_claw.gbapal"); -const u32 gItemIcon_StickyBarb[] = INCBIN_U32("graphics/items/icons/sticky_barb.4bpp.lz"); +const u32 gItemIcon_StickyBarb[] = INCBIN_U32("graphics/items/icons/sticky_barb.4bpp.smol"); const u16 gItemIconPalette_StickyBarb[] = INCBIN_U16("graphics/items/icon_palettes/sticky_barb.gbapal"); -const u32 gItemIcon_ShedShell[] = INCBIN_U32("graphics/items/icons/shed_shell.4bpp.lz"); +const u32 gItemIcon_ShedShell[] = INCBIN_U32("graphics/items/icons/shed_shell.4bpp.smol"); const u16 gItemIconPalette_ShedShell[] = INCBIN_U16("graphics/items/icon_palettes/shed_shell.gbapal"); -const u32 gItemIcon_BigRoot[] = INCBIN_U32("graphics/items/icons/big_root.4bpp.lz"); +const u32 gItemIcon_BigRoot[] = INCBIN_U32("graphics/items/icons/big_root.4bpp.smol"); const u16 gItemIconPalette_BigRoot[] = INCBIN_U16("graphics/items/icon_palettes/big_root.gbapal"); -const u32 gItemIcon_RazorClaw[] = INCBIN_U32("graphics/items/icons/razor_claw.4bpp.lz"); +const u32 gItemIcon_RazorClaw[] = INCBIN_U32("graphics/items/icons/razor_claw.4bpp.smol"); const u16 gItemIconPalette_RazorClaw[] = INCBIN_U16("graphics/items/icon_palettes/razor_claw.gbapal"); -const u32 gItemIcon_RazorFang[] = INCBIN_U32("graphics/items/icons/razor_fang.4bpp.lz"); +const u32 gItemIcon_RazorFang[] = INCBIN_U32("graphics/items/icons/razor_fang.4bpp.smol"); const u16 gItemIconPalette_RazorFang[] = INCBIN_U16("graphics/items/icon_palettes/razor_fang.gbapal"); -const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.lz"); +const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.smol"); const u16 gItemIconPalette_Eviolite[] = INCBIN_U16("graphics/items/icon_palettes/eviolite.gbapal"); -const u32 gItemIcon_FloatStone[] = INCBIN_U32("graphics/items/icons/float_stone.4bpp.lz"); +const u32 gItemIcon_FloatStone[] = INCBIN_U32("graphics/items/icons/float_stone.4bpp.smol"); const u16 gItemIconPalette_FloatStone[] = INCBIN_U16("graphics/items/icon_palettes/float_stone.gbapal"); -const u32 gItemIcon_RockyHelmet[] = INCBIN_U32("graphics/items/icons/rocky_helmet.4bpp.lz"); +const u32 gItemIcon_RockyHelmet[] = INCBIN_U32("graphics/items/icons/rocky_helmet.4bpp.smol"); const u16 gItemIconPalette_RockyHelmet[] = INCBIN_U16("graphics/items/icon_palettes/rocky_helmet.gbapal"); -const u32 gItemIcon_AirBalloon[] = INCBIN_U32("graphics/items/icons/air_balloon.4bpp.lz"); +const u32 gItemIcon_AirBalloon[] = INCBIN_U32("graphics/items/icons/air_balloon.4bpp.smol"); const u16 gItemIconPalette_AirBalloon[] = INCBIN_U16("graphics/items/icon_palettes/air_balloon.gbapal"); -const u32 gItemIcon_RedCard[] = INCBIN_U32("graphics/items/icons/red_card.4bpp.lz"); +const u32 gItemIcon_RedCard[] = INCBIN_U32("graphics/items/icons/red_card.4bpp.smol"); const u16 gItemIconPalette_RedCard[] = INCBIN_U16("graphics/items/icon_palettes/red_card.gbapal"); -const u32 gItemIcon_RingTarget[] = INCBIN_U32("graphics/items/icons/ring_target.4bpp.lz"); +const u32 gItemIcon_RingTarget[] = INCBIN_U32("graphics/items/icons/ring_target.4bpp.smol"); const u16 gItemIconPalette_RingTarget[] = INCBIN_U16("graphics/items/icon_palettes/ring_target.gbapal"); -const u32 gItemIcon_BindingBand[] = INCBIN_U32("graphics/items/icons/binding_band.4bpp.lz"); +const u32 gItemIcon_BindingBand[] = INCBIN_U32("graphics/items/icons/binding_band.4bpp.smol"); const u16 gItemIconPalette_BindingBand[] = INCBIN_U16("graphics/items/icon_palettes/binding_band.gbapal"); -const u32 gItemIcon_EjectButton[] = INCBIN_U32("graphics/items/icons/eject_button.4bpp.lz"); +const u32 gItemIcon_EjectButton[] = INCBIN_U32("graphics/items/icons/eject_button.4bpp.smol"); const u16 gItemIconPalette_EjectButton[] = INCBIN_U16("graphics/items/icon_palettes/eject_button.gbapal"); -const u32 gItemIcon_WeaknessPolicy[] = INCBIN_U32("graphics/items/icons/weakness_policy.4bpp.lz"); +const u32 gItemIcon_WeaknessPolicy[] = INCBIN_U32("graphics/items/icons/weakness_policy.4bpp.smol"); const u16 gItemIconPalette_WeaknessPolicy[] = INCBIN_U16("graphics/items/icon_palettes/weakness_policy.gbapal"); -const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.lz"); +const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.smol"); const u16 gItemIconPalette_AssaultVest[] = INCBIN_U16("graphics/items/icon_palettes/assault_vest.gbapal"); -const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.lz"); +const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.smol"); const u16 gItemIconPalette_SafetyGoggles[] = INCBIN_U16("graphics/items/icon_palettes/safety_goggles.gbapal"); -const u32 gItemIcon_AdrenalineOrb[] = INCBIN_U32("graphics/items/icons/adrenaline_orb.4bpp.lz"); +const u32 gItemIcon_AdrenalineOrb[] = INCBIN_U32("graphics/items/icons/adrenaline_orb.4bpp.smol"); const u16 gItemIconPalette_AdrenalineOrb[] = INCBIN_U16("graphics/items/icon_palettes/adrenaline_orb.gbapal"); -const u32 gItemIcon_TerrainExtender[] = INCBIN_U32("graphics/items/icons/terrain_extender.4bpp.lz"); +const u32 gItemIcon_TerrainExtender[] = INCBIN_U32("graphics/items/icons/terrain_extender.4bpp.smol"); const u16 gItemIconPalette_TerrainExtender[] = INCBIN_U16("graphics/items/icon_palettes/terrain_extender.gbapal"); -const u32 gItemIcon_ProtectivePads[] = INCBIN_U32("graphics/items/icons/protective_pads.4bpp.lz"); +const u32 gItemIcon_ProtectivePads[] = INCBIN_U32("graphics/items/icons/protective_pads.4bpp.smol"); const u16 gItemIconPalette_ProtectivePads[] = INCBIN_U16("graphics/items/icon_palettes/protective_pads.gbapal"); -const u32 gItemIcon_ThroatSpray[] = INCBIN_U32("graphics/items/icons/throat_spray.4bpp.lz"); +const u32 gItemIcon_ThroatSpray[] = INCBIN_U32("graphics/items/icons/throat_spray.4bpp.smol"); const u16 gItemIconPalette_ThroatSpray[] = INCBIN_U16("graphics/items/icon_palettes/throat_spray.gbapal"); -const u32 gItemIcon_EjectPack[] = INCBIN_U32("graphics/items/icons/eject_pack.4bpp.lz"); +const u32 gItemIcon_EjectPack[] = INCBIN_U32("graphics/items/icons/eject_pack.4bpp.smol"); const u16 gItemIconPalette_EjectPack[] = INCBIN_U16("graphics/items/icon_palettes/eject_pack.gbapal"); -const u32 gItemIcon_HeavyDutyBoots[] = INCBIN_U32("graphics/items/icons/heavy_duty_boots.4bpp.lz"); +const u32 gItemIcon_HeavyDutyBoots[] = INCBIN_U32("graphics/items/icons/heavy_duty_boots.4bpp.smol"); const u16 gItemIconPalette_HeavyDutyBoots[] = INCBIN_U16("graphics/items/icon_palettes/heavy_duty_boots.gbapal"); -const u32 gItemIcon_BlunderPolicy[] = INCBIN_U32("graphics/items/icons/blunder_policy.4bpp.lz"); +const u32 gItemIcon_BlunderPolicy[] = INCBIN_U32("graphics/items/icons/blunder_policy.4bpp.smol"); const u16 gItemIconPalette_BlunderPolicy[] = INCBIN_U16("graphics/items/icon_palettes/blunder_policy.gbapal"); -const u32 gItemIcon_RoomService[] = INCBIN_U32("graphics/items/icons/room_service.4bpp.lz"); +const u32 gItemIcon_RoomService[] = INCBIN_U32("graphics/items/icons/room_service.4bpp.smol"); const u16 gItemIconPalette_RoomService[] = INCBIN_U16("graphics/items/icon_palettes/room_service.gbapal"); -const u32 gItemIcon_UtilityUmbrella[] = INCBIN_U32("graphics/items/icons/utility_umbrella.4bpp.lz"); +const u32 gItemIcon_UtilityUmbrella[] = INCBIN_U32("graphics/items/icons/utility_umbrella.4bpp.smol"); const u16 gItemIconPalette_UtilityUmbrella[] = INCBIN_U16("graphics/items/icon_palettes/utility_umbrella.gbapal"); // Berries -const u32 gItemIcon_CheriBerry[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.lz"); +const u32 gItemIcon_CheriBerry[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.smol"); const u16 gItemIconPalette_CheriBerry[] = INCBIN_U16("graphics/items/icon_palettes/cheri_berry.gbapal"); -const u32 gItemIcon_ChestoBerry[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.lz"); +const u32 gItemIcon_ChestoBerry[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.smol"); const u16 gItemIconPalette_ChestoBerry[] = INCBIN_U16("graphics/items/icon_palettes/chesto_berry.gbapal"); -const u32 gItemIcon_PechaBerry[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.lz"); +const u32 gItemIcon_PechaBerry[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.smol"); const u16 gItemIconPalette_PechaBerry[] = INCBIN_U16("graphics/items/icon_palettes/pecha_berry.gbapal"); -const u32 gItemIcon_RawstBerry[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.lz"); +const u32 gItemIcon_RawstBerry[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.smol"); const u16 gItemIconPalette_RawstBerry[] = INCBIN_U16("graphics/items/icon_palettes/rawst_berry.gbapal"); -const u32 gItemIcon_AspearBerry[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.lz"); +const u32 gItemIcon_AspearBerry[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.smol"); const u16 gItemIconPalette_AspearBerry[] = INCBIN_U16("graphics/items/icon_palettes/aspear_berry.gbapal"); -const u32 gItemIcon_LeppaBerry[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.lz"); +const u32 gItemIcon_LeppaBerry[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.smol"); const u16 gItemIconPalette_LeppaBerry[] = INCBIN_U16("graphics/items/icon_palettes/leppa_berry.gbapal"); -const u32 gItemIcon_OranBerry[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.lz"); +const u32 gItemIcon_OranBerry[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.smol"); const u16 gItemIconPalette_OranBerry[] = INCBIN_U16("graphics/items/icon_palettes/oran_berry.gbapal"); -const u32 gItemIcon_PersimBerry[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.lz"); +const u32 gItemIcon_PersimBerry[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.smol"); const u16 gItemIconPalette_PersimBerry[] = INCBIN_U16("graphics/items/icon_palettes/persim_berry.gbapal"); -const u32 gItemIcon_LumBerry[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.lz"); +const u32 gItemIcon_LumBerry[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.smol"); const u16 gItemIconPalette_LumBerry[] = INCBIN_U16("graphics/items/icon_palettes/lum_berry.gbapal"); -const u32 gItemIcon_SitrusBerry[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.lz"); +const u32 gItemIcon_SitrusBerry[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.smol"); const u16 gItemIconPalette_SitrusBerry[] = INCBIN_U16("graphics/items/icon_palettes/sitrus_berry.gbapal"); -const u32 gItemIcon_FigyBerry[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.lz"); +const u32 gItemIcon_FigyBerry[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.smol"); const u16 gItemIconPalette_FigyBerry[] = INCBIN_U16("graphics/items/icon_palettes/figy_berry.gbapal"); -const u32 gItemIcon_WikiBerry[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.lz"); +const u32 gItemIcon_WikiBerry[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.smol"); const u16 gItemIconPalette_WikiBerry[] = INCBIN_U16("graphics/items/icon_palettes/wiki_berry.gbapal"); -const u32 gItemIcon_MagoBerry[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.lz"); +const u32 gItemIcon_MagoBerry[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.smol"); const u16 gItemIconPalette_MagoBerry[] = INCBIN_U16("graphics/items/icon_palettes/mago_berry.gbapal"); -const u32 gItemIcon_AguavBerry[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.lz"); +const u32 gItemIcon_AguavBerry[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.smol"); const u16 gItemIconPalette_AguavBerry[] = INCBIN_U16("graphics/items/icon_palettes/aguav_berry.gbapal"); -const u32 gItemIcon_IapapaBerry[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.lz"); +const u32 gItemIcon_IapapaBerry[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.smol"); const u16 gItemIconPalette_IapapaBerry[] = INCBIN_U16("graphics/items/icon_palettes/iapapa_berry.gbapal"); -const u32 gItemIcon_RazzBerry[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.lz"); +const u32 gItemIcon_RazzBerry[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.smol"); const u16 gItemIconPalette_RazzBerry[] = INCBIN_U16("graphics/items/icon_palettes/razz_berry.gbapal"); -const u32 gItemIcon_BlukBerry[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.lz"); +const u32 gItemIcon_BlukBerry[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.smol"); const u16 gItemIconPalette_BlukBerry[] = INCBIN_U16("graphics/items/icon_palettes/bluk_berry.gbapal"); -const u32 gItemIcon_NanabBerry[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.lz"); +const u32 gItemIcon_NanabBerry[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.smol"); const u16 gItemIconPalette_NanabBerry[] = INCBIN_U16("graphics/items/icon_palettes/nanab_berry.gbapal"); -const u32 gItemIcon_WepearBerry[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.lz"); +const u32 gItemIcon_WepearBerry[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.smol"); const u16 gItemIconPalette_WepearBerry[] = INCBIN_U16("graphics/items/icon_palettes/wepear_berry.gbapal"); -const u32 gItemIcon_PinapBerry[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.lz"); +const u32 gItemIcon_PinapBerry[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.smol"); const u16 gItemIconPalette_PinapBerry[] = INCBIN_U16("graphics/items/icon_palettes/pinap_berry.gbapal"); -const u32 gItemIcon_PomegBerry[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.lz"); +const u32 gItemIcon_PomegBerry[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.smol"); const u16 gItemIconPalette_PomegBerry[] = INCBIN_U16("graphics/items/icon_palettes/pomeg_berry.gbapal"); -const u32 gItemIcon_KelpsyBerry[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.lz"); +const u32 gItemIcon_KelpsyBerry[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.smol"); const u16 gItemIconPalette_KelpsyBerry[] = INCBIN_U16("graphics/items/icon_palettes/kelpsy_berry.gbapal"); -const u32 gItemIcon_QualotBerry[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.lz"); +const u32 gItemIcon_QualotBerry[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.smol"); const u16 gItemIconPalette_QualotBerry[] = INCBIN_U16("graphics/items/icon_palettes/qualot_berry.gbapal"); -const u32 gItemIcon_HondewBerry[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.lz"); +const u32 gItemIcon_HondewBerry[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.smol"); const u16 gItemIconPalette_HondewBerry[] = INCBIN_U16("graphics/items/icon_palettes/hondew_berry.gbapal"); -const u32 gItemIcon_GrepaBerry[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.lz"); +const u32 gItemIcon_GrepaBerry[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.smol"); const u16 gItemIconPalette_GrepaBerry[] = INCBIN_U16("graphics/items/icon_palettes/grepa_berry.gbapal"); -const u32 gItemIcon_TamatoBerry[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.lz"); +const u32 gItemIcon_TamatoBerry[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.smol"); const u16 gItemIconPalette_TamatoBerry[] = INCBIN_U16("graphics/items/icon_palettes/tamato_berry.gbapal"); -const u32 gItemIcon_CornnBerry[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.lz"); +const u32 gItemIcon_CornnBerry[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.smol"); const u16 gItemIconPalette_CornnBerry[] = INCBIN_U16("graphics/items/icon_palettes/cornn_berry.gbapal"); -const u32 gItemIcon_MagostBerry[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.lz"); +const u32 gItemIcon_MagostBerry[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.smol"); const u16 gItemIconPalette_MagostBerry[] = INCBIN_U16("graphics/items/icon_palettes/magost_berry.gbapal"); -const u32 gItemIcon_RabutaBerry[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.lz"); +const u32 gItemIcon_RabutaBerry[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.smol"); const u16 gItemIconPalette_RabutaBerry[] = INCBIN_U16("graphics/items/icon_palettes/rabuta_berry.gbapal"); -const u32 gItemIcon_NomelBerry[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.lz"); +const u32 gItemIcon_NomelBerry[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.smol"); const u16 gItemIconPalette_NomelBerry[] = INCBIN_U16("graphics/items/icon_palettes/nomel_berry.gbapal"); -const u32 gItemIcon_SpelonBerry[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.lz"); +const u32 gItemIcon_SpelonBerry[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.smol"); const u16 gItemIconPalette_SpelonBerry[] = INCBIN_U16("graphics/items/icon_palettes/spelon_berry.gbapal"); -const u32 gItemIcon_PamtreBerry[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.lz"); +const u32 gItemIcon_PamtreBerry[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.smol"); const u16 gItemIconPalette_PamtreBerry[] = INCBIN_U16("graphics/items/icon_palettes/pamtre_berry.gbapal"); -const u32 gItemIcon_WatmelBerry[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.lz"); +const u32 gItemIcon_WatmelBerry[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.smol"); const u16 gItemIconPalette_WatmelBerry[] = INCBIN_U16("graphics/items/icon_palettes/watmel_berry.gbapal"); -const u32 gItemIcon_DurinBerry[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.lz"); +const u32 gItemIcon_DurinBerry[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.smol"); const u16 gItemIconPalette_DurinBerry[] = INCBIN_U16("graphics/items/icon_palettes/durin_berry.gbapal"); -const u32 gItemIcon_BelueBerry[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.lz"); +const u32 gItemIcon_BelueBerry[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.smol"); const u16 gItemIconPalette_BelueBerry[] = INCBIN_U16("graphics/items/icon_palettes/belue_berry.gbapal"); -const u32 gItemIcon_ChilanBerry[] = INCBIN_U32("graphics/items/icons/chilan_berry.4bpp.lz"); +const u32 gItemIcon_ChilanBerry[] = INCBIN_U32("graphics/items/icons/chilan_berry.4bpp.smol"); const u16 gItemIconPalette_ChilanBerry[] = INCBIN_U16("graphics/items/icon_palettes/chilan_berry.gbapal"); -const u32 gItemIcon_OccaBerry[] = INCBIN_U32("graphics/items/icons/occa_berry.4bpp.lz"); +const u32 gItemIcon_OccaBerry[] = INCBIN_U32("graphics/items/icons/occa_berry.4bpp.smol"); const u16 gItemIconPalette_OccaBerry[] = INCBIN_U16("graphics/items/icon_palettes/occa_berry.gbapal"); -const u32 gItemIcon_PasshoBerry[] = INCBIN_U32("graphics/items/icons/passho_berry.4bpp.lz"); +const u32 gItemIcon_PasshoBerry[] = INCBIN_U32("graphics/items/icons/passho_berry.4bpp.smol"); const u16 gItemIconPalette_PasshoBerry[] = INCBIN_U16("graphics/items/icon_palettes/passho_berry.gbapal"); -const u32 gItemIcon_WacanBerry[] = INCBIN_U32("graphics/items/icons/wacan_berry.4bpp.lz"); +const u32 gItemIcon_WacanBerry[] = INCBIN_U32("graphics/items/icons/wacan_berry.4bpp.smol"); const u16 gItemIconPalette_WacanBerry[] = INCBIN_U16("graphics/items/icon_palettes/wacan_berry.gbapal"); -const u32 gItemIcon_RindoBerry[] = INCBIN_U32("graphics/items/icons/rindo_berry.4bpp.lz"); +const u32 gItemIcon_RindoBerry[] = INCBIN_U32("graphics/items/icons/rindo_berry.4bpp.smol"); const u16 gItemIconPalette_RindoBerry[] = INCBIN_U16("graphics/items/icon_palettes/rindo_berry.gbapal"); -const u32 gItemIcon_YacheBerry[] = INCBIN_U32("graphics/items/icons/yache_berry.4bpp.lz"); +const u32 gItemIcon_YacheBerry[] = INCBIN_U32("graphics/items/icons/yache_berry.4bpp.smol"); const u16 gItemIconPalette_YacheBerry[] = INCBIN_U16("graphics/items/icon_palettes/yache_berry.gbapal"); -const u32 gItemIcon_ChopleBerry[] = INCBIN_U32("graphics/items/icons/chople_berry.4bpp.lz"); +const u32 gItemIcon_ChopleBerry[] = INCBIN_U32("graphics/items/icons/chople_berry.4bpp.smol"); const u16 gItemIconPalette_ChopleBerry[] = INCBIN_U16("graphics/items/icon_palettes/chople_berry.gbapal"); -const u32 gItemIcon_KebiaBerry[] = INCBIN_U32("graphics/items/icons/kebia_berry.4bpp.lz"); +const u32 gItemIcon_KebiaBerry[] = INCBIN_U32("graphics/items/icons/kebia_berry.4bpp.smol"); const u16 gItemIconPalette_KebiaBerry[] = INCBIN_U16("graphics/items/icon_palettes/kebia_berry.gbapal"); -const u32 gItemIcon_ShucaBerry[] = INCBIN_U32("graphics/items/icons/shuca_berry.4bpp.lz"); +const u32 gItemIcon_ShucaBerry[] = INCBIN_U32("graphics/items/icons/shuca_berry.4bpp.smol"); const u16 gItemIconPalette_ShucaBerry[] = INCBIN_U16("graphics/items/icon_palettes/shuca_berry.gbapal"); -const u32 gItemIcon_CobaBerry[] = INCBIN_U32("graphics/items/icons/coba_berry.4bpp.lz"); +const u32 gItemIcon_CobaBerry[] = INCBIN_U32("graphics/items/icons/coba_berry.4bpp.smol"); const u16 gItemIconPalette_CobaBerry[] = INCBIN_U16("graphics/items/icon_palettes/coba_berry.gbapal"); -const u32 gItemIcon_PayapaBerry[] = INCBIN_U32("graphics/items/icons/payapa_berry.4bpp.lz"); +const u32 gItemIcon_PayapaBerry[] = INCBIN_U32("graphics/items/icons/payapa_berry.4bpp.smol"); const u16 gItemIconPalette_PayapaBerry[] = INCBIN_U16("graphics/items/icon_palettes/payapa_berry.gbapal"); -const u32 gItemIcon_TangaBerry[] = INCBIN_U32("graphics/items/icons/tanga_berry.4bpp.lz"); +const u32 gItemIcon_TangaBerry[] = INCBIN_U32("graphics/items/icons/tanga_berry.4bpp.smol"); const u16 gItemIconPalette_TangaBerry[] = INCBIN_U16("graphics/items/icon_palettes/tanga_berry.gbapal"); -const u32 gItemIcon_ChartiBerry[] = INCBIN_U32("graphics/items/icons/charti_berry.4bpp.lz"); +const u32 gItemIcon_ChartiBerry[] = INCBIN_U32("graphics/items/icons/charti_berry.4bpp.smol"); const u16 gItemIconPalette_ChartiBerry[] = INCBIN_U16("graphics/items/icon_palettes/charti_berry.gbapal"); -const u32 gItemIcon_KasibBerry[] = INCBIN_U32("graphics/items/icons/kasib_berry.4bpp.lz"); +const u32 gItemIcon_KasibBerry[] = INCBIN_U32("graphics/items/icons/kasib_berry.4bpp.smol"); const u16 gItemIconPalette_KasibBerry[] = INCBIN_U16("graphics/items/icon_palettes/kasib_berry.gbapal"); -const u32 gItemIcon_HabanBerry[] = INCBIN_U32("graphics/items/icons/haban_berry.4bpp.lz"); +const u32 gItemIcon_HabanBerry[] = INCBIN_U32("graphics/items/icons/haban_berry.4bpp.smol"); const u16 gItemIconPalette_HabanBerry[] = INCBIN_U16("graphics/items/icon_palettes/haban_berry.gbapal"); -const u32 gItemIcon_ColburBerry[] = INCBIN_U32("graphics/items/icons/colbur_berry.4bpp.lz"); +const u32 gItemIcon_ColburBerry[] = INCBIN_U32("graphics/items/icons/colbur_berry.4bpp.smol"); const u16 gItemIconPalette_ColburBerry[] = INCBIN_U16("graphics/items/icon_palettes/colbur_berry.gbapal"); -const u32 gItemIcon_BabiriBerry[] = INCBIN_U32("graphics/items/icons/babiri_berry.4bpp.lz"); +const u32 gItemIcon_BabiriBerry[] = INCBIN_U32("graphics/items/icons/babiri_berry.4bpp.smol"); const u16 gItemIconPalette_BabiriBerry[] = INCBIN_U16("graphics/items/icon_palettes/babiri_berry.gbapal"); -const u32 gItemIcon_RoseliBerry[] = INCBIN_U32("graphics/items/icons/roseli_berry.4bpp.lz"); +const u32 gItemIcon_RoseliBerry[] = INCBIN_U32("graphics/items/icons/roseli_berry.4bpp.smol"); const u16 gItemIconPalette_RoseliBerry[] = INCBIN_U16("graphics/items/icon_palettes/roseli_berry.gbapal"); -const u32 gItemIcon_LiechiBerry[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.lz"); +const u32 gItemIcon_LiechiBerry[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.smol"); const u16 gItemIconPalette_LiechiBerry[] = INCBIN_U16("graphics/items/icon_palettes/liechi_berry.gbapal"); -const u32 gItemIcon_GanlonBerry[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.lz"); +const u32 gItemIcon_GanlonBerry[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.smol"); const u16 gItemIconPalette_GanlonBerry[] = INCBIN_U16("graphics/items/icon_palettes/ganlon_berry.gbapal"); -const u32 gItemIcon_SalacBerry[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.lz"); +const u32 gItemIcon_SalacBerry[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.smol"); const u16 gItemIconPalette_SalacBerry[] = INCBIN_U16("graphics/items/icon_palettes/salac_berry.gbapal"); -const u32 gItemIcon_PetayaBerry[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.lz"); +const u32 gItemIcon_PetayaBerry[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.smol"); const u16 gItemIconPalette_PetayaBerry[] = INCBIN_U16("graphics/items/icon_palettes/petaya_berry.gbapal"); -const u32 gItemIcon_ApicotBerry[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.lz"); +const u32 gItemIcon_ApicotBerry[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.smol"); const u16 gItemIconPalette_ApicotBerry[] = INCBIN_U16("graphics/items/icon_palettes/apicot_berry.gbapal"); -const u32 gItemIcon_LansatBerry[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.lz"); +const u32 gItemIcon_LansatBerry[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.smol"); const u16 gItemIconPalette_LansatBerry[] = INCBIN_U16("graphics/items/icon_palettes/lansat_berry.gbapal"); -const u32 gItemIcon_StarfBerry[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.lz"); +const u32 gItemIcon_StarfBerry[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.smol"); const u16 gItemIconPalette_StarfBerry[] = INCBIN_U16("graphics/items/icon_palettes/starf_berry.gbapal"); -const u32 gItemIcon_EnigmaBerry[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.lz"); +const u32 gItemIcon_EnigmaBerry[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.smol"); const u16 gItemIconPalette_EnigmaBerry[] = INCBIN_U16("graphics/items/icon_palettes/enigma_berry.gbapal"); -const u32 gItemIcon_MicleBerry[] = INCBIN_U32("graphics/items/icons/micle_berry.4bpp.lz"); +const u32 gItemIcon_MicleBerry[] = INCBIN_U32("graphics/items/icons/micle_berry.4bpp.smol"); const u16 gItemIconPalette_MicleBerry[] = INCBIN_U16("graphics/items/icon_palettes/micle_berry.gbapal"); -const u32 gItemIcon_CustapBerry[] = INCBIN_U32("graphics/items/icons/custap_berry.4bpp.lz"); +const u32 gItemIcon_CustapBerry[] = INCBIN_U32("graphics/items/icons/custap_berry.4bpp.smol"); const u16 gItemIconPalette_CustapBerry[] = INCBIN_U16("graphics/items/icon_palettes/custap_berry.gbapal"); -const u32 gItemIcon_JabocaBerry[] = INCBIN_U32("graphics/items/icons/jaboca_berry.4bpp.lz"); +const u32 gItemIcon_JabocaBerry[] = INCBIN_U32("graphics/items/icons/jaboca_berry.4bpp.smol"); const u16 gItemIconPalette_JabocaBerry[] = INCBIN_U16("graphics/items/icon_palettes/jaboca_berry.gbapal"); -const u32 gItemIcon_RowapBerry[] = INCBIN_U32("graphics/items/icons/rowap_berry.4bpp.lz"); +const u32 gItemIcon_RowapBerry[] = INCBIN_U32("graphics/items/icons/rowap_berry.4bpp.smol"); const u16 gItemIconPalette_RowapBerry[] = INCBIN_U16("graphics/items/icon_palettes/rowap_berry.gbapal"); -const u32 gItemIcon_KeeBerry[] = INCBIN_U32("graphics/items/icons/kee_berry.4bpp.lz"); +const u32 gItemIcon_KeeBerry[] = INCBIN_U32("graphics/items/icons/kee_berry.4bpp.smol"); const u16 gItemIconPalette_KeeBerry[] = INCBIN_U16("graphics/items/icon_palettes/kee_berry.gbapal"); -const u32 gItemIcon_MarangaBerry[] = INCBIN_U32("graphics/items/icons/maranga_berry.4bpp.lz"); +const u32 gItemIcon_MarangaBerry[] = INCBIN_U32("graphics/items/icons/maranga_berry.4bpp.smol"); const u16 gItemIconPalette_MarangaBerry[] = INCBIN_U16("graphics/items/icon_palettes/maranga_berry.gbapal"); // TMs/HMs -const u32 gItemIcon_TM[] = INCBIN_U32("graphics/items/icons/tm.4bpp.lz"); +const u32 gItemIcon_TM[] = INCBIN_U32("graphics/items/icons/tm.4bpp.smol"); -const u32 gItemIcon_HM[] = INCBIN_U32("graphics/items/icons/hm.4bpp.lz"); +const u32 gItemIcon_HM[] = INCBIN_U32("graphics/items/icons/hm.4bpp.smol"); const u16 gItemIconPalette_NormalTMHM[] = INCBIN_U16("graphics/items/icon_palettes/normal_tm_hm.gbapal"); @@ -1749,266 +1749,266 @@ const u16 gItemIconPalette_FairyTMHM[] = INCBIN_U16("graphics/items/icon_palette // Charms -const u32 gItemIcon_OvalCharm[] = INCBIN_U32("graphics/items/icons/oval_charm.4bpp.lz"); +const u32 gItemIcon_OvalCharm[] = INCBIN_U32("graphics/items/icons/oval_charm.4bpp.smol"); const u16 gItemIconPalette_OvalCharm[] = INCBIN_U16("graphics/items/icon_palettes/oval_charm.gbapal"); -const u32 gItemIcon_ShinyCharm[] = INCBIN_U32("graphics/items/icons/shiny_charm.4bpp.lz"); +const u32 gItemIcon_ShinyCharm[] = INCBIN_U32("graphics/items/icons/shiny_charm.4bpp.smol"); const u16 gItemIconPalette_ShinyCharm[] = INCBIN_U16("graphics/items/icon_palettes/shiny_charm.gbapal"); -const u32 gItemIcon_CatchingCharm[] = INCBIN_U32("graphics/items/icons/catching_charm.4bpp.lz"); +const u32 gItemIcon_CatchingCharm[] = INCBIN_U32("graphics/items/icons/catching_charm.4bpp.smol"); const u16 gItemIconPalette_CatchingCharm[] = INCBIN_U16("graphics/items/icon_palettes/catching_charm.gbapal"); -const u32 gItemIcon_ExpCharm[] = INCBIN_U32("graphics/items/icons/exp_charm.4bpp.lz"); +const u32 gItemIcon_ExpCharm[] = INCBIN_U32("graphics/items/icons/exp_charm.4bpp.smol"); const u16 gItemIconPalette_ExpCharm[] = INCBIN_U16("graphics/items/icon_palettes/exp_charm.gbapal"); -const u32 gItemIcon_GlimmeringCharm[] = INCBIN_U32("graphics/items/icons/glimmering_charm.4bpp.lz"); +const u32 gItemIcon_GlimmeringCharm[] = INCBIN_U32("graphics/items/icons/glimmering_charm.4bpp.smol"); const u16 gItemIconPalette_GlimmeringCharm[] = INCBIN_U16("graphics/items/icon_palettes/glimmering_charm.gbapal"); // Form-changing Key Items -const u32 gItemIcon_RotomCatalog[] = INCBIN_U32("graphics/items/icons/rotom_catalog.4bpp.lz"); +const u32 gItemIcon_RotomCatalog[] = INCBIN_U32("graphics/items/icons/rotom_catalog.4bpp.smol"); const u16 gItemIconPalette_RotomCatalog[] = INCBIN_U16("graphics/items/icon_palettes/rotom_catalog.gbapal"); -const u32 gItemIcon_Gracidea[] = INCBIN_U32("graphics/items/icons/gracidea.4bpp.lz"); +const u32 gItemIcon_Gracidea[] = INCBIN_U32("graphics/items/icons/gracidea.4bpp.smol"); const u16 gItemIconPalette_Gracidea[] = INCBIN_U16("graphics/items/icon_palettes/gracidea.gbapal"); -const u32 gItemIcon_RevealGlass[] = INCBIN_U32("graphics/items/icons/reveal_glass.4bpp.lz"); +const u32 gItemIcon_RevealGlass[] = INCBIN_U32("graphics/items/icons/reveal_glass.4bpp.smol"); const u16 gItemIconPalette_RevealGlass[] = INCBIN_U16("graphics/items/icon_palettes/reveal_glass.gbapal"); -const u32 gItemIcon_DNASplicers[] = INCBIN_U32("graphics/items/icons/dna_splicers.4bpp.lz"); +const u32 gItemIcon_DNASplicers[] = INCBIN_U32("graphics/items/icons/dna_splicers.4bpp.smol"); const u16 gItemIconPalette_DNASplicers[] = INCBIN_U16("graphics/items/icon_palettes/dna_splicers.gbapal"); -const u32 gItemIcon_ZygardeCube[] = INCBIN_U32("graphics/items/icons/zygarde_cube.4bpp.lz"); +const u32 gItemIcon_ZygardeCube[] = INCBIN_U32("graphics/items/icons/zygarde_cube.4bpp.smol"); const u16 gItemIconPalette_ZygardeCube[] = INCBIN_U16("graphics/items/icon_palettes/zygarde_cube.gbapal"); -const u32 gItemIcon_PrisonBottle[] = INCBIN_U32("graphics/items/icons/prison_bottle.4bpp.lz"); +const u32 gItemIcon_PrisonBottle[] = INCBIN_U32("graphics/items/icons/prison_bottle.4bpp.smol"); const u16 gItemIconPalette_PrisonBottle[] = INCBIN_U16("graphics/items/icon_palettes/prison_bottle.gbapal"); -const u32 gItemIcon_NecrozmaFuser[] = INCBIN_U32("graphics/items/icons/necrozma_fuser.4bpp.lz"); +const u32 gItemIcon_NecrozmaFuser[] = INCBIN_U32("graphics/items/icons/necrozma_fuser.4bpp.smol"); const u16 gItemIconPalette_NSolarizer[] = INCBIN_U16("graphics/items/icon_palettes/n_solarizer.gbapal"); const u16 gItemIconPalette_NLunarizer[] = INCBIN_U16("graphics/items/icon_palettes/n_lunarizer.gbapal"); -const u32 gItemIcon_ReinsOfUnity[] = INCBIN_U32("graphics/items/icons/reins_of_unity.4bpp.lz"); +const u32 gItemIcon_ReinsOfUnity[] = INCBIN_U32("graphics/items/icons/reins_of_unity.4bpp.smol"); const u16 gItemIconPalette_ReinsOfUnity[] = INCBIN_U16("graphics/items/icon_palettes/reins_of_unity.gbapal"); // Battle Mechanic Key Items -const u32 gItemIcon_MegaRing[] = INCBIN_U32("graphics/items/icons/mega_ring.4bpp.lz"); +const u32 gItemIcon_MegaRing[] = INCBIN_U32("graphics/items/icons/mega_ring.4bpp.smol"); const u16 gItemIconPalette_MegaRing[] = INCBIN_U16("graphics/items/icon_palettes/mega_ring.gbapal"); -const u32 gItemIcon_ZPowerRing[] = INCBIN_U32("graphics/items/icons/z_power_ring.4bpp.lz"); +const u32 gItemIcon_ZPowerRing[] = INCBIN_U32("graphics/items/icons/z_power_ring.4bpp.smol"); const u16 gItemIconPalette_ZPowerRing[] = INCBIN_U16("graphics/items/icon_palettes/z_power_ring.gbapal"); -const u32 gItemIcon_ZRing[] = INCBIN_U32("graphics/items/icons/z_ring.4bpp.lz"); // Remove +const u32 gItemIcon_ZRing[] = INCBIN_U32("graphics/items/icons/z_ring.4bpp.smol"); // Remove const u16 gItemIconPalette_ZRing[] = INCBIN_U16("graphics/items/icon_palettes/z_ring.gbapal"); // Remove -const u32 gItemIcon_DynamaxBand[] = INCBIN_U32("graphics/items/icons/dynamax_band.4bpp.lz"); +const u32 gItemIcon_DynamaxBand[] = INCBIN_U32("graphics/items/icons/dynamax_band.4bpp.smol"); const u16 gItemIconPalette_DynamaxBand[] = INCBIN_U16("graphics/items/icon_palettes/dynamax_band.gbapal"); // Misc. Key Items -const u32 gItemIcon_Bicycle[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.lz"); +const u32 gItemIcon_Bicycle[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.smol"); const u16 gItemIconPalette_Bicycle[] = INCBIN_U16("graphics/items/icon_palettes/bicycle.gbapal"); -const u32 gItemIcon_MachBike[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.lz"); +const u32 gItemIcon_MachBike[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.smol"); const u16 gItemIconPalette_MachBike[] = INCBIN_U16("graphics/items/icon_palettes/mach_bike.gbapal"); -const u32 gItemIcon_AcroBike[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.lz"); +const u32 gItemIcon_AcroBike[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.smol"); const u16 gItemIconPalette_AcroBike[] = INCBIN_U16("graphics/items/icon_palettes/acro_bike.gbapal"); -const u32 gItemIcon_OldRod[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.lz"); +const u32 gItemIcon_OldRod[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.smol"); const u16 gItemIconPalette_OldRod[] = INCBIN_U16("graphics/items/icon_palettes/old_rod.gbapal"); -const u32 gItemIcon_GoodRod[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.lz"); +const u32 gItemIcon_GoodRod[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.smol"); const u16 gItemIconPalette_GoodRod[] = INCBIN_U16("graphics/items/icon_palettes/good_rod.gbapal"); -const u32 gItemIcon_SuperRod[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.lz"); +const u32 gItemIcon_SuperRod[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.smol"); const u16 gItemIconPalette_SuperRod[] = INCBIN_U16("graphics/items/icon_palettes/super_rod.gbapal"); -const u32 gItemIcon_DowsingMachine[] = INCBIN_U32("graphics/items/icons/dowsing_machine.4bpp.lz"); +const u32 gItemIcon_DowsingMachine[] = INCBIN_U32("graphics/items/icons/dowsing_machine.4bpp.smol"); const u16 gItemIconPalette_DowsingMachine[] = INCBIN_U16("graphics/items/icon_palettes/dowsing_machine.gbapal"); -const u32 gItemIcon_TownMap[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.lz"); +const u32 gItemIcon_TownMap[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.smol"); const u16 gItemIconPalette_TownMap[] = INCBIN_U16("graphics/items/icon_palettes/town_map.gbapal"); -const u32 gItemIcon_VsSeeker[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.lz"); +const u32 gItemIcon_VsSeeker[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.smol"); const u16 gItemIconPalette_VsSeeker[] = INCBIN_U16("graphics/items/icon_palettes/vs_seeker.gbapal"); -const u32 gItemIcon_TMCase[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.lz"); +const u32 gItemIcon_TMCase[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.smol"); const u16 gItemIconPalette_TMCase[] = INCBIN_U16("graphics/items/icon_palettes/tm_case.gbapal"); -const u32 gItemIcon_BerryPouch[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.lz"); +const u32 gItemIcon_BerryPouch[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.smol"); const u16 gItemIconPalette_BerryPouch[] = INCBIN_U16("graphics/items/icon_palettes/berry_pouch.gbapal"); -const u32 gItemIcon_PokemonBoxLink[] = INCBIN_U32("graphics/items/icons/pokemon_box_link.4bpp.lz"); +const u32 gItemIcon_PokemonBoxLink[] = INCBIN_U32("graphics/items/icons/pokemon_box_link.4bpp.smol"); const u16 gItemIconPalette_PokemonBoxLink[] = INCBIN_U16("graphics/items/icon_palettes/pokemon_box_link.gbapal"); -const u32 gItemIcon_CoinCase[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.lz"); +const u32 gItemIcon_CoinCase[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.smol"); const u16 gItemIconPalette_CoinCase[] = INCBIN_U16("graphics/items/icon_palettes/coin_case.gbapal"); -const u32 gItemIcon_PowderJar[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.lz"); +const u32 gItemIcon_PowderJar[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.smol"); const u16 gItemIconPalette_PowderJar[] = INCBIN_U16("graphics/items/icon_palettes/powder_jar.gbapal"); -const u32 gItemIcon_WailmerPail[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.lz"); +const u32 gItemIcon_WailmerPail[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.smol"); const u16 gItemIconPalette_WailmerPail[] = INCBIN_U16("graphics/items/icon_palettes/wailmer_pail.gbapal"); -const u32 gItemIcon_PokeRadar[] = INCBIN_U32("graphics/items/icons/poke_radar.4bpp.lz"); +const u32 gItemIcon_PokeRadar[] = INCBIN_U32("graphics/items/icons/poke_radar.4bpp.smol"); const u16 gItemIconPalette_PokeRadar[] = INCBIN_U16("graphics/items/icon_palettes/poke_radar.gbapal"); -const u32 gItemIcon_PokeblockCase[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.lz"); +const u32 gItemIcon_PokeblockCase[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.smol"); const u16 gItemIconPalette_PokeblockCase[] = INCBIN_U16("graphics/items/icon_palettes/pokeblock_case.gbapal"); -const u32 gItemIcon_SootSack[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.lz"); +const u32 gItemIcon_SootSack[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.smol"); const u16 gItemIconPalette_SootSack[] = INCBIN_U16("graphics/items/icon_palettes/soot_sack.gbapal"); -const u32 gItemIcon_PokeFlute[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.lz"); +const u32 gItemIcon_PokeFlute[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.smol"); const u16 gItemIconPalette_PokeFlute[] = INCBIN_U16("graphics/items/icon_palettes/poke_flute.gbapal"); -const u32 gItemIcon_FameChecker[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.lz"); +const u32 gItemIcon_FameChecker[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.smol"); const u16 gItemIconPalette_FameChecker[] = INCBIN_U16("graphics/items/icon_palettes/fame_checker.gbapal"); -const u32 gItemIcon_TeachyTV[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.lz"); +const u32 gItemIcon_TeachyTV[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.smol"); const u16 gItemIconPalette_TeachyTV[] = INCBIN_U16("graphics/items/icon_palettes/teachy_tv.gbapal"); // Story Key Items -const u32 gItemIcon_SSTicket[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.lz"); +const u32 gItemIcon_SSTicket[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.smol"); const u16 gItemIconPalette_SSTicket[] = INCBIN_U16("graphics/items/icon_palettes/ss_ticket.gbapal"); -const u32 gItemIcon_EonTicket[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.lz"); +const u32 gItemIcon_EonTicket[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.smol"); const u16 gItemIconPalette_EonTicket[] = INCBIN_U16("graphics/items/icon_palettes/eon_ticket.gbapal"); -const u32 gItemIcon_MysticTicket[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.lz"); +const u32 gItemIcon_MysticTicket[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.smol"); const u16 gItemIconPalette_MysticTicket[] = INCBIN_U16("graphics/items/icon_palettes/mystic_ticket.gbapal"); -const u32 gItemIcon_AuroraTicket[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.lz"); +const u32 gItemIcon_AuroraTicket[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.smol"); const u16 gItemIconPalette_AuroraTicket[] = INCBIN_U16("graphics/items/icon_palettes/aurora_ticket.gbapal"); -const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.lz"); +const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.smol"); const u16 gItemIconPalette_OldSeaMap[] = INCBIN_U16("graphics/items/icon_palettes/old_sea_map.gbapal"); -const u32 gItemIcon_Letter[] = INCBIN_U32("graphics/items/icons/letter.4bpp.lz"); +const u32 gItemIcon_Letter[] = INCBIN_U32("graphics/items/icons/letter.4bpp.smol"); -const u32 gItemIcon_DevonParts[] = INCBIN_U32("graphics/items/icons/devon_parts.4bpp.lz"); +const u32 gItemIcon_DevonParts[] = INCBIN_U32("graphics/items/icons/devon_parts.4bpp.smol"); const u16 gItemIconPalette_DevonParts[] = INCBIN_U16("graphics/items/icon_palettes/devon_parts.gbapal"); -const u32 gItemIcon_GoGoggles[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.lz"); +const u32 gItemIcon_GoGoggles[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.smol"); const u16 gItemIconPalette_GoGoggles[] = INCBIN_U16("graphics/items/icon_palettes/go_goggles.gbapal"); -const u32 gItemIcon_DevonScope[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.lz"); +const u32 gItemIcon_DevonScope[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.smol"); const u16 gItemIconPalette_DevonScope[] = INCBIN_U16("graphics/items/icon_palettes/devon_scope.gbapal"); -const u32 gItemIcon_BasementKey[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.lz"); +const u32 gItemIcon_BasementKey[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.smol"); const u16 gItemIconPalette_OldKey[] = INCBIN_U16("graphics/items/icon_palettes/old_key.gbapal"); -const u32 gItemIcon_Scanner[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.lz"); +const u32 gItemIcon_Scanner[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.smol"); const u16 gItemIconPalette_Scanner[] = INCBIN_U16("graphics/items/icon_palettes/scanner.gbapal"); -const u32 gItemIcon_StorageKey[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.lz"); +const u32 gItemIcon_StorageKey[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.smol"); -const u32 gItemIcon_KeyToRoom1[] = INCBIN_U32("graphics/items/icons/key_to_room_1.4bpp.lz"); +const u32 gItemIcon_KeyToRoom1[] = INCBIN_U32("graphics/items/icons/key_to_room_1.4bpp.smol"); const u16 gItemIconPalette_Key[] = INCBIN_U16("graphics/items/icon_palettes/key.gbapal"); -const u32 gItemIcon_KeyToRoom2[] = INCBIN_U32("graphics/items/icons/key_to_room_2.4bpp.lz"); +const u32 gItemIcon_KeyToRoom2[] = INCBIN_U32("graphics/items/icons/key_to_room_2.4bpp.smol"); -const u32 gItemIcon_KeyToRoom4[] = INCBIN_U32("graphics/items/icons/key_to_room_4.4bpp.lz"); +const u32 gItemIcon_KeyToRoom4[] = INCBIN_U32("graphics/items/icons/key_to_room_4.4bpp.smol"); -const u32 gItemIcon_KeyToRoom6[] = INCBIN_U32("graphics/items/icons/key_to_room_6.4bpp.lz"); +const u32 gItemIcon_KeyToRoom6[] = INCBIN_U32("graphics/items/icons/key_to_room_6.4bpp.smol"); -const u32 gItemIcon_Meteorite[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.lz"); +const u32 gItemIcon_Meteorite[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.smol"); const u16 gItemIconPalette_Meteorite[] = INCBIN_U16("graphics/items/icon_palettes/meteorite.gbapal"); -const u32 gItemIcon_MagmaEmblem[] = INCBIN_U32("graphics/items/icons/magma_emblem.4bpp.lz"); +const u32 gItemIcon_MagmaEmblem[] = INCBIN_U32("graphics/items/icons/magma_emblem.4bpp.smol"); const u16 gItemIconPalette_MagmaEmblem[] = INCBIN_U16("graphics/items/icon_palettes/magma_emblem.gbapal"); -const u32 gItemIcon_ContestPass[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.lz"); +const u32 gItemIcon_ContestPass[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.smol"); const u16 gItemIconPalette_ContestPass[] = INCBIN_U16("graphics/items/icon_palettes/contest_pass.gbapal"); -const u32 gItemIcon_Parcel[] = INCBIN_U32("graphics/items/icons/parcel.4bpp.lz"); +const u32 gItemIcon_Parcel[] = INCBIN_U32("graphics/items/icons/parcel.4bpp.smol"); const u16 gItemIconPalette_Parcel[] = INCBIN_U16("graphics/items/icon_palettes/parcel.gbapal"); -const u32 gItemIcon_SecretKey[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.lz"); +const u32 gItemIcon_SecretKey[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.smol"); const u16 gItemIconPalette_SecretKey[] = INCBIN_U16("graphics/items/icon_palettes/secret_key.gbapal"); -const u32 gItemIcon_BikeVoucher[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.lz"); +const u32 gItemIcon_BikeVoucher[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.smol"); const u16 gItemIconPalette_BikeVoucher[] = INCBIN_U16("graphics/items/icon_palettes/bike_voucher.gbapal"); -const u32 gItemIcon_GoldTeeth[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.lz"); +const u32 gItemIcon_GoldTeeth[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.smol"); const u16 gItemIconPalette_GoldTeeth[] = INCBIN_U16("graphics/items/icon_palettes/gold_teeth.gbapal"); -const u32 gItemIcon_CardKey[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.lz"); +const u32 gItemIcon_CardKey[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.smol"); const u16 gItemIconPalette_CardKey[] = INCBIN_U16("graphics/items/icon_palettes/card_key.gbapal"); -const u32 gItemIcon_LiftKey[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.lz"); +const u32 gItemIcon_LiftKey[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.smol"); -const u32 gItemIcon_SilphScope[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.lz"); +const u32 gItemIcon_SilphScope[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.smol"); const u16 gItemIconPalette_SilphScope[] = INCBIN_U16("graphics/items/icon_palettes/silph_scope.gbapal"); -const u32 gItemIcon_TriPass[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.lz"); +const u32 gItemIcon_TriPass[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.smol"); const u16 gItemIconPalette_TriPass[] = INCBIN_U16("graphics/items/icon_palettes/tri_pass.gbapal"); -const u32 gItemIcon_RainbowPass[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.lz"); +const u32 gItemIcon_RainbowPass[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.smol"); const u16 gItemIconPalette_RainbowPass[] = INCBIN_U16("graphics/items/icon_palettes/rainbow_pass.gbapal"); -const u32 gItemIcon_Tea[] = INCBIN_U32("graphics/items/icons/tea.4bpp.lz"); +const u32 gItemIcon_Tea[] = INCBIN_U32("graphics/items/icons/tea.4bpp.smol"); const u16 gItemIconPalette_Tea[] = INCBIN_U16("graphics/items/icon_palettes/tea.gbapal"); -const u32 gItemIcon_Gem[] = INCBIN_U32("graphics/items/icons/gem.4bpp.lz"); +const u32 gItemIcon_Gem[] = INCBIN_U32("graphics/items/icons/gem.4bpp.smol"); const u16 gItemIconPalette_Ruby[] = INCBIN_U16("graphics/items/icon_palettes/ruby.gbapal"); const u16 gItemIconPalette_Sapphire[] = INCBIN_U16("graphics/items/icon_palettes/sapphire.gbapal"); -const u32 gItemIcon_AbilityShield[] = INCBIN_U32("graphics/items/icons/ability_shield.4bpp.lz"); +const u32 gItemIcon_AbilityShield[] = INCBIN_U32("graphics/items/icons/ability_shield.4bpp.smol"); const u16 gItemIconPalette_AbilityShield[] = INCBIN_U16("graphics/items/icon_palettes/ability_shield.gbapal"); -const u32 gItemIcon_ClearAmulet[] = INCBIN_U32("graphics/items/icons/clear_amulet.4bpp.lz"); +const u32 gItemIcon_ClearAmulet[] = INCBIN_U32("graphics/items/icons/clear_amulet.4bpp.smol"); const u16 gItemIconPalette_ClearAmulet[] = INCBIN_U16("graphics/items/icon_palettes/clear_amulet.gbapal"); -const u32 gItemIcon_PunchingGlove[] = INCBIN_U32("graphics/items/icons/punching_glove.4bpp.lz"); +const u32 gItemIcon_PunchingGlove[] = INCBIN_U32("graphics/items/icons/punching_glove.4bpp.smol"); const u16 gItemIconPalette_PunchingGlove[] = INCBIN_U16("graphics/items/icon_palettes/punching_glove.gbapal"); -const u32 gItemIcon_CovertCloak[] = INCBIN_U32("graphics/items/icons/covert_cloak.4bpp.lz"); +const u32 gItemIcon_CovertCloak[] = INCBIN_U32("graphics/items/icons/covert_cloak.4bpp.smol"); const u16 gItemIconPalette_CovertCloak[] = INCBIN_U16("graphics/items/icon_palettes/covert_cloak.gbapal"); -const u32 gItemIcon_LoadedDice[] = INCBIN_U32("graphics/items/icons/loaded_dice.4bpp.lz"); +const u32 gItemIcon_LoadedDice[] = INCBIN_U32("graphics/items/icons/loaded_dice.4bpp.smol"); const u16 gItemIconPalette_LoadedDice[] = INCBIN_U16("graphics/items/icon_palettes/loaded_dice.gbapal"); -const u32 gItemIcon_AuspiciousArmor[] = INCBIN_U32("graphics/items/icons/auspicious_armor.4bpp.lz"); +const u32 gItemIcon_AuspiciousArmor[] = INCBIN_U32("graphics/items/icons/auspicious_armor.4bpp.smol"); const u16 gItemIconPalette_AuspiciousArmor[] = INCBIN_U16("graphics/items/icon_palettes/auspicious_armor.gbapal"); -const u32 gItemIcon_BigBambooShoot[] = INCBIN_U32("graphics/items/icons/big_bamboo_shoot.4bpp.lz"); +const u32 gItemIcon_BigBambooShoot[] = INCBIN_U32("graphics/items/icons/big_bamboo_shoot.4bpp.smol"); const u16 gItemIconPalette_BigBambooShoot[] = INCBIN_U16("graphics/items/icon_palettes/big_bamboo_shoot.gbapal"); -const u32 gItemIcon_BoosterEnergy[] = INCBIN_U32("graphics/items/icons/booster_energy.4bpp.lz"); +const u32 gItemIcon_BoosterEnergy[] = INCBIN_U32("graphics/items/icons/booster_energy.4bpp.smol"); const u16 gItemIconPalette_BoosterEnergy[] = INCBIN_U16("graphics/items/icon_palettes/booster_energy.gbapal"); -const u32 gItemIcon_GimmighoulCoin[] = INCBIN_U32("graphics/items/icons/gimmighoul_coin.4bpp.lz"); +const u32 gItemIcon_GimmighoulCoin[] = INCBIN_U32("graphics/items/icons/gimmighoul_coin.4bpp.smol"); const u16 gItemIconPalette_GimmighoulCoin[] = INCBIN_U16("graphics/items/icon_palettes/gimmighoul_coin.gbapal"); -const u32 gItemIcon_LeadersCrest[] = INCBIN_U32("graphics/items/icons/leaders_crest.4bpp.lz"); +const u32 gItemIcon_LeadersCrest[] = INCBIN_U32("graphics/items/icons/leaders_crest.4bpp.smol"); const u16 gItemIconPalette_LeadersCrest[] = INCBIN_U16("graphics/items/icon_palettes/leaders_crest.gbapal"); -const u32 gItemIcon_MaliciousArmor[] = INCBIN_U32("graphics/items/icons/malicious_armor.4bpp.lz"); +const u32 gItemIcon_MaliciousArmor[] = INCBIN_U32("graphics/items/icons/malicious_armor.4bpp.smol"); const u16 gItemIconPalette_MaliciousArmor[] = INCBIN_U16("graphics/items/icon_palettes/malicious_armor.gbapal"); -const u32 gItemIcon_MirrorHerb[] = INCBIN_U32("graphics/items/icons/mirror_herb.4bpp.lz"); +const u32 gItemIcon_MirrorHerb[] = INCBIN_U32("graphics/items/icons/mirror_herb.4bpp.smol"); const u16 gItemIconPalette_MirrorHerb[] = INCBIN_U16("graphics/items/icon_palettes/mirror_herb.gbapal"); -const u32 gItemIcon_ScrollOfDarkness[] = INCBIN_U32("graphics/items/icons/scroll_of_darkness.4bpp.lz"); +const u32 gItemIcon_ScrollOfDarkness[] = INCBIN_U32("graphics/items/icons/scroll_of_darkness.4bpp.smol"); const u16 gItemIconPalette_ScrollOfDarkness[] = INCBIN_U16("graphics/items/icon_palettes/scroll_of_darkness.gbapal"); -const u32 gItemIcon_ScrollOfWaters[] = INCBIN_U32("graphics/items/icons/scroll_of_waters.4bpp.lz"); +const u32 gItemIcon_ScrollOfWaters[] = INCBIN_U32("graphics/items/icons/scroll_of_waters.4bpp.smol"); const u16 gItemIconPalette_ScrollOfWaters[] = INCBIN_U16("graphics/items/icon_palettes/scroll_of_waters.gbapal"); -const u32 gItemIcon_TeraOrb[] = INCBIN_U32("graphics/items/icons/tera_orb.4bpp.lz"); +const u32 gItemIcon_TeraOrb[] = INCBIN_U32("graphics/items/icons/tera_orb.4bpp.smol"); const u16 gItemIconPalette_TeraOrb[] = INCBIN_U16("graphics/items/icon_palettes/tera_orb.gbapal"); -const u32 gItemIcon_TinyBambooShoot[] = INCBIN_U32("graphics/items/icons/tiny_bamboo_shoot.4bpp.lz"); +const u32 gItemIcon_TinyBambooShoot[] = INCBIN_U32("graphics/items/icons/tiny_bamboo_shoot.4bpp.smol"); const u16 gItemIconPalette_TinyBambooShoot[] = INCBIN_U16("graphics/items/icon_palettes/tiny_bamboo_shoot.gbapal"); // Tera Shards -const u32 gItemIcon_TeraShard[] = INCBIN_U32("graphics/items/icons/tera_shard.4bpp.lz"); +const u32 gItemIcon_TeraShard[] = INCBIN_U32("graphics/items/icons/tera_shard.4bpp.smol"); const u16 gItemIconPalette_NormalTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/normal_tera_shard.gbapal"); const u16 gItemIconPalette_FireTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/fire_tera_shard.gbapal"); const u16 gItemIconPalette_WaterTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/water_tera_shard.gbapal"); @@ -2028,12 +2028,12 @@ const u16 gItemIconPalette_DragonTeraShard[] = INCBIN_U16("graphics/items/icon_p const u16 gItemIconPalette_SteelTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/steel_tera_shard.gbapal"); const u16 gItemIconPalette_FairyTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/fairy_tera_shard.gbapal"); -const u32 gItemIcon_StellarTeraShard[] = INCBIN_U32("graphics/items/icons/stellar_tera_shard.4bpp.lz"); +const u32 gItemIcon_StellarTeraShard[] = INCBIN_U32("graphics/items/icons/stellar_tera_shard.4bpp.smol"); const u16 gItemIconPalette_StellarTeraShard[] = INCBIN_U16("graphics/items/icon_palettes/stellar_tera_shard.gbapal"); // Mochi -const u32 gItemIcon_Mochi[] = INCBIN_U32("graphics/items/icons/mochi.4bpp.lz"); +const u32 gItemIcon_Mochi[] = INCBIN_U32("graphics/items/icons/mochi.4bpp.smol"); const u16 gItemIconPalette_HealthMochi[] = INCBIN_U16("graphics/items/icon_palettes/health_mochi.gbapal"); const u16 gItemIconPalette_MuscleMochi[] = INCBIN_U16("graphics/items/icon_palettes/muscle_mochi.gbapal"); const u16 gItemIconPalette_ResistMochi[] = INCBIN_U16("graphics/items/icon_palettes/resist_mochi.gbapal"); @@ -2044,58 +2044,58 @@ const u16 gItemIconPalette_FreshStartMochi[] = INCBIN_U16("graphics/items/icon_p // Ogerpon masks -const u32 gItemIcon_WellspringMask[] = INCBIN_U32("graphics/items/icons/wellspring_mask.4bpp.lz"); +const u32 gItemIcon_WellspringMask[] = INCBIN_U32("graphics/items/icons/wellspring_mask.4bpp.smol"); const u16 gItemIconPalette_WellspringMask[] = INCBIN_U16("graphics/items/icon_palettes/wellspring_mask.gbapal"); -const u32 gItemIcon_HearthflameMask[] = INCBIN_U32("graphics/items/icons/hearthflame_mask.4bpp.lz"); +const u32 gItemIcon_HearthflameMask[] = INCBIN_U32("graphics/items/icons/hearthflame_mask.4bpp.smol"); const u16 gItemIconPalette_HearthflameMask[] = INCBIN_U16("graphics/items/icon_palettes/hearthflame_mask.gbapal"); -const u32 gItemIcon_CornerstoneMask[] = INCBIN_U32("graphics/items/icons/cornerstone_mask.4bpp.lz"); +const u32 gItemIcon_CornerstoneMask[] = INCBIN_U32("graphics/items/icons/cornerstone_mask.4bpp.smol"); const u16 gItemIconPalette_CornerstoneMask[] = INCBIN_U16("graphics/items/icon_palettes/cornerstone_mask.gbapal"); // Misc. Items -const u32 gItemIcon_AdamantCrystal[] = INCBIN_U32("graphics/items/icons/adamant_crystal.4bpp.lz"); +const u32 gItemIcon_AdamantCrystal[] = INCBIN_U32("graphics/items/icons/adamant_crystal.4bpp.smol"); const u16 gItemIconPalette_AdamantCrystal[] = INCBIN_U16("graphics/items/icon_palettes/adamant_crystal.gbapal"); -const u32 gItemIcon_GriseousCore[] = INCBIN_U32("graphics/items/icons/griseous_core.4bpp.lz"); +const u32 gItemIcon_GriseousCore[] = INCBIN_U32("graphics/items/icons/griseous_core.4bpp.smol"); const u16 gItemIconPalette_GriseousCore[] = INCBIN_U16("graphics/items/icon_palettes/griseous_core.gbapal"); -const u32 gItemIcon_LustrousGlobe[] = INCBIN_U32("graphics/items/icons/lustrous_globe.4bpp.lz"); +const u32 gItemIcon_LustrousGlobe[] = INCBIN_U32("graphics/items/icons/lustrous_globe.4bpp.smol"); const u16 gItemIconPalette_LustrousGlobe[] = INCBIN_U16("graphics/items/icon_palettes/lustrous_globe.gbapal"); -const u32 gItemIcon_BerserkGene[] = INCBIN_U32("graphics/items/icons/berserk_gene.4bpp.lz"); +const u32 gItemIcon_BerserkGene[] = INCBIN_U32("graphics/items/icons/berserk_gene.4bpp.smol"); const u16 gItemIconPalette_BerserkGene[] = INCBIN_U16("graphics/items/icon_palettes/berserk_gene.gbapal"); -const u32 gItemIcon_FairyFeather[] = INCBIN_U32("graphics/items/icons/fairy_feather.4bpp.lz"); +const u32 gItemIcon_FairyFeather[] = INCBIN_U32("graphics/items/icons/fairy_feather.4bpp.smol"); const u16 gItemIconPalette_FairyFeather[] = INCBIN_U16("graphics/items/icon_palettes/fairy_feather.gbapal"); -const u32 gItemIcon_Remedy[] = INCBIN_U32("graphics/items/icons/remedy.4bpp.lz"); +const u32 gItemIcon_Remedy[] = INCBIN_U32("graphics/items/icons/remedy.4bpp.smol"); const u16 gItemIconPalette_Remedy[] = INCBIN_U16("graphics/items/icon_palettes/remedy.gbapal"); -const u32 gItemIcon_FineRemedy[] = INCBIN_U32("graphics/items/icons/fine_remedy.4bpp.lz"); +const u32 gItemIcon_FineRemedy[] = INCBIN_U32("graphics/items/icons/fine_remedy.4bpp.smol"); const u16 gItemIconPalette_FineRemedy[] = INCBIN_U16("graphics/items/icon_palettes/fine_remedy.gbapal"); -const u32 gItemIcon_SuperbRemedy[] = INCBIN_U32("graphics/items/icons/superb_remedy.4bpp.lz"); +const u32 gItemIcon_SuperbRemedy[] = INCBIN_U32("graphics/items/icons/superb_remedy.4bpp.smol"); const u16 gItemIconPalette_SuperbRemedy[] = INCBIN_U16("graphics/items/icon_palettes/superb_remedy.gbapal"); -const u32 gItemIcon_AuxBottle[] = INCBIN_U32("graphics/items/icons/aux_bottle.4bpp.lz"); +const u32 gItemIcon_AuxBottle[] = INCBIN_U32("graphics/items/icons/aux_bottle.4bpp.smol"); const u16 gItemIconPalette_AuxEvasion[] = INCBIN_U16("graphics/items/icon_palettes/aux_evasion.gbapal"); const u16 gItemIconPalette_AuxGuard[] = INCBIN_U16("graphics/items/icon_palettes/aux_guard.gbapal"); const u16 gItemIconPalette_AuxPower[] = INCBIN_U16("graphics/items/icon_palettes/aux_power.gbapal"); -const u32 gItemIcon_AuxPowerguard[] = INCBIN_U32("graphics/items/icons/aux_powerguard.4bpp.lz"); +const u32 gItemIcon_AuxPowerguard[] = INCBIN_U32("graphics/items/icons/aux_powerguard.4bpp.smol"); const u16 gItemIconPalette_AuxPowerguard[] = INCBIN_U16("graphics/items/icon_palettes/aux_powerguard.gbapal"); -const u32 gItemIcon_ChoiceDumpling[] = INCBIN_U32("graphics/items/icons/choice_dumpling.4bpp.lz"); +const u32 gItemIcon_ChoiceDumpling[] = INCBIN_U32("graphics/items/icons/choice_dumpling.4bpp.smol"); const u16 gItemIconPalette_ChoiceDumpling[] = INCBIN_U16("graphics/items/icon_palettes/choice_dumpling.gbapal"); -const u32 gItemIcon_JubilifeMuffin[] = INCBIN_U32("graphics/items/icons/jubilife_muffin.4bpp.lz"); +const u32 gItemIcon_JubilifeMuffin[] = INCBIN_U32("graphics/items/icons/jubilife_muffin.4bpp.smol"); const u16 gItemIconPalette_JubilifeMuffin[] = INCBIN_U16("graphics/items/icon_palettes/jubilife_muffin.gbapal"); -const u32 gItemIcon_PokeshiDoll[] = INCBIN_U32("graphics/items/icons/pokeshi_doll.4bpp.lz"); +const u32 gItemIcon_PokeshiDoll[] = INCBIN_U32("graphics/items/icons/pokeshi_doll.4bpp.smol"); const u16 gItemIconPalette_PokeshiDoll[] = INCBIN_U16("graphics/items/icon_palettes/pokeshi_doll.gbapal"); -const u32 gItemIcon_SwapSnack[] = INCBIN_U32("graphics/items/icons/swap_snack.4bpp.lz"); +const u32 gItemIcon_SwapSnack[] = INCBIN_U32("graphics/items/icons/swap_snack.4bpp.smol"); const u16 gItemIconPalette_SwapSnack[] = INCBIN_U16("graphics/items/icon_palettes/swap_snack.gbapal"); -const u32 gItemIcon_TwiceSpicedRadish[] = INCBIN_U32("graphics/items/icons/twice_spiced_radish.4bpp.lz"); +const u32 gItemIcon_TwiceSpicedRadish[] = INCBIN_U32("graphics/items/icons/twice_spiced_radish.4bpp.smol"); const u16 gItemIconPalette_TwiceSpicedRadish[] = INCBIN_U16("graphics/items/icon_palettes/twice_spiced_radish.gbapal"); diff --git a/src/data/graphics/mail.h b/src/data/graphics/mail.h index 05e65be1c1..21e5af4fa2 100644 --- a/src/data/graphics/mail.h +++ b/src/data/graphics/mail.h @@ -11,28 +11,28 @@ const u16 gMailPalette_Dream[] = INCBIN_U16("graphics/mail/dream/palette.gbapal" const u16 gMailPalette_Fab[] = INCBIN_U16("graphics/mail/fab/palette.gbapal"); const u16 gMailPalette_Retro[] = INCBIN_U16("graphics/mail/retro/palette.gbapal"); -const u32 gMailTiles_Orange[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.lz"); -const u32 gMailTiles_Harbor[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.lz"); -const u32 gMailTiles_Glitter[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.lz"); -const u32 gMailTiles_Mech[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.lz"); -const u32 gMailTiles_Wood[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.lz"); -const u32 gMailTiles_Wave[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.lz"); -const u32 gMailTiles_Bead[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.lz"); -const u32 gMailTiles_Shadow[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.lz"); -const u32 gMailTiles_Tropic[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.lz"); -const u32 gMailTiles_Dream[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.lz"); -const u32 gMailTiles_Fab[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.lz"); -const u32 gMailTiles_Retro[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.lz"); +const u32 gMailTiles_Orange[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.smol"); +const u32 gMailTiles_Harbor[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.smol"); +const u32 gMailTiles_Glitter[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.smol"); +const u32 gMailTiles_Mech[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.smol"); +const u32 gMailTiles_Wood[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.smol"); +const u32 gMailTiles_Wave[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.smol"); +const u32 gMailTiles_Bead[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.smol"); +const u32 gMailTiles_Shadow[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.smol"); +const u32 gMailTiles_Tropic[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.smol"); +const u32 gMailTiles_Dream[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.smol"); +const u32 gMailTiles_Fab[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.smol"); +const u32 gMailTiles_Retro[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.smol"); -const u32 gMailTilemap_Orange[] = INCBIN_U32("graphics/mail/orange/map.bin.lz"); -const u32 gMailTilemap_Harbor[] = INCBIN_U32("graphics/mail/harbor/map.bin.lz"); -const u32 gMailTilemap_Glitter[] = INCBIN_U32("graphics/mail/glitter/map.bin.lz"); -const u32 gMailTilemap_Mech[] = INCBIN_U32("graphics/mail/mech/map.bin.lz"); -const u32 gMailTilemap_Wood[] = INCBIN_U32("graphics/mail/wood/map.bin.lz"); -const u32 gMailTilemap_Wave[] = INCBIN_U32("graphics/mail/wave/map.bin.lz"); -const u32 gMailTilemap_Bead[] = INCBIN_U32("graphics/mail/bead/map.bin.lz"); -const u32 gMailTilemap_Shadow[] = INCBIN_U32("graphics/mail/shadow/map.bin.lz"); -const u32 gMailTilemap_Tropic[] = INCBIN_U32("graphics/mail/tropic/map.bin.lz"); -const u32 gMailTilemap_Dream[] = INCBIN_U32("graphics/mail/dream/map.bin.lz"); -const u32 gMailTilemap_Fab[] = INCBIN_U32("graphics/mail/fab/map.bin.lz"); -const u32 gMailTilemap_Retro[] = INCBIN_U32("graphics/mail/retro/map.bin.lz"); +const u32 gMailTilemap_Orange[] = INCBIN_U32("graphics/mail/orange/map.bin.smolTM"); +const u32 gMailTilemap_Harbor[] = INCBIN_U32("graphics/mail/harbor/map.bin.smolTM"); +const u32 gMailTilemap_Glitter[] = INCBIN_U32("graphics/mail/glitter/map.bin.smolTM"); +const u32 gMailTilemap_Mech[] = INCBIN_U32("graphics/mail/mech/map.bin.smolTM"); +const u32 gMailTilemap_Wood[] = INCBIN_U32("graphics/mail/wood/map.bin.smolTM"); +const u32 gMailTilemap_Wave[] = INCBIN_U32("graphics/mail/wave/map.bin.smolTM"); +const u32 gMailTilemap_Bead[] = INCBIN_U32("graphics/mail/bead/map.bin.smolTM"); +const u32 gMailTilemap_Shadow[] = INCBIN_U32("graphics/mail/shadow/map.bin.smolTM"); +const u32 gMailTilemap_Tropic[] = INCBIN_U32("graphics/mail/tropic/map.bin.smolTM"); +const u32 gMailTilemap_Dream[] = INCBIN_U32("graphics/mail/dream/map.bin.smolTM"); +const u32 gMailTilemap_Fab[] = INCBIN_U32("graphics/mail/fab/map.bin.smolTM"); +const u32 gMailTilemap_Retro[] = INCBIN_U32("graphics/mail/retro/map.bin.smolTM"); diff --git a/src/data/graphics/pokeballs.h b/src/data/graphics/pokeballs.h index 8ea57defe5..07b04131bc 100644 --- a/src/data/graphics/pokeballs.h +++ b/src/data/graphics/pokeballs.h @@ -1,85 +1,85 @@ -const u32 gBallGfx_Strange[] = INCBIN_U32("graphics/balls/strange.4bpp.lz"); +const u32 gBallGfx_Strange[] = INCBIN_U32("graphics/balls/strange.4bpp.smol"); const u16 gBallPal_Strange[] = INCBIN_U16("graphics/balls/strange.gbapal"); -const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.lz"); +const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.smol"); const u16 gBallPal_Poke[] = INCBIN_U16("graphics/balls/poke.gbapal"); -const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.lz"); +const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.smol"); const u16 gBallPal_Great[] = INCBIN_U16("graphics/balls/great.gbapal"); -const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.lz"); +const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.smol"); const u16 gBallPal_Ultra[] = INCBIN_U16("graphics/balls/ultra.gbapal"); -const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.lz"); +const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.smol"); const u16 gBallPal_Master[] = INCBIN_U16("graphics/balls/master.gbapal"); -const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.lz"); +const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.smol"); const u16 gBallPal_Premier[] = INCBIN_U16("graphics/balls/premier.gbapal"); -const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.lz"); +const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.smol"); const u16 gBallPal_Heal[] = INCBIN_U16("graphics/balls/heal.gbapal"); -const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.lz"); +const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.smol"); const u16 gBallPal_Net[] = INCBIN_U16("graphics/balls/net.gbapal"); -const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.lz"); +const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.smol"); const u16 gBallPal_Nest[] = INCBIN_U16("graphics/balls/nest.gbapal"); -const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.lz"); +const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.smol"); const u16 gBallPal_Dive[] = INCBIN_U16("graphics/balls/dive.gbapal"); -const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.lz"); +const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.smol"); const u16 gBallPal_Dusk[] = INCBIN_U16("graphics/balls/dusk.gbapal"); -const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.lz"); +const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.smol"); const u16 gBallPal_Timer[] = INCBIN_U16("graphics/balls/timer.gbapal"); -const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.lz"); +const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.smol"); const u16 gBallPal_Quick[] = INCBIN_U16("graphics/balls/quick.gbapal"); -const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.lz"); +const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.smol"); const u16 gBallPal_Repeat[] = INCBIN_U16("graphics/balls/repeat.gbapal"); -const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.lz"); +const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.smol"); const u16 gBallPal_Luxury[] = INCBIN_U16("graphics/balls/luxury.gbapal"); -const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.lz"); +const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.smol"); const u16 gBallPal_Level[] = INCBIN_U16("graphics/balls/level.gbapal"); -const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.lz"); +const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.smol"); const u16 gBallPal_Lure[] = INCBIN_U16("graphics/balls/lure.gbapal"); -const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.lz"); +const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.smol"); const u16 gBallPal_Moon[] = INCBIN_U16("graphics/balls/moon.gbapal"); -const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.lz"); +const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.smol"); const u16 gBallPal_Friend[] = INCBIN_U16("graphics/balls/friend.gbapal"); -const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.lz"); +const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.smol"); const u16 gBallPal_Love[] = INCBIN_U16("graphics/balls/love.gbapal"); -const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.lz"); +const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.smol"); const u16 gBallPal_Fast[] = INCBIN_U16("graphics/balls/fast.gbapal"); -const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.lz"); +const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.smol"); const u16 gBallPal_Heavy[] = INCBIN_U16("graphics/balls/heavy.gbapal"); -const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.lz"); +const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.smol"); const u16 gBallPal_Dream[] = INCBIN_U16("graphics/balls/dream.gbapal"); -const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.lz"); +const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.smol"); const u16 gBallPal_Safari[] = INCBIN_U16("graphics/balls/safari.gbapal"); -const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.lz"); +const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.smol"); const u16 gBallPal_Sport[] = INCBIN_U16("graphics/balls/sport.gbapal"); -const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.lz"); +const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.smol"); const u16 gBallPal_Park[] = INCBIN_U16("graphics/balls/park.gbapal"); -const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.lz"); +const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.smol"); const u16 gBallPal_Beast[] = INCBIN_U16("graphics/balls/beast.gbapal"); -const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.lz"); +const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.smol"); const u16 gBallPal_Cherish[] = INCBIN_U16("graphics/balls/cherish.gbapal"); -const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.lz"); +const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.smol"); diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index c04b914736..74b3a98229 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -4,8 +4,8 @@ #define INCBIN_COMP INCBIN_U32 #endif -const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/anim_front.4bpp.lz"); -const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.lz"); +const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/anim_front.4bpp.smol"); +const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.smol"); const u16 gMonPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/question_mark/circled/normal.gbapal"); const u16 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/question_mark/circled/shiny.gbapal"); const u8 gMonIcon_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/icon.4bpp"); @@ -20,14 +20,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BULBASAUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp.smol"); const u16 gMonPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/normal.gbapal"); - const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.lz"); + const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.smol"); const u16 gMonShinyPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/normal_gba.gbapal"); - const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bulbasaur[] = INCBIN_U16("graphics/pokemon/bulbasaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -47,14 +47,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front.4bpp.smol"); const u16 gMonPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/normal.gbapal"); - const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.lz"); + const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.smol"); const u16 gMonShinyPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/normal_gba.gbapal"); - const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ivysaur[] = INCBIN_U16("graphics/pokemon/ivysaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -74,14 +74,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front.4bpp.smol"); const u16 gMonPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/normal.gbapal"); - const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.lz"); + const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.smol"); const u16 gMonShinyPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/shiny.gbapal"); #else - const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/normal_gba.gbapal"); - const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venusaur[] = INCBIN_U16("graphics/pokemon/venusaur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -101,17 +101,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/backf.4bpp.lz"); + const u32 gMonFrontPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_VenusaurF[] = INCBIN_U32("graphics/pokemon/venusaur/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_VenusaurF[] = INCBIN_COMP("graphics/pokemon/venusaur/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/front.4bpp.lz"); + const u32 gMonFrontPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/front.4bpp.smol"); const u16 gMonPalette_VenusaurMega[] = INCBIN_U16("graphics/pokemon/venusaur/mega/normal.gbapal"); - const u32 gMonBackPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/back.4bpp.lz"); + const u32 gMonBackPic_VenusaurMega[] = INCBIN_U32("graphics/pokemon/venusaur/mega/back.4bpp.smol"); const u16 gMonShinyPalette_VenusaurMega[] = INCBIN_U16("graphics/pokemon/venusaur/mega/shiny.gbapal"); const u8 gMonIcon_VenusaurMega[] = INCBIN_U8("graphics/pokemon/venusaur/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -124,8 +124,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/front.4bpp.lz"); - const u32 gMonBackPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/front.4bpp.smol"); + const u32 gMonBackPic_VenusaurGmax[] = INCBIN_U32("graphics/pokemon/venusaur/gmax/back.4bpp.smol"); const u16 gMonPalette_VenusaurGmax[] = INCBIN_U16("graphics/pokemon/venusaur/gmax/normal.gbapal"); const u16 gMonShinyPalette_VenusaurGmax[] = INCBIN_U16("graphics/pokemon/venusaur/gmax/shiny.gbapal"); const u8 gMonIcon_VenusaurGmax[] = INCBIN_U8("graphics/pokemon/venusaur/gmax/icon.4bpp"); @@ -141,14 +141,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHARMANDER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front.4bpp.smol"); const u16 gMonPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/normal.gbapal"); - const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.lz"); + const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.smol"); const u16 gMonShinyPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/shiny.gbapal"); #else - const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/normal_gba.gbapal"); - const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charmander[] = INCBIN_U16("graphics/pokemon/charmander/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -168,14 +168,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front.4bpp.smol"); const u16 gMonPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/normal.gbapal"); - const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.lz"); + const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.smol"); const u16 gMonShinyPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/shiny.gbapal"); #else - const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/normal_gba.gbapal"); - const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charmeleon[] = INCBIN_U16("graphics/pokemon/charmeleon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -195,14 +195,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front.4bpp.smol"); const u16 gMonPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/normal.gbapal"); - const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.lz"); + const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.smol"); const u16 gMonShinyPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/shiny.gbapal"); #else - const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/normal_gba.gbapal"); - const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back_gba.4bpp.lz"); + const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Charizard[] = INCBIN_U16("graphics/pokemon/charizard/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -222,9 +222,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/front.4bpp.lz"); + const u32 gMonFrontPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/front.4bpp.smol"); const u16 gMonPalette_CharizardMegaX[] = INCBIN_U16("graphics/pokemon/charizard/mega_x/normal.gbapal"); - const u32 gMonBackPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/back.4bpp.lz"); + const u32 gMonBackPic_CharizardMegaX[] = INCBIN_U32("graphics/pokemon/charizard/mega_x/back.4bpp.smol"); const u16 gMonShinyPalette_CharizardMegaX[] = INCBIN_U16("graphics/pokemon/charizard/mega_x/shiny.gbapal"); const u8 gMonIcon_CharizardMegaX[] = INCBIN_U8("graphics/pokemon/charizard/mega_x/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -235,9 +235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS - const u32 gMonFrontPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/front.4bpp.lz"); + const u32 gMonFrontPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/front.4bpp.smol"); const u16 gMonPalette_CharizardMegaY[] = INCBIN_U16("graphics/pokemon/charizard/mega_y/normal.gbapal"); - const u32 gMonBackPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/back.4bpp.lz"); + const u32 gMonBackPic_CharizardMegaY[] = INCBIN_U32("graphics/pokemon/charizard/mega_y/back.4bpp.smol"); const u16 gMonShinyPalette_CharizardMegaY[] = INCBIN_U16("graphics/pokemon/charizard/mega_y/shiny.gbapal"); const u8 gMonIcon_CharizardMegaY[] = INCBIN_U8("graphics/pokemon/charizard/mega_y/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -250,8 +250,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CharizardGmax[] = INCBIN_U32("graphics/pokemon/charizard/gmax/back.4bpp.smol"); const u16 gMonPalette_CharizardGmax[] = INCBIN_U16("graphics/pokemon/charizard/gmax/normal.gbapal"); const u16 gMonShinyPalette_CharizardGmax[] = INCBIN_U16("graphics/pokemon/charizard/gmax/shiny.gbapal"); const u8 gMonIcon_CharizardGmax[] = INCBIN_U8("graphics/pokemon/charizard/gmax/icon.4bpp"); @@ -267,14 +267,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SQUIRTLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front.4bpp.smol"); const u16 gMonPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/normal.gbapal"); - const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.lz"); + const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.smol"); const u16 gMonShinyPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/shiny.gbapal"); #else - const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/normal_gba.gbapal"); - const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Squirtle[] = INCBIN_U16("graphics/pokemon/squirtle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -294,14 +294,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front.4bpp.smol"); const u16 gMonPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/normal.gbapal"); - const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.lz"); + const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.smol"); const u16 gMonShinyPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/shiny.gbapal"); #else - const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/normal_gba.gbapal"); - const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wartortle[] = INCBIN_U16("graphics/pokemon/wartortle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -321,14 +321,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front.4bpp.smol"); const u16 gMonPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/normal.gbapal"); - const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.lz"); + const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.smol"); const u16 gMonShinyPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/shiny.gbapal"); #else - const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/normal_gba.gbapal"); - const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blastoise[] = INCBIN_U16("graphics/pokemon/blastoise/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -348,9 +348,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/front.4bpp.smol"); const u16 gMonPalette_BlastoiseMega[] = INCBIN_U16("graphics/pokemon/blastoise/mega/normal.gbapal"); - const u32 gMonBackPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/back.4bpp.lz"); + const u32 gMonBackPic_BlastoiseMega[] = INCBIN_U32("graphics/pokemon/blastoise/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BlastoiseMega[] = INCBIN_U16("graphics/pokemon/blastoise/mega/shiny.gbapal"); const u8 gMonIcon_BlastoiseMega[] = INCBIN_U8("graphics/pokemon/blastoise/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -363,8 +363,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/front.4bpp.lz"); - const u32 gMonBackPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/front.4bpp.smol"); + const u32 gMonBackPic_BlastoiseGmax[] = INCBIN_U32("graphics/pokemon/blastoise/gmax/back.4bpp.smol"); const u16 gMonPalette_BlastoiseGmax[] = INCBIN_U16("graphics/pokemon/blastoise/gmax/normal.gbapal"); const u16 gMonShinyPalette_BlastoiseGmax[] = INCBIN_U16("graphics/pokemon/blastoise/gmax/shiny.gbapal"); const u8 gMonIcon_BlastoiseGmax[] = INCBIN_U8("graphics/pokemon/blastoise/gmax/icon.4bpp"); @@ -380,14 +380,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CATERPIE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front.4bpp.smol"); const u16 gMonPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/normal.gbapal"); - const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.lz"); + const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.smol"); const u16 gMonShinyPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/shiny.gbapal"); #else - const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/normal_gba.gbapal"); - const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Caterpie[] = INCBIN_U16("graphics/pokemon/caterpie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -407,14 +407,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front.4bpp.smol"); const u16 gMonPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/normal.gbapal"); - const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.lz"); + const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.smol"); const u16 gMonShinyPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/shiny.gbapal"); #else - const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/normal_gba.gbapal"); - const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metapod[] = INCBIN_U16("graphics/pokemon/metapod/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX const u8 gMonIcon_Metapod[] = INCBIN_U8( "graphics/pokemon/metapod/icon.4bpp"); @@ -430,14 +430,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front.4bpp.smol"); const u16 gMonPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/normal.gbapal"); - const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.lz"); + const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.smol"); const u16 gMonShinyPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/shiny.gbapal"); #else - const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/normal_gba.gbapal"); - const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back_gba.4bpp.lz"); + const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Butterfree[] = INCBIN_U16("graphics/pokemon/butterfree/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -457,16 +457,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/backf.4bpp.lz"); + const u32 gMonFrontPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ButterfreeF[] = INCBIN_U32("graphics/pokemon/butterfree/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ButterfreeF[] = INCBIN_COMP("graphics/pokemon/butterfree/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/front.4bpp.lz"); - const u32 gMonBackPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/front.4bpp.smol"); + const u32 gMonBackPic_ButterfreeGmax[] = INCBIN_U32("graphics/pokemon/butterfree/gmax/back.4bpp.smol"); const u16 gMonPalette_ButterfreeGmax[] = INCBIN_U16("graphics/pokemon/butterfree/gmax/normal.gbapal"); const u16 gMonShinyPalette_ButterfreeGmax[] = INCBIN_U16("graphics/pokemon/butterfree/gmax/shiny.gbapal"); const u8 gMonIcon_ButterfreeGmax[] = INCBIN_U8("graphics/pokemon/butterfree/gmax/icon.4bpp"); @@ -482,14 +482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WEEDLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front.4bpp.smol"); const u16 gMonPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/normal.gbapal"); - const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.lz"); + const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.smol"); const u16 gMonShinyPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/shiny.gbapal"); #else - const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/normal_gba.gbapal"); - const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weedle[] = INCBIN_U16("graphics/pokemon/weedle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -509,14 +509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front.4bpp.smol"); const u16 gMonPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/normal.gbapal"); - const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.lz"); + const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.smol"); const u16 gMonShinyPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/shiny.gbapal"); #else - const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/normal_gba.gbapal"); - const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kakuna[] = INCBIN_U16("graphics/pokemon/kakuna/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -536,14 +536,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front.4bpp.smol"); const u16 gMonPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/normal.gbapal"); - const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.lz"); + const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.smol"); const u16 gMonShinyPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/shiny.gbapal"); #else - const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/normal_gba.gbapal"); - const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beedrill[] = INCBIN_U16("graphics/pokemon/beedrill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -563,9 +563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/front.4bpp.smol"); const u16 gMonPalette_BeedrillMega[] = INCBIN_U16("graphics/pokemon/beedrill/mega/normal.gbapal"); - const u32 gMonBackPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/back.4bpp.lz"); + const u32 gMonBackPic_BeedrillMega[] = INCBIN_U32("graphics/pokemon/beedrill/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BeedrillMega[] = INCBIN_U16("graphics/pokemon/beedrill/mega/shiny.gbapal"); const u8 gMonIcon_BeedrillMega[] = INCBIN_U8("graphics/pokemon/beedrill/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -580,14 +580,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PIDGEY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/normal.gbapal"); - const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.lz"); + const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgey[] = INCBIN_U16("graphics/pokemon/pidgey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -607,14 +607,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/normal.gbapal"); - const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.lz"); + const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgeotto[] = INCBIN_U16("graphics/pokemon/pidgeotto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -634,14 +634,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front.4bpp.smol"); const u16 gMonPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/normal.gbapal"); - const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.lz"); + const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.smol"); const u16 gMonShinyPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/shiny.gbapal"); #else - const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/normal_gba.gbapal"); - const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pidgeot[] = INCBIN_U16("graphics/pokemon/pidgeot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -661,9 +661,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/front.4bpp.lz"); + const u32 gMonFrontPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/front.4bpp.smol"); const u16 gMonPalette_PidgeotMega[] = INCBIN_U16("graphics/pokemon/pidgeot/mega/normal.gbapal"); - const u32 gMonBackPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/back.4bpp.lz"); + const u32 gMonBackPic_PidgeotMega[] = INCBIN_U32("graphics/pokemon/pidgeot/mega/back.4bpp.smol"); const u16 gMonShinyPalette_PidgeotMega[] = INCBIN_U16("graphics/pokemon/pidgeot/mega/shiny.gbapal"); const u8 gMonIcon_PidgeotMega[] = INCBIN_U8("graphics/pokemon/pidgeot/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -678,14 +678,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RATTATA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front.4bpp.smol"); const u16 gMonPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/normal.gbapal"); - const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.lz"); + const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.smol"); const u16 gMonShinyPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/shiny.gbapal"); #else - const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/normal_gba.gbapal"); - const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rattata[] = INCBIN_U16("graphics/pokemon/rattata/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -705,22 +705,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/backf.4bpp.lz"); + const u32 gMonFrontPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RattataF[] = INCBIN_U32("graphics/pokemon/rattata/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RattataF[] = INCBIN_COMP("graphics/pokemon/rattata/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front.4bpp.smol"); const u16 gMonPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/normal.gbapal"); - const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.lz"); + const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.smol"); const u16 gMonShinyPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/shiny.gbapal"); #else - const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/normal_gba.gbapal"); - const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raticate[] = INCBIN_U16("graphics/pokemon/raticate/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -740,17 +740,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/backf.4bpp.lz"); + const u32 gMonFrontPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RaticateF[] = INCBIN_U32("graphics/pokemon/raticate/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RaticateF[] = INCBIN_COMP("graphics/pokemon/raticate/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_ALOLAN_FORMS - const u32 gMonFrontPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/front.4bpp.smol"); const u16 gMonPalette_RattataAlola[] = INCBIN_U16("graphics/pokemon/rattata/alola/normal.gbapal"); - const u32 gMonBackPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/back.4bpp.lz"); + const u32 gMonBackPic_RattataAlola[] = INCBIN_U32("graphics/pokemon/rattata/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RattataAlola[] = INCBIN_U16("graphics/pokemon/rattata/alola/shiny.gbapal"); const u8 gMonIcon_RattataAlola[] = INCBIN_U8("graphics/pokemon/rattata/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -761,9 +761,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/front.4bpp.smol"); const u16 gMonPalette_RaticateAlola[] = INCBIN_U16("graphics/pokemon/raticate/alola/normal.gbapal"); - const u32 gMonBackPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/back.4bpp.lz"); + const u32 gMonBackPic_RaticateAlola[] = INCBIN_U32("graphics/pokemon/raticate/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RaticateAlola[] = INCBIN_U16("graphics/pokemon/raticate/alola/shiny.gbapal"); const u8 gMonIcon_RaticateAlola[] = INCBIN_U8("graphics/pokemon/raticate/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -778,14 +778,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPEAROW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front.4bpp.smol"); const u16 gMonPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/normal.gbapal"); - const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.lz"); + const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.smol"); const u16 gMonShinyPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/shiny.gbapal"); #else - const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/normal_gba.gbapal"); - const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spearow[] = INCBIN_U16("graphics/pokemon/spearow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -805,14 +805,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front.4bpp.smol"); const u16 gMonPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/normal.gbapal"); - const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.lz"); + const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.smol"); const u16 gMonShinyPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/shiny.gbapal"); #else - const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/normal_gba.gbapal"); - const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Fearow[] = INCBIN_U16("graphics/pokemon/fearow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -834,14 +834,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EKANS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front.4bpp.smol"); const u16 gMonPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/normal.gbapal"); - const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.lz"); + const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.smol"); const u16 gMonShinyPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/shiny.gbapal"); #else - const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/normal_gba.gbapal"); - const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ekans[] = INCBIN_U16("graphics/pokemon/ekans/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -861,14 +861,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front.4bpp.smol"); const u16 gMonPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/normal.gbapal"); - const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.lz"); + const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.smol"); const u16 gMonShinyPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/shiny.gbapal"); #else - const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/normal_gba.gbapal"); - const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back_gba.4bpp.lz"); + const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Arbok[] = INCBIN_U16("graphics/pokemon/arbok/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -891,14 +891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PIKACHU #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front.4bpp.smol"); const u16 gMonPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/normal.gbapal"); - const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.lz"); + const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.smol"); const u16 gMonShinyPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/shiny.gbapal"); #else - const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/normal_gba.gbapal"); - const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pichu[] = INCBIN_U16("graphics/pokemon/pichu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -917,9 +917,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/anim_front.4bpp.lz"); + const u32 gMonFrontPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/anim_front.4bpp.smol"); const u16 gMonPalette_PichuSpikyEared[] = INCBIN_U16("graphics/pokemon/pichu/spiky_eared/normal.gbapal"); - const u32 gMonBackPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/back.4bpp.lz"); + const u32 gMonBackPic_PichuSpikyEared[] = INCBIN_U32("graphics/pokemon/pichu/spiky_eared/back.4bpp.smol"); const u16 gMonShinyPalette_PichuSpikyEared[] = INCBIN_U16("graphics/pokemon/pichu/spiky_eared/shiny.gbapal"); const u8 gMonIcon_PichuSpikyEared[] = INCBIN_U8("graphics/pokemon/pichu/spiky_eared/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -932,14 +932,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front.4bpp.smol"); const u16 gMonPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/normal.gbapal"); - const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.lz"); + const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.smol"); const u16 gMonShinyPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/shiny.gbapal"); #else - const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/normal_gba.gbapal"); - const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pikachu[] = INCBIN_U16("graphics/pokemon/pikachu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -959,8 +959,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/backf.4bpp.lz"); + const u32 gMonFrontPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PikachuF[] = INCBIN_U32("graphics/pokemon/pikachu/backf.4bpp.smol"); #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_PikachuF[] = INCBIN_U8("graphics/pokemon/pikachu/iconf.4bpp"); #endif @@ -970,39 +970,39 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES #if P_COSPLAY_PIKACHU_FORMS - const u32 gMonFrontPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/front.4bpp.smol"); const u16 gMonPalette_PikachuCosplay[] = INCBIN_U16("graphics/pokemon/pikachu/cosplay/normal.gbapal"); - const u32 gMonBackPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/back.4bpp.lz"); + const u32 gMonBackPic_PikachuCosplay[] = INCBIN_U32("graphics/pokemon/pikachu/cosplay/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuCosplay[] = INCBIN_U16("graphics/pokemon/pikachu/cosplay/shiny.gbapal"); const u8 gMonIcon_PikachuCosplay[] = INCBIN_U8("graphics/pokemon/pikachu/cosplay/icon.4bpp"); - const u32 gMonFrontPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/front.4bpp.smol"); const u16 gMonPalette_PikachuRockStar[] = INCBIN_U16("graphics/pokemon/pikachu/rock_star/normal.gbapal"); - const u32 gMonBackPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/back.4bpp.lz"); + const u32 gMonBackPic_PikachuRockStar[] = INCBIN_U32("graphics/pokemon/pikachu/rock_star/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuRockStar[] = INCBIN_U16("graphics/pokemon/pikachu/rock_star/shiny.gbapal"); const u8 gMonIcon_PikachuRockStar[] = INCBIN_U8("graphics/pokemon/pikachu/rock_star/icon.4bpp"); - const u32 gMonFrontPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/front.4bpp.smol"); const u16 gMonPalette_PikachuBelle[] = INCBIN_U16("graphics/pokemon/pikachu/belle/normal.gbapal"); - const u32 gMonBackPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/back.4bpp.lz"); + const u32 gMonBackPic_PikachuBelle[] = INCBIN_U32("graphics/pokemon/pikachu/belle/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuBelle[] = INCBIN_U16("graphics/pokemon/pikachu/belle/shiny.gbapal"); const u8 gMonIcon_PikachuBelle[] = INCBIN_U8("graphics/pokemon/pikachu/belle/icon.4bpp"); - const u32 gMonFrontPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/front.4bpp.smol"); const u16 gMonPalette_PikachuPopStar[] = INCBIN_U16("graphics/pokemon/pikachu/pop_star/normal.gbapal"); - const u32 gMonBackPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPopStar[] = INCBIN_U32("graphics/pokemon/pikachu/pop_star/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPopStar[] = INCBIN_U16("graphics/pokemon/pikachu/pop_star/shiny.gbapal"); const u8 gMonIcon_PikachuPopStar[] = INCBIN_U8("graphics/pokemon/pikachu/pop_star/icon.4bpp"); - const u32 gMonFrontPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/front.4bpp.smol"); const u16 gMonPalette_PikachuPhD[] = INCBIN_U16("graphics/pokemon/pikachu/phd/normal.gbapal"); - const u32 gMonBackPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPhD[] = INCBIN_U32("graphics/pokemon/pikachu/phd/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPhD[] = INCBIN_U16("graphics/pokemon/pikachu/phd/shiny.gbapal"); const u8 gMonIcon_PikachuPhD[] = INCBIN_U8("graphics/pokemon/pikachu/phd/icon.4bpp"); - const u32 gMonFrontPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/front.4bpp.smol"); const u16 gMonPalette_PikachuLibre[] = INCBIN_U16("graphics/pokemon/pikachu/libre/normal.gbapal"); - const u32 gMonBackPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/back.4bpp.lz"); + const u32 gMonBackPic_PikachuLibre[] = INCBIN_U32("graphics/pokemon/pikachu/libre/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuLibre[] = INCBIN_U16("graphics/pokemon/pikachu/libre/shiny.gbapal"); const u8 gMonIcon_PikachuLibre[] = INCBIN_U8("graphics/pokemon/pikachu/libre/icon.4bpp"); @@ -1017,51 +1017,51 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_COSPLAY_PIKACHU_FORMS #if P_CAP_PIKACHU_FORMS - const u32 gMonFrontPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/front.4bpp.smol"); const u16 gMonPalette_PikachuOriginal[] = INCBIN_U16("graphics/pokemon/pikachu/original/normal.gbapal"); - const u32 gMonBackPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/back.4bpp.lz"); + const u32 gMonBackPic_PikachuOriginal[] = INCBIN_U32("graphics/pokemon/pikachu/original/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuOriginal[] = INCBIN_U16("graphics/pokemon/pikachu/original/shiny.gbapal"); const u8 gMonIcon_PikachuOriginal[] = INCBIN_U8("graphics/pokemon/pikachu/original/icon.4bpp"); - const u32 gMonFrontPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/front.4bpp.smol"); const u16 gMonPalette_PikachuHoenn[] = INCBIN_U16("graphics/pokemon/pikachu/hoenn/normal.gbapal"); - const u32 gMonBackPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/back.4bpp.lz"); + const u32 gMonBackPic_PikachuHoenn[] = INCBIN_U32("graphics/pokemon/pikachu/hoenn/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuHoenn[] = INCBIN_U16("graphics/pokemon/pikachu/hoenn/shiny.gbapal"); const u8 gMonIcon_PikachuHoenn[] = INCBIN_U8("graphics/pokemon/pikachu/hoenn/icon.4bpp"); - const u32 gMonFrontPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/front.4bpp.smol"); const u16 gMonPalette_PikachuSinnoh[] = INCBIN_U16("graphics/pokemon/pikachu/sinnoh/normal.gbapal"); - const u32 gMonBackPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/back.4bpp.lz"); + const u32 gMonBackPic_PikachuSinnoh[] = INCBIN_U32("graphics/pokemon/pikachu/sinnoh/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuSinnoh[] = INCBIN_U16("graphics/pokemon/pikachu/sinnoh/shiny.gbapal"); const u8 gMonIcon_PikachuSinnoh[] = INCBIN_U8("graphics/pokemon/pikachu/sinnoh/icon.4bpp"); - const u32 gMonFrontPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/front.4bpp.smol"); const u16 gMonPalette_PikachuUnova[] = INCBIN_U16("graphics/pokemon/pikachu/unova/normal.gbapal"); - const u32 gMonBackPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/back.4bpp.lz"); + const u32 gMonBackPic_PikachuUnova[] = INCBIN_U32("graphics/pokemon/pikachu/unova/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuUnova[] = INCBIN_U16("graphics/pokemon/pikachu/unova/shiny.gbapal"); const u8 gMonIcon_PikachuUnova[] = INCBIN_U8("graphics/pokemon/pikachu/unova/icon.4bpp"); - const u32 gMonFrontPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/front.4bpp.smol"); const u16 gMonPalette_PikachuKalos[] = INCBIN_U16("graphics/pokemon/pikachu/kalos/normal.gbapal"); - const u32 gMonBackPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/back.4bpp.lz"); + const u32 gMonBackPic_PikachuKalos[] = INCBIN_U32("graphics/pokemon/pikachu/kalos/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuKalos[] = INCBIN_U16("graphics/pokemon/pikachu/kalos/shiny.gbapal"); const u8 gMonIcon_PikachuKalos[] = INCBIN_U8("graphics/pokemon/pikachu/kalos/icon.4bpp"); - const u32 gMonFrontPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/front.4bpp.smol"); const u16 gMonPalette_PikachuAlola[] = INCBIN_U16("graphics/pokemon/pikachu/alola/normal.gbapal"); - const u32 gMonBackPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/back.4bpp.lz"); + const u32 gMonBackPic_PikachuAlola[] = INCBIN_U32("graphics/pokemon/pikachu/alola/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuAlola[] = INCBIN_U16("graphics/pokemon/pikachu/alola/shiny.gbapal"); const u8 gMonIcon_PikachuAlola[] = INCBIN_U8("graphics/pokemon/pikachu/alola/icon.4bpp"); - const u32 gMonFrontPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/front.4bpp.smol"); const u16 gMonPalette_PikachuPartner[] = INCBIN_U16("graphics/pokemon/pikachu/partner/normal.gbapal"); - const u32 gMonBackPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/back.4bpp.lz"); + const u32 gMonBackPic_PikachuPartner[] = INCBIN_U32("graphics/pokemon/pikachu/partner/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuPartner[] = INCBIN_U16("graphics/pokemon/pikachu/partner/shiny.gbapal"); const u8 gMonIcon_PikachuPartner[] = INCBIN_U8("graphics/pokemon/pikachu/partner/icon.4bpp"); - const u32 gMonFrontPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/front.4bpp.lz"); + const u32 gMonFrontPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/front.4bpp.smol"); const u16 gMonPalette_PikachuWorld[] = INCBIN_U16("graphics/pokemon/pikachu/world/normal.gbapal"); - const u32 gMonBackPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/back.4bpp.lz"); + const u32 gMonBackPic_PikachuWorld[] = INCBIN_U32("graphics/pokemon/pikachu/world/back.4bpp.smol"); const u16 gMonShinyPalette_PikachuWorld[] = INCBIN_U16("graphics/pokemon/pikachu/world/shiny.gbapal"); const u8 gMonIcon_PikachuWorld[] = INCBIN_U8("graphics/pokemon/pikachu/world/icon.4bpp"); @@ -1078,8 +1078,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_CAP_PIKACHU_FORMS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/front.4bpp.lz"); - const u32 gMonBackPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/front.4bpp.smol"); + const u32 gMonBackPic_PikachuGmax[] = INCBIN_U32("graphics/pokemon/pikachu/gmax/back.4bpp.smol"); const u16 gMonPalette_PikachuGmax[] = INCBIN_U16("graphics/pokemon/pikachu/gmax/normal.gbapal"); const u16 gMonShinyPalette_PikachuGmax[] = INCBIN_U16("graphics/pokemon/pikachu/gmax/shiny.gbapal"); const u8 gMonIcon_PikachuGmax[] = INCBIN_U8("graphics/pokemon/pikachu/gmax/icon.4bpp"); @@ -1098,14 +1098,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES && P_CUSTOM_GENDER_DIFF_ICONS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front.4bpp.smol"); const u16 gMonPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/normal.gbapal"); - const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.lz"); + const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.smol"); const u16 gMonShinyPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/shiny.gbapal"); #else - const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/normal_gba.gbapal"); - const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raichu[] = INCBIN_U16("graphics/pokemon/raichu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1125,16 +1125,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RaichuF[] = INCBIN_U32("graphics/pokemon/raichu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_RaichuF[] = INCBIN_U32("graphics/pokemon/raichu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RaichuF[] = INCBIN_COMP("graphics/pokemon/raichu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_ALOLAN_FORMS - const u32 gMonFrontPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/front.4bpp.lz"); + const u32 gMonFrontPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/front.4bpp.smol"); const u16 gMonPalette_RaichuAlola[] = INCBIN_U16("graphics/pokemon/raichu/alola/normal.gbapal"); - const u32 gMonBackPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/back.4bpp.lz"); + const u32 gMonBackPic_RaichuAlola[] = INCBIN_U32("graphics/pokemon/raichu/alola/back.4bpp.smol"); const u16 gMonShinyPalette_RaichuAlola[] = INCBIN_U16("graphics/pokemon/raichu/alola/shiny.gbapal"); const u8 gMonIcon_RaichuAlola[] = INCBIN_U8("graphics/pokemon/raichu/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1149,14 +1149,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SANDSHREW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front.4bpp.smol"); const u16 gMonPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/normal.gbapal"); - const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.lz"); + const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.smol"); const u16 gMonShinyPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/shiny.gbapal"); #else - const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/normal_gba.gbapal"); - const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sandshrew[] = INCBIN_U16("graphics/pokemon/sandshrew/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1176,14 +1176,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front.4bpp.smol"); const u16 gMonPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/normal.gbapal"); - const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.lz"); + const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.smol"); const u16 gMonShinyPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/shiny.gbapal"); #else - const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/normal_gba.gbapal"); - const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sandslash[] = INCBIN_U16("graphics/pokemon/sandslash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1203,9 +1203,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/front.4bpp.lz"); + const u32 gMonFrontPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/front.4bpp.smol"); const u16 gMonPalette_SandshrewAlola[] = INCBIN_U16("graphics/pokemon/sandshrew/alola/normal.gbapal"); - const u32 gMonBackPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/back.4bpp.lz"); + const u32 gMonBackPic_SandshrewAlola[] = INCBIN_U32("graphics/pokemon/sandshrew/alola/back.4bpp.smol"); const u16 gMonShinyPalette_SandshrewAlola[] = INCBIN_U16("graphics/pokemon/sandshrew/alola/shiny.gbapal"); const u8 gMonIcon_SandshrewAlola[] = INCBIN_U8("graphics/pokemon/sandshrew/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1216,9 +1216,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/front.4bpp.lz"); + const u32 gMonFrontPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/front.4bpp.smol"); const u16 gMonPalette_SandslashAlola[] = INCBIN_U16("graphics/pokemon/sandslash/alola/normal.gbapal"); - const u32 gMonBackPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/back.4bpp.lz"); + const u32 gMonBackPic_SandslashAlola[] = INCBIN_U32("graphics/pokemon/sandslash/alola/back.4bpp.smol"); const u16 gMonShinyPalette_SandslashAlola[] = INCBIN_U16("graphics/pokemon/sandslash/alola/shiny.gbapal"); const u8 gMonIcon_SandslashAlola[] = INCBIN_U8("graphics/pokemon/sandslash/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1233,14 +1233,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NIDORAN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front.4bpp.lz"); + const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front.4bpp.smol"); const u16 gMonPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/normal.gbapal"); - const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.lz"); + const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.smol"); const u16 gMonShinyPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/shiny.gbapal"); #else - const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/anim_front_gba.4bpp.smol"); const u16 gMonPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/normal_gba.gbapal"); - const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back_gba.4bpp.lz"); + const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back_gba.4bpp.smol"); const u16 gMonShinyPalette_NidoranF[] = INCBIN_U16("graphics/pokemon/nidoran_f/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1260,14 +1260,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front.4bpp.smol"); const u16 gMonPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/normal.gbapal"); - const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.lz"); + const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.smol"); const u16 gMonShinyPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/normal_gba.gbapal"); - const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidorina[] = INCBIN_U16("graphics/pokemon/nidorina/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1287,14 +1287,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front.4bpp.smol"); const u16 gMonPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/normal.gbapal"); - const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.lz"); + const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.smol"); const u16 gMonShinyPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/normal_gba.gbapal"); - const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidoqueen[] = INCBIN_U16("graphics/pokemon/nidoqueen/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1314,14 +1314,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front.4bpp.lz"); + const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front.4bpp.smol"); const u16 gMonPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/normal.gbapal"); - const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.lz"); + const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.smol"); const u16 gMonShinyPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/shiny.gbapal"); #else - const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/anim_front_gba.4bpp.smol"); const u16 gMonPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/normal_gba.gbapal"); - const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back_gba.4bpp.lz"); + const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back_gba.4bpp.smol"); const u16 gMonShinyPalette_NidoranM[] = INCBIN_U16("graphics/pokemon/nidoran_m/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1341,14 +1341,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front.4bpp.smol"); const u16 gMonPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/normal.gbapal"); - const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.lz"); + const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.smol"); const u16 gMonShinyPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/normal_gba.gbapal"); - const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidorino[] = INCBIN_U16("graphics/pokemon/nidorino/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1368,14 +1368,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front.4bpp.smol"); const u16 gMonPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/normal.gbapal"); - const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.lz"); + const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.smol"); const u16 gMonShinyPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/shiny.gbapal"); #else - const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/normal_gba.gbapal"); - const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nidoking[] = INCBIN_U16("graphics/pokemon/nidoking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1398,14 +1398,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CLEFAIRY #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front.4bpp.smol"); const u16 gMonPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/normal.gbapal"); - const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.lz"); + const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.smol"); const u16 gMonShinyPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/shiny.gbapal"); #else - const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/normal_gba.gbapal"); - const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cleffa[] = INCBIN_U16("graphics/pokemon/cleffa/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1426,14 +1426,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front.4bpp.smol"); const u16 gMonPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/normal.gbapal"); - const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.lz"); + const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.smol"); const u16 gMonShinyPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/shiny.gbapal"); #else - const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/normal_gba.gbapal"); - const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clefairy[] = INCBIN_U16("graphics/pokemon/clefairy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1453,14 +1453,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front.4bpp.smol"); const u16 gMonPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/normal.gbapal"); - const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.lz"); + const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.smol"); const u16 gMonShinyPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/shiny.gbapal"); #else - const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/normal_gba.gbapal"); - const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clefable[] = INCBIN_U16("graphics/pokemon/clefable/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1482,14 +1482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VULPIX #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front.4bpp.smol"); const u16 gMonPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/normal.gbapal"); - const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.lz"); + const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.smol"); const u16 gMonShinyPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/shiny.gbapal"); #else - const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/normal_gba.gbapal"); - const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vulpix[] = INCBIN_U16("graphics/pokemon/vulpix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1509,14 +1509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front.4bpp.smol"); const u16 gMonPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/normal.gbapal"); - const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.lz"); + const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.smol"); const u16 gMonShinyPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/shiny.gbapal"); #else - const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/normal_gba.gbapal"); - const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ninetales[] = INCBIN_U16("graphics/pokemon/ninetales/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1536,9 +1536,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/front.4bpp.lz"); + const u32 gMonFrontPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/front.4bpp.smol"); const u16 gMonPalette_VulpixAlola[] = INCBIN_U16("graphics/pokemon/vulpix/alola/normal.gbapal"); - const u32 gMonBackPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/back.4bpp.lz"); + const u32 gMonBackPic_VulpixAlola[] = INCBIN_U32("graphics/pokemon/vulpix/alola/back.4bpp.smol"); const u16 gMonShinyPalette_VulpixAlola[] = INCBIN_U16("graphics/pokemon/vulpix/alola/shiny.gbapal"); const u8 gMonIcon_VulpixAlola[] = INCBIN_U8("graphics/pokemon/vulpix/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1549,9 +1549,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/front.4bpp.lz"); + const u32 gMonFrontPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/front.4bpp.smol"); const u16 gMonPalette_NinetalesAlola[] = INCBIN_U16("graphics/pokemon/ninetales/alola/normal.gbapal"); - const u32 gMonBackPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/back.4bpp.lz"); + const u32 gMonBackPic_NinetalesAlola[] = INCBIN_U32("graphics/pokemon/ninetales/alola/back.4bpp.smol"); const u16 gMonShinyPalette_NinetalesAlola[] = INCBIN_U16("graphics/pokemon/ninetales/alola/shiny.gbapal"); const u8 gMonIcon_NinetalesAlola[] = INCBIN_U8("graphics/pokemon/ninetales/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -1567,14 +1567,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JIGGLYPUFF #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front.4bpp.smol"); const u16 gMonPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/normal.gbapal"); - const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.lz"); + const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.smol"); const u16 gMonShinyPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/normal_gba.gbapal"); - const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Igglybuff[] = INCBIN_U16("graphics/pokemon/igglybuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1595,14 +1595,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front.4bpp.smol"); const u16 gMonPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/normal.gbapal"); - const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.lz"); + const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.smol"); const u16 gMonShinyPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/normal_gba.gbapal"); - const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jigglypuff[] = INCBIN_U16("graphics/pokemon/jigglypuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1622,14 +1622,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front.4bpp.smol"); const u16 gMonPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/normal.gbapal"); - const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.lz"); + const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.smol"); const u16 gMonShinyPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/shiny.gbapal"); #else - const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/normal_gba.gbapal"); - const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wigglytuff[] = INCBIN_U16("graphics/pokemon/wigglytuff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1651,14 +1651,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZUBAT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front.4bpp.smol"); const u16 gMonPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/normal.gbapal"); - const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.lz"); + const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.smol"); const u16 gMonShinyPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/shiny.gbapal"); #else - const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/normal_gba.gbapal"); - const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zubat[] = INCBIN_U16("graphics/pokemon/zubat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1678,22 +1678,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/backf.4bpp.lz"); + const u32 gMonFrontPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ZubatF[] = INCBIN_U32("graphics/pokemon/zubat/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ZubatF[] = INCBIN_COMP("graphics/pokemon/zubat/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front.4bpp.smol"); const u16 gMonPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/normal.gbapal"); - const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.lz"); + const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.smol"); const u16 gMonShinyPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/shiny.gbapal"); #else - const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/normal_gba.gbapal"); - const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golbat[] = INCBIN_U16("graphics/pokemon/golbat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1713,8 +1713,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/backf.4bpp.lz"); + const u32 gMonFrontPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GolbatF[] = INCBIN_U32("graphics/pokemon/golbat/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GolbatF[] = INCBIN_COMP("graphics/pokemon/golbat/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -1722,14 +1722,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front.4bpp.smol"); const u16 gMonPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/normal.gbapal"); - const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.lz"); + const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.smol"); const u16 gMonShinyPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/shiny.gbapal"); #else - const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/normal_gba.gbapal"); - const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Crobat[] = INCBIN_U16("graphics/pokemon/crobat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1752,14 +1752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ODDISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front.4bpp.smol"); const u16 gMonPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/normal.gbapal"); - const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.lz"); + const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.smol"); const u16 gMonShinyPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/shiny.gbapal"); #else - const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/normal_gba.gbapal"); - const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Oddish[] = INCBIN_U16("graphics/pokemon/oddish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1779,14 +1779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front.4bpp.smol"); const u16 gMonPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/normal.gbapal"); - const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.lz"); + const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.smol"); const u16 gMonShinyPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/shiny.gbapal"); #else - const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/normal_gba.gbapal"); - const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gloom[] = INCBIN_U16("graphics/pokemon/gloom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1806,22 +1806,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/backf.4bpp.lz"); + const u32 gMonFrontPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GloomF[] = INCBIN_U32("graphics/pokemon/gloom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GloomF[] = INCBIN_COMP("graphics/pokemon/gloom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front.4bpp.smol"); const u16 gMonPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/normal.gbapal"); - const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.lz"); + const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.smol"); const u16 gMonShinyPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/shiny.gbapal"); #else - const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/normal_gba.gbapal"); - const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vileplume[] = INCBIN_U16("graphics/pokemon/vileplume/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1841,8 +1841,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/backf.4bpp.lz"); + const u32 gMonFrontPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_VileplumeF[] = INCBIN_U32("graphics/pokemon/vileplume/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_VileplumeF[] = INCBIN_COMP("graphics/pokemon/vileplume/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -1850,14 +1850,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front.4bpp.smol"); const u16 gMonPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/normal.gbapal"); - const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.lz"); + const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.smol"); const u16 gMonShinyPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/shiny.gbapal"); #else - const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/normal_gba.gbapal"); - const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bellossom[] = INCBIN_U16("graphics/pokemon/bellossom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1880,14 +1880,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PARAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front.4bpp.smol"); const u16 gMonPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/normal.gbapal"); - const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.lz"); + const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.smol"); const u16 gMonShinyPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/shiny.gbapal"); #else - const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/normal_gba.gbapal"); - const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back_gba.4bpp.lz"); + const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Paras[] = INCBIN_U16("graphics/pokemon/paras/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1907,14 +1907,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front.4bpp.smol"); const u16 gMonPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/normal.gbapal"); - const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.lz"); + const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.smol"); const u16 gMonShinyPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/shiny.gbapal"); #else - const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/normal_gba.gbapal"); - const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back_gba.4bpp.lz"); + const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Parasect[] = INCBIN_U16("graphics/pokemon/parasect/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1936,14 +1936,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VENONAT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front.4bpp.smol"); const u16 gMonPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/normal.gbapal"); - const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.lz"); + const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.smol"); const u16 gMonShinyPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/shiny.gbapal"); #else - const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/normal_gba.gbapal"); - const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venonat[] = INCBIN_U16("graphics/pokemon/venonat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1963,14 +1963,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front.4bpp.smol"); const u16 gMonPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/normal.gbapal"); - const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.lz"); + const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.smol"); const u16 gMonShinyPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/shiny.gbapal"); #else - const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/normal_gba.gbapal"); - const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Venomoth[] = INCBIN_U16("graphics/pokemon/venomoth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -1992,14 +1992,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DIGLETT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front.4bpp.smol"); const u16 gMonPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/normal.gbapal"); - const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.lz"); + const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.smol"); const u16 gMonShinyPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/shiny.gbapal"); #else - const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/normal_gba.gbapal"); - const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back_gba.4bpp.lz"); + const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Diglett[] = INCBIN_U16("graphics/pokemon/diglett/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2019,14 +2019,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front.4bpp.smol"); const u16 gMonPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/normal.gbapal"); - const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.lz"); + const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.smol"); const u16 gMonShinyPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/shiny.gbapal"); #else - const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/normal_gba.gbapal"); - const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dugtrio[] = INCBIN_U16("graphics/pokemon/dugtrio/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2046,9 +2046,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/front.4bpp.lz"); + const u32 gMonFrontPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/front.4bpp.smol"); const u16 gMonPalette_DiglettAlola[] = INCBIN_U16("graphics/pokemon/diglett/alola/normal.gbapal"); - const u32 gMonBackPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/back.4bpp.lz"); + const u32 gMonBackPic_DiglettAlola[] = INCBIN_U32("graphics/pokemon/diglett/alola/back.4bpp.smol"); const u16 gMonShinyPalette_DiglettAlola[] = INCBIN_U16("graphics/pokemon/diglett/alola/shiny.gbapal"); const u8 gMonIcon_DiglettAlola[] = INCBIN_U8("graphics/pokemon/diglett/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2059,9 +2059,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/front.4bpp.lz"); + const u32 gMonFrontPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/front.4bpp.smol"); const u16 gMonPalette_DugtrioAlola[] = INCBIN_U16("graphics/pokemon/dugtrio/alola/normal.gbapal"); - const u32 gMonBackPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/back.4bpp.lz"); + const u32 gMonBackPic_DugtrioAlola[] = INCBIN_U32("graphics/pokemon/dugtrio/alola/back.4bpp.smol"); const u16 gMonShinyPalette_DugtrioAlola[] = INCBIN_U16("graphics/pokemon/dugtrio/alola/shiny.gbapal"); const u8 gMonIcon_DugtrioAlola[] = INCBIN_U8("graphics/pokemon/dugtrio/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2076,14 +2076,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEOWTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front.4bpp.smol"); const u16 gMonPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/normal.gbapal"); - const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.lz"); + const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.smol"); const u16 gMonShinyPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/shiny.gbapal"); #else - const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/normal_gba.gbapal"); - const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meowth[] = INCBIN_U16("graphics/pokemon/meowth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2103,14 +2103,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front.4bpp.smol"); const u16 gMonPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/normal.gbapal"); - const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.lz"); + const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.smol"); const u16 gMonShinyPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/shiny.gbapal"); #else - const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/normal_gba.gbapal"); - const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back_gba.4bpp.lz"); + const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Persian[] = INCBIN_U16("graphics/pokemon/persian/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2130,9 +2130,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/front.4bpp.smol"); const u16 gMonPalette_MeowthAlola[] = INCBIN_U16("graphics/pokemon/meowth/alola/normal.gbapal"); - const u32 gMonBackPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/back.4bpp.lz"); + const u32 gMonBackPic_MeowthAlola[] = INCBIN_U32("graphics/pokemon/meowth/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MeowthAlola[] = INCBIN_U16("graphics/pokemon/meowth/alola/shiny.gbapal"); const u8 gMonIcon_MeowthAlola[] = INCBIN_U8("graphics/pokemon/meowth/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2143,9 +2143,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/front.4bpp.lz"); + const u32 gMonFrontPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/front.4bpp.smol"); const u16 gMonPalette_PersianAlola[] = INCBIN_U16("graphics/pokemon/persian/alola/normal.gbapal"); - const u32 gMonBackPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/back.4bpp.lz"); + const u32 gMonBackPic_PersianAlola[] = INCBIN_U32("graphics/pokemon/persian/alola/back.4bpp.smol"); const u16 gMonShinyPalette_PersianAlola[] = INCBIN_U16("graphics/pokemon/persian/alola/shiny.gbapal"); const u8 gMonIcon_PersianAlola[] = INCBIN_U8("graphics/pokemon/persian/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2158,9 +2158,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_ALOLAN_FORMS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/front.4bpp.smol"); const u16 gMonPalette_MeowthGalar[] = INCBIN_U16("graphics/pokemon/meowth/galar/normal.gbapal"); - const u32 gMonBackPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/back.4bpp.lz"); + const u32 gMonBackPic_MeowthGalar[] = INCBIN_U32("graphics/pokemon/meowth/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MeowthGalar[] = INCBIN_U16("graphics/pokemon/meowth/galar/shiny.gbapal"); const u8 gMonIcon_MeowthGalar[] = INCBIN_U8("graphics/pokemon/meowth/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2171,9 +2171,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/front.4bpp.lz"); + const u32 gMonFrontPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/front.4bpp.smol"); const u16 gMonPalette_Perrserker[] = INCBIN_U16("graphics/pokemon/perrserker/normal.gbapal"); - const u32 gMonBackPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/back.4bpp.lz"); + const u32 gMonBackPic_Perrserker[] = INCBIN_U32("graphics/pokemon/perrserker/back.4bpp.smol"); const u16 gMonShinyPalette_Perrserker[] = INCBIN_U16("graphics/pokemon/perrserker/shiny.gbapal"); const u8 gMonIcon_Perrserker[] = INCBIN_U8("graphics/pokemon/perrserker/icon.4bpp"); #if P_FOOTPRINTS @@ -2189,8 +2189,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GALARIAN_FORMS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MeowthGmax[] = INCBIN_U32("graphics/pokemon/meowth/gmax/back.4bpp.smol"); const u16 gMonPalette_MeowthGmax[] = INCBIN_U16("graphics/pokemon/meowth/gmax/normal.gbapal"); const u16 gMonShinyPalette_MeowthGmax[] = INCBIN_U16("graphics/pokemon/meowth/gmax/shiny.gbapal"); const u8 gMonIcon_MeowthGmax[] = INCBIN_U8("graphics/pokemon/meowth/gmax/icon.4bpp"); @@ -2206,14 +2206,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PSYDUCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front.4bpp.smol"); const u16 gMonPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/normal.gbapal"); - const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.lz"); + const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.smol"); const u16 gMonShinyPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/shiny.gbapal"); #else - const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/normal_gba.gbapal"); - const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back_gba.4bpp.lz"); + const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Psyduck[] = INCBIN_U16("graphics/pokemon/psyduck/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2233,14 +2233,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front.4bpp.smol"); const u16 gMonPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/normal.gbapal"); - const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.lz"); + const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.smol"); const u16 gMonShinyPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/shiny.gbapal"); #else - const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/normal_gba.gbapal"); - const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golduck[] = INCBIN_U16("graphics/pokemon/golduck/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2262,14 +2262,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MANKEY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front.4bpp.smol"); const u16 gMonPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/normal.gbapal"); - const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.lz"); + const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.smol"); const u16 gMonShinyPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/shiny.gbapal"); #else - const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/normal_gba.gbapal"); - const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mankey[] = INCBIN_U16("graphics/pokemon/mankey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2289,14 +2289,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front.4bpp.smol"); const u16 gMonPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/normal.gbapal"); - const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.lz"); + const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.smol"); const u16 gMonShinyPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/shiny.gbapal"); #else - const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/normal_gba.gbapal"); - const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back_gba.4bpp.lz"); + const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Primeape[] = INCBIN_U16("graphics/pokemon/primeape/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2316,9 +2316,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/front.4bpp.lz"); + const u32 gMonFrontPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/front.4bpp.smol"); const u16 gMonPalette_Annihilape[] = INCBIN_U16("graphics/pokemon/annihilape/normal.gbapal"); - const u32 gMonBackPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/back.4bpp.lz"); + const u32 gMonBackPic_Annihilape[] = INCBIN_U32("graphics/pokemon/annihilape/back.4bpp.smol"); const u16 gMonShinyPalette_Annihilape[] = INCBIN_U16("graphics/pokemon/annihilape/shiny.gbapal"); const u8 gMonIcon_Annihilape[] = INCBIN_U8("graphics/pokemon/annihilape/icon.4bpp"); #if P_FOOTPRINTS @@ -2336,14 +2336,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GROWLITHE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front.4bpp.smol"); const u16 gMonPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/normal.gbapal"); - const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.lz"); + const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.smol"); const u16 gMonShinyPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/shiny.gbapal"); #else - const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/normal_gba.gbapal"); - const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back_gba.4bpp.lz"); + const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Growlithe[] = INCBIN_U16("graphics/pokemon/growlithe/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2363,14 +2363,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front.4bpp.smol"); const u16 gMonPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/normal.gbapal"); - const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.lz"); + const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.smol"); const u16 gMonShinyPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/shiny.gbapal"); #else - const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/normal_gba.gbapal"); - const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Arcanine[] = INCBIN_U16("graphics/pokemon/arcanine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2390,9 +2390,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/front.4bpp.smol"); const u16 gMonPalette_GrowlitheHisui[] = INCBIN_U16("graphics/pokemon/growlithe/hisui/normal.gbapal"); - const u32 gMonBackPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/back.4bpp.lz"); + const u32 gMonBackPic_GrowlitheHisui[] = INCBIN_U32("graphics/pokemon/growlithe/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_GrowlitheHisui[] = INCBIN_U16("graphics/pokemon/growlithe/hisui/shiny.gbapal"); const u8 gMonIcon_GrowlitheHisui[] = INCBIN_U8("graphics/pokemon/growlithe/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2403,9 +2403,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/front.4bpp.smol"); const u16 gMonPalette_ArcanineHisui[] = INCBIN_U16("graphics/pokemon/arcanine/hisui/normal.gbapal"); - const u32 gMonBackPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ArcanineHisui[] = INCBIN_U32("graphics/pokemon/arcanine/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ArcanineHisui[] = INCBIN_U16("graphics/pokemon/arcanine/hisui/shiny.gbapal"); const u8 gMonIcon_ArcanineHisui[] = INCBIN_U8("graphics/pokemon/arcanine/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2420,14 +2420,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_POLIWAG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/normal.gbapal"); - const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.lz"); + const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwag[] = INCBIN_U16("graphics/pokemon/poliwag/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2447,14 +2447,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/normal.gbapal"); - const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.lz"); + const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwhirl[] = INCBIN_U16("graphics/pokemon/poliwhirl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2474,14 +2474,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front.4bpp.smol"); const u16 gMonPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/normal.gbapal"); - const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.lz"); + const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.smol"); const u16 gMonShinyPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/shiny.gbapal"); #else - const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/normal_gba.gbapal"); - const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poliwrath[] = INCBIN_U16("graphics/pokemon/poliwrath/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2502,14 +2502,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front.4bpp.smol"); const u16 gMonPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/normal.gbapal"); - const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.lz"); + const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.smol"); const u16 gMonShinyPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/shiny.gbapal"); #else - const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/normal_gba.gbapal"); - const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back_gba.4bpp.lz"); + const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Politoed[] = INCBIN_U16("graphics/pokemon/politoed/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2529,8 +2529,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/backf.4bpp.lz"); + const u32 gMonFrontPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PolitoedF[] = INCBIN_U32("graphics/pokemon/politoed/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PolitoedF[] = INCBIN_COMP("graphics/pokemon/politoed/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -2540,14 +2540,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ABRA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front.4bpp.smol"); const u16 gMonPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/normal.gbapal"); - const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.lz"); + const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.smol"); const u16 gMonShinyPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/shiny.gbapal"); #else - const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/normal_gba.gbapal"); - const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Abra[] = INCBIN_U16("graphics/pokemon/abra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2567,14 +2567,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front.4bpp.smol"); const u16 gMonPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/normal.gbapal"); - const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.lz"); + const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.smol"); const u16 gMonShinyPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/shiny.gbapal"); #else - const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/normal_gba.gbapal"); - const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kadabra[] = INCBIN_U16("graphics/pokemon/kadabra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2594,22 +2594,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/backf.4bpp.lz"); + const u32 gMonFrontPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KadabraF[] = INCBIN_U32("graphics/pokemon/kadabra/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KadabraF[] = INCBIN_COMP("graphics/pokemon/kadabra/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front.4bpp.smol"); const u16 gMonPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/normal.gbapal"); - const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.lz"); + const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.smol"); const u16 gMonShinyPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/shiny.gbapal"); #else - const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/normal_gba.gbapal"); - const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back_gba.4bpp.lz"); + const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Alakazam[] = INCBIN_U16("graphics/pokemon/alakazam/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2629,17 +2629,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/backf.4bpp.lz"); + const u32 gMonFrontPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AlakazamF[] = INCBIN_U32("graphics/pokemon/alakazam/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AlakazamF[] = INCBIN_COMP("graphics/pokemon/alakazam/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/front.4bpp.smol"); const u16 gMonPalette_AlakazamMega[] = INCBIN_U16("graphics/pokemon/alakazam/mega/normal.gbapal"); - const u32 gMonBackPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/back.4bpp.lz"); + const u32 gMonBackPic_AlakazamMega[] = INCBIN_U32("graphics/pokemon/alakazam/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AlakazamMega[] = INCBIN_U16("graphics/pokemon/alakazam/mega/shiny.gbapal"); const u8 gMonIcon_AlakazamMega[] = INCBIN_U8("graphics/pokemon/alakazam/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -2654,14 +2654,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MACHOP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front.4bpp.smol"); const u16 gMonPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/normal.gbapal"); - const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.lz"); + const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.smol"); const u16 gMonShinyPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/shiny.gbapal"); #else - const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/normal_gba.gbapal"); - const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machop[] = INCBIN_U16("graphics/pokemon/machop/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2681,14 +2681,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front.4bpp.smol"); const u16 gMonPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/normal.gbapal"); - const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.lz"); + const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.smol"); const u16 gMonShinyPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/shiny.gbapal"); #else - const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/normal_gba.gbapal"); - const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machoke[] = INCBIN_U16("graphics/pokemon/machoke/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2708,14 +2708,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front.4bpp.smol"); const u16 gMonPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/normal.gbapal"); - const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.lz"); + const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.smol"); const u16 gMonShinyPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/shiny.gbapal"); #else - const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/normal_gba.gbapal"); - const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Machamp[] = INCBIN_U16("graphics/pokemon/machamp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2735,8 +2735,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MachampGmax[] = INCBIN_U32("graphics/pokemon/machamp/gmax/back.4bpp.smol"); const u16 gMonPalette_MachampGmax[] = INCBIN_U16("graphics/pokemon/machamp/gmax/normal.gbapal"); const u16 gMonShinyPalette_MachampGmax[] = INCBIN_U16("graphics/pokemon/machamp/gmax/shiny.gbapal"); const u8 gMonIcon_MachampGmax[] = INCBIN_U8("graphics/pokemon/machamp/gmax/icon.4bpp"); @@ -2752,14 +2752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BELLSPROUT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front.4bpp.smol"); const u16 gMonPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/normal.gbapal"); - const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.lz"); + const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.smol"); const u16 gMonShinyPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/shiny.gbapal"); #else - const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/normal_gba.gbapal"); - const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bellsprout[] = INCBIN_U16("graphics/pokemon/bellsprout/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2779,14 +2779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front.4bpp.smol"); const u16 gMonPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/normal.gbapal"); - const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.lz"); + const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.smol"); const u16 gMonShinyPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/shiny.gbapal"); #else - const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/normal_gba.gbapal"); - const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weepinbell[] = INCBIN_U16("graphics/pokemon/weepinbell/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2806,14 +2806,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front.4bpp.smol"); const u16 gMonPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/normal.gbapal"); - const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.lz"); + const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.smol"); const u16 gMonShinyPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/shiny.gbapal"); #else - const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/normal_gba.gbapal"); - const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Victreebel[] = INCBIN_U16("graphics/pokemon/victreebel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2835,14 +2835,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TENTACOOL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front.4bpp.smol"); const u16 gMonPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/normal.gbapal"); - const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.lz"); + const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.smol"); const u16 gMonShinyPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/shiny.gbapal"); #else - const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/normal_gba.gbapal"); - const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tentacool[] = INCBIN_U16("graphics/pokemon/tentacool/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2862,14 +2862,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front.4bpp.smol"); const u16 gMonPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/normal.gbapal"); - const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.lz"); + const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.smol"); const u16 gMonShinyPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/shiny.gbapal"); #else - const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/normal_gba.gbapal"); - const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tentacruel[] = INCBIN_U16("graphics/pokemon/tentacruel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2891,14 +2891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GEODUDE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front.4bpp.smol"); const u16 gMonPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/normal.gbapal"); - const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.lz"); + const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.smol"); const u16 gMonShinyPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/shiny.gbapal"); #else - const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/normal_gba.gbapal"); - const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back_gba.4bpp.lz"); + const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Geodude[] = INCBIN_U16("graphics/pokemon/geodude/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2918,14 +2918,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front.4bpp.smol"); const u16 gMonPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/normal.gbapal"); - const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.lz"); + const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.smol"); const u16 gMonShinyPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/shiny.gbapal"); #else - const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/normal_gba.gbapal"); - const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Graveler[] = INCBIN_U16("graphics/pokemon/graveler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2945,14 +2945,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front.4bpp.smol"); const u16 gMonPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/normal.gbapal"); - const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.lz"); + const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.smol"); const u16 gMonShinyPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/shiny.gbapal"); #else - const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/normal_gba.gbapal"); - const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back_gba.4bpp.lz"); + const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Golem[] = INCBIN_U16("graphics/pokemon/golem/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -2976,9 +2976,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/front.4bpp.smol"); const u16 gMonPalette_GeodudeAlola[] = INCBIN_U16("graphics/pokemon/geodude/alola/normal.gbapal"); - const u32 gMonBackPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/back.4bpp.lz"); + const u32 gMonBackPic_GeodudeAlola[] = INCBIN_U32("graphics/pokemon/geodude/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GeodudeAlola[] = INCBIN_U16("graphics/pokemon/geodude/alola/shiny.gbapal"); const u8 gMonIcon_GeodudeAlola[] = INCBIN_U8("graphics/pokemon/geodude/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -2989,9 +2989,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/front.4bpp.smol"); const u16 gMonPalette_GravelerAlola[] = INCBIN_U16("graphics/pokemon/graveler/alola/normal.gbapal"); - const u32 gMonBackPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/back.4bpp.lz"); + const u32 gMonBackPic_GravelerAlola[] = INCBIN_U32("graphics/pokemon/graveler/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GravelerAlola[] = INCBIN_U16("graphics/pokemon/graveler/alola/shiny.gbapal"); const u8 gMonIcon_GravelerAlola[] = INCBIN_U8("graphics/pokemon/graveler/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3002,9 +3002,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/front.4bpp.smol"); const u16 gMonPalette_GolemAlola[] = INCBIN_U16("graphics/pokemon/golem/alola/normal.gbapal"); - const u32 gMonBackPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/back.4bpp.lz"); + const u32 gMonBackPic_GolemAlola[] = INCBIN_U32("graphics/pokemon/golem/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GolemAlola[] = INCBIN_U16("graphics/pokemon/golem/alola/shiny.gbapal"); const u8 gMonIcon_GolemAlola[] = INCBIN_U8("graphics/pokemon/golem/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3019,14 +3019,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PONYTA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front.4bpp.smol"); const u16 gMonPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/normal.gbapal"); - const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.lz"); + const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.smol"); const u16 gMonShinyPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/shiny.gbapal"); #else - const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/normal_gba.gbapal"); - const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ponyta[] = INCBIN_U16("graphics/pokemon/ponyta/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3046,14 +3046,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front.4bpp.smol"); const u16 gMonPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/normal.gbapal"); - const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.lz"); + const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.smol"); const u16 gMonShinyPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/shiny.gbapal"); #else - const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/normal_gba.gbapal"); - const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rapidash[] = INCBIN_U16("graphics/pokemon/rapidash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3073,9 +3073,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/front.4bpp.lz"); + const u32 gMonFrontPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/front.4bpp.smol"); const u16 gMonPalette_PonytaGalar[] = INCBIN_U16("graphics/pokemon/ponyta/galar/normal.gbapal"); - const u32 gMonBackPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/back.4bpp.lz"); + const u32 gMonBackPic_PonytaGalar[] = INCBIN_U32("graphics/pokemon/ponyta/galar/back.4bpp.smol"); const u16 gMonShinyPalette_PonytaGalar[] = INCBIN_U16("graphics/pokemon/ponyta/galar/shiny.gbapal"); const u8 gMonIcon_PonytaGalar[] = INCBIN_U8("graphics/pokemon/ponyta/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3086,9 +3086,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/front.4bpp.lz"); + const u32 gMonFrontPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/front.4bpp.smol"); const u16 gMonPalette_RapidashGalar[] = INCBIN_U16("graphics/pokemon/rapidash/galar/normal.gbapal"); - const u32 gMonBackPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/back.4bpp.lz"); + const u32 gMonBackPic_RapidashGalar[] = INCBIN_U32("graphics/pokemon/rapidash/galar/back.4bpp.smol"); const u16 gMonShinyPalette_RapidashGalar[] = INCBIN_U16("graphics/pokemon/rapidash/galar/shiny.gbapal"); const u8 gMonIcon_RapidashGalar[] = INCBIN_U8("graphics/pokemon/rapidash/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3103,14 +3103,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLOWPOKE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front.4bpp.smol"); const u16 gMonPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/normal.gbapal"); - const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.lz"); + const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.smol"); const u16 gMonShinyPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/normal_gba.gbapal"); - const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowpoke[] = INCBIN_U16("graphics/pokemon/slowpoke/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3130,14 +3130,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front.4bpp.smol"); const u16 gMonPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/normal.gbapal"); - const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.lz"); + const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.smol"); const u16 gMonShinyPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/normal_gba.gbapal"); - const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowbro[] = INCBIN_U16("graphics/pokemon/slowbro/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3158,14 +3158,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front.4bpp.smol"); const u16 gMonPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/normal.gbapal"); - const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.lz"); + const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.smol"); const u16 gMonShinyPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/shiny.gbapal"); #else - const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/normal_gba.gbapal"); - const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slowking[] = INCBIN_U16("graphics/pokemon/slowking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3186,9 +3186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/front.4bpp.smol"); const u16 gMonPalette_SlowbroMega[] = INCBIN_U16("graphics/pokemon/slowbro/mega/normal.gbapal"); - const u32 gMonBackPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/back.4bpp.lz"); + const u32 gMonBackPic_SlowbroMega[] = INCBIN_U32("graphics/pokemon/slowbro/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SlowbroMega[] = INCBIN_U16("graphics/pokemon/slowbro/mega/shiny.gbapal"); const u8 gMonIcon_SlowbroMega[] = INCBIN_U8("graphics/pokemon/slowbro/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3201,9 +3201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/front.4bpp.smol"); const u16 gMonPalette_SlowpokeGalar[] = INCBIN_U16("graphics/pokemon/slowpoke/galar/normal.gbapal"); - const u32 gMonBackPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowpokeGalar[] = INCBIN_U32("graphics/pokemon/slowpoke/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowpokeGalar[] = INCBIN_U16("graphics/pokemon/slowpoke/galar/shiny.gbapal"); const u8 gMonIcon_SlowpokeGalar[] = INCBIN_U8("graphics/pokemon/slowpoke/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3214,9 +3214,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/front.4bpp.smol"); const u16 gMonPalette_SlowbroGalar[] = INCBIN_U16("graphics/pokemon/slowbro/galar/normal.gbapal"); - const u32 gMonBackPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowbroGalar[] = INCBIN_U32("graphics/pokemon/slowbro/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowbroGalar[] = INCBIN_U16("graphics/pokemon/slowbro/galar/shiny.gbapal"); const u8 gMonIcon_SlowbroGalar[] = INCBIN_U8("graphics/pokemon/slowbro/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3228,9 +3228,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_2_CROSS_EVOS - const u32 gMonFrontPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/front.4bpp.lz"); + const u32 gMonFrontPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/front.4bpp.smol"); const u16 gMonPalette_SlowkingGalar[] = INCBIN_U16("graphics/pokemon/slowking/galar/normal.gbapal"); - const u32 gMonBackPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/back.4bpp.lz"); + const u32 gMonBackPic_SlowkingGalar[] = INCBIN_U32("graphics/pokemon/slowking/galar/back.4bpp.smol"); const u16 gMonShinyPalette_SlowkingGalar[] = INCBIN_U16("graphics/pokemon/slowking/galar/shiny.gbapal"); const u8 gMonIcon_SlowkingGalar[] = INCBIN_U8("graphics/pokemon/slowking/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3246,14 +3246,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGNEMITE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front.4bpp.smol"); const u16 gMonPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/normal.gbapal"); - const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.lz"); + const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.smol"); const u16 gMonShinyPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/shiny.gbapal"); #else - const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/normal_gba.gbapal"); - const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magnemite[] = INCBIN_U16("graphics/pokemon/magnemite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3273,14 +3273,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front.4bpp.smol"); const u16 gMonPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/normal.gbapal"); - const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.lz"); + const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.smol"); const u16 gMonShinyPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/shiny.gbapal"); #else - const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/normal_gba.gbapal"); - const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magneton[] = INCBIN_U16("graphics/pokemon/magneton/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3300,9 +3300,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/anim_front.4bpp.smol"); const u16 gMonPalette_Magnezone[] = INCBIN_U16("graphics/pokemon/magnezone/normal.gbapal"); - const u32 gMonBackPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/back.4bpp.lz"); + const u32 gMonBackPic_Magnezone[] = INCBIN_U32("graphics/pokemon/magnezone/back.4bpp.smol"); const u16 gMonShinyPalette_Magnezone[] = INCBIN_U16("graphics/pokemon/magnezone/shiny.gbapal"); const u8 gMonIcon_Magnezone[] = INCBIN_U8("graphics/pokemon/magnezone/icon.4bpp"); #if P_FOOTPRINTS @@ -3320,14 +3320,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_FARFETCHD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front.4bpp.smol"); const u16 gMonPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/normal.gbapal"); - const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back.4bpp.lz"); + const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back.4bpp.smol"); const u16 gMonShinyPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/shiny.gbapal"); #else - const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/normal_gba.gbapal"); - const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back_gba.4bpp.lz"); + const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetchd/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Farfetchd[] = INCBIN_U16("graphics/pokemon/farfetchd/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3347,9 +3347,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/front.4bpp.lz"); + const u32 gMonFrontPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/front.4bpp.smol"); const u16 gMonPalette_FarfetchdGalar[] = INCBIN_U16("graphics/pokemon/farfetchd/galar/normal.gbapal"); - const u32 gMonBackPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/back.4bpp.lz"); + const u32 gMonBackPic_FarfetchdGalar[] = INCBIN_U32("graphics/pokemon/farfetchd/galar/back.4bpp.smol"); const u16 gMonShinyPalette_FarfetchdGalar[] = INCBIN_U16("graphics/pokemon/farfetchd/galar/shiny.gbapal"); const u8 gMonIcon_FarfetchdGalar[] = INCBIN_U8("graphics/pokemon/farfetchd/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3360,9 +3360,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/front.4bpp.lz"); + const u32 gMonFrontPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/front.4bpp.smol"); const u16 gMonPalette_Sirfetchd[] = INCBIN_U16("graphics/pokemon/sirfetchd/normal.gbapal"); - const u32 gMonBackPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/back.4bpp.lz"); + const u32 gMonBackPic_Sirfetchd[] = INCBIN_U32("graphics/pokemon/sirfetchd/back.4bpp.smol"); const u16 gMonShinyPalette_Sirfetchd[] = INCBIN_U16("graphics/pokemon/sirfetchd/shiny.gbapal"); const u8 gMonIcon_Sirfetchd[] = INCBIN_U8("graphics/pokemon/sirfetchd/icon.4bpp"); #if P_FOOTPRINTS @@ -3380,14 +3380,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DODUO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front.4bpp.smol"); const u16 gMonPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/normal.gbapal"); - const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.lz"); + const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.smol"); const u16 gMonShinyPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/shiny.gbapal"); #else - const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/normal_gba.gbapal"); - const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Doduo[] = INCBIN_U16("graphics/pokemon/doduo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3407,22 +3407,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/backf.4bpp.lz"); + const u32 gMonFrontPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DoduoF[] = INCBIN_U32("graphics/pokemon/doduo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DoduoF[] = INCBIN_COMP("graphics/pokemon/doduo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front.4bpp.smol"); const u16 gMonPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/normal.gbapal"); - const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.lz"); + const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.smol"); const u16 gMonShinyPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/shiny.gbapal"); #else - const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/normal_gba.gbapal"); - const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dodrio[] = INCBIN_U16("graphics/pokemon/dodrio/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3442,8 +3442,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/backf.4bpp.lz"); + const u32 gMonFrontPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DodrioF[] = INCBIN_U32("graphics/pokemon/dodrio/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DodrioF[] = INCBIN_COMP("graphics/pokemon/dodrio/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -3452,14 +3452,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front.4bpp.smol"); const u16 gMonPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/normal.gbapal"); - const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.lz"); + const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.smol"); const u16 gMonShinyPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/shiny.gbapal"); #else - const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/normal_gba.gbapal"); - const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seel[] = INCBIN_U16("graphics/pokemon/seel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3479,14 +3479,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front.4bpp.smol"); const u16 gMonPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/normal.gbapal"); - const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.lz"); + const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.smol"); const u16 gMonShinyPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/shiny.gbapal"); #else - const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/normal_gba.gbapal"); - const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dewgong[] = INCBIN_U16("graphics/pokemon/dewgong/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3508,14 +3508,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GRIMER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front.4bpp.smol"); const u16 gMonPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/normal.gbapal"); - const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.lz"); + const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.smol"); const u16 gMonShinyPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/shiny.gbapal"); #else - const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/normal_gba.gbapal"); - const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grimer[] = INCBIN_U16("graphics/pokemon/grimer/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3535,14 +3535,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front.4bpp.smol"); const u16 gMonPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/normal.gbapal"); - const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.lz"); + const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.smol"); const u16 gMonShinyPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/shiny.gbapal"); #else - const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/normal_gba.gbapal"); - const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back_gba.4bpp.lz"); + const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Muk[] = INCBIN_U16("graphics/pokemon/muk/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3562,9 +3562,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/front.4bpp.lz"); + const u32 gMonFrontPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/front.4bpp.smol"); const u16 gMonPalette_GrimerAlola[] = INCBIN_U16("graphics/pokemon/grimer/alola/normal.gbapal"); - const u32 gMonBackPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/back.4bpp.lz"); + const u32 gMonBackPic_GrimerAlola[] = INCBIN_U32("graphics/pokemon/grimer/alola/back.4bpp.smol"); const u16 gMonShinyPalette_GrimerAlola[] = INCBIN_U16("graphics/pokemon/grimer/alola/shiny.gbapal"); const u8 gMonIcon_GrimerAlola[] = INCBIN_U8("graphics/pokemon/grimer/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3575,9 +3575,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/front.4bpp.smol"); const u16 gMonPalette_MukAlola[] = INCBIN_U16("graphics/pokemon/muk/alola/normal.gbapal"); - const u32 gMonBackPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/back.4bpp.lz"); + const u32 gMonBackPic_MukAlola[] = INCBIN_U32("graphics/pokemon/muk/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MukAlola[] = INCBIN_U16("graphics/pokemon/muk/alola/shiny.gbapal"); const u8 gMonIcon_MukAlola[] = INCBIN_U8("graphics/pokemon/muk/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -3592,14 +3592,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHELLDER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front.4bpp.smol"); const u16 gMonPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/normal.gbapal"); - const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.lz"); + const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.smol"); const u16 gMonShinyPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/shiny.gbapal"); #else - const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/normal_gba.gbapal"); - const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shellder[] = INCBIN_U16("graphics/pokemon/shellder/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3619,14 +3619,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front.4bpp.smol"); const u16 gMonPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/normal.gbapal"); - const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.lz"); + const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.smol"); const u16 gMonShinyPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/shiny.gbapal"); #else - const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/normal_gba.gbapal"); - const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cloyster[] = INCBIN_U16("graphics/pokemon/cloyster/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3648,14 +3648,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GASTLY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front.4bpp.smol"); const u16 gMonPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/normal.gbapal"); - const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.lz"); + const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.smol"); const u16 gMonShinyPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/shiny.gbapal"); #else - const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/normal_gba.gbapal"); - const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gastly[] = INCBIN_U16("graphics/pokemon/gastly/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3675,14 +3675,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front.4bpp.smol"); const u16 gMonPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/normal.gbapal"); - const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.lz"); + const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.smol"); const u16 gMonShinyPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/shiny.gbapal"); #else - const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/normal_gba.gbapal"); - const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back_gba.4bpp.lz"); + const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Haunter[] = INCBIN_U16("graphics/pokemon/haunter/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3702,14 +3702,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front.4bpp.smol"); const u16 gMonPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/normal.gbapal"); - const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.lz"); + const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.smol"); const u16 gMonShinyPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/shiny.gbapal"); #else - const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/normal_gba.gbapal"); - const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gengar[] = INCBIN_U16("graphics/pokemon/gengar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3729,9 +3729,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/front.4bpp.smol"); const u16 gMonPalette_GengarMega[] = INCBIN_U16("graphics/pokemon/gengar/mega/normal.gbapal"); - const u32 gMonBackPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/back.4bpp.lz"); + const u32 gMonBackPic_GengarMega[] = INCBIN_U32("graphics/pokemon/gengar/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GengarMega[] = INCBIN_U16("graphics/pokemon/gengar/mega/shiny.gbapal"); const u8 gMonIcon_GengarMega[] = INCBIN_U8("graphics/pokemon/gengar/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3744,8 +3744,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GengarGmax[] = INCBIN_U32("graphics/pokemon/gengar/gmax/back.4bpp.smol"); const u16 gMonPalette_GengarGmax[] = INCBIN_U16("graphics/pokemon/gengar/gmax/normal.gbapal"); const u16 gMonShinyPalette_GengarGmax[] = INCBIN_U16("graphics/pokemon/gengar/gmax/shiny.gbapal"); const u8 gMonIcon_GengarGmax[] = INCBIN_U8("graphics/pokemon/gengar/gmax/icon.4bpp"); @@ -3761,14 +3761,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ONIX #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front.4bpp.smol"); const u16 gMonPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/normal.gbapal"); - const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.lz"); + const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.smol"); const u16 gMonShinyPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/shiny.gbapal"); #else - const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/normal_gba.gbapal"); - const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Onix[] = INCBIN_U16("graphics/pokemon/onix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3789,14 +3789,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front.4bpp.smol"); const u16 gMonPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/normal.gbapal"); - const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.lz"); + const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.smol"); const u16 gMonShinyPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/shiny.gbapal"); #else - const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/normal_gba.gbapal"); - const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back_gba.4bpp.lz"); + const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Steelix[] = INCBIN_U16("graphics/pokemon/steelix/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3816,17 +3816,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/backf.4bpp.lz"); + const u32 gMonFrontPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SteelixF[] = INCBIN_U32("graphics/pokemon/steelix/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SteelixF[] = INCBIN_COMP("graphics/pokemon/steelix/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/front.4bpp.smol"); const u16 gMonPalette_SteelixMega[] = INCBIN_U16("graphics/pokemon/steelix/mega/normal.gbapal"); - const u32 gMonBackPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/back.4bpp.lz"); + const u32 gMonBackPic_SteelixMega[] = INCBIN_U32("graphics/pokemon/steelix/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SteelixMega[] = INCBIN_U16("graphics/pokemon/steelix/mega/shiny.gbapal"); const u8 gMonIcon_SteelixMega[] = INCBIN_U8("graphics/pokemon/steelix/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -3842,14 +3842,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DROWZEE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front.4bpp.smol"); const u16 gMonPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/normal.gbapal"); - const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.lz"); + const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.smol"); const u16 gMonShinyPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/shiny.gbapal"); #else - const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/normal_gba.gbapal"); - const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Drowzee[] = INCBIN_U16("graphics/pokemon/drowzee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3869,14 +3869,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front.4bpp.smol"); const u16 gMonPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/normal.gbapal"); - const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.lz"); + const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.smol"); const u16 gMonShinyPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/shiny.gbapal"); #else - const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/normal_gba.gbapal"); - const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hypno[] = INCBIN_U16("graphics/pokemon/hypno/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3896,8 +3896,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/backf.4bpp.lz"); + const u32 gMonFrontPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HypnoF[] = INCBIN_U32("graphics/pokemon/hypno/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HypnoF[] = INCBIN_COMP("graphics/pokemon/hypno/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -3906,14 +3906,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KRABBY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front.4bpp.smol"); const u16 gMonPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/normal.gbapal"); - const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.lz"); + const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.smol"); const u16 gMonShinyPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/shiny.gbapal"); #else - const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/normal_gba.gbapal"); - const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back_gba.4bpp.lz"); + const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Krabby[] = INCBIN_U16("graphics/pokemon/krabby/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3933,14 +3933,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front.4bpp.smol"); const u16 gMonPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/normal.gbapal"); - const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.lz"); + const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.smol"); const u16 gMonShinyPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/shiny.gbapal"); #else - const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/normal_gba.gbapal"); - const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kingler[] = INCBIN_U16("graphics/pokemon/kingler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -3960,8 +3960,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/front.4bpp.lz"); - const u32 gMonBackPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/front.4bpp.smol"); + const u32 gMonBackPic_KinglerGmax[] = INCBIN_U32("graphics/pokemon/kingler/gmax/back.4bpp.smol"); const u16 gMonPalette_KinglerGmax[] = INCBIN_U16("graphics/pokemon/kingler/gmax/normal.gbapal"); const u16 gMonShinyPalette_KinglerGmax[] = INCBIN_U16("graphics/pokemon/kingler/gmax/shiny.gbapal"); const u8 gMonIcon_KinglerGmax[] = INCBIN_U8("graphics/pokemon/kingler/gmax/icon.4bpp"); @@ -3977,14 +3977,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VOLTORB #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front.4bpp.smol"); const u16 gMonPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/normal.gbapal"); - const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.lz"); + const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.smol"); const u16 gMonShinyPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/shiny.gbapal"); #else - const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/normal_gba.gbapal"); - const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back_gba.4bpp.lz"); + const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Voltorb[] = INCBIN_U16("graphics/pokemon/voltorb/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4004,14 +4004,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front.4bpp.smol"); const u16 gMonPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/normal.gbapal"); - const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.lz"); + const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.smol"); const u16 gMonShinyPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/shiny.gbapal"); #else - const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/normal_gba.gbapal"); - const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electrode[] = INCBIN_U16("graphics/pokemon/electrode/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4031,9 +4031,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/front.4bpp.smol"); const u16 gMonPalette_VoltorbHisui[] = INCBIN_U16("graphics/pokemon/voltorb/hisui/normal.gbapal"); - const u32 gMonBackPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/back.4bpp.lz"); + const u32 gMonBackPic_VoltorbHisui[] = INCBIN_U32("graphics/pokemon/voltorb/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_VoltorbHisui[] = INCBIN_U16("graphics/pokemon/voltorb/hisui/shiny.gbapal"); const u8 gMonIcon_VoltorbHisui[] = INCBIN_U8("graphics/pokemon/voltorb/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4044,9 +4044,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/front.4bpp.smol"); const u16 gMonPalette_ElectrodeHisui[] = INCBIN_U16("graphics/pokemon/electrode/hisui/normal.gbapal"); - const u32 gMonBackPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ElectrodeHisui[] = INCBIN_U32("graphics/pokemon/electrode/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ElectrodeHisui[] = INCBIN_U16("graphics/pokemon/electrode/hisui/shiny.gbapal"); const u8 gMonIcon_ElectrodeHisui[] = INCBIN_U8("graphics/pokemon/electrode/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4061,14 +4061,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EXEGGCUTE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front.4bpp.smol"); const u16 gMonPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/normal.gbapal"); - const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.lz"); + const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.smol"); const u16 gMonShinyPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/shiny.gbapal"); #else - const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/normal_gba.gbapal"); - const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exeggcute[] = INCBIN_U16("graphics/pokemon/exeggcute/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4088,14 +4088,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front.4bpp.smol"); const u16 gMonPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/normal.gbapal"); - const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.lz"); + const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.smol"); const u16 gMonShinyPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/shiny.gbapal"); #else - const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/normal_gba.gbapal"); - const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exeggutor[] = INCBIN_U16("graphics/pokemon/exeggutor/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4115,9 +4115,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/anim_front.4bpp.smol"); const u16 gMonPalette_ExeggutorAlola[] = INCBIN_U16("graphics/pokemon/exeggutor/alola/normal.gbapal"); - const u32 gMonBackPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/back.4bpp.lz"); + const u32 gMonBackPic_ExeggutorAlola[] = INCBIN_U32("graphics/pokemon/exeggutor/alola/back.4bpp.smol"); const u16 gMonShinyPalette_ExeggutorAlola[] = INCBIN_U16("graphics/pokemon/exeggutor/alola/shiny.gbapal"); const u8 gMonIcon_ExeggutorAlola[] = INCBIN_U8("graphics/pokemon/exeggutor/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4132,14 +4132,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CUBONE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front.4bpp.smol"); const u16 gMonPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/normal.gbapal"); - const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.lz"); + const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.smol"); const u16 gMonShinyPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/shiny.gbapal"); #else - const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/normal_gba.gbapal"); - const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cubone[] = INCBIN_U16("graphics/pokemon/cubone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4159,14 +4159,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front.4bpp.smol"); const u16 gMonPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/normal.gbapal"); - const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.lz"); + const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.smol"); const u16 gMonShinyPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/shiny.gbapal"); #else - const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/normal_gba.gbapal"); - const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marowak[] = INCBIN_U16("graphics/pokemon/marowak/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4186,9 +4186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ALOLAN_FORMS - const u32 gMonFrontPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/front.4bpp.lz"); + const u32 gMonFrontPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/front.4bpp.smol"); const u16 gMonPalette_MarowakAlola[] = INCBIN_U16("graphics/pokemon/marowak/alola/normal.gbapal"); - const u32 gMonBackPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/back.4bpp.lz"); + const u32 gMonBackPic_MarowakAlola[] = INCBIN_U32("graphics/pokemon/marowak/alola/back.4bpp.smol"); const u16 gMonShinyPalette_MarowakAlola[] = INCBIN_U16("graphics/pokemon/marowak/alola/shiny.gbapal"); const u8 gMonIcon_MarowakAlola[] = INCBIN_U8("graphics/pokemon/marowak/alola/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4204,14 +4204,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HITMONS #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/normal.gbapal"); - const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.lz"); + const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/shiny.gbapal"); #else - const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/normal_gba.gbapal"); - const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tyrogue[] = INCBIN_U16("graphics/pokemon/tyrogue/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4232,14 +4232,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/normal.gbapal"); - const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.lz"); + const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmonlee[] = INCBIN_U16("graphics/pokemon/hitmonlee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4259,14 +4259,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/normal.gbapal"); - const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.lz"); + const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmonchan[] = INCBIN_U16("graphics/pokemon/hitmonchan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4287,14 +4287,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front.4bpp.smol"); const u16 gMonPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/normal.gbapal"); - const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.lz"); + const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.smol"); const u16 gMonShinyPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/shiny.gbapal"); #else - const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/normal_gba.gbapal"); - const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hitmontop[] = INCBIN_U16("graphics/pokemon/hitmontop/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4317,14 +4317,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LICKITUNG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front.4bpp.smol"); const u16 gMonPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/normal.gbapal"); - const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.lz"); + const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.smol"); const u16 gMonShinyPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/shiny.gbapal"); #else - const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/normal_gba.gbapal"); - const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lickitung[] = INCBIN_U16("graphics/pokemon/lickitung/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4344,9 +4344,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/anim_front.4bpp.smol"); const u16 gMonPalette_Lickilicky[] = INCBIN_U16("graphics/pokemon/lickilicky/normal.gbapal"); - const u32 gMonBackPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/back.4bpp.lz"); + const u32 gMonBackPic_Lickilicky[] = INCBIN_U32("graphics/pokemon/lickilicky/back.4bpp.smol"); const u16 gMonShinyPalette_Lickilicky[] = INCBIN_U16("graphics/pokemon/lickilicky/shiny.gbapal"); const u8 gMonIcon_Lickilicky[] = INCBIN_U8("graphics/pokemon/lickilicky/icon.4bpp"); #if P_FOOTPRINTS @@ -4364,14 +4364,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KOFFING #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front.4bpp.smol"); const u16 gMonPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/normal.gbapal"); - const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.lz"); + const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.smol"); const u16 gMonShinyPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/shiny.gbapal"); #else - const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/normal_gba.gbapal"); - const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back_gba.4bpp.lz"); + const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Koffing[] = INCBIN_U16("graphics/pokemon/koffing/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4391,14 +4391,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front.4bpp.smol"); const u16 gMonPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/normal.gbapal"); - const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.lz"); + const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.smol"); const u16 gMonShinyPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/shiny.gbapal"); #else - const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/normal_gba.gbapal"); - const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back_gba.4bpp.lz"); + const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Weezing[] = INCBIN_U16("graphics/pokemon/weezing/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4418,9 +4418,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/front.4bpp.lz"); + const u32 gMonFrontPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/front.4bpp.smol"); const u16 gMonPalette_WeezingGalar[] = INCBIN_U16("graphics/pokemon/weezing/galar/normal.gbapal"); - const u32 gMonBackPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/back.4bpp.lz"); + const u32 gMonBackPic_WeezingGalar[] = INCBIN_U32("graphics/pokemon/weezing/galar/back.4bpp.smol"); const u16 gMonShinyPalette_WeezingGalar[] = INCBIN_U16("graphics/pokemon/weezing/galar/shiny.gbapal"); const u8 gMonIcon_WeezingGalar[] = INCBIN_U8("graphics/pokemon/weezing/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4435,14 +4435,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RHYHORN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front.4bpp.smol"); const u16 gMonPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/normal.gbapal"); - const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.lz"); + const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.smol"); const u16 gMonShinyPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/shiny.gbapal"); #else - const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/normal_gba.gbapal"); - const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rhyhorn[] = INCBIN_U16("graphics/pokemon/rhyhorn/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4462,22 +4462,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/backf.4bpp.lz"); + const u32 gMonFrontPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhyhornF[] = INCBIN_U32("graphics/pokemon/rhyhorn/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhyhornF[] = INCBIN_COMP("graphics/pokemon/rhyhorn/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front.4bpp.smol"); const u16 gMonPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/normal.gbapal"); - const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.lz"); + const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.smol"); const u16 gMonShinyPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/shiny.gbapal"); #else - const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/normal_gba.gbapal"); - const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rhydon[] = INCBIN_U16("graphics/pokemon/rhydon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4497,17 +4497,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/backf.4bpp.lz"); + const u32 gMonFrontPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhydonF[] = INCBIN_U32("graphics/pokemon/rhydon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhydonF[] = INCBIN_COMP("graphics/pokemon/rhydon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_front.4bpp.smol"); const u16 gMonPalette_Rhyperior[] = INCBIN_U16("graphics/pokemon/rhyperior/normal.gbapal"); - const u32 gMonBackPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/back.4bpp.lz"); + const u32 gMonBackPic_Rhyperior[] = INCBIN_U32("graphics/pokemon/rhyperior/back.4bpp.smol"); const u16 gMonShinyPalette_Rhyperior[] = INCBIN_U16("graphics/pokemon/rhyperior/shiny.gbapal"); const u8 gMonIcon_Rhyperior[] = INCBIN_U8("graphics/pokemon/rhyperior/icon.4bpp"); #if P_FOOTPRINTS @@ -4522,8 +4522,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/backf.4bpp.lz"); + const u32 gMonFrontPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RhyperiorF[] = INCBIN_U32("graphics/pokemon/rhyperior/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RhyperiorF[] = INCBIN_COMP("graphics/pokemon/rhyperior/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4533,9 +4533,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHANSEY #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/anim_front.4bpp.smol"); const u16 gMonPalette_Happiny[] = INCBIN_U16("graphics/pokemon/happiny/normal.gbapal"); - const u32 gMonBackPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/back.4bpp.lz"); + const u32 gMonBackPic_Happiny[] = INCBIN_U32("graphics/pokemon/happiny/back.4bpp.smol"); const u16 gMonShinyPalette_Happiny[] = INCBIN_U16("graphics/pokemon/happiny/shiny.gbapal"); const u8 gMonIcon_Happiny[] = INCBIN_U8("graphics/pokemon/happiny/icon.4bpp"); #if P_FOOTPRINTS @@ -4551,14 +4551,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front.4bpp.smol"); const u16 gMonPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/normal.gbapal"); - const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.lz"); + const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.smol"); const u16 gMonShinyPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/shiny.gbapal"); #else - const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/normal_gba.gbapal"); - const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chansey[] = INCBIN_U16("graphics/pokemon/chansey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4579,14 +4579,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front.4bpp.smol"); const u16 gMonPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/normal.gbapal"); - const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.lz"); + const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.smol"); const u16 gMonShinyPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/shiny.gbapal"); #else - const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/normal_gba.gbapal"); - const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blissey[] = INCBIN_U16("graphics/pokemon/blissey/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4609,14 +4609,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TANGELA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front.4bpp.smol"); const u16 gMonPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/normal.gbapal"); - const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.lz"); + const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.smol"); const u16 gMonShinyPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/shiny.gbapal"); #else - const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/normal_gba.gbapal"); - const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tangela[] = INCBIN_U16("graphics/pokemon/tangela/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4636,9 +4636,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_front.4bpp.smol"); const u16 gMonPalette_Tangrowth[] = INCBIN_U16("graphics/pokemon/tangrowth/normal.gbapal"); - const u32 gMonBackPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/back.4bpp.lz"); + const u32 gMonBackPic_Tangrowth[] = INCBIN_U32("graphics/pokemon/tangrowth/back.4bpp.smol"); const u16 gMonShinyPalette_Tangrowth[] = INCBIN_U16("graphics/pokemon/tangrowth/shiny.gbapal"); const u8 gMonIcon_Tangrowth[] = INCBIN_U8("graphics/pokemon/tangrowth/icon.4bpp"); #if P_FOOTPRINTS @@ -4653,7 +4653,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_TangrowthF[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_TangrowthF[] = INCBIN_U32("graphics/pokemon/tangrowth/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_TangrowthF[] = INCBIN_COMP("graphics/pokemon/tangrowth/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4663,14 +4663,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KANGASKHAN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front.4bpp.smol"); const u16 gMonPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/normal.gbapal"); - const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.lz"); + const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.smol"); const u16 gMonShinyPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/shiny.gbapal"); #else - const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/normal_gba.gbapal"); - const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kangaskhan[] = INCBIN_U16("graphics/pokemon/kangaskhan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4690,9 +4690,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/front.4bpp.lz"); + const u32 gMonFrontPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/front.4bpp.smol"); const u16 gMonPalette_KangaskhanMega[] = INCBIN_U16("graphics/pokemon/kangaskhan/mega/normal.gbapal"); - const u32 gMonBackPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/back.4bpp.lz"); + const u32 gMonBackPic_KangaskhanMega[] = INCBIN_U32("graphics/pokemon/kangaskhan/mega/back.4bpp.smol"); const u16 gMonShinyPalette_KangaskhanMega[] = INCBIN_U16("graphics/pokemon/kangaskhan/mega/shiny.gbapal"); const u8 gMonIcon_KangaskhanMega[] = INCBIN_U8("graphics/pokemon/kangaskhan/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -4707,14 +4707,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HORSEA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front.4bpp.smol"); const u16 gMonPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/normal.gbapal"); - const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.lz"); + const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.smol"); const u16 gMonShinyPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/shiny.gbapal"); #else - const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/normal_gba.gbapal"); - const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back_gba.4bpp.lz"); + const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Horsea[] = INCBIN_U16("graphics/pokemon/horsea/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4734,14 +4734,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front.4bpp.smol"); const u16 gMonPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/normal.gbapal"); - const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.lz"); + const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.smol"); const u16 gMonShinyPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/shiny.gbapal"); #else - const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/normal_gba.gbapal"); - const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seadra[] = INCBIN_U16("graphics/pokemon/seadra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4762,14 +4762,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front.4bpp.smol"); const u16 gMonPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/normal.gbapal"); - const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.lz"); + const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.smol"); const u16 gMonShinyPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/shiny.gbapal"); #else - const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/normal_gba.gbapal"); - const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kingdra[] = INCBIN_U16("graphics/pokemon/kingdra/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4792,14 +4792,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GOLDEEN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front.4bpp.smol"); const u16 gMonPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/normal.gbapal"); - const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.lz"); + const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.smol"); const u16 gMonShinyPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/shiny.gbapal"); #else - const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/normal_gba.gbapal"); - const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back_gba.4bpp.lz"); + const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Goldeen[] = INCBIN_U16("graphics/pokemon/goldeen/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4819,22 +4819,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/backf.4bpp.lz"); + const u32 gMonFrontPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GoldeenF[] = INCBIN_U32("graphics/pokemon/goldeen/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GoldeenF[] = INCBIN_COMP("graphics/pokemon/goldeen/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front.4bpp.smol"); const u16 gMonPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/normal.gbapal"); - const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.lz"); + const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.smol"); const u16 gMonShinyPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/shiny.gbapal"); #else - const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/normal_gba.gbapal"); - const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seaking[] = INCBIN_U16("graphics/pokemon/seaking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4854,8 +4854,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/backf.4bpp.lz"); + const u32 gMonFrontPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SeakingF[] = INCBIN_U32("graphics/pokemon/seaking/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SeakingF[] = INCBIN_COMP("graphics/pokemon/seaking/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -4864,14 +4864,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_STARYU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front.4bpp.smol"); const u16 gMonPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/normal.gbapal"); - const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.lz"); + const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.smol"); const u16 gMonShinyPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/shiny.gbapal"); #else - const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/normal_gba.gbapal"); - const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Staryu[] = INCBIN_U16("graphics/pokemon/staryu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4891,14 +4891,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front.4bpp.smol"); const u16 gMonPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/normal.gbapal"); - const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.lz"); + const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.smol"); const u16 gMonShinyPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/shiny.gbapal"); #else - const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/normal_gba.gbapal"); - const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Starmie[] = INCBIN_U16("graphics/pokemon/starmie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4920,9 +4920,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MR_MIME #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/anim_front.4bpp.smol"); const u16 gMonPalette_MimeJr[] = INCBIN_U16("graphics/pokemon/mime_jr/normal.gbapal"); - const u32 gMonBackPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/back.4bpp.lz"); + const u32 gMonBackPic_MimeJr[] = INCBIN_U32("graphics/pokemon/mime_jr/back.4bpp.smol"); const u16 gMonShinyPalette_MimeJr[] = INCBIN_U16("graphics/pokemon/mime_jr/shiny.gbapal"); const u8 gMonIcon_MimeJr[] = INCBIN_U8("graphics/pokemon/mime_jr/icon.4bpp"); #if P_FOOTPRINTS @@ -4938,14 +4938,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front.4bpp.smol"); const u16 gMonPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/normal.gbapal"); - const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz"); + const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.smol"); const u16 gMonShinyPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/shiny.gbapal"); #else - const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/anim_front_gba.4bpp.smol"); const u16 gMonPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/normal_gba.gbapal"); - const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back_gba.4bpp.lz"); + const u32 gMonBackPic_MrMime[] = INCBIN_U32("graphics/pokemon/mr_mime/back_gba.4bpp.smol"); const u16 gMonShinyPalette_MrMime[] = INCBIN_U16("graphics/pokemon/mr_mime/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -4965,9 +4965,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/front.4bpp.smol"); const u16 gMonPalette_MrMimeGalar[] = INCBIN_U16("graphics/pokemon/mr_mime/galar/normal.gbapal"); - const u32 gMonBackPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/back.4bpp.lz"); + const u32 gMonBackPic_MrMimeGalar[] = INCBIN_U32("graphics/pokemon/mr_mime/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MrMimeGalar[] = INCBIN_U16("graphics/pokemon/mr_mime/galar/shiny.gbapal"); const u8 gMonIcon_MrMimeGalar[] = INCBIN_U8("graphics/pokemon/mr_mime/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -4978,9 +4978,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/front.4bpp.lz"); + const u32 gMonFrontPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/front.4bpp.smol"); const u16 gMonPalette_MrRime[] = INCBIN_U16("graphics/pokemon/mr_rime/normal.gbapal"); - const u32 gMonBackPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/back.4bpp.lz"); + const u32 gMonBackPic_MrRime[] = INCBIN_U32("graphics/pokemon/mr_rime/back.4bpp.smol"); const u16 gMonShinyPalette_MrRime[] = INCBIN_U16("graphics/pokemon/mr_rime/shiny.gbapal"); const u8 gMonIcon_MrRime[] = INCBIN_U8("graphics/pokemon/mr_rime/icon.4bpp"); #if P_FOOTPRINTS @@ -4998,14 +4998,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SCYTHER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front.4bpp.smol"); const u16 gMonPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/normal.gbapal"); - const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.lz"); + const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.smol"); const u16 gMonShinyPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/shiny.gbapal"); #else - const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/normal_gba.gbapal"); - const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back_gba.4bpp.lz"); + const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Scyther[] = INCBIN_U16("graphics/pokemon/scyther/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5025,7 +5025,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ScytherF[] = INCBIN_U32("graphics/pokemon/scyther/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_ScytherF[] = INCBIN_U32("graphics/pokemon/scyther/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ScytherF[] = INCBIN_COMP("graphics/pokemon/scyther/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -5033,14 +5033,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front.4bpp.smol"); const u16 gMonPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/normal.gbapal"); - const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.lz"); + const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.smol"); const u16 gMonShinyPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/shiny.gbapal"); #else - const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/normal_gba.gbapal"); - const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back_gba.4bpp.lz"); + const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Scizor[] = INCBIN_U16("graphics/pokemon/scizor/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5060,16 +5060,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ScizorF[] = INCBIN_U32("graphics/pokemon/scizor/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_ScizorF[] = INCBIN_U32("graphics/pokemon/scizor/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ScizorF[] = INCBIN_COMP("graphics/pokemon/scizor/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/front.4bpp.lz"); + const u32 gMonFrontPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/front.4bpp.smol"); const u16 gMonPalette_ScizorMega[] = INCBIN_U16("graphics/pokemon/scizor/mega/normal.gbapal"); - const u32 gMonBackPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/back.4bpp.lz"); + const u32 gMonBackPic_ScizorMega[] = INCBIN_U32("graphics/pokemon/scizor/mega/back.4bpp.smol"); const u16 gMonShinyPalette_ScizorMega[] = INCBIN_U16("graphics/pokemon/scizor/mega/shiny.gbapal"); const u8 gMonIcon_ScizorMega[] = INCBIN_U8("graphics/pokemon/scizor/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5083,9 +5083,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/front.4bpp.lz"); + const u32 gMonFrontPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/front.4bpp.smol"); const u16 gMonPalette_Kleavor[] = INCBIN_U16("graphics/pokemon/kleavor/normal.gbapal"); - const u32 gMonBackPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/back.4bpp.lz"); + const u32 gMonBackPic_Kleavor[] = INCBIN_U32("graphics/pokemon/kleavor/back.4bpp.smol"); const u16 gMonShinyPalette_Kleavor[] = INCBIN_U16("graphics/pokemon/kleavor/shiny.gbapal"); const u8 gMonIcon_Kleavor[] = INCBIN_U8("graphics/pokemon/kleavor/icon.4bpp"); #if P_FOOTPRINTS @@ -5104,14 +5104,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JYNX #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front.4bpp.smol"); const u16 gMonPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/normal.gbapal"); - const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.lz"); + const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.smol"); const u16 gMonShinyPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/shiny.gbapal"); #else - const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/normal_gba.gbapal"); - const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back_gba.4bpp.lz"); + const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Smoochum[] = INCBIN_U16("graphics/pokemon/smoochum/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5132,14 +5132,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front.4bpp.smol"); const u16 gMonPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/normal.gbapal"); - const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.lz"); + const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.smol"); const u16 gMonShinyPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/shiny.gbapal"); #else - const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/normal_gba.gbapal"); - const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jynx[] = INCBIN_U16("graphics/pokemon/jynx/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5162,14 +5162,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ELECTABUZZ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front.4bpp.smol"); const u16 gMonPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/normal.gbapal"); - const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.lz"); + const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.smol"); const u16 gMonShinyPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/shiny.gbapal"); #else - const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/normal_gba.gbapal"); - const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back_gba.4bpp.lz"); + const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Elekid[] = INCBIN_U16("graphics/pokemon/elekid/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5190,14 +5190,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front.4bpp.smol"); const u16 gMonPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/normal.gbapal"); - const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.lz"); + const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.smol"); const u16 gMonShinyPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/shiny.gbapal"); #else - const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/normal_gba.gbapal"); - const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electabuzz[] = INCBIN_U16("graphics/pokemon/electabuzz/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5217,9 +5217,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/anim_front.4bpp.smol"); const u16 gMonPalette_Electivire[] = INCBIN_U16("graphics/pokemon/electivire/normal.gbapal"); - const u32 gMonBackPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/back.4bpp.lz"); + const u32 gMonBackPic_Electivire[] = INCBIN_U32("graphics/pokemon/electivire/back.4bpp.smol"); const u16 gMonShinyPalette_Electivire[] = INCBIN_U16("graphics/pokemon/electivire/shiny.gbapal"); const u8 gMonIcon_Electivire[] = INCBIN_U8("graphics/pokemon/electivire/icon.4bpp"); #if P_FOOTPRINTS @@ -5238,14 +5238,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGMAR #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front.4bpp.smol"); const u16 gMonPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/normal.gbapal"); - const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.lz"); + const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.smol"); const u16 gMonShinyPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/shiny.gbapal"); #else - const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/normal_gba.gbapal"); - const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magby[] = INCBIN_U16("graphics/pokemon/magby/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5266,14 +5266,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front.4bpp.smol"); const u16 gMonPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/normal.gbapal"); - const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.lz"); + const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.smol"); const u16 gMonShinyPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/shiny.gbapal"); #else - const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/normal_gba.gbapal"); - const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magmar[] = INCBIN_U16("graphics/pokemon/magmar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5293,9 +5293,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/anim_front.4bpp.smol"); const u16 gMonPalette_Magmortar[] = INCBIN_U16("graphics/pokemon/magmortar/normal.gbapal"); - const u32 gMonBackPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/back.4bpp.lz"); + const u32 gMonBackPic_Magmortar[] = INCBIN_U32("graphics/pokemon/magmortar/back.4bpp.smol"); const u16 gMonShinyPalette_Magmortar[] = INCBIN_U16("graphics/pokemon/magmortar/shiny.gbapal"); const u8 gMonIcon_Magmortar[] = INCBIN_U8("graphics/pokemon/magmortar/icon.4bpp"); #if P_FOOTPRINTS @@ -5313,14 +5313,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PINSIR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front.4bpp.smol"); const u16 gMonPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/normal.gbapal"); - const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.lz"); + const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.smol"); const u16 gMonShinyPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/shiny.gbapal"); #else - const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/normal_gba.gbapal"); - const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pinsir[] = INCBIN_U16("graphics/pokemon/pinsir/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5340,9 +5340,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/front.4bpp.lz"); + const u32 gMonFrontPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/front.4bpp.smol"); const u16 gMonPalette_PinsirMega[] = INCBIN_U16("graphics/pokemon/pinsir/mega/normal.gbapal"); - const u32 gMonBackPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/back.4bpp.lz"); + const u32 gMonBackPic_PinsirMega[] = INCBIN_U32("graphics/pokemon/pinsir/mega/back.4bpp.smol"); const u16 gMonShinyPalette_PinsirMega[] = INCBIN_U16("graphics/pokemon/pinsir/mega/shiny.gbapal"); const u8 gMonIcon_PinsirMega[] = INCBIN_U8("graphics/pokemon/pinsir/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5357,14 +5357,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TAUROS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front.4bpp.smol"); const u16 gMonPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/normal.gbapal"); - const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.lz"); + const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.smol"); const u16 gMonShinyPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/shiny.gbapal"); #else - const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/normal_gba.gbapal"); - const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tauros[] = INCBIN_U16("graphics/pokemon/tauros/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5384,21 +5384,21 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PALDEAN_FORMS - const u32 gMonFrontPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaCombat[] = INCBIN_U16("graphics/pokemon/tauros/paldea_combat/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaCombat[] = INCBIN_U32("graphics/pokemon/tauros/paldea_combat/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaCombat[] = INCBIN_U16("graphics/pokemon/tauros/paldea_combat/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaCombat[] = INCBIN_U8("graphics/pokemon/tauros/paldea_combat/icon.4bpp"); - const u32 gMonFrontPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaBlaze[] = INCBIN_U16("graphics/pokemon/tauros/paldea_blaze/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaBlaze[] = INCBIN_U32("graphics/pokemon/tauros/paldea_blaze/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaBlaze[] = INCBIN_U16("graphics/pokemon/tauros/paldea_blaze/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaBlaze[] = INCBIN_U8("graphics/pokemon/tauros/paldea_blaze/icon.4bpp"); - const u32 gMonFrontPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/front.4bpp.lz"); + const u32 gMonFrontPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/front.4bpp.smol"); const u16 gMonPalette_TaurosPaldeaAqua[] = INCBIN_U16("graphics/pokemon/tauros/paldea_aqua/normal.gbapal"); - const u32 gMonBackPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/back.4bpp.lz"); + const u32 gMonBackPic_TaurosPaldeaAqua[] = INCBIN_U32("graphics/pokemon/tauros/paldea_aqua/back.4bpp.smol"); const u16 gMonShinyPalette_TaurosPaldeaAqua[] = INCBIN_U16("graphics/pokemon/tauros/paldea_aqua/shiny.gbapal"); const u8 gMonIcon_TaurosPaldeaAqua[] = INCBIN_U8("graphics/pokemon/tauros/paldea_aqua/icon.4bpp"); @@ -5420,14 +5420,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAGIKARP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front.4bpp.smol"); const u16 gMonPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/normal.gbapal"); - const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.lz"); + const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.smol"); const u16 gMonShinyPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/shiny.gbapal"); #else - const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/normal_gba.gbapal"); - const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magikarp[] = INCBIN_U16("graphics/pokemon/magikarp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5447,22 +5447,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/backf.4bpp.lz"); + const u32 gMonFrontPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MagikarpF[] = INCBIN_U32("graphics/pokemon/magikarp/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MagikarpF[] = INCBIN_COMP("graphics/pokemon/magikarp/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front.4bpp.smol"); const u16 gMonPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/normal.gbapal"); - const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.lz"); + const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.smol"); const u16 gMonShinyPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/shiny.gbapal"); #else - const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/normal_gba.gbapal"); - const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gyarados[] = INCBIN_U16("graphics/pokemon/gyarados/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5482,17 +5482,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/backf.4bpp.lz"); + const u32 gMonFrontPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GyaradosF[] = INCBIN_U32("graphics/pokemon/gyarados/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GyaradosF[] = INCBIN_COMP("graphics/pokemon/gyarados/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/front.4bpp.smol"); const u16 gMonPalette_GyaradosMega[] = INCBIN_U16("graphics/pokemon/gyarados/mega/normal.gbapal"); - const u32 gMonBackPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/back.4bpp.lz"); + const u32 gMonBackPic_GyaradosMega[] = INCBIN_U32("graphics/pokemon/gyarados/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GyaradosMega[] = INCBIN_U16("graphics/pokemon/gyarados/mega/shiny.gbapal"); const u8 gMonIcon_GyaradosMega[] = INCBIN_U8("graphics/pokemon/gyarados/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -5507,14 +5507,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LAPRAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front.4bpp.smol"); const u16 gMonPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/normal.gbapal"); - const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.lz"); + const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.smol"); const u16 gMonShinyPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/shiny.gbapal"); #else - const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/normal_gba.gbapal"); - const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lapras[] = INCBIN_U16("graphics/pokemon/lapras/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5534,8 +5534,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/front.4bpp.lz"); - const u32 gMonBackPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/front.4bpp.smol"); + const u32 gMonBackPic_LaprasGmax[] = INCBIN_U32("graphics/pokemon/lapras/gmax/back.4bpp.smol"); const u16 gMonPalette_LaprasGmax[] = INCBIN_U16("graphics/pokemon/lapras/gmax/normal.gbapal"); const u16 gMonShinyPalette_LaprasGmax[] = INCBIN_U16("graphics/pokemon/lapras/gmax/shiny.gbapal"); const u8 gMonIcon_LaprasGmax[] = INCBIN_U8("graphics/pokemon/lapras/gmax/icon.4bpp"); @@ -5551,14 +5551,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DITTO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front.4bpp.smol"); const u16 gMonPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/normal.gbapal"); - const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.lz"); + const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.smol"); const u16 gMonShinyPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/shiny.gbapal"); #else - const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/normal_gba.gbapal"); - const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ditto[] = INCBIN_U16("graphics/pokemon/ditto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5580,14 +5580,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_EEVEE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front.4bpp.smol"); const u16 gMonPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/normal.gbapal"); - const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.lz"); + const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.smol"); const u16 gMonShinyPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/shiny.gbapal"); #else - const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/normal_gba.gbapal"); - const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back_gba.4bpp.lz"); + const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Eevee[] = INCBIN_U16("graphics/pokemon/eevee/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5607,16 +5607,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/backf.4bpp.lz"); + const u32 gMonFrontPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_EeveeF[] = INCBIN_U32("graphics/pokemon/eevee/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_EeveeF[] = INCBIN_COMP("graphics/pokemon/eevee/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/front.4bpp.lz"); - const u32 gMonBackPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/front.4bpp.smol"); + const u32 gMonBackPic_EeveeGmax[] = INCBIN_U32("graphics/pokemon/eevee/gmax/back.4bpp.smol"); const u16 gMonPalette_EeveeGmax[] = INCBIN_U16("graphics/pokemon/eevee/gmax/normal.gbapal"); const u16 gMonShinyPalette_EeveeGmax[] = INCBIN_U16("graphics/pokemon/eevee/gmax/shiny.gbapal"); const u8 gMonIcon_EeveeGmax[] = INCBIN_U8("graphics/pokemon/eevee/gmax/icon.4bpp"); @@ -5635,14 +5635,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GENDER_DIFFERENCES && P_CUSTOM_GENDER_DIFF_ICONS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front.4bpp.smol"); const u16 gMonPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/normal.gbapal"); - const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.lz"); + const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.smol"); const u16 gMonShinyPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/shiny.gbapal"); #else - const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/normal_gba.gbapal"); - const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vaporeon[] = INCBIN_U16("graphics/pokemon/vaporeon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5662,14 +5662,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front.4bpp.smol"); const u16 gMonPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/normal.gbapal"); - const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.lz"); + const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.smol"); const u16 gMonShinyPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/shiny.gbapal"); #else - const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/normal_gba.gbapal"); - const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jolteon[] = INCBIN_U16("graphics/pokemon/jolteon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5689,14 +5689,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front.4bpp.smol"); const u16 gMonPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/normal.gbapal"); - const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.lz"); + const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.smol"); const u16 gMonShinyPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/shiny.gbapal"); #else - const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/normal_gba.gbapal"); - const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flareon[] = INCBIN_U16("graphics/pokemon/flareon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5717,14 +5717,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front.4bpp.smol"); const u16 gMonPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/normal.gbapal"); - const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.lz"); + const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.smol"); const u16 gMonShinyPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/shiny.gbapal"); #else - const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/normal_gba.gbapal"); - const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Espeon[] = INCBIN_U16("graphics/pokemon/espeon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5744,14 +5744,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front.4bpp.smol"); const u16 gMonPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/normal.gbapal"); - const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.lz"); + const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.smol"); const u16 gMonShinyPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/shiny.gbapal"); #else - const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/normal_gba.gbapal"); - const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Umbreon[] = INCBIN_U16("graphics/pokemon/umbreon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5772,9 +5772,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_2_CROSS_EVOS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/anim_front.4bpp.smol"); const u16 gMonPalette_Leafeon[] = INCBIN_U16("graphics/pokemon/leafeon/normal.gbapal"); - const u32 gMonBackPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/back.4bpp.lz"); + const u32 gMonBackPic_Leafeon[] = INCBIN_U32("graphics/pokemon/leafeon/back.4bpp.smol"); const u16 gMonShinyPalette_Leafeon[] = INCBIN_U16("graphics/pokemon/leafeon/shiny.gbapal"); const u8 gMonIcon_Leafeon[] = INCBIN_U8("graphics/pokemon/leafeon/icon.4bpp"); #if P_FOOTPRINTS @@ -5788,9 +5788,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/anim_front.4bpp.smol"); const u16 gMonPalette_Glaceon[] = INCBIN_U16("graphics/pokemon/glaceon/normal.gbapal"); - const u32 gMonBackPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/back.4bpp.lz"); + const u32 gMonBackPic_Glaceon[] = INCBIN_U32("graphics/pokemon/glaceon/back.4bpp.smol"); const u16 gMonShinyPalette_Glaceon[] = INCBIN_U16("graphics/pokemon/glaceon/shiny.gbapal"); const u8 gMonIcon_Glaceon[] = INCBIN_U8("graphics/pokemon/glaceon/icon.4bpp"); #if P_FOOTPRINTS @@ -5806,9 +5806,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if P_GEN_6_CROSS_EVOS - const u32 gMonFrontPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/anim_front.4bpp.smol"); const u16 gMonPalette_Sylveon[] = INCBIN_U16("graphics/pokemon/sylveon/normal.gbapal"); - const u32 gMonBackPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/back.4bpp.lz"); + const u32 gMonBackPic_Sylveon[] = INCBIN_U32("graphics/pokemon/sylveon/back.4bpp.smol"); const u16 gMonShinyPalette_Sylveon[] = INCBIN_U16("graphics/pokemon/sylveon/shiny.gbapal"); const u8 gMonIcon_Sylveon[] = INCBIN_U8("graphics/pokemon/sylveon/icon.4bpp"); #if P_FOOTPRINTS @@ -5826,14 +5826,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PORYGON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front.4bpp.smol"); const u16 gMonPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/normal.gbapal"); - const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.lz"); + const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.smol"); const u16 gMonShinyPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/shiny.gbapal"); #else - const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/normal_gba.gbapal"); - const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Porygon[] = INCBIN_U16("graphics/pokemon/porygon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5854,14 +5854,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_GEN_2_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front.4bpp.smol"); const u16 gMonPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/normal.gbapal"); - const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.lz"); + const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.smol"); const u16 gMonShinyPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/shiny.gbapal"); #else - const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/normal_gba.gbapal"); - const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back_gba.4bpp.lz"); + const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Porygon2[] = INCBIN_U16("graphics/pokemon/porygon2/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5881,9 +5881,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/anim_front.4bpp.lz"); + const u32 gMonFrontPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/anim_front.4bpp.smol"); const u16 gMonPalette_PorygonZ[] = INCBIN_U16("graphics/pokemon/porygon_z/normal.gbapal"); - const u32 gMonBackPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/back.4bpp.lz"); + const u32 gMonBackPic_PorygonZ[] = INCBIN_U32("graphics/pokemon/porygon_z/back.4bpp.smol"); const u16 gMonShinyPalette_PorygonZ[] = INCBIN_U16("graphics/pokemon/porygon_z/shiny.gbapal"); const u8 gMonIcon_PorygonZ[] = INCBIN_U8("graphics/pokemon/porygon_z/icon.4bpp"); #if P_FOOTPRINTS @@ -5902,14 +5902,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_OMANYTE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front.4bpp.smol"); const u16 gMonPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/normal.gbapal"); - const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.lz"); + const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.smol"); const u16 gMonShinyPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/shiny.gbapal"); #else - const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/normal_gba.gbapal"); - const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back_gba.4bpp.lz"); + const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Omanyte[] = INCBIN_U16("graphics/pokemon/omanyte/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5929,14 +5929,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front.4bpp.smol"); const u16 gMonPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/normal.gbapal"); - const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.lz"); + const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.smol"); const u16 gMonShinyPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/shiny.gbapal"); #else - const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/normal_gba.gbapal"); - const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Omastar[] = INCBIN_U16("graphics/pokemon/omastar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5958,14 +5958,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KABUTO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front.4bpp.smol"); const u16 gMonPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/normal.gbapal"); - const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.lz"); + const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.smol"); const u16 gMonShinyPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/shiny.gbapal"); #else - const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/normal_gba.gbapal"); - const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kabuto[] = INCBIN_U16("graphics/pokemon/kabuto/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -5985,14 +5985,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front.4bpp.smol"); const u16 gMonPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/normal.gbapal"); - const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.lz"); + const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.smol"); const u16 gMonShinyPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/shiny.gbapal"); #else - const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/normal_gba.gbapal"); - const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kabutops[] = INCBIN_U16("graphics/pokemon/kabutops/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6014,14 +6014,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_AERODACTYL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front.4bpp.smol"); const u16 gMonPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/normal.gbapal"); - const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.lz"); + const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.smol"); const u16 gMonShinyPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/shiny.gbapal"); #else - const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/normal_gba.gbapal"); - const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aerodactyl[] = INCBIN_U16("graphics/pokemon/aerodactyl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6041,9 +6041,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/front.4bpp.smol"); const u16 gMonPalette_AerodactylMega[] = INCBIN_U16("graphics/pokemon/aerodactyl/mega/normal.gbapal"); - const u32 gMonBackPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/back.4bpp.lz"); + const u32 gMonBackPic_AerodactylMega[] = INCBIN_U32("graphics/pokemon/aerodactyl/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AerodactylMega[] = INCBIN_U16("graphics/pokemon/aerodactyl/mega/shiny.gbapal"); const u8 gMonIcon_AerodactylMega[] = INCBIN_U8("graphics/pokemon/aerodactyl/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6058,9 +6058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNORLAX #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/anim_front.4bpp.smol"); const u16 gMonPalette_Munchlax[] = INCBIN_U16("graphics/pokemon/munchlax/normal.gbapal"); - const u32 gMonBackPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/back.4bpp.lz"); + const u32 gMonBackPic_Munchlax[] = INCBIN_U32("graphics/pokemon/munchlax/back.4bpp.smol"); const u16 gMonShinyPalette_Munchlax[] = INCBIN_U16("graphics/pokemon/munchlax/shiny.gbapal"); const u8 gMonIcon_Munchlax[] = INCBIN_U8("graphics/pokemon/munchlax/icon.4bpp"); #if P_FOOTPRINTS @@ -6076,14 +6076,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front.4bpp.smol"); const u16 gMonPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/normal.gbapal"); - const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.lz"); + const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.smol"); const u16 gMonShinyPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/shiny.gbapal"); #else - const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/normal_gba.gbapal"); - const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snorlax[] = INCBIN_U16("graphics/pokemon/snorlax/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6103,8 +6103,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/front.4bpp.lz"); - const u32 gMonBackPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/front.4bpp.smol"); + const u32 gMonBackPic_SnorlaxGmax[] = INCBIN_U32("graphics/pokemon/snorlax/gmax/back.4bpp.smol"); const u16 gMonPalette_SnorlaxGmax[] = INCBIN_U16("graphics/pokemon/snorlax/gmax/normal.gbapal"); const u16 gMonShinyPalette_SnorlaxGmax[] = INCBIN_U16("graphics/pokemon/snorlax/gmax/shiny.gbapal"); const u8 gMonIcon_SnorlaxGmax[] = INCBIN_U8("graphics/pokemon/snorlax/gmax/icon.4bpp"); @@ -6120,14 +6120,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ARTICUNO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front.4bpp.smol"); const u16 gMonPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/normal.gbapal"); - const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.lz"); + const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.smol"); const u16 gMonShinyPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/shiny.gbapal"); #else - const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/normal_gba.gbapal"); - const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back_gba.4bpp.lz"); + const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Articuno[] = INCBIN_U16("graphics/pokemon/articuno/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6147,9 +6147,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/front.4bpp.smol"); const u16 gMonPalette_ArticunoGalar[] = INCBIN_U16("graphics/pokemon/articuno/galar/normal.gbapal"); - const u32 gMonBackPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/back.4bpp.lz"); + const u32 gMonBackPic_ArticunoGalar[] = INCBIN_U32("graphics/pokemon/articuno/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ArticunoGalar[] = INCBIN_U16("graphics/pokemon/articuno/galar/shiny.gbapal"); const u8 gMonIcon_ArticunoGalar[] = INCBIN_U8("graphics/pokemon/articuno/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6164,14 +6164,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZAPDOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front.4bpp.smol"); const u16 gMonPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/normal.gbapal"); - const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.lz"); + const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.smol"); const u16 gMonShinyPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/shiny.gbapal"); #else - const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/normal_gba.gbapal"); - const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zapdos[] = INCBIN_U16("graphics/pokemon/zapdos/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6191,9 +6191,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/front.4bpp.smol"); const u16 gMonPalette_ZapdosGalar[] = INCBIN_U16("graphics/pokemon/zapdos/galar/normal.gbapal"); - const u32 gMonBackPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/back.4bpp.lz"); + const u32 gMonBackPic_ZapdosGalar[] = INCBIN_U32("graphics/pokemon/zapdos/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ZapdosGalar[] = INCBIN_U16("graphics/pokemon/zapdos/galar/shiny.gbapal"); const u8 gMonIcon_ZapdosGalar[] = INCBIN_U8("graphics/pokemon/zapdos/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6208,14 +6208,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MOLTRES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front.4bpp.smol"); const u16 gMonPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/normal.gbapal"); - const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.lz"); + const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.smol"); const u16 gMonShinyPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/shiny.gbapal"); #else - const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/normal_gba.gbapal"); - const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back_gba.4bpp.lz"); + const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Moltres[] = INCBIN_U16("graphics/pokemon/moltres/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6235,9 +6235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/front.4bpp.lz"); + const u32 gMonFrontPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/front.4bpp.smol"); const u16 gMonPalette_MoltresGalar[] = INCBIN_U16("graphics/pokemon/moltres/galar/normal.gbapal"); - const u32 gMonBackPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/back.4bpp.lz"); + const u32 gMonBackPic_MoltresGalar[] = INCBIN_U32("graphics/pokemon/moltres/galar/back.4bpp.smol"); const u16 gMonShinyPalette_MoltresGalar[] = INCBIN_U16("graphics/pokemon/moltres/galar/shiny.gbapal"); const u8 gMonIcon_MoltresGalar[] = INCBIN_U8("graphics/pokemon/moltres/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6252,14 +6252,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DRATINI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front.4bpp.smol"); const u16 gMonPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/normal.gbapal"); - const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.lz"); + const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.smol"); const u16 gMonShinyPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/shiny.gbapal"); #else - const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/normal_gba.gbapal"); - const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dratini[] = INCBIN_U16("graphics/pokemon/dratini/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6279,14 +6279,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front.4bpp.smol"); const u16 gMonPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/normal.gbapal"); - const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.lz"); + const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.smol"); const u16 gMonShinyPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/shiny.gbapal"); #else - const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/normal_gba.gbapal"); - const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dragonair[] = INCBIN_U16("graphics/pokemon/dragonair/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6306,14 +6306,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front.4bpp.smol"); const u16 gMonPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/normal.gbapal"); - const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.lz"); + const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.smol"); const u16 gMonShinyPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/shiny.gbapal"); #else - const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/normal_gba.gbapal"); - const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dragonite[] = INCBIN_U16("graphics/pokemon/dragonite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6335,14 +6335,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEWTWO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front.4bpp.smol"); const u16 gMonPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/normal.gbapal"); - const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.lz"); + const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.smol"); const u16 gMonShinyPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/shiny.gbapal"); #else - const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/normal_gba.gbapal"); - const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mewtwo[] = INCBIN_U16("graphics/pokemon/mewtwo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6362,9 +6362,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/front.4bpp.lz"); + const u32 gMonFrontPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/front.4bpp.smol"); const u16 gMonPalette_MewtwoMegaX[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_x/normal.gbapal"); - const u32 gMonBackPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/back.4bpp.lz"); + const u32 gMonBackPic_MewtwoMegaX[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_x/back.4bpp.smol"); const u16 gMonShinyPalette_MewtwoMegaX[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_x/shiny.gbapal"); const u8 gMonIcon_MewtwoMegaX[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_x/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6375,9 +6375,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS - const u32 gMonFrontPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/front.4bpp.lz"); + const u32 gMonFrontPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/front.4bpp.smol"); const u16 gMonPalette_MewtwoMegaY[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_y/normal.gbapal"); - const u32 gMonBackPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/back.4bpp.lz"); + const u32 gMonBackPic_MewtwoMegaY[] = INCBIN_U32("graphics/pokemon/mewtwo/mega_y/back.4bpp.smol"); const u16 gMonShinyPalette_MewtwoMegaY[] = INCBIN_U16("graphics/pokemon/mewtwo/mega_y/shiny.gbapal"); const u8 gMonIcon_MewtwoMegaY[] = INCBIN_U8("graphics/pokemon/mewtwo/mega_y/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -6392,14 +6392,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front.4bpp.smol"); const u16 gMonPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/normal.gbapal"); - const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.lz"); + const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.smol"); const u16 gMonShinyPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/shiny.gbapal"); #else - const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/normal_gba.gbapal"); - const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mew[] = INCBIN_U16("graphics/pokemon/mew/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6421,14 +6421,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHIKORITA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front.4bpp.smol"); const u16 gMonPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/normal.gbapal"); - const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.lz"); + const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.smol"); const u16 gMonShinyPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/shiny.gbapal"); #else - const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/normal_gba.gbapal"); - const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chikorita[] = INCBIN_U16("graphics/pokemon/chikorita/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6448,14 +6448,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front.4bpp.smol"); const u16 gMonPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/normal.gbapal"); - const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.lz"); + const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.smol"); const u16 gMonShinyPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/shiny.gbapal"); #else - const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/normal_gba.gbapal"); - const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bayleef[] = INCBIN_U16("graphics/pokemon/bayleef/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6475,14 +6475,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front.4bpp.smol"); const u16 gMonPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/normal.gbapal"); - const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.lz"); + const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.smol"); const u16 gMonShinyPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/shiny.gbapal"); #else - const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/normal_gba.gbapal"); - const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meganium[] = INCBIN_U16("graphics/pokemon/meganium/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6502,8 +6502,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/backf.4bpp.lz"); + const u32 gMonFrontPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MeganiumF[] = INCBIN_U32("graphics/pokemon/meganium/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MeganiumF[] = INCBIN_COMP("graphics/pokemon/meganium/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -6512,14 +6512,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CYNDAQUIL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front.4bpp.smol"); const u16 gMonPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/normal.gbapal"); - const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.lz"); + const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.smol"); const u16 gMonShinyPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/shiny.gbapal"); #else - const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/normal_gba.gbapal"); - const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cyndaquil[] = INCBIN_U16("graphics/pokemon/cyndaquil/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6539,14 +6539,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front.4bpp.smol"); const u16 gMonPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/normal.gbapal"); - const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.lz"); + const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.smol"); const u16 gMonShinyPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/shiny.gbapal"); #else - const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/normal_gba.gbapal"); - const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back_gba.4bpp.lz"); + const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Quilava[] = INCBIN_U16("graphics/pokemon/quilava/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6566,14 +6566,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front.4bpp.smol"); const u16 gMonPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/normal.gbapal"); - const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.lz"); + const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.smol"); const u16 gMonShinyPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/shiny.gbapal"); #else - const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/normal_gba.gbapal"); - const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back_gba.4bpp.lz"); + const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Typhlosion[] = INCBIN_U16("graphics/pokemon/typhlosion/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6593,9 +6593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/front.4bpp.smol"); const u16 gMonPalette_TyphlosionHisui[] = INCBIN_U16("graphics/pokemon/typhlosion/hisui/normal.gbapal"); - const u32 gMonBackPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/back.4bpp.lz"); + const u32 gMonBackPic_TyphlosionHisui[] = INCBIN_U32("graphics/pokemon/typhlosion/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_TyphlosionHisui[] = INCBIN_U16("graphics/pokemon/typhlosion/hisui/shiny.gbapal"); const u8 gMonIcon_TyphlosionHisui[] = INCBIN_U8("graphics/pokemon/typhlosion/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -6610,14 +6610,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TOTODILE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front.4bpp.smol"); const u16 gMonPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/normal.gbapal"); - const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.lz"); + const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.smol"); const u16 gMonShinyPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/shiny.gbapal"); #else - const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/normal_gba.gbapal"); - const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Totodile[] = INCBIN_U16("graphics/pokemon/totodile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6637,14 +6637,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front.4bpp.smol"); const u16 gMonPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/normal.gbapal"); - const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.lz"); + const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.smol"); const u16 gMonShinyPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/shiny.gbapal"); #else - const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/normal_gba.gbapal"); - const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back_gba.4bpp.lz"); + const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Croconaw[] = INCBIN_U16("graphics/pokemon/croconaw/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6664,14 +6664,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front.4bpp.smol"); const u16 gMonPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/normal.gbapal"); - const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.lz"); + const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.smol"); const u16 gMonShinyPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/shiny.gbapal"); #else - const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/normal_gba.gbapal"); - const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back_gba.4bpp.lz"); + const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Feraligatr[] = INCBIN_U16("graphics/pokemon/feraligatr/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6693,14 +6693,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SENTRET #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front.4bpp.smol"); const u16 gMonPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/normal.gbapal"); - const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.lz"); + const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.smol"); const u16 gMonShinyPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/shiny.gbapal"); #else - const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/normal_gba.gbapal"); - const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sentret[] = INCBIN_U16("graphics/pokemon/sentret/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6720,14 +6720,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front.4bpp.smol"); const u16 gMonPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/normal.gbapal"); - const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.lz"); + const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.smol"); const u16 gMonShinyPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/shiny.gbapal"); #else - const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/normal_gba.gbapal"); - const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back_gba.4bpp.lz"); + const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Furret[] = INCBIN_U16("graphics/pokemon/furret/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6749,14 +6749,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOOTHOOT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front.4bpp.smol"); const u16 gMonPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/normal.gbapal"); - const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.lz"); + const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.smol"); const u16 gMonShinyPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/shiny.gbapal"); #else - const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/normal_gba.gbapal"); - const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hoothoot[] = INCBIN_U16("graphics/pokemon/hoothoot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6776,14 +6776,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front.4bpp.smol"); const u16 gMonPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/normal.gbapal"); - const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.lz"); + const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.smol"); const u16 gMonShinyPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/shiny.gbapal"); #else - const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/normal_gba.gbapal"); - const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Noctowl[] = INCBIN_U16("graphics/pokemon/noctowl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6805,14 +6805,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LEDYBA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front.4bpp.smol"); const u16 gMonPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/normal.gbapal"); - const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.lz"); + const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.smol"); const u16 gMonShinyPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/shiny.gbapal"); #else - const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/normal_gba.gbapal"); - const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ledyba[] = INCBIN_U16("graphics/pokemon/ledyba/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6832,22 +6832,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/backf.4bpp.lz"); + const u32 gMonFrontPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LedybaF[] = INCBIN_U32("graphics/pokemon/ledyba/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LedybaF[] = INCBIN_COMP("graphics/pokemon/ledyba/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front.4bpp.smol"); const u16 gMonPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/normal.gbapal"); - const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.lz"); + const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.smol"); const u16 gMonShinyPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/shiny.gbapal"); #else - const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/normal_gba.gbapal"); - const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ledian[] = INCBIN_U16("graphics/pokemon/ledian/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6867,8 +6867,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/backf.4bpp.lz"); + const u32 gMonFrontPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LedianF[] = INCBIN_U32("graphics/pokemon/ledian/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LedianF[] = INCBIN_COMP("graphics/pokemon/ledian/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -6877,14 +6877,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPINARAK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front.4bpp.smol"); const u16 gMonPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/normal.gbapal"); - const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.lz"); + const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.smol"); const u16 gMonShinyPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/shiny.gbapal"); #else - const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/normal_gba.gbapal"); - const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spinarak[] = INCBIN_U16("graphics/pokemon/spinarak/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6904,14 +6904,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front.4bpp.smol"); const u16 gMonPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/normal.gbapal"); - const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.lz"); + const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.smol"); const u16 gMonShinyPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/shiny.gbapal"); #else - const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/normal_gba.gbapal"); - const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ariados[] = INCBIN_U16("graphics/pokemon/ariados/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6933,14 +6933,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHINCHOU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front.4bpp.smol"); const u16 gMonPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/normal.gbapal"); - const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.lz"); + const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.smol"); const u16 gMonShinyPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/shiny.gbapal"); #else - const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/normal_gba.gbapal"); - const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chinchou[] = INCBIN_U16("graphics/pokemon/chinchou/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6960,14 +6960,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front.4bpp.smol"); const u16 gMonPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/normal.gbapal"); - const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.lz"); + const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.smol"); const u16 gMonShinyPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/shiny.gbapal"); #else - const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/normal_gba.gbapal"); - const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lanturn[] = INCBIN_U16("graphics/pokemon/lanturn/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -6989,14 +6989,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TOGEPI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front.4bpp.smol"); const u16 gMonPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/normal.gbapal"); - const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.lz"); + const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.smol"); const u16 gMonShinyPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/shiny.gbapal"); #else - const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/normal_gba.gbapal"); - const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Togepi[] = INCBIN_U16("graphics/pokemon/togepi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7016,14 +7016,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front.4bpp.smol"); const u16 gMonPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/normal.gbapal"); - const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.lz"); + const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.smol"); const u16 gMonShinyPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/shiny.gbapal"); #else - const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/normal_gba.gbapal"); - const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Togetic[] = INCBIN_U16("graphics/pokemon/togetic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7043,9 +7043,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/anim_front.4bpp.smol"); const u16 gMonPalette_Togekiss[] = INCBIN_U16("graphics/pokemon/togekiss/normal.gbapal"); - const u32 gMonBackPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/back.4bpp.lz"); + const u32 gMonBackPic_Togekiss[] = INCBIN_U32("graphics/pokemon/togekiss/back.4bpp.smol"); const u16 gMonShinyPalette_Togekiss[] = INCBIN_U16("graphics/pokemon/togekiss/shiny.gbapal"); const u8 gMonIcon_Togekiss[] = INCBIN_U8("graphics/pokemon/togekiss/icon.4bpp"); #if P_FOOTPRINTS @@ -7063,14 +7063,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NATU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front.4bpp.smol"); const u16 gMonPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/normal.gbapal"); - const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.lz"); + const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.smol"); const u16 gMonShinyPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/shiny.gbapal"); #else - const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/normal_gba.gbapal"); - const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Natu[] = INCBIN_U16("graphics/pokemon/natu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7090,14 +7090,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front.4bpp.smol"); const u16 gMonPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/normal.gbapal"); - const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.lz"); + const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.smol"); const u16 gMonShinyPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/shiny.gbapal"); #else - const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/normal_gba.gbapal"); - const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Xatu[] = INCBIN_U16("graphics/pokemon/xatu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7117,7 +7117,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_XatuF[] = INCBIN_U32("graphics/pokemon/xatu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_XatuF[] = INCBIN_U32("graphics/pokemon/xatu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_XatuF[] = INCBIN_COMP("graphics/pokemon/xatu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7126,14 +7126,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAREEP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front.4bpp.smol"); const u16 gMonPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/normal.gbapal"); - const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.lz"); + const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.smol"); const u16 gMonShinyPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/shiny.gbapal"); #else - const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/normal_gba.gbapal"); - const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mareep[] = INCBIN_U16("graphics/pokemon/mareep/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7153,14 +7153,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front.4bpp.smol"); const u16 gMonPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/normal.gbapal"); - const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.lz"); + const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.smol"); const u16 gMonShinyPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/shiny.gbapal"); #else - const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/normal_gba.gbapal"); - const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flaaffy[] = INCBIN_U16("graphics/pokemon/flaaffy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7180,14 +7180,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front.4bpp.smol"); const u16 gMonPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/normal.gbapal"); - const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.lz"); + const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.smol"); const u16 gMonShinyPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/shiny.gbapal"); #else - const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/normal_gba.gbapal"); - const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ampharos[] = INCBIN_U16("graphics/pokemon/ampharos/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7207,9 +7207,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/front.4bpp.smol"); const u16 gMonPalette_AmpharosMega[] = INCBIN_U16("graphics/pokemon/ampharos/mega/normal.gbapal"); - const u32 gMonBackPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/back.4bpp.lz"); + const u32 gMonBackPic_AmpharosMega[] = INCBIN_U32("graphics/pokemon/ampharos/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AmpharosMega[] = INCBIN_U16("graphics/pokemon/ampharos/mega/shiny.gbapal"); const u8 gMonIcon_AmpharosMega[] = INCBIN_U8("graphics/pokemon/ampharos/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -7225,14 +7225,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MARILL #if P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front.4bpp.smol"); const u16 gMonPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/normal.gbapal"); - const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.lz"); + const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.smol"); const u16 gMonShinyPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/shiny.gbapal"); #else - const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/normal_gba.gbapal"); - const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Azurill[] = INCBIN_U16("graphics/pokemon/azurill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7253,14 +7253,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front.4bpp.smol"); const u16 gMonPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/normal.gbapal"); - const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.lz"); + const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.smol"); const u16 gMonShinyPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/shiny.gbapal"); #else - const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/normal_gba.gbapal"); - const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marill[] = INCBIN_U16("graphics/pokemon/marill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7280,14 +7280,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front.4bpp.smol"); const u16 gMonPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/normal.gbapal"); - const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.lz"); + const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.smol"); const u16 gMonShinyPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/shiny.gbapal"); #else - const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/normal_gba.gbapal"); - const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back_gba.4bpp.lz"); + const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Azumarill[] = INCBIN_U16("graphics/pokemon/azumarill/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7309,9 +7309,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUDOWOODO #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/anim_front.4bpp.smol"); const u16 gMonPalette_Bonsly[] = INCBIN_U16("graphics/pokemon/bonsly/normal.gbapal"); - const u32 gMonBackPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/back.4bpp.lz"); + const u32 gMonBackPic_Bonsly[] = INCBIN_U32("graphics/pokemon/bonsly/back.4bpp.smol"); const u16 gMonShinyPalette_Bonsly[] = INCBIN_U16("graphics/pokemon/bonsly/shiny.gbapal"); const u8 gMonIcon_Bonsly[] = INCBIN_U8("graphics/pokemon/bonsly/icon.4bpp"); #if P_FOOTPRINTS @@ -7327,14 +7327,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front.4bpp.smol"); const u16 gMonPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/normal.gbapal"); - const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.lz"); + const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.smol"); const u16 gMonShinyPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/normal_gba.gbapal"); - const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sudowoodo[] = INCBIN_U16("graphics/pokemon/sudowoodo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7354,8 +7354,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/backf.4bpp.lz"); + const u32 gMonFrontPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SudowoodoF[] = INCBIN_U32("graphics/pokemon/sudowoodo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SudowoodoF[] = INCBIN_COMP("graphics/pokemon/sudowoodo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7364,14 +7364,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOPPIP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front.4bpp.smol"); const u16 gMonPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/normal.gbapal"); - const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.lz"); + const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.smol"); const u16 gMonShinyPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/shiny.gbapal"); #else - const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/normal_gba.gbapal"); - const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hoppip[] = INCBIN_U16("graphics/pokemon/hoppip/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7391,14 +7391,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front.4bpp.smol"); const u16 gMonPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/normal.gbapal"); - const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.lz"); + const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.smol"); const u16 gMonShinyPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/shiny.gbapal"); #else - const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/normal_gba.gbapal"); - const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skiploom[] = INCBIN_U16("graphics/pokemon/skiploom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7418,14 +7418,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front.4bpp.smol"); const u16 gMonPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/normal.gbapal"); - const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.lz"); + const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.smol"); const u16 gMonShinyPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/shiny.gbapal"); #else - const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/normal_gba.gbapal"); - const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jumpluff[] = INCBIN_U16("graphics/pokemon/jumpluff/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7447,14 +7447,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_AIPOM #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front.4bpp.smol"); const u16 gMonPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/normal.gbapal"); - const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.lz"); + const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.smol"); const u16 gMonShinyPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/shiny.gbapal"); #else - const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/normal_gba.gbapal"); - const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aipom[] = INCBIN_U16("graphics/pokemon/aipom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7474,17 +7474,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/backf.4bpp.lz"); + const u32 gMonFrontPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AipomF[] = INCBIN_U32("graphics/pokemon/aipom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AipomF[] = INCBIN_COMP("graphics/pokemon/aipom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/anim_front.4bpp.smol"); const u16 gMonPalette_Ambipom[] = INCBIN_U16("graphics/pokemon/ambipom/normal.gbapal"); - const u32 gMonBackPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/back.4bpp.lz"); + const u32 gMonBackPic_Ambipom[] = INCBIN_U32("graphics/pokemon/ambipom/back.4bpp.smol"); const u16 gMonShinyPalette_Ambipom[] = INCBIN_U16("graphics/pokemon/ambipom/shiny.gbapal"); const u8 gMonIcon_Ambipom[] = INCBIN_U8("graphics/pokemon/ambipom/icon.4bpp"); #if P_FOOTPRINTS @@ -7499,8 +7499,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/backf.4bpp.lz"); + const u32 gMonFrontPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_AmbipomF[] = INCBIN_U32("graphics/pokemon/ambipom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AmbipomF[] = INCBIN_COMP("graphics/pokemon/ambipom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -7510,14 +7510,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUNKERN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front.4bpp.smol"); const u16 gMonPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/normal.gbapal"); - const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.lz"); + const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.smol"); const u16 gMonShinyPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/shiny.gbapal"); #else - const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/normal_gba.gbapal"); - const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sunkern[] = INCBIN_U16("graphics/pokemon/sunkern/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7537,14 +7537,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front.4bpp.smol"); const u16 gMonPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/normal.gbapal"); - const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.lz"); + const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.smol"); const u16 gMonShinyPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/shiny.gbapal"); #else - const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/normal_gba.gbapal"); - const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sunflora[] = INCBIN_U16("graphics/pokemon/sunflora/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7566,14 +7566,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_YANMA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front.4bpp.smol"); const u16 gMonPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/normal.gbapal"); - const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.lz"); + const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.smol"); const u16 gMonShinyPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/shiny.gbapal"); #else - const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/normal_gba.gbapal"); - const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back_gba.4bpp.lz"); + const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Yanma[] = INCBIN_U16("graphics/pokemon/yanma/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7593,9 +7593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/anim_front.4bpp.smol"); const u16 gMonPalette_Yanmega[] = INCBIN_U16("graphics/pokemon/yanmega/normal.gbapal"); - const u32 gMonBackPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/back.4bpp.lz"); + const u32 gMonBackPic_Yanmega[] = INCBIN_U32("graphics/pokemon/yanmega/back.4bpp.smol"); const u16 gMonShinyPalette_Yanmega[] = INCBIN_U16("graphics/pokemon/yanmega/shiny.gbapal"); const u8 gMonIcon_Yanmega[] = INCBIN_U8("graphics/pokemon/yanmega/icon.4bpp"); #if P_FOOTPRINTS @@ -7613,14 +7613,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WOOPER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front.4bpp.smol"); const u16 gMonPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/normal.gbapal"); - const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.lz"); + const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.smol"); const u16 gMonShinyPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/shiny.gbapal"); #else - const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/normal_gba.gbapal"); - const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wooper[] = INCBIN_U16("graphics/pokemon/wooper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7640,22 +7640,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/backf.4bpp.lz"); + const u32 gMonFrontPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WooperF[] = INCBIN_U32("graphics/pokemon/wooper/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_WooperF[] = INCBIN_COMP("graphics/pokemon/wooper/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front.4bpp.smol"); const u16 gMonPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/normal.gbapal"); - const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.lz"); + const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.smol"); const u16 gMonShinyPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/shiny.gbapal"); #else - const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/normal_gba.gbapal"); - const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back_gba.4bpp.lz"); + const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Quagsire[] = INCBIN_U16("graphics/pokemon/quagsire/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7675,17 +7675,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/backf.4bpp.lz"); + const u32 gMonFrontPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_QuagsireF[] = INCBIN_U32("graphics/pokemon/quagsire/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_QuagsireF[] = INCBIN_COMP("graphics/pokemon/quagsire/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_PALDEAN_FORMS - const u32 gMonFrontPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/front.4bpp.lz"); + const u32 gMonFrontPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/front.4bpp.smol"); const u16 gMonPalette_WooperPaldea[] = INCBIN_U16("graphics/pokemon/wooper/paldea/normal.gbapal"); - const u32 gMonBackPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/back.4bpp.lz"); + const u32 gMonBackPic_WooperPaldea[] = INCBIN_U32("graphics/pokemon/wooper/paldea/back.4bpp.smol"); const u16 gMonShinyPalette_WooperPaldea[] = INCBIN_U16("graphics/pokemon/wooper/paldea/shiny.gbapal"); const u8 gMonIcon_WooperPaldea[] = INCBIN_U8("graphics/pokemon/wooper/paldea/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -7696,9 +7696,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/anim_front.4bpp.smol"); const u16 gMonPalette_Clodsire[] = INCBIN_U16("graphics/pokemon/clodsire/normal.gbapal"); - const u32 gMonBackPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/back.4bpp.lz"); + const u32 gMonBackPic_Clodsire[] = INCBIN_U32("graphics/pokemon/clodsire/back.4bpp.smol"); const u16 gMonShinyPalette_Clodsire[] = INCBIN_U16("graphics/pokemon/clodsire/shiny.gbapal"); const u8 gMonIcon_Clodsire[] = INCBIN_U8("graphics/pokemon/clodsire/icon.4bpp"); #if P_FOOTPRINTS @@ -7716,14 +7716,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MURKROW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front.4bpp.smol"); const u16 gMonPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/normal.gbapal"); - const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.lz"); + const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.smol"); const u16 gMonShinyPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/shiny.gbapal"); #else - const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/normal_gba.gbapal"); - const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Murkrow[] = INCBIN_U16("graphics/pokemon/murkrow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7743,17 +7743,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/backf.4bpp.lz"); + const u32 gMonFrontPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MurkrowF[] = INCBIN_U32("graphics/pokemon/murkrow/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MurkrowF[] = INCBIN_COMP("graphics/pokemon/murkrow/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/anim_front.4bpp.smol"); const u16 gMonPalette_Honchkrow[] = INCBIN_U16("graphics/pokemon/honchkrow/normal.gbapal"); - const u32 gMonBackPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/back.4bpp.lz"); + const u32 gMonBackPic_Honchkrow[] = INCBIN_U32("graphics/pokemon/honchkrow/back.4bpp.smol"); const u16 gMonShinyPalette_Honchkrow[] = INCBIN_U16("graphics/pokemon/honchkrow/shiny.gbapal"); const u8 gMonIcon_Honchkrow[] = INCBIN_U8("graphics/pokemon/honchkrow/icon.4bpp"); #if P_FOOTPRINTS @@ -7771,14 +7771,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MISDREAVUS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front.4bpp.smol"); const u16 gMonPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/normal.gbapal"); - const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.lz"); + const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.smol"); const u16 gMonShinyPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/shiny.gbapal"); #else - const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/normal_gba.gbapal"); - const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back_gba.4bpp.lz"); + const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Misdreavus[] = INCBIN_U16("graphics/pokemon/misdreavus/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -7798,9 +7798,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/anim_front.4bpp.smol"); const u16 gMonPalette_Mismagius[] = INCBIN_U16("graphics/pokemon/mismagius/normal.gbapal"); - const u32 gMonBackPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/back.4bpp.lz"); + const u32 gMonBackPic_Mismagius[] = INCBIN_U32("graphics/pokemon/mismagius/back.4bpp.smol"); const u16 gMonShinyPalette_Mismagius[] = INCBIN_U16("graphics/pokemon/mismagius/shiny.gbapal"); const u8 gMonIcon_Mismagius[] = INCBIN_U8("graphics/pokemon/mismagius/icon.4bpp"); #if P_FOOTPRINTS @@ -7823,116 +7823,116 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Unown[] = INCBIN_U8("graphics/pokemon/unown/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/front.4bpp.lz"); - const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/back.4bpp.lz"); + const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/front.4bpp.smol"); + const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/back.4bpp.smol"); const u8 gMonIcon_UnownA[] = INCBIN_U8("graphics/pokemon/unown/icon.4bpp"); - const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.lz"); - const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.lz"); + const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.smol"); + const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.smol"); const u8 gMonIcon_UnownB[] = INCBIN_U8("graphics/pokemon/unown/b/icon.4bpp"); - const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.lz"); - const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.lz"); + const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.smol"); + const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.smol"); const u8 gMonIcon_UnownC[] = INCBIN_U8("graphics/pokemon/unown/c/icon.4bpp"); - const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.lz"); - const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.lz"); + const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.smol"); + const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.smol"); const u8 gMonIcon_UnownD[] = INCBIN_U8("graphics/pokemon/unown/d/icon.4bpp"); - const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.lz"); - const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.lz"); + const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.smol"); + const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.smol"); const u8 gMonIcon_UnownE[] = INCBIN_U8("graphics/pokemon/unown/e/icon.4bpp"); - const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.lz"); - const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.lz"); + const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.smol"); + const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.smol"); const u8 gMonIcon_UnownF[] = INCBIN_U8("graphics/pokemon/unown/f/icon.4bpp"); - const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.lz"); - const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.lz"); + const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.smol"); + const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.smol"); const u8 gMonIcon_UnownG[] = INCBIN_U8("graphics/pokemon/unown/g/icon.4bpp"); - const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.lz"); - const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.lz"); + const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.smol"); + const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.smol"); const u8 gMonIcon_UnownH[] = INCBIN_U8("graphics/pokemon/unown/h/icon.4bpp"); - const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.lz"); - const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.lz"); + const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.smol"); + const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.smol"); const u8 gMonIcon_UnownI[] = INCBIN_U8("graphics/pokemon/unown/i/icon.4bpp"); - const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.lz"); - const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.lz"); + const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.smol"); + const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.smol"); const u8 gMonIcon_UnownJ[] = INCBIN_U8("graphics/pokemon/unown/j/icon.4bpp"); - const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.lz"); - const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.lz"); + const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.smol"); + const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.smol"); const u8 gMonIcon_UnownK[] = INCBIN_U8("graphics/pokemon/unown/k/icon.4bpp"); - const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.lz"); - const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.lz"); + const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.smol"); + const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.smol"); const u8 gMonIcon_UnownL[] = INCBIN_U8("graphics/pokemon/unown/l/icon.4bpp"); - const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.lz"); - const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.lz"); + const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.smol"); + const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.smol"); const u8 gMonIcon_UnownM[] = INCBIN_U8("graphics/pokemon/unown/m/icon.4bpp"); - const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.lz"); - const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.lz"); + const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.smol"); + const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.smol"); const u8 gMonIcon_UnownN[] = INCBIN_U8("graphics/pokemon/unown/n/icon.4bpp"); - const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.lz"); - const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.lz"); + const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.smol"); + const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.smol"); const u8 gMonIcon_UnownO[] = INCBIN_U8("graphics/pokemon/unown/o/icon.4bpp"); - const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.lz"); - const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.lz"); + const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.smol"); + const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.smol"); const u8 gMonIcon_UnownP[] = INCBIN_U8("graphics/pokemon/unown/p/icon.4bpp"); - const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.lz"); - const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.lz"); + const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.smol"); + const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.smol"); const u8 gMonIcon_UnownQ[] = INCBIN_U8("graphics/pokemon/unown/q/icon.4bpp"); - const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.lz"); - const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.lz"); + const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.smol"); + const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.smol"); const u8 gMonIcon_UnownR[] = INCBIN_U8("graphics/pokemon/unown/r/icon.4bpp"); - const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.lz"); - const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.lz"); + const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.smol"); + const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.smol"); const u8 gMonIcon_UnownS[] = INCBIN_U8("graphics/pokemon/unown/s/icon.4bpp"); - const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.lz"); - const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.lz"); + const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.smol"); + const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.smol"); const u8 gMonIcon_UnownT[] = INCBIN_U8("graphics/pokemon/unown/t/icon.4bpp"); - const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.lz"); - const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.lz"); + const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.smol"); + const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.smol"); const u8 gMonIcon_UnownU[] = INCBIN_U8("graphics/pokemon/unown/u/icon.4bpp"); - const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.lz"); - const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.lz"); + const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.smol"); + const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.smol"); const u8 gMonIcon_UnownV[] = INCBIN_U8("graphics/pokemon/unown/v/icon.4bpp"); - const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.lz"); - const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.lz"); + const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.smol"); + const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.smol"); const u8 gMonIcon_UnownW[] = INCBIN_U8("graphics/pokemon/unown/w/icon.4bpp"); - const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.lz"); - const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.lz"); + const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.smol"); + const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.smol"); const u8 gMonIcon_UnownX[] = INCBIN_U8("graphics/pokemon/unown/x/icon.4bpp"); - const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.lz"); - const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.lz"); + const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.smol"); + const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.smol"); const u8 gMonIcon_UnownY[] = INCBIN_U8("graphics/pokemon/unown/y/icon.4bpp"); - const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.lz"); - const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.lz"); + const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.smol"); + const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.smol"); const u8 gMonIcon_UnownZ[] = INCBIN_U8("graphics/pokemon/unown/z/icon.4bpp"); - const u32 gMonFrontPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/front.4bpp.lz"); - const u32 gMonBackPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/back.4bpp.lz"); + const u32 gMonFrontPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/front.4bpp.smol"); + const u32 gMonBackPic_UnownExclamation[] = INCBIN_U32("graphics/pokemon/unown/exclamation/back.4bpp.smol"); const u8 gMonIcon_UnownExclamation[] = INCBIN_U8("graphics/pokemon/unown/exclamation/icon.4bpp"); - const u32 gMonFrontPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/front.4bpp.lz"); - const u32 gMonBackPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/back.4bpp.lz"); + const u32 gMonFrontPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/front.4bpp.smol"); + const u32 gMonBackPic_UnownQuestion[] = INCBIN_U32("graphics/pokemon/unown/question/back.4bpp.smol"); const u8 gMonIcon_UnownQuestion[] = INCBIN_U8("graphics/pokemon/unown/question/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -7974,14 +7974,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WOBBUFFET #if P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front.4bpp.smol"); const u16 gMonPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/normal.gbapal"); - const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.lz"); + const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.smol"); const u16 gMonShinyPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/shiny.gbapal"); #else - const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/normal_gba.gbapal"); - const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wynaut[] = INCBIN_U16("graphics/pokemon/wynaut/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8002,14 +8002,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_3_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front.4bpp.smol"); const u16 gMonPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/normal.gbapal"); - const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.lz"); + const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.smol"); const u16 gMonShinyPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/shiny.gbapal"); #else - const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/normal_gba.gbapal"); - const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wobbuffet[] = INCBIN_U16("graphics/pokemon/wobbuffet/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8029,8 +8029,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/backf.4bpp.lz"); + const u32 gMonFrontPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WobbuffetF[] = INCBIN_U32("graphics/pokemon/wobbuffet/backf.4bpp.smol"); #if P_CUSTOM_GENDER_DIFF_ICONS const u8 gMonIcon_WobbuffetF[] = INCBIN_U8("graphics/pokemon/wobbuffet/iconf.4bpp"); #endif @@ -8042,14 +8042,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GIRAFARIG #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front.4bpp.smol"); const u16 gMonPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/normal.gbapal"); - const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.lz"); + const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.smol"); const u16 gMonShinyPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/shiny.gbapal"); #else - const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/normal_gba.gbapal"); - const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back_gba.4bpp.lz"); + const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Girafarig[] = INCBIN_U16("graphics/pokemon/girafarig/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8069,17 +8069,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/backf.4bpp.lz"); + const u32 gMonFrontPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GirafarigF[] = INCBIN_U32("graphics/pokemon/girafarig/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GirafarigF[] = INCBIN_COMP("graphics/pokemon/girafarig/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/front.4bpp.lz"); + const u32 gMonFrontPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/front.4bpp.smol"); const u16 gMonPalette_Farigiraf[] = INCBIN_U16("graphics/pokemon/farigiraf/normal.gbapal"); - const u32 gMonBackPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/back.4bpp.lz"); + const u32 gMonBackPic_Farigiraf[] = INCBIN_U32("graphics/pokemon/farigiraf/back.4bpp.smol"); const u16 gMonShinyPalette_Farigiraf[] = INCBIN_U16("graphics/pokemon/farigiraf/shiny.gbapal"); const u8 gMonIcon_Farigiraf[] = INCBIN_U8("graphics/pokemon/farigiraf/icon.4bpp"); #if P_FOOTPRINTS @@ -8097,14 +8097,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PINECO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front.4bpp.smol"); const u16 gMonPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/normal.gbapal"); - const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.lz"); + const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.smol"); const u16 gMonShinyPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/shiny.gbapal"); #else - const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/normal_gba.gbapal"); - const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pineco[] = INCBIN_U16("graphics/pokemon/pineco/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8124,14 +8124,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front.4bpp.smol"); const u16 gMonPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/normal.gbapal"); - const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.lz"); + const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.smol"); const u16 gMonShinyPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/shiny.gbapal"); #else - const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/normal_gba.gbapal"); - const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back_gba.4bpp.lz"); + const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Forretress[] = INCBIN_U16("graphics/pokemon/forretress/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8153,14 +8153,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DUNSPARCE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front.4bpp.smol"); const u16 gMonPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/normal.gbapal"); - const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.lz"); + const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.smol"); const u16 gMonShinyPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/shiny.gbapal"); #else - const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/normal_gba.gbapal"); - const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dunsparce[] = INCBIN_U16("graphics/pokemon/dunsparce/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8197,24 +8197,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/front.4bpp.lz"); - const u32 gMonBackPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/back.4bpp.lz"); + const u32 gMonFrontPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/front.4bpp.smol"); + const u32 gMonBackPic_DudunsparceTwoSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/back.4bpp.smol"); - const u32 gMonFrontPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/front.4bpp.lz"); - const u32 gMonBackPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/back.4bpp.lz"); + const u32 gMonFrontPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/front.4bpp.smol"); + const u32 gMonBackPic_DudunsparceThreeSegment[] = INCBIN_U32("graphics/pokemon/dudunsparce/three_segment/back.4bpp.smol"); #endif //P_GEN_9_CROSS_EVOS #endif //P_FAMILY_DUNSPARCE #if P_FAMILY_GLIGAR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front.4bpp.smol"); const u16 gMonPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/normal.gbapal"); - const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.lz"); + const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.smol"); const u16 gMonShinyPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/shiny.gbapal"); #else - const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/normal_gba.gbapal"); - const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gligar[] = INCBIN_U16("graphics/pokemon/gligar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8234,17 +8234,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/backf.4bpp.lz"); + const u32 gMonFrontPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GligarF[] = INCBIN_U32("graphics/pokemon/gligar/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GligarF[] = INCBIN_COMP("graphics/pokemon/gligar/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/anim_front.4bpp.smol"); const u16 gMonPalette_Gliscor[] = INCBIN_U16("graphics/pokemon/gliscor/normal.gbapal"); - const u32 gMonBackPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/back.4bpp.lz"); + const u32 gMonBackPic_Gliscor[] = INCBIN_U32("graphics/pokemon/gliscor/back.4bpp.smol"); const u16 gMonShinyPalette_Gliscor[] = INCBIN_U16("graphics/pokemon/gliscor/shiny.gbapal"); const u8 gMonIcon_Gliscor[] = INCBIN_U8("graphics/pokemon/gliscor/icon.4bpp"); #if P_FOOTPRINTS @@ -8262,14 +8262,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNUBBULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front.4bpp.smol"); const u16 gMonPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/normal.gbapal"); - const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.lz"); + const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.smol"); const u16 gMonShinyPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/shiny.gbapal"); #else - const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/normal_gba.gbapal"); - const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snubbull[] = INCBIN_U16("graphics/pokemon/snubbull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8289,14 +8289,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front.4bpp.smol"); const u16 gMonPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/normal.gbapal"); - const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.lz"); + const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.smol"); const u16 gMonShinyPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/shiny.gbapal"); #else - const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/normal_gba.gbapal"); - const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Granbull[] = INCBIN_U16("graphics/pokemon/granbull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8318,14 +8318,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_QWILFISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front.4bpp.smol"); const u16 gMonPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/normal.gbapal"); - const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.lz"); + const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.smol"); const u16 gMonShinyPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/shiny.gbapal"); #else - const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/normal_gba.gbapal"); - const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Qwilfish[] = INCBIN_U16("graphics/pokemon/qwilfish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8345,9 +8345,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/front.4bpp.smol"); const u16 gMonPalette_QwilfishHisui[] = INCBIN_U16("graphics/pokemon/qwilfish/hisui/normal.gbapal"); - const u32 gMonBackPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/back.4bpp.lz"); + const u32 gMonBackPic_QwilfishHisui[] = INCBIN_U32("graphics/pokemon/qwilfish/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_QwilfishHisui[] = INCBIN_U16("graphics/pokemon/qwilfish/hisui/shiny.gbapal"); const u8 gMonIcon_QwilfishHisui[] = INCBIN_U8("graphics/pokemon/qwilfish/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8358,9 +8358,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/front.4bpp.lz"); + const u32 gMonFrontPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/front.4bpp.smol"); const u16 gMonPalette_Overqwil[] = INCBIN_U16("graphics/pokemon/overqwil/normal.gbapal"); - const u32 gMonBackPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/back.4bpp.lz"); + const u32 gMonBackPic_Overqwil[] = INCBIN_U32("graphics/pokemon/overqwil/back.4bpp.smol"); const u16 gMonShinyPalette_Overqwil[] = INCBIN_U16("graphics/pokemon/overqwil/shiny.gbapal"); const u8 gMonIcon_Overqwil[] = INCBIN_U8("graphics/pokemon/overqwil/icon.4bpp"); #if P_FOOTPRINTS @@ -8378,14 +8378,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHUCKLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front.4bpp.smol"); const u16 gMonPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/normal.gbapal"); - const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.lz"); + const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.smol"); const u16 gMonShinyPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/shiny.gbapal"); #else - const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/normal_gba.gbapal"); - const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shuckle[] = INCBIN_U16("graphics/pokemon/shuckle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8407,14 +8407,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HERACROSS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front.4bpp.smol"); const u16 gMonPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/normal.gbapal"); - const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.lz"); + const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.smol"); const u16 gMonShinyPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/shiny.gbapal"); #else - const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/normal_gba.gbapal"); - const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back_gba.4bpp.lz"); + const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Heracross[] = INCBIN_U16("graphics/pokemon/heracross/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8434,17 +8434,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/backf.4bpp.lz"); + const u32 gMonFrontPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HeracrossF[] = INCBIN_U32("graphics/pokemon/heracross/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HeracrossF[] = INCBIN_COMP("graphics/pokemon/heracross/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/front.4bpp.lz"); + const u32 gMonFrontPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/front.4bpp.smol"); const u16 gMonPalette_HeracrossMega[] = INCBIN_U16("graphics/pokemon/heracross/mega/normal.gbapal"); - const u32 gMonBackPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/back.4bpp.lz"); + const u32 gMonBackPic_HeracrossMega[] = INCBIN_U32("graphics/pokemon/heracross/mega/back.4bpp.smol"); const u16 gMonShinyPalette_HeracrossMega[] = INCBIN_U16("graphics/pokemon/heracross/mega/shiny.gbapal"); const u8 gMonIcon_HeracrossMega[] = INCBIN_U8("graphics/pokemon/heracross/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -8459,14 +8459,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNEASEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front.4bpp.smol"); const u16 gMonPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/normal.gbapal"); - const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.lz"); + const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.smol"); const u16 gMonShinyPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/shiny.gbapal"); #else - const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/normal_gba.gbapal"); - const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sneasel[] = INCBIN_U16("graphics/pokemon/sneasel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8486,17 +8486,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/backf.4bpp.lz"); + const u32 gMonFrontPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SneaselF[] = INCBIN_U32("graphics/pokemon/sneasel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SneaselF[] = INCBIN_COMP("graphics/pokemon/sneasel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/anim_front.4bpp.smol"); const u16 gMonPalette_Weavile[] = INCBIN_U16("graphics/pokemon/weavile/normal.gbapal"); - const u32 gMonBackPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/back.4bpp.lz"); + const u32 gMonBackPic_Weavile[] = INCBIN_U32("graphics/pokemon/weavile/back.4bpp.smol"); const u16 gMonShinyPalette_Weavile[] = INCBIN_U16("graphics/pokemon/weavile/shiny.gbapal"); const u8 gMonIcon_Weavile[] = INCBIN_U8("graphics/pokemon/weavile/icon.4bpp"); #if P_FOOTPRINTS @@ -8511,8 +8511,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/backf.4bpp.lz"); + const u32 gMonFrontPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_WeavileF[] = INCBIN_U32("graphics/pokemon/weavile/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_WeavileF[] = INCBIN_COMP("graphics/pokemon/weavile/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8520,9 +8520,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/front.4bpp.smol"); const u16 gMonPalette_SneaselHisui[] = INCBIN_U16("graphics/pokemon/sneasel/hisui/normal.gbapal"); - const u32 gMonBackPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SneaselHisui[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SneaselHisui[] = INCBIN_U16("graphics/pokemon/sneasel/hisui/shiny.gbapal"); const u8 gMonIcon_SneaselHisui[] = INCBIN_U8("graphics/pokemon/sneasel/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8534,16 +8534,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/frontf.4bpp.lz"); - const u32 gMonBackPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/backf.4bpp.lz"); + const u32 gMonFrontPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/frontf.4bpp.smol"); + const u32 gMonBackPic_SneaselHisuiF[] = INCBIN_U32("graphics/pokemon/sneasel/hisui/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SneaselHisuiF[] = INCBIN_COMP("graphics/pokemon/sneasel/hisui/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/front.4bpp.lz"); + const u32 gMonFrontPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/front.4bpp.smol"); const u16 gMonPalette_Sneasler[] = INCBIN_U16("graphics/pokemon/sneasler/normal.gbapal"); - const u32 gMonBackPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/back.4bpp.lz"); + const u32 gMonBackPic_Sneasler[] = INCBIN_U32("graphics/pokemon/sneasler/back.4bpp.smol"); const u16 gMonShinyPalette_Sneasler[] = INCBIN_U16("graphics/pokemon/sneasler/shiny.gbapal"); const u8 gMonIcon_Sneasler[] = INCBIN_U8("graphics/pokemon/sneasler/icon.4bpp"); #if P_FOOTPRINTS @@ -8561,14 +8561,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TEDDIURSA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front.4bpp.smol"); const u16 gMonPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/normal.gbapal"); - const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.lz"); + const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.smol"); const u16 gMonShinyPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/shiny.gbapal"); #else - const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/normal_gba.gbapal"); - const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back_gba.4bpp.lz"); + const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Teddiursa[] = INCBIN_U16("graphics/pokemon/teddiursa/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8588,14 +8588,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front.4bpp.smol"); const u16 gMonPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/normal.gbapal"); - const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.lz"); + const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.smol"); const u16 gMonShinyPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/shiny.gbapal"); #else - const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/normal_gba.gbapal"); - const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ursaring[] = INCBIN_U16("graphics/pokemon/ursaring/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8615,17 +8615,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/backf.4bpp.lz"); + const u32 gMonFrontPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_UrsaringF[] = INCBIN_U32("graphics/pokemon/ursaring/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_UrsaringF[] = INCBIN_COMP("graphics/pokemon/ursaring/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/front.4bpp.lz"); + const u32 gMonFrontPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/front.4bpp.smol"); const u16 gMonPalette_Ursaluna[] = INCBIN_U16("graphics/pokemon/ursaluna/normal.gbapal"); - const u32 gMonBackPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/back.4bpp.lz"); + const u32 gMonBackPic_Ursaluna[] = INCBIN_U32("graphics/pokemon/ursaluna/back.4bpp.smol"); const u16 gMonShinyPalette_Ursaluna[] = INCBIN_U16("graphics/pokemon/ursaluna/shiny.gbapal"); const u8 gMonIcon_Ursaluna[] = INCBIN_U8("graphics/pokemon/ursaluna/icon.4bpp"); #if P_FOOTPRINTS @@ -8639,9 +8639,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/front.4bpp.lz"); + const u32 gMonFrontPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/front.4bpp.smol"); const u16 gMonPalette_UrsalunaBloodmoon[] = INCBIN_U16("graphics/pokemon/ursaluna/bloodmoon/normal.gbapal"); - const u32 gMonBackPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/back.4bpp.lz"); + const u32 gMonBackPic_UrsalunaBloodmoon[] = INCBIN_U32("graphics/pokemon/ursaluna/bloodmoon/back.4bpp.smol"); const u16 gMonShinyPalette_UrsalunaBloodmoon[] = INCBIN_U16("graphics/pokemon/ursaluna/bloodmoon/shiny.gbapal"); const u8 gMonIcon_UrsalunaBloodmoon[] = INCBIN_U8("graphics/pokemon/ursaluna/bloodmoon/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8656,14 +8656,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLUGMA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front.4bpp.smol"); const u16 gMonPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/normal.gbapal"); - const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.lz"); + const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.smol"); const u16 gMonShinyPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/shiny.gbapal"); #else - const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/normal_gba.gbapal"); - const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slugma[] = INCBIN_U16("graphics/pokemon/slugma/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8683,14 +8683,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front.4bpp.smol"); const u16 gMonPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/normal.gbapal"); - const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.lz"); + const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.smol"); const u16 gMonShinyPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/shiny.gbapal"); #else - const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/normal_gba.gbapal"); - const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Magcargo[] = INCBIN_U16("graphics/pokemon/magcargo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8712,14 +8712,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SWINUB #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front.4bpp.smol"); const u16 gMonPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/normal.gbapal"); - const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.lz"); + const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.smol"); const u16 gMonShinyPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/shiny.gbapal"); #else - const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/normal_gba.gbapal"); - const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swinub[] = INCBIN_U16("graphics/pokemon/swinub/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8739,14 +8739,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front.4bpp.smol"); const u16 gMonPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/normal.gbapal"); - const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.lz"); + const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.smol"); const u16 gMonShinyPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/shiny.gbapal"); #else - const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/normal_gba.gbapal"); - const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Piloswine[] = INCBIN_U16("graphics/pokemon/piloswine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8766,17 +8766,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/backf.4bpp.lz"); + const u32 gMonFrontPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PiloswineF[] = INCBIN_U32("graphics/pokemon/piloswine/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PiloswineF[] = INCBIN_COMP("graphics/pokemon/piloswine/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_front.4bpp.smol"); const u16 gMonPalette_Mamoswine[] = INCBIN_U16("graphics/pokemon/mamoswine/normal.gbapal"); - const u32 gMonBackPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/back.4bpp.lz"); + const u32 gMonBackPic_Mamoswine[] = INCBIN_U32("graphics/pokemon/mamoswine/back.4bpp.smol"); const u16 gMonShinyPalette_Mamoswine[] = INCBIN_U16("graphics/pokemon/mamoswine/shiny.gbapal"); const u8 gMonIcon_Mamoswine[] = INCBIN_U8("graphics/pokemon/mamoswine/icon.4bpp"); #if P_FOOTPRINTS @@ -8791,7 +8791,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MamoswineF[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_MamoswineF[] = INCBIN_U32("graphics/pokemon/mamoswine/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MamoswineF[] = INCBIN_COMP("graphics/pokemon/mamoswine/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8801,14 +8801,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CORSOLA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front.4bpp.smol"); const u16 gMonPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/normal.gbapal"); - const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.lz"); + const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.smol"); const u16 gMonShinyPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/shiny.gbapal"); #else - const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/normal_gba.gbapal"); - const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back_gba.4bpp.lz"); + const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Corsola[] = INCBIN_U16("graphics/pokemon/corsola/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8828,9 +8828,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/front.4bpp.lz"); + const u32 gMonFrontPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/front.4bpp.smol"); const u16 gMonPalette_CorsolaGalar[] = INCBIN_U16("graphics/pokemon/corsola/galar/normal.gbapal"); - const u32 gMonBackPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/back.4bpp.lz"); + const u32 gMonBackPic_CorsolaGalar[] = INCBIN_U32("graphics/pokemon/corsola/galar/back.4bpp.smol"); const u16 gMonShinyPalette_CorsolaGalar[] = INCBIN_U16("graphics/pokemon/corsola/galar/shiny.gbapal"); const u8 gMonIcon_CorsolaGalar[] = INCBIN_U8("graphics/pokemon/corsola/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -8841,9 +8841,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/front.4bpp.lz"); + const u32 gMonFrontPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/front.4bpp.smol"); const u16 gMonPalette_Cursola[] = INCBIN_U16("graphics/pokemon/cursola/normal.gbapal"); - const u32 gMonBackPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/back.4bpp.lz"); + const u32 gMonBackPic_Cursola[] = INCBIN_U32("graphics/pokemon/cursola/back.4bpp.smol"); const u16 gMonShinyPalette_Cursola[] = INCBIN_U16("graphics/pokemon/cursola/shiny.gbapal"); const u8 gMonIcon_Cursola[] = INCBIN_U8("graphics/pokemon/cursola/icon.4bpp"); #if P_FOOTPRINTS @@ -8861,14 +8861,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REMORAID #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front.4bpp.smol"); const u16 gMonPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/normal.gbapal"); - const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.lz"); + const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.smol"); const u16 gMonShinyPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/shiny.gbapal"); #else - const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/normal_gba.gbapal"); - const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back_gba.4bpp.lz"); + const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Remoraid[] = INCBIN_U16("graphics/pokemon/remoraid/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8888,14 +8888,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front.4bpp.smol"); const u16 gMonPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/normal.gbapal"); - const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.lz"); + const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.smol"); const u16 gMonShinyPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/shiny.gbapal"); #else - const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/normal_gba.gbapal"); - const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back_gba.4bpp.lz"); + const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Octillery[] = INCBIN_U16("graphics/pokemon/octillery/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8915,8 +8915,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/backf.4bpp.lz"); + const u32 gMonFrontPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_OctilleryF[] = INCBIN_U32("graphics/pokemon/octillery/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_OctilleryF[] = INCBIN_COMP("graphics/pokemon/octillery/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -8925,14 +8925,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DELIBIRD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front.4bpp.smol"); const u16 gMonPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/normal.gbapal"); - const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.lz"); + const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.smol"); const u16 gMonShinyPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/shiny.gbapal"); #else - const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/normal_gba.gbapal"); - const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back_gba.4bpp.lz"); + const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Delibird[] = INCBIN_U16("graphics/pokemon/delibird/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -8954,9 +8954,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MANTINE #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/anim_front.4bpp.smol"); const u16 gMonPalette_Mantyke[] = INCBIN_U16("graphics/pokemon/mantyke/normal.gbapal"); - const u32 gMonBackPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/back.4bpp.lz"); + const u32 gMonBackPic_Mantyke[] = INCBIN_U32("graphics/pokemon/mantyke/back.4bpp.smol"); const u16 gMonShinyPalette_Mantyke[] = INCBIN_U16("graphics/pokemon/mantyke/shiny.gbapal"); const u8 gMonIcon_Mantyke[] = INCBIN_U8("graphics/pokemon/mantyke/icon.4bpp"); #if P_FOOTPRINTS @@ -8972,14 +8972,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front.4bpp.smol"); const u16 gMonPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/normal.gbapal"); - const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.lz"); + const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.smol"); const u16 gMonShinyPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/shiny.gbapal"); #else - const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/normal_gba.gbapal"); - const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mantine[] = INCBIN_U16("graphics/pokemon/mantine/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9001,14 +9001,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SKARMORY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front.4bpp.smol"); const u16 gMonPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/normal.gbapal"); - const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.lz"); + const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.smol"); const u16 gMonShinyPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/shiny.gbapal"); #else - const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/normal_gba.gbapal"); - const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skarmory[] = INCBIN_U16("graphics/pokemon/skarmory/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9030,14 +9030,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HOUNDOUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front.4bpp.smol"); const u16 gMonPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/normal.gbapal"); - const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.lz"); + const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.smol"); const u16 gMonShinyPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/shiny.gbapal"); #else - const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/normal_gba.gbapal"); - const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back_gba.4bpp.lz"); + const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Houndour[] = INCBIN_U16("graphics/pokemon/houndour/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9057,14 +9057,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front.4bpp.smol"); const u16 gMonPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/normal.gbapal"); - const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.lz"); + const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.smol"); const u16 gMonShinyPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/shiny.gbapal"); #else - const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/normal_gba.gbapal"); - const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Houndoom[] = INCBIN_U16("graphics/pokemon/houndoom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9084,17 +9084,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/backf.4bpp.lz"); + const u32 gMonFrontPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_HoundoomF[] = INCBIN_U32("graphics/pokemon/houndoom/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_HoundoomF[] = INCBIN_COMP("graphics/pokemon/houndoom/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/front.4bpp.lz"); + const u32 gMonFrontPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/front.4bpp.smol"); const u16 gMonPalette_HoundoomMega[] = INCBIN_U16("graphics/pokemon/houndoom/mega/normal.gbapal"); - const u32 gMonBackPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/back.4bpp.lz"); + const u32 gMonBackPic_HoundoomMega[] = INCBIN_U32("graphics/pokemon/houndoom/mega/back.4bpp.smol"); const u16 gMonShinyPalette_HoundoomMega[] = INCBIN_U16("graphics/pokemon/houndoom/mega/shiny.gbapal"); const u8 gMonIcon_HoundoomMega[] = INCBIN_U8("graphics/pokemon/houndoom/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9109,14 +9109,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PHANPY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front.4bpp.smol"); const u16 gMonPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/normal.gbapal"); - const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.lz"); + const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.smol"); const u16 gMonShinyPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/shiny.gbapal"); #else - const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/normal_gba.gbapal"); - const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Phanpy[] = INCBIN_U16("graphics/pokemon/phanpy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9136,14 +9136,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front.4bpp.smol"); const u16 gMonPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/normal.gbapal"); - const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.lz"); + const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.smol"); const u16 gMonShinyPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/shiny.gbapal"); #else - const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/normal_gba.gbapal"); - const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back_gba.4bpp.lz"); + const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Donphan[] = INCBIN_U16("graphics/pokemon/donphan/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9163,8 +9163,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/backf.4bpp.lz"); + const u32 gMonFrontPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DonphanF[] = INCBIN_U32("graphics/pokemon/donphan/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DonphanF[] = INCBIN_COMP("graphics/pokemon/donphan/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -9173,14 +9173,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_STANTLER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front.4bpp.smol"); const u16 gMonPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/normal.gbapal"); - const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.lz"); + const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.smol"); const u16 gMonShinyPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/shiny.gbapal"); #else - const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/normal_gba.gbapal"); - const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back_gba.4bpp.lz"); + const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Stantler[] = INCBIN_U16("graphics/pokemon/stantler/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9200,9 +9200,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_8_CROSS_EVOS - const u32 gMonFrontPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/front.4bpp.lz"); + const u32 gMonFrontPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/front.4bpp.smol"); const u16 gMonPalette_Wyrdeer[] = INCBIN_U16("graphics/pokemon/wyrdeer/normal.gbapal"); - const u32 gMonBackPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/back.4bpp.lz"); + const u32 gMonBackPic_Wyrdeer[] = INCBIN_U32("graphics/pokemon/wyrdeer/back.4bpp.smol"); const u16 gMonShinyPalette_Wyrdeer[] = INCBIN_U16("graphics/pokemon/wyrdeer/shiny.gbapal"); const u8 gMonIcon_Wyrdeer[] = INCBIN_U8("graphics/pokemon/wyrdeer/icon.4bpp"); #if P_FOOTPRINTS @@ -9220,14 +9220,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SMEARGLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front.4bpp.smol"); const u16 gMonPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/normal.gbapal"); - const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.lz"); + const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.smol"); const u16 gMonShinyPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/shiny.gbapal"); #else - const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/normal_gba.gbapal"); - const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Smeargle[] = INCBIN_U16("graphics/pokemon/smeargle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9249,14 +9249,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MILTANK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front.4bpp.smol"); const u16 gMonPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/normal.gbapal"); - const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.lz"); + const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.smol"); const u16 gMonShinyPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/shiny.gbapal"); #else - const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/normal_gba.gbapal"); - const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back_gba.4bpp.lz"); + const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Miltank[] = INCBIN_U16("graphics/pokemon/miltank/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9278,14 +9278,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RAIKOU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front.4bpp.smol"); const u16 gMonPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/normal.gbapal"); - const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.lz"); + const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.smol"); const u16 gMonShinyPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/shiny.gbapal"); #else - const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/normal_gba.gbapal"); - const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back_gba.4bpp.lz"); + const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Raikou[] = INCBIN_U16("graphics/pokemon/raikou/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9307,14 +9307,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ENTEI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front.4bpp.smol"); const u16 gMonPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/normal.gbapal"); - const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.lz"); + const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.smol"); const u16 gMonShinyPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/shiny.gbapal"); #else - const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/normal_gba.gbapal"); - const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back_gba.4bpp.lz"); + const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Entei[] = INCBIN_U16("graphics/pokemon/entei/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9336,14 +9336,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SUICUNE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front.4bpp.smol"); const u16 gMonPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/normal.gbapal"); - const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.lz"); + const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.smol"); const u16 gMonShinyPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/shiny.gbapal"); #else - const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/normal_gba.gbapal"); - const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back_gba.4bpp.lz"); + const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Suicune[] = INCBIN_U16("graphics/pokemon/suicune/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9365,14 +9365,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LARVITAR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front.4bpp.smol"); const u16 gMonPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/normal.gbapal"); - const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.lz"); + const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.smol"); const u16 gMonShinyPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/normal_gba.gbapal"); - const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Larvitar[] = INCBIN_U16("graphics/pokemon/larvitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9392,14 +9392,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front.4bpp.smol"); const u16 gMonPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/normal.gbapal"); - const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.lz"); + const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.smol"); const u16 gMonShinyPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/normal_gba.gbapal"); - const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pupitar[] = INCBIN_U16("graphics/pokemon/pupitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9419,14 +9419,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front.4bpp.smol"); const u16 gMonPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/normal.gbapal"); - const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.lz"); + const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.smol"); const u16 gMonShinyPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/shiny.gbapal"); #else - const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/normal_gba.gbapal"); - const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tyranitar[] = INCBIN_U16("graphics/pokemon/tyranitar/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9446,9 +9446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/front.4bpp.lz"); + const u32 gMonFrontPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/front.4bpp.smol"); const u16 gMonPalette_TyranitarMega[] = INCBIN_U16("graphics/pokemon/tyranitar/mega/normal.gbapal"); - const u32 gMonBackPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/back.4bpp.lz"); + const u32 gMonBackPic_TyranitarMega[] = INCBIN_U32("graphics/pokemon/tyranitar/mega/back.4bpp.smol"); const u16 gMonShinyPalette_TyranitarMega[] = INCBIN_U16("graphics/pokemon/tyranitar/mega/shiny.gbapal"); const u8 gMonIcon_TyranitarMega[] = INCBIN_U8("graphics/pokemon/tyranitar/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9463,14 +9463,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUGIA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front.4bpp.smol"); const u16 gMonPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/normal.gbapal"); - const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.lz"); + const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.smol"); const u16 gMonShinyPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/shiny.gbapal"); #else - const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/normal_gba.gbapal"); - const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lugia[] = INCBIN_U16("graphics/pokemon/lugia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9492,14 +9492,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_HO_OH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front.4bpp.smol"); const u16 gMonPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/normal.gbapal"); - const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.lz"); + const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.smol"); const u16 gMonShinyPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/shiny.gbapal"); #else - const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/anim_front_gba.4bpp.smol"); const u16 gMonPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/normal_gba.gbapal"); - const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back_gba.4bpp.lz"); + const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back_gba.4bpp.smol"); const u16 gMonShinyPalette_HoOh[] = INCBIN_U16("graphics/pokemon/ho_oh/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9521,14 +9521,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CELEBI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front.4bpp.smol"); const u16 gMonPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/normal.gbapal"); - const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.lz"); + const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.smol"); const u16 gMonShinyPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/shiny.gbapal"); #else - const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/normal_gba.gbapal"); - const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Celebi[] = INCBIN_U16("graphics/pokemon/celebi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9550,14 +9550,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TREECKO #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front.4bpp.smol"); const u16 gMonPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/normal.gbapal"); - const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.lz"); + const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.smol"); const u16 gMonShinyPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/shiny.gbapal"); #else - const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/normal_gba.gbapal"); - const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back_gba.4bpp.lz"); + const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Treecko[] = INCBIN_U16("graphics/pokemon/treecko/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9577,14 +9577,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front.4bpp.smol"); const u16 gMonPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/normal.gbapal"); - const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.lz"); + const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.smol"); const u16 gMonShinyPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/shiny.gbapal"); #else - const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/normal_gba.gbapal"); - const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grovyle[] = INCBIN_U16("graphics/pokemon/grovyle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9604,14 +9604,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front.4bpp.smol"); const u16 gMonPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/normal.gbapal"); - const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.lz"); + const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.smol"); const u16 gMonShinyPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/shiny.gbapal"); #else - const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/normal_gba.gbapal"); - const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sceptile[] = INCBIN_U16("graphics/pokemon/sceptile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9631,9 +9631,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/front.4bpp.smol"); const u16 gMonPalette_SceptileMega[] = INCBIN_U16("graphics/pokemon/sceptile/mega/normal.gbapal"); - const u32 gMonBackPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/back.4bpp.lz"); + const u32 gMonBackPic_SceptileMega[] = INCBIN_U32("graphics/pokemon/sceptile/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SceptileMega[] = INCBIN_U16("graphics/pokemon/sceptile/mega/shiny.gbapal"); const u8 gMonIcon_SceptileMega[] = INCBIN_U8("graphics/pokemon/sceptile/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9648,14 +9648,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TORCHIC #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front.4bpp.smol"); const u16 gMonPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/normal.gbapal"); - const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.lz"); + const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.smol"); const u16 gMonShinyPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/shiny.gbapal"); #else - const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/normal_gba.gbapal"); - const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Torchic[] = INCBIN_U16("graphics/pokemon/torchic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9675,21 +9675,21 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_TorchicF[] = INCBIN_U32("graphics/pokemon/torchic/backf.4bpp.lz"); + const u32 gMonBackPic_TorchicF[] = INCBIN_U32("graphics/pokemon/torchic/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_TorchicF[] = INCBIN_COMP("graphics/pokemon/torchic/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front.4bpp.smol"); const u16 gMonPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/normal.gbapal"); - const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.lz"); + const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.smol"); const u16 gMonShinyPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/shiny.gbapal"); #else - const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/normal_gba.gbapal"); - const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back_gba.4bpp.lz"); + const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Combusken[] = INCBIN_U16("graphics/pokemon/combusken/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9709,22 +9709,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/backf.4bpp.lz"); + const u32 gMonFrontPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CombuskenF[] = INCBIN_U32("graphics/pokemon/combusken/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CombuskenF[] = INCBIN_COMP("graphics/pokemon/combusken/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front.4bpp.smol"); const u16 gMonPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/normal.gbapal"); - const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.lz"); + const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.smol"); const u16 gMonShinyPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/shiny.gbapal"); #else - const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/normal_gba.gbapal"); - const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back_gba.4bpp.lz"); + const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Blaziken[] = INCBIN_U16("graphics/pokemon/blaziken/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9744,17 +9744,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/backf.4bpp.lz"); + const u32 gMonFrontPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BlazikenF[] = INCBIN_U32("graphics/pokemon/blaziken/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BlazikenF[] = INCBIN_COMP("graphics/pokemon/blaziken/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/front.4bpp.smol"); const u16 gMonPalette_BlazikenMega[] = INCBIN_U16("graphics/pokemon/blaziken/mega/normal.gbapal"); - const u32 gMonBackPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/back.4bpp.lz"); + const u32 gMonBackPic_BlazikenMega[] = INCBIN_U32("graphics/pokemon/blaziken/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BlazikenMega[] = INCBIN_U16("graphics/pokemon/blaziken/mega/shiny.gbapal"); const u8 gMonIcon_BlazikenMega[] = INCBIN_U8("graphics/pokemon/blaziken/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9769,14 +9769,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MUDKIP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front.4bpp.smol"); const u16 gMonPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/normal.gbapal"); - const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.lz"); + const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.smol"); const u16 gMonShinyPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/shiny.gbapal"); #else - const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/normal_gba.gbapal"); - const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mudkip[] = INCBIN_U16("graphics/pokemon/mudkip/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9796,14 +9796,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front.4bpp.smol"); const u16 gMonPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/normal.gbapal"); - const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.lz"); + const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.smol"); const u16 gMonShinyPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/shiny.gbapal"); #else - const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/normal_gba.gbapal"); - const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back_gba.4bpp.lz"); + const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Marshtomp[] = INCBIN_U16("graphics/pokemon/marshtomp/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9823,14 +9823,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front.4bpp.smol"); const u16 gMonPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/normal.gbapal"); - const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.lz"); + const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.smol"); const u16 gMonShinyPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/shiny.gbapal"); #else - const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/normal_gba.gbapal"); - const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swampert[] = INCBIN_U16("graphics/pokemon/swampert/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9850,9 +9850,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/front.4bpp.smol"); const u16 gMonPalette_SwampertMega[] = INCBIN_U16("graphics/pokemon/swampert/mega/normal.gbapal"); - const u32 gMonBackPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/back.4bpp.lz"); + const u32 gMonBackPic_SwampertMega[] = INCBIN_U32("graphics/pokemon/swampert/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SwampertMega[] = INCBIN_U16("graphics/pokemon/swampert/mega/shiny.gbapal"); const u8 gMonIcon_SwampertMega[] = INCBIN_U8("graphics/pokemon/swampert/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -9867,14 +9867,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_POOCHYENA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front.4bpp.smol"); const u16 gMonPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/normal.gbapal"); - const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.lz"); + const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.smol"); const u16 gMonShinyPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/shiny.gbapal"); #else - const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/normal_gba.gbapal"); - const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back_gba.4bpp.lz"); + const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Poochyena[] = INCBIN_U16("graphics/pokemon/poochyena/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9894,14 +9894,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front.4bpp.smol"); const u16 gMonPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/normal.gbapal"); - const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.lz"); + const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.smol"); const u16 gMonShinyPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/shiny.gbapal"); #else - const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/normal_gba.gbapal"); - const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mightyena[] = INCBIN_U16("graphics/pokemon/mightyena/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9923,14 +9923,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZIGZAGOON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front.4bpp.smol"); const u16 gMonPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/normal.gbapal"); - const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.lz"); + const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.smol"); const u16 gMonShinyPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/normal_gba.gbapal"); - const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zigzagoon[] = INCBIN_U16("graphics/pokemon/zigzagoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9950,14 +9950,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front.4bpp.smol"); const u16 gMonPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/normal.gbapal"); - const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.lz"); + const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.smol"); const u16 gMonShinyPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/shiny.gbapal"); #else - const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/normal_gba.gbapal"); - const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Linoone[] = INCBIN_U16("graphics/pokemon/linoone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -9977,9 +9977,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/front.4bpp.lz"); + const u32 gMonFrontPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/front.4bpp.smol"); const u16 gMonPalette_ZigzagoonGalar[] = INCBIN_U16("graphics/pokemon/zigzagoon/galar/normal.gbapal"); - const u32 gMonBackPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/back.4bpp.lz"); + const u32 gMonBackPic_ZigzagoonGalar[] = INCBIN_U32("graphics/pokemon/zigzagoon/galar/back.4bpp.smol"); const u16 gMonShinyPalette_ZigzagoonGalar[] = INCBIN_U16("graphics/pokemon/zigzagoon/galar/shiny.gbapal"); const u8 gMonIcon_ZigzagoonGalar[] = INCBIN_U8("graphics/pokemon/zigzagoon/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -9990,9 +9990,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/front.4bpp.lz"); + const u32 gMonFrontPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/front.4bpp.smol"); const u16 gMonPalette_LinooneGalar[] = INCBIN_U16("graphics/pokemon/linoone/galar/normal.gbapal"); - const u32 gMonBackPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/back.4bpp.lz"); + const u32 gMonBackPic_LinooneGalar[] = INCBIN_U32("graphics/pokemon/linoone/galar/back.4bpp.smol"); const u16 gMonShinyPalette_LinooneGalar[] = INCBIN_U16("graphics/pokemon/linoone/galar/shiny.gbapal"); const u8 gMonIcon_LinooneGalar[] = INCBIN_U8("graphics/pokemon/linoone/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -10003,9 +10003,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/front.4bpp.lz"); + const u32 gMonFrontPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/front.4bpp.smol"); const u16 gMonPalette_Obstagoon[] = INCBIN_U16("graphics/pokemon/obstagoon/normal.gbapal"); - const u32 gMonBackPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/back.4bpp.lz"); + const u32 gMonBackPic_Obstagoon[] = INCBIN_U32("graphics/pokemon/obstagoon/back.4bpp.smol"); const u16 gMonShinyPalette_Obstagoon[] = INCBIN_U16("graphics/pokemon/obstagoon/shiny.gbapal"); const u8 gMonIcon_Obstagoon[] = INCBIN_U8("graphics/pokemon/obstagoon/icon.4bpp"); #if P_FOOTPRINTS @@ -10023,14 +10023,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WURMPLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front.4bpp.smol"); const u16 gMonPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/normal.gbapal"); - const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.lz"); + const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.smol"); const u16 gMonShinyPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/shiny.gbapal"); #else - const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/normal_gba.gbapal"); - const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wurmple[] = INCBIN_U16("graphics/pokemon/wurmple/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10050,14 +10050,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front.4bpp.smol"); const u16 gMonPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/normal.gbapal"); - const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.lz"); + const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.smol"); const u16 gMonShinyPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/normal_gba.gbapal"); - const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Silcoon[] = INCBIN_U16("graphics/pokemon/silcoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10077,14 +10077,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front.4bpp.smol"); const u16 gMonPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/normal.gbapal"); - const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.lz"); + const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.smol"); const u16 gMonShinyPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/shiny.gbapal"); #else - const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/normal_gba.gbapal"); - const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beautifly[] = INCBIN_U16("graphics/pokemon/beautifly/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10104,22 +10104,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/backf.4bpp.lz"); + const u32 gMonFrontPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BeautiflyF[] = INCBIN_U32("graphics/pokemon/beautifly/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BeautiflyF[] = INCBIN_COMP("graphics/pokemon/beautifly/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front.4bpp.smol"); const u16 gMonPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/normal.gbapal"); - const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.lz"); + const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.smol"); const u16 gMonShinyPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/shiny.gbapal"); #else - const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/normal_gba.gbapal"); - const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cascoon[] = INCBIN_U16("graphics/pokemon/cascoon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10139,14 +10139,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front.4bpp.smol"); const u16 gMonPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/normal.gbapal"); - const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.lz"); + const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.smol"); const u16 gMonShinyPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/shiny.gbapal"); #else - const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/normal_gba.gbapal"); - const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dustox[] = INCBIN_U16("graphics/pokemon/dustox/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10166,8 +10166,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/backf.4bpp.lz"); + const u32 gMonFrontPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_DustoxF[] = INCBIN_U32("graphics/pokemon/dustox/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_DustoxF[] = INCBIN_COMP("graphics/pokemon/dustox/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10176,14 +10176,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LOTAD #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front.4bpp.smol"); const u16 gMonPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/normal.gbapal"); - const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.lz"); + const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.smol"); const u16 gMonShinyPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/shiny.gbapal"); #else - const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/normal_gba.gbapal"); - const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lotad[] = INCBIN_U16("graphics/pokemon/lotad/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10203,14 +10203,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front.4bpp.smol"); const u16 gMonPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/normal.gbapal"); - const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.lz"); + const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.smol"); const u16 gMonShinyPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/shiny.gbapal"); #else - const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/normal_gba.gbapal"); - const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lombre[] = INCBIN_U16("graphics/pokemon/lombre/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10230,14 +10230,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front.4bpp.smol"); const u16 gMonPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/normal.gbapal"); - const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.lz"); + const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.smol"); const u16 gMonShinyPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/shiny.gbapal"); #else - const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/normal_gba.gbapal"); - const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ludicolo[] = INCBIN_U16("graphics/pokemon/ludicolo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10261,8 +10261,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/backf.4bpp.lz"); + const u32 gMonFrontPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LudicoloF[] = INCBIN_U32("graphics/pokemon/ludicolo/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LudicoloF[] = INCBIN_COMP("graphics/pokemon/ludicolo/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10271,14 +10271,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEEDOT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front.4bpp.smol"); const u16 gMonPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/normal.gbapal"); - const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.lz"); + const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.smol"); const u16 gMonShinyPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/shiny.gbapal"); #else - const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/normal_gba.gbapal"); - const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seedot[] = INCBIN_U16("graphics/pokemon/seedot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10298,14 +10298,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front.4bpp.smol"); const u16 gMonPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/normal.gbapal"); - const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.lz"); + const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.smol"); const u16 gMonShinyPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/shiny.gbapal"); #else - const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/normal_gba.gbapal"); - const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nuzleaf[] = INCBIN_U16("graphics/pokemon/nuzleaf/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10325,22 +10325,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/backf.4bpp.lz"); + const u32 gMonFrontPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_NuzleafF[] = INCBIN_U32("graphics/pokemon/nuzleaf/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_NuzleafF[] = INCBIN_COMP("graphics/pokemon/nuzleaf/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front.4bpp.smol"); const u16 gMonPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/normal.gbapal"); - const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.lz"); + const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.smol"); const u16 gMonShinyPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/shiny.gbapal"); #else - const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/normal_gba.gbapal"); - const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shiftry[] = INCBIN_U16("graphics/pokemon/shiftry/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10360,8 +10360,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/backf.4bpp.lz"); + const u32 gMonFrontPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ShiftryF[] = INCBIN_U32("graphics/pokemon/shiftry/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ShiftryF[] = INCBIN_COMP("graphics/pokemon/shiftry/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -10370,14 +10370,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TAILLOW #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front.4bpp.smol"); const u16 gMonPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/normal.gbapal"); - const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.lz"); + const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.smol"); const u16 gMonShinyPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/shiny.gbapal"); #else - const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/normal_gba.gbapal"); - const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Taillow[] = INCBIN_U16("graphics/pokemon/taillow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10397,14 +10397,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front.4bpp.smol"); const u16 gMonPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/normal.gbapal"); - const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.lz"); + const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.smol"); const u16 gMonShinyPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/shiny.gbapal"); #else - const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/normal_gba.gbapal"); - const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swellow[] = INCBIN_U16("graphics/pokemon/swellow/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10426,14 +10426,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WINGULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front.4bpp.smol"); const u16 gMonPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/normal.gbapal"); - const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.lz"); + const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.smol"); const u16 gMonShinyPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/shiny.gbapal"); #else - const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/normal_gba.gbapal"); - const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wingull[] = INCBIN_U16("graphics/pokemon/wingull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10453,14 +10453,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front.4bpp.smol"); const u16 gMonPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/normal.gbapal"); - const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.lz"); + const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.smol"); const u16 gMonShinyPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/shiny.gbapal"); #else - const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/normal_gba.gbapal"); - const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Pelipper[] = INCBIN_U16("graphics/pokemon/pelipper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10482,14 +10482,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RALTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front.4bpp.smol"); const u16 gMonPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/normal.gbapal"); - const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.lz"); + const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.smol"); const u16 gMonShinyPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/shiny.gbapal"); #else - const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/normal_gba.gbapal"); - const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ralts[] = INCBIN_U16("graphics/pokemon/ralts/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10509,14 +10509,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front.4bpp.smol"); const u16 gMonPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/normal.gbapal"); - const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.lz"); + const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.smol"); const u16 gMonShinyPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/shiny.gbapal"); #else - const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/normal_gba.gbapal"); - const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kirlia[] = INCBIN_U16("graphics/pokemon/kirlia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10536,14 +10536,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front.4bpp.smol"); const u16 gMonPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/normal.gbapal"); - const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.lz"); + const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.smol"); const u16 gMonShinyPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/shiny.gbapal"); #else - const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/normal_gba.gbapal"); - const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gardevoir[] = INCBIN_U16("graphics/pokemon/gardevoir/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10563,9 +10563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/front.4bpp.smol"); const u16 gMonPalette_GardevoirMega[] = INCBIN_U16("graphics/pokemon/gardevoir/mega/normal.gbapal"); - const u32 gMonBackPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/back.4bpp.lz"); + const u32 gMonBackPic_GardevoirMega[] = INCBIN_U32("graphics/pokemon/gardevoir/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GardevoirMega[] = INCBIN_U16("graphics/pokemon/gardevoir/mega/shiny.gbapal"); const u8 gMonIcon_GardevoirMega[] = INCBIN_U8("graphics/pokemon/gardevoir/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -10578,9 +10578,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/anim_front.4bpp.smol"); const u16 gMonPalette_Gallade[] = INCBIN_U16("graphics/pokemon/gallade/normal.gbapal"); - const u32 gMonBackPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/back.4bpp.lz"); + const u32 gMonBackPic_Gallade[] = INCBIN_U32("graphics/pokemon/gallade/back.4bpp.smol"); const u16 gMonShinyPalette_Gallade[] = INCBIN_U16("graphics/pokemon/gallade/shiny.gbapal"); const u8 gMonIcon_Gallade[] = INCBIN_U8("graphics/pokemon/gallade/icon.4bpp"); #if P_FOOTPRINTS @@ -10595,9 +10595,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/front.4bpp.smol"); const u16 gMonPalette_GalladeMega[] = INCBIN_U16("graphics/pokemon/gallade/mega/normal.gbapal"); - const u32 gMonBackPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/back.4bpp.lz"); + const u32 gMonBackPic_GalladeMega[] = INCBIN_U32("graphics/pokemon/gallade/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GalladeMega[] = INCBIN_U16("graphics/pokemon/gallade/mega/shiny.gbapal"); const u8 gMonIcon_GalladeMega[] = INCBIN_U8("graphics/pokemon/gallade/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -10613,14 +10613,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SURSKIT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front.4bpp.smol"); const u16 gMonPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/normal.gbapal"); - const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.lz"); + const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.smol"); const u16 gMonShinyPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/shiny.gbapal"); #else - const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/normal_gba.gbapal"); - const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back_gba.4bpp.lz"); + const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Surskit[] = INCBIN_U16("graphics/pokemon/surskit/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10640,14 +10640,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front.4bpp.smol"); const u16 gMonPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/normal.gbapal"); - const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.lz"); + const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.smol"); const u16 gMonShinyPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/shiny.gbapal"); #else - const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/normal_gba.gbapal"); - const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back_gba.4bpp.lz"); + const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Masquerain[] = INCBIN_U16("graphics/pokemon/masquerain/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10669,14 +10669,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHROOMISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front.4bpp.smol"); const u16 gMonPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/normal.gbapal"); - const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.lz"); + const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.smol"); const u16 gMonShinyPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/shiny.gbapal"); #else - const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/normal_gba.gbapal"); - const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shroomish[] = INCBIN_U16("graphics/pokemon/shroomish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10700,14 +10700,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front.4bpp.smol"); const u16 gMonPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/normal.gbapal"); - const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.lz"); + const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.smol"); const u16 gMonShinyPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/shiny.gbapal"); #else - const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/normal_gba.gbapal"); - const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back_gba.4bpp.lz"); + const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Breloom[] = INCBIN_U16("graphics/pokemon/breloom/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10729,14 +10729,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SLAKOTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front.4bpp.smol"); const u16 gMonPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/normal.gbapal"); - const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.lz"); + const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.smol"); const u16 gMonShinyPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/shiny.gbapal"); #else - const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/normal_gba.gbapal"); - const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slakoth[] = INCBIN_U16("graphics/pokemon/slakoth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10756,14 +10756,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front.4bpp.smol"); const u16 gMonPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/normal.gbapal"); - const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.lz"); + const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.smol"); const u16 gMonShinyPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/shiny.gbapal"); #else - const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/normal_gba.gbapal"); - const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vigoroth[] = INCBIN_U16("graphics/pokemon/vigoroth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10783,14 +10783,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front.4bpp.smol"); const u16 gMonPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/normal.gbapal"); - const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.lz"); + const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.smol"); const u16 gMonShinyPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/shiny.gbapal"); #else - const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/normal_gba.gbapal"); - const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back_gba.4bpp.lz"); + const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Slaking[] = INCBIN_U16("graphics/pokemon/slaking/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10812,14 +10812,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NINCADA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front.4bpp.smol"); const u16 gMonPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/normal.gbapal"); - const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.lz"); + const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.smol"); const u16 gMonShinyPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/shiny.gbapal"); #else - const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/normal_gba.gbapal"); - const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nincada[] = INCBIN_U16("graphics/pokemon/nincada/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10839,14 +10839,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front.4bpp.smol"); const u16 gMonPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/normal.gbapal"); - const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.lz"); + const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.smol"); const u16 gMonShinyPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/shiny.gbapal"); #else - const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/normal_gba.gbapal"); - const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back_gba.4bpp.lz"); + const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Ninjask[] = INCBIN_U16("graphics/pokemon/ninjask/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10866,14 +10866,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front.4bpp.smol"); const u16 gMonPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/normal.gbapal"); - const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.lz"); + const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.smol"); const u16 gMonShinyPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/shiny.gbapal"); #else - const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/normal_gba.gbapal"); - const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shedinja[] = INCBIN_U16("graphics/pokemon/shedinja/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10895,14 +10895,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WHISMUR #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front.4bpp.smol"); const u16 gMonPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/normal.gbapal"); - const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.lz"); + const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.smol"); const u16 gMonShinyPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/shiny.gbapal"); #else - const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/normal_gba.gbapal"); - const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back_gba.4bpp.lz"); + const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Whismur[] = INCBIN_U16("graphics/pokemon/whismur/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10922,14 +10922,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front.4bpp.smol"); const u16 gMonPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/normal.gbapal"); - const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.lz"); + const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.smol"); const u16 gMonShinyPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/shiny.gbapal"); #else - const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/normal_gba.gbapal"); - const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back_gba.4bpp.lz"); + const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Loudred[] = INCBIN_U16("graphics/pokemon/loudred/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10949,14 +10949,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front.4bpp.smol"); const u16 gMonPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/normal.gbapal"); - const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.lz"); + const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.smol"); const u16 gMonShinyPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/shiny.gbapal"); #else - const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/normal_gba.gbapal"); - const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back_gba.4bpp.lz"); + const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Exploud[] = INCBIN_U16("graphics/pokemon/exploud/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -10978,14 +10978,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAKUHITA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front.4bpp.smol"); const u16 gMonPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/normal.gbapal"); - const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.lz"); + const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.smol"); const u16 gMonShinyPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/shiny.gbapal"); #else - const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/normal_gba.gbapal"); - const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back_gba.4bpp.lz"); + const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Makuhita[] = INCBIN_U16("graphics/pokemon/makuhita/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11005,14 +11005,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front.4bpp.smol"); const u16 gMonPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/normal.gbapal"); - const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.lz"); + const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.smol"); const u16 gMonShinyPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/shiny.gbapal"); #else - const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/normal_gba.gbapal"); - const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back_gba.4bpp.lz"); + const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Hariyama[] = INCBIN_U16("graphics/pokemon/hariyama/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11034,14 +11034,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NOSEPASS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front.4bpp.smol"); const u16 gMonPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/normal.gbapal"); - const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.lz"); + const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.smol"); const u16 gMonShinyPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/shiny.gbapal"); #else - const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/normal_gba.gbapal"); - const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back_gba.4bpp.lz"); + const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Nosepass[] = INCBIN_U16("graphics/pokemon/nosepass/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11061,9 +11061,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/anim_front.4bpp.smol"); const u16 gMonPalette_Probopass[] = INCBIN_U16("graphics/pokemon/probopass/normal.gbapal"); - const u32 gMonBackPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/back.4bpp.lz"); + const u32 gMonBackPic_Probopass[] = INCBIN_U32("graphics/pokemon/probopass/back.4bpp.smol"); const u16 gMonShinyPalette_Probopass[] = INCBIN_U16("graphics/pokemon/probopass/shiny.gbapal"); const u8 gMonIcon_Probopass[] = INCBIN_U8("graphics/pokemon/probopass/icon.4bpp"); #if P_FOOTPRINTS @@ -11081,14 +11081,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SKITTY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front.4bpp.smol"); const u16 gMonPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/normal.gbapal"); - const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.lz"); + const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.smol"); const u16 gMonShinyPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/shiny.gbapal"); #else - const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/normal_gba.gbapal"); - const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back_gba.4bpp.lz"); + const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Skitty[] = INCBIN_U16("graphics/pokemon/skitty/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11108,14 +11108,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front.4bpp.smol"); const u16 gMonPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/normal.gbapal"); - const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.lz"); + const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.smol"); const u16 gMonShinyPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/shiny.gbapal"); #else - const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/normal_gba.gbapal"); - const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back_gba.4bpp.lz"); + const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Delcatty[] = INCBIN_U16("graphics/pokemon/delcatty/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11137,14 +11137,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SABLEYE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front.4bpp.smol"); const u16 gMonPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/normal.gbapal"); - const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.lz"); + const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.smol"); const u16 gMonShinyPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/shiny.gbapal"); #else - const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/normal_gba.gbapal"); - const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sableye[] = INCBIN_U16("graphics/pokemon/sableye/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11164,9 +11164,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/front.4bpp.smol"); const u16 gMonPalette_SableyeMega[] = INCBIN_U16("graphics/pokemon/sableye/mega/normal.gbapal"); - const u32 gMonBackPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/back.4bpp.lz"); + const u32 gMonBackPic_SableyeMega[] = INCBIN_U32("graphics/pokemon/sableye/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SableyeMega[] = INCBIN_U16("graphics/pokemon/sableye/mega/shiny.gbapal"); const u8 gMonIcon_SableyeMega[] = INCBIN_U8("graphics/pokemon/sableye/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11181,14 +11181,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MAWILE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front.4bpp.smol"); const u16 gMonPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/normal.gbapal"); - const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.lz"); + const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.smol"); const u16 gMonShinyPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/shiny.gbapal"); #else - const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/normal_gba.gbapal"); - const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back_gba.4bpp.lz"); + const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Mawile[] = INCBIN_U16("graphics/pokemon/mawile/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11212,9 +11212,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/front.4bpp.smol"); const u16 gMonPalette_MawileMega[] = INCBIN_U16("graphics/pokemon/mawile/mega/normal.gbapal"); - const u32 gMonBackPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/back.4bpp.lz"); + const u32 gMonBackPic_MawileMega[] = INCBIN_U32("graphics/pokemon/mawile/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MawileMega[] = INCBIN_U16("graphics/pokemon/mawile/mega/shiny.gbapal"); const u8 gMonIcon_MawileMega[] = INCBIN_U8("graphics/pokemon/mawile/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11229,14 +11229,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ARON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front.4bpp.smol"); const u16 gMonPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/normal.gbapal"); - const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.lz"); + const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.smol"); const u16 gMonShinyPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/shiny.gbapal"); #else - const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/normal_gba.gbapal"); - const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aron[] = INCBIN_U16("graphics/pokemon/aron/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11256,14 +11256,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front.4bpp.smol"); const u16 gMonPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/normal.gbapal"); - const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.lz"); + const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.smol"); const u16 gMonShinyPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/shiny.gbapal"); #else - const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/normal_gba.gbapal"); - const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lairon[] = INCBIN_U16("graphics/pokemon/lairon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11283,14 +11283,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front.4bpp.smol"); const u16 gMonPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/normal.gbapal"); - const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.lz"); + const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.smol"); const u16 gMonShinyPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/shiny.gbapal"); #else - const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/normal_gba.gbapal"); - const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back_gba.4bpp.lz"); + const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Aggron[] = INCBIN_U16("graphics/pokemon/aggron/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11310,9 +11310,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/front.4bpp.smol"); const u16 gMonPalette_AggronMega[] = INCBIN_U16("graphics/pokemon/aggron/mega/normal.gbapal"); - const u32 gMonBackPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/back.4bpp.lz"); + const u32 gMonBackPic_AggronMega[] = INCBIN_U32("graphics/pokemon/aggron/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AggronMega[] = INCBIN_U16("graphics/pokemon/aggron/mega/shiny.gbapal"); const u8 gMonIcon_AggronMega[] = INCBIN_U8("graphics/pokemon/aggron/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11327,14 +11327,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MEDITITE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front.4bpp.smol"); const u16 gMonPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/normal.gbapal"); - const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.lz"); + const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.smol"); const u16 gMonShinyPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/shiny.gbapal"); #else - const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/normal_gba.gbapal"); - const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back_gba.4bpp.lz"); + const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Meditite[] = INCBIN_U16("graphics/pokemon/meditite/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11354,22 +11354,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/backf.4bpp.lz"); + const u32 gMonFrontPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MedititeF[] = INCBIN_U32("graphics/pokemon/meditite/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MedititeF[] = INCBIN_COMP("graphics/pokemon/meditite/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front.4bpp.smol"); const u16 gMonPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/normal.gbapal"); - const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.lz"); + const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.smol"); const u16 gMonShinyPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/shiny.gbapal"); #else - const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/normal_gba.gbapal"); - const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back_gba.4bpp.lz"); + const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Medicham[] = INCBIN_U16("graphics/pokemon/medicham/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11389,17 +11389,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/backf.4bpp.lz"); + const u32 gMonFrontPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MedichamF[] = INCBIN_U32("graphics/pokemon/medicham/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MedichamF[] = INCBIN_COMP("graphics/pokemon/medicham/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/front.4bpp.smol"); const u16 gMonPalette_MedichamMega[] = INCBIN_U16("graphics/pokemon/medicham/mega/normal.gbapal"); - const u32 gMonBackPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/back.4bpp.lz"); + const u32 gMonBackPic_MedichamMega[] = INCBIN_U32("graphics/pokemon/medicham/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MedichamMega[] = INCBIN_U16("graphics/pokemon/medicham/mega/shiny.gbapal"); const u8 gMonIcon_MedichamMega[] = INCBIN_U8("graphics/pokemon/medicham/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11414,14 +11414,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ELECTRIKE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front.4bpp.smol"); const u16 gMonPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/normal.gbapal"); - const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.lz"); + const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.smol"); const u16 gMonShinyPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/shiny.gbapal"); #else - const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/normal_gba.gbapal"); - const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back_gba.4bpp.lz"); + const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Electrike[] = INCBIN_U16("graphics/pokemon/electrike/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11441,14 +11441,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front.4bpp.smol"); const u16 gMonPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/normal.gbapal"); - const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.lz"); + const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.smol"); const u16 gMonShinyPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/shiny.gbapal"); #else - const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/normal_gba.gbapal"); - const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back_gba.4bpp.lz"); + const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Manectric[] = INCBIN_U16("graphics/pokemon/manectric/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11468,9 +11468,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/front.4bpp.lz"); + const u32 gMonFrontPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/front.4bpp.smol"); const u16 gMonPalette_ManectricMega[] = INCBIN_U16("graphics/pokemon/manectric/mega/normal.gbapal"); - const u32 gMonBackPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/back.4bpp.lz"); + const u32 gMonBackPic_ManectricMega[] = INCBIN_U32("graphics/pokemon/manectric/mega/back.4bpp.smol"); const u16 gMonShinyPalette_ManectricMega[] = INCBIN_U16("graphics/pokemon/manectric/mega/shiny.gbapal"); const u8 gMonIcon_ManectricMega[] = INCBIN_U8("graphics/pokemon/manectric/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11485,14 +11485,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_PLUSLE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front.4bpp.smol"); const u16 gMonPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/normal.gbapal"); - const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.lz"); + const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.smol"); const u16 gMonShinyPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/shiny.gbapal"); #else - const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/normal_gba.gbapal"); - const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back_gba.4bpp.lz"); + const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Plusle[] = INCBIN_U16("graphics/pokemon/plusle/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11514,14 +11514,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_MINUN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front.4bpp.smol"); const u16 gMonPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/normal.gbapal"); - const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.lz"); + const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.smol"); const u16 gMonShinyPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/shiny.gbapal"); #else - const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/normal_gba.gbapal"); - const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back_gba.4bpp.lz"); + const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Minun[] = INCBIN_U16("graphics/pokemon/minun/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11543,14 +11543,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_VOLBEAT_ILLUMISE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front.4bpp.smol"); const u16 gMonPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/normal.gbapal"); - const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.lz"); + const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.smol"); const u16 gMonShinyPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/shiny.gbapal"); #else - const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/normal_gba.gbapal"); - const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back_gba.4bpp.lz"); + const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Volbeat[] = INCBIN_U16("graphics/pokemon/volbeat/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11570,14 +11570,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front.4bpp.smol"); const u16 gMonPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/normal.gbapal"); - const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.lz"); + const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.smol"); const u16 gMonShinyPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/shiny.gbapal"); #else - const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/normal_gba.gbapal"); - const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back_gba.4bpp.lz"); + const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Illumise[] = INCBIN_U16("graphics/pokemon/illumise/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11599,9 +11599,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ROSELIA #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/anim_front.4bpp.smol"); const u16 gMonPalette_Budew[] = INCBIN_U16("graphics/pokemon/budew/normal.gbapal"); - const u32 gMonBackPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/back.4bpp.lz"); + const u32 gMonBackPic_Budew[] = INCBIN_U32("graphics/pokemon/budew/back.4bpp.smol"); const u16 gMonShinyPalette_Budew[] = INCBIN_U16("graphics/pokemon/budew/shiny.gbapal"); const u8 gMonIcon_Budew[] = INCBIN_U8("graphics/pokemon/budew/icon.4bpp"); #if P_FOOTPRINTS @@ -11617,14 +11617,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front.4bpp.smol"); const u16 gMonPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/normal.gbapal"); - const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.lz"); + const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.smol"); const u16 gMonShinyPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/shiny.gbapal"); #else - const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/normal_gba.gbapal"); - const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back_gba.4bpp.lz"); + const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Roselia[] = INCBIN_U16("graphics/pokemon/roselia/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11644,17 +11644,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/backf.4bpp.lz"); + const u32 gMonFrontPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RoseliaF[] = INCBIN_U32("graphics/pokemon/roselia/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RoseliaF[] = INCBIN_COMP("graphics/pokemon/roselia/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/anim_front.4bpp.smol"); const u16 gMonPalette_Roserade[] = INCBIN_U16("graphics/pokemon/roserade/normal.gbapal"); - const u32 gMonBackPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/back.4bpp.lz"); + const u32 gMonBackPic_Roserade[] = INCBIN_U32("graphics/pokemon/roserade/back.4bpp.smol"); const u16 gMonShinyPalette_Roserade[] = INCBIN_U16("graphics/pokemon/roserade/shiny.gbapal"); const u8 gMonIcon_Roserade[] = INCBIN_U8("graphics/pokemon/roserade/icon.4bpp"); #if P_FOOTPRINTS @@ -11669,8 +11669,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/backf.4bpp.lz"); + const u32 gMonFrontPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RoseradeF[] = INCBIN_U32("graphics/pokemon/roserade/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RoseradeF[] = INCBIN_COMP("graphics/pokemon/roserade/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -11680,14 +11680,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GULPIN #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front.4bpp.smol"); const u16 gMonPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/normal.gbapal"); - const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.lz"); + const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.smol"); const u16 gMonShinyPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/shiny.gbapal"); #else - const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/normal_gba.gbapal"); - const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gulpin[] = INCBIN_U16("graphics/pokemon/gulpin/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11707,22 +11707,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/backf.4bpp.lz"); + const u32 gMonFrontPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GulpinF[] = INCBIN_U32("graphics/pokemon/gulpin/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GulpinF[] = INCBIN_COMP("graphics/pokemon/gulpin/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front.4bpp.smol"); const u16 gMonPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/normal.gbapal"); - const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.lz"); + const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.smol"); const u16 gMonShinyPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/shiny.gbapal"); #else - const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/normal_gba.gbapal"); - const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swalot[] = INCBIN_U16("graphics/pokemon/swalot/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11742,8 +11742,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/backf.4bpp.lz"); + const u32 gMonFrontPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SwalotF[] = INCBIN_U32("graphics/pokemon/swalot/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SwalotF[] = INCBIN_COMP("graphics/pokemon/swalot/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -11752,14 +11752,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CARVANHA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front.4bpp.smol"); const u16 gMonPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/normal.gbapal"); - const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.lz"); + const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.smol"); const u16 gMonShinyPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/shiny.gbapal"); #else - const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/normal_gba.gbapal"); - const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back_gba.4bpp.lz"); + const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Carvanha[] = INCBIN_U16("graphics/pokemon/carvanha/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11779,14 +11779,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front.4bpp.smol"); const u16 gMonPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/normal.gbapal"); - const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.lz"); + const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.smol"); const u16 gMonShinyPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/normal_gba.gbapal"); - const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sharpedo[] = INCBIN_U16("graphics/pokemon/sharpedo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11806,9 +11806,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/front.4bpp.smol"); const u16 gMonPalette_SharpedoMega[] = INCBIN_U16("graphics/pokemon/sharpedo/mega/normal.gbapal"); - const u32 gMonBackPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/back.4bpp.lz"); + const u32 gMonBackPic_SharpedoMega[] = INCBIN_U32("graphics/pokemon/sharpedo/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SharpedoMega[] = INCBIN_U16("graphics/pokemon/sharpedo/mega/shiny.gbapal"); const u8 gMonIcon_SharpedoMega[] = INCBIN_U8("graphics/pokemon/sharpedo/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11823,14 +11823,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_WAILMER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front.4bpp.smol"); const u16 gMonPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/normal.gbapal"); - const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.lz"); + const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.smol"); const u16 gMonShinyPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/shiny.gbapal"); #else - const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/normal_gba.gbapal"); - const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wailmer[] = INCBIN_U16("graphics/pokemon/wailmer/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11850,14 +11850,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front.4bpp.smol"); const u16 gMonPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/normal.gbapal"); - const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.lz"); + const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.smol"); const u16 gMonShinyPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/shiny.gbapal"); #else - const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/normal_gba.gbapal"); - const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back_gba.4bpp.lz"); + const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Wailord[] = INCBIN_U16("graphics/pokemon/wailord/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11879,14 +11879,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_NUMEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front.4bpp.smol"); const u16 gMonPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/normal.gbapal"); - const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.lz"); + const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.smol"); const u16 gMonShinyPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/shiny.gbapal"); #else - const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/normal_gba.gbapal"); - const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Numel[] = INCBIN_U16("graphics/pokemon/numel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11906,22 +11906,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/backf.4bpp.lz"); + const u32 gMonFrontPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_NumelF[] = INCBIN_U32("graphics/pokemon/numel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_NumelF[] = INCBIN_COMP("graphics/pokemon/numel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front.4bpp.smol"); const u16 gMonPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/normal.gbapal"); - const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.lz"); + const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.smol"); const u16 gMonShinyPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/shiny.gbapal"); #else - const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/normal_gba.gbapal"); - const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Camerupt[] = INCBIN_U16("graphics/pokemon/camerupt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11941,17 +11941,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/backf.4bpp.lz"); + const u32 gMonFrontPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CameruptF[] = INCBIN_U32("graphics/pokemon/camerupt/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CameruptF[] = INCBIN_COMP("graphics/pokemon/camerupt/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/front.4bpp.lz"); + const u32 gMonFrontPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/front.4bpp.smol"); const u16 gMonPalette_CameruptMega[] = INCBIN_U16("graphics/pokemon/camerupt/mega/normal.gbapal"); - const u32 gMonBackPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/back.4bpp.lz"); + const u32 gMonBackPic_CameruptMega[] = INCBIN_U32("graphics/pokemon/camerupt/mega/back.4bpp.smol"); const u16 gMonShinyPalette_CameruptMega[] = INCBIN_U16("graphics/pokemon/camerupt/mega/shiny.gbapal"); const u8 gMonIcon_CameruptMega[] = INCBIN_U8("graphics/pokemon/camerupt/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -11966,14 +11966,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TORKOAL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front.4bpp.smol"); const u16 gMonPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/normal.gbapal"); - const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.lz"); + const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.smol"); const u16 gMonShinyPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/shiny.gbapal"); #else - const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/normal_gba.gbapal"); - const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back_gba.4bpp.lz"); + const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Torkoal[] = INCBIN_U16("graphics/pokemon/torkoal/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -11995,14 +11995,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPOINK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front.4bpp.smol"); const u16 gMonPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/normal.gbapal"); - const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.lz"); + const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.smol"); const u16 gMonShinyPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/shiny.gbapal"); #else - const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/normal_gba.gbapal"); - const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spoink[] = INCBIN_U16("graphics/pokemon/spoink/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12022,14 +12022,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front.4bpp.smol"); const u16 gMonPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/normal.gbapal"); - const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.lz"); + const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.smol"); const u16 gMonShinyPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/shiny.gbapal"); #else - const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/normal_gba.gbapal"); - const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back_gba.4bpp.lz"); + const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Grumpig[] = INCBIN_U16("graphics/pokemon/grumpig/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12050,9 +12050,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPOINK #if P_FAMILY_SPINDA - const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front.4bpp.smol"); const u16 gMonPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/normal.gbapal"); - const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.lz"); + const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.smol"); const u16 gMonShinyPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/shiny.gbapal"); const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon.4bpp"); #if P_FOOTPRINTS @@ -12069,14 +12069,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TRAPINCH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front.4bpp.smol"); const u16 gMonPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/normal.gbapal"); - const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.lz"); + const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.smol"); const u16 gMonShinyPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/shiny.gbapal"); #else - const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/normal_gba.gbapal"); - const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back_gba.4bpp.lz"); + const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Trapinch[] = INCBIN_U16("graphics/pokemon/trapinch/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12096,14 +12096,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front.4bpp.smol"); const u16 gMonPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/normal.gbapal"); - const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.lz"); + const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.smol"); const u16 gMonShinyPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/shiny.gbapal"); #else - const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/normal_gba.gbapal"); - const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back_gba.4bpp.lz"); + const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Vibrava[] = INCBIN_U16("graphics/pokemon/vibrava/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12123,14 +12123,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front.4bpp.smol"); const u16 gMonPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/normal.gbapal"); - const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.lz"); + const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.smol"); const u16 gMonShinyPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/shiny.gbapal"); #else - const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/normal_gba.gbapal"); - const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Flygon[] = INCBIN_U16("graphics/pokemon/flygon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12152,14 +12152,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CACNEA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front.4bpp.smol"); const u16 gMonPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/normal.gbapal"); - const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.lz"); + const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.smol"); const u16 gMonShinyPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/shiny.gbapal"); #else - const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/normal_gba.gbapal"); - const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cacnea[] = INCBIN_U16("graphics/pokemon/cacnea/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12179,14 +12179,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front.4bpp.smol"); const u16 gMonPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/normal.gbapal"); - const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.lz"); + const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.smol"); const u16 gMonShinyPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/shiny.gbapal"); #else - const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/normal_gba.gbapal"); - const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cacturne[] = INCBIN_U16("graphics/pokemon/cacturne/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12206,7 +12206,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CacturneF[] = INCBIN_U32("graphics/pokemon/cacturne/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_CacturneF[] = INCBIN_U32("graphics/pokemon/cacturne/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CacturneF[] = INCBIN_COMP("graphics/pokemon/cacturne/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -12215,14 +12215,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SWABLU #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front.4bpp.smol"); const u16 gMonPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/normal.gbapal"); - const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.lz"); + const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.smol"); const u16 gMonShinyPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/shiny.gbapal"); #else - const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/normal_gba.gbapal"); - const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back_gba.4bpp.lz"); + const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Swablu[] = INCBIN_U16("graphics/pokemon/swablu/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12242,14 +12242,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front.4bpp.smol"); const u16 gMonPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/normal.gbapal"); - const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.lz"); + const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.smol"); const u16 gMonShinyPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/shiny.gbapal"); #else - const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/normal_gba.gbapal"); - const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back_gba.4bpp.lz"); + const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Altaria[] = INCBIN_U16("graphics/pokemon/altaria/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12269,9 +12269,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/front.4bpp.smol"); const u16 gMonPalette_AltariaMega[] = INCBIN_U16("graphics/pokemon/altaria/mega/normal.gbapal"); - const u32 gMonBackPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/back.4bpp.lz"); + const u32 gMonBackPic_AltariaMega[] = INCBIN_U32("graphics/pokemon/altaria/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AltariaMega[] = INCBIN_U16("graphics/pokemon/altaria/mega/shiny.gbapal"); const u8 gMonIcon_AltariaMega[] = INCBIN_U8("graphics/pokemon/altaria/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -12286,14 +12286,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ZANGOOSE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front.4bpp.smol"); const u16 gMonPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/normal.gbapal"); - const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.lz"); + const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.smol"); const u16 gMonShinyPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/shiny.gbapal"); #else - const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/normal_gba.gbapal"); - const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back_gba.4bpp.lz"); + const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Zangoose[] = INCBIN_U16("graphics/pokemon/zangoose/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12315,14 +12315,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SEVIPER #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front.4bpp.smol"); const u16 gMonPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/normal.gbapal"); - const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.lz"); + const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.smol"); const u16 gMonShinyPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/shiny.gbapal"); #else - const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/normal_gba.gbapal"); - const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back_gba.4bpp.lz"); + const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Seviper[] = INCBIN_U16("graphics/pokemon/seviper/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12344,14 +12344,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUNATONE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front.4bpp.smol"); const u16 gMonPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/normal.gbapal"); - const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.lz"); + const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.smol"); const u16 gMonShinyPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/shiny.gbapal"); #else - const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/normal_gba.gbapal"); - const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lunatone[] = INCBIN_U16("graphics/pokemon/lunatone/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12373,14 +12373,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SOLROCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front.4bpp.smol"); const u16 gMonPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/normal.gbapal"); - const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.lz"); + const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.smol"); const u16 gMonShinyPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/shiny.gbapal"); #else - const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/normal_gba.gbapal"); - const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back_gba.4bpp.lz"); + const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Solrock[] = INCBIN_U16("graphics/pokemon/solrock/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12402,14 +12402,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BARBOACH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front.4bpp.smol"); const u16 gMonPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/normal.gbapal"); - const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.lz"); + const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.smol"); const u16 gMonShinyPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/shiny.gbapal"); #else - const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/normal_gba.gbapal"); - const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back_gba.4bpp.lz"); + const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Barboach[] = INCBIN_U16("graphics/pokemon/barboach/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12429,14 +12429,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front.4bpp.smol"); const u16 gMonPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/normal.gbapal"); - const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.lz"); + const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.smol"); const u16 gMonShinyPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/shiny.gbapal"); #else - const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/normal_gba.gbapal"); - const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back_gba.4bpp.lz"); + const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Whiscash[] = INCBIN_U16("graphics/pokemon/whiscash/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12458,14 +12458,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CORPHISH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front.4bpp.smol"); const u16 gMonPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/normal.gbapal"); - const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.lz"); + const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.smol"); const u16 gMonShinyPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/shiny.gbapal"); #else - const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/normal_gba.gbapal"); - const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back_gba.4bpp.lz"); + const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Corphish[] = INCBIN_U16("graphics/pokemon/corphish/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12485,14 +12485,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front.4bpp.smol"); const u16 gMonPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/normal.gbapal"); - const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.lz"); + const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.smol"); const u16 gMonShinyPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/shiny.gbapal"); #else - const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/normal_gba.gbapal"); - const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Crawdaunt[] = INCBIN_U16("graphics/pokemon/crawdaunt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12514,14 +12514,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BALTOY #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front.4bpp.smol"); const u16 gMonPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/normal.gbapal"); - const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.lz"); + const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.smol"); const u16 gMonShinyPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/shiny.gbapal"); #else - const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/normal_gba.gbapal"); - const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back_gba.4bpp.lz"); + const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Baltoy[] = INCBIN_U16("graphics/pokemon/baltoy/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12541,14 +12541,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front.4bpp.smol"); const u16 gMonPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/normal.gbapal"); - const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.lz"); + const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.smol"); const u16 gMonShinyPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/shiny.gbapal"); #else - const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/normal_gba.gbapal"); - const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back_gba.4bpp.lz"); + const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Claydol[] = INCBIN_U16("graphics/pokemon/claydol/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12570,14 +12570,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LILEEP #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front.4bpp.smol"); const u16 gMonPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/normal.gbapal"); - const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.lz"); + const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.smol"); const u16 gMonShinyPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/shiny.gbapal"); #else - const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/normal_gba.gbapal"); - const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back_gba.4bpp.lz"); + const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Lileep[] = INCBIN_U16("graphics/pokemon/lileep/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12597,14 +12597,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front.4bpp.smol"); const u16 gMonPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/normal.gbapal"); - const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.lz"); + const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.smol"); const u16 gMonShinyPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/shiny.gbapal"); #else - const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/normal_gba.gbapal"); - const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back_gba.4bpp.lz"); + const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Cradily[] = INCBIN_U16("graphics/pokemon/cradily/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12626,14 +12626,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ANORITH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front.4bpp.smol"); const u16 gMonPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/normal.gbapal"); - const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.lz"); + const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.smol"); const u16 gMonShinyPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/shiny.gbapal"); #else - const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/normal_gba.gbapal"); - const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back_gba.4bpp.lz"); + const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Anorith[] = INCBIN_U16("graphics/pokemon/anorith/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12653,14 +12653,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front.4bpp.smol"); const u16 gMonPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/normal.gbapal"); - const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.lz"); + const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.smol"); const u16 gMonShinyPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/shiny.gbapal"); #else - const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/normal_gba.gbapal"); - const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Armaldo[] = INCBIN_U16("graphics/pokemon/armaldo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12682,14 +12682,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_FEEBAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front.4bpp.smol"); const u16 gMonPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/normal.gbapal"); - const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.lz"); + const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.smol"); const u16 gMonShinyPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/shiny.gbapal"); #else - const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/normal_gba.gbapal"); - const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back_gba.4bpp.lz"); + const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Feebas[] = INCBIN_U16("graphics/pokemon/feebas/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12709,14 +12709,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front.4bpp.smol"); const u16 gMonPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/normal.gbapal"); - const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.lz"); + const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.smol"); const u16 gMonShinyPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/shiny.gbapal"); #else - const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/normal_gba.gbapal"); - const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back_gba.4bpp.lz"); + const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Milotic[] = INCBIN_U16("graphics/pokemon/milotic/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12736,8 +12736,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/backf.4bpp.lz"); + const u32 gMonFrontPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_MiloticF[] = INCBIN_U32("graphics/pokemon/milotic/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_MiloticF[] = INCBIN_COMP("graphics/pokemon/milotic/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -12745,30 +12745,30 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FEEBAS #if P_FAMILY_CASTFORM - const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.smol"); const u16 gMonPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/normal.gbapal"); - const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.lz"); + const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.smol"); const u16 gMonShinyPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/shiny.gbapal"); const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/normal.gbapal"); - const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back.4bpp.lz"); + const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/shiny.gbapal"); const u8 gMonIcon_CastformSunny[] = INCBIN_U8("graphics/pokemon/castform/sunny/icon.4bpp"); - const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/normal.gbapal"); - const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back.4bpp.lz"); + const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/shiny.gbapal"); const u8 gMonIcon_CastformRainy[] = INCBIN_U8("graphics/pokemon/castform/rainy/icon.4bpp"); - const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/normal.gbapal"); - const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back.4bpp.lz"); + const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/shiny.gbapal"); const u8 gMonIcon_CastformSnowy[] = INCBIN_U8("graphics/pokemon/castform/snowy/icon.4bpp"); @@ -12792,14 +12792,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KECLEON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front.4bpp.smol"); const u16 gMonPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/normal.gbapal"); - const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.lz"); + const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.smol"); const u16 gMonShinyPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/shiny.gbapal"); #else - const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/normal_gba.gbapal"); - const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kecleon[] = INCBIN_U16("graphics/pokemon/kecleon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12821,14 +12821,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SHUPPET #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front.4bpp.smol"); const u16 gMonPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/normal.gbapal"); - const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.lz"); + const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.smol"); const u16 gMonShinyPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/shiny.gbapal"); #else - const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/normal_gba.gbapal"); - const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shuppet[] = INCBIN_U16("graphics/pokemon/shuppet/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12848,14 +12848,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front.4bpp.smol"); const u16 gMonPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/normal.gbapal"); - const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.lz"); + const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.smol"); const u16 gMonShinyPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/shiny.gbapal"); #else - const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/normal_gba.gbapal"); - const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back_gba.4bpp.lz"); + const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Banette[] = INCBIN_U16("graphics/pokemon/banette/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12875,9 +12875,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/front.4bpp.lz"); + const u32 gMonFrontPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/front.4bpp.smol"); const u16 gMonPalette_BanetteMega[] = INCBIN_U16("graphics/pokemon/banette/mega/normal.gbapal"); - const u32 gMonBackPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/back.4bpp.lz"); + const u32 gMonBackPic_BanetteMega[] = INCBIN_U32("graphics/pokemon/banette/mega/back.4bpp.smol"); const u16 gMonShinyPalette_BanetteMega[] = INCBIN_U16("graphics/pokemon/banette/mega/shiny.gbapal"); const u8 gMonIcon_BanetteMega[] = INCBIN_U8("graphics/pokemon/banette/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -12892,14 +12892,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DUSKULL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front.4bpp.smol"); const u16 gMonPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/normal.gbapal"); - const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.lz"); + const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.smol"); const u16 gMonShinyPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/shiny.gbapal"); #else - const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/normal_gba.gbapal"); - const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back_gba.4bpp.lz"); + const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Duskull[] = INCBIN_U16("graphics/pokemon/duskull/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12919,14 +12919,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front.4bpp.smol"); const u16 gMonPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/normal.gbapal"); - const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.lz"); + const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.smol"); const u16 gMonShinyPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/shiny.gbapal"); #else - const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/normal_gba.gbapal"); - const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back_gba.4bpp.lz"); + const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Dusclops[] = INCBIN_U16("graphics/pokemon/dusclops/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12946,9 +12946,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/anim_front.4bpp.smol"); const u16 gMonPalette_Dusknoir[] = INCBIN_U16("graphics/pokemon/dusknoir/normal.gbapal"); - const u32 gMonBackPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/back.4bpp.lz"); + const u32 gMonBackPic_Dusknoir[] = INCBIN_U32("graphics/pokemon/dusknoir/back.4bpp.smol"); const u16 gMonShinyPalette_Dusknoir[] = INCBIN_U16("graphics/pokemon/dusknoir/shiny.gbapal"); const u8 gMonIcon_Dusknoir[] = INCBIN_U8("graphics/pokemon/dusknoir/icon.4bpp"); #if P_FOOTPRINTS @@ -12966,14 +12966,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_TROPIUS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front.4bpp.smol"); const u16 gMonPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/normal.gbapal"); - const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.lz"); + const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.smol"); const u16 gMonShinyPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/shiny.gbapal"); #else - const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/normal_gba.gbapal"); - const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back_gba.4bpp.lz"); + const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Tropius[] = INCBIN_U16("graphics/pokemon/tropius/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -12995,9 +12995,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CHIMECHO #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/anim_front.4bpp.smol"); const u16 gMonPalette_Chingling[] = INCBIN_U16("graphics/pokemon/chingling/normal.gbapal"); - const u32 gMonBackPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/back.4bpp.lz"); + const u32 gMonBackPic_Chingling[] = INCBIN_U32("graphics/pokemon/chingling/back.4bpp.smol"); const u16 gMonShinyPalette_Chingling[] = INCBIN_U16("graphics/pokemon/chingling/shiny.gbapal"); const u8 gMonIcon_Chingling[] = INCBIN_U8("graphics/pokemon/chingling/icon.4bpp"); #if P_FOOTPRINTS @@ -13013,14 +13013,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GEN_4_CROSS_EVOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front.4bpp.smol"); const u16 gMonPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/normal.gbapal"); - const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.lz"); + const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.smol"); const u16 gMonShinyPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/shiny.gbapal"); #else - const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/normal_gba.gbapal"); - const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back_gba.4bpp.lz"); + const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Chimecho[] = INCBIN_U16("graphics/pokemon/chimecho/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13042,14 +13042,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_ABSOL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front.4bpp.smol"); const u16 gMonPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/normal.gbapal"); - const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.lz"); + const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.smol"); const u16 gMonShinyPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/shiny.gbapal"); #else - const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/normal_gba.gbapal"); - const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back_gba.4bpp.lz"); + const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Absol[] = INCBIN_U16("graphics/pokemon/absol/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13069,9 +13069,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/front.4bpp.smol"); const u16 gMonPalette_AbsolMega[] = INCBIN_U16("graphics/pokemon/absol/mega/normal.gbapal"); - const u32 gMonBackPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/back.4bpp.lz"); + const u32 gMonBackPic_AbsolMega[] = INCBIN_U32("graphics/pokemon/absol/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AbsolMega[] = INCBIN_U16("graphics/pokemon/absol/mega/shiny.gbapal"); const u8 gMonIcon_AbsolMega[] = INCBIN_U8("graphics/pokemon/absol/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13086,14 +13086,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SNORUNT #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front.4bpp.smol"); const u16 gMonPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/normal.gbapal"); - const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.lz"); + const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.smol"); const u16 gMonShinyPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/shiny.gbapal"); #else - const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/normal_gba.gbapal"); - const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back_gba.4bpp.lz"); + const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Snorunt[] = INCBIN_U16("graphics/pokemon/snorunt/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13113,14 +13113,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front.4bpp.smol"); const u16 gMonPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/normal.gbapal"); - const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.lz"); + const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.smol"); const u16 gMonShinyPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/shiny.gbapal"); #else - const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/normal_gba.gbapal"); - const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back_gba.4bpp.lz"); + const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Glalie[] = INCBIN_U16("graphics/pokemon/glalie/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13140,9 +13140,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/front.4bpp.smol"); const u16 gMonPalette_GlalieMega[] = INCBIN_U16("graphics/pokemon/glalie/mega/normal.gbapal"); - const u32 gMonBackPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/back.4bpp.lz"); + const u32 gMonBackPic_GlalieMega[] = INCBIN_U32("graphics/pokemon/glalie/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GlalieMega[] = INCBIN_U16("graphics/pokemon/glalie/mega/shiny.gbapal"); const u8 gMonIcon_GlalieMega[] = INCBIN_U8("graphics/pokemon/glalie/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13155,9 +13155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_MEGA_EVOLUTIONS #if P_GEN_4_CROSS_EVOS - const u32 gMonFrontPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/anim_front.4bpp.smol"); const u16 gMonPalette_Froslass[] = INCBIN_U16("graphics/pokemon/froslass/normal.gbapal"); - const u32 gMonBackPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/back.4bpp.lz"); + const u32 gMonBackPic_Froslass[] = INCBIN_U32("graphics/pokemon/froslass/back.4bpp.smol"); const u16 gMonShinyPalette_Froslass[] = INCBIN_U16("graphics/pokemon/froslass/shiny.gbapal"); const u8 gMonIcon_Froslass[] = INCBIN_U8("graphics/pokemon/froslass/icon.4bpp"); #if P_FOOTPRINTS @@ -13175,14 +13175,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_SPHEAL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front.4bpp.smol"); const u16 gMonPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/normal.gbapal"); - const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.lz"); + const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.smol"); const u16 gMonShinyPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/shiny.gbapal"); #else - const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/normal_gba.gbapal"); - const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back_gba.4bpp.lz"); + const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Spheal[] = INCBIN_U16("graphics/pokemon/spheal/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13202,14 +13202,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front.4bpp.smol"); const u16 gMonPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/normal.gbapal"); - const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.lz"); + const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.smol"); const u16 gMonShinyPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/shiny.gbapal"); #else - const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/normal_gba.gbapal"); - const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back_gba.4bpp.lz"); + const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Sealeo[] = INCBIN_U16("graphics/pokemon/sealeo/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13229,14 +13229,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front.4bpp.smol"); const u16 gMonPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/normal.gbapal"); - const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.lz"); + const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.smol"); const u16 gMonShinyPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/shiny.gbapal"); #else - const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/normal_gba.gbapal"); - const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back_gba.4bpp.lz"); + const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Walrein[] = INCBIN_U16("graphics/pokemon/walrein/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13258,14 +13258,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_CLAMPERL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front.4bpp.smol"); const u16 gMonPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/normal.gbapal"); - const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.lz"); + const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.smol"); const u16 gMonShinyPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/shiny.gbapal"); #else - const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/normal_gba.gbapal"); - const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back_gba.4bpp.lz"); + const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Clamperl[] = INCBIN_U16("graphics/pokemon/clamperl/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13285,14 +13285,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front.4bpp.smol"); const u16 gMonPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/normal.gbapal"); - const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.lz"); + const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.smol"); const u16 gMonShinyPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/shiny.gbapal"); #else - const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/normal_gba.gbapal"); - const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back_gba.4bpp.lz"); + const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Huntail[] = INCBIN_U16("graphics/pokemon/huntail/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13312,14 +13312,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front.4bpp.smol"); const u16 gMonPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/normal.gbapal"); - const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.lz"); + const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.smol"); const u16 gMonShinyPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/shiny.gbapal"); #else - const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/normal_gba.gbapal"); - const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back_gba.4bpp.lz"); + const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Gorebyss[] = INCBIN_U16("graphics/pokemon/gorebyss/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13341,14 +13341,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RELICANTH #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front.4bpp.smol"); const u16 gMonPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/normal.gbapal"); - const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.lz"); + const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.smol"); const u16 gMonShinyPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/shiny.gbapal"); #else - const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/normal_gba.gbapal"); - const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back_gba.4bpp.lz"); + const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Relicanth[] = INCBIN_U16("graphics/pokemon/relicanth/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13368,8 +13368,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/backf.4bpp.lz"); + const u32 gMonFrontPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_RelicanthF[] = INCBIN_U32("graphics/pokemon/relicanth/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_RelicanthF[] = INCBIN_COMP("graphics/pokemon/relicanth/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -13378,14 +13378,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LUVDISC #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front.4bpp.smol"); const u16 gMonPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/normal.gbapal"); - const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.lz"); + const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.smol"); const u16 gMonShinyPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/shiny.gbapal"); #else - const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/normal_gba.gbapal"); - const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back_gba.4bpp.lz"); + const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Luvdisc[] = INCBIN_U16("graphics/pokemon/luvdisc/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13407,14 +13407,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BAGON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front.4bpp.smol"); const u16 gMonPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/normal.gbapal"); - const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.lz"); + const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.smol"); const u16 gMonShinyPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/shiny.gbapal"); #else - const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/normal_gba.gbapal"); - const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Bagon[] = INCBIN_U16("graphics/pokemon/bagon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13434,14 +13434,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front.4bpp.smol"); const u16 gMonPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/normal.gbapal"); - const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.lz"); + const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.smol"); const u16 gMonShinyPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/shiny.gbapal"); #else - const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/normal_gba.gbapal"); - const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Shelgon[] = INCBIN_U16("graphics/pokemon/shelgon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13461,14 +13461,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front.4bpp.smol"); const u16 gMonPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/normal.gbapal"); - const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.lz"); + const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.smol"); const u16 gMonShinyPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/shiny.gbapal"); #else - const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/normal_gba.gbapal"); - const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back_gba.4bpp.lz"); + const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Salamence[] = INCBIN_U16("graphics/pokemon/salamence/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13488,9 +13488,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/front.4bpp.lz"); + const u32 gMonFrontPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/front.4bpp.smol"); const u16 gMonPalette_SalamenceMega[] = INCBIN_U16("graphics/pokemon/salamence/mega/normal.gbapal"); - const u32 gMonBackPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/back.4bpp.lz"); + const u32 gMonBackPic_SalamenceMega[] = INCBIN_U32("graphics/pokemon/salamence/mega/back.4bpp.smol"); const u16 gMonShinyPalette_SalamenceMega[] = INCBIN_U16("graphics/pokemon/salamence/mega/shiny.gbapal"); const u8 gMonIcon_SalamenceMega[] = INCBIN_U8("graphics/pokemon/salamence/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13505,14 +13505,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_BELDUM #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front.4bpp.smol"); const u16 gMonPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/normal.gbapal"); - const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.lz"); + const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.smol"); const u16 gMonShinyPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/shiny.gbapal"); #else - const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/normal_gba.gbapal"); - const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back_gba.4bpp.lz"); + const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Beldum[] = INCBIN_U16("graphics/pokemon/beldum/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13532,14 +13532,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front.4bpp.smol"); const u16 gMonPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/normal.gbapal"); - const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.lz"); + const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.smol"); const u16 gMonShinyPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/shiny.gbapal"); #else - const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/normal_gba.gbapal"); - const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metang[] = INCBIN_U16("graphics/pokemon/metang/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13559,14 +13559,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front.4bpp.smol"); const u16 gMonPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/normal.gbapal"); - const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.lz"); + const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.smol"); const u16 gMonShinyPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/shiny.gbapal"); #else - const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/normal_gba.gbapal"); - const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back_gba.4bpp.lz"); + const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Metagross[] = INCBIN_U16("graphics/pokemon/metagross/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13586,9 +13586,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/front.4bpp.lz"); + const u32 gMonFrontPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/front.4bpp.smol"); const u16 gMonPalette_MetagrossMega[] = INCBIN_U16("graphics/pokemon/metagross/mega/normal.gbapal"); - const u32 gMonBackPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/back.4bpp.lz"); + const u32 gMonBackPic_MetagrossMega[] = INCBIN_U32("graphics/pokemon/metagross/mega/back.4bpp.smol"); const u16 gMonShinyPalette_MetagrossMega[] = INCBIN_U16("graphics/pokemon/metagross/mega/shiny.gbapal"); const u8 gMonIcon_MetagrossMega[] = INCBIN_U8("graphics/pokemon/metagross/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13603,14 +13603,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGIROCK #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front.4bpp.smol"); const u16 gMonPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/normal.gbapal"); - const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.lz"); + const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.smol"); const u16 gMonShinyPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/shiny.gbapal"); #else - const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/normal_gba.gbapal"); - const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back_gba.4bpp.lz"); + const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Regirock[] = INCBIN_U16("graphics/pokemon/regirock/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13632,14 +13632,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGICE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front.4bpp.smol"); const u16 gMonPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/normal.gbapal"); - const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.lz"); + const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.smol"); const u16 gMonShinyPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/shiny.gbapal"); #else - const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/normal_gba.gbapal"); - const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back_gba.4bpp.lz"); + const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Regice[] = INCBIN_U16("graphics/pokemon/regice/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13661,14 +13661,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_REGISTEEL #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front.4bpp.smol"); const u16 gMonPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/normal.gbapal"); - const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.lz"); + const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.smol"); const u16 gMonShinyPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/shiny.gbapal"); #else - const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/normal_gba.gbapal"); - const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back_gba.4bpp.lz"); + const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Registeel[] = INCBIN_U16("graphics/pokemon/registeel/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13690,14 +13690,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LATIAS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front.4bpp.smol"); const u16 gMonPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/normal.gbapal"); - const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.lz"); + const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.smol"); const u16 gMonShinyPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/shiny.gbapal"); #else - const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/normal_gba.gbapal"); - const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back_gba.4bpp.lz"); + const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Latias[] = INCBIN_U16("graphics/pokemon/latias/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13717,9 +13717,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/front.4bpp.smol"); const u16 gMonPalette_LatiasMega[] = INCBIN_U16("graphics/pokemon/latias/mega/normal.gbapal"); - const u32 gMonBackPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/back.4bpp.lz"); + const u32 gMonBackPic_LatiasMega[] = INCBIN_U32("graphics/pokemon/latias/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LatiasMega[] = INCBIN_U16("graphics/pokemon/latias/mega/shiny.gbapal"); const u8 gMonIcon_LatiasMega[] = INCBIN_U8("graphics/pokemon/latias/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13734,14 +13734,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_LATIOS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front.4bpp.smol"); const u16 gMonPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/normal.gbapal"); - const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.lz"); + const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.smol"); const u16 gMonShinyPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/shiny.gbapal"); #else - const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/normal_gba.gbapal"); - const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back_gba.4bpp.lz"); + const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Latios[] = INCBIN_U16("graphics/pokemon/latios/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13761,9 +13761,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/front.4bpp.smol"); const u16 gMonPalette_LatiosMega[] = INCBIN_U16("graphics/pokemon/latios/mega/normal.gbapal"); - const u32 gMonBackPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/back.4bpp.lz"); + const u32 gMonBackPic_LatiosMega[] = INCBIN_U32("graphics/pokemon/latios/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LatiosMega[] = INCBIN_U16("graphics/pokemon/latios/mega/shiny.gbapal"); const u8 gMonIcon_LatiosMega[] = INCBIN_U8("graphics/pokemon/latios/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13778,14 +13778,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_KYOGRE #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front.4bpp.smol"); const u16 gMonPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/normal.gbapal"); - const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.lz"); + const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.smol"); const u16 gMonShinyPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/shiny.gbapal"); #else - const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/normal_gba.gbapal"); - const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back_gba.4bpp.lz"); + const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Kyogre[] = INCBIN_U16("graphics/pokemon/kyogre/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13805,9 +13805,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PRIMAL_REVERSIONS - const u32 gMonFrontPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/front.4bpp.lz"); + const u32 gMonFrontPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/front.4bpp.smol"); const u16 gMonPalette_KyogrePrimal[] = INCBIN_U16("graphics/pokemon/kyogre/primal/normal.gbapal"); - const u32 gMonBackPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/back.4bpp.lz"); + const u32 gMonBackPic_KyogrePrimal[] = INCBIN_U32("graphics/pokemon/kyogre/primal/back.4bpp.smol"); const u16 gMonShinyPalette_KyogrePrimal[] = INCBIN_U16("graphics/pokemon/kyogre/primal/shiny.gbapal"); const u8 gMonIcon_KyogrePrimal[] = INCBIN_U8("graphics/pokemon/kyogre/primal/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13822,14 +13822,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_GROUDON #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front.4bpp.smol"); const u16 gMonPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/normal.gbapal"); - const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.lz"); + const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.smol"); const u16 gMonShinyPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/shiny.gbapal"); #else - const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/normal_gba.gbapal"); - const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back_gba.4bpp.lz"); + const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Groudon[] = INCBIN_U16("graphics/pokemon/groudon/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13849,9 +13849,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_PRIMAL_REVERSIONS - const u32 gMonFrontPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/front.4bpp.lz"); + const u32 gMonFrontPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/front.4bpp.smol"); const u16 gMonPalette_GroudonPrimal[] = INCBIN_U16("graphics/pokemon/groudon/primal/normal.gbapal"); - const u32 gMonBackPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/back.4bpp.lz"); + const u32 gMonBackPic_GroudonPrimal[] = INCBIN_U32("graphics/pokemon/groudon/primal/back.4bpp.smol"); const u16 gMonShinyPalette_GroudonPrimal[] = INCBIN_U16("graphics/pokemon/groudon/primal/shiny.gbapal"); const u8 gMonIcon_GroudonPrimal[] = INCBIN_U8("graphics/pokemon/groudon/primal/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13866,14 +13866,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_RAYQUAZA #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front.4bpp.smol"); const u16 gMonPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/normal.gbapal"); - const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.lz"); + const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.smol"); const u16 gMonShinyPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/shiny.gbapal"); #else - const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/normal_gba.gbapal"); - const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back_gba.4bpp.lz"); + const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Rayquaza[] = INCBIN_U16("graphics/pokemon/rayquaza/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13893,9 +13893,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/front.4bpp.lz"); + const u32 gMonFrontPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/front.4bpp.smol"); const u16 gMonPalette_RayquazaMega[] = INCBIN_U16("graphics/pokemon/rayquaza/mega/normal.gbapal"); - const u32 gMonBackPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/back.4bpp.lz"); + const u32 gMonBackPic_RayquazaMega[] = INCBIN_U32("graphics/pokemon/rayquaza/mega/back.4bpp.smol"); const u16 gMonShinyPalette_RayquazaMega[] = INCBIN_U16("graphics/pokemon/rayquaza/mega/shiny.gbapal"); const u8 gMonIcon_RayquazaMega[] = INCBIN_U8("graphics/pokemon/rayquaza/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -13910,14 +13910,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_JIRACHI #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front.4bpp.smol"); const u16 gMonPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/normal.gbapal"); - const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.lz"); + const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.smol"); const u16 gMonShinyPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/shiny.gbapal"); #else - const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/anim_front_gba.4bpp.smol"); const u16 gMonPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/normal_gba.gbapal"); - const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back_gba.4bpp.lz"); + const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back_gba.4bpp.smol"); const u16 gMonShinyPalette_Jirachi[] = INCBIN_U16("graphics/pokemon/jirachi/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13939,14 +13939,14 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #if P_FAMILY_DEOXYS #if !P_GBA_STYLE_SPECIES_GFX - const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front.4bpp.smol"); const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal.gbapal"); - const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.lz"); + const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny.gbapal"); #else - const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front_gba.4bpp.lz"); + const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front_gba.4bpp.smol"); const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal_gba.gbapal"); - const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back_gba.4bpp.lz"); + const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back_gba.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS @@ -13958,21 +13958,21 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.smol"); const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal.gbapal"); - const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.lz"); + const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny.gbapal"); const u8 gMonIcon_DeoxysAttack[] = INCBIN_U8("graphics/pokemon/deoxys/attack/icon.4bpp"); - const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.smol"); const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal.gbapal"); - const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.lz"); + const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny.gbapal"); const u8 gMonIcon_DeoxysDefense[] = INCBIN_U8("graphics/pokemon/deoxys/defense/icon.4bpp"); - const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.smol"); const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal.gbapal"); - const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.lz"); + const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny.gbapal"); const u8 gMonIcon_DeoxysSpeed[] = INCBIN_U8("graphics/pokemon/deoxys/speed/icon.4bpp"); @@ -13995,9 +13995,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEOXYS #if P_FAMILY_TURTWIG - const u32 gMonFrontPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/anim_front.4bpp.smol"); const u16 gMonPalette_Turtwig[] = INCBIN_U16("graphics/pokemon/turtwig/normal.gbapal"); - const u32 gMonBackPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/back.4bpp.lz"); + const u32 gMonBackPic_Turtwig[] = INCBIN_U32("graphics/pokemon/turtwig/back.4bpp.smol"); const u16 gMonShinyPalette_Turtwig[] = INCBIN_U16("graphics/pokemon/turtwig/shiny.gbapal"); const u8 gMonIcon_Turtwig[] = INCBIN_U8("graphics/pokemon/turtwig/icon.4bpp"); #if P_FOOTPRINTS @@ -14011,9 +14011,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/anim_front.4bpp.smol"); const u16 gMonPalette_Grotle[] = INCBIN_U16("graphics/pokemon/grotle/normal.gbapal"); - const u32 gMonBackPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/back.4bpp.lz"); + const u32 gMonBackPic_Grotle[] = INCBIN_U32("graphics/pokemon/grotle/back.4bpp.smol"); const u16 gMonShinyPalette_Grotle[] = INCBIN_U16("graphics/pokemon/grotle/shiny.gbapal"); const u8 gMonIcon_Grotle[] = INCBIN_U8("graphics/pokemon/grotle/icon.4bpp"); #if P_FOOTPRINTS @@ -14027,9 +14027,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/anim_front.4bpp.smol"); const u16 gMonPalette_Torterra[] = INCBIN_U16("graphics/pokemon/torterra/normal.gbapal"); - const u32 gMonBackPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/back.4bpp.lz"); + const u32 gMonBackPic_Torterra[] = INCBIN_U32("graphics/pokemon/torterra/back.4bpp.smol"); const u16 gMonShinyPalette_Torterra[] = INCBIN_U16("graphics/pokemon/torterra/shiny.gbapal"); const u8 gMonIcon_Torterra[] = INCBIN_U8("graphics/pokemon/torterra/icon.4bpp"); #if P_FOOTPRINTS @@ -14045,9 +14045,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TURTWIG #if P_FAMILY_CHIMCHAR - const u32 gMonFrontPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/anim_front.4bpp.smol"); const u16 gMonPalette_Chimchar[] = INCBIN_U16("graphics/pokemon/chimchar/normal.gbapal"); - const u32 gMonBackPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/back.4bpp.lz"); + const u32 gMonBackPic_Chimchar[] = INCBIN_U32("graphics/pokemon/chimchar/back.4bpp.smol"); const u16 gMonShinyPalette_Chimchar[] = INCBIN_U16("graphics/pokemon/chimchar/shiny.gbapal"); const u8 gMonIcon_Chimchar[] = INCBIN_U8("graphics/pokemon/chimchar/icon.4bpp"); #if P_FOOTPRINTS @@ -14061,9 +14061,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/anim_front.4bpp.smol"); const u16 gMonPalette_Monferno[] = INCBIN_U16("graphics/pokemon/monferno/normal.gbapal"); - const u32 gMonBackPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/back.4bpp.lz"); + const u32 gMonBackPic_Monferno[] = INCBIN_U32("graphics/pokemon/monferno/back.4bpp.smol"); const u16 gMonShinyPalette_Monferno[] = INCBIN_U16("graphics/pokemon/monferno/shiny.gbapal"); const u8 gMonIcon_Monferno[] = INCBIN_U8("graphics/pokemon/monferno/icon.4bpp"); #if P_FOOTPRINTS @@ -14077,9 +14077,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/anim_front.4bpp.smol"); const u16 gMonPalette_Infernape[] = INCBIN_U16("graphics/pokemon/infernape/normal.gbapal"); - const u32 gMonBackPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/back.4bpp.lz"); + const u32 gMonBackPic_Infernape[] = INCBIN_U32("graphics/pokemon/infernape/back.4bpp.smol"); const u16 gMonShinyPalette_Infernape[] = INCBIN_U16("graphics/pokemon/infernape/shiny.gbapal"); const u8 gMonIcon_Infernape[] = INCBIN_U8("graphics/pokemon/infernape/icon.4bpp"); #if P_FOOTPRINTS @@ -14095,9 +14095,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHIMCHAR #if P_FAMILY_PIPLUP - const u32 gMonFrontPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/anim_front.4bpp.smol"); const u16 gMonPalette_Piplup[] = INCBIN_U16("graphics/pokemon/piplup/normal.gbapal"); - const u32 gMonBackPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/back.4bpp.lz"); + const u32 gMonBackPic_Piplup[] = INCBIN_U32("graphics/pokemon/piplup/back.4bpp.smol"); const u16 gMonShinyPalette_Piplup[] = INCBIN_U16("graphics/pokemon/piplup/shiny.gbapal"); const u8 gMonIcon_Piplup[] = INCBIN_U8("graphics/pokemon/piplup/icon.4bpp"); #if P_FOOTPRINTS @@ -14111,9 +14111,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/anim_front.4bpp.smol"); const u16 gMonPalette_Prinplup[] = INCBIN_U16("graphics/pokemon/prinplup/normal.gbapal"); - const u32 gMonBackPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/back.4bpp.lz"); + const u32 gMonBackPic_Prinplup[] = INCBIN_U32("graphics/pokemon/prinplup/back.4bpp.smol"); const u16 gMonShinyPalette_Prinplup[] = INCBIN_U16("graphics/pokemon/prinplup/shiny.gbapal"); const u8 gMonIcon_Prinplup[] = INCBIN_U8("graphics/pokemon/prinplup/icon.4bpp"); #if P_FOOTPRINTS @@ -14127,9 +14127,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/anim_front.4bpp.smol"); const u16 gMonPalette_Empoleon[] = INCBIN_U16("graphics/pokemon/empoleon/normal.gbapal"); - const u32 gMonBackPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/back.4bpp.lz"); + const u32 gMonBackPic_Empoleon[] = INCBIN_U32("graphics/pokemon/empoleon/back.4bpp.smol"); const u16 gMonShinyPalette_Empoleon[] = INCBIN_U16("graphics/pokemon/empoleon/shiny.gbapal"); const u8 gMonIcon_Empoleon[] = INCBIN_U8("graphics/pokemon/empoleon/icon.4bpp"); #if P_FOOTPRINTS @@ -14145,9 +14145,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIPLUP #if P_FAMILY_STARLY - const u32 gMonFrontPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/anim_front.4bpp.smol"); const u16 gMonPalette_Starly[] = INCBIN_U16("graphics/pokemon/starly/normal.gbapal"); - const u32 gMonBackPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/back.4bpp.lz"); + const u32 gMonBackPic_Starly[] = INCBIN_U32("graphics/pokemon/starly/back.4bpp.smol"); const u16 gMonShinyPalette_Starly[] = INCBIN_U16("graphics/pokemon/starly/shiny.gbapal"); const u8 gMonIcon_Starly[] = INCBIN_U8("graphics/pokemon/starly/icon.4bpp"); #if P_FOOTPRINTS @@ -14162,16 +14162,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/backf.4bpp.lz"); + const u32 gMonFrontPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_StarlyF[] = INCBIN_U32("graphics/pokemon/starly/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StarlyF[] = INCBIN_COMP("graphics/pokemon/starly/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/anim_front.4bpp.smol"); const u16 gMonPalette_Staravia[] = INCBIN_U16("graphics/pokemon/staravia/normal.gbapal"); - const u32 gMonBackPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.lz"); + const u32 gMonBackPic_Staravia[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.smol"); const u16 gMonShinyPalette_Staravia[] = INCBIN_U16("graphics/pokemon/staravia/shiny.gbapal"); const u8 gMonIcon_Staravia[] = INCBIN_U8("graphics/pokemon/staravia/icon.4bpp"); #if P_FOOTPRINTS @@ -14186,16 +14186,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.lz"); + const u32 gMonFrontPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_StaraviaF[] = INCBIN_U32("graphics/pokemon/staravia/back.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StaraviaF[] = INCBIN_COMP("graphics/pokemon/staravia/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/anim_front.4bpp.smol"); const u16 gMonPalette_Staraptor[] = INCBIN_U16("graphics/pokemon/staraptor/normal.gbapal"); - const u32 gMonBackPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/back.4bpp.lz"); + const u32 gMonBackPic_Staraptor[] = INCBIN_U32("graphics/pokemon/staraptor/back.4bpp.smol"); const u16 gMonShinyPalette_Staraptor[] = INCBIN_U16("graphics/pokemon/staraptor/shiny.gbapal"); const u8 gMonIcon_Staraptor[] = INCBIN_U8("graphics/pokemon/staraptor/icon.4bpp"); #if P_FOOTPRINTS @@ -14210,7 +14210,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_StaraptorF[] = INCBIN_U32("graphics/pokemon/staraptor/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_StaraptorF[] = INCBIN_U32("graphics/pokemon/staraptor/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_StaraptorF[] = INCBIN_COMP("graphics/pokemon/staraptor/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14218,9 +14218,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STARLY #if P_FAMILY_BIDOOF - const u32 gMonFrontPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/anim_front.4bpp.smol"); const u16 gMonPalette_Bidoof[] = INCBIN_U16("graphics/pokemon/bidoof/normal.gbapal"); - const u32 gMonBackPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/back.4bpp.lz"); + const u32 gMonBackPic_Bidoof[] = INCBIN_U32("graphics/pokemon/bidoof/back.4bpp.smol"); const u16 gMonShinyPalette_Bidoof[] = INCBIN_U16("graphics/pokemon/bidoof/shiny.gbapal"); const u8 gMonIcon_Bidoof[] = INCBIN_U8("graphics/pokemon/bidoof/icon.4bpp"); #if P_FOOTPRINTS @@ -14235,16 +14235,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/backf.4bpp.lz"); + const u32 gMonFrontPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_BidoofF[] = INCBIN_U32("graphics/pokemon/bidoof/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BidoofF[] = INCBIN_COMP("graphics/pokemon/bidoof/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/anim_front.4bpp.smol"); const u16 gMonPalette_Bibarel[] = INCBIN_U16("graphics/pokemon/bibarel/normal.gbapal"); - const u32 gMonBackPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/back.4bpp.lz"); + const u32 gMonBackPic_Bibarel[] = INCBIN_U32("graphics/pokemon/bibarel/back.4bpp.smol"); const u16 gMonShinyPalette_Bibarel[] = INCBIN_U16("graphics/pokemon/bibarel/shiny.gbapal"); const u8 gMonIcon_Bibarel[] = INCBIN_U8("graphics/pokemon/bibarel/icon.4bpp"); #if P_FOOTPRINTS @@ -14259,7 +14259,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_BibarelF[] = INCBIN_U32("graphics/pokemon/bibarel/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_BibarelF[] = INCBIN_U32("graphics/pokemon/bibarel/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BibarelF[] = INCBIN_COMP("graphics/pokemon/bibarel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14267,9 +14267,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BIDOOF #if P_FAMILY_KRICKETOT - const u32 gMonFrontPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/anim_front.4bpp.smol"); const u16 gMonPalette_Kricketot[] = INCBIN_U16("graphics/pokemon/kricketot/normal.gbapal"); - const u32 gMonBackPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/back.4bpp.lz"); + const u32 gMonBackPic_Kricketot[] = INCBIN_U32("graphics/pokemon/kricketot/back.4bpp.smol"); const u16 gMonShinyPalette_Kricketot[] = INCBIN_U16("graphics/pokemon/kricketot/shiny.gbapal"); const u8 gMonIcon_Kricketot[] = INCBIN_U8("graphics/pokemon/kricketot/icon.4bpp"); #if P_FOOTPRINTS @@ -14284,16 +14284,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/backf.4bpp.lz"); + const u32 gMonFrontPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KricketotF[] = INCBIN_U32("graphics/pokemon/kricketot/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KricketotF[] = INCBIN_COMP("graphics/pokemon/kricketot/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/anim_front.4bpp.smol"); const u16 gMonPalette_Kricketune[] = INCBIN_U16("graphics/pokemon/kricketune/normal.gbapal"); - const u32 gMonBackPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/back.4bpp.lz"); + const u32 gMonBackPic_Kricketune[] = INCBIN_U32("graphics/pokemon/kricketune/back.4bpp.smol"); const u16 gMonShinyPalette_Kricketune[] = INCBIN_U16("graphics/pokemon/kricketune/shiny.gbapal"); const u8 gMonIcon_Kricketune[] = INCBIN_U8("graphics/pokemon/kricketune/icon.4bpp"); #if P_FOOTPRINTS @@ -14308,8 +14308,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/backf.4bpp.lz"); + const u32 gMonFrontPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_KricketuneF[] = INCBIN_U32("graphics/pokemon/kricketune/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_KricketuneF[] = INCBIN_COMP("graphics/pokemon/kricketune/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14317,9 +14317,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KRICKETOT #if P_FAMILY_SHINX - const u32 gMonFrontPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/anim_front.4bpp.smol"); const u16 gMonPalette_Shinx[] = INCBIN_U16("graphics/pokemon/shinx/normal.gbapal"); - const u32 gMonBackPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/back.4bpp.lz"); + const u32 gMonBackPic_Shinx[] = INCBIN_U32("graphics/pokemon/shinx/back.4bpp.smol"); const u16 gMonShinyPalette_Shinx[] = INCBIN_U16("graphics/pokemon/shinx/shiny.gbapal"); const u8 gMonIcon_Shinx[] = INCBIN_U8("graphics/pokemon/shinx/icon.4bpp"); #if P_FOOTPRINTS @@ -14334,16 +14334,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/backf.4bpp.lz"); + const u32 gMonFrontPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ShinxF[] = INCBIN_U32("graphics/pokemon/shinx/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ShinxF[] = INCBIN_COMP("graphics/pokemon/shinx/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/anim_front.4bpp.smol"); const u16 gMonPalette_Luxio[] = INCBIN_U16("graphics/pokemon/luxio/normal.gbapal"); - const u32 gMonBackPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/back.4bpp.lz"); + const u32 gMonBackPic_Luxio[] = INCBIN_U32("graphics/pokemon/luxio/back.4bpp.smol"); const u16 gMonShinyPalette_Luxio[] = INCBIN_U16("graphics/pokemon/luxio/shiny.gbapal"); const u8 gMonIcon_Luxio[] = INCBIN_U8("graphics/pokemon/luxio/icon.4bpp"); #if P_FOOTPRINTS @@ -14358,16 +14358,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/backf.4bpp.lz"); + const u32 gMonFrontPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LuxioF[] = INCBIN_U32("graphics/pokemon/luxio/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LuxioF[] = INCBIN_COMP("graphics/pokemon/luxio/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/anim_front.4bpp.smol"); const u16 gMonPalette_Luxray[] = INCBIN_U16("graphics/pokemon/luxray/normal.gbapal"); - const u32 gMonBackPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/back.4bpp.lz"); + const u32 gMonBackPic_Luxray[] = INCBIN_U32("graphics/pokemon/luxray/back.4bpp.smol"); const u16 gMonShinyPalette_Luxray[] = INCBIN_U16("graphics/pokemon/luxray/shiny.gbapal"); const u8 gMonIcon_Luxray[] = INCBIN_U8("graphics/pokemon/luxray/icon.4bpp"); #if P_FOOTPRINTS @@ -14382,8 +14382,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/backf.4bpp.lz"); + const u32 gMonFrontPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LuxrayF[] = INCBIN_U32("graphics/pokemon/luxray/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LuxrayF[] = INCBIN_COMP("graphics/pokemon/luxray/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14391,9 +14391,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHINX #if P_FAMILY_CRANIDOS - const u32 gMonFrontPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/anim_front.4bpp.smol"); const u16 gMonPalette_Cranidos[] = INCBIN_U16("graphics/pokemon/cranidos/normal.gbapal"); - const u32 gMonBackPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/back.4bpp.lz"); + const u32 gMonBackPic_Cranidos[] = INCBIN_U32("graphics/pokemon/cranidos/back.4bpp.smol"); const u16 gMonShinyPalette_Cranidos[] = INCBIN_U16("graphics/pokemon/cranidos/shiny.gbapal"); const u8 gMonIcon_Cranidos[] = INCBIN_U8("graphics/pokemon/cranidos/icon.4bpp"); #if P_FOOTPRINTS @@ -14407,9 +14407,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/anim_front.4bpp.smol"); const u16 gMonPalette_Rampardos[] = INCBIN_U16("graphics/pokemon/rampardos/normal.gbapal"); - const u32 gMonBackPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/back.4bpp.lz"); + const u32 gMonBackPic_Rampardos[] = INCBIN_U32("graphics/pokemon/rampardos/back.4bpp.smol"); const u16 gMonShinyPalette_Rampardos[] = INCBIN_U16("graphics/pokemon/rampardos/shiny.gbapal"); const u8 gMonIcon_Rampardos[] = INCBIN_U8("graphics/pokemon/rampardos/icon.4bpp"); #if P_FOOTPRINTS @@ -14425,9 +14425,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRANIDOS #if P_FAMILY_SHIELDON - const u32 gMonFrontPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/anim_front.4bpp.smol"); const u16 gMonPalette_Shieldon[] = INCBIN_U16("graphics/pokemon/shieldon/normal.gbapal"); - const u32 gMonBackPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/back.4bpp.lz"); + const u32 gMonBackPic_Shieldon[] = INCBIN_U32("graphics/pokemon/shieldon/back.4bpp.smol"); const u16 gMonShinyPalette_Shieldon[] = INCBIN_U16("graphics/pokemon/shieldon/shiny.gbapal"); const u8 gMonIcon_Shieldon[] = INCBIN_U8("graphics/pokemon/shieldon/icon.4bpp"); #if P_FOOTPRINTS @@ -14441,9 +14441,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/anim_front.4bpp.smol"); const u16 gMonPalette_Bastiodon[] = INCBIN_U16("graphics/pokemon/bastiodon/normal.gbapal"); - const u32 gMonBackPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/back.4bpp.lz"); + const u32 gMonBackPic_Bastiodon[] = INCBIN_U32("graphics/pokemon/bastiodon/back.4bpp.smol"); const u16 gMonShinyPalette_Bastiodon[] = INCBIN_U16("graphics/pokemon/bastiodon/shiny.gbapal"); const u8 gMonIcon_Bastiodon[] = INCBIN_U8("graphics/pokemon/bastiodon/icon.4bpp"); #if P_FOOTPRINTS @@ -14459,24 +14459,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHIELDON #if P_FAMILY_BURMY - const u32 gMonFrontPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/anim_front.4bpp.smol"); const u16 gMonPalette_BurmyPlant[] = INCBIN_U16("graphics/pokemon/burmy/normal.gbapal"); - const u32 gMonBackPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/back.4bpp.lz"); + const u32 gMonBackPic_BurmyPlant[] = INCBIN_U32("graphics/pokemon/burmy/back.4bpp.smol"); const u16 gMonShinyPalette_BurmyPlant[] = INCBIN_U16("graphics/pokemon/burmy/shiny.gbapal"); const u8 gMonIcon_BurmyPlant[] = INCBIN_U8("graphics/pokemon/burmy/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Burmy[] = INCBIN_U8("graphics/pokemon/burmy/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/anim_front.4bpp.smol"); const u16 gMonPalette_BurmySandy[] = INCBIN_U16("graphics/pokemon/burmy/sandy/normal.gbapal"); - const u32 gMonBackPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/back.4bpp.lz"); + const u32 gMonBackPic_BurmySandy[] = INCBIN_U32("graphics/pokemon/burmy/sandy/back.4bpp.smol"); const u16 gMonShinyPalette_BurmySandy[] = INCBIN_U16("graphics/pokemon/burmy/sandy/shiny.gbapal"); const u8 gMonIcon_BurmySandy[] = INCBIN_U8("graphics/pokemon/burmy/sandy/icon.4bpp"); - const u32 gMonFrontPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/anim_front.4bpp.smol"); const u16 gMonPalette_BurmyTrash[] = INCBIN_U16("graphics/pokemon/burmy/trash/normal.gbapal"); - const u32 gMonBackPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/back.4bpp.lz"); + const u32 gMonBackPic_BurmyTrash[] = INCBIN_U32("graphics/pokemon/burmy/trash/back.4bpp.smol"); const u16 gMonShinyPalette_BurmyTrash[] = INCBIN_U16("graphics/pokemon/burmy/trash/shiny.gbapal"); const u8 gMonIcon_BurmyTrash[] = INCBIN_U8("graphics/pokemon/burmy/trash/icon.4bpp"); @@ -14494,24 +14494,24 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamPlant[] = INCBIN_U16("graphics/pokemon/wormadam/normal.gbapal"); - const u32 gMonBackPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/back.4bpp.lz"); + const u32 gMonBackPic_WormadamPlant[] = INCBIN_U32("graphics/pokemon/wormadam/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamPlant[] = INCBIN_U16("graphics/pokemon/wormadam/shiny.gbapal"); const u8 gMonIcon_WormadamPlant[] = INCBIN_U8("graphics/pokemon/wormadam/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Wormadam[] = INCBIN_U8("graphics/pokemon/wormadam/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamSandy[] = INCBIN_U16("graphics/pokemon/wormadam/sandy/normal.gbapal"); - const u32 gMonBackPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/back.4bpp.lz"); + const u32 gMonBackPic_WormadamSandy[] = INCBIN_U32("graphics/pokemon/wormadam/sandy/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamSandy[] = INCBIN_U16("graphics/pokemon/wormadam/sandy/shiny.gbapal"); const u8 gMonIcon_WormadamSandy[] = INCBIN_U8("graphics/pokemon/wormadam/sandy/icon.4bpp"); - const u32 gMonFrontPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/anim_front.4bpp.smol"); const u16 gMonPalette_WormadamTrash[] = INCBIN_U16("graphics/pokemon/wormadam/trash/normal.gbapal"); - const u32 gMonBackPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/back.4bpp.lz"); + const u32 gMonBackPic_WormadamTrash[] = INCBIN_U32("graphics/pokemon/wormadam/trash/back.4bpp.smol"); const u16 gMonShinyPalette_WormadamTrash[] = INCBIN_U16("graphics/pokemon/wormadam/trash/shiny.gbapal"); const u8 gMonIcon_WormadamTrash[] = INCBIN_U8("graphics/pokemon/wormadam/trash/icon.4bpp"); @@ -14529,9 +14529,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/anim_front.4bpp.smol"); const u16 gMonPalette_Mothim[] = INCBIN_U16("graphics/pokemon/mothim/normal.gbapal"); - const u32 gMonBackPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/back.4bpp.lz"); + const u32 gMonBackPic_Mothim[] = INCBIN_U32("graphics/pokemon/mothim/back.4bpp.smol"); const u16 gMonShinyPalette_Mothim[] = INCBIN_U16("graphics/pokemon/mothim/shiny.gbapal"); const u8 gMonIcon_Mothim[] = INCBIN_U8("graphics/pokemon/mothim/icon.4bpp"); #if P_FOOTPRINTS @@ -14547,9 +14547,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BURMY #if P_FAMILY_COMBEE - const u32 gMonFrontPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/anim_front.4bpp.smol"); const u16 gMonPalette_Combee[] = INCBIN_U16("graphics/pokemon/combee/normal.gbapal"); - const u32 gMonBackPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/back.4bpp.lz"); + const u32 gMonBackPic_Combee[] = INCBIN_U32("graphics/pokemon/combee/back.4bpp.smol"); const u16 gMonShinyPalette_Combee[] = INCBIN_U16("graphics/pokemon/combee/shiny.gbapal"); const u8 gMonIcon_Combee[] = INCBIN_U8("graphics/pokemon/combee/icon.4bpp"); #if P_FOOTPRINTS @@ -14571,9 +14571,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/anim_front.4bpp.smol"); const u16 gMonPalette_Vespiquen[] = INCBIN_U16("graphics/pokemon/vespiquen/normal.gbapal"); - const u32 gMonBackPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/back.4bpp.lz"); + const u32 gMonBackPic_Vespiquen[] = INCBIN_U32("graphics/pokemon/vespiquen/back.4bpp.smol"); const u16 gMonShinyPalette_Vespiquen[] = INCBIN_U16("graphics/pokemon/vespiquen/shiny.gbapal"); const u8 gMonIcon_Vespiquen[] = INCBIN_U8("graphics/pokemon/vespiquen/icon.4bpp"); #if P_FOOTPRINTS @@ -14589,9 +14589,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COMBEE #if P_FAMILY_PACHIRISU - const u32 gMonFrontPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_front.4bpp.smol"); const u16 gMonPalette_Pachirisu[] = INCBIN_U16("graphics/pokemon/pachirisu/normal.gbapal"); - const u32 gMonBackPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/back.4bpp.lz"); + const u32 gMonBackPic_Pachirisu[] = INCBIN_U32("graphics/pokemon/pachirisu/back.4bpp.smol"); const u16 gMonShinyPalette_Pachirisu[] = INCBIN_U16("graphics/pokemon/pachirisu/shiny.gbapal"); const u8 gMonIcon_Pachirisu[] = INCBIN_U8("graphics/pokemon/pachirisu/icon.4bpp"); #if P_FOOTPRINTS @@ -14606,7 +14606,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PachirisuF[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_PachirisuF[] = INCBIN_U32("graphics/pokemon/pachirisu/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PachirisuF[] = INCBIN_COMP("graphics/pokemon/pachirisu/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14614,9 +14614,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PACHIRISU #if P_FAMILY_BUIZEL - const u32 gMonFrontPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/anim_front.4bpp.smol"); const u16 gMonPalette_Buizel[] = INCBIN_U16("graphics/pokemon/buizel/normal.gbapal"); - const u32 gMonBackPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/back.4bpp.lz"); + const u32 gMonBackPic_Buizel[] = INCBIN_U32("graphics/pokemon/buizel/back.4bpp.smol"); const u16 gMonShinyPalette_Buizel[] = INCBIN_U16("graphics/pokemon/buizel/shiny.gbapal"); const u8 gMonIcon_Buizel[] = INCBIN_U8("graphics/pokemon/buizel/icon.4bpp"); #if P_FOOTPRINTS @@ -14631,15 +14631,15 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_BuizelF[] = INCBIN_U32("graphics/pokemon/buizel/backf.4bpp.lz"); + const u32 gMonBackPic_BuizelF[] = INCBIN_U32("graphics/pokemon/buizel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_BuizelF[] = INCBIN_COMP("graphics/pokemon/buizel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/anim_front.4bpp.smol"); const u16 gMonPalette_Floatzel[] = INCBIN_U16("graphics/pokemon/floatzel/normal.gbapal"); - const u32 gMonBackPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/back.4bpp.lz"); + const u32 gMonBackPic_Floatzel[] = INCBIN_U32("graphics/pokemon/floatzel/back.4bpp.smol"); const u16 gMonShinyPalette_Floatzel[] = INCBIN_U16("graphics/pokemon/floatzel/shiny.gbapal"); const u8 gMonIcon_Floatzel[] = INCBIN_U8("graphics/pokemon/floatzel/icon.4bpp"); #if P_FOOTPRINTS @@ -14654,7 +14654,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonBackPic_FloatzelF[] = INCBIN_U32("graphics/pokemon/floatzel/backf.4bpp.lz"); + const u32 gMonBackPic_FloatzelF[] = INCBIN_U32("graphics/pokemon/floatzel/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_FloatzelF[] = INCBIN_COMP("graphics/pokemon/floatzel/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -14662,9 +14662,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUIZEL #if P_FAMILY_CHERUBI - const u32 gMonFrontPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/anim_front.4bpp.smol"); const u16 gMonPalette_Cherubi[] = INCBIN_U16("graphics/pokemon/cherubi/normal.gbapal"); - const u32 gMonBackPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/back.4bpp.lz"); + const u32 gMonBackPic_Cherubi[] = INCBIN_U32("graphics/pokemon/cherubi/back.4bpp.smol"); const u16 gMonShinyPalette_Cherubi[] = INCBIN_U16("graphics/pokemon/cherubi/shiny.gbapal"); const u8 gMonIcon_Cherubi[] = INCBIN_U8("graphics/pokemon/cherubi/icon.4bpp"); #if P_FOOTPRINTS @@ -14678,18 +14678,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/anim_front.4bpp.smol"); const u16 gMonPalette_CherrimOvercast[] = INCBIN_U16("graphics/pokemon/cherrim/normal.gbapal"); - const u32 gMonBackPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/back.4bpp.lz"); + const u32 gMonBackPic_CherrimOvercast[] = INCBIN_U32("graphics/pokemon/cherrim/back.4bpp.smol"); const u16 gMonShinyPalette_CherrimOvercast[] = INCBIN_U16("graphics/pokemon/cherrim/shiny.gbapal"); const u8 gMonIcon_CherrimOvercast[] = INCBIN_U8("graphics/pokemon/cherrim/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Cherrim[] = INCBIN_U8("graphics/pokemon/cherrim/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/anim_front.4bpp.smol"); const u16 gMonPalette_CherrimSunshine[] = INCBIN_U16("graphics/pokemon/cherrim/sunshine/normal.gbapal"); - const u32 gMonBackPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/back.4bpp.lz"); + const u32 gMonBackPic_CherrimSunshine[] = INCBIN_U32("graphics/pokemon/cherrim/sunshine/back.4bpp.smol"); const u16 gMonShinyPalette_CherrimSunshine[] = INCBIN_U16("graphics/pokemon/cherrim/sunshine/shiny.gbapal"); const u8 gMonIcon_CherrimSunshine[] = INCBIN_U8("graphics/pokemon/cherrim/sunshine/icon.4bpp"); @@ -14706,18 +14706,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHERUBI #if P_FAMILY_SHELLOS - const u32 gMonFrontPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/anim_front.4bpp.smol"); const u16 gMonPalette_ShellosWestSea[] = INCBIN_U16("graphics/pokemon/shellos/normal.gbapal"); - const u32 gMonBackPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/back.4bpp.lz"); + const u32 gMonBackPic_ShellosWestSea[] = INCBIN_U32("graphics/pokemon/shellos/back.4bpp.smol"); const u16 gMonShinyPalette_ShellosWestSea[] = INCBIN_U16("graphics/pokemon/shellos/shiny.gbapal"); const u8 gMonIcon_ShellosWestSea[] = INCBIN_U8("graphics/pokemon/shellos/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Shellos[] = INCBIN_U8("graphics/pokemon/shellos/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/anim_front.4bpp.smol"); const u16 gMonPalette_ShellosEast[] = INCBIN_U16("graphics/pokemon/shellos/east/normal.gbapal"); - const u32 gMonBackPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/back.4bpp.lz"); + const u32 gMonBackPic_ShellosEast[] = INCBIN_U32("graphics/pokemon/shellos/east/back.4bpp.smol"); const u16 gMonShinyPalette_ShellosEast[] = INCBIN_U16("graphics/pokemon/shellos/east/shiny.gbapal"); const u8 gMonIcon_ShellosEast[] = INCBIN_U8("graphics/pokemon/shellos/east/icon.4bpp"); @@ -14732,18 +14732,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/anim_front.4bpp.smol"); const u16 gMonPalette_GastrodonWestSea[] = INCBIN_U16("graphics/pokemon/gastrodon/normal.gbapal"); - const u32 gMonBackPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/back.4bpp.lz"); + const u32 gMonBackPic_GastrodonWestSea[] = INCBIN_U32("graphics/pokemon/gastrodon/back.4bpp.smol"); const u16 gMonShinyPalette_GastrodonWestSea[] = INCBIN_U16("graphics/pokemon/gastrodon/shiny.gbapal"); const u8 gMonIcon_GastrodonWestSea[] = INCBIN_U8("graphics/pokemon/gastrodon/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Gastrodon[] = INCBIN_U8("graphics/pokemon/gastrodon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/anim_front.4bpp.smol"); const u16 gMonPalette_GastrodonEast[] = INCBIN_U16("graphics/pokemon/gastrodon/east/normal.gbapal"); - const u32 gMonBackPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/back.4bpp.lz"); + const u32 gMonBackPic_GastrodonEast[] = INCBIN_U32("graphics/pokemon/gastrodon/east/back.4bpp.smol"); const u16 gMonShinyPalette_GastrodonEast[] = INCBIN_U16("graphics/pokemon/gastrodon/east/shiny.gbapal"); const u8 gMonIcon_GastrodonEast[] = INCBIN_U8("graphics/pokemon/gastrodon/east/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -14759,9 +14759,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHELLOS #if P_FAMILY_DRIFLOON - const u32 gMonFrontPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/anim_front.4bpp.smol"); const u16 gMonPalette_Drifloon[] = INCBIN_U16("graphics/pokemon/drifloon/normal.gbapal"); - const u32 gMonBackPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/back.4bpp.lz"); + const u32 gMonBackPic_Drifloon[] = INCBIN_U32("graphics/pokemon/drifloon/back.4bpp.smol"); const u16 gMonShinyPalette_Drifloon[] = INCBIN_U16("graphics/pokemon/drifloon/shiny.gbapal"); const u8 gMonIcon_Drifloon[] = INCBIN_U8("graphics/pokemon/drifloon/icon.4bpp"); #if P_FOOTPRINTS @@ -14775,9 +14775,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/anim_front.4bpp.smol"); const u16 gMonPalette_Drifblim[] = INCBIN_U16("graphics/pokemon/drifblim/normal.gbapal"); - const u32 gMonBackPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/back.4bpp.lz"); + const u32 gMonBackPic_Drifblim[] = INCBIN_U32("graphics/pokemon/drifblim/back.4bpp.smol"); const u16 gMonShinyPalette_Drifblim[] = INCBIN_U16("graphics/pokemon/drifblim/shiny.gbapal"); const u8 gMonIcon_Drifblim[] = INCBIN_U8("graphics/pokemon/drifblim/icon.4bpp"); #if P_FOOTPRINTS @@ -14793,9 +14793,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRIFLOON #if P_FAMILY_BUNEARY - const u32 gMonFrontPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/anim_front.4bpp.smol"); const u16 gMonPalette_Buneary[] = INCBIN_U16("graphics/pokemon/buneary/normal.gbapal"); - const u32 gMonBackPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/back.4bpp.lz"); + const u32 gMonBackPic_Buneary[] = INCBIN_U32("graphics/pokemon/buneary/back.4bpp.smol"); const u16 gMonShinyPalette_Buneary[] = INCBIN_U16("graphics/pokemon/buneary/shiny.gbapal"); const u8 gMonIcon_Buneary[] = INCBIN_U8("graphics/pokemon/buneary/icon.4bpp"); #if P_FOOTPRINTS @@ -14809,9 +14809,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/anim_front.4bpp.smol"); const u16 gMonPalette_Lopunny[] = INCBIN_U16("graphics/pokemon/lopunny/normal.gbapal"); - const u32 gMonBackPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/back.4bpp.lz"); + const u32 gMonBackPic_Lopunny[] = INCBIN_U32("graphics/pokemon/lopunny/back.4bpp.smol"); const u16 gMonShinyPalette_Lopunny[] = INCBIN_U16("graphics/pokemon/lopunny/shiny.gbapal"); const u8 gMonIcon_Lopunny[] = INCBIN_U8("graphics/pokemon/lopunny/icon.4bpp"); #if P_FOOTPRINTS @@ -14826,9 +14826,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/front.4bpp.smol"); const u16 gMonPalette_LopunnyMega[] = INCBIN_U16("graphics/pokemon/lopunny/mega/normal.gbapal"); - const u32 gMonBackPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/back.4bpp.lz"); + const u32 gMonBackPic_LopunnyMega[] = INCBIN_U32("graphics/pokemon/lopunny/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LopunnyMega[] = INCBIN_U16("graphics/pokemon/lopunny/mega/shiny.gbapal"); const u8 gMonIcon_LopunnyMega[] = INCBIN_U8("graphics/pokemon/lopunny/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -14842,9 +14842,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUNEARY #if P_FAMILY_GLAMEOW - const u32 gMonFrontPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/anim_front.4bpp.smol"); const u16 gMonPalette_Glameow[] = INCBIN_U16("graphics/pokemon/glameow/normal.gbapal"); - const u32 gMonBackPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/back.4bpp.lz"); + const u32 gMonBackPic_Glameow[] = INCBIN_U32("graphics/pokemon/glameow/back.4bpp.smol"); const u16 gMonShinyPalette_Glameow[] = INCBIN_U16("graphics/pokemon/glameow/shiny.gbapal"); const u8 gMonIcon_Glameow[] = INCBIN_U8("graphics/pokemon/glameow/icon.4bpp"); #if P_FOOTPRINTS @@ -14858,9 +14858,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/anim_front.4bpp.smol"); const u16 gMonPalette_Purugly[] = INCBIN_U16("graphics/pokemon/purugly/normal.gbapal"); - const u32 gMonBackPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/back.4bpp.lz"); + const u32 gMonBackPic_Purugly[] = INCBIN_U32("graphics/pokemon/purugly/back.4bpp.smol"); const u16 gMonShinyPalette_Purugly[] = INCBIN_U16("graphics/pokemon/purugly/shiny.gbapal"); const u8 gMonIcon_Purugly[] = INCBIN_U8("graphics/pokemon/purugly/icon.4bpp"); #if P_FOOTPRINTS @@ -14876,9 +14876,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLAMEOW #if P_FAMILY_STUNKY - const u32 gMonFrontPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/anim_front.4bpp.smol"); const u16 gMonPalette_Stunky[] = INCBIN_U16("graphics/pokemon/stunky/normal.gbapal"); - const u32 gMonBackPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/back.4bpp.lz"); + const u32 gMonBackPic_Stunky[] = INCBIN_U32("graphics/pokemon/stunky/back.4bpp.smol"); const u16 gMonShinyPalette_Stunky[] = INCBIN_U16("graphics/pokemon/stunky/shiny.gbapal"); const u8 gMonIcon_Stunky[] = INCBIN_U8("graphics/pokemon/stunky/icon.4bpp"); #if P_FOOTPRINTS @@ -14892,9 +14892,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/anim_front.4bpp.smol"); const u16 gMonPalette_Skuntank[] = INCBIN_U16("graphics/pokemon/skuntank/normal.gbapal"); - const u32 gMonBackPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/back.4bpp.lz"); + const u32 gMonBackPic_Skuntank[] = INCBIN_U32("graphics/pokemon/skuntank/back.4bpp.smol"); const u16 gMonShinyPalette_Skuntank[] = INCBIN_U16("graphics/pokemon/skuntank/shiny.gbapal"); const u8 gMonIcon_Skuntank[] = INCBIN_U8("graphics/pokemon/skuntank/icon.4bpp"); #if P_FOOTPRINTS @@ -14910,9 +14910,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUNKY #if P_FAMILY_BRONZOR - const u32 gMonFrontPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/anim_front.4bpp.smol"); const u16 gMonPalette_Bronzor[] = INCBIN_U16("graphics/pokemon/bronzor/normal.gbapal"); - const u32 gMonBackPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/back.4bpp.lz"); + const u32 gMonBackPic_Bronzor[] = INCBIN_U32("graphics/pokemon/bronzor/back.4bpp.smol"); const u16 gMonShinyPalette_Bronzor[] = INCBIN_U16("graphics/pokemon/bronzor/shiny.gbapal"); const u8 gMonIcon_Bronzor[] = INCBIN_U8("graphics/pokemon/bronzor/icon.4bpp"); #if P_FOOTPRINTS @@ -14926,9 +14926,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/anim_front.4bpp.smol"); const u16 gMonPalette_Bronzong[] = INCBIN_U16("graphics/pokemon/bronzong/normal.gbapal"); - const u32 gMonBackPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/back.4bpp.lz"); + const u32 gMonBackPic_Bronzong[] = INCBIN_U32("graphics/pokemon/bronzong/back.4bpp.smol"); const u16 gMonShinyPalette_Bronzong[] = INCBIN_U16("graphics/pokemon/bronzong/shiny.gbapal"); const u8 gMonIcon_Bronzong[] = INCBIN_U8("graphics/pokemon/bronzong/icon.4bpp"); #if P_FOOTPRINTS @@ -14944,9 +14944,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRONZOR #if P_FAMILY_CHATOT - const u32 gMonFrontPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/anim_front.4bpp.smol"); const u16 gMonPalette_Chatot[] = INCBIN_U16("graphics/pokemon/chatot/normal.gbapal"); - const u32 gMonBackPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/back.4bpp.lz"); + const u32 gMonBackPic_Chatot[] = INCBIN_U32("graphics/pokemon/chatot/back.4bpp.smol"); const u16 gMonShinyPalette_Chatot[] = INCBIN_U16("graphics/pokemon/chatot/shiny.gbapal"); const u8 gMonIcon_Chatot[] = INCBIN_U8("graphics/pokemon/chatot/icon.4bpp"); #if P_FOOTPRINTS @@ -14962,9 +14962,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHATOT #if P_FAMILY_SPIRITOMB - const u32 gMonFrontPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/anim_front.4bpp.smol"); const u16 gMonPalette_Spiritomb[] = INCBIN_U16("graphics/pokemon/spiritomb/normal.gbapal"); - const u32 gMonBackPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/back.4bpp.lz"); + const u32 gMonBackPic_Spiritomb[] = INCBIN_U32("graphics/pokemon/spiritomb/back.4bpp.smol"); const u16 gMonShinyPalette_Spiritomb[] = INCBIN_U16("graphics/pokemon/spiritomb/shiny.gbapal"); const u8 gMonIcon_Spiritomb[] = INCBIN_U8("graphics/pokemon/spiritomb/icon.4bpp"); #if P_FOOTPRINTS @@ -14980,9 +14980,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPIRITOMB #if P_FAMILY_GIBLE - const u32 gMonFrontPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/anim_front.4bpp.smol"); const u16 gMonPalette_Gible[] = INCBIN_U16("graphics/pokemon/gible/normal.gbapal"); - const u32 gMonBackPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/back.4bpp.lz"); + const u32 gMonBackPic_Gible[] = INCBIN_U32("graphics/pokemon/gible/back.4bpp.smol"); const u16 gMonShinyPalette_Gible[] = INCBIN_U16("graphics/pokemon/gible/shiny.gbapal"); const u8 gMonIcon_Gible[] = INCBIN_U8("graphics/pokemon/gible/icon.4bpp"); #if P_FOOTPRINTS @@ -14997,16 +14997,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/backf.4bpp.lz"); + const u32 gMonFrontPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GibleF[] = INCBIN_U32("graphics/pokemon/gible/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GibleF[] = INCBIN_COMP("graphics/pokemon/gible/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/anim_front.4bpp.smol"); const u16 gMonPalette_Gabite[] = INCBIN_U16("graphics/pokemon/gabite/normal.gbapal"); - const u32 gMonBackPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/back.4bpp.lz"); + const u32 gMonBackPic_Gabite[] = INCBIN_U32("graphics/pokemon/gabite/back.4bpp.smol"); const u16 gMonShinyPalette_Gabite[] = INCBIN_U16("graphics/pokemon/gabite/shiny.gbapal"); const u8 gMonIcon_Gabite[] = INCBIN_U8("graphics/pokemon/gabite/icon.4bpp"); #if P_FOOTPRINTS @@ -15021,16 +15021,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/backf.4bpp.lz"); + const u32 gMonFrontPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_GabiteF[] = INCBIN_U32("graphics/pokemon/gabite/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GabiteF[] = INCBIN_COMP("graphics/pokemon/gabite/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/anim_front.4bpp.smol"); const u16 gMonPalette_Garchomp[] = INCBIN_U16("graphics/pokemon/garchomp/normal.gbapal"); - const u32 gMonBackPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/back.4bpp.lz"); + const u32 gMonBackPic_Garchomp[] = INCBIN_U32("graphics/pokemon/garchomp/back.4bpp.smol"); const u16 gMonShinyPalette_Garchomp[] = INCBIN_U16("graphics/pokemon/garchomp/shiny.gbapal"); const u8 gMonIcon_Garchomp[] = INCBIN_U8("graphics/pokemon/garchomp/icon.4bpp"); #if P_FOOTPRINTS @@ -15045,16 +15045,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_GarchompF[] = INCBIN_U32("graphics/pokemon/garchomp/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_GarchompF[] = INCBIN_U32("graphics/pokemon/garchomp/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_GarchompF[] = INCBIN_COMP("graphics/pokemon/garchomp/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/front.4bpp.lz"); + const u32 gMonFrontPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/front.4bpp.smol"); const u16 gMonPalette_GarchompMega[] = INCBIN_U16("graphics/pokemon/garchomp/mega/normal.gbapal"); - const u32 gMonBackPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/back.4bpp.lz"); + const u32 gMonBackPic_GarchompMega[] = INCBIN_U32("graphics/pokemon/garchomp/mega/back.4bpp.smol"); const u16 gMonShinyPalette_GarchompMega[] = INCBIN_U16("graphics/pokemon/garchomp/mega/shiny.gbapal"); const u8 gMonIcon_GarchompMega[] = INCBIN_U8("graphics/pokemon/garchomp/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15068,9 +15068,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIBLE #if P_FAMILY_RIOLU - const u32 gMonFrontPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/anim_front.4bpp.smol"); const u16 gMonPalette_Riolu[] = INCBIN_U16("graphics/pokemon/riolu/normal.gbapal"); - const u32 gMonBackPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/back.4bpp.lz"); + const u32 gMonBackPic_Riolu[] = INCBIN_U32("graphics/pokemon/riolu/back.4bpp.smol"); const u16 gMonShinyPalette_Riolu[] = INCBIN_U16("graphics/pokemon/riolu/shiny.gbapal"); const u8 gMonIcon_Riolu[] = INCBIN_U8("graphics/pokemon/riolu/icon.4bpp"); #if P_FOOTPRINTS @@ -15084,9 +15084,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/anim_front.4bpp.smol"); const u16 gMonPalette_Lucario[] = INCBIN_U16("graphics/pokemon/lucario/normal.gbapal"); - const u32 gMonBackPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/back.4bpp.lz"); + const u32 gMonBackPic_Lucario[] = INCBIN_U32("graphics/pokemon/lucario/back.4bpp.smol"); const u16 gMonShinyPalette_Lucario[] = INCBIN_U16("graphics/pokemon/lucario/shiny.gbapal"); const u8 gMonIcon_Lucario[] = INCBIN_U8("graphics/pokemon/lucario/icon.4bpp"); #if P_FOOTPRINTS @@ -15101,9 +15101,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/front.4bpp.lz"); + const u32 gMonFrontPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/front.4bpp.smol"); const u16 gMonPalette_LucarioMega[] = INCBIN_U16("graphics/pokemon/lucario/mega/normal.gbapal"); - const u32 gMonBackPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/back.4bpp.lz"); + const u32 gMonBackPic_LucarioMega[] = INCBIN_U32("graphics/pokemon/lucario/mega/back.4bpp.smol"); const u16 gMonShinyPalette_LucarioMega[] = INCBIN_U16("graphics/pokemon/lucario/mega/shiny.gbapal"); const u8 gMonIcon_LucarioMega[] = INCBIN_U8("graphics/pokemon/lucario/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15117,9 +15117,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RIOLU #if P_FAMILY_HIPPOPOTAS - const u32 gMonFrontPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/anim_front.4bpp.smol"); const u16 gMonPalette_Hippopotas[] = INCBIN_U16("graphics/pokemon/hippopotas/normal.gbapal"); - const u32 gMonBackPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/back.4bpp.lz"); + const u32 gMonBackPic_Hippopotas[] = INCBIN_U32("graphics/pokemon/hippopotas/back.4bpp.smol"); const u16 gMonShinyPalette_Hippopotas[] = INCBIN_U16("graphics/pokemon/hippopotas/shiny.gbapal"); const u8 gMonIcon_Hippopotas[] = INCBIN_U8("graphics/pokemon/hippopotas/icon.4bpp"); #if P_FOOTPRINTS @@ -15144,9 +15144,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/anim_front.4bpp.smol"); const u16 gMonPalette_Hippowdon[] = INCBIN_U16("graphics/pokemon/hippowdon/normal.gbapal"); - const u32 gMonBackPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/back.4bpp.lz"); + const u32 gMonBackPic_Hippowdon[] = INCBIN_U32("graphics/pokemon/hippowdon/back.4bpp.smol"); const u16 gMonShinyPalette_Hippowdon[] = INCBIN_U16("graphics/pokemon/hippowdon/shiny.gbapal"); const u8 gMonIcon_Hippowdon[] = INCBIN_U8("graphics/pokemon/hippowdon/icon.4bpp"); #if P_FOOTPRINTS @@ -15176,9 +15176,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HIPPOPOTAS #if P_FAMILY_SKORUPI - const u32 gMonFrontPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/anim_front.4bpp.smol"); const u16 gMonPalette_Skorupi[] = INCBIN_U16("graphics/pokemon/skorupi/normal.gbapal"); - const u32 gMonBackPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/back.4bpp.lz"); + const u32 gMonBackPic_Skorupi[] = INCBIN_U32("graphics/pokemon/skorupi/back.4bpp.smol"); const u16 gMonShinyPalette_Skorupi[] = INCBIN_U16("graphics/pokemon/skorupi/shiny.gbapal"); const u8 gMonIcon_Skorupi[] = INCBIN_U8("graphics/pokemon/skorupi/icon.4bpp"); #if P_FOOTPRINTS @@ -15192,9 +15192,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/anim_front.4bpp.smol"); const u16 gMonPalette_Drapion[] = INCBIN_U16("graphics/pokemon/drapion/normal.gbapal"); - const u32 gMonBackPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/back.4bpp.lz"); + const u32 gMonBackPic_Drapion[] = INCBIN_U32("graphics/pokemon/drapion/back.4bpp.smol"); const u16 gMonShinyPalette_Drapion[] = INCBIN_U16("graphics/pokemon/drapion/shiny.gbapal"); const u8 gMonIcon_Drapion[] = INCBIN_U8("graphics/pokemon/drapion/icon.4bpp"); #if P_FOOTPRINTS @@ -15210,9 +15210,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKORUPI #if P_FAMILY_CROAGUNK - const u32 gMonFrontPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/anim_front.4bpp.smol"); const u16 gMonPalette_Croagunk[] = INCBIN_U16("graphics/pokemon/croagunk/normal.gbapal"); - const u32 gMonBackPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/back.4bpp.lz"); + const u32 gMonBackPic_Croagunk[] = INCBIN_U32("graphics/pokemon/croagunk/back.4bpp.smol"); const u16 gMonShinyPalette_Croagunk[] = INCBIN_U16("graphics/pokemon/croagunk/shiny.gbapal"); const u8 gMonIcon_Croagunk[] = INCBIN_U8("graphics/pokemon/croagunk/icon.4bpp"); #if P_FOOTPRINTS @@ -15227,16 +15227,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/backf.4bpp.lz"); + const u32 gMonFrontPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_CroagunkF[] = INCBIN_U32("graphics/pokemon/croagunk/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_CroagunkF[] = INCBIN_COMP("graphics/pokemon/croagunk/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_front.4bpp.smol"); const u16 gMonPalette_Toxicroak[] = INCBIN_U16("graphics/pokemon/toxicroak/normal.gbapal"); - const u32 gMonBackPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/back.4bpp.lz"); + const u32 gMonBackPic_Toxicroak[] = INCBIN_U32("graphics/pokemon/toxicroak/back.4bpp.smol"); const u16 gMonShinyPalette_Toxicroak[] = INCBIN_U16("graphics/pokemon/toxicroak/shiny.gbapal"); const u8 gMonIcon_Toxicroak[] = INCBIN_U8("graphics/pokemon/toxicroak/icon.4bpp"); #if P_FOOTPRINTS @@ -15251,8 +15251,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/backf.4bpp.lz"); + const u32 gMonFrontPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_ToxicroakF[] = INCBIN_U32("graphics/pokemon/toxicroak/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_ToxicroakF[] = INCBIN_COMP("graphics/pokemon/toxicroak/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -15260,9 +15260,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CROAGUNK #if P_FAMILY_CARNIVINE - const u32 gMonFrontPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/anim_front.4bpp.smol"); const u16 gMonPalette_Carnivine[] = INCBIN_U16("graphics/pokemon/carnivine/normal.gbapal"); - const u32 gMonBackPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/back.4bpp.lz"); + const u32 gMonBackPic_Carnivine[] = INCBIN_U32("graphics/pokemon/carnivine/back.4bpp.smol"); const u16 gMonShinyPalette_Carnivine[] = INCBIN_U16("graphics/pokemon/carnivine/shiny.gbapal"); const u8 gMonIcon_Carnivine[] = INCBIN_U8("graphics/pokemon/carnivine/icon.4bpp"); #if P_FOOTPRINTS @@ -15278,9 +15278,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CARNIVINE #if P_FAMILY_FINNEON - const u32 gMonFrontPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/anim_front.4bpp.smol"); const u16 gMonPalette_Finneon[] = INCBIN_U16("graphics/pokemon/finneon/normal.gbapal"); - const u32 gMonBackPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/back.4bpp.lz"); + const u32 gMonBackPic_Finneon[] = INCBIN_U32("graphics/pokemon/finneon/back.4bpp.smol"); const u16 gMonShinyPalette_Finneon[] = INCBIN_U16("graphics/pokemon/finneon/shiny.gbapal"); const u8 gMonIcon_Finneon[] = INCBIN_U8("graphics/pokemon/finneon/icon.4bpp"); #if P_FOOTPRINTS @@ -15295,16 +15295,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/backf.4bpp.lz"); + const u32 gMonFrontPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_FinneonF[] = INCBIN_U32("graphics/pokemon/finneon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_FinneonF[] = INCBIN_COMP("graphics/pokemon/finneon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/anim_front.4bpp.smol"); const u16 gMonPalette_Lumineon[] = INCBIN_U16("graphics/pokemon/lumineon/normal.gbapal"); - const u32 gMonBackPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/back.4bpp.lz"); + const u32 gMonBackPic_Lumineon[] = INCBIN_U32("graphics/pokemon/lumineon/back.4bpp.smol"); const u16 gMonShinyPalette_Lumineon[] = INCBIN_U16("graphics/pokemon/lumineon/shiny.gbapal"); const u8 gMonIcon_Lumineon[] = INCBIN_U8("graphics/pokemon/lumineon/icon.4bpp"); #if P_FOOTPRINTS @@ -15319,8 +15319,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/backf.4bpp.lz"); + const u32 gMonFrontPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_LumineonF[] = INCBIN_U32("graphics/pokemon/lumineon/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_LumineonF[] = INCBIN_COMP("graphics/pokemon/lumineon/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS @@ -15328,9 +15328,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FINNEON #if P_FAMILY_SNOVER - const u32 gMonFrontPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/anim_front.4bpp.smol"); const u16 gMonPalette_Snover[] = INCBIN_U16("graphics/pokemon/snover/normal.gbapal"); - const u32 gMonBackPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/back.4bpp.lz"); + const u32 gMonBackPic_Snover[] = INCBIN_U32("graphics/pokemon/snover/back.4bpp.smol"); const u16 gMonShinyPalette_Snover[] = INCBIN_U16("graphics/pokemon/snover/shiny.gbapal"); const u8 gMonIcon_Snover[] = INCBIN_U8("graphics/pokemon/snover/icon.4bpp"); #if P_FOOTPRINTS @@ -15345,16 +15345,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/backf.4bpp.lz"); + const u32 gMonFrontPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_SnoverF[] = INCBIN_U32("graphics/pokemon/snover/backf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_SnoverF[] = INCBIN_COMP("graphics/pokemon/snover/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_front.4bpp.smol"); const u16 gMonPalette_Abomasnow[] = INCBIN_U16("graphics/pokemon/abomasnow/normal.gbapal"); - const u32 gMonBackPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/back.4bpp.lz"); + const u32 gMonBackPic_Abomasnow[] = INCBIN_U32("graphics/pokemon/abomasnow/back.4bpp.smol"); const u16 gMonShinyPalette_Abomasnow[] = INCBIN_U16("graphics/pokemon/abomasnow/shiny.gbapal"); const u8 gMonIcon_Abomasnow[] = INCBIN_U8("graphics/pokemon/abomasnow/icon.4bpp"); #if P_FOOTPRINTS @@ -15369,16 +15369,16 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_AbomasnowF[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_AbomasnowF[] = INCBIN_U32("graphics/pokemon/abomasnow/anim_frontf.4bpp.smol"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_AbomasnowF[] = INCBIN_COMP("graphics/pokemon/abomasnow/overworldf.4bpp"); #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/front.4bpp.smol"); const u16 gMonPalette_AbomasnowMega[] = INCBIN_U16("graphics/pokemon/abomasnow/mega/normal.gbapal"); - const u32 gMonBackPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/back.4bpp.lz"); + const u32 gMonBackPic_AbomasnowMega[] = INCBIN_U32("graphics/pokemon/abomasnow/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AbomasnowMega[] = INCBIN_U16("graphics/pokemon/abomasnow/mega/shiny.gbapal"); const u8 gMonIcon_AbomasnowMega[] = INCBIN_U8("graphics/pokemon/abomasnow/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -15392,42 +15392,42 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNOVER #if P_FAMILY_ROTOM - const u32 gMonFrontPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/anim_front.4bpp.smol"); const u16 gMonPalette_Rotom[] = INCBIN_U16("graphics/pokemon/rotom/normal.gbapal"); - const u32 gMonBackPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/back.4bpp.lz"); + const u32 gMonBackPic_Rotom[] = INCBIN_U32("graphics/pokemon/rotom/back.4bpp.smol"); const u16 gMonShinyPalette_Rotom[] = INCBIN_U16("graphics/pokemon/rotom/shiny.gbapal"); const u8 gMonIcon_Rotom[] = INCBIN_U8("graphics/pokemon/rotom/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Rotom[] = INCBIN_U8("graphics/pokemon/rotom/normal/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/anim_front.4bpp.smol"); const u16 gMonPalette_RotomHeat[] = INCBIN_U16("graphics/pokemon/rotom/heat/normal.gbapal"); - const u32 gMonBackPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/back.4bpp.lz"); + const u32 gMonBackPic_RotomHeat[] = INCBIN_U32("graphics/pokemon/rotom/heat/back.4bpp.smol"); const u16 gMonShinyPalette_RotomHeat[] = INCBIN_U16("graphics/pokemon/rotom/heat/shiny.gbapal"); const u8 gMonIcon_RotomHeat[] = INCBIN_U8("graphics/pokemon/rotom/heat/icon.4bpp"); - const u32 gMonFrontPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/anim_front.4bpp.smol"); const u16 gMonPalette_RotomWash[] = INCBIN_U16("graphics/pokemon/rotom/wash/normal.gbapal"); - const u32 gMonBackPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/back.4bpp.lz"); + const u32 gMonBackPic_RotomWash[] = INCBIN_U32("graphics/pokemon/rotom/wash/back.4bpp.smol"); const u16 gMonShinyPalette_RotomWash[] = INCBIN_U16("graphics/pokemon/rotom/wash/shiny.gbapal"); const u8 gMonIcon_RotomWash[] = INCBIN_U8("graphics/pokemon/rotom/wash/icon.4bpp"); - const u32 gMonFrontPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/anim_front.4bpp.smol"); const u16 gMonPalette_RotomFrost[] = INCBIN_U16("graphics/pokemon/rotom/frost/normal.gbapal"); - const u32 gMonBackPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/back.4bpp.lz"); + const u32 gMonBackPic_RotomFrost[] = INCBIN_U32("graphics/pokemon/rotom/frost/back.4bpp.smol"); const u16 gMonShinyPalette_RotomFrost[] = INCBIN_U16("graphics/pokemon/rotom/frost/shiny.gbapal"); const u8 gMonIcon_RotomFrost[] = INCBIN_U8("graphics/pokemon/rotom/frost/icon.4bpp"); - const u32 gMonFrontPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/anim_front.4bpp.smol"); const u16 gMonPalette_RotomFan[] = INCBIN_U16("graphics/pokemon/rotom/fan/normal.gbapal"); - const u32 gMonBackPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/back.4bpp.lz"); + const u32 gMonBackPic_RotomFan[] = INCBIN_U32("graphics/pokemon/rotom/fan/back.4bpp.smol"); const u16 gMonShinyPalette_RotomFan[] = INCBIN_U16("graphics/pokemon/rotom/fan/shiny.gbapal"); const u8 gMonIcon_RotomFan[] = INCBIN_U8("graphics/pokemon/rotom/fan/icon.4bpp"); - const u32 gMonFrontPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/anim_front.4bpp.smol"); const u16 gMonPalette_RotomMow[] = INCBIN_U16("graphics/pokemon/rotom/mow/normal.gbapal"); - const u32 gMonBackPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/back.4bpp.lz"); + const u32 gMonBackPic_RotomMow[] = INCBIN_U32("graphics/pokemon/rotom/mow/back.4bpp.smol"); const u16 gMonShinyPalette_RotomMow[] = INCBIN_U16("graphics/pokemon/rotom/mow/shiny.gbapal"); const u8 gMonIcon_RotomMow[] = INCBIN_U8("graphics/pokemon/rotom/mow/icon.4bpp"); @@ -15456,9 +15456,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROTOM #if P_FAMILY_UXIE - const u32 gMonFrontPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/anim_front.4bpp.smol"); const u16 gMonPalette_Uxie[] = INCBIN_U16("graphics/pokemon/uxie/normal.gbapal"); - const u32 gMonBackPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/back.4bpp.lz"); + const u32 gMonBackPic_Uxie[] = INCBIN_U32("graphics/pokemon/uxie/back.4bpp.smol"); const u16 gMonShinyPalette_Uxie[] = INCBIN_U16("graphics/pokemon/uxie/shiny.gbapal"); const u8 gMonIcon_Uxie[] = INCBIN_U8("graphics/pokemon/uxie/icon.4bpp"); #if P_FOOTPRINTS @@ -15474,9 +15474,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_UXIE #if P_FAMILY_MESPRIT - const u32 gMonFrontPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/anim_front.4bpp.smol"); const u16 gMonPalette_Mesprit[] = INCBIN_U16("graphics/pokemon/mesprit/normal.gbapal"); - const u32 gMonBackPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/back.4bpp.lz"); + const u32 gMonBackPic_Mesprit[] = INCBIN_U32("graphics/pokemon/mesprit/back.4bpp.smol"); const u16 gMonShinyPalette_Mesprit[] = INCBIN_U16("graphics/pokemon/mesprit/shiny.gbapal"); const u8 gMonIcon_Mesprit[] = INCBIN_U8("graphics/pokemon/mesprit/icon.4bpp"); #if P_FOOTPRINTS @@ -15492,9 +15492,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MESPRIT #if P_FAMILY_AZELF - const u32 gMonFrontPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/anim_front.4bpp.smol"); const u16 gMonPalette_Azelf[] = INCBIN_U16("graphics/pokemon/azelf/normal.gbapal"); - const u32 gMonBackPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/back.4bpp.lz"); + const u32 gMonBackPic_Azelf[] = INCBIN_U32("graphics/pokemon/azelf/back.4bpp.smol"); const u16 gMonShinyPalette_Azelf[] = INCBIN_U16("graphics/pokemon/azelf/shiny.gbapal"); const u8 gMonIcon_Azelf[] = INCBIN_U8("graphics/pokemon/azelf/icon.4bpp"); #if P_FOOTPRINTS @@ -15510,9 +15510,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AZELF #if P_FAMILY_DIALGA - const u32 gMonFrontPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/anim_front.4bpp.smol"); const u16 gMonPalette_Dialga[] = INCBIN_U16("graphics/pokemon/dialga/normal.gbapal"); - const u32 gMonBackPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/back.4bpp.lz"); + const u32 gMonBackPic_Dialga[] = INCBIN_U32("graphics/pokemon/dialga/back.4bpp.smol"); const u16 gMonShinyPalette_Dialga[] = INCBIN_U16("graphics/pokemon/dialga/shiny.gbapal"); const u8 gMonIcon_Dialga[] = INCBIN_U8("graphics/pokemon/dialga/icon.4bpp"); #if P_FOOTPRINTS @@ -15526,9 +15526,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/front.4bpp.lz"); + const u32 gMonFrontPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/front.4bpp.smol"); const u16 gMonPalette_DialgaOrigin[] = INCBIN_U16("graphics/pokemon/dialga/origin/normal.gbapal"); - const u32 gMonBackPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/back.4bpp.lz"); + const u32 gMonBackPic_DialgaOrigin[] = INCBIN_U32("graphics/pokemon/dialga/origin/back.4bpp.smol"); const u16 gMonShinyPalette_DialgaOrigin[] = INCBIN_U16("graphics/pokemon/dialga/origin/shiny.gbapal"); const u8 gMonIcon_DialgaOrigin[] = INCBIN_U8("graphics/pokemon/dialga/origin/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15541,9 +15541,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DIALGA #if P_FAMILY_PALKIA - const u32 gMonFrontPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/anim_front.4bpp.smol"); const u16 gMonPalette_Palkia[] = INCBIN_U16("graphics/pokemon/palkia/normal.gbapal"); - const u32 gMonBackPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/back.4bpp.lz"); + const u32 gMonBackPic_Palkia[] = INCBIN_U32("graphics/pokemon/palkia/back.4bpp.smol"); const u16 gMonShinyPalette_Palkia[] = INCBIN_U16("graphics/pokemon/palkia/shiny.gbapal"); const u8 gMonIcon_Palkia[] = INCBIN_U8("graphics/pokemon/palkia/icon.4bpp"); #if P_FOOTPRINTS @@ -15557,9 +15557,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/front.4bpp.lz"); + const u32 gMonFrontPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/front.4bpp.smol"); const u16 gMonPalette_PalkiaOrigin[] = INCBIN_U16("graphics/pokemon/palkia/origin/normal.gbapal"); - const u32 gMonBackPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/back.4bpp.lz"); + const u32 gMonBackPic_PalkiaOrigin[] = INCBIN_U32("graphics/pokemon/palkia/origin/back.4bpp.smol"); const u16 gMonShinyPalette_PalkiaOrigin[] = INCBIN_U16("graphics/pokemon/palkia/origin/shiny.gbapal"); const u8 gMonIcon_PalkiaOrigin[] = INCBIN_U8("graphics/pokemon/palkia/origin/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15572,9 +15572,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PALKIA #if P_FAMILY_HEATRAN - const u32 gMonFrontPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/anim_front.4bpp.smol"); const u16 gMonPalette_Heatran[] = INCBIN_U16("graphics/pokemon/heatran/normal.gbapal"); - const u32 gMonBackPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/back.4bpp.lz"); + const u32 gMonBackPic_Heatran[] = INCBIN_U32("graphics/pokemon/heatran/back.4bpp.smol"); const u16 gMonShinyPalette_Heatran[] = INCBIN_U16("graphics/pokemon/heatran/shiny.gbapal"); const u8 gMonIcon_Heatran[] = INCBIN_U8("graphics/pokemon/heatran/icon.4bpp"); #if P_FOOTPRINTS @@ -15590,9 +15590,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HEATRAN #if P_FAMILY_REGIGIGAS - const u32 gMonFrontPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/anim_front.4bpp.smol"); const u16 gMonPalette_Regigigas[] = INCBIN_U16("graphics/pokemon/regigigas/normal.gbapal"); - const u32 gMonBackPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/back.4bpp.lz"); + const u32 gMonBackPic_Regigigas[] = INCBIN_U32("graphics/pokemon/regigigas/back.4bpp.smol"); const u16 gMonShinyPalette_Regigigas[] = INCBIN_U16("graphics/pokemon/regigigas/shiny.gbapal"); const u8 gMonIcon_Regigigas[] = INCBIN_U8("graphics/pokemon/regigigas/icon.4bpp"); #if P_FOOTPRINTS @@ -15608,9 +15608,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIGIGAS #if P_FAMILY_GIRATINA - const u32 gMonFrontPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/anim_front.4bpp.smol"); const u16 gMonPalette_GiratinaAltered[] = INCBIN_U16("graphics/pokemon/giratina/normal.gbapal"); - const u32 gMonBackPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/back.4bpp.lz"); + const u32 gMonBackPic_GiratinaAltered[] = INCBIN_U32("graphics/pokemon/giratina/back.4bpp.smol"); const u16 gMonShinyPalette_GiratinaAltered[] = INCBIN_U16("graphics/pokemon/giratina/shiny.gbapal"); const u8 gMonIcon_GiratinaAltered[] = INCBIN_U8("graphics/pokemon/giratina/icon.4bpp"); #if P_FOOTPRINTS @@ -15624,9 +15624,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/anim_front.4bpp.smol"); const u16 gMonPalette_GiratinaOrigin[] = INCBIN_U16("graphics/pokemon/giratina/origin/normal.gbapal"); - const u32 gMonBackPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/back.4bpp.lz"); + const u32 gMonBackPic_GiratinaOrigin[] = INCBIN_U32("graphics/pokemon/giratina/origin/back.4bpp.smol"); const u16 gMonShinyPalette_GiratinaOrigin[] = INCBIN_U16("graphics/pokemon/giratina/origin/shiny.gbapal"); const u8 gMonIcon_GiratinaOrigin[] = INCBIN_U8("graphics/pokemon/giratina/origin/icon.4bpp"); #if P_FOOTPRINTS @@ -15642,9 +15642,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIRATINA #if P_FAMILY_CRESSELIA - const u32 gMonFrontPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/anim_front.4bpp.smol"); const u16 gMonPalette_Cresselia[] = INCBIN_U16("graphics/pokemon/cresselia/normal.gbapal"); - const u32 gMonBackPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/back.4bpp.lz"); + const u32 gMonBackPic_Cresselia[] = INCBIN_U32("graphics/pokemon/cresselia/back.4bpp.smol"); const u16 gMonShinyPalette_Cresselia[] = INCBIN_U16("graphics/pokemon/cresselia/shiny.gbapal"); const u8 gMonIcon_Cresselia[] = INCBIN_U8("graphics/pokemon/cresselia/icon.4bpp"); #if P_FOOTPRINTS @@ -15660,9 +15660,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRESSELIA #if P_FAMILY_MANAPHY - const u32 gMonFrontPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/anim_front.4bpp.smol"); const u16 gMonPalette_Phione[] = INCBIN_U16("graphics/pokemon/phione/normal.gbapal"); - const u32 gMonBackPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/back.4bpp.lz"); + const u32 gMonBackPic_Phione[] = INCBIN_U32("graphics/pokemon/phione/back.4bpp.smol"); const u16 gMonShinyPalette_Phione[] = INCBIN_U16("graphics/pokemon/phione/shiny.gbapal"); const u8 gMonIcon_Phione[] = INCBIN_U8("graphics/pokemon/phione/icon.4bpp"); #if P_FOOTPRINTS @@ -15676,9 +15676,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/anim_front.4bpp.smol"); const u16 gMonPalette_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/normal.gbapal"); - const u32 gMonBackPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/back.4bpp.lz"); + const u32 gMonBackPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/back.4bpp.smol"); const u16 gMonShinyPalette_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/shiny.gbapal"); const u8 gMonIcon_Manaphy[] = INCBIN_U8("graphics/pokemon/manaphy/icon.4bpp"); #if P_FOOTPRINTS @@ -15694,9 +15694,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MANAPHY #if P_FAMILY_DARKRAI - const u32 gMonFrontPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/anim_front.4bpp.smol"); const u16 gMonPalette_Darkrai[] = INCBIN_U16("graphics/pokemon/darkrai/normal.gbapal"); - const u32 gMonBackPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/back.4bpp.lz"); + const u32 gMonBackPic_Darkrai[] = INCBIN_U32("graphics/pokemon/darkrai/back.4bpp.smol"); const u16 gMonShinyPalette_Darkrai[] = INCBIN_U16("graphics/pokemon/darkrai/shiny.gbapal"); const u8 gMonIcon_Darkrai[] = INCBIN_U8("graphics/pokemon/darkrai/icon.4bpp"); #if P_FOOTPRINTS @@ -15712,9 +15712,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DARKRAI #if P_FAMILY_SHAYMIN - const u32 gMonFrontPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/anim_front.4bpp.smol"); const u16 gMonPalette_ShayminLand[] = INCBIN_U16("graphics/pokemon/shaymin/normal.gbapal"); - const u32 gMonBackPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/back.4bpp.lz"); + const u32 gMonBackPic_ShayminLand[] = INCBIN_U32("graphics/pokemon/shaymin/back.4bpp.smol"); const u16 gMonShinyPalette_ShayminLand[] = INCBIN_U16("graphics/pokemon/shaymin/shiny.gbapal"); const u8 gMonIcon_ShayminLand[] = INCBIN_U8("graphics/pokemon/shaymin/icon.4bpp"); #if P_FOOTPRINTS @@ -15728,9 +15728,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/anim_front.4bpp.smol"); const u16 gMonPalette_ShayminSky[] = INCBIN_U16("graphics/pokemon/shaymin/sky/normal.gbapal"); - const u32 gMonBackPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/back.4bpp.lz"); + const u32 gMonBackPic_ShayminSky[] = INCBIN_U32("graphics/pokemon/shaymin/sky/back.4bpp.smol"); const u16 gMonShinyPalette_ShayminSky[] = INCBIN_U16("graphics/pokemon/shaymin/sky/shiny.gbapal"); const u8 gMonIcon_ShayminSky[] = INCBIN_U8("graphics/pokemon/shaymin/sky/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15743,8 +15743,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHAYMIN #if P_FAMILY_ARCEUS - const u32 gMonFrontPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/anim_front.4bpp.lz"); - const u32 gMonBackPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/back.4bpp.lz"); + const u32 gMonFrontPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/anim_front.4bpp.smol"); + const u32 gMonBackPic_Arceus[] = INCBIN_U32("graphics/pokemon/arceus/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Arceus[] = INCBIN_U8("graphics/pokemon/arceus/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -15884,9 +15884,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCEUS #if P_FAMILY_VICTINI - const u32 gMonFrontPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/anim_front.4bpp.smol"); const u16 gMonPalette_Victini[] = INCBIN_U16("graphics/pokemon/victini/normal.gbapal"); - const u32 gMonBackPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/back.4bpp.lz"); + const u32 gMonBackPic_Victini[] = INCBIN_U32("graphics/pokemon/victini/back.4bpp.smol"); const u16 gMonShinyPalette_Victini[] = INCBIN_U16("graphics/pokemon/victini/shiny.gbapal"); const u8 gMonIcon_Victini[] = INCBIN_U8("graphics/pokemon/victini/icon.4bpp"); #if P_FOOTPRINTS @@ -15902,9 +15902,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VICTINI #if P_FAMILY_SNIVY - const u32 gMonFrontPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/anim_front.4bpp.smol"); const u16 gMonPalette_Snivy[] = INCBIN_U16("graphics/pokemon/snivy/normal.gbapal"); - const u32 gMonBackPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/back.4bpp.lz"); + const u32 gMonBackPic_Snivy[] = INCBIN_U32("graphics/pokemon/snivy/back.4bpp.smol"); const u16 gMonShinyPalette_Snivy[] = INCBIN_U16("graphics/pokemon/snivy/shiny.gbapal"); const u8 gMonIcon_Snivy[] = INCBIN_U8("graphics/pokemon/snivy/icon.4bpp"); #if P_FOOTPRINTS @@ -15918,9 +15918,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/anim_front.4bpp.smol"); const u16 gMonPalette_Servine[] = INCBIN_U16("graphics/pokemon/servine/normal.gbapal"); - const u32 gMonBackPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/back.4bpp.lz"); + const u32 gMonBackPic_Servine[] = INCBIN_U32("graphics/pokemon/servine/back.4bpp.smol"); const u16 gMonShinyPalette_Servine[] = INCBIN_U16("graphics/pokemon/servine/shiny.gbapal"); const u8 gMonIcon_Servine[] = INCBIN_U8("graphics/pokemon/servine/icon.4bpp"); #if P_FOOTPRINTS @@ -15934,9 +15934,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/anim_front.4bpp.smol"); const u16 gMonPalette_Serperior[] = INCBIN_U16("graphics/pokemon/serperior/normal.gbapal"); - const u32 gMonBackPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/back.4bpp.lz"); + const u32 gMonBackPic_Serperior[] = INCBIN_U32("graphics/pokemon/serperior/back.4bpp.smol"); const u16 gMonShinyPalette_Serperior[] = INCBIN_U16("graphics/pokemon/serperior/shiny.gbapal"); const u8 gMonIcon_Serperior[] = INCBIN_U8("graphics/pokemon/serperior/icon.4bpp"); #if P_FOOTPRINTS @@ -15952,9 +15952,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNIVY #if P_FAMILY_TEPIG - const u32 gMonFrontPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/anim_front.4bpp.smol"); const u16 gMonPalette_Tepig[] = INCBIN_U16("graphics/pokemon/tepig/normal.gbapal"); - const u32 gMonBackPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/back.4bpp.lz"); + const u32 gMonBackPic_Tepig[] = INCBIN_U32("graphics/pokemon/tepig/back.4bpp.smol"); const u16 gMonShinyPalette_Tepig[] = INCBIN_U16("graphics/pokemon/tepig/shiny.gbapal"); const u8 gMonIcon_Tepig[] = INCBIN_U8("graphics/pokemon/tepig/icon.4bpp"); #if P_FOOTPRINTS @@ -15968,9 +15968,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/anim_front.4bpp.smol"); const u16 gMonPalette_Pignite[] = INCBIN_U16("graphics/pokemon/pignite/normal.gbapal"); - const u32 gMonBackPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/back.4bpp.lz"); + const u32 gMonBackPic_Pignite[] = INCBIN_U32("graphics/pokemon/pignite/back.4bpp.smol"); const u16 gMonShinyPalette_Pignite[] = INCBIN_U16("graphics/pokemon/pignite/shiny.gbapal"); const u8 gMonIcon_Pignite[] = INCBIN_U8("graphics/pokemon/pignite/icon.4bpp"); #if P_FOOTPRINTS @@ -15984,9 +15984,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/anim_front.4bpp.smol"); const u16 gMonPalette_Emboar[] = INCBIN_U16("graphics/pokemon/emboar/normal.gbapal"); - const u32 gMonBackPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/back.4bpp.lz"); + const u32 gMonBackPic_Emboar[] = INCBIN_U32("graphics/pokemon/emboar/back.4bpp.smol"); const u16 gMonShinyPalette_Emboar[] = INCBIN_U16("graphics/pokemon/emboar/shiny.gbapal"); const u8 gMonIcon_Emboar[] = INCBIN_U8("graphics/pokemon/emboar/icon.4bpp"); #if P_FOOTPRINTS @@ -16002,9 +16002,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TEPIG #if P_FAMILY_OSHAWOTT - const u32 gMonFrontPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/anim_front.4bpp.smol"); const u16 gMonPalette_Oshawott[] = INCBIN_U16("graphics/pokemon/oshawott/normal.gbapal"); - const u32 gMonBackPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/back.4bpp.lz"); + const u32 gMonBackPic_Oshawott[] = INCBIN_U32("graphics/pokemon/oshawott/back.4bpp.smol"); const u16 gMonShinyPalette_Oshawott[] = INCBIN_U16("graphics/pokemon/oshawott/shiny.gbapal"); const u8 gMonIcon_Oshawott[] = INCBIN_U8("graphics/pokemon/oshawott/icon.4bpp"); #if P_FOOTPRINTS @@ -16018,9 +16018,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/anim_front.4bpp.smol"); const u16 gMonPalette_Dewott[] = INCBIN_U16("graphics/pokemon/dewott/normal.gbapal"); - const u32 gMonBackPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/back.4bpp.lz"); + const u32 gMonBackPic_Dewott[] = INCBIN_U32("graphics/pokemon/dewott/back.4bpp.smol"); const u16 gMonShinyPalette_Dewott[] = INCBIN_U16("graphics/pokemon/dewott/shiny.gbapal"); const u8 gMonIcon_Dewott[] = INCBIN_U8("graphics/pokemon/dewott/icon.4bpp"); #if P_FOOTPRINTS @@ -16034,9 +16034,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/anim_front.4bpp.smol"); const u16 gMonPalette_Samurott[] = INCBIN_U16("graphics/pokemon/samurott/normal.gbapal"); - const u32 gMonBackPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/back.4bpp.lz"); + const u32 gMonBackPic_Samurott[] = INCBIN_U32("graphics/pokemon/samurott/back.4bpp.smol"); const u16 gMonShinyPalette_Samurott[] = INCBIN_U16("graphics/pokemon/samurott/shiny.gbapal"); const u8 gMonIcon_Samurott[] = INCBIN_U8("graphics/pokemon/samurott/icon.4bpp"); #if P_FOOTPRINTS @@ -16051,9 +16051,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/front.4bpp.smol"); const u16 gMonPalette_SamurottHisui[] = INCBIN_U16("graphics/pokemon/samurott/hisui/normal.gbapal"); - const u32 gMonBackPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SamurottHisui[] = INCBIN_U32("graphics/pokemon/samurott/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SamurottHisui[] = INCBIN_U16("graphics/pokemon/samurott/hisui/shiny.gbapal"); const u8 gMonIcon_SamurottHisui[] = INCBIN_U8("graphics/pokemon/samurott/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16067,9 +16067,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OSHAWOTT #if P_FAMILY_PATRAT - const u32 gMonFrontPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/anim_front.4bpp.smol"); const u16 gMonPalette_Patrat[] = INCBIN_U16("graphics/pokemon/patrat/normal.gbapal"); - const u32 gMonBackPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/back.4bpp.lz"); + const u32 gMonBackPic_Patrat[] = INCBIN_U32("graphics/pokemon/patrat/back.4bpp.smol"); const u16 gMonShinyPalette_Patrat[] = INCBIN_U16("graphics/pokemon/patrat/shiny.gbapal"); const u8 gMonIcon_Patrat[] = INCBIN_U8("graphics/pokemon/patrat/icon.4bpp"); #if P_FOOTPRINTS @@ -16083,9 +16083,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/anim_front.4bpp.smol"); const u16 gMonPalette_Watchog[] = INCBIN_U16("graphics/pokemon/watchog/normal.gbapal"); - const u32 gMonBackPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/back.4bpp.lz"); + const u32 gMonBackPic_Watchog[] = INCBIN_U32("graphics/pokemon/watchog/back.4bpp.smol"); const u16 gMonShinyPalette_Watchog[] = INCBIN_U16("graphics/pokemon/watchog/shiny.gbapal"); const u8 gMonIcon_Watchog[] = INCBIN_U8("graphics/pokemon/watchog/icon.4bpp"); #if P_FOOTPRINTS @@ -16101,9 +16101,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PATRAT #if P_FAMILY_LILLIPUP - const u32 gMonFrontPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/anim_front.4bpp.smol"); const u16 gMonPalette_Lillipup[] = INCBIN_U16("graphics/pokemon/lillipup/normal.gbapal"); - const u32 gMonBackPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/back.4bpp.lz"); + const u32 gMonBackPic_Lillipup[] = INCBIN_U32("graphics/pokemon/lillipup/back.4bpp.smol"); const u16 gMonShinyPalette_Lillipup[] = INCBIN_U16("graphics/pokemon/lillipup/shiny.gbapal"); const u8 gMonIcon_Lillipup[] = INCBIN_U8("graphics/pokemon/lillipup/icon.4bpp"); #if P_FOOTPRINTS @@ -16117,9 +16117,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/anim_front.4bpp.smol"); const u16 gMonPalette_Herdier[] = INCBIN_U16("graphics/pokemon/herdier/normal.gbapal"); - const u32 gMonBackPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/back.4bpp.lz"); + const u32 gMonBackPic_Herdier[] = INCBIN_U32("graphics/pokemon/herdier/back.4bpp.smol"); const u16 gMonShinyPalette_Herdier[] = INCBIN_U16("graphics/pokemon/herdier/shiny.gbapal"); const u8 gMonIcon_Herdier[] = INCBIN_U8("graphics/pokemon/herdier/icon.4bpp"); #if P_FOOTPRINTS @@ -16133,9 +16133,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/anim_front.4bpp.smol"); const u16 gMonPalette_Stoutland[] = INCBIN_U16("graphics/pokemon/stoutland/normal.gbapal"); - const u32 gMonBackPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/back.4bpp.lz"); + const u32 gMonBackPic_Stoutland[] = INCBIN_U32("graphics/pokemon/stoutland/back.4bpp.smol"); const u16 gMonShinyPalette_Stoutland[] = INCBIN_U16("graphics/pokemon/stoutland/shiny.gbapal"); const u8 gMonIcon_Stoutland[] = INCBIN_U8("graphics/pokemon/stoutland/icon.4bpp"); #if P_FOOTPRINTS @@ -16151,9 +16151,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LILLIPUP #if P_FAMILY_PURRLOIN - const u32 gMonFrontPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/anim_front.4bpp.smol"); const u16 gMonPalette_Purrloin[] = INCBIN_U16("graphics/pokemon/purrloin/normal.gbapal"); - const u32 gMonBackPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/back.4bpp.lz"); + const u32 gMonBackPic_Purrloin[] = INCBIN_U32("graphics/pokemon/purrloin/back.4bpp.smol"); const u16 gMonShinyPalette_Purrloin[] = INCBIN_U16("graphics/pokemon/purrloin/shiny.gbapal"); const u8 gMonIcon_Purrloin[] = INCBIN_U8("graphics/pokemon/purrloin/icon.4bpp"); #if P_FOOTPRINTS @@ -16167,9 +16167,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/anim_front.4bpp.smol"); const u16 gMonPalette_Liepard[] = INCBIN_U16("graphics/pokemon/liepard/normal.gbapal"); - const u32 gMonBackPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/back.4bpp.lz"); + const u32 gMonBackPic_Liepard[] = INCBIN_U32("graphics/pokemon/liepard/back.4bpp.smol"); const u16 gMonShinyPalette_Liepard[] = INCBIN_U16("graphics/pokemon/liepard/shiny.gbapal"); const u8 gMonIcon_Liepard[] = INCBIN_U8("graphics/pokemon/liepard/icon.4bpp"); #if P_FOOTPRINTS @@ -16185,9 +16185,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PURRLOIN #if P_FAMILY_PANSAGE - const u32 gMonFrontPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/anim_front.4bpp.smol"); const u16 gMonPalette_Pansage[] = INCBIN_U16("graphics/pokemon/pansage/normal.gbapal"); - const u32 gMonBackPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/back.4bpp.lz"); + const u32 gMonBackPic_Pansage[] = INCBIN_U32("graphics/pokemon/pansage/back.4bpp.smol"); const u16 gMonShinyPalette_Pansage[] = INCBIN_U16("graphics/pokemon/pansage/shiny.gbapal"); const u8 gMonIcon_Pansage[] = INCBIN_U8("graphics/pokemon/pansage/icon.4bpp"); #if P_FOOTPRINTS @@ -16201,9 +16201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/anim_front.4bpp.smol"); const u16 gMonPalette_Simisage[] = INCBIN_U16("graphics/pokemon/simisage/normal.gbapal"); - const u32 gMonBackPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/back.4bpp.lz"); + const u32 gMonBackPic_Simisage[] = INCBIN_U32("graphics/pokemon/simisage/back.4bpp.smol"); const u16 gMonShinyPalette_Simisage[] = INCBIN_U16("graphics/pokemon/simisage/shiny.gbapal"); const u8 gMonIcon_Simisage[] = INCBIN_U8("graphics/pokemon/simisage/icon.4bpp"); #if P_FOOTPRINTS @@ -16219,9 +16219,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANSAGE #if P_FAMILY_PANSEAR - const u32 gMonFrontPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/anim_front.4bpp.smol"); const u16 gMonPalette_Pansear[] = INCBIN_U16("graphics/pokemon/pansear/normal.gbapal"); - const u32 gMonBackPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/back.4bpp.lz"); + const u32 gMonBackPic_Pansear[] = INCBIN_U32("graphics/pokemon/pansear/back.4bpp.smol"); const u16 gMonShinyPalette_Pansear[] = INCBIN_U16("graphics/pokemon/pansear/shiny.gbapal"); const u8 gMonIcon_Pansear[] = INCBIN_U8("graphics/pokemon/pansear/icon.4bpp"); #if P_FOOTPRINTS @@ -16235,9 +16235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/anim_front.4bpp.smol"); const u16 gMonPalette_Simisear[] = INCBIN_U16("graphics/pokemon/simisear/normal.gbapal"); - const u32 gMonBackPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/back.4bpp.lz"); + const u32 gMonBackPic_Simisear[] = INCBIN_U32("graphics/pokemon/simisear/back.4bpp.smol"); const u16 gMonShinyPalette_Simisear[] = INCBIN_U16("graphics/pokemon/simisear/shiny.gbapal"); const u8 gMonIcon_Simisear[] = INCBIN_U8("graphics/pokemon/simisear/icon.4bpp"); #if P_FOOTPRINTS @@ -16253,9 +16253,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANSEAR #if P_FAMILY_PANPOUR - const u32 gMonFrontPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/anim_front.4bpp.smol"); const u16 gMonPalette_Panpour[] = INCBIN_U16("graphics/pokemon/panpour/normal.gbapal"); - const u32 gMonBackPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/back.4bpp.lz"); + const u32 gMonBackPic_Panpour[] = INCBIN_U32("graphics/pokemon/panpour/back.4bpp.smol"); const u16 gMonShinyPalette_Panpour[] = INCBIN_U16("graphics/pokemon/panpour/shiny.gbapal"); const u8 gMonIcon_Panpour[] = INCBIN_U8("graphics/pokemon/panpour/icon.4bpp"); #if P_FOOTPRINTS @@ -16269,9 +16269,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/anim_front.4bpp.smol"); const u16 gMonPalette_Simipour[] = INCBIN_U16("graphics/pokemon/simipour/normal.gbapal"); - const u32 gMonBackPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/back.4bpp.lz"); + const u32 gMonBackPic_Simipour[] = INCBIN_U32("graphics/pokemon/simipour/back.4bpp.smol"); const u16 gMonShinyPalette_Simipour[] = INCBIN_U16("graphics/pokemon/simipour/shiny.gbapal"); const u8 gMonIcon_Simipour[] = INCBIN_U8("graphics/pokemon/simipour/icon.4bpp"); #if P_FOOTPRINTS @@ -16287,9 +16287,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANPOUR #if P_FAMILY_MUNNA - const u32 gMonFrontPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/anim_front.4bpp.smol"); const u16 gMonPalette_Munna[] = INCBIN_U16("graphics/pokemon/munna/normal.gbapal"); - const u32 gMonBackPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/back.4bpp.lz"); + const u32 gMonBackPic_Munna[] = INCBIN_U32("graphics/pokemon/munna/back.4bpp.smol"); const u16 gMonShinyPalette_Munna[] = INCBIN_U16("graphics/pokemon/munna/shiny.gbapal"); const u8 gMonIcon_Munna[] = INCBIN_U8("graphics/pokemon/munna/icon.4bpp"); #if P_FOOTPRINTS @@ -16303,9 +16303,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/anim_front.4bpp.smol"); const u16 gMonPalette_Musharna[] = INCBIN_U16("graphics/pokemon/musharna/normal.gbapal"); - const u32 gMonBackPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/back.4bpp.lz"); + const u32 gMonBackPic_Musharna[] = INCBIN_U32("graphics/pokemon/musharna/back.4bpp.smol"); const u16 gMonShinyPalette_Musharna[] = INCBIN_U16("graphics/pokemon/musharna/shiny.gbapal"); const u8 gMonIcon_Musharna[] = INCBIN_U8("graphics/pokemon/musharna/icon.4bpp"); #if P_FOOTPRINTS @@ -16321,9 +16321,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUNNA #if P_FAMILY_PIDOVE - const u32 gMonFrontPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/anim_front.4bpp.smol"); const u16 gMonPalette_Pidove[] = INCBIN_U16("graphics/pokemon/pidove/normal.gbapal"); - const u32 gMonBackPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/back.4bpp.lz"); + const u32 gMonBackPic_Pidove[] = INCBIN_U32("graphics/pokemon/pidove/back.4bpp.smol"); const u16 gMonShinyPalette_Pidove[] = INCBIN_U16("graphics/pokemon/pidove/shiny.gbapal"); const u8 gMonIcon_Pidove[] = INCBIN_U8("graphics/pokemon/pidove/icon.4bpp"); #if P_FOOTPRINTS @@ -16337,9 +16337,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/anim_front.4bpp.smol"); const u16 gMonPalette_Tranquill[] = INCBIN_U16("graphics/pokemon/tranquill/normal.gbapal"); - const u32 gMonBackPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/back.4bpp.lz"); + const u32 gMonBackPic_Tranquill[] = INCBIN_U32("graphics/pokemon/tranquill/back.4bpp.smol"); const u16 gMonShinyPalette_Tranquill[] = INCBIN_U16("graphics/pokemon/tranquill/shiny.gbapal"); const u8 gMonIcon_Tranquill[] = INCBIN_U8("graphics/pokemon/tranquill/icon.4bpp"); #if P_FOOTPRINTS @@ -16353,9 +16353,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/anim_front.4bpp.smol"); const u16 gMonPalette_Unfezant[] = INCBIN_U16("graphics/pokemon/unfezant/normal.gbapal"); - const u32 gMonBackPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/back.4bpp.lz"); + const u32 gMonBackPic_Unfezant[] = INCBIN_U32("graphics/pokemon/unfezant/back.4bpp.smol"); const u16 gMonShinyPalette_Unfezant[] = INCBIN_U16("graphics/pokemon/unfezant/shiny.gbapal"); const u8 gMonIcon_Unfezant[] = INCBIN_U8("graphics/pokemon/unfezant/icon.4bpp"); #if P_FOOTPRINTS @@ -16370,9 +16370,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/anim_frontf.4bpp.smol"); const u16 gMonPalette_UnfezantF[] = INCBIN_U16("graphics/pokemon/unfezant/normalf.gbapal"); - const u32 gMonBackPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/backf.4bpp.lz"); + const u32 gMonBackPic_UnfezantF[] = INCBIN_U32("graphics/pokemon/unfezant/backf.4bpp.smol"); const u16 gMonShinyPalette_UnfezantF[] = INCBIN_U16("graphics/pokemon/unfezant/shinyf.gbapal"); const u8 gMonIcon_UnfezantF[] = INCBIN_U8("graphics/pokemon/unfezant/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16386,9 +16386,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIDOVE #if P_FAMILY_BLITZLE - const u32 gMonFrontPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/anim_front.4bpp.smol"); const u16 gMonPalette_Blitzle[] = INCBIN_U16("graphics/pokemon/blitzle/normal.gbapal"); - const u32 gMonBackPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/back.4bpp.lz"); + const u32 gMonBackPic_Blitzle[] = INCBIN_U32("graphics/pokemon/blitzle/back.4bpp.smol"); const u16 gMonShinyPalette_Blitzle[] = INCBIN_U16("graphics/pokemon/blitzle/shiny.gbapal"); const u8 gMonIcon_Blitzle[] = INCBIN_U8("graphics/pokemon/blitzle/icon.4bpp"); #if P_FOOTPRINTS @@ -16402,9 +16402,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/anim_front.4bpp.smol"); const u16 gMonPalette_Zebstrika[] = INCBIN_U16("graphics/pokemon/zebstrika/normal.gbapal"); - const u32 gMonBackPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/back.4bpp.lz"); + const u32 gMonBackPic_Zebstrika[] = INCBIN_U32("graphics/pokemon/zebstrika/back.4bpp.smol"); const u16 gMonShinyPalette_Zebstrika[] = INCBIN_U16("graphics/pokemon/zebstrika/shiny.gbapal"); const u8 gMonIcon_Zebstrika[] = INCBIN_U8("graphics/pokemon/zebstrika/icon.4bpp"); #if P_FOOTPRINTS @@ -16420,9 +16420,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLITZLE #if P_FAMILY_ROGGENROLA - const u32 gMonFrontPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/anim_front.4bpp.smol"); const u16 gMonPalette_Roggenrola[] = INCBIN_U16("graphics/pokemon/roggenrola/normal.gbapal"); - const u32 gMonBackPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/back.4bpp.lz"); + const u32 gMonBackPic_Roggenrola[] = INCBIN_U32("graphics/pokemon/roggenrola/back.4bpp.smol"); const u16 gMonShinyPalette_Roggenrola[] = INCBIN_U16("graphics/pokemon/roggenrola/shiny.gbapal"); const u8 gMonIcon_Roggenrola[] = INCBIN_U8("graphics/pokemon/roggenrola/icon.4bpp"); #if P_FOOTPRINTS @@ -16436,9 +16436,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/anim_front.4bpp.smol"); const u16 gMonPalette_Boldore[] = INCBIN_U16("graphics/pokemon/boldore/normal.gbapal"); - const u32 gMonBackPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/back.4bpp.lz"); + const u32 gMonBackPic_Boldore[] = INCBIN_U32("graphics/pokemon/boldore/back.4bpp.smol"); const u16 gMonShinyPalette_Boldore[] = INCBIN_U16("graphics/pokemon/boldore/shiny.gbapal"); const u8 gMonIcon_Boldore[] = INCBIN_U8("graphics/pokemon/boldore/icon.4bpp"); #if P_FOOTPRINTS @@ -16452,9 +16452,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/anim_front.4bpp.smol"); const u16 gMonPalette_Gigalith[] = INCBIN_U16("graphics/pokemon/gigalith/normal.gbapal"); - const u32 gMonBackPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/back.4bpp.lz"); + const u32 gMonBackPic_Gigalith[] = INCBIN_U32("graphics/pokemon/gigalith/back.4bpp.smol"); const u16 gMonShinyPalette_Gigalith[] = INCBIN_U16("graphics/pokemon/gigalith/shiny.gbapal"); const u8 gMonIcon_Gigalith[] = INCBIN_U8("graphics/pokemon/gigalith/icon.4bpp"); #if P_FOOTPRINTS @@ -16470,9 +16470,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROGGENROLA #if P_FAMILY_WOOBAT - const u32 gMonFrontPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/anim_front.4bpp.smol"); const u16 gMonPalette_Woobat[] = INCBIN_U16("graphics/pokemon/woobat/normal.gbapal"); - const u32 gMonBackPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/back.4bpp.lz"); + const u32 gMonBackPic_Woobat[] = INCBIN_U32("graphics/pokemon/woobat/back.4bpp.smol"); const u16 gMonShinyPalette_Woobat[] = INCBIN_U16("graphics/pokemon/woobat/shiny.gbapal"); const u8 gMonIcon_Woobat[] = INCBIN_U8("graphics/pokemon/woobat/icon.4bpp"); #if P_FOOTPRINTS @@ -16486,9 +16486,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/anim_front.4bpp.smol"); const u16 gMonPalette_Swoobat[] = INCBIN_U16("graphics/pokemon/swoobat/normal.gbapal"); - const u32 gMonBackPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/back.4bpp.lz"); + const u32 gMonBackPic_Swoobat[] = INCBIN_U32("graphics/pokemon/swoobat/back.4bpp.smol"); const u16 gMonShinyPalette_Swoobat[] = INCBIN_U16("graphics/pokemon/swoobat/shiny.gbapal"); const u8 gMonIcon_Swoobat[] = INCBIN_U8("graphics/pokemon/swoobat/icon.4bpp"); #if P_FOOTPRINTS @@ -16504,9 +16504,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WOOBAT #if P_FAMILY_DRILBUR - const u32 gMonFrontPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/anim_front.4bpp.smol"); const u16 gMonPalette_Drilbur[] = INCBIN_U16("graphics/pokemon/drilbur/normal.gbapal"); - const u32 gMonBackPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/back.4bpp.lz"); + const u32 gMonBackPic_Drilbur[] = INCBIN_U32("graphics/pokemon/drilbur/back.4bpp.smol"); const u16 gMonShinyPalette_Drilbur[] = INCBIN_U16("graphics/pokemon/drilbur/shiny.gbapal"); const u8 gMonIcon_Drilbur[] = INCBIN_U8("graphics/pokemon/drilbur/icon.4bpp"); #if P_FOOTPRINTS @@ -16520,9 +16520,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/anim_front.4bpp.smol"); const u16 gMonPalette_Excadrill[] = INCBIN_U16("graphics/pokemon/excadrill/normal.gbapal"); - const u32 gMonBackPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/back.4bpp.lz"); + const u32 gMonBackPic_Excadrill[] = INCBIN_U32("graphics/pokemon/excadrill/back.4bpp.smol"); const u16 gMonShinyPalette_Excadrill[] = INCBIN_U16("graphics/pokemon/excadrill/shiny.gbapal"); const u8 gMonIcon_Excadrill[] = INCBIN_U8("graphics/pokemon/excadrill/icon.4bpp"); #if P_FOOTPRINTS @@ -16538,9 +16538,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRILBUR #if P_FAMILY_AUDINO - const u32 gMonFrontPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/anim_front.4bpp.smol"); const u16 gMonPalette_Audino[] = INCBIN_U16("graphics/pokemon/audino/normal.gbapal"); - const u32 gMonBackPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/back.4bpp.lz"); + const u32 gMonBackPic_Audino[] = INCBIN_U32("graphics/pokemon/audino/back.4bpp.smol"); const u16 gMonShinyPalette_Audino[] = INCBIN_U16("graphics/pokemon/audino/shiny.gbapal"); const u8 gMonIcon_Audino[] = INCBIN_U8("graphics/pokemon/audino/icon.4bpp"); #if P_FOOTPRINTS @@ -16555,9 +16555,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/front.4bpp.lz"); + const u32 gMonFrontPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/front.4bpp.smol"); const u16 gMonPalette_AudinoMega[] = INCBIN_U16("graphics/pokemon/audino/mega/normal.gbapal"); - const u32 gMonBackPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/back.4bpp.lz"); + const u32 gMonBackPic_AudinoMega[] = INCBIN_U32("graphics/pokemon/audino/mega/back.4bpp.smol"); const u16 gMonShinyPalette_AudinoMega[] = INCBIN_U16("graphics/pokemon/audino/mega/shiny.gbapal"); const u8 gMonIcon_AudinoMega[] = INCBIN_U8("graphics/pokemon/audino/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16571,9 +16571,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AUDINO #if P_FAMILY_TIMBURR - const u32 gMonFrontPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/anim_front.4bpp.smol"); const u16 gMonPalette_Timburr[] = INCBIN_U16("graphics/pokemon/timburr/normal.gbapal"); - const u32 gMonBackPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/back.4bpp.lz"); + const u32 gMonBackPic_Timburr[] = INCBIN_U32("graphics/pokemon/timburr/back.4bpp.smol"); const u16 gMonShinyPalette_Timburr[] = INCBIN_U16("graphics/pokemon/timburr/shiny.gbapal"); const u8 gMonIcon_Timburr[] = INCBIN_U8("graphics/pokemon/timburr/icon.4bpp"); #if P_FOOTPRINTS @@ -16587,9 +16587,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/anim_front.4bpp.smol"); const u16 gMonPalette_Gurdurr[] = INCBIN_U16("graphics/pokemon/gurdurr/normal.gbapal"); - const u32 gMonBackPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/back.4bpp.lz"); + const u32 gMonBackPic_Gurdurr[] = INCBIN_U32("graphics/pokemon/gurdurr/back.4bpp.smol"); const u16 gMonShinyPalette_Gurdurr[] = INCBIN_U16("graphics/pokemon/gurdurr/shiny.gbapal"); const u8 gMonIcon_Gurdurr[] = INCBIN_U8("graphics/pokemon/gurdurr/icon.4bpp"); #if P_FOOTPRINTS @@ -16603,9 +16603,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/anim_front.4bpp.smol"); const u16 gMonPalette_Conkeldurr[] = INCBIN_U16("graphics/pokemon/conkeldurr/normal.gbapal"); - const u32 gMonBackPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/back.4bpp.lz"); + const u32 gMonBackPic_Conkeldurr[] = INCBIN_U32("graphics/pokemon/conkeldurr/back.4bpp.smol"); const u16 gMonShinyPalette_Conkeldurr[] = INCBIN_U16("graphics/pokemon/conkeldurr/shiny.gbapal"); const u8 gMonIcon_Conkeldurr[] = INCBIN_U8("graphics/pokemon/conkeldurr/icon.4bpp"); #if P_FOOTPRINTS @@ -16621,9 +16621,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TIMBURR #if P_FAMILY_TYMPOLE - const u32 gMonFrontPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/anim_front.4bpp.smol"); const u16 gMonPalette_Tympole[] = INCBIN_U16("graphics/pokemon/tympole/normal.gbapal"); - const u32 gMonBackPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/back.4bpp.lz"); + const u32 gMonBackPic_Tympole[] = INCBIN_U32("graphics/pokemon/tympole/back.4bpp.smol"); const u16 gMonShinyPalette_Tympole[] = INCBIN_U16("graphics/pokemon/tympole/shiny.gbapal"); const u8 gMonIcon_Tympole[] = INCBIN_U8("graphics/pokemon/tympole/icon.4bpp"); #if P_FOOTPRINTS @@ -16637,9 +16637,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/anim_front.4bpp.smol"); const u16 gMonPalette_Palpitoad[] = INCBIN_U16("graphics/pokemon/palpitoad/normal.gbapal"); - const u32 gMonBackPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/back.4bpp.lz"); + const u32 gMonBackPic_Palpitoad[] = INCBIN_U32("graphics/pokemon/palpitoad/back.4bpp.smol"); const u16 gMonShinyPalette_Palpitoad[] = INCBIN_U16("graphics/pokemon/palpitoad/shiny.gbapal"); const u8 gMonIcon_Palpitoad[] = INCBIN_U8("graphics/pokemon/palpitoad/icon.4bpp"); #if P_FOOTPRINTS @@ -16653,9 +16653,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/anim_front.4bpp.smol"); const u16 gMonPalette_Seismitoad[] = INCBIN_U16("graphics/pokemon/seismitoad/normal.gbapal"); - const u32 gMonBackPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/back.4bpp.lz"); + const u32 gMonBackPic_Seismitoad[] = INCBIN_U32("graphics/pokemon/seismitoad/back.4bpp.smol"); const u16 gMonShinyPalette_Seismitoad[] = INCBIN_U16("graphics/pokemon/seismitoad/shiny.gbapal"); const u8 gMonIcon_Seismitoad[] = INCBIN_U8("graphics/pokemon/seismitoad/icon.4bpp"); #if P_FOOTPRINTS @@ -16671,9 +16671,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYMPOLE #if P_FAMILY_THROH - const u32 gMonFrontPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/anim_front.4bpp.smol"); const u16 gMonPalette_Throh[] = INCBIN_U16("graphics/pokemon/throh/normal.gbapal"); - const u32 gMonBackPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/back.4bpp.lz"); + const u32 gMonBackPic_Throh[] = INCBIN_U32("graphics/pokemon/throh/back.4bpp.smol"); const u16 gMonShinyPalette_Throh[] = INCBIN_U16("graphics/pokemon/throh/shiny.gbapal"); const u8 gMonIcon_Throh[] = INCBIN_U8("graphics/pokemon/throh/icon.4bpp"); #if P_FOOTPRINTS @@ -16689,9 +16689,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_THROH #if P_FAMILY_SAWK - const u32 gMonFrontPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/anim_front.4bpp.smol"); const u16 gMonPalette_Sawk[] = INCBIN_U16("graphics/pokemon/sawk/normal.gbapal"); - const u32 gMonBackPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/back.4bpp.lz"); + const u32 gMonBackPic_Sawk[] = INCBIN_U32("graphics/pokemon/sawk/back.4bpp.smol"); const u16 gMonShinyPalette_Sawk[] = INCBIN_U16("graphics/pokemon/sawk/shiny.gbapal"); const u8 gMonIcon_Sawk[] = INCBIN_U8("graphics/pokemon/sawk/icon.4bpp"); #if P_FOOTPRINTS @@ -16707,9 +16707,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SAWK #if P_FAMILY_SEWADDLE - const u32 gMonFrontPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/anim_front.4bpp.smol"); const u16 gMonPalette_Sewaddle[] = INCBIN_U16("graphics/pokemon/sewaddle/normal.gbapal"); - const u32 gMonBackPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/back.4bpp.lz"); + const u32 gMonBackPic_Sewaddle[] = INCBIN_U32("graphics/pokemon/sewaddle/back.4bpp.smol"); const u16 gMonShinyPalette_Sewaddle[] = INCBIN_U16("graphics/pokemon/sewaddle/shiny.gbapal"); const u8 gMonIcon_Sewaddle[] = INCBIN_U8("graphics/pokemon/sewaddle/icon.4bpp"); #if P_FOOTPRINTS @@ -16723,9 +16723,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/anim_front.4bpp.smol"); const u16 gMonPalette_Swadloon[] = INCBIN_U16("graphics/pokemon/swadloon/normal.gbapal"); - const u32 gMonBackPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/back.4bpp.lz"); + const u32 gMonBackPic_Swadloon[] = INCBIN_U32("graphics/pokemon/swadloon/back.4bpp.smol"); const u16 gMonShinyPalette_Swadloon[] = INCBIN_U16("graphics/pokemon/swadloon/shiny.gbapal"); const u8 gMonIcon_Swadloon[] = INCBIN_U8("graphics/pokemon/swadloon/icon.4bpp"); #if P_FOOTPRINTS @@ -16739,9 +16739,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/anim_front.4bpp.smol"); const u16 gMonPalette_Leavanny[] = INCBIN_U16("graphics/pokemon/leavanny/normal.gbapal"); - const u32 gMonBackPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/back.4bpp.lz"); + const u32 gMonBackPic_Leavanny[] = INCBIN_U32("graphics/pokemon/leavanny/back.4bpp.smol"); const u16 gMonShinyPalette_Leavanny[] = INCBIN_U16("graphics/pokemon/leavanny/shiny.gbapal"); const u8 gMonIcon_Leavanny[] = INCBIN_U8("graphics/pokemon/leavanny/icon.4bpp"); #if P_FOOTPRINTS @@ -16757,9 +16757,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SEWADDLE #if P_FAMILY_VENIPEDE - const u32 gMonFrontPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/anim_front.4bpp.smol"); const u16 gMonPalette_Venipede[] = INCBIN_U16("graphics/pokemon/venipede/normal.gbapal"); - const u32 gMonBackPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/back.4bpp.lz"); + const u32 gMonBackPic_Venipede[] = INCBIN_U32("graphics/pokemon/venipede/back.4bpp.smol"); const u16 gMonShinyPalette_Venipede[] = INCBIN_U16("graphics/pokemon/venipede/shiny.gbapal"); const u8 gMonIcon_Venipede[] = INCBIN_U8("graphics/pokemon/venipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16773,9 +16773,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/anim_front.4bpp.smol"); const u16 gMonPalette_Whirlipede[] = INCBIN_U16("graphics/pokemon/whirlipede/normal.gbapal"); - const u32 gMonBackPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/back.4bpp.lz"); + const u32 gMonBackPic_Whirlipede[] = INCBIN_U32("graphics/pokemon/whirlipede/back.4bpp.smol"); const u16 gMonShinyPalette_Whirlipede[] = INCBIN_U16("graphics/pokemon/whirlipede/shiny.gbapal"); const u8 gMonIcon_Whirlipede[] = INCBIN_U8("graphics/pokemon/whirlipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16789,9 +16789,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/anim_front.4bpp.smol"); const u16 gMonPalette_Scolipede[] = INCBIN_U16("graphics/pokemon/scolipede/normal.gbapal"); - const u32 gMonBackPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/back.4bpp.lz"); + const u32 gMonBackPic_Scolipede[] = INCBIN_U32("graphics/pokemon/scolipede/back.4bpp.smol"); const u16 gMonShinyPalette_Scolipede[] = INCBIN_U16("graphics/pokemon/scolipede/shiny.gbapal"); const u8 gMonIcon_Scolipede[] = INCBIN_U8("graphics/pokemon/scolipede/icon.4bpp"); #if P_FOOTPRINTS @@ -16807,9 +16807,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VENIPEDE #if P_FAMILY_COTTONEE - const u32 gMonFrontPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/anim_front.4bpp.smol"); const u16 gMonPalette_Cottonee[] = INCBIN_U16("graphics/pokemon/cottonee/normal.gbapal"); - const u32 gMonBackPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/back.4bpp.lz"); + const u32 gMonBackPic_Cottonee[] = INCBIN_U32("graphics/pokemon/cottonee/back.4bpp.smol"); const u16 gMonShinyPalette_Cottonee[] = INCBIN_U16("graphics/pokemon/cottonee/shiny.gbapal"); const u8 gMonIcon_Cottonee[] = INCBIN_U8("graphics/pokemon/cottonee/icon.4bpp"); #if P_FOOTPRINTS @@ -16823,9 +16823,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/anim_front.4bpp.smol"); const u16 gMonPalette_Whimsicott[] = INCBIN_U16("graphics/pokemon/whimsicott/normal.gbapal"); - const u32 gMonBackPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/back.4bpp.lz"); + const u32 gMonBackPic_Whimsicott[] = INCBIN_U32("graphics/pokemon/whimsicott/back.4bpp.smol"); const u16 gMonShinyPalette_Whimsicott[] = INCBIN_U16("graphics/pokemon/whimsicott/shiny.gbapal"); const u8 gMonIcon_Whimsicott[] = INCBIN_U8("graphics/pokemon/whimsicott/icon.4bpp"); #if P_FOOTPRINTS @@ -16841,9 +16841,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COTTONEE #if P_FAMILY_PETILIL - const u32 gMonFrontPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/anim_front.4bpp.smol"); const u16 gMonPalette_Petilil[] = INCBIN_U16("graphics/pokemon/petilil/normal.gbapal"); - const u32 gMonBackPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/back.4bpp.lz"); + const u32 gMonBackPic_Petilil[] = INCBIN_U32("graphics/pokemon/petilil/back.4bpp.smol"); const u16 gMonShinyPalette_Petilil[] = INCBIN_U16("graphics/pokemon/petilil/shiny.gbapal"); const u8 gMonIcon_Petilil[] = INCBIN_U8("graphics/pokemon/petilil/icon.4bpp"); #if P_FOOTPRINTS @@ -16857,9 +16857,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/anim_front.4bpp.smol"); const u16 gMonPalette_Lilligant[] = INCBIN_U16("graphics/pokemon/lilligant/normal.gbapal"); - const u32 gMonBackPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/back.4bpp.lz"); + const u32 gMonBackPic_Lilligant[] = INCBIN_U32("graphics/pokemon/lilligant/back.4bpp.smol"); const u16 gMonShinyPalette_Lilligant[] = INCBIN_U16("graphics/pokemon/lilligant/shiny.gbapal"); const u8 gMonIcon_Lilligant[] = INCBIN_U8("graphics/pokemon/lilligant/icon.4bpp"); #if P_FOOTPRINTS @@ -16874,9 +16874,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/front.4bpp.smol"); const u16 gMonPalette_LilligantHisui[] = INCBIN_U16("graphics/pokemon/lilligant/hisui/normal.gbapal"); - const u32 gMonBackPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/back.4bpp.lz"); + const u32 gMonBackPic_LilligantHisui[] = INCBIN_U32("graphics/pokemon/lilligant/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_LilligantHisui[] = INCBIN_U16("graphics/pokemon/lilligant/hisui/shiny.gbapal"); const u8 gMonIcon_LilligantHisui[] = INCBIN_U8("graphics/pokemon/lilligant/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -16890,18 +16890,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PETILIL #if P_FAMILY_BASCULIN - const u32 gMonFrontPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinRedStriped[] = INCBIN_U16("graphics/pokemon/basculin/normal.gbapal"); - const u32 gMonBackPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/back.4bpp.lz"); + const u32 gMonBackPic_BasculinRedStriped[] = INCBIN_U32("graphics/pokemon/basculin/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinRedStriped[] = INCBIN_U16("graphics/pokemon/basculin/shiny.gbapal"); const u8 gMonIcon_BasculinRedStriped[] = INCBIN_U8("graphics/pokemon/basculin/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Basculin[] = INCBIN_U8("graphics/pokemon/basculin/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinBlueStriped[] = INCBIN_U16("graphics/pokemon/basculin/blue_striped/normal.gbapal"); - const u32 gMonBackPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/back.4bpp.lz"); + const u32 gMonBackPic_BasculinBlueStriped[] = INCBIN_U32("graphics/pokemon/basculin/blue_striped/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinBlueStriped[] = INCBIN_U16("graphics/pokemon/basculin/blue_striped/shiny.gbapal"); const u8 gMonIcon_BasculinBlueStriped[] = INCBIN_U8("graphics/pokemon/basculin/blue_striped/icon.4bpp"); @@ -16917,9 +16917,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/anim_front.4bpp.lz"); + const u32 gMonFrontPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/anim_front.4bpp.smol"); const u16 gMonPalette_BasculinWhiteStriped[] = INCBIN_U16("graphics/pokemon/basculin/white_striped/normal.gbapal"); - const u32 gMonBackPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/back.4bpp.lz"); + const u32 gMonBackPic_BasculinWhiteStriped[] = INCBIN_U32("graphics/pokemon/basculin/white_striped/back.4bpp.smol"); const u16 gMonShinyPalette_BasculinWhiteStriped[] = INCBIN_U16("graphics/pokemon/basculin/white_striped/shiny.gbapal"); const u8 gMonIcon_BasculinWhiteStriped[] = INCBIN_U8("graphics/pokemon/basculin/white_striped/icon.4bpp"); @@ -16931,18 +16931,18 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/front.4bpp.lz"); + const u32 gMonFrontPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/front.4bpp.smol"); const u16 gMonPalette_BasculegionM[] = INCBIN_U16("graphics/pokemon/basculegion/normal.gbapal"); - const u32 gMonBackPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/back.4bpp.lz"); + const u32 gMonBackPic_BasculegionM[] = INCBIN_U32("graphics/pokemon/basculegion/back.4bpp.smol"); const u16 gMonShinyPalette_BasculegionM[] = INCBIN_U16("graphics/pokemon/basculegion/shiny.gbapal"); const u8 gMonIcon_BasculegionM[] = INCBIN_U8("graphics/pokemon/basculegion/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Basculegion[] = INCBIN_U8("graphics/pokemon/basculegion/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/front.4bpp.lz"); + const u32 gMonFrontPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/front.4bpp.smol"); const u16 gMonPalette_BasculegionF[] = INCBIN_U16("graphics/pokemon/basculegion/f/normal.gbapal"); - const u32 gMonBackPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/back.4bpp.lz"); + const u32 gMonBackPic_BasculegionF[] = INCBIN_U32("graphics/pokemon/basculegion/f/back.4bpp.smol"); const u16 gMonShinyPalette_BasculegionF[] = INCBIN_U16("graphics/pokemon/basculegion/f/shiny.gbapal"); const u8 gMonIcon_BasculegionF[] = INCBIN_U8("graphics/pokemon/basculegion/f/icon.4bpp"); @@ -16960,9 +16960,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BASCULIN #if P_FAMILY_SANDILE - const u32 gMonFrontPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/anim_front.4bpp.smol"); const u16 gMonPalette_Sandile[] = INCBIN_U16("graphics/pokemon/sandile/normal.gbapal"); - const u32 gMonBackPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/back.4bpp.lz"); + const u32 gMonBackPic_Sandile[] = INCBIN_U32("graphics/pokemon/sandile/back.4bpp.smol"); const u16 gMonShinyPalette_Sandile[] = INCBIN_U16("graphics/pokemon/sandile/shiny.gbapal"); const u8 gMonIcon_Sandile[] = INCBIN_U8("graphics/pokemon/sandile/icon.4bpp"); #if P_FOOTPRINTS @@ -16976,9 +16976,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/anim_front.4bpp.smol"); const u16 gMonPalette_Krokorok[] = INCBIN_U16("graphics/pokemon/krokorok/normal.gbapal"); - const u32 gMonBackPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/back.4bpp.lz"); + const u32 gMonBackPic_Krokorok[] = INCBIN_U32("graphics/pokemon/krokorok/back.4bpp.smol"); const u16 gMonShinyPalette_Krokorok[] = INCBIN_U16("graphics/pokemon/krokorok/shiny.gbapal"); const u8 gMonIcon_Krokorok[] = INCBIN_U8("graphics/pokemon/krokorok/icon.4bpp"); #if P_FOOTPRINTS @@ -16992,9 +16992,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/anim_front.4bpp.smol"); const u16 gMonPalette_Krookodile[] = INCBIN_U16("graphics/pokemon/krookodile/normal.gbapal"); - const u32 gMonBackPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/back.4bpp.lz"); + const u32 gMonBackPic_Krookodile[] = INCBIN_U32("graphics/pokemon/krookodile/back.4bpp.smol"); const u16 gMonShinyPalette_Krookodile[] = INCBIN_U16("graphics/pokemon/krookodile/shiny.gbapal"); const u8 gMonIcon_Krookodile[] = INCBIN_U8("graphics/pokemon/krookodile/icon.4bpp"); #if P_FOOTPRINTS @@ -17010,9 +17010,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDILE #if P_FAMILY_DARUMAKA - const u32 gMonFrontPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/anim_front.4bpp.smol"); const u16 gMonPalette_Darumaka[] = INCBIN_U16("graphics/pokemon/darumaka/normal.gbapal"); - const u32 gMonBackPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/back.4bpp.lz"); + const u32 gMonBackPic_Darumaka[] = INCBIN_U32("graphics/pokemon/darumaka/back.4bpp.smol"); const u16 gMonShinyPalette_Darumaka[] = INCBIN_U16("graphics/pokemon/darumaka/shiny.gbapal"); const u8 gMonIcon_Darumaka[] = INCBIN_U8("graphics/pokemon/darumaka/icon.4bpp"); #if P_FOOTPRINTS @@ -17026,9 +17026,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/anim_front.4bpp.smol"); const u16 gMonPalette_DarmanitanStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/normal.gbapal"); - const u32 gMonBackPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/shiny.gbapal"); const u8 gMonIcon_DarmanitanStandard[] = INCBIN_U8("graphics/pokemon/darmanitan/icon.4bpp"); #if P_FOOTPRINTS @@ -17042,9 +17042,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/anim_front.4bpp.smol"); const u16 gMonPalette_DarmanitanZen[] = INCBIN_U16("graphics/pokemon/darmanitan/zen/normal.gbapal"); - const u32 gMonBackPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanZen[] = INCBIN_U32("graphics/pokemon/darmanitan/zen/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanZen[] = INCBIN_U16("graphics/pokemon/darmanitan/zen/shiny.gbapal"); const u8 gMonIcon_DarmanitanZen[] = INCBIN_U8("graphics/pokemon/darmanitan/zen/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17056,9 +17056,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/front.4bpp.lz"); + const u32 gMonFrontPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/front.4bpp.smol"); const u16 gMonPalette_DarumakaGalar[] = INCBIN_U16("graphics/pokemon/darumaka/galar/normal.gbapal"); - const u32 gMonBackPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/back.4bpp.lz"); + const u32 gMonBackPic_DarumakaGalar[] = INCBIN_U32("graphics/pokemon/darumaka/galar/back.4bpp.smol"); const u16 gMonShinyPalette_DarumakaGalar[] = INCBIN_U16("graphics/pokemon/darumaka/galar/shiny.gbapal"); const u8 gMonIcon_DarumakaGalar[] = INCBIN_U8("graphics/pokemon/darumaka/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17069,9 +17069,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/front.4bpp.smol"); const u16 gMonPalette_DarmanitanGalarStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_standard/normal.gbapal"); - const u32 gMonBackPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanGalarStandard[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_standard/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanGalarStandard[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_standard/shiny.gbapal"); const u8 gMonIcon_DarmanitanGalarStandard[] = INCBIN_U8("graphics/pokemon/darmanitan/galar_standard/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17082,9 +17082,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/front.4bpp.lz"); + const u32 gMonFrontPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/front.4bpp.smol"); const u16 gMonPalette_DarmanitanGalarZen[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_zen/normal.gbapal"); - const u32 gMonBackPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/back.4bpp.lz"); + const u32 gMonBackPic_DarmanitanGalarZen[] = INCBIN_U32("graphics/pokemon/darmanitan/galar_zen/back.4bpp.smol"); const u16 gMonShinyPalette_DarmanitanGalarZen[] = INCBIN_U16("graphics/pokemon/darmanitan/galar_zen/shiny.gbapal"); const u8 gMonIcon_DarmanitanGalarZen[] = INCBIN_U8("graphics/pokemon/darmanitan/galar_zen/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17098,9 +17098,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DARUMAKA #if P_FAMILY_MARACTUS - const u32 gMonFrontPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/anim_front.4bpp.smol"); const u16 gMonPalette_Maractus[] = INCBIN_U16("graphics/pokemon/maractus/normal.gbapal"); - const u32 gMonBackPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/back.4bpp.lz"); + const u32 gMonBackPic_Maractus[] = INCBIN_U32("graphics/pokemon/maractus/back.4bpp.smol"); const u16 gMonShinyPalette_Maractus[] = INCBIN_U16("graphics/pokemon/maractus/shiny.gbapal"); const u8 gMonIcon_Maractus[] = INCBIN_U8("graphics/pokemon/maractus/icon.4bpp"); #if P_FOOTPRINTS @@ -17116,9 +17116,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MARACTUS #if P_FAMILY_DWEBBLE - const u32 gMonFrontPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/anim_front.4bpp.smol"); const u16 gMonPalette_Dwebble[] = INCBIN_U16("graphics/pokemon/dwebble/normal.gbapal"); - const u32 gMonBackPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/back.4bpp.lz"); + const u32 gMonBackPic_Dwebble[] = INCBIN_U32("graphics/pokemon/dwebble/back.4bpp.smol"); const u16 gMonShinyPalette_Dwebble[] = INCBIN_U16("graphics/pokemon/dwebble/shiny.gbapal"); const u8 gMonIcon_Dwebble[] = INCBIN_U8("graphics/pokemon/dwebble/icon.4bpp"); #if P_FOOTPRINTS @@ -17132,9 +17132,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/anim_front.4bpp.smol"); const u16 gMonPalette_Crustle[] = INCBIN_U16("graphics/pokemon/crustle/normal.gbapal"); - const u32 gMonBackPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/back.4bpp.lz"); + const u32 gMonBackPic_Crustle[] = INCBIN_U32("graphics/pokemon/crustle/back.4bpp.smol"); const u16 gMonShinyPalette_Crustle[] = INCBIN_U16("graphics/pokemon/crustle/shiny.gbapal"); const u8 gMonIcon_Crustle[] = INCBIN_U8("graphics/pokemon/crustle/icon.4bpp"); #if P_FOOTPRINTS @@ -17150,9 +17150,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DWEBBLE #if P_FAMILY_SCRAGGY - const u32 gMonFrontPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/anim_front.4bpp.smol"); const u16 gMonPalette_Scraggy[] = INCBIN_U16("graphics/pokemon/scraggy/normal.gbapal"); - const u32 gMonBackPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/back.4bpp.lz"); + const u32 gMonBackPic_Scraggy[] = INCBIN_U32("graphics/pokemon/scraggy/back.4bpp.smol"); const u16 gMonShinyPalette_Scraggy[] = INCBIN_U16("graphics/pokemon/scraggy/shiny.gbapal"); const u8 gMonIcon_Scraggy[] = INCBIN_U8("graphics/pokemon/scraggy/icon.4bpp"); #if P_FOOTPRINTS @@ -17166,9 +17166,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/anim_front.4bpp.smol"); const u16 gMonPalette_Scrafty[] = INCBIN_U16("graphics/pokemon/scrafty/normal.gbapal"); - const u32 gMonBackPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/back.4bpp.lz"); + const u32 gMonBackPic_Scrafty[] = INCBIN_U32("graphics/pokemon/scrafty/back.4bpp.smol"); const u16 gMonShinyPalette_Scrafty[] = INCBIN_U16("graphics/pokemon/scrafty/shiny.gbapal"); const u8 gMonIcon_Scrafty[] = INCBIN_U8("graphics/pokemon/scrafty/icon.4bpp"); #if P_FOOTPRINTS @@ -17184,9 +17184,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCRAGGY #if P_FAMILY_SIGILYPH - const u32 gMonFrontPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/anim_front.4bpp.smol"); const u16 gMonPalette_Sigilyph[] = INCBIN_U16("graphics/pokemon/sigilyph/normal.gbapal"); - const u32 gMonBackPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/back.4bpp.lz"); + const u32 gMonBackPic_Sigilyph[] = INCBIN_U32("graphics/pokemon/sigilyph/back.4bpp.smol"); const u16 gMonShinyPalette_Sigilyph[] = INCBIN_U16("graphics/pokemon/sigilyph/shiny.gbapal"); const u8 gMonIcon_Sigilyph[] = INCBIN_U8("graphics/pokemon/sigilyph/icon.4bpp"); #if P_FOOTPRINTS @@ -17202,9 +17202,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SIGILYPH #if P_FAMILY_YAMASK - const u32 gMonFrontPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/anim_front.4bpp.smol"); const u16 gMonPalette_Yamask[] = INCBIN_U16("graphics/pokemon/yamask/normal.gbapal"); - const u32 gMonBackPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/back.4bpp.lz"); + const u32 gMonBackPic_Yamask[] = INCBIN_U32("graphics/pokemon/yamask/back.4bpp.smol"); const u16 gMonShinyPalette_Yamask[] = INCBIN_U16("graphics/pokemon/yamask/shiny.gbapal"); const u8 gMonIcon_Yamask[] = INCBIN_U8("graphics/pokemon/yamask/icon.4bpp"); #if P_FOOTPRINTS @@ -17218,9 +17218,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/anim_front.4bpp.smol"); const u16 gMonPalette_Cofagrigus[] = INCBIN_U16("graphics/pokemon/cofagrigus/normal.gbapal"); - const u32 gMonBackPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/back.4bpp.lz"); + const u32 gMonBackPic_Cofagrigus[] = INCBIN_U32("graphics/pokemon/cofagrigus/back.4bpp.smol"); const u16 gMonShinyPalette_Cofagrigus[] = INCBIN_U16("graphics/pokemon/cofagrigus/shiny.gbapal"); const u8 gMonIcon_Cofagrigus[] = INCBIN_U8("graphics/pokemon/cofagrigus/icon.4bpp"); #if P_FOOTPRINTS @@ -17235,9 +17235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/front.4bpp.lz"); + const u32 gMonFrontPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/front.4bpp.smol"); const u16 gMonPalette_YamaskGalar[] = INCBIN_U16("graphics/pokemon/yamask/galar/normal.gbapal"); - const u32 gMonBackPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/back.4bpp.lz"); + const u32 gMonBackPic_YamaskGalar[] = INCBIN_U32("graphics/pokemon/yamask/galar/back.4bpp.smol"); const u16 gMonShinyPalette_YamaskGalar[] = INCBIN_U16("graphics/pokemon/yamask/galar/shiny.gbapal"); const u8 gMonIcon_YamaskGalar[] = INCBIN_U8("graphics/pokemon/yamask/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17248,9 +17248,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/front.4bpp.lz"); + const u32 gMonFrontPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/front.4bpp.smol"); const u16 gMonPalette_Runerigus[] = INCBIN_U16("graphics/pokemon/runerigus/normal.gbapal"); - const u32 gMonBackPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/back.4bpp.lz"); + const u32 gMonBackPic_Runerigus[] = INCBIN_U32("graphics/pokemon/runerigus/back.4bpp.smol"); const u16 gMonShinyPalette_Runerigus[] = INCBIN_U16("graphics/pokemon/runerigus/shiny.gbapal"); const u8 gMonIcon_Runerigus[] = INCBIN_U8("graphics/pokemon/runerigus/icon.4bpp"); #if P_FOOTPRINTS @@ -17267,9 +17267,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YAMASK #if P_FAMILY_TIRTOUGA - const u32 gMonFrontPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/anim_front.4bpp.smol"); const u16 gMonPalette_Tirtouga[] = INCBIN_U16("graphics/pokemon/tirtouga/normal.gbapal"); - const u32 gMonBackPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/back.4bpp.lz"); + const u32 gMonBackPic_Tirtouga[] = INCBIN_U32("graphics/pokemon/tirtouga/back.4bpp.smol"); const u16 gMonShinyPalette_Tirtouga[] = INCBIN_U16("graphics/pokemon/tirtouga/shiny.gbapal"); const u8 gMonIcon_Tirtouga[] = INCBIN_U8("graphics/pokemon/tirtouga/icon.4bpp"); #if P_FOOTPRINTS @@ -17283,9 +17283,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/anim_front.4bpp.smol"); const u16 gMonPalette_Carracosta[] = INCBIN_U16("graphics/pokemon/carracosta/normal.gbapal"); - const u32 gMonBackPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/back.4bpp.lz"); + const u32 gMonBackPic_Carracosta[] = INCBIN_U32("graphics/pokemon/carracosta/back.4bpp.smol"); const u16 gMonShinyPalette_Carracosta[] = INCBIN_U16("graphics/pokemon/carracosta/shiny.gbapal"); const u8 gMonIcon_Carracosta[] = INCBIN_U8("graphics/pokemon/carracosta/icon.4bpp"); #if P_FOOTPRINTS @@ -17301,9 +17301,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TIRTOUGA #if P_FAMILY_ARCHEN - const u32 gMonFrontPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/anim_front.4bpp.smol"); const u16 gMonPalette_Archen[] = INCBIN_U16("graphics/pokemon/archen/normal.gbapal"); - const u32 gMonBackPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/back.4bpp.lz"); + const u32 gMonBackPic_Archen[] = INCBIN_U32("graphics/pokemon/archen/back.4bpp.smol"); const u16 gMonShinyPalette_Archen[] = INCBIN_U16("graphics/pokemon/archen/shiny.gbapal"); const u8 gMonIcon_Archen[] = INCBIN_U8("graphics/pokemon/archen/icon.4bpp"); #if P_FOOTPRINTS @@ -17317,9 +17317,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/anim_front.4bpp.smol"); const u16 gMonPalette_Archeops[] = INCBIN_U16("graphics/pokemon/archeops/normal.gbapal"); - const u32 gMonBackPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/back.4bpp.lz"); + const u32 gMonBackPic_Archeops[] = INCBIN_U32("graphics/pokemon/archeops/back.4bpp.smol"); const u16 gMonShinyPalette_Archeops[] = INCBIN_U16("graphics/pokemon/archeops/shiny.gbapal"); const u8 gMonIcon_Archeops[] = INCBIN_U8("graphics/pokemon/archeops/icon.4bpp"); #if P_FOOTPRINTS @@ -17335,9 +17335,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCHEN #if P_FAMILY_TRUBBISH - const u32 gMonFrontPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/anim_front.4bpp.smol"); const u16 gMonPalette_Trubbish[] = INCBIN_U16("graphics/pokemon/trubbish/normal.gbapal"); - const u32 gMonBackPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/back.4bpp.lz"); + const u32 gMonBackPic_Trubbish[] = INCBIN_U32("graphics/pokemon/trubbish/back.4bpp.smol"); const u16 gMonShinyPalette_Trubbish[] = INCBIN_U16("graphics/pokemon/trubbish/shiny.gbapal"); const u8 gMonIcon_Trubbish[] = INCBIN_U8("graphics/pokemon/trubbish/icon.4bpp"); #if P_FOOTPRINTS @@ -17351,9 +17351,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/anim_front.4bpp.smol"); const u16 gMonPalette_Garbodor[] = INCBIN_U16("graphics/pokemon/garbodor/normal.gbapal"); - const u32 gMonBackPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/back.4bpp.lz"); + const u32 gMonBackPic_Garbodor[] = INCBIN_U32("graphics/pokemon/garbodor/back.4bpp.smol"); const u16 gMonShinyPalette_Garbodor[] = INCBIN_U16("graphics/pokemon/garbodor/shiny.gbapal"); const u8 gMonIcon_Garbodor[] = INCBIN_U8("graphics/pokemon/garbodor/icon.4bpp"); #if P_FOOTPRINTS @@ -17368,8 +17368,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GarbodorGmax[] = INCBIN_U32("graphics/pokemon/garbodor/gmax/back.4bpp.smol"); const u16 gMonPalette_GarbodorGmax[] = INCBIN_U16("graphics/pokemon/garbodor/gmax/normal.gbapal"); const u16 gMonShinyPalette_GarbodorGmax[] = INCBIN_U16("graphics/pokemon/garbodor/gmax/shiny.gbapal"); const u8 gMonIcon_GarbodorGmax[] = INCBIN_U8("graphics/pokemon/garbodor/gmax/icon.4bpp"); @@ -17384,9 +17384,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TRUBBISH #if P_FAMILY_ZORUA - const u32 gMonFrontPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/anim_front.4bpp.smol"); const u16 gMonPalette_Zorua[] = INCBIN_U16("graphics/pokemon/zorua/normal.gbapal"); - const u32 gMonBackPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/back.4bpp.lz"); + const u32 gMonBackPic_Zorua[] = INCBIN_U32("graphics/pokemon/zorua/back.4bpp.smol"); const u16 gMonShinyPalette_Zorua[] = INCBIN_U16("graphics/pokemon/zorua/shiny.gbapal"); const u8 gMonIcon_Zorua[] = INCBIN_U8("graphics/pokemon/zorua/icon.4bpp"); #if P_FOOTPRINTS @@ -17400,9 +17400,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/anim_front.4bpp.smol"); const u16 gMonPalette_Zoroark[] = INCBIN_U16("graphics/pokemon/zoroark/normal.gbapal"); - const u32 gMonBackPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/back.4bpp.lz"); + const u32 gMonBackPic_Zoroark[] = INCBIN_U32("graphics/pokemon/zoroark/back.4bpp.smol"); const u16 gMonShinyPalette_Zoroark[] = INCBIN_U16("graphics/pokemon/zoroark/shiny.gbapal"); const u8 gMonIcon_Zoroark[] = INCBIN_U8("graphics/pokemon/zoroark/icon.4bpp"); #if P_FOOTPRINTS @@ -17417,9 +17417,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/front.4bpp.smol"); const u16 gMonPalette_ZoruaHisui[] = INCBIN_U16("graphics/pokemon/zorua/hisui/normal.gbapal"); - const u32 gMonBackPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ZoruaHisui[] = INCBIN_U32("graphics/pokemon/zorua/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ZoruaHisui[] = INCBIN_U16("graphics/pokemon/zorua/hisui/shiny.gbapal"); const u8 gMonIcon_ZoruaHisui[] = INCBIN_U8("graphics/pokemon/zorua/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17430,9 +17430,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/front.4bpp.smol"); const u16 gMonPalette_ZoroarkHisui[] = INCBIN_U16("graphics/pokemon/zoroark/hisui/normal.gbapal"); - const u32 gMonBackPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/back.4bpp.lz"); + const u32 gMonBackPic_ZoroarkHisui[] = INCBIN_U32("graphics/pokemon/zoroark/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_ZoroarkHisui[] = INCBIN_U16("graphics/pokemon/zoroark/hisui/shiny.gbapal"); const u8 gMonIcon_ZoroarkHisui[] = INCBIN_U8("graphics/pokemon/zoroark/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17446,9 +17446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZORUA #if P_FAMILY_MINCCINO - const u32 gMonFrontPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/anim_front.4bpp.smol"); const u16 gMonPalette_Minccino[] = INCBIN_U16("graphics/pokemon/minccino/normal.gbapal"); - const u32 gMonBackPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/back.4bpp.lz"); + const u32 gMonBackPic_Minccino[] = INCBIN_U32("graphics/pokemon/minccino/back.4bpp.smol"); const u16 gMonShinyPalette_Minccino[] = INCBIN_U16("graphics/pokemon/minccino/shiny.gbapal"); const u8 gMonIcon_Minccino[] = INCBIN_U8("graphics/pokemon/minccino/icon.4bpp"); #if P_FOOTPRINTS @@ -17462,9 +17462,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/anim_front.4bpp.smol"); const u16 gMonPalette_Cinccino[] = INCBIN_U16("graphics/pokemon/cinccino/normal.gbapal"); - const u32 gMonBackPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/back.4bpp.lz"); + const u32 gMonBackPic_Cinccino[] = INCBIN_U32("graphics/pokemon/cinccino/back.4bpp.smol"); const u16 gMonShinyPalette_Cinccino[] = INCBIN_U16("graphics/pokemon/cinccino/shiny.gbapal"); const u8 gMonIcon_Cinccino[] = INCBIN_U8("graphics/pokemon/cinccino/icon.4bpp"); #if P_FOOTPRINTS @@ -17480,9 +17480,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MINCCINO #if P_FAMILY_GOTHITA - const u32 gMonFrontPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/anim_front.4bpp.smol"); const u16 gMonPalette_Gothita[] = INCBIN_U16("graphics/pokemon/gothita/normal.gbapal"); - const u32 gMonBackPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/back.4bpp.lz"); + const u32 gMonBackPic_Gothita[] = INCBIN_U32("graphics/pokemon/gothita/back.4bpp.smol"); const u16 gMonShinyPalette_Gothita[] = INCBIN_U16("graphics/pokemon/gothita/shiny.gbapal"); const u8 gMonIcon_Gothita[] = INCBIN_U8("graphics/pokemon/gothita/icon.4bpp"); #if P_FOOTPRINTS @@ -17496,9 +17496,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/anim_front.4bpp.smol"); const u16 gMonPalette_Gothorita[] = INCBIN_U16("graphics/pokemon/gothorita/normal.gbapal"); - const u32 gMonBackPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/back.4bpp.lz"); + const u32 gMonBackPic_Gothorita[] = INCBIN_U32("graphics/pokemon/gothorita/back.4bpp.smol"); const u16 gMonShinyPalette_Gothorita[] = INCBIN_U16("graphics/pokemon/gothorita/shiny.gbapal"); const u8 gMonIcon_Gothorita[] = INCBIN_U8("graphics/pokemon/gothorita/icon.4bpp"); #if P_FOOTPRINTS @@ -17512,9 +17512,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/anim_front.4bpp.smol"); const u16 gMonPalette_Gothitelle[] = INCBIN_U16("graphics/pokemon/gothitelle/normal.gbapal"); - const u32 gMonBackPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/back.4bpp.lz"); + const u32 gMonBackPic_Gothitelle[] = INCBIN_U32("graphics/pokemon/gothitelle/back.4bpp.smol"); const u16 gMonShinyPalette_Gothitelle[] = INCBIN_U16("graphics/pokemon/gothitelle/shiny.gbapal"); const u8 gMonIcon_Gothitelle[] = INCBIN_U8("graphics/pokemon/gothitelle/icon.4bpp"); #if P_FOOTPRINTS @@ -17530,9 +17530,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOTHITA #if P_FAMILY_SOLOSIS - const u32 gMonFrontPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/anim_front.4bpp.smol"); const u16 gMonPalette_Solosis[] = INCBIN_U16("graphics/pokemon/solosis/normal.gbapal"); - const u32 gMonBackPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/back.4bpp.lz"); + const u32 gMonBackPic_Solosis[] = INCBIN_U32("graphics/pokemon/solosis/back.4bpp.smol"); const u16 gMonShinyPalette_Solosis[] = INCBIN_U16("graphics/pokemon/solosis/shiny.gbapal"); const u8 gMonIcon_Solosis[] = INCBIN_U8("graphics/pokemon/solosis/icon.4bpp"); #if P_FOOTPRINTS @@ -17546,9 +17546,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/anim_front.4bpp.smol"); const u16 gMonPalette_Duosion[] = INCBIN_U16("graphics/pokemon/duosion/normal.gbapal"); - const u32 gMonBackPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/back.4bpp.lz"); + const u32 gMonBackPic_Duosion[] = INCBIN_U32("graphics/pokemon/duosion/back.4bpp.smol"); const u16 gMonShinyPalette_Duosion[] = INCBIN_U16("graphics/pokemon/duosion/shiny.gbapal"); const u8 gMonIcon_Duosion[] = INCBIN_U8("graphics/pokemon/duosion/icon.4bpp"); #if P_FOOTPRINTS @@ -17562,9 +17562,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/anim_front.4bpp.smol"); const u16 gMonPalette_Reuniclus[] = INCBIN_U16("graphics/pokemon/reuniclus/normal.gbapal"); - const u32 gMonBackPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/back.4bpp.lz"); + const u32 gMonBackPic_Reuniclus[] = INCBIN_U32("graphics/pokemon/reuniclus/back.4bpp.smol"); const u16 gMonShinyPalette_Reuniclus[] = INCBIN_U16("graphics/pokemon/reuniclus/shiny.gbapal"); const u8 gMonIcon_Reuniclus[] = INCBIN_U8("graphics/pokemon/reuniclus/icon.4bpp"); #if P_FOOTPRINTS @@ -17580,9 +17580,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SOLOSIS #if P_FAMILY_DUCKLETT - const u32 gMonFrontPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/anim_front.4bpp.smol"); const u16 gMonPalette_Ducklett[] = INCBIN_U16("graphics/pokemon/ducklett/normal.gbapal"); - const u32 gMonBackPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/back.4bpp.lz"); + const u32 gMonBackPic_Ducklett[] = INCBIN_U32("graphics/pokemon/ducklett/back.4bpp.smol"); const u16 gMonShinyPalette_Ducklett[] = INCBIN_U16("graphics/pokemon/ducklett/shiny.gbapal"); const u8 gMonIcon_Ducklett[] = INCBIN_U8("graphics/pokemon/ducklett/icon.4bpp"); #if P_FOOTPRINTS @@ -17596,9 +17596,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/anim_front.4bpp.smol"); const u16 gMonPalette_Swanna[] = INCBIN_U16("graphics/pokemon/swanna/normal.gbapal"); - const u32 gMonBackPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/back.4bpp.lz"); + const u32 gMonBackPic_Swanna[] = INCBIN_U32("graphics/pokemon/swanna/back.4bpp.smol"); const u16 gMonShinyPalette_Swanna[] = INCBIN_U16("graphics/pokemon/swanna/shiny.gbapal"); const u8 gMonIcon_Swanna[] = INCBIN_U8("graphics/pokemon/swanna/icon.4bpp"); #if P_FOOTPRINTS @@ -17614,9 +17614,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DUCKLETT #if P_FAMILY_VANILLITE - const u32 gMonFrontPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/anim_front.4bpp.smol"); const u16 gMonPalette_Vanillite[] = INCBIN_U16("graphics/pokemon/vanillite/normal.gbapal"); - const u32 gMonBackPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/back.4bpp.lz"); + const u32 gMonBackPic_Vanillite[] = INCBIN_U32("graphics/pokemon/vanillite/back.4bpp.smol"); const u16 gMonShinyPalette_Vanillite[] = INCBIN_U16("graphics/pokemon/vanillite/shiny.gbapal"); const u8 gMonIcon_Vanillite[] = INCBIN_U8("graphics/pokemon/vanillite/icon.4bpp"); #if P_FOOTPRINTS @@ -17630,9 +17630,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/anim_front.4bpp.smol"); const u16 gMonPalette_Vanillish[] = INCBIN_U16("graphics/pokemon/vanillish/normal.gbapal"); - const u32 gMonBackPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/back.4bpp.lz"); + const u32 gMonBackPic_Vanillish[] = INCBIN_U32("graphics/pokemon/vanillish/back.4bpp.smol"); const u16 gMonShinyPalette_Vanillish[] = INCBIN_U16("graphics/pokemon/vanillish/shiny.gbapal"); const u8 gMonIcon_Vanillish[] = INCBIN_U8("graphics/pokemon/vanillish/icon.4bpp"); #if P_FOOTPRINTS @@ -17646,9 +17646,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/anim_front.4bpp.smol"); const u16 gMonPalette_Vanilluxe[] = INCBIN_U16("graphics/pokemon/vanilluxe/normal.gbapal"); - const u32 gMonBackPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/back.4bpp.lz"); + const u32 gMonBackPic_Vanilluxe[] = INCBIN_U32("graphics/pokemon/vanilluxe/back.4bpp.smol"); const u16 gMonShinyPalette_Vanilluxe[] = INCBIN_U16("graphics/pokemon/vanilluxe/shiny.gbapal"); const u8 gMonIcon_Vanilluxe[] = INCBIN_U8("graphics/pokemon/vanilluxe/icon.4bpp"); #if P_FOOTPRINTS @@ -17664,8 +17664,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VANILLITE #if P_FAMILY_DEERLING - const u32 gMonFrontPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/anim_front.4bpp.lz"); - const u32 gMonBackPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/back.4bpp.lz"); + const u32 gMonFrontPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/anim_front.4bpp.smol"); + const u32 gMonBackPic_Deerling[] = INCBIN_U32("graphics/pokemon/deerling/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Deerling[] = INCBIN_U8("graphics/pokemon/deerling/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -17703,30 +17703,30 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckSpring[] = INCBIN_U16("graphics/pokemon/sawsbuck/normal.gbapal"); - const u32 gMonBackPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckSpring[] = INCBIN_U32("graphics/pokemon/sawsbuck/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckSpring[] = INCBIN_U16("graphics/pokemon/sawsbuck/shiny.gbapal"); const u8 gMonIcon_SawsbuckSpring[] = INCBIN_U8("graphics/pokemon/sawsbuck/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Sawsbuck[] = INCBIN_U8("graphics/pokemon/sawsbuck/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckSummer[] = INCBIN_U16("graphics/pokemon/sawsbuck/summer/normal.gbapal"); - const u32 gMonBackPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckSummer[] = INCBIN_U32("graphics/pokemon/sawsbuck/summer/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckSummer[] = INCBIN_U16("graphics/pokemon/sawsbuck/summer/shiny.gbapal"); const u8 gMonIcon_SawsbuckSummer[] = INCBIN_U8("graphics/pokemon/sawsbuck/summer/icon.4bpp"); - const u32 gMonFrontPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckAutumn[] = INCBIN_U16("graphics/pokemon/sawsbuck/autumn/normal.gbapal"); - const u32 gMonBackPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckAutumn[] = INCBIN_U32("graphics/pokemon/sawsbuck/autumn/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckAutumn[] = INCBIN_U16("graphics/pokemon/sawsbuck/autumn/shiny.gbapal"); const u8 gMonIcon_SawsbuckAutumn[] = INCBIN_U8("graphics/pokemon/sawsbuck/autumn/icon.4bpp"); - const u32 gMonFrontPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/anim_front.4bpp.lz"); + const u32 gMonFrontPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/anim_front.4bpp.smol"); const u16 gMonPalette_SawsbuckWinter[] = INCBIN_U16("graphics/pokemon/sawsbuck/winter/normal.gbapal"); - const u32 gMonBackPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/back.4bpp.lz"); + const u32 gMonBackPic_SawsbuckWinter[] = INCBIN_U32("graphics/pokemon/sawsbuck/winter/back.4bpp.smol"); const u16 gMonShinyPalette_SawsbuckWinter[] = INCBIN_U16("graphics/pokemon/sawsbuck/winter/shiny.gbapal"); const u8 gMonIcon_SawsbuckWinter[] = INCBIN_U8("graphics/pokemon/sawsbuck/winter/icon.4bpp"); @@ -17749,9 +17749,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEERLING #if P_FAMILY_EMOLGA - const u32 gMonFrontPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/anim_front.4bpp.smol"); const u16 gMonPalette_Emolga[] = INCBIN_U16("graphics/pokemon/emolga/normal.gbapal"); - const u32 gMonBackPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/back.4bpp.lz"); + const u32 gMonBackPic_Emolga[] = INCBIN_U32("graphics/pokemon/emolga/back.4bpp.smol"); const u16 gMonShinyPalette_Emolga[] = INCBIN_U16("graphics/pokemon/emolga/shiny.gbapal"); const u8 gMonIcon_Emolga[] = INCBIN_U8("graphics/pokemon/emolga/icon.4bpp"); #if P_FOOTPRINTS @@ -17767,9 +17767,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_EMOLGA #if P_FAMILY_KARRABLAST - const u32 gMonFrontPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/anim_front.4bpp.smol"); const u16 gMonPalette_Karrablast[] = INCBIN_U16("graphics/pokemon/karrablast/normal.gbapal"); - const u32 gMonBackPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/back.4bpp.lz"); + const u32 gMonBackPic_Karrablast[] = INCBIN_U32("graphics/pokemon/karrablast/back.4bpp.smol"); const u16 gMonShinyPalette_Karrablast[] = INCBIN_U16("graphics/pokemon/karrablast/shiny.gbapal"); const u8 gMonIcon_Karrablast[] = INCBIN_U8("graphics/pokemon/karrablast/icon.4bpp"); #if P_FOOTPRINTS @@ -17783,9 +17783,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/anim_front.4bpp.smol"); const u16 gMonPalette_Escavalier[] = INCBIN_U16("graphics/pokemon/escavalier/normal.gbapal"); - const u32 gMonBackPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/back.4bpp.lz"); + const u32 gMonBackPic_Escavalier[] = INCBIN_U32("graphics/pokemon/escavalier/back.4bpp.smol"); const u16 gMonShinyPalette_Escavalier[] = INCBIN_U16("graphics/pokemon/escavalier/shiny.gbapal"); const u8 gMonIcon_Escavalier[] = INCBIN_U8("graphics/pokemon/escavalier/icon.4bpp"); #if P_FOOTPRINTS @@ -17801,9 +17801,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KARRABLAST #if P_FAMILY_FOONGUS - const u32 gMonFrontPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/anim_front.4bpp.smol"); const u16 gMonPalette_Foongus[] = INCBIN_U16("graphics/pokemon/foongus/normal.gbapal"); - const u32 gMonBackPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/back.4bpp.lz"); + const u32 gMonBackPic_Foongus[] = INCBIN_U32("graphics/pokemon/foongus/back.4bpp.smol"); const u16 gMonShinyPalette_Foongus[] = INCBIN_U16("graphics/pokemon/foongus/shiny.gbapal"); const u8 gMonIcon_Foongus[] = INCBIN_U8("graphics/pokemon/foongus/icon.4bpp"); #if P_FOOTPRINTS @@ -17817,9 +17817,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/anim_front.4bpp.smol"); const u16 gMonPalette_Amoonguss[] = INCBIN_U16("graphics/pokemon/amoonguss/normal.gbapal"); - const u32 gMonBackPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/back.4bpp.lz"); + const u32 gMonBackPic_Amoonguss[] = INCBIN_U32("graphics/pokemon/amoonguss/back.4bpp.smol"); const u16 gMonShinyPalette_Amoonguss[] = INCBIN_U16("graphics/pokemon/amoonguss/shiny.gbapal"); const u8 gMonIcon_Amoonguss[] = INCBIN_U8("graphics/pokemon/amoonguss/icon.4bpp"); #if P_FOOTPRINTS @@ -17835,9 +17835,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FOONGUS #if P_FAMILY_FRILLISH - const u32 gMonFrontPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/anim_front.4bpp.smol"); const u16 gMonPalette_Frillish[] = INCBIN_U16("graphics/pokemon/frillish/normal.gbapal"); - const u32 gMonBackPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/back.4bpp.lz"); + const u32 gMonBackPic_Frillish[] = INCBIN_U32("graphics/pokemon/frillish/back.4bpp.smol"); const u16 gMonShinyPalette_Frillish[] = INCBIN_U16("graphics/pokemon/frillish/shiny.gbapal"); const u8 gMonIcon_Frillish[] = INCBIN_U8("graphics/pokemon/frillish/icon.4bpp"); #if P_FOOTPRINTS @@ -17852,9 +17852,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/anim_frontf.4bpp.smol"); const u16 gMonPalette_FrillishF[] = INCBIN_U16("graphics/pokemon/frillish/normalf.gbapal"); - const u32 gMonBackPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/backf.4bpp.lz"); + const u32 gMonBackPic_FrillishF[] = INCBIN_U32("graphics/pokemon/frillish/backf.4bpp.smol"); const u16 gMonShinyPalette_FrillishF[] = INCBIN_U16("graphics/pokemon/frillish/shinyf.gbapal"); const u8 gMonIcon_FrillishF[] = INCBIN_U8("graphics/pokemon/frillish/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17866,9 +17866,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GENDER_DIFFERENCES - const u32 gMonFrontPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/anim_front.4bpp.smol"); const u16 gMonPalette_Jellicent[] = INCBIN_U16("graphics/pokemon/jellicent/normal.gbapal"); - const u32 gMonBackPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/back.4bpp.lz"); + const u32 gMonBackPic_Jellicent[] = INCBIN_U32("graphics/pokemon/jellicent/back.4bpp.smol"); const u16 gMonShinyPalette_Jellicent[] = INCBIN_U16("graphics/pokemon/jellicent/shiny.gbapal"); const u8 gMonIcon_Jellicent[] = INCBIN_U8("graphics/pokemon/jellicent/icon.4bpp"); #if P_FOOTPRINTS @@ -17883,9 +17883,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/anim_frontf.4bpp.lz"); + const u32 gMonFrontPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/anim_frontf.4bpp.smol"); const u16 gMonPalette_JellicentF[] = INCBIN_U16("graphics/pokemon/jellicent/normalf.gbapal"); - const u32 gMonBackPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/backf.4bpp.lz"); + const u32 gMonBackPic_JellicentF[] = INCBIN_U32("graphics/pokemon/jellicent/backf.4bpp.smol"); const u16 gMonShinyPalette_JellicentF[] = INCBIN_U16("graphics/pokemon/jellicent/shinyf.gbapal"); const u8 gMonIcon_JellicentF[] = INCBIN_U8("graphics/pokemon/jellicent/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -17899,9 +17899,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FRILLISH #if P_FAMILY_ALOMOMOLA - const u32 gMonFrontPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/anim_front.4bpp.smol"); const u16 gMonPalette_Alomomola[] = INCBIN_U16("graphics/pokemon/alomomola/normal.gbapal"); - const u32 gMonBackPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/back.4bpp.lz"); + const u32 gMonBackPic_Alomomola[] = INCBIN_U32("graphics/pokemon/alomomola/back.4bpp.smol"); const u16 gMonShinyPalette_Alomomola[] = INCBIN_U16("graphics/pokemon/alomomola/shiny.gbapal"); const u8 gMonIcon_Alomomola[] = INCBIN_U8("graphics/pokemon/alomomola/icon.4bpp"); #if P_FOOTPRINTS @@ -17917,9 +17917,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ALOMOMOLA #if P_FAMILY_JOLTIK - const u32 gMonFrontPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/anim_front.4bpp.smol"); const u16 gMonPalette_Joltik[] = INCBIN_U16("graphics/pokemon/joltik/normal.gbapal"); - const u32 gMonBackPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/back.4bpp.lz"); + const u32 gMonBackPic_Joltik[] = INCBIN_U32("graphics/pokemon/joltik/back.4bpp.smol"); const u16 gMonShinyPalette_Joltik[] = INCBIN_U16("graphics/pokemon/joltik/shiny.gbapal"); const u8 gMonIcon_Joltik[] = INCBIN_U8("graphics/pokemon/joltik/icon.4bpp"); #if P_FOOTPRINTS @@ -17933,9 +17933,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/anim_front.4bpp.smol"); const u16 gMonPalette_Galvantula[] = INCBIN_U16("graphics/pokemon/galvantula/normal.gbapal"); - const u32 gMonBackPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/back.4bpp.lz"); + const u32 gMonBackPic_Galvantula[] = INCBIN_U32("graphics/pokemon/galvantula/back.4bpp.smol"); const u16 gMonShinyPalette_Galvantula[] = INCBIN_U16("graphics/pokemon/galvantula/shiny.gbapal"); const u8 gMonIcon_Galvantula[] = INCBIN_U8("graphics/pokemon/galvantula/icon.4bpp"); #if P_FOOTPRINTS @@ -17951,9 +17951,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_JOLTIK #if P_FAMILY_FERROSEED - const u32 gMonFrontPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/anim_front.4bpp.smol"); const u16 gMonPalette_Ferroseed[] = INCBIN_U16("graphics/pokemon/ferroseed/normal.gbapal"); - const u32 gMonBackPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/back.4bpp.lz"); + const u32 gMonBackPic_Ferroseed[] = INCBIN_U32("graphics/pokemon/ferroseed/back.4bpp.smol"); const u16 gMonShinyPalette_Ferroseed[] = INCBIN_U16("graphics/pokemon/ferroseed/shiny.gbapal"); const u8 gMonIcon_Ferroseed[] = INCBIN_U8("graphics/pokemon/ferroseed/icon.4bpp"); #if P_FOOTPRINTS @@ -17967,9 +17967,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/anim_front.4bpp.smol"); const u16 gMonPalette_Ferrothorn[] = INCBIN_U16("graphics/pokemon/ferrothorn/normal.gbapal"); - const u32 gMonBackPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/back.4bpp.lz"); + const u32 gMonBackPic_Ferrothorn[] = INCBIN_U32("graphics/pokemon/ferrothorn/back.4bpp.smol"); const u16 gMonShinyPalette_Ferrothorn[] = INCBIN_U16("graphics/pokemon/ferrothorn/shiny.gbapal"); const u8 gMonIcon_Ferrothorn[] = INCBIN_U8("graphics/pokemon/ferrothorn/icon.4bpp"); #if P_FOOTPRINTS @@ -17985,9 +17985,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FERROSEED #if P_FAMILY_KLINK - const u32 gMonFrontPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/anim_front.4bpp.smol"); const u16 gMonPalette_Klink[] = INCBIN_U16("graphics/pokemon/klink/normal.gbapal"); - const u32 gMonBackPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/back.4bpp.lz"); + const u32 gMonBackPic_Klink[] = INCBIN_U32("graphics/pokemon/klink/back.4bpp.smol"); const u16 gMonShinyPalette_Klink[] = INCBIN_U16("graphics/pokemon/klink/shiny.gbapal"); const u8 gMonIcon_Klink[] = INCBIN_U8("graphics/pokemon/klink/icon.4bpp"); #if P_FOOTPRINTS @@ -18001,9 +18001,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/anim_front.4bpp.smol"); const u16 gMonPalette_Klang[] = INCBIN_U16("graphics/pokemon/klang/normal.gbapal"); - const u32 gMonBackPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/back.4bpp.lz"); + const u32 gMonBackPic_Klang[] = INCBIN_U32("graphics/pokemon/klang/back.4bpp.smol"); const u16 gMonShinyPalette_Klang[] = INCBIN_U16("graphics/pokemon/klang/shiny.gbapal"); const u8 gMonIcon_Klang[] = INCBIN_U8("graphics/pokemon/klang/icon.4bpp"); #if P_FOOTPRINTS @@ -18017,9 +18017,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/anim_front.4bpp.smol"); const u16 gMonPalette_Klinklang[] = INCBIN_U16("graphics/pokemon/klinklang/normal.gbapal"); - const u32 gMonBackPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/back.4bpp.lz"); + const u32 gMonBackPic_Klinklang[] = INCBIN_U32("graphics/pokemon/klinklang/back.4bpp.smol"); const u16 gMonShinyPalette_Klinklang[] = INCBIN_U16("graphics/pokemon/klinklang/shiny.gbapal"); const u8 gMonIcon_Klinklang[] = INCBIN_U8("graphics/pokemon/klinklang/icon.4bpp"); #if P_FOOTPRINTS @@ -18035,9 +18035,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLINK #if P_FAMILY_TYNAMO - const u32 gMonFrontPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/anim_front.4bpp.smol"); const u16 gMonPalette_Tynamo[] = INCBIN_U16("graphics/pokemon/tynamo/normal.gbapal"); - const u32 gMonBackPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/back.4bpp.lz"); + const u32 gMonBackPic_Tynamo[] = INCBIN_U32("graphics/pokemon/tynamo/back.4bpp.smol"); const u16 gMonShinyPalette_Tynamo[] = INCBIN_U16("graphics/pokemon/tynamo/shiny.gbapal"); const u8 gMonIcon_Tynamo[] = INCBIN_U8("graphics/pokemon/tynamo/icon.4bpp"); #if P_FOOTPRINTS @@ -18051,9 +18051,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/anim_front.4bpp.smol"); const u16 gMonPalette_Eelektrik[] = INCBIN_U16("graphics/pokemon/eelektrik/normal.gbapal"); - const u32 gMonBackPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/back.4bpp.lz"); + const u32 gMonBackPic_Eelektrik[] = INCBIN_U32("graphics/pokemon/eelektrik/back.4bpp.smol"); const u16 gMonShinyPalette_Eelektrik[] = INCBIN_U16("graphics/pokemon/eelektrik/shiny.gbapal"); const u8 gMonIcon_Eelektrik[] = INCBIN_U8("graphics/pokemon/eelektrik/icon.4bpp"); #if P_FOOTPRINTS @@ -18067,9 +18067,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/anim_front.4bpp.smol"); const u16 gMonPalette_Eelektross[] = INCBIN_U16("graphics/pokemon/eelektross/normal.gbapal"); - const u32 gMonBackPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/back.4bpp.lz"); + const u32 gMonBackPic_Eelektross[] = INCBIN_U32("graphics/pokemon/eelektross/back.4bpp.smol"); const u16 gMonShinyPalette_Eelektross[] = INCBIN_U16("graphics/pokemon/eelektross/shiny.gbapal"); const u8 gMonIcon_Eelektross[] = INCBIN_U8("graphics/pokemon/eelektross/icon.4bpp"); #if P_FOOTPRINTS @@ -18085,9 +18085,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYNAMO #if P_FAMILY_ELGYEM - const u32 gMonFrontPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/anim_front.4bpp.smol"); const u16 gMonPalette_Elgyem[] = INCBIN_U16("graphics/pokemon/elgyem/normal.gbapal"); - const u32 gMonBackPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/back.4bpp.lz"); + const u32 gMonBackPic_Elgyem[] = INCBIN_U32("graphics/pokemon/elgyem/back.4bpp.smol"); const u16 gMonShinyPalette_Elgyem[] = INCBIN_U16("graphics/pokemon/elgyem/shiny.gbapal"); const u8 gMonIcon_Elgyem[] = INCBIN_U8("graphics/pokemon/elgyem/icon.4bpp"); #if P_FOOTPRINTS @@ -18101,9 +18101,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/anim_front.4bpp.smol"); const u16 gMonPalette_Beheeyem[] = INCBIN_U16("graphics/pokemon/beheeyem/normal.gbapal"); - const u32 gMonBackPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/back.4bpp.lz"); + const u32 gMonBackPic_Beheeyem[] = INCBIN_U32("graphics/pokemon/beheeyem/back.4bpp.smol"); const u16 gMonShinyPalette_Beheeyem[] = INCBIN_U16("graphics/pokemon/beheeyem/shiny.gbapal"); const u8 gMonIcon_Beheeyem[] = INCBIN_U8("graphics/pokemon/beheeyem/icon.4bpp"); #if P_FOOTPRINTS @@ -18119,9 +18119,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ELGYEM #if P_FAMILY_LITWICK - const u32 gMonFrontPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/anim_front.4bpp.smol"); const u16 gMonPalette_Litwick[] = INCBIN_U16("graphics/pokemon/litwick/normal.gbapal"); - const u32 gMonBackPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/back.4bpp.lz"); + const u32 gMonBackPic_Litwick[] = INCBIN_U32("graphics/pokemon/litwick/back.4bpp.smol"); const u16 gMonShinyPalette_Litwick[] = INCBIN_U16("graphics/pokemon/litwick/shiny.gbapal"); const u8 gMonIcon_Litwick[] = INCBIN_U8("graphics/pokemon/litwick/icon.4bpp"); #if P_FOOTPRINTS @@ -18135,9 +18135,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/anim_front.4bpp.smol"); const u16 gMonPalette_Lampent[] = INCBIN_U16("graphics/pokemon/lampent/normal.gbapal"); - const u32 gMonBackPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/back.4bpp.lz"); + const u32 gMonBackPic_Lampent[] = INCBIN_U32("graphics/pokemon/lampent/back.4bpp.smol"); const u16 gMonShinyPalette_Lampent[] = INCBIN_U16("graphics/pokemon/lampent/shiny.gbapal"); const u8 gMonIcon_Lampent[] = INCBIN_U8("graphics/pokemon/lampent/icon.4bpp"); #if P_FOOTPRINTS @@ -18151,9 +18151,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/anim_front.4bpp.smol"); const u16 gMonPalette_Chandelure[] = INCBIN_U16("graphics/pokemon/chandelure/normal.gbapal"); - const u32 gMonBackPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/back.4bpp.lz"); + const u32 gMonBackPic_Chandelure[] = INCBIN_U32("graphics/pokemon/chandelure/back.4bpp.smol"); const u16 gMonShinyPalette_Chandelure[] = INCBIN_U16("graphics/pokemon/chandelure/shiny.gbapal"); const u8 gMonIcon_Chandelure[] = INCBIN_U8("graphics/pokemon/chandelure/icon.4bpp"); #if P_FOOTPRINTS @@ -18169,9 +18169,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITWICK #if P_FAMILY_AXEW - const u32 gMonFrontPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/anim_front.4bpp.smol"); const u16 gMonPalette_Axew[] = INCBIN_U16("graphics/pokemon/axew/normal.gbapal"); - const u32 gMonBackPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/back.4bpp.lz"); + const u32 gMonBackPic_Axew[] = INCBIN_U32("graphics/pokemon/axew/back.4bpp.smol"); const u16 gMonShinyPalette_Axew[] = INCBIN_U16("graphics/pokemon/axew/shiny.gbapal"); const u8 gMonIcon_Axew[] = INCBIN_U8("graphics/pokemon/axew/icon.4bpp"); #if P_FOOTPRINTS @@ -18185,9 +18185,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/anim_front.4bpp.smol"); const u16 gMonPalette_Fraxure[] = INCBIN_U16("graphics/pokemon/fraxure/normal.gbapal"); - const u32 gMonBackPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/back.4bpp.lz"); + const u32 gMonBackPic_Fraxure[] = INCBIN_U32("graphics/pokemon/fraxure/back.4bpp.smol"); const u16 gMonShinyPalette_Fraxure[] = INCBIN_U16("graphics/pokemon/fraxure/shiny.gbapal"); const u8 gMonIcon_Fraxure[] = INCBIN_U8("graphics/pokemon/fraxure/icon.4bpp"); #if P_FOOTPRINTS @@ -18201,9 +18201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/anim_front.4bpp.smol"); const u16 gMonPalette_Haxorus[] = INCBIN_U16("graphics/pokemon/haxorus/normal.gbapal"); - const u32 gMonBackPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/back.4bpp.lz"); + const u32 gMonBackPic_Haxorus[] = INCBIN_U32("graphics/pokemon/haxorus/back.4bpp.smol"); const u16 gMonShinyPalette_Haxorus[] = INCBIN_U16("graphics/pokemon/haxorus/shiny.gbapal"); const u8 gMonIcon_Haxorus[] = INCBIN_U8("graphics/pokemon/haxorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18219,9 +18219,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AXEW #if P_FAMILY_CUBCHOO - const u32 gMonFrontPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/anim_front.4bpp.smol"); const u16 gMonPalette_Cubchoo[] = INCBIN_U16("graphics/pokemon/cubchoo/normal.gbapal"); - const u32 gMonBackPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/back.4bpp.lz"); + const u32 gMonBackPic_Cubchoo[] = INCBIN_U32("graphics/pokemon/cubchoo/back.4bpp.smol"); const u16 gMonShinyPalette_Cubchoo[] = INCBIN_U16("graphics/pokemon/cubchoo/shiny.gbapal"); const u8 gMonIcon_Cubchoo[] = INCBIN_U8("graphics/pokemon/cubchoo/icon.4bpp"); #if P_FOOTPRINTS @@ -18235,9 +18235,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/anim_front.4bpp.smol"); const u16 gMonPalette_Beartic[] = INCBIN_U16("graphics/pokemon/beartic/normal.gbapal"); - const u32 gMonBackPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/back.4bpp.lz"); + const u32 gMonBackPic_Beartic[] = INCBIN_U32("graphics/pokemon/beartic/back.4bpp.smol"); const u16 gMonShinyPalette_Beartic[] = INCBIN_U16("graphics/pokemon/beartic/shiny.gbapal"); const u8 gMonIcon_Beartic[] = INCBIN_U8("graphics/pokemon/beartic/icon.4bpp"); #if P_FOOTPRINTS @@ -18253,9 +18253,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUBCHOO #if P_FAMILY_CRYOGONAL - const u32 gMonFrontPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/anim_front.4bpp.smol"); const u16 gMonPalette_Cryogonal[] = INCBIN_U16("graphics/pokemon/cryogonal/normal.gbapal"); - const u32 gMonBackPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/back.4bpp.lz"); + const u32 gMonBackPic_Cryogonal[] = INCBIN_U32("graphics/pokemon/cryogonal/back.4bpp.smol"); const u16 gMonShinyPalette_Cryogonal[] = INCBIN_U16("graphics/pokemon/cryogonal/shiny.gbapal"); const u8 gMonIcon_Cryogonal[] = INCBIN_U8("graphics/pokemon/cryogonal/icon.4bpp"); #if P_FOOTPRINTS @@ -18271,9 +18271,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRYOGONAL #if P_FAMILY_SHELMET - const u32 gMonFrontPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/anim_front.4bpp.smol"); const u16 gMonPalette_Shelmet[] = INCBIN_U16("graphics/pokemon/shelmet/normal.gbapal"); - const u32 gMonBackPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/back.4bpp.lz"); + const u32 gMonBackPic_Shelmet[] = INCBIN_U32("graphics/pokemon/shelmet/back.4bpp.smol"); const u16 gMonShinyPalette_Shelmet[] = INCBIN_U16("graphics/pokemon/shelmet/shiny.gbapal"); const u8 gMonIcon_Shelmet[] = INCBIN_U8("graphics/pokemon/shelmet/icon.4bpp"); #if P_FOOTPRINTS @@ -18287,9 +18287,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/anim_front.4bpp.smol"); const u16 gMonPalette_Accelgor[] = INCBIN_U16("graphics/pokemon/accelgor/normal.gbapal"); - const u32 gMonBackPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/back.4bpp.lz"); + const u32 gMonBackPic_Accelgor[] = INCBIN_U32("graphics/pokemon/accelgor/back.4bpp.smol"); const u16 gMonShinyPalette_Accelgor[] = INCBIN_U16("graphics/pokemon/accelgor/shiny.gbapal"); const u8 gMonIcon_Accelgor[] = INCBIN_U8("graphics/pokemon/accelgor/icon.4bpp"); #if P_FOOTPRINTS @@ -18305,9 +18305,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHELMET #if P_FAMILY_STUNFISK - const u32 gMonFrontPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/anim_front.4bpp.smol"); const u16 gMonPalette_Stunfisk[] = INCBIN_U16("graphics/pokemon/stunfisk/normal.gbapal"); - const u32 gMonBackPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/back.4bpp.lz"); + const u32 gMonBackPic_Stunfisk[] = INCBIN_U32("graphics/pokemon/stunfisk/back.4bpp.smol"); const u16 gMonShinyPalette_Stunfisk[] = INCBIN_U16("graphics/pokemon/stunfisk/shiny.gbapal"); const u8 gMonIcon_Stunfisk[] = INCBIN_U8("graphics/pokemon/stunfisk/icon.4bpp"); #if P_FOOTPRINTS @@ -18322,9 +18322,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GALARIAN_FORMS - const u32 gMonFrontPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/front.4bpp.lz"); + const u32 gMonFrontPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/front.4bpp.smol"); const u16 gMonPalette_StunfiskGalar[] = INCBIN_U16("graphics/pokemon/stunfisk/galar/normal.gbapal"); - const u32 gMonBackPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/back.4bpp.lz"); + const u32 gMonBackPic_StunfiskGalar[] = INCBIN_U32("graphics/pokemon/stunfisk/galar/back.4bpp.smol"); const u16 gMonShinyPalette_StunfiskGalar[] = INCBIN_U16("graphics/pokemon/stunfisk/galar/shiny.gbapal"); const u8 gMonIcon_StunfiskGalar[] = INCBIN_U8("graphics/pokemon/stunfisk/galar/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18338,9 +18338,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUNFISK #if P_FAMILY_MIENFOO - const u32 gMonFrontPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/anim_front.4bpp.smol"); const u16 gMonPalette_Mienfoo[] = INCBIN_U16("graphics/pokemon/mienfoo/normal.gbapal"); - const u32 gMonBackPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/back.4bpp.lz"); + const u32 gMonBackPic_Mienfoo[] = INCBIN_U32("graphics/pokemon/mienfoo/back.4bpp.smol"); const u16 gMonShinyPalette_Mienfoo[] = INCBIN_U16("graphics/pokemon/mienfoo/shiny.gbapal"); const u8 gMonIcon_Mienfoo[] = INCBIN_U8("graphics/pokemon/mienfoo/icon.4bpp"); #if P_FOOTPRINTS @@ -18354,9 +18354,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/anim_front.4bpp.smol"); const u16 gMonPalette_Mienshao[] = INCBIN_U16("graphics/pokemon/mienshao/normal.gbapal"); - const u32 gMonBackPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/back.4bpp.lz"); + const u32 gMonBackPic_Mienshao[] = INCBIN_U32("graphics/pokemon/mienshao/back.4bpp.smol"); const u16 gMonShinyPalette_Mienshao[] = INCBIN_U16("graphics/pokemon/mienshao/shiny.gbapal"); const u8 gMonIcon_Mienshao[] = INCBIN_U8("graphics/pokemon/mienshao/icon.4bpp"); #if P_FOOTPRINTS @@ -18372,9 +18372,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIENFOO #if P_FAMILY_DRUDDIGON - const u32 gMonFrontPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/anim_front.4bpp.smol"); const u16 gMonPalette_Druddigon[] = INCBIN_U16("graphics/pokemon/druddigon/normal.gbapal"); - const u32 gMonBackPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/back.4bpp.lz"); + const u32 gMonBackPic_Druddigon[] = INCBIN_U32("graphics/pokemon/druddigon/back.4bpp.smol"); const u16 gMonShinyPalette_Druddigon[] = INCBIN_U16("graphics/pokemon/druddigon/shiny.gbapal"); const u8 gMonIcon_Druddigon[] = INCBIN_U8("graphics/pokemon/druddigon/icon.4bpp"); #if P_FOOTPRINTS @@ -18390,9 +18390,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRUDDIGON #if P_FAMILY_GOLETT - const u32 gMonFrontPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/anim_front.4bpp.smol"); const u16 gMonPalette_Golett[] = INCBIN_U16("graphics/pokemon/golett/normal.gbapal"); - const u32 gMonBackPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/back.4bpp.lz"); + const u32 gMonBackPic_Golett[] = INCBIN_U32("graphics/pokemon/golett/back.4bpp.smol"); const u16 gMonShinyPalette_Golett[] = INCBIN_U16("graphics/pokemon/golett/shiny.gbapal"); const u8 gMonIcon_Golett[] = INCBIN_U8("graphics/pokemon/golett/icon.4bpp"); #if P_FOOTPRINTS @@ -18406,9 +18406,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/anim_front.4bpp.smol"); const u16 gMonPalette_Golurk[] = INCBIN_U16("graphics/pokemon/golurk/normal.gbapal"); - const u32 gMonBackPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/back.4bpp.lz"); + const u32 gMonBackPic_Golurk[] = INCBIN_U32("graphics/pokemon/golurk/back.4bpp.smol"); const u16 gMonShinyPalette_Golurk[] = INCBIN_U16("graphics/pokemon/golurk/shiny.gbapal"); const u8 gMonIcon_Golurk[] = INCBIN_U8("graphics/pokemon/golurk/icon.4bpp"); #if P_FOOTPRINTS @@ -18424,9 +18424,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOLETT #if P_FAMILY_PAWNIARD - const u32 gMonFrontPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/anim_front.4bpp.smol"); const u16 gMonPalette_Pawniard[] = INCBIN_U16("graphics/pokemon/pawniard/normal.gbapal"); - const u32 gMonBackPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/back.4bpp.lz"); + const u32 gMonBackPic_Pawniard[] = INCBIN_U32("graphics/pokemon/pawniard/back.4bpp.smol"); const u16 gMonShinyPalette_Pawniard[] = INCBIN_U16("graphics/pokemon/pawniard/shiny.gbapal"); const u8 gMonIcon_Pawniard[] = INCBIN_U8("graphics/pokemon/pawniard/icon.4bpp"); #if P_FOOTPRINTS @@ -18440,9 +18440,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/anim_front.4bpp.smol"); const u16 gMonPalette_Bisharp[] = INCBIN_U16("graphics/pokemon/bisharp/normal.gbapal"); - const u32 gMonBackPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/back.4bpp.lz"); + const u32 gMonBackPic_Bisharp[] = INCBIN_U32("graphics/pokemon/bisharp/back.4bpp.smol"); const u16 gMonShinyPalette_Bisharp[] = INCBIN_U16("graphics/pokemon/bisharp/shiny.gbapal"); const u8 gMonIcon_Bisharp[] = INCBIN_U8("graphics/pokemon/bisharp/icon.4bpp"); #if P_FOOTPRINTS @@ -18457,9 +18457,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/front.4bpp.lz"); + const u32 gMonFrontPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/front.4bpp.smol"); const u16 gMonPalette_Kingambit[] = INCBIN_U16("graphics/pokemon/kingambit/normal.gbapal"); - const u32 gMonBackPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/back.4bpp.lz"); + const u32 gMonBackPic_Kingambit[] = INCBIN_U32("graphics/pokemon/kingambit/back.4bpp.smol"); const u16 gMonShinyPalette_Kingambit[] = INCBIN_U16("graphics/pokemon/kingambit/shiny.gbapal"); const u8 gMonIcon_Kingambit[] = INCBIN_U8("graphics/pokemon/kingambit/icon.4bpp"); #if P_FOOTPRINTS @@ -18476,9 +18476,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PAWNIARD #if P_FAMILY_BOUFFALANT - const u32 gMonFrontPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/anim_front.4bpp.smol"); const u16 gMonPalette_Bouffalant[] = INCBIN_U16("graphics/pokemon/bouffalant/normal.gbapal"); - const u32 gMonBackPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/back.4bpp.lz"); + const u32 gMonBackPic_Bouffalant[] = INCBIN_U32("graphics/pokemon/bouffalant/back.4bpp.smol"); const u16 gMonShinyPalette_Bouffalant[] = INCBIN_U16("graphics/pokemon/bouffalant/shiny.gbapal"); const u8 gMonIcon_Bouffalant[] = INCBIN_U8("graphics/pokemon/bouffalant/icon.4bpp"); #if P_FOOTPRINTS @@ -18494,9 +18494,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOUFFALANT #if P_FAMILY_RUFFLET - const u32 gMonFrontPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/anim_front.4bpp.smol"); const u16 gMonPalette_Rufflet[] = INCBIN_U16("graphics/pokemon/rufflet/normal.gbapal"); - const u32 gMonBackPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/back.4bpp.lz"); + const u32 gMonBackPic_Rufflet[] = INCBIN_U32("graphics/pokemon/rufflet/back.4bpp.smol"); const u16 gMonShinyPalette_Rufflet[] = INCBIN_U16("graphics/pokemon/rufflet/shiny.gbapal"); const u8 gMonIcon_Rufflet[] = INCBIN_U8("graphics/pokemon/rufflet/icon.4bpp"); #if P_FOOTPRINTS @@ -18510,9 +18510,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/anim_front.4bpp.smol"); const u16 gMonPalette_Braviary[] = INCBIN_U16("graphics/pokemon/braviary/normal.gbapal"); - const u32 gMonBackPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/back.4bpp.lz"); + const u32 gMonBackPic_Braviary[] = INCBIN_U32("graphics/pokemon/braviary/back.4bpp.smol"); const u16 gMonShinyPalette_Braviary[] = INCBIN_U16("graphics/pokemon/braviary/shiny.gbapal"); const u8 gMonIcon_Braviary[] = INCBIN_U8("graphics/pokemon/braviary/icon.4bpp"); #if P_FOOTPRINTS @@ -18527,9 +18527,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/front.4bpp.smol"); const u16 gMonPalette_BraviaryHisui[] = INCBIN_U16("graphics/pokemon/braviary/hisui/normal.gbapal"); - const u32 gMonBackPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/back.4bpp.lz"); + const u32 gMonBackPic_BraviaryHisui[] = INCBIN_U32("graphics/pokemon/braviary/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_BraviaryHisui[] = INCBIN_U16("graphics/pokemon/braviary/hisui/shiny.gbapal"); const u8 gMonIcon_BraviaryHisui[] = INCBIN_U8("graphics/pokemon/braviary/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18543,9 +18543,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RUFFLET #if P_FAMILY_VULLABY - const u32 gMonFrontPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/anim_front.4bpp.smol"); const u16 gMonPalette_Vullaby[] = INCBIN_U16("graphics/pokemon/vullaby/normal.gbapal"); - const u32 gMonBackPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/back.4bpp.lz"); + const u32 gMonBackPic_Vullaby[] = INCBIN_U32("graphics/pokemon/vullaby/back.4bpp.smol"); const u16 gMonShinyPalette_Vullaby[] = INCBIN_U16("graphics/pokemon/vullaby/shiny.gbapal"); const u8 gMonIcon_Vullaby[] = INCBIN_U8("graphics/pokemon/vullaby/icon.4bpp"); #if P_FOOTPRINTS @@ -18559,9 +18559,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/anim_front.4bpp.smol"); const u16 gMonPalette_Mandibuzz[] = INCBIN_U16("graphics/pokemon/mandibuzz/normal.gbapal"); - const u32 gMonBackPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/back.4bpp.lz"); + const u32 gMonBackPic_Mandibuzz[] = INCBIN_U32("graphics/pokemon/mandibuzz/back.4bpp.smol"); const u16 gMonShinyPalette_Mandibuzz[] = INCBIN_U16("graphics/pokemon/mandibuzz/shiny.gbapal"); const u8 gMonIcon_Mandibuzz[] = INCBIN_U8("graphics/pokemon/mandibuzz/icon.4bpp"); #if P_FOOTPRINTS @@ -18577,9 +18577,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VULLABY #if P_FAMILY_HEATMOR - const u32 gMonFrontPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/anim_front.4bpp.smol"); const u16 gMonPalette_Heatmor[] = INCBIN_U16("graphics/pokemon/heatmor/normal.gbapal"); - const u32 gMonBackPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/back.4bpp.lz"); + const u32 gMonBackPic_Heatmor[] = INCBIN_U32("graphics/pokemon/heatmor/back.4bpp.smol"); const u16 gMonShinyPalette_Heatmor[] = INCBIN_U16("graphics/pokemon/heatmor/shiny.gbapal"); const u8 gMonIcon_Heatmor[] = INCBIN_U8("graphics/pokemon/heatmor/icon.4bpp"); #if P_FOOTPRINTS @@ -18595,9 +18595,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HEATMOR #if P_FAMILY_DURANT - const u32 gMonFrontPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/anim_front.4bpp.smol"); const u16 gMonPalette_Durant[] = INCBIN_U16("graphics/pokemon/durant/normal.gbapal"); - const u32 gMonBackPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/back.4bpp.lz"); + const u32 gMonBackPic_Durant[] = INCBIN_U32("graphics/pokemon/durant/back.4bpp.smol"); const u16 gMonShinyPalette_Durant[] = INCBIN_U16("graphics/pokemon/durant/shiny.gbapal"); const u8 gMonIcon_Durant[] = INCBIN_U8("graphics/pokemon/durant/icon.4bpp"); #if P_FOOTPRINTS @@ -18613,9 +18613,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DURANT #if P_FAMILY_DEINO - const u32 gMonFrontPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/anim_front.4bpp.smol"); const u16 gMonPalette_Deino[] = INCBIN_U16("graphics/pokemon/deino/normal.gbapal"); - const u32 gMonBackPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/back.4bpp.lz"); + const u32 gMonBackPic_Deino[] = INCBIN_U32("graphics/pokemon/deino/back.4bpp.smol"); const u16 gMonShinyPalette_Deino[] = INCBIN_U16("graphics/pokemon/deino/shiny.gbapal"); const u8 gMonIcon_Deino[] = INCBIN_U8("graphics/pokemon/deino/icon.4bpp"); #if P_FOOTPRINTS @@ -18629,9 +18629,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/anim_front.4bpp.smol"); const u16 gMonPalette_Zweilous[] = INCBIN_U16("graphics/pokemon/zweilous/normal.gbapal"); - const u32 gMonBackPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/back.4bpp.lz"); + const u32 gMonBackPic_Zweilous[] = INCBIN_U32("graphics/pokemon/zweilous/back.4bpp.smol"); const u16 gMonShinyPalette_Zweilous[] = INCBIN_U16("graphics/pokemon/zweilous/shiny.gbapal"); const u8 gMonIcon_Zweilous[] = INCBIN_U8("graphics/pokemon/zweilous/icon.4bpp"); #if P_FOOTPRINTS @@ -18645,9 +18645,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/anim_front.4bpp.smol"); const u16 gMonPalette_Hydreigon[] = INCBIN_U16("graphics/pokemon/hydreigon/normal.gbapal"); - const u32 gMonBackPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/back.4bpp.lz"); + const u32 gMonBackPic_Hydreigon[] = INCBIN_U32("graphics/pokemon/hydreigon/back.4bpp.smol"); const u16 gMonShinyPalette_Hydreigon[] = INCBIN_U16("graphics/pokemon/hydreigon/shiny.gbapal"); const u8 gMonIcon_Hydreigon[] = INCBIN_U8("graphics/pokemon/hydreigon/icon.4bpp"); #if P_FOOTPRINTS @@ -18663,9 +18663,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEINO #if P_FAMILY_LARVESTA - const u32 gMonFrontPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/anim_front.4bpp.smol"); const u16 gMonPalette_Larvesta[] = INCBIN_U16("graphics/pokemon/larvesta/normal.gbapal"); - const u32 gMonBackPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/back.4bpp.lz"); + const u32 gMonBackPic_Larvesta[] = INCBIN_U32("graphics/pokemon/larvesta/back.4bpp.smol"); const u16 gMonShinyPalette_Larvesta[] = INCBIN_U16("graphics/pokemon/larvesta/shiny.gbapal"); const u8 gMonIcon_Larvesta[] = INCBIN_U8("graphics/pokemon/larvesta/icon.4bpp"); #if P_FOOTPRINTS @@ -18679,9 +18679,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/anim_front.4bpp.smol"); const u16 gMonPalette_Volcarona[] = INCBIN_U16("graphics/pokemon/volcarona/normal.gbapal"); - const u32 gMonBackPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/back.4bpp.lz"); + const u32 gMonBackPic_Volcarona[] = INCBIN_U32("graphics/pokemon/volcarona/back.4bpp.smol"); const u16 gMonShinyPalette_Volcarona[] = INCBIN_U16("graphics/pokemon/volcarona/shiny.gbapal"); const u8 gMonIcon_Volcarona[] = INCBIN_U8("graphics/pokemon/volcarona/icon.4bpp"); #if P_FOOTPRINTS @@ -18697,9 +18697,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LARVESTA #if P_FAMILY_COBALION - const u32 gMonFrontPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/anim_front.4bpp.smol"); const u16 gMonPalette_Cobalion[] = INCBIN_U16("graphics/pokemon/cobalion/normal.gbapal"); - const u32 gMonBackPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/back.4bpp.lz"); + const u32 gMonBackPic_Cobalion[] = INCBIN_U32("graphics/pokemon/cobalion/back.4bpp.smol"); const u16 gMonShinyPalette_Cobalion[] = INCBIN_U16("graphics/pokemon/cobalion/shiny.gbapal"); const u8 gMonIcon_Cobalion[] = INCBIN_U8("graphics/pokemon/cobalion/icon.4bpp"); #if P_FOOTPRINTS @@ -18715,9 +18715,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COBALION #if P_FAMILY_TERRAKION - const u32 gMonFrontPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/anim_front.4bpp.smol"); const u16 gMonPalette_Terrakion[] = INCBIN_U16("graphics/pokemon/terrakion/normal.gbapal"); - const u32 gMonBackPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/back.4bpp.lz"); + const u32 gMonBackPic_Terrakion[] = INCBIN_U32("graphics/pokemon/terrakion/back.4bpp.smol"); const u16 gMonShinyPalette_Terrakion[] = INCBIN_U16("graphics/pokemon/terrakion/shiny.gbapal"); const u8 gMonIcon_Terrakion[] = INCBIN_U8("graphics/pokemon/terrakion/icon.4bpp"); #if P_FOOTPRINTS @@ -18733,9 +18733,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TERRAKION #if P_FAMILY_VIRIZION - const u32 gMonFrontPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/anim_front.4bpp.smol"); const u16 gMonPalette_Virizion[] = INCBIN_U16("graphics/pokemon/virizion/normal.gbapal"); - const u32 gMonBackPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/back.4bpp.lz"); + const u32 gMonBackPic_Virizion[] = INCBIN_U32("graphics/pokemon/virizion/back.4bpp.smol"); const u16 gMonShinyPalette_Virizion[] = INCBIN_U16("graphics/pokemon/virizion/shiny.gbapal"); const u8 gMonIcon_Virizion[] = INCBIN_U8("graphics/pokemon/virizion/icon.4bpp"); #if P_FOOTPRINTS @@ -18751,9 +18751,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VIRIZION #if P_FAMILY_TORNADUS - const u32 gMonFrontPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/anim_front.4bpp.smol"); const u16 gMonPalette_TornadusIncarnate[] = INCBIN_U16("graphics/pokemon/tornadus/normal.gbapal"); - const u32 gMonBackPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/back.4bpp.lz"); + const u32 gMonBackPic_TornadusIncarnate[] = INCBIN_U32("graphics/pokemon/tornadus/back.4bpp.smol"); const u16 gMonShinyPalette_TornadusIncarnate[] = INCBIN_U16("graphics/pokemon/tornadus/shiny.gbapal"); const u8 gMonIcon_TornadusIncarnate[] = INCBIN_U8("graphics/pokemon/tornadus/icon.4bpp"); #if P_FOOTPRINTS @@ -18767,9 +18767,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_TornadusTherian[] = INCBIN_U16("graphics/pokemon/tornadus/therian/normal.gbapal"); - const u32 gMonBackPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/back.4bpp.lz"); + const u32 gMonBackPic_TornadusTherian[] = INCBIN_U32("graphics/pokemon/tornadus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_TornadusTherian[] = INCBIN_U16("graphics/pokemon/tornadus/therian/shiny.gbapal"); const u8 gMonIcon_TornadusTherian[] = INCBIN_U8("graphics/pokemon/tornadus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18782,9 +18782,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TORNADUS #if P_FAMILY_THUNDURUS - const u32 gMonFrontPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/anim_front.4bpp.smol"); const u16 gMonPalette_ThundurusIncarnate[] = INCBIN_U16("graphics/pokemon/thundurus/normal.gbapal"); - const u32 gMonBackPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/back.4bpp.lz"); + const u32 gMonBackPic_ThundurusIncarnate[] = INCBIN_U32("graphics/pokemon/thundurus/back.4bpp.smol"); const u16 gMonShinyPalette_ThundurusIncarnate[] = INCBIN_U16("graphics/pokemon/thundurus/shiny.gbapal"); const u8 gMonIcon_ThundurusIncarnate[] = INCBIN_U8("graphics/pokemon/thundurus/icon.4bpp"); #if P_FOOTPRINTS @@ -18798,9 +18798,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_ThundurusTherian[] = INCBIN_U16("graphics/pokemon/thundurus/therian/normal.gbapal"); - const u32 gMonBackPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/back.4bpp.lz"); + const u32 gMonBackPic_ThundurusTherian[] = INCBIN_U32("graphics/pokemon/thundurus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_ThundurusTherian[] = INCBIN_U16("graphics/pokemon/thundurus/therian/shiny.gbapal"); const u8 gMonIcon_ThundurusTherian[] = INCBIN_U8("graphics/pokemon/thundurus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18813,9 +18813,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM - const u32 gMonFrontPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/anim_front.4bpp.smol"); const u16 gMonPalette_Reshiram[] = INCBIN_U16("graphics/pokemon/reshiram/normal.gbapal"); - const u32 gMonBackPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/back.4bpp.lz"); + const u32 gMonBackPic_Reshiram[] = INCBIN_U32("graphics/pokemon/reshiram/back.4bpp.smol"); const u16 gMonShinyPalette_Reshiram[] = INCBIN_U16("graphics/pokemon/reshiram/shiny.gbapal"); const u8 gMonIcon_Reshiram[] = INCBIN_U8("graphics/pokemon/reshiram/icon.4bpp"); #if P_FOOTPRINTS @@ -18831,9 +18831,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RESHIRAM #if P_FAMILY_ZEKROM - const u32 gMonFrontPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/anim_front.4bpp.smol"); const u16 gMonPalette_Zekrom[] = INCBIN_U16("graphics/pokemon/zekrom/normal.gbapal"); - const u32 gMonBackPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/back.4bpp.lz"); + const u32 gMonBackPic_Zekrom[] = INCBIN_U32("graphics/pokemon/zekrom/back.4bpp.smol"); const u16 gMonShinyPalette_Zekrom[] = INCBIN_U16("graphics/pokemon/zekrom/shiny.gbapal"); const u8 gMonIcon_Zekrom[] = INCBIN_U8("graphics/pokemon/zekrom/icon.4bpp"); #if P_FOOTPRINTS @@ -18849,9 +18849,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZEKROM #if P_FAMILY_LANDORUS - const u32 gMonFrontPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/anim_front.4bpp.smol"); const u16 gMonPalette_LandorusIncarnate[] = INCBIN_U16("graphics/pokemon/landorus/normal.gbapal"); - const u32 gMonBackPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/back.4bpp.lz"); + const u32 gMonBackPic_LandorusIncarnate[] = INCBIN_U32("graphics/pokemon/landorus/back.4bpp.smol"); const u16 gMonShinyPalette_LandorusIncarnate[] = INCBIN_U16("graphics/pokemon/landorus/shiny.gbapal"); const u8 gMonIcon_LandorusIncarnate[] = INCBIN_U8("graphics/pokemon/landorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18865,9 +18865,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/anim_front.4bpp.smol"); const u16 gMonPalette_LandorusTherian[] = INCBIN_U16("graphics/pokemon/landorus/therian/normal.gbapal"); - const u32 gMonBackPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/back.4bpp.lz"); + const u32 gMonBackPic_LandorusTherian[] = INCBIN_U32("graphics/pokemon/landorus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_LandorusTherian[] = INCBIN_U16("graphics/pokemon/landorus/therian/shiny.gbapal"); const u8 gMonIcon_LandorusTherian[] = INCBIN_U8("graphics/pokemon/landorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18880,9 +18880,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LANDORUS #if P_FAMILY_ENAMORUS - const u32 gMonFrontPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/anim_front.4bpp.smol"); const u16 gMonPalette_EnamorusIncarnate[] = INCBIN_U16("graphics/pokemon/enamorus/normal.gbapal"); - const u32 gMonBackPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/back.4bpp.lz"); + const u32 gMonBackPic_EnamorusIncarnate[] = INCBIN_U32("graphics/pokemon/enamorus/back.4bpp.smol"); const u16 gMonShinyPalette_EnamorusIncarnate[] = INCBIN_U16("graphics/pokemon/enamorus/shiny.gbapal"); const u8 gMonIcon_EnamorusIncarnate[] = INCBIN_U8("graphics/pokemon/enamorus/icon.4bpp"); #if P_FOOTPRINTS @@ -18896,9 +18896,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/front.4bpp.lz"); + const u32 gMonFrontPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/front.4bpp.smol"); const u16 gMonPalette_EnamorusTherian[] = INCBIN_U16("graphics/pokemon/enamorus/therian/normal.gbapal"); - const u32 gMonBackPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/back.4bpp.lz"); + const u32 gMonBackPic_EnamorusTherian[] = INCBIN_U32("graphics/pokemon/enamorus/therian/back.4bpp.smol"); const u16 gMonShinyPalette_EnamorusTherian[] = INCBIN_U16("graphics/pokemon/enamorus/therian/shiny.gbapal"); const u8 gMonIcon_EnamorusTherian[] = INCBIN_U8("graphics/pokemon/enamorus/therian/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18911,9 +18911,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ENAMORUS #if P_FAMILY_KYUREM - const u32 gMonFrontPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/anim_front.4bpp.smol"); const u16 gMonPalette_Kyurem[] = INCBIN_U16("graphics/pokemon/kyurem/normal.gbapal"); - const u32 gMonBackPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/back.4bpp.lz"); + const u32 gMonBackPic_Kyurem[] = INCBIN_U32("graphics/pokemon/kyurem/back.4bpp.smol"); const u16 gMonShinyPalette_Kyurem[] = INCBIN_U16("graphics/pokemon/kyurem/shiny.gbapal"); const u8 gMonIcon_Kyurem[] = INCBIN_U8("graphics/pokemon/kyurem/icon.4bpp"); #if P_FOOTPRINTS @@ -18928,9 +18928,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/anim_front.4bpp.smol"); const u16 gMonPalette_KyuremWhite[] = INCBIN_U16("graphics/pokemon/kyurem/white/normal.gbapal"); - const u32 gMonBackPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/back.4bpp.lz"); + const u32 gMonBackPic_KyuremWhite[] = INCBIN_U32("graphics/pokemon/kyurem/white/back.4bpp.smol"); const u16 gMonShinyPalette_KyuremWhite[] = INCBIN_U16("graphics/pokemon/kyurem/white/shiny.gbapal"); const u8 gMonIcon_KyuremWhite[] = INCBIN_U8("graphics/pokemon/kyurem/white/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18941,9 +18941,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/anim_front.4bpp.smol"); const u16 gMonPalette_KyuremBlack[] = INCBIN_U16("graphics/pokemon/kyurem/black/normal.gbapal"); - const u32 gMonBackPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/back.4bpp.lz"); + const u32 gMonBackPic_KyuremBlack[] = INCBIN_U32("graphics/pokemon/kyurem/black/back.4bpp.smol"); const u16 gMonShinyPalette_KyuremBlack[] = INCBIN_U16("graphics/pokemon/kyurem/black/shiny.gbapal"); const u8 gMonIcon_KyuremBlack[] = INCBIN_U8("graphics/pokemon/kyurem/black/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18957,9 +18957,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KYUREM #if P_FAMILY_KELDEO - const u32 gMonFrontPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/anim_front.4bpp.smol"); const u16 gMonPalette_KeldeoOrdinary[] = INCBIN_U16("graphics/pokemon/keldeo/normal.gbapal"); - const u32 gMonBackPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/back.4bpp.lz"); + const u32 gMonBackPic_KeldeoOrdinary[] = INCBIN_U32("graphics/pokemon/keldeo/back.4bpp.smol"); const u16 gMonShinyPalette_KeldeoOrdinary[] = INCBIN_U16("graphics/pokemon/keldeo/shiny.gbapal"); const u8 gMonIcon_KeldeoOrdinary[] = INCBIN_U8("graphics/pokemon/keldeo/icon.4bpp"); #if P_FOOTPRINTS @@ -18973,9 +18973,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/anim_front.4bpp.smol"); const u16 gMonPalette_KeldeoResolute[] = INCBIN_U16("graphics/pokemon/keldeo/resolute/normal.gbapal"); - const u32 gMonBackPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/back.4bpp.lz"); + const u32 gMonBackPic_KeldeoResolute[] = INCBIN_U32("graphics/pokemon/keldeo/resolute/back.4bpp.smol"); const u16 gMonShinyPalette_KeldeoResolute[] = INCBIN_U16("graphics/pokemon/keldeo/resolute/shiny.gbapal"); const u8 gMonIcon_KeldeoResolute[] = INCBIN_U8("graphics/pokemon/keldeo/resolute/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -18988,9 +18988,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KELDEO #if P_FAMILY_MELOETTA - const u32 gMonFrontPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/anim_front.4bpp.smol"); const u16 gMonPalette_MeloettaAria[] = INCBIN_U16("graphics/pokemon/meloetta/normal.gbapal"); - const u32 gMonBackPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/back.4bpp.lz"); + const u32 gMonBackPic_MeloettaAria[] = INCBIN_U32("graphics/pokemon/meloetta/back.4bpp.smol"); const u16 gMonShinyPalette_MeloettaAria[] = INCBIN_U16("graphics/pokemon/meloetta/shiny.gbapal"); const u8 gMonIcon_MeloettaAria[] = INCBIN_U8("graphics/pokemon/meloetta/icon.4bpp"); #if P_FOOTPRINTS @@ -19004,9 +19004,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/anim_front.4bpp.smol"); const u16 gMonPalette_MeloettaPirouette[] = INCBIN_U16("graphics/pokemon/meloetta/pirouette/normal.gbapal"); - const u32 gMonBackPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/back.4bpp.lz"); + const u32 gMonBackPic_MeloettaPirouette[] = INCBIN_U32("graphics/pokemon/meloetta/pirouette/back.4bpp.smol"); const u16 gMonShinyPalette_MeloettaPirouette[] = INCBIN_U16("graphics/pokemon/meloetta/pirouette/shiny.gbapal"); const u8 gMonIcon_MeloettaPirouette[] = INCBIN_U8("graphics/pokemon/meloetta/pirouette/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19019,9 +19019,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT - const u32 gMonFrontPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/anim_front.4bpp.smol"); const u16 gMonPalette_Genesect[] = INCBIN_U16("graphics/pokemon/genesect/normal.gbapal"); - const u32 gMonBackPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/back.4bpp.lz"); + const u32 gMonBackPic_Genesect[] = INCBIN_U32("graphics/pokemon/genesect/back.4bpp.smol"); const u16 gMonShinyPalette_Genesect[] = INCBIN_U16("graphics/pokemon/genesect/shiny.gbapal"); const u8 gMonIcon_Genesect[] = INCBIN_U8("graphics/pokemon/genesect/icon.4bpp"); #if P_FOOTPRINTS @@ -19049,9 +19049,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GENESECT #if P_FAMILY_CHESPIN - const u32 gMonFrontPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/anim_front.4bpp.smol"); const u16 gMonPalette_Chespin[] = INCBIN_U16("graphics/pokemon/chespin/normal.gbapal"); - const u32 gMonBackPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/back.4bpp.lz"); + const u32 gMonBackPic_Chespin[] = INCBIN_U32("graphics/pokemon/chespin/back.4bpp.smol"); const u16 gMonShinyPalette_Chespin[] = INCBIN_U16("graphics/pokemon/chespin/shiny.gbapal"); const u8 gMonIcon_Chespin[] = INCBIN_U8("graphics/pokemon/chespin/icon.4bpp"); #if P_FOOTPRINTS @@ -19065,9 +19065,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/anim_front.4bpp.smol"); const u16 gMonPalette_Quilladin[] = INCBIN_U16("graphics/pokemon/quilladin/normal.gbapal"); - const u32 gMonBackPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/back.4bpp.lz"); + const u32 gMonBackPic_Quilladin[] = INCBIN_U32("graphics/pokemon/quilladin/back.4bpp.smol"); const u16 gMonShinyPalette_Quilladin[] = INCBIN_U16("graphics/pokemon/quilladin/shiny.gbapal"); const u8 gMonIcon_Quilladin[] = INCBIN_U8("graphics/pokemon/quilladin/icon.4bpp"); #if P_FOOTPRINTS @@ -19081,9 +19081,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/anim_front.4bpp.smol"); const u16 gMonPalette_Chesnaught[] = INCBIN_U16("graphics/pokemon/chesnaught/normal.gbapal"); - const u32 gMonBackPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/back.4bpp.lz"); + const u32 gMonBackPic_Chesnaught[] = INCBIN_U32("graphics/pokemon/chesnaught/back.4bpp.smol"); const u16 gMonShinyPalette_Chesnaught[] = INCBIN_U16("graphics/pokemon/chesnaught/shiny.gbapal"); const u8 gMonIcon_Chesnaught[] = INCBIN_U8("graphics/pokemon/chesnaught/icon.4bpp"); #if P_FOOTPRINTS @@ -19099,9 +19099,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHESPIN #if P_FAMILY_FENNEKIN - const u32 gMonFrontPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/anim_front.4bpp.smol"); const u16 gMonPalette_Fennekin[] = INCBIN_U16("graphics/pokemon/fennekin/normal.gbapal"); - const u32 gMonBackPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/back.4bpp.lz"); + const u32 gMonBackPic_Fennekin[] = INCBIN_U32("graphics/pokemon/fennekin/back.4bpp.smol"); const u16 gMonShinyPalette_Fennekin[] = INCBIN_U16("graphics/pokemon/fennekin/shiny.gbapal"); const u8 gMonIcon_Fennekin[] = INCBIN_U8("graphics/pokemon/fennekin/icon.4bpp"); #if P_FOOTPRINTS @@ -19115,9 +19115,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/anim_front.4bpp.smol"); const u16 gMonPalette_Braixen[] = INCBIN_U16("graphics/pokemon/braixen/normal.gbapal"); - const u32 gMonBackPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/back.4bpp.lz"); + const u32 gMonBackPic_Braixen[] = INCBIN_U32("graphics/pokemon/braixen/back.4bpp.smol"); const u16 gMonShinyPalette_Braixen[] = INCBIN_U16("graphics/pokemon/braixen/shiny.gbapal"); const u8 gMonIcon_Braixen[] = INCBIN_U8("graphics/pokemon/braixen/icon.4bpp"); #if P_FOOTPRINTS @@ -19131,9 +19131,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/anim_front.4bpp.smol"); const u16 gMonPalette_Delphox[] = INCBIN_U16("graphics/pokemon/delphox/normal.gbapal"); - const u32 gMonBackPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/back.4bpp.lz"); + const u32 gMonBackPic_Delphox[] = INCBIN_U32("graphics/pokemon/delphox/back.4bpp.smol"); const u16 gMonShinyPalette_Delphox[] = INCBIN_U16("graphics/pokemon/delphox/shiny.gbapal"); const u8 gMonIcon_Delphox[] = INCBIN_U8("graphics/pokemon/delphox/icon.4bpp"); #if P_FOOTPRINTS @@ -19149,9 +19149,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FENNEKIN #if P_FAMILY_FROAKIE - const u32 gMonFrontPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/anim_front.4bpp.smol"); const u16 gMonPalette_Froakie[] = INCBIN_U16("graphics/pokemon/froakie/normal.gbapal"); - const u32 gMonBackPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/back.4bpp.lz"); + const u32 gMonBackPic_Froakie[] = INCBIN_U32("graphics/pokemon/froakie/back.4bpp.smol"); const u16 gMonShinyPalette_Froakie[] = INCBIN_U16("graphics/pokemon/froakie/shiny.gbapal"); const u8 gMonIcon_Froakie[] = INCBIN_U8("graphics/pokemon/froakie/icon.4bpp"); #if P_FOOTPRINTS @@ -19165,9 +19165,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/anim_front.4bpp.smol"); const u16 gMonPalette_Frogadier[] = INCBIN_U16("graphics/pokemon/frogadier/normal.gbapal"); - const u32 gMonBackPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/back.4bpp.lz"); + const u32 gMonBackPic_Frogadier[] = INCBIN_U32("graphics/pokemon/frogadier/back.4bpp.smol"); const u16 gMonShinyPalette_Frogadier[] = INCBIN_U16("graphics/pokemon/frogadier/shiny.gbapal"); const u8 gMonIcon_Frogadier[] = INCBIN_U8("graphics/pokemon/frogadier/icon.4bpp"); #if P_FOOTPRINTS @@ -19181,9 +19181,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/anim_front.4bpp.smol"); const u16 gMonPalette_Greninja[] = INCBIN_U16("graphics/pokemon/greninja/normal.gbapal"); - const u32 gMonBackPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/back.4bpp.lz"); + const u32 gMonBackPic_Greninja[] = INCBIN_U32("graphics/pokemon/greninja/back.4bpp.smol"); const u16 gMonShinyPalette_Greninja[] = INCBIN_U16("graphics/pokemon/greninja/shiny.gbapal"); const u8 gMonIcon_Greninja[] = INCBIN_U8("graphics/pokemon/greninja/icon.4bpp"); #if P_FOOTPRINTS @@ -19197,9 +19197,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/anim_front.4bpp.smol"); const u16 gMonPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/normal.gbapal"); - const u32 gMonBackPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/back.4bpp.lz"); + const u32 gMonBackPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/back.4bpp.smol"); const u16 gMonShinyPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/shiny.gbapal"); const u8 gMonIcon_GreninjaAsh[] = INCBIN_U8("graphics/pokemon/greninja/ash/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19212,9 +19212,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY - const u32 gMonFrontPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/anim_front.4bpp.smol"); const u16 gMonPalette_Bunnelby[] = INCBIN_U16("graphics/pokemon/bunnelby/normal.gbapal"); - const u32 gMonBackPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/back.4bpp.lz"); + const u32 gMonBackPic_Bunnelby[] = INCBIN_U32("graphics/pokemon/bunnelby/back.4bpp.smol"); const u16 gMonShinyPalette_Bunnelby[] = INCBIN_U16("graphics/pokemon/bunnelby/shiny.gbapal"); const u8 gMonIcon_Bunnelby[] = INCBIN_U8("graphics/pokemon/bunnelby/icon.4bpp"); #if P_FOOTPRINTS @@ -19228,9 +19228,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/anim_front.4bpp.smol"); const u16 gMonPalette_Diggersby[] = INCBIN_U16("graphics/pokemon/diggersby/normal.gbapal"); - const u32 gMonBackPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/back.4bpp.lz"); + const u32 gMonBackPic_Diggersby[] = INCBIN_U32("graphics/pokemon/diggersby/back.4bpp.smol"); const u16 gMonShinyPalette_Diggersby[] = INCBIN_U16("graphics/pokemon/diggersby/shiny.gbapal"); const u8 gMonIcon_Diggersby[] = INCBIN_U8("graphics/pokemon/diggersby/icon.4bpp"); #if P_FOOTPRINTS @@ -19246,9 +19246,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUNNELBY #if P_FAMILY_FLETCHLING - const u32 gMonFrontPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/anim_front.4bpp.smol"); const u16 gMonPalette_Fletchling[] = INCBIN_U16("graphics/pokemon/fletchling/normal.gbapal"); - const u32 gMonBackPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/back.4bpp.lz"); + const u32 gMonBackPic_Fletchling[] = INCBIN_U32("graphics/pokemon/fletchling/back.4bpp.smol"); const u16 gMonShinyPalette_Fletchling[] = INCBIN_U16("graphics/pokemon/fletchling/shiny.gbapal"); const u8 gMonIcon_Fletchling[] = INCBIN_U8("graphics/pokemon/fletchling/icon.4bpp"); #if P_FOOTPRINTS @@ -19262,9 +19262,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/anim_front.4bpp.smol"); const u16 gMonPalette_Fletchinder[] = INCBIN_U16("graphics/pokemon/fletchinder/normal.gbapal"); - const u32 gMonBackPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/back.4bpp.lz"); + const u32 gMonBackPic_Fletchinder[] = INCBIN_U32("graphics/pokemon/fletchinder/back.4bpp.smol"); const u16 gMonShinyPalette_Fletchinder[] = INCBIN_U16("graphics/pokemon/fletchinder/shiny.gbapal"); const u8 gMonIcon_Fletchinder[] = INCBIN_U8("graphics/pokemon/fletchinder/icon.4bpp"); #if P_FOOTPRINTS @@ -19278,9 +19278,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/anim_front.4bpp.smol"); const u16 gMonPalette_Talonflame[] = INCBIN_U16("graphics/pokemon/talonflame/normal.gbapal"); - const u32 gMonBackPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/back.4bpp.lz"); + const u32 gMonBackPic_Talonflame[] = INCBIN_U32("graphics/pokemon/talonflame/back.4bpp.smol"); const u16 gMonShinyPalette_Talonflame[] = INCBIN_U16("graphics/pokemon/talonflame/shiny.gbapal"); const u8 gMonIcon_Talonflame[] = INCBIN_U8("graphics/pokemon/talonflame/icon.4bpp"); #if P_FOOTPRINTS @@ -19296,9 +19296,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLETCHLING #if P_FAMILY_SCATTERBUG - const u32 gMonFrontPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/anim_front.4bpp.smol"); const u16 gMonPalette_Scatterbug[] = INCBIN_U16("graphics/pokemon/scatterbug/normal.gbapal"); - const u32 gMonBackPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/back.4bpp.lz"); + const u32 gMonBackPic_Scatterbug[] = INCBIN_U32("graphics/pokemon/scatterbug/back.4bpp.smol"); const u16 gMonShinyPalette_Scatterbug[] = INCBIN_U16("graphics/pokemon/scatterbug/shiny.gbapal"); const u8 gMonIcon_Scatterbug[] = INCBIN_U8("graphics/pokemon/scatterbug/icon.4bpp"); #if P_FOOTPRINTS @@ -19312,9 +19312,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/anim_front.4bpp.smol"); const u16 gMonPalette_Spewpa[] = INCBIN_U16("graphics/pokemon/spewpa/normal.gbapal"); - const u32 gMonBackPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/back.4bpp.lz"); + const u32 gMonBackPic_Spewpa[] = INCBIN_U32("graphics/pokemon/spewpa/back.4bpp.smol"); const u16 gMonShinyPalette_Spewpa[] = INCBIN_U16("graphics/pokemon/spewpa/shiny.gbapal"); const u8 gMonIcon_Spewpa[] = INCBIN_U8("graphics/pokemon/spewpa/icon.4bpp"); #if P_FOOTPRINTS @@ -19328,102 +19328,102 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonIcySnow[] = INCBIN_U16("graphics/pokemon/vivillon/normal.gbapal"); - const u32 gMonBackPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/back.4bpp.lz"); + const u32 gMonBackPic_VivillonIcySnow[] = INCBIN_U32("graphics/pokemon/vivillon/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonIcySnow[] = INCBIN_U16("graphics/pokemon/vivillon/shiny.gbapal"); const u8 gMonIcon_VivillonIcySnow[] = INCBIN_U8("graphics/pokemon/vivillon/meadow/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Vivillon[] = INCBIN_U8("graphics/pokemon/vivillon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonPolar[] = INCBIN_U16("graphics/pokemon/vivillon/polar/normal.gbapal"); - const u32 gMonBackPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/back.4bpp.lz"); + const u32 gMonBackPic_VivillonPolar[] = INCBIN_U32("graphics/pokemon/vivillon/polar/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonPolar[] = INCBIN_U16("graphics/pokemon/vivillon/polar/shiny.gbapal"); const u8 gMonIcon_VivillonPolar[] = INCBIN_U8("graphics/pokemon/vivillon/polar/icon.4bpp"); - const u32 gMonFrontPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonTundra[] = INCBIN_U16("graphics/pokemon/vivillon/tundra/normal.gbapal"); - const u32 gMonBackPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/back.4bpp.lz"); + const u32 gMonBackPic_VivillonTundra[] = INCBIN_U32("graphics/pokemon/vivillon/tundra/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonTundra[] = INCBIN_U16("graphics/pokemon/vivillon/tundra/shiny.gbapal"); const u8 gMonIcon_VivillonTundra[] = INCBIN_U8("graphics/pokemon/vivillon/tundra/icon.4bpp"); - const u32 gMonFrontPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonContinental[] = INCBIN_U16("graphics/pokemon/vivillon/continental/normal.gbapal"); - const u32 gMonBackPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/back.4bpp.lz"); + const u32 gMonBackPic_VivillonContinental[] = INCBIN_U32("graphics/pokemon/vivillon/continental/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonContinental[] = INCBIN_U16("graphics/pokemon/vivillon/continental/shiny.gbapal"); const u8 gMonIcon_VivillonContinental[] = INCBIN_U8("graphics/pokemon/vivillon/continental/icon.4bpp"); - const u32 gMonFrontPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonGarden[] = INCBIN_U16("graphics/pokemon/vivillon/garden/normal.gbapal"); - const u32 gMonBackPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/back.4bpp.lz"); + const u32 gMonBackPic_VivillonGarden[] = INCBIN_U32("graphics/pokemon/vivillon/garden/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonGarden[] = INCBIN_U16("graphics/pokemon/vivillon/garden/shiny.gbapal"); const u8 gMonIcon_VivillonGarden[] = INCBIN_U8("graphics/pokemon/vivillon/garden/icon.4bpp"); - const u32 gMonFrontPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonElegant[] = INCBIN_U16("graphics/pokemon/vivillon/elegant/normal.gbapal"); - const u32 gMonBackPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/back.4bpp.lz"); + const u32 gMonBackPic_VivillonElegant[] = INCBIN_U32("graphics/pokemon/vivillon/elegant/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonElegant[] = INCBIN_U16("graphics/pokemon/vivillon/elegant/shiny.gbapal"); const u8 gMonIcon_VivillonElegant[] = INCBIN_U8("graphics/pokemon/vivillon/elegant/icon.4bpp"); - const u32 gMonFrontPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMeadow[] = INCBIN_U16("graphics/pokemon/vivillon/meadow/normal.gbapal"); - const u32 gMonBackPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMeadow[] = INCBIN_U32("graphics/pokemon/vivillon/meadow/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMeadow[] = INCBIN_U16("graphics/pokemon/vivillon/meadow/shiny.gbapal"); const u8 gMonIcon_VivillonMeadow[] = INCBIN_U8("graphics/pokemon/vivillon/meadow/icon.4bpp"); - const u32 gMonFrontPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonModern[] = INCBIN_U16("graphics/pokemon/vivillon/modern/normal.gbapal"); - const u32 gMonBackPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/back.4bpp.lz"); + const u32 gMonBackPic_VivillonModern[] = INCBIN_U32("graphics/pokemon/vivillon/modern/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonModern[] = INCBIN_U16("graphics/pokemon/vivillon/modern/shiny.gbapal"); const u8 gMonIcon_VivillonModern[] = INCBIN_U8("graphics/pokemon/vivillon/modern/icon.4bpp"); - const u32 gMonFrontPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMarine[] = INCBIN_U16("graphics/pokemon/vivillon/marine/normal.gbapal"); - const u32 gMonBackPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMarine[] = INCBIN_U32("graphics/pokemon/vivillon/marine/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMarine[] = INCBIN_U16("graphics/pokemon/vivillon/marine/shiny.gbapal"); const u8 gMonIcon_VivillonMarine[] = INCBIN_U8("graphics/pokemon/vivillon/marine/icon.4bpp"); - const u32 gMonFrontPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonArchipelago[] = INCBIN_U16("graphics/pokemon/vivillon/archipelago/normal.gbapal"); - const u32 gMonBackPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/back.4bpp.lz"); + const u32 gMonBackPic_VivillonArchipelago[] = INCBIN_U32("graphics/pokemon/vivillon/archipelago/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonArchipelago[] = INCBIN_U16("graphics/pokemon/vivillon/archipelago/shiny.gbapal"); const u8 gMonIcon_VivillonArchipelago[] = INCBIN_U8("graphics/pokemon/vivillon/archipelago/icon.4bpp"); - const u32 gMonFrontPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonHighPlains[] = INCBIN_U16("graphics/pokemon/vivillon/high_plains/normal.gbapal"); - const u32 gMonBackPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/back.4bpp.lz"); + const u32 gMonBackPic_VivillonHighPlains[] = INCBIN_U32("graphics/pokemon/vivillon/high_plains/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonHighPlains[] = INCBIN_U16("graphics/pokemon/vivillon/high_plains/shiny.gbapal"); const u8 gMonIcon_VivillonHighPlains[] = INCBIN_U8("graphics/pokemon/vivillon/high_plains/icon.4bpp"); - const u32 gMonFrontPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSandstorm[] = INCBIN_U16("graphics/pokemon/vivillon/sandstorm/normal.gbapal"); - const u32 gMonBackPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSandstorm[] = INCBIN_U32("graphics/pokemon/vivillon/sandstorm/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSandstorm[] = INCBIN_U16("graphics/pokemon/vivillon/sandstorm/shiny.gbapal"); const u8 gMonIcon_VivillonSandstorm[] = INCBIN_U8("graphics/pokemon/vivillon/sandstorm/icon.4bpp"); - const u32 gMonFrontPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonRiver[] = INCBIN_U16("graphics/pokemon/vivillon/river/normal.gbapal"); - const u32 gMonBackPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/back.4bpp.lz"); + const u32 gMonBackPic_VivillonRiver[] = INCBIN_U32("graphics/pokemon/vivillon/river/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonRiver[] = INCBIN_U16("graphics/pokemon/vivillon/river/shiny.gbapal"); const u8 gMonIcon_VivillonRiver[] = INCBIN_U8("graphics/pokemon/vivillon/river/icon.4bpp"); - const u32 gMonFrontPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonMonsoon[] = INCBIN_U16("graphics/pokemon/vivillon/monsoon/normal.gbapal"); - const u32 gMonBackPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/back.4bpp.lz"); + const u32 gMonBackPic_VivillonMonsoon[] = INCBIN_U32("graphics/pokemon/vivillon/monsoon/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonMonsoon[] = INCBIN_U16("graphics/pokemon/vivillon/monsoon/shiny.gbapal"); const u8 gMonIcon_VivillonMonsoon[] = INCBIN_U8("graphics/pokemon/vivillon/monsoon/icon.4bpp"); - const u32 gMonFrontPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSavanna[] = INCBIN_U16("graphics/pokemon/vivillon/savanna/normal.gbapal"); - const u32 gMonBackPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSavanna[] = INCBIN_U32("graphics/pokemon/vivillon/savanna/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSavanna[] = INCBIN_U16("graphics/pokemon/vivillon/savanna/shiny.gbapal"); const u8 gMonIcon_VivillonSavanna[] = INCBIN_U8("graphics/pokemon/vivillon/savanna/icon.4bpp"); - const u32 gMonFrontPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonSun[] = INCBIN_U16("graphics/pokemon/vivillon/sun/normal.gbapal"); - const u32 gMonBackPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/back.4bpp.lz"); + const u32 gMonBackPic_VivillonSun[] = INCBIN_U32("graphics/pokemon/vivillon/sun/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonSun[] = INCBIN_U16("graphics/pokemon/vivillon/sun/shiny.gbapal"); const u8 gMonIcon_VivillonSun[] = INCBIN_U8("graphics/pokemon/vivillon/sun/icon.4bpp"); @@ -19492,35 +19492,35 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonOcean[] = INCBIN_U16("graphics/pokemon/vivillon/ocean/normal.gbapal"); - const u32 gMonBackPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/back.4bpp.lz"); + const u32 gMonBackPic_VivillonOcean[] = INCBIN_U32("graphics/pokemon/vivillon/ocean/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonOcean[] = INCBIN_U16("graphics/pokemon/vivillon/ocean/shiny.gbapal"); const u8 gMonIcon_VivillonOcean[] = INCBIN_U8("graphics/pokemon/vivillon/ocean/icon.4bpp"); - const u32 gMonFrontPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonJungle[] = INCBIN_U16("graphics/pokemon/vivillon/jungle/normal.gbapal"); - const u32 gMonBackPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/back.4bpp.lz"); + const u32 gMonBackPic_VivillonJungle[] = INCBIN_U32("graphics/pokemon/vivillon/jungle/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonJungle[] = INCBIN_U16("graphics/pokemon/vivillon/jungle/shiny.gbapal"); const u8 gMonIcon_VivillonJungle[] = INCBIN_U8("graphics/pokemon/vivillon/jungle/icon.4bpp"); - const u32 gMonFrontPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonFancy[] = INCBIN_U16("graphics/pokemon/vivillon/fancy/normal.gbapal"); - const u32 gMonBackPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/back.4bpp.lz"); + const u32 gMonBackPic_VivillonFancy[] = INCBIN_U32("graphics/pokemon/vivillon/fancy/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonFancy[] = INCBIN_U16("graphics/pokemon/vivillon/fancy/shiny.gbapal"); const u8 gMonIcon_VivillonFancy[] = INCBIN_U8("graphics/pokemon/vivillon/fancy/icon.4bpp"); - const u32 gMonFrontPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/anim_front.4bpp.lz"); + const u32 gMonFrontPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/anim_front.4bpp.smol"); const u16 gMonPalette_VivillonPokeBall[] = INCBIN_U16("graphics/pokemon/vivillon/poke_ball/normal.gbapal"); - const u32 gMonBackPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/back.4bpp.lz"); + const u32 gMonBackPic_VivillonPokeBall[] = INCBIN_U32("graphics/pokemon/vivillon/poke_ball/back.4bpp.smol"); const u16 gMonShinyPalette_VivillonPokeBall[] = INCBIN_U16("graphics/pokemon/vivillon/poke_ball/shiny.gbapal"); const u8 gMonIcon_VivillonPokeBall[] = INCBIN_U8("graphics/pokemon/vivillon/poke_ball/icon.4bpp"); #endif //P_FAMILY_SCATTERBUG #if P_FAMILY_LITLEO - const u32 gMonFrontPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/anim_front.4bpp.smol"); const u16 gMonPalette_Litleo[] = INCBIN_U16("graphics/pokemon/litleo/normal.gbapal"); - const u32 gMonBackPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/back.4bpp.lz"); + const u32 gMonBackPic_Litleo[] = INCBIN_U32("graphics/pokemon/litleo/back.4bpp.smol"); const u16 gMonShinyPalette_Litleo[] = INCBIN_U16("graphics/pokemon/litleo/shiny.gbapal"); const u8 gMonIcon_Litleo[] = INCBIN_U8("graphics/pokemon/litleo/icon.4bpp"); #if P_FOOTPRINTS @@ -19534,9 +19534,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/anim_front.4bpp.smol"); const u16 gMonPalette_Pyroar[] = INCBIN_U16("graphics/pokemon/pyroar/normal.gbapal"); - const u32 gMonBackPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/back.4bpp.lz"); + const u32 gMonBackPic_Pyroar[] = INCBIN_U32("graphics/pokemon/pyroar/back.4bpp.smol"); const u16 gMonShinyPalette_Pyroar[] = INCBIN_U16("graphics/pokemon/pyroar/shiny.gbapal"); const u8 gMonIcon_Pyroar[] = INCBIN_U8("graphics/pokemon/pyroar/icon.4bpp"); #if P_FOOTPRINTS @@ -19551,8 +19551,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GENDER_DIFFERENCES - const u32 gMonFrontPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/anim_frontf.4bpp.lz"); - const u32 gMonBackPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/backf.4bpp.lz"); + const u32 gMonFrontPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/anim_frontf.4bpp.smol"); + const u32 gMonBackPic_PyroarF[] = INCBIN_U32("graphics/pokemon/pyroar/backf.4bpp.smol"); const u8 gMonIcon_PyroarF[] = INCBIN_U8("graphics/pokemon/pyroar/iconf.4bpp"); #if OW_POKEMON_OBJECT_EVENTS const u32 gObjectEventPic_PyroarF[] = INCBIN_COMP("graphics/pokemon/pyroar/overworldf.4bpp"); @@ -19561,8 +19561,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITLEO #if P_FAMILY_FLABEBE - const u32 gMonFrontPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/anim_front.4bpp.lz"); - const u32 gMonBackPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/back.4bpp.lz"); + const u32 gMonFrontPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/anim_front.4bpp.smol"); + const u32 gMonBackPic_Flabebe[] = INCBIN_U32("graphics/pokemon/flabebe/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Flabebe[] = INCBIN_U8("graphics/pokemon/flabebe/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19607,8 +19607,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/anim_front.4bpp.lz"); - const u32 gMonBackPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/back.4bpp.lz"); + const u32 gMonFrontPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/anim_front.4bpp.smol"); + const u32 gMonBackPic_Floette[] = INCBIN_U32("graphics/pokemon/floette/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Floette[] = INCBIN_U8("graphics/pokemon/floette/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19633,9 +19633,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonShinyPalette_FloetteWhite[] = INCBIN_U16("graphics/pokemon/floette/white/shiny.gbapal"); const u8 gMonIcon_FloetteWhite[] = INCBIN_U8("graphics/pokemon/floette/white/icon.4bpp"); - const u32 gMonFrontPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/anim_front.4bpp.smol"); const u16 gMonPalette_FloetteEternal[] = INCBIN_U16("graphics/pokemon/floette/eternal/normal.gbapal"); - const u32 gMonBackPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/back.4bpp.lz"); + const u32 gMonBackPic_FloetteEternal[] = INCBIN_U32("graphics/pokemon/floette/eternal/back.4bpp.smol"); const u16 gMonShinyPalette_FloetteEternal[] = INCBIN_U16("graphics/pokemon/floette/eternal/shiny.gbapal"); const u8 gMonIcon_FloetteEternal[] = INCBIN_U8("graphics/pokemon/floette/eternal/icon.4bpp"); @@ -19662,8 +19662,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/anim_front.4bpp.lz"); - const u32 gMonBackPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/back.4bpp.lz"); + const u32 gMonFrontPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/anim_front.4bpp.smol"); + const u32 gMonBackPic_Florges[] = INCBIN_U32("graphics/pokemon/florges/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Florges[] = INCBIN_U8("graphics/pokemon/florges/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -19710,9 +19710,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLABEBE #if P_FAMILY_SKIDDO - const u32 gMonFrontPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/anim_front.4bpp.smol"); const u16 gMonPalette_Skiddo[] = INCBIN_U16("graphics/pokemon/skiddo/normal.gbapal"); - const u32 gMonBackPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/back.4bpp.lz"); + const u32 gMonBackPic_Skiddo[] = INCBIN_U32("graphics/pokemon/skiddo/back.4bpp.smol"); const u16 gMonShinyPalette_Skiddo[] = INCBIN_U16("graphics/pokemon/skiddo/shiny.gbapal"); const u8 gMonIcon_Skiddo[] = INCBIN_U8("graphics/pokemon/skiddo/icon.4bpp"); #if P_FOOTPRINTS @@ -19726,9 +19726,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/anim_front.4bpp.smol"); const u16 gMonPalette_Gogoat[] = INCBIN_U16("graphics/pokemon/gogoat/normal.gbapal"); - const u32 gMonBackPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/back.4bpp.lz"); + const u32 gMonBackPic_Gogoat[] = INCBIN_U32("graphics/pokemon/gogoat/back.4bpp.smol"); const u16 gMonShinyPalette_Gogoat[] = INCBIN_U16("graphics/pokemon/gogoat/shiny.gbapal"); const u8 gMonIcon_Gogoat[] = INCBIN_U8("graphics/pokemon/gogoat/icon.4bpp"); #if P_FOOTPRINTS @@ -19744,9 +19744,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKIDDO #if P_FAMILY_PANCHAM - const u32 gMonFrontPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/anim_front.4bpp.smol"); const u16 gMonPalette_Pancham[] = INCBIN_U16("graphics/pokemon/pancham/normal.gbapal"); - const u32 gMonBackPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/back.4bpp.lz"); + const u32 gMonBackPic_Pancham[] = INCBIN_U32("graphics/pokemon/pancham/back.4bpp.smol"); const u16 gMonShinyPalette_Pancham[] = INCBIN_U16("graphics/pokemon/pancham/shiny.gbapal"); const u8 gMonIcon_Pancham[] = INCBIN_U8("graphics/pokemon/pancham/icon.4bpp"); #if P_FOOTPRINTS @@ -19760,9 +19760,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/anim_front.4bpp.smol"); const u16 gMonPalette_Pangoro[] = INCBIN_U16("graphics/pokemon/pangoro/normal.gbapal"); - const u32 gMonBackPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/back.4bpp.lz"); + const u32 gMonBackPic_Pangoro[] = INCBIN_U32("graphics/pokemon/pangoro/back.4bpp.smol"); const u16 gMonShinyPalette_Pangoro[] = INCBIN_U16("graphics/pokemon/pangoro/shiny.gbapal"); const u8 gMonIcon_Pangoro[] = INCBIN_U8("graphics/pokemon/pangoro/icon.4bpp"); #if P_FOOTPRINTS @@ -19778,66 +19778,66 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PANCHAM #if P_FAMILY_FURFROU - const u32 gMonFrontPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouNatural[] = INCBIN_U16("graphics/pokemon/furfrou/normal.gbapal"); - const u32 gMonBackPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouNatural[] = INCBIN_U32("graphics/pokemon/furfrou/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouNatural[] = INCBIN_U16("graphics/pokemon/furfrou/shiny.gbapal"); const u8 gMonIcon_FurfrouNatural[] = INCBIN_U8("graphics/pokemon/furfrou/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Furfrou[] = INCBIN_U8("graphics/pokemon/furfrou/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouHeart[] = INCBIN_U16("graphics/pokemon/furfrou/heart/normal.gbapal"); - const u32 gMonBackPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouHeart[] = INCBIN_U32("graphics/pokemon/furfrou/heart/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouHeart[] = INCBIN_U16("graphics/pokemon/furfrou/heart/shiny.gbapal"); const u8 gMonIcon_FurfrouHeart[] = INCBIN_U8("graphics/pokemon/furfrou/heart/icon.4bpp"); - const u32 gMonFrontPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouStar[] = INCBIN_U16("graphics/pokemon/furfrou/star/normal.gbapal"); - const u32 gMonBackPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouStar[] = INCBIN_U32("graphics/pokemon/furfrou/star/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouStar[] = INCBIN_U16("graphics/pokemon/furfrou/star/shiny.gbapal"); const u8 gMonIcon_FurfrouStar[] = INCBIN_U8("graphics/pokemon/furfrou/star/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDiamond[] = INCBIN_U16("graphics/pokemon/furfrou/diamond/normal.gbapal"); - const u32 gMonBackPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDiamond[] = INCBIN_U32("graphics/pokemon/furfrou/diamond/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDiamond[] = INCBIN_U16("graphics/pokemon/furfrou/diamond/shiny.gbapal"); const u8 gMonIcon_FurfrouDiamond[] = INCBIN_U8("graphics/pokemon/furfrou/diamond/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDebutante[] = INCBIN_U16("graphics/pokemon/furfrou/debutante/normal.gbapal"); - const u32 gMonBackPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDebutante[] = INCBIN_U32("graphics/pokemon/furfrou/debutante/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDebutante[] = INCBIN_U16("graphics/pokemon/furfrou/debutante/shiny.gbapal"); const u8 gMonIcon_FurfrouDebutante[] = INCBIN_U8("graphics/pokemon/furfrou/debutante/icon.4bpp"); - const u32 gMonFrontPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouMatron[] = INCBIN_U16("graphics/pokemon/furfrou/matron/normal.gbapal"); - const u32 gMonBackPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouMatron[] = INCBIN_U32("graphics/pokemon/furfrou/matron/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouMatron[] = INCBIN_U16("graphics/pokemon/furfrou/matron/shiny.gbapal"); const u8 gMonIcon_FurfrouMatron[] = INCBIN_U8("graphics/pokemon/furfrou/matron/icon.4bpp"); - const u32 gMonFrontPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouDandy[] = INCBIN_U16("graphics/pokemon/furfrou/dandy/normal.gbapal"); - const u32 gMonBackPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouDandy[] = INCBIN_U32("graphics/pokemon/furfrou/dandy/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouDandy[] = INCBIN_U16("graphics/pokemon/furfrou/dandy/shiny.gbapal"); const u8 gMonIcon_FurfrouDandy[] = INCBIN_U8("graphics/pokemon/furfrou/dandy/icon.4bpp"); - const u32 gMonFrontPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouLaReine[] = INCBIN_U16("graphics/pokemon/furfrou/la_reine/normal.gbapal"); - const u32 gMonBackPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouLaReine[] = INCBIN_U32("graphics/pokemon/furfrou/la_reine/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouLaReine[] = INCBIN_U16("graphics/pokemon/furfrou/la_reine/shiny.gbapal"); const u8 gMonIcon_FurfrouLaReine[] = INCBIN_U8("graphics/pokemon/furfrou/la_reine/icon.4bpp"); - const u32 gMonFrontPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouKabuki[] = INCBIN_U16("graphics/pokemon/furfrou/kabuki/normal.gbapal"); - const u32 gMonBackPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouKabuki[] = INCBIN_U32("graphics/pokemon/furfrou/kabuki/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouKabuki[] = INCBIN_U16("graphics/pokemon/furfrou/kabuki/shiny.gbapal"); const u8 gMonIcon_FurfrouKabuki[] = INCBIN_U8("graphics/pokemon/furfrou/kabuki/icon.4bpp"); - const u32 gMonFrontPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/anim_front.4bpp.lz"); + const u32 gMonFrontPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/anim_front.4bpp.smol"); const u16 gMonPalette_FurfrouPharaoh[] = INCBIN_U16("graphics/pokemon/furfrou/pharaoh/normal.gbapal"); - const u32 gMonBackPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/back.4bpp.lz"); + const u32 gMonBackPic_FurfrouPharaoh[] = INCBIN_U32("graphics/pokemon/furfrou/pharaoh/back.4bpp.smol"); const u16 gMonShinyPalette_FurfrouPharaoh[] = INCBIN_U16("graphics/pokemon/furfrou/pharaoh/shiny.gbapal"); const u8 gMonIcon_FurfrouPharaoh[] = INCBIN_U8("graphics/pokemon/furfrou/pharaoh/icon.4bpp"); @@ -19878,9 +19878,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FURFROU #if P_FAMILY_ESPURR - const u32 gMonFrontPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/anim_front.4bpp.smol"); const u16 gMonPalette_Espurr[] = INCBIN_U16("graphics/pokemon/espurr/normal.gbapal"); - const u32 gMonBackPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/back.4bpp.lz"); + const u32 gMonBackPic_Espurr[] = INCBIN_U32("graphics/pokemon/espurr/back.4bpp.smol"); const u16 gMonShinyPalette_Espurr[] = INCBIN_U16("graphics/pokemon/espurr/shiny.gbapal"); const u8 gMonIcon_Espurr[] = INCBIN_U8("graphics/pokemon/espurr/icon.4bpp"); #if P_FOOTPRINTS @@ -19894,9 +19894,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/anim_front.4bpp.smol"); const u16 gMonPalette_MeowsticM[] = INCBIN_U16("graphics/pokemon/meowstic/normal.gbapal"); - const u32 gMonBackPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/back.4bpp.lz"); + const u32 gMonBackPic_MeowsticM[] = INCBIN_U32("graphics/pokemon/meowstic/back.4bpp.smol"); const u16 gMonShinyPalette_MeowsticM[] = INCBIN_U16("graphics/pokemon/meowstic/shiny.gbapal"); const u8 gMonIcon_MeowsticM[] = INCBIN_U8("graphics/pokemon/meowstic/icon.4bpp"); #if P_FOOTPRINTS @@ -19910,9 +19910,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/anim_front.4bpp.lz"); + const u32 gMonFrontPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/anim_front.4bpp.smol"); const u16 gMonPalette_MeowsticF[] = INCBIN_U16("graphics/pokemon/meowstic/f/normal.gbapal"); - const u32 gMonBackPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/back.4bpp.lz"); + const u32 gMonBackPic_MeowsticF[] = INCBIN_U32("graphics/pokemon/meowstic/f/back.4bpp.smol"); const u16 gMonShinyPalette_MeowsticF[] = INCBIN_U16("graphics/pokemon/meowstic/f/shiny.gbapal"); const u8 gMonIcon_MeowsticF[] = INCBIN_U8("graphics/pokemon/meowstic/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19925,9 +19925,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ESPURR #if P_FAMILY_HONEDGE - const u32 gMonFrontPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/anim_front.4bpp.smol"); const u16 gMonPalette_Honedge[] = INCBIN_U16("graphics/pokemon/honedge/normal.gbapal"); - const u32 gMonBackPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/back.4bpp.lz"); + const u32 gMonBackPic_Honedge[] = INCBIN_U32("graphics/pokemon/honedge/back.4bpp.smol"); const u16 gMonShinyPalette_Honedge[] = INCBIN_U16("graphics/pokemon/honedge/shiny.gbapal"); const u8 gMonIcon_Honedge[] = INCBIN_U8("graphics/pokemon/honedge/icon.4bpp"); #if P_FOOTPRINTS @@ -19941,9 +19941,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/anim_front.4bpp.smol"); const u16 gMonPalette_Doublade[] = INCBIN_U16("graphics/pokemon/doublade/normal.gbapal"); - const u32 gMonBackPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/back.4bpp.lz"); + const u32 gMonBackPic_Doublade[] = INCBIN_U32("graphics/pokemon/doublade/back.4bpp.smol"); const u16 gMonShinyPalette_Doublade[] = INCBIN_U16("graphics/pokemon/doublade/shiny.gbapal"); const u8 gMonIcon_Doublade[] = INCBIN_U8("graphics/pokemon/doublade/icon.4bpp"); #if P_FOOTPRINTS @@ -19957,9 +19957,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/anim_front.4bpp.lz"); + const u32 gMonFrontPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/anim_front.4bpp.smol"); const u16 gMonPalette_AegislashShield[] = INCBIN_U16("graphics/pokemon/aegislash/normal.gbapal"); - const u32 gMonBackPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/back.4bpp.lz"); + const u32 gMonBackPic_AegislashShield[] = INCBIN_U32("graphics/pokemon/aegislash/back.4bpp.smol"); const u16 gMonShinyPalette_AegislashShield[] = INCBIN_U16("graphics/pokemon/aegislash/shiny.gbapal"); const u8 gMonIcon_AegislashShield[] = INCBIN_U8("graphics/pokemon/aegislash/icon.4bpp"); #if P_FOOTPRINTS @@ -19973,9 +19973,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/anim_front.4bpp.lz"); + const u32 gMonFrontPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/anim_front.4bpp.smol"); const u16 gMonPalette_AegislashBlade[] = INCBIN_U16("graphics/pokemon/aegislash/blade/normal.gbapal"); - const u32 gMonBackPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/back.4bpp.lz"); + const u32 gMonBackPic_AegislashBlade[] = INCBIN_U32("graphics/pokemon/aegislash/blade/back.4bpp.smol"); const u16 gMonShinyPalette_AegislashBlade[] = INCBIN_U16("graphics/pokemon/aegislash/blade/shiny.gbapal"); const u8 gMonIcon_AegislashBlade[] = INCBIN_U8("graphics/pokemon/aegislash/blade/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -19988,9 +19988,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HONEDGE #if P_FAMILY_SPRITZEE - const u32 gMonFrontPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/anim_front.4bpp.smol"); const u16 gMonPalette_Spritzee[] = INCBIN_U16("graphics/pokemon/spritzee/normal.gbapal"); - const u32 gMonBackPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/back.4bpp.lz"); + const u32 gMonBackPic_Spritzee[] = INCBIN_U32("graphics/pokemon/spritzee/back.4bpp.smol"); const u16 gMonShinyPalette_Spritzee[] = INCBIN_U16("graphics/pokemon/spritzee/shiny.gbapal"); const u8 gMonIcon_Spritzee[] = INCBIN_U8("graphics/pokemon/spritzee/icon.4bpp"); #if P_FOOTPRINTS @@ -20004,9 +20004,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/anim_front.4bpp.smol"); const u16 gMonPalette_Aromatisse[] = INCBIN_U16("graphics/pokemon/aromatisse/normal.gbapal"); - const u32 gMonBackPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/back.4bpp.lz"); + const u32 gMonBackPic_Aromatisse[] = INCBIN_U32("graphics/pokemon/aromatisse/back.4bpp.smol"); const u16 gMonShinyPalette_Aromatisse[] = INCBIN_U16("graphics/pokemon/aromatisse/shiny.gbapal"); const u8 gMonIcon_Aromatisse[] = INCBIN_U8("graphics/pokemon/aromatisse/icon.4bpp"); #if P_FOOTPRINTS @@ -20022,9 +20022,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPRITZEE #if P_FAMILY_SWIRLIX - const u32 gMonFrontPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/anim_front.4bpp.smol"); const u16 gMonPalette_Swirlix[] = INCBIN_U16("graphics/pokemon/swirlix/normal.gbapal"); - const u32 gMonBackPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/back.4bpp.lz"); + const u32 gMonBackPic_Swirlix[] = INCBIN_U32("graphics/pokemon/swirlix/back.4bpp.smol"); const u16 gMonShinyPalette_Swirlix[] = INCBIN_U16("graphics/pokemon/swirlix/shiny.gbapal"); const u8 gMonIcon_Swirlix[] = INCBIN_U8("graphics/pokemon/swirlix/icon.4bpp"); #if P_FOOTPRINTS @@ -20038,9 +20038,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/anim_front.4bpp.smol"); const u16 gMonPalette_Slurpuff[] = INCBIN_U16("graphics/pokemon/slurpuff/normal.gbapal"); - const u32 gMonBackPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/back.4bpp.lz"); + const u32 gMonBackPic_Slurpuff[] = INCBIN_U32("graphics/pokemon/slurpuff/back.4bpp.smol"); const u16 gMonShinyPalette_Slurpuff[] = INCBIN_U16("graphics/pokemon/slurpuff/shiny.gbapal"); const u8 gMonIcon_Slurpuff[] = INCBIN_U8("graphics/pokemon/slurpuff/icon.4bpp"); #if P_FOOTPRINTS @@ -20056,9 +20056,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SWIRLIX #if P_FAMILY_INKAY - const u32 gMonFrontPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/anim_front.4bpp.smol"); const u16 gMonPalette_Inkay[] = INCBIN_U16("graphics/pokemon/inkay/normal.gbapal"); - const u32 gMonBackPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/back.4bpp.lz"); + const u32 gMonBackPic_Inkay[] = INCBIN_U32("graphics/pokemon/inkay/back.4bpp.smol"); const u16 gMonShinyPalette_Inkay[] = INCBIN_U16("graphics/pokemon/inkay/shiny.gbapal"); const u8 gMonIcon_Inkay[] = INCBIN_U8("graphics/pokemon/inkay/icon.4bpp"); #if P_FOOTPRINTS @@ -20072,9 +20072,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/anim_front.4bpp.smol"); const u16 gMonPalette_Malamar[] = INCBIN_U16("graphics/pokemon/malamar/normal.gbapal"); - const u32 gMonBackPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/back.4bpp.lz"); + const u32 gMonBackPic_Malamar[] = INCBIN_U32("graphics/pokemon/malamar/back.4bpp.smol"); const u16 gMonShinyPalette_Malamar[] = INCBIN_U16("graphics/pokemon/malamar/shiny.gbapal"); const u8 gMonIcon_Malamar[] = INCBIN_U8("graphics/pokemon/malamar/icon.4bpp"); #if P_FOOTPRINTS @@ -20090,9 +20090,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_INKAY #if P_FAMILY_BINACLE - const u32 gMonFrontPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/anim_front.4bpp.smol"); const u16 gMonPalette_Binacle[] = INCBIN_U16("graphics/pokemon/binacle/normal.gbapal"); - const u32 gMonBackPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/back.4bpp.lz"); + const u32 gMonBackPic_Binacle[] = INCBIN_U32("graphics/pokemon/binacle/back.4bpp.smol"); const u16 gMonShinyPalette_Binacle[] = INCBIN_U16("graphics/pokemon/binacle/shiny.gbapal"); const u8 gMonIcon_Binacle[] = INCBIN_U8("graphics/pokemon/binacle/icon.4bpp"); #if P_FOOTPRINTS @@ -20106,9 +20106,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/anim_front.4bpp.smol"); const u16 gMonPalette_Barbaracle[] = INCBIN_U16("graphics/pokemon/barbaracle/normal.gbapal"); - const u32 gMonBackPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/back.4bpp.lz"); + const u32 gMonBackPic_Barbaracle[] = INCBIN_U32("graphics/pokemon/barbaracle/back.4bpp.smol"); const u16 gMonShinyPalette_Barbaracle[] = INCBIN_U16("graphics/pokemon/barbaracle/shiny.gbapal"); const u8 gMonIcon_Barbaracle[] = INCBIN_U8("graphics/pokemon/barbaracle/icon.4bpp"); #if P_FOOTPRINTS @@ -20124,9 +20124,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BINACLE #if P_FAMILY_SKRELP - const u32 gMonFrontPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/anim_front.4bpp.smol"); const u16 gMonPalette_Skrelp[] = INCBIN_U16("graphics/pokemon/skrelp/normal.gbapal"); - const u32 gMonBackPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/back.4bpp.lz"); + const u32 gMonBackPic_Skrelp[] = INCBIN_U32("graphics/pokemon/skrelp/back.4bpp.smol"); const u16 gMonShinyPalette_Skrelp[] = INCBIN_U16("graphics/pokemon/skrelp/shiny.gbapal"); const u8 gMonIcon_Skrelp[] = INCBIN_U8("graphics/pokemon/skrelp/icon.4bpp"); #if P_FOOTPRINTS @@ -20140,9 +20140,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/anim_front.4bpp.smol"); const u16 gMonPalette_Dragalge[] = INCBIN_U16("graphics/pokemon/dragalge/normal.gbapal"); - const u32 gMonBackPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/back.4bpp.lz"); + const u32 gMonBackPic_Dragalge[] = INCBIN_U32("graphics/pokemon/dragalge/back.4bpp.smol"); const u16 gMonShinyPalette_Dragalge[] = INCBIN_U16("graphics/pokemon/dragalge/shiny.gbapal"); const u8 gMonIcon_Dragalge[] = INCBIN_U8("graphics/pokemon/dragalge/icon.4bpp"); #if P_FOOTPRINTS @@ -20158,9 +20158,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKRELP #if P_FAMILY_CLAUNCHER - const u32 gMonFrontPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/anim_front.4bpp.smol"); const u16 gMonPalette_Clauncher[] = INCBIN_U16("graphics/pokemon/clauncher/normal.gbapal"); - const u32 gMonBackPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/back.4bpp.lz"); + const u32 gMonBackPic_Clauncher[] = INCBIN_U32("graphics/pokemon/clauncher/back.4bpp.smol"); const u16 gMonShinyPalette_Clauncher[] = INCBIN_U16("graphics/pokemon/clauncher/shiny.gbapal"); const u8 gMonIcon_Clauncher[] = INCBIN_U8("graphics/pokemon/clauncher/icon.4bpp"); #if P_FOOTPRINTS @@ -20174,9 +20174,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/anim_front.4bpp.smol"); const u16 gMonPalette_Clawitzer[] = INCBIN_U16("graphics/pokemon/clawitzer/normal.gbapal"); - const u32 gMonBackPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/back.4bpp.lz"); + const u32 gMonBackPic_Clawitzer[] = INCBIN_U32("graphics/pokemon/clawitzer/back.4bpp.smol"); const u16 gMonShinyPalette_Clawitzer[] = INCBIN_U16("graphics/pokemon/clawitzer/shiny.gbapal"); const u8 gMonIcon_Clawitzer[] = INCBIN_U8("graphics/pokemon/clawitzer/icon.4bpp"); #if P_FOOTPRINTS @@ -20192,9 +20192,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CLAUNCHER #if P_FAMILY_HELIOPTILE - const u32 gMonFrontPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/anim_front.4bpp.smol"); const u16 gMonPalette_Helioptile[] = INCBIN_U16("graphics/pokemon/helioptile/normal.gbapal"); - const u32 gMonBackPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/back.4bpp.lz"); + const u32 gMonBackPic_Helioptile[] = INCBIN_U32("graphics/pokemon/helioptile/back.4bpp.smol"); const u16 gMonShinyPalette_Helioptile[] = INCBIN_U16("graphics/pokemon/helioptile/shiny.gbapal"); const u8 gMonIcon_Helioptile[] = INCBIN_U8("graphics/pokemon/helioptile/icon.4bpp"); #if P_FOOTPRINTS @@ -20208,9 +20208,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/anim_front.4bpp.smol"); const u16 gMonPalette_Heliolisk[] = INCBIN_U16("graphics/pokemon/heliolisk/normal.gbapal"); - const u32 gMonBackPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/back.4bpp.lz"); + const u32 gMonBackPic_Heliolisk[] = INCBIN_U32("graphics/pokemon/heliolisk/back.4bpp.smol"); const u16 gMonShinyPalette_Heliolisk[] = INCBIN_U16("graphics/pokemon/heliolisk/shiny.gbapal"); const u8 gMonIcon_Heliolisk[] = INCBIN_U8("graphics/pokemon/heliolisk/icon.4bpp"); #if P_FOOTPRINTS @@ -20226,9 +20226,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HELIOPTILE #if P_FAMILY_TYRUNT - const u32 gMonFrontPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrunt[] = INCBIN_U16("graphics/pokemon/tyrunt/normal.gbapal"); - const u32 gMonBackPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/back.4bpp.lz"); + const u32 gMonBackPic_Tyrunt[] = INCBIN_U32("graphics/pokemon/tyrunt/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrunt[] = INCBIN_U16("graphics/pokemon/tyrunt/shiny.gbapal"); const u8 gMonIcon_Tyrunt[] = INCBIN_U8("graphics/pokemon/tyrunt/icon.4bpp"); #if P_FOOTPRINTS @@ -20242,9 +20242,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/anim_front.4bpp.smol"); const u16 gMonPalette_Tyrantrum[] = INCBIN_U16("graphics/pokemon/tyrantrum/normal.gbapal"); - const u32 gMonBackPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/back.4bpp.lz"); + const u32 gMonBackPic_Tyrantrum[] = INCBIN_U32("graphics/pokemon/tyrantrum/back.4bpp.smol"); const u16 gMonShinyPalette_Tyrantrum[] = INCBIN_U16("graphics/pokemon/tyrantrum/shiny.gbapal"); const u8 gMonIcon_Tyrantrum[] = INCBIN_U8("graphics/pokemon/tyrantrum/icon.4bpp"); #if P_FOOTPRINTS @@ -20260,9 +20260,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYRUNT #if P_FAMILY_AMAURA - const u32 gMonFrontPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/anim_front.4bpp.smol"); const u16 gMonPalette_Amaura[] = INCBIN_U16("graphics/pokemon/amaura/normal.gbapal"); - const u32 gMonBackPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/back.4bpp.lz"); + const u32 gMonBackPic_Amaura[] = INCBIN_U32("graphics/pokemon/amaura/back.4bpp.smol"); const u16 gMonShinyPalette_Amaura[] = INCBIN_U16("graphics/pokemon/amaura/shiny.gbapal"); const u8 gMonIcon_Amaura[] = INCBIN_U8("graphics/pokemon/amaura/icon.4bpp"); #if P_FOOTPRINTS @@ -20276,9 +20276,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/anim_front.4bpp.smol"); const u16 gMonPalette_Aurorus[] = INCBIN_U16("graphics/pokemon/aurorus/normal.gbapal"); - const u32 gMonBackPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/back.4bpp.lz"); + const u32 gMonBackPic_Aurorus[] = INCBIN_U32("graphics/pokemon/aurorus/back.4bpp.smol"); const u16 gMonShinyPalette_Aurorus[] = INCBIN_U16("graphics/pokemon/aurorus/shiny.gbapal"); const u8 gMonIcon_Aurorus[] = INCBIN_U8("graphics/pokemon/aurorus/icon.4bpp"); #if P_FOOTPRINTS @@ -20294,9 +20294,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_AMAURA #if P_FAMILY_HAWLUCHA - const u32 gMonFrontPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/anim_front.4bpp.smol"); const u16 gMonPalette_Hawlucha[] = INCBIN_U16("graphics/pokemon/hawlucha/normal.gbapal"); - const u32 gMonBackPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/back.4bpp.lz"); + const u32 gMonBackPic_Hawlucha[] = INCBIN_U32("graphics/pokemon/hawlucha/back.4bpp.smol"); const u16 gMonShinyPalette_Hawlucha[] = INCBIN_U16("graphics/pokemon/hawlucha/shiny.gbapal"); const u8 gMonIcon_Hawlucha[] = INCBIN_U8("graphics/pokemon/hawlucha/icon.4bpp"); #if P_FOOTPRINTS @@ -20312,9 +20312,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HAWLUCHA #if P_FAMILY_DEDENNE - const u32 gMonFrontPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/anim_front.4bpp.smol"); const u16 gMonPalette_Dedenne[] = INCBIN_U16("graphics/pokemon/dedenne/normal.gbapal"); - const u32 gMonBackPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/back.4bpp.lz"); + const u32 gMonBackPic_Dedenne[] = INCBIN_U32("graphics/pokemon/dedenne/back.4bpp.smol"); const u16 gMonShinyPalette_Dedenne[] = INCBIN_U16("graphics/pokemon/dedenne/shiny.gbapal"); const u8 gMonIcon_Dedenne[] = INCBIN_U8("graphics/pokemon/dedenne/icon.4bpp"); #if P_FOOTPRINTS @@ -20330,9 +20330,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEDENNE #if P_FAMILY_CARBINK - const u32 gMonFrontPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/anim_front.4bpp.smol"); const u16 gMonPalette_Carbink[] = INCBIN_U16("graphics/pokemon/carbink/normal.gbapal"); - const u32 gMonBackPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/back.4bpp.lz"); + const u32 gMonBackPic_Carbink[] = INCBIN_U32("graphics/pokemon/carbink/back.4bpp.smol"); const u16 gMonShinyPalette_Carbink[] = INCBIN_U16("graphics/pokemon/carbink/shiny.gbapal"); const u8 gMonIcon_Carbink[] = INCBIN_U8("graphics/pokemon/carbink/icon.4bpp"); #if P_FOOTPRINTS @@ -20348,9 +20348,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CARBINK #if P_FAMILY_GOOMY - const u32 gMonFrontPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/anim_front.4bpp.smol"); const u16 gMonPalette_Goomy[] = INCBIN_U16("graphics/pokemon/goomy/normal.gbapal"); - const u32 gMonBackPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/back.4bpp.lz"); + const u32 gMonBackPic_Goomy[] = INCBIN_U32("graphics/pokemon/goomy/back.4bpp.smol"); const u16 gMonShinyPalette_Goomy[] = INCBIN_U16("graphics/pokemon/goomy/shiny.gbapal"); const u8 gMonIcon_Goomy[] = INCBIN_U8("graphics/pokemon/goomy/icon.4bpp"); #if P_FOOTPRINTS @@ -20364,9 +20364,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/anim_front.4bpp.smol"); const u16 gMonPalette_Sliggoo[] = INCBIN_U16("graphics/pokemon/sliggoo/normal.gbapal"); - const u32 gMonBackPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/back.4bpp.lz"); + const u32 gMonBackPic_Sliggoo[] = INCBIN_U32("graphics/pokemon/sliggoo/back.4bpp.smol"); const u16 gMonShinyPalette_Sliggoo[] = INCBIN_U16("graphics/pokemon/sliggoo/shiny.gbapal"); const u8 gMonIcon_Sliggoo[] = INCBIN_U8("graphics/pokemon/sliggoo/icon.4bpp"); #if P_FOOTPRINTS @@ -20381,9 +20381,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/front.4bpp.smol"); const u16 gMonPalette_SliggooHisui[] = INCBIN_U16("graphics/pokemon/sliggoo/hisui/normal.gbapal"); - const u32 gMonBackPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/back.4bpp.lz"); + const u32 gMonBackPic_SliggooHisui[] = INCBIN_U32("graphics/pokemon/sliggoo/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_SliggooHisui[] = INCBIN_U16("graphics/pokemon/sliggoo/hisui/shiny.gbapal"); const u8 gMonIcon_SliggooHisui[] = INCBIN_U8("graphics/pokemon/sliggoo/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20395,9 +20395,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_HISUIAN_FORMS - const u32 gMonFrontPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/anim_front.4bpp.smol"); const u16 gMonPalette_Goodra[] = INCBIN_U16("graphics/pokemon/goodra/normal.gbapal"); - const u32 gMonBackPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/back.4bpp.lz"); + const u32 gMonBackPic_Goodra[] = INCBIN_U32("graphics/pokemon/goodra/back.4bpp.smol"); const u16 gMonShinyPalette_Goodra[] = INCBIN_U16("graphics/pokemon/goodra/shiny.gbapal"); const u8 gMonIcon_Goodra[] = INCBIN_U8("graphics/pokemon/goodra/icon.4bpp"); #if P_FOOTPRINTS @@ -20412,9 +20412,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/front.4bpp.smol"); const u16 gMonPalette_GoodraHisui[] = INCBIN_U16("graphics/pokemon/goodra/hisui/normal.gbapal"); - const u32 gMonBackPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/back.4bpp.lz"); + const u32 gMonBackPic_GoodraHisui[] = INCBIN_U32("graphics/pokemon/goodra/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_GoodraHisui[] = INCBIN_U16("graphics/pokemon/goodra/hisui/shiny.gbapal"); const u8 gMonIcon_GoodraHisui[] = INCBIN_U8("graphics/pokemon/goodra/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20428,9 +20428,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOOMY #if P_FAMILY_KLEFKI - const u32 gMonFrontPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/anim_front.4bpp.smol"); const u16 gMonPalette_Klefki[] = INCBIN_U16("graphics/pokemon/klefki/normal.gbapal"); - const u32 gMonBackPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/back.4bpp.lz"); + const u32 gMonBackPic_Klefki[] = INCBIN_U32("graphics/pokemon/klefki/back.4bpp.smol"); const u16 gMonShinyPalette_Klefki[] = INCBIN_U16("graphics/pokemon/klefki/shiny.gbapal"); const u8 gMonIcon_Klefki[] = INCBIN_U8("graphics/pokemon/klefki/icon.4bpp"); #if P_FOOTPRINTS @@ -20446,9 +20446,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLEFKI #if P_FAMILY_PHANTUMP - const u32 gMonFrontPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/anim_front.4bpp.smol"); const u16 gMonPalette_Phantump[] = INCBIN_U16("graphics/pokemon/phantump/normal.gbapal"); - const u32 gMonBackPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/back.4bpp.lz"); + const u32 gMonBackPic_Phantump[] = INCBIN_U32("graphics/pokemon/phantump/back.4bpp.smol"); const u16 gMonShinyPalette_Phantump[] = INCBIN_U16("graphics/pokemon/phantump/shiny.gbapal"); const u8 gMonIcon_Phantump[] = INCBIN_U8("graphics/pokemon/phantump/icon.4bpp"); #if P_FOOTPRINTS @@ -20462,9 +20462,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/anim_front.4bpp.smol"); const u16 gMonPalette_Trevenant[] = INCBIN_U16("graphics/pokemon/trevenant/normal.gbapal"); - const u32 gMonBackPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/back.4bpp.lz"); + const u32 gMonBackPic_Trevenant[] = INCBIN_U32("graphics/pokemon/trevenant/back.4bpp.smol"); const u16 gMonShinyPalette_Trevenant[] = INCBIN_U16("graphics/pokemon/trevenant/shiny.gbapal"); const u8 gMonIcon_Trevenant[] = INCBIN_U8("graphics/pokemon/trevenant/icon.4bpp"); #if P_FOOTPRINTS @@ -20487,17 +20487,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Pumpkaboo[] = INCBIN_U8("graphics/pokemon/pumpkaboo/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooAverage[] = INCBIN_U32("graphics/pokemon/pumpkaboo/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooSmall[] = INCBIN_U32("graphics/pokemon/pumpkaboo/small/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooLarge[] = INCBIN_U32("graphics/pokemon/pumpkaboo/large/back.4bpp.smol"); - const u32 gMonFrontPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/anim_front.4bpp.lz"); - const u32 gMonBackPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/back.4bpp.lz"); + const u32 gMonFrontPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/anim_front.4bpp.smol"); + const u32 gMonBackPic_PumpkabooSuper[] = INCBIN_U32("graphics/pokemon/pumpkaboo/super/back.4bpp.smol"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u16 gOverworldPalette_Pumpkaboo[] = INCBIN_U16("graphics/pokemon/pumpkaboo/overworld_normal.gbapal"); @@ -20518,17 +20518,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Gourgeist[] = INCBIN_U8("graphics/pokemon/gourgeist/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistAverage[] = INCBIN_U32("graphics/pokemon/gourgeist/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistSmall[] = INCBIN_U32("graphics/pokemon/gourgeist/small/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistLarge[] = INCBIN_U32("graphics/pokemon/gourgeist/large/back.4bpp.smol"); - const u32 gMonFrontPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/anim_front.4bpp.lz"); - const u32 gMonBackPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/back.4bpp.lz"); + const u32 gMonFrontPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/anim_front.4bpp.smol"); + const u32 gMonBackPic_GourgeistSuper[] = INCBIN_U32("graphics/pokemon/gourgeist/super/back.4bpp.smol"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE const u16 gOverworldPalette_Gourgeist[] = INCBIN_U16("graphics/pokemon/gourgeist/overworld_normal.gbapal"); @@ -20544,9 +20544,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PUMPKABOO #if P_FAMILY_BERGMITE - const u32 gMonFrontPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/anim_front.4bpp.smol"); const u16 gMonPalette_Bergmite[] = INCBIN_U16("graphics/pokemon/bergmite/normal.gbapal"); - const u32 gMonBackPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/back.4bpp.lz"); + const u32 gMonBackPic_Bergmite[] = INCBIN_U32("graphics/pokemon/bergmite/back.4bpp.smol"); const u16 gMonShinyPalette_Bergmite[] = INCBIN_U16("graphics/pokemon/bergmite/shiny.gbapal"); const u8 gMonIcon_Bergmite[] = INCBIN_U8("graphics/pokemon/bergmite/icon.4bpp"); #if P_FOOTPRINTS @@ -20560,9 +20560,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/anim_front.4bpp.smol"); const u16 gMonPalette_Avalugg[] = INCBIN_U16("graphics/pokemon/avalugg/normal.gbapal"); - const u32 gMonBackPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/back.4bpp.lz"); + const u32 gMonBackPic_Avalugg[] = INCBIN_U32("graphics/pokemon/avalugg/back.4bpp.smol"); const u16 gMonShinyPalette_Avalugg[] = INCBIN_U16("graphics/pokemon/avalugg/shiny.gbapal"); const u8 gMonIcon_Avalugg[] = INCBIN_U8("graphics/pokemon/avalugg/icon.4bpp"); #if P_FOOTPRINTS @@ -20577,9 +20577,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/front.4bpp.smol"); const u16 gMonPalette_AvaluggHisui[] = INCBIN_U16("graphics/pokemon/avalugg/hisui/normal.gbapal"); - const u32 gMonBackPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/back.4bpp.lz"); + const u32 gMonBackPic_AvaluggHisui[] = INCBIN_U32("graphics/pokemon/avalugg/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_AvaluggHisui[] = INCBIN_U16("graphics/pokemon/avalugg/hisui/shiny.gbapal"); const u8 gMonIcon_AvaluggHisui[] = INCBIN_U8("graphics/pokemon/avalugg/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20593,9 +20593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BERGMITE #if P_FAMILY_NOIBAT - const u32 gMonFrontPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/anim_front.4bpp.smol"); const u16 gMonPalette_Noibat[] = INCBIN_U16("graphics/pokemon/noibat/normal.gbapal"); - const u32 gMonBackPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/back.4bpp.lz"); + const u32 gMonBackPic_Noibat[] = INCBIN_U32("graphics/pokemon/noibat/back.4bpp.smol"); const u16 gMonShinyPalette_Noibat[] = INCBIN_U16("graphics/pokemon/noibat/shiny.gbapal"); const u8 gMonIcon_Noibat[] = INCBIN_U8("graphics/pokemon/noibat/icon.4bpp"); #if P_FOOTPRINTS @@ -20609,9 +20609,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/anim_front.4bpp.smol"); const u16 gMonPalette_Noivern[] = INCBIN_U16("graphics/pokemon/noivern/normal.gbapal"); - const u32 gMonBackPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/back.4bpp.lz"); + const u32 gMonBackPic_Noivern[] = INCBIN_U32("graphics/pokemon/noivern/back.4bpp.smol"); const u16 gMonShinyPalette_Noivern[] = INCBIN_U16("graphics/pokemon/noivern/shiny.gbapal"); const u8 gMonIcon_Noivern[] = INCBIN_U8("graphics/pokemon/noivern/icon.4bpp"); #if P_FOOTPRINTS @@ -20627,9 +20627,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NOIBAT #if P_FAMILY_XERNEAS - const u32 gMonFrontPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/anim_front.4bpp.lz"); + const u32 gMonFrontPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/anim_front.4bpp.smol"); const u16 gMonPalette_XerneasNeutral[] = INCBIN_U16("graphics/pokemon/xerneas/normal.gbapal"); - const u32 gMonBackPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/back.4bpp.lz"); + const u32 gMonBackPic_XerneasNeutral[] = INCBIN_U32("graphics/pokemon/xerneas/back.4bpp.smol"); const u16 gMonShinyPalette_XerneasNeutral[] = INCBIN_U16("graphics/pokemon/xerneas/shiny.gbapal"); const u8 gMonIcon_XerneasNeutral[] = INCBIN_U8("graphics/pokemon/xerneas/icon.4bpp"); #if P_FOOTPRINTS @@ -20643,9 +20643,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/anim_front.4bpp.lz"); + const u32 gMonFrontPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/anim_front.4bpp.smol"); const u16 gMonPalette_XerneasActive[] = INCBIN_U16("graphics/pokemon/xerneas/active/normal.gbapal"); - const u32 gMonBackPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/back.4bpp.lz"); + const u32 gMonBackPic_XerneasActive[] = INCBIN_U32("graphics/pokemon/xerneas/active/back.4bpp.smol"); const u16 gMonShinyPalette_XerneasActive[] = INCBIN_U16("graphics/pokemon/xerneas/active/shiny.gbapal"); const u8 gMonIcon_XerneasActive[] = INCBIN_U8("graphics/pokemon/xerneas/active/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20658,9 +20658,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_XERNEAS #if P_FAMILY_YVELTAL - const u32 gMonFrontPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/anim_front.4bpp.smol"); const u16 gMonPalette_Yveltal[] = INCBIN_U16("graphics/pokemon/yveltal/normal.gbapal"); - const u32 gMonBackPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/back.4bpp.lz"); + const u32 gMonBackPic_Yveltal[] = INCBIN_U32("graphics/pokemon/yveltal/back.4bpp.smol"); const u16 gMonShinyPalette_Yveltal[] = INCBIN_U16("graphics/pokemon/yveltal/shiny.gbapal"); const u8 gMonIcon_Yveltal[] = INCBIN_U8("graphics/pokemon/yveltal/icon.4bpp"); #if P_FOOTPRINTS @@ -20676,9 +20676,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YVELTAL #if P_FAMILY_ZYGARDE - const u32 gMonFrontPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/anim_front.4bpp.smol"); const u16 gMonPalette_Zygarde50[] = INCBIN_U16("graphics/pokemon/zygarde/normal.gbapal"); - const u32 gMonBackPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/back.4bpp.lz"); + const u32 gMonBackPic_Zygarde50[] = INCBIN_U32("graphics/pokemon/zygarde/back.4bpp.smol"); const u16 gMonShinyPalette_Zygarde50[] = INCBIN_U16("graphics/pokemon/zygarde/shiny.gbapal"); const u8 gMonIcon_Zygarde50[] = INCBIN_U8("graphics/pokemon/zygarde/icon.4bpp"); #if P_FOOTPRINTS @@ -20693,9 +20693,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/anim_front.4bpp.smol"); const u16 gMonPalette_Zygarde10[] = INCBIN_U16("graphics/pokemon/zygarde/10_percent/normal.gbapal"); - const u32 gMonBackPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/back.4bpp.lz"); + const u32 gMonBackPic_Zygarde10[] = INCBIN_U32("graphics/pokemon/zygarde/10_percent/back.4bpp.smol"); const u16 gMonShinyPalette_Zygarde10[] = INCBIN_U16("graphics/pokemon/zygarde/10_percent/shiny.gbapal"); const u8 gMonIcon_Zygarde10[] = INCBIN_U8("graphics/pokemon/zygarde/10_percent/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20706,9 +20706,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/anim_front.4bpp.lz"); + const u32 gMonFrontPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/anim_front.4bpp.smol"); const u16 gMonPalette_ZygardeComplete[] = INCBIN_U16("graphics/pokemon/zygarde/complete/normal.gbapal"); - const u32 gMonBackPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/back.4bpp.lz"); + const u32 gMonBackPic_ZygardeComplete[] = INCBIN_U32("graphics/pokemon/zygarde/complete/back.4bpp.smol"); const u16 gMonShinyPalette_ZygardeComplete[] = INCBIN_U16("graphics/pokemon/zygarde/complete/shiny.gbapal"); const u8 gMonIcon_ZygardeComplete[] = INCBIN_U8("graphics/pokemon/zygarde/complete/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20721,9 +20721,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE - const u32 gMonFrontPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/anim_front.4bpp.smol"); const u16 gMonPalette_Diancie[] = INCBIN_U16("graphics/pokemon/diancie/normal.gbapal"); - const u32 gMonBackPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/back.4bpp.lz"); + const u32 gMonBackPic_Diancie[] = INCBIN_U32("graphics/pokemon/diancie/back.4bpp.smol"); const u16 gMonShinyPalette_Diancie[] = INCBIN_U16("graphics/pokemon/diancie/shiny.gbapal"); const u8 gMonIcon_Diancie[] = INCBIN_U8("graphics/pokemon/diancie/icon.4bpp"); #if P_FOOTPRINTS @@ -20738,9 +20738,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_MEGA_EVOLUTIONS - const u32 gMonFrontPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/front.4bpp.lz"); + const u32 gMonFrontPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/front.4bpp.smol"); const u16 gMonPalette_DiancieMega[] = INCBIN_U16("graphics/pokemon/diancie/mega/normal.gbapal"); - const u32 gMonBackPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/back.4bpp.lz"); + const u32 gMonBackPic_DiancieMega[] = INCBIN_U32("graphics/pokemon/diancie/mega/back.4bpp.smol"); const u16 gMonShinyPalette_DiancieMega[] = INCBIN_U16("graphics/pokemon/diancie/mega/shiny.gbapal"); const u8 gMonIcon_DiancieMega[] = INCBIN_U8("graphics/pokemon/diancie/mega/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS @@ -20754,9 +20754,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DIANCIE #if P_FAMILY_HOOPA - const u32 gMonFrontPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/anim_front.4bpp.smol"); const u16 gMonPalette_HoopaConfined[] = INCBIN_U16("graphics/pokemon/hoopa/normal.gbapal"); - const u32 gMonBackPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/back.4bpp.lz"); + const u32 gMonBackPic_HoopaConfined[] = INCBIN_U32("graphics/pokemon/hoopa/back.4bpp.smol"); const u16 gMonShinyPalette_HoopaConfined[] = INCBIN_U16("graphics/pokemon/hoopa/shiny.gbapal"); const u8 gMonIcon_HoopaConfined[] = INCBIN_U8("graphics/pokemon/hoopa/icon.4bpp"); #if P_FOOTPRINTS @@ -20770,9 +20770,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/anim_front.4bpp.smol"); const u16 gMonPalette_HoopaUnbound[] = INCBIN_U16("graphics/pokemon/hoopa/unbound/normal.gbapal"); - const u32 gMonBackPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/back.4bpp.lz"); + const u32 gMonBackPic_HoopaUnbound[] = INCBIN_U32("graphics/pokemon/hoopa/unbound/back.4bpp.smol"); const u16 gMonShinyPalette_HoopaUnbound[] = INCBIN_U16("graphics/pokemon/hoopa/unbound/shiny.gbapal"); const u8 gMonIcon_HoopaUnbound[] = INCBIN_U8("graphics/pokemon/hoopa/unbound/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20785,9 +20785,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HOOPA #if P_FAMILY_VOLCANION - const u32 gMonFrontPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/anim_front.4bpp.smol"); const u16 gMonPalette_Volcanion[] = INCBIN_U16("graphics/pokemon/volcanion/normal.gbapal"); - const u32 gMonBackPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/back.4bpp.lz"); + const u32 gMonBackPic_Volcanion[] = INCBIN_U32("graphics/pokemon/volcanion/back.4bpp.smol"); const u16 gMonShinyPalette_Volcanion[] = INCBIN_U16("graphics/pokemon/volcanion/shiny.gbapal"); const u8 gMonIcon_Volcanion[] = INCBIN_U8("graphics/pokemon/volcanion/icon.4bpp"); #if P_FOOTPRINTS @@ -20803,9 +20803,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VOLCANION #if P_FAMILY_ROWLET - const u32 gMonFrontPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/anim_front.4bpp.smol"); const u16 gMonPalette_Rowlet[] = INCBIN_U16("graphics/pokemon/rowlet/normal.gbapal"); - const u32 gMonBackPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/back.4bpp.lz"); + const u32 gMonBackPic_Rowlet[] = INCBIN_U32("graphics/pokemon/rowlet/back.4bpp.smol"); const u16 gMonShinyPalette_Rowlet[] = INCBIN_U16("graphics/pokemon/rowlet/shiny.gbapal"); const u8 gMonIcon_Rowlet[] = INCBIN_U8("graphics/pokemon/rowlet/icon.4bpp"); #if P_FOOTPRINTS @@ -20819,9 +20819,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/anim_front.4bpp.smol"); const u16 gMonPalette_Dartrix[] = INCBIN_U16("graphics/pokemon/dartrix/normal.gbapal"); - const u32 gMonBackPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/back.4bpp.lz"); + const u32 gMonBackPic_Dartrix[] = INCBIN_U32("graphics/pokemon/dartrix/back.4bpp.smol"); const u16 gMonShinyPalette_Dartrix[] = INCBIN_U16("graphics/pokemon/dartrix/shiny.gbapal"); const u8 gMonIcon_Dartrix[] = INCBIN_U8("graphics/pokemon/dartrix/icon.4bpp"); #if P_FOOTPRINTS @@ -20835,9 +20835,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/anim_front.4bpp.smol"); const u16 gMonPalette_Decidueye[] = INCBIN_U16("graphics/pokemon/decidueye/normal.gbapal"); - const u32 gMonBackPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/back.4bpp.lz"); + const u32 gMonBackPic_Decidueye[] = INCBIN_U32("graphics/pokemon/decidueye/back.4bpp.smol"); const u16 gMonShinyPalette_Decidueye[] = INCBIN_U16("graphics/pokemon/decidueye/shiny.gbapal"); const u8 gMonIcon_Decidueye[] = INCBIN_U8("graphics/pokemon/decidueye/icon.4bpp"); #if P_FOOTPRINTS @@ -20852,9 +20852,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_HISUIAN_FORMS - const u32 gMonFrontPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/front.4bpp.lz"); + const u32 gMonFrontPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/front.4bpp.smol"); const u16 gMonPalette_DecidueyeHisui[] = INCBIN_U16("graphics/pokemon/decidueye/hisui/normal.gbapal"); - const u32 gMonBackPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/back.4bpp.lz"); + const u32 gMonBackPic_DecidueyeHisui[] = INCBIN_U32("graphics/pokemon/decidueye/hisui/back.4bpp.smol"); const u16 gMonShinyPalette_DecidueyeHisui[] = INCBIN_U16("graphics/pokemon/decidueye/hisui/shiny.gbapal"); const u8 gMonIcon_DecidueyeHisui[] = INCBIN_U8("graphics/pokemon/decidueye/hisui/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -20868,9 +20868,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROWLET #if P_FAMILY_LITTEN - const u32 gMonFrontPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/front.4bpp.lz"); + const u32 gMonFrontPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/front.4bpp.smol"); const u16 gMonPalette_Litten[] = INCBIN_U16("graphics/pokemon/litten/normal.gbapal"); - const u32 gMonBackPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/back.4bpp.lz"); + const u32 gMonBackPic_Litten[] = INCBIN_U32("graphics/pokemon/litten/back.4bpp.smol"); const u16 gMonShinyPalette_Litten[] = INCBIN_U16("graphics/pokemon/litten/shiny.gbapal"); const u8 gMonIcon_Litten[] = INCBIN_U8("graphics/pokemon/litten/icon.4bpp"); #if P_FOOTPRINTS @@ -20884,9 +20884,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/front.4bpp.lz"); + const u32 gMonFrontPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/front.4bpp.smol"); const u16 gMonPalette_Torracat[] = INCBIN_U16("graphics/pokemon/torracat/normal.gbapal"); - const u32 gMonBackPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/back.4bpp.lz"); + const u32 gMonBackPic_Torracat[] = INCBIN_U32("graphics/pokemon/torracat/back.4bpp.smol"); const u16 gMonShinyPalette_Torracat[] = INCBIN_U16("graphics/pokemon/torracat/shiny.gbapal"); const u8 gMonIcon_Torracat[] = INCBIN_U8("graphics/pokemon/torracat/icon.4bpp"); #if P_FOOTPRINTS @@ -20900,9 +20900,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/front.4bpp.lz"); + const u32 gMonFrontPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/front.4bpp.smol"); const u16 gMonPalette_Incineroar[] = INCBIN_U16("graphics/pokemon/incineroar/normal.gbapal"); - const u32 gMonBackPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/back.4bpp.lz"); + const u32 gMonBackPic_Incineroar[] = INCBIN_U32("graphics/pokemon/incineroar/back.4bpp.smol"); const u16 gMonShinyPalette_Incineroar[] = INCBIN_U16("graphics/pokemon/incineroar/shiny.gbapal"); const u8 gMonIcon_Incineroar[] = INCBIN_U8("graphics/pokemon/incineroar/icon.4bpp"); #if P_FOOTPRINTS @@ -20918,9 +20918,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LITTEN #if P_FAMILY_POPPLIO - const u32 gMonFrontPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/front.4bpp.lz"); + const u32 gMonFrontPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/front.4bpp.smol"); const u16 gMonPalette_Popplio[] = INCBIN_U16("graphics/pokemon/popplio/normal.gbapal"); - const u32 gMonBackPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/back.4bpp.lz"); + const u32 gMonBackPic_Popplio[] = INCBIN_U32("graphics/pokemon/popplio/back.4bpp.smol"); const u16 gMonShinyPalette_Popplio[] = INCBIN_U16("graphics/pokemon/popplio/shiny.gbapal"); const u8 gMonIcon_Popplio[] = INCBIN_U8("graphics/pokemon/popplio/icon.4bpp"); #if P_FOOTPRINTS @@ -20934,9 +20934,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/front.4bpp.lz"); + const u32 gMonFrontPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/front.4bpp.smol"); const u16 gMonPalette_Brionne[] = INCBIN_U16("graphics/pokemon/brionne/normal.gbapal"); - const u32 gMonBackPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/back.4bpp.lz"); + const u32 gMonBackPic_Brionne[] = INCBIN_U32("graphics/pokemon/brionne/back.4bpp.smol"); const u16 gMonShinyPalette_Brionne[] = INCBIN_U16("graphics/pokemon/brionne/shiny.gbapal"); const u8 gMonIcon_Brionne[] = INCBIN_U8("graphics/pokemon/brionne/icon.4bpp"); #if P_FOOTPRINTS @@ -20950,9 +20950,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/front.4bpp.lz"); + const u32 gMonFrontPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/front.4bpp.smol"); const u16 gMonPalette_Primarina[] = INCBIN_U16("graphics/pokemon/primarina/normal.gbapal"); - const u32 gMonBackPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/back.4bpp.lz"); + const u32 gMonBackPic_Primarina[] = INCBIN_U32("graphics/pokemon/primarina/back.4bpp.smol"); const u16 gMonShinyPalette_Primarina[] = INCBIN_U16("graphics/pokemon/primarina/shiny.gbapal"); const u8 gMonIcon_Primarina[] = INCBIN_U8("graphics/pokemon/primarina/icon.4bpp"); #if P_FOOTPRINTS @@ -20968,9 +20968,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POPPLIO #if P_FAMILY_PIKIPEK - const u32 gMonFrontPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/anim_front.4bpp.smol"); const u16 gMonPalette_Pikipek[] = INCBIN_U16("graphics/pokemon/pikipek/normal.gbapal"); - const u32 gMonBackPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/back.4bpp.lz"); + const u32 gMonBackPic_Pikipek[] = INCBIN_U32("graphics/pokemon/pikipek/back.4bpp.smol"); const u16 gMonShinyPalette_Pikipek[] = INCBIN_U16("graphics/pokemon/pikipek/shiny.gbapal"); const u8 gMonIcon_Pikipek[] = INCBIN_U8("graphics/pokemon/pikipek/icon.4bpp"); #if P_FOOTPRINTS @@ -20984,9 +20984,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/anim_front.4bpp.smol"); const u16 gMonPalette_Trumbeak[] = INCBIN_U16("graphics/pokemon/trumbeak/normal.gbapal"); - const u32 gMonBackPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/back.4bpp.lz"); + const u32 gMonBackPic_Trumbeak[] = INCBIN_U32("graphics/pokemon/trumbeak/back.4bpp.smol"); const u16 gMonShinyPalette_Trumbeak[] = INCBIN_U16("graphics/pokemon/trumbeak/shiny.gbapal"); const u8 gMonIcon_Trumbeak[] = INCBIN_U8("graphics/pokemon/trumbeak/icon.4bpp"); #if P_FOOTPRINTS @@ -21000,9 +21000,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/anim_front.4bpp.smol"); const u16 gMonPalette_Toucannon[] = INCBIN_U16("graphics/pokemon/toucannon/normal.gbapal"); - const u32 gMonBackPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/back.4bpp.lz"); + const u32 gMonBackPic_Toucannon[] = INCBIN_U32("graphics/pokemon/toucannon/back.4bpp.smol"); const u16 gMonShinyPalette_Toucannon[] = INCBIN_U16("graphics/pokemon/toucannon/shiny.gbapal"); const u8 gMonIcon_Toucannon[] = INCBIN_U8("graphics/pokemon/toucannon/icon.4bpp"); #if P_FOOTPRINTS @@ -21018,9 +21018,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PIKIPEK #if P_FAMILY_YUNGOOS - const u32 gMonFrontPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/front.4bpp.lz"); + const u32 gMonFrontPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/front.4bpp.smol"); const u16 gMonPalette_Yungoos[] = INCBIN_U16("graphics/pokemon/yungoos/normal.gbapal"); - const u32 gMonBackPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/back.4bpp.lz"); + const u32 gMonBackPic_Yungoos[] = INCBIN_U32("graphics/pokemon/yungoos/back.4bpp.smol"); const u16 gMonShinyPalette_Yungoos[] = INCBIN_U16("graphics/pokemon/yungoos/shiny.gbapal"); const u8 gMonIcon_Yungoos[] = INCBIN_U8("graphics/pokemon/yungoos/icon.4bpp"); #if P_FOOTPRINTS @@ -21034,9 +21034,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/front.4bpp.lz"); + const u32 gMonFrontPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/front.4bpp.smol"); const u16 gMonPalette_Gumshoos[] = INCBIN_U16("graphics/pokemon/gumshoos/normal.gbapal"); - const u32 gMonBackPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/back.4bpp.lz"); + const u32 gMonBackPic_Gumshoos[] = INCBIN_U32("graphics/pokemon/gumshoos/back.4bpp.smol"); const u16 gMonShinyPalette_Gumshoos[] = INCBIN_U16("graphics/pokemon/gumshoos/shiny.gbapal"); const u8 gMonIcon_Gumshoos[] = INCBIN_U8("graphics/pokemon/gumshoos/icon.4bpp"); #if P_FOOTPRINTS @@ -21052,9 +21052,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YUNGOOS #if P_FAMILY_GRUBBIN - const u32 gMonFrontPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/anim_front.4bpp.smol"); const u16 gMonPalette_Grubbin[] = INCBIN_U16("graphics/pokemon/grubbin/normal.gbapal"); - const u32 gMonBackPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/back.4bpp.lz"); + const u32 gMonBackPic_Grubbin[] = INCBIN_U32("graphics/pokemon/grubbin/back.4bpp.smol"); const u16 gMonShinyPalette_Grubbin[] = INCBIN_U16("graphics/pokemon/grubbin/shiny.gbapal"); const u8 gMonIcon_Grubbin[] = INCBIN_U8("graphics/pokemon/grubbin/icon.4bpp"); #if P_FOOTPRINTS @@ -21068,9 +21068,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/anim_front.4bpp.smol"); const u16 gMonPalette_Charjabug[] = INCBIN_U16("graphics/pokemon/charjabug/normal.gbapal"); - const u32 gMonBackPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/back.4bpp.lz"); + const u32 gMonBackPic_Charjabug[] = INCBIN_U32("graphics/pokemon/charjabug/back.4bpp.smol"); const u16 gMonShinyPalette_Charjabug[] = INCBIN_U16("graphics/pokemon/charjabug/shiny.gbapal"); const u8 gMonIcon_Charjabug[] = INCBIN_U8("graphics/pokemon/charjabug/icon.4bpp"); #if P_FOOTPRINTS @@ -21084,9 +21084,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/anim_front.4bpp.smol"); const u16 gMonPalette_Vikavolt[] = INCBIN_U16("graphics/pokemon/vikavolt/normal.gbapal"); - const u32 gMonBackPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/back.4bpp.lz"); + const u32 gMonBackPic_Vikavolt[] = INCBIN_U32("graphics/pokemon/vikavolt/back.4bpp.smol"); const u16 gMonShinyPalette_Vikavolt[] = INCBIN_U16("graphics/pokemon/vikavolt/shiny.gbapal"); const u8 gMonIcon_Vikavolt[] = INCBIN_U8("graphics/pokemon/vikavolt/icon.4bpp"); #if P_FOOTPRINTS @@ -21102,9 +21102,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GRUBBIN #if P_FAMILY_CRABRAWLER - const u32 gMonFrontPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/front.4bpp.lz"); + const u32 gMonFrontPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/front.4bpp.smol"); const u16 gMonPalette_Crabrawler[] = INCBIN_U16("graphics/pokemon/crabrawler/normal.gbapal"); - const u32 gMonBackPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/back.4bpp.lz"); + const u32 gMonBackPic_Crabrawler[] = INCBIN_U32("graphics/pokemon/crabrawler/back.4bpp.smol"); const u16 gMonShinyPalette_Crabrawler[] = INCBIN_U16("graphics/pokemon/crabrawler/shiny.gbapal"); const u8 gMonIcon_Crabrawler[] = INCBIN_U8("graphics/pokemon/crabrawler/icon.4bpp"); #if P_FOOTPRINTS @@ -21118,9 +21118,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/front.4bpp.lz"); + const u32 gMonFrontPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/front.4bpp.smol"); const u16 gMonPalette_Crabominable[] = INCBIN_U16("graphics/pokemon/crabominable/normal.gbapal"); - const u32 gMonBackPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/back.4bpp.lz"); + const u32 gMonBackPic_Crabominable[] = INCBIN_U32("graphics/pokemon/crabominable/back.4bpp.smol"); const u16 gMonShinyPalette_Crabominable[] = INCBIN_U16("graphics/pokemon/crabominable/shiny.gbapal"); const u8 gMonIcon_Crabominable[] = INCBIN_U8("graphics/pokemon/crabominable/icon.4bpp"); #if P_FOOTPRINTS @@ -21136,9 +21136,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRABRAWLER #if P_FAMILY_ORICORIO - const u32 gMonFrontPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/front.4bpp.smol"); const u16 gMonPalette_OricorioBaile[] = INCBIN_U16("graphics/pokemon/oricorio/normal.gbapal"); - const u32 gMonBackPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/back.4bpp.lz"); + const u32 gMonBackPic_OricorioBaile[] = INCBIN_U32("graphics/pokemon/oricorio/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioBaile[] = INCBIN_U16("graphics/pokemon/oricorio/shiny.gbapal"); const u8 gMonIcon_OricorioBaile[] = INCBIN_U8("graphics/pokemon/oricorio/icon.4bpp"); #if P_FOOTPRINTS @@ -21152,9 +21152,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/front.4bpp.smol"); const u16 gMonPalette_OricorioPomPom[] = INCBIN_U16("graphics/pokemon/oricorio/pom_pom/normal.gbapal"); - const u32 gMonBackPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/back.4bpp.lz"); + const u32 gMonBackPic_OricorioPomPom[] = INCBIN_U32("graphics/pokemon/oricorio/pom_pom/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioPomPom[] = INCBIN_U16("graphics/pokemon/oricorio/pom_pom/shiny.gbapal"); const u8 gMonIcon_OricorioPomPom[] = INCBIN_U8("graphics/pokemon/oricorio/pom_pom/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21165,9 +21165,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/front.4bpp.smol"); const u16 gMonPalette_OricorioPau[] = INCBIN_U16("graphics/pokemon/oricorio/pau/normal.gbapal"); - const u32 gMonBackPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/back.4bpp.lz"); + const u32 gMonBackPic_OricorioPau[] = INCBIN_U32("graphics/pokemon/oricorio/pau/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioPau[] = INCBIN_U16("graphics/pokemon/oricorio/pau/shiny.gbapal"); const u8 gMonIcon_OricorioPau[] = INCBIN_U8("graphics/pokemon/oricorio/pau/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21178,9 +21178,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/front.4bpp.lz"); + const u32 gMonFrontPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/front.4bpp.smol"); const u16 gMonPalette_OricorioSensu[] = INCBIN_U16("graphics/pokemon/oricorio/sensu/normal.gbapal"); - const u32 gMonBackPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/back.4bpp.lz"); + const u32 gMonBackPic_OricorioSensu[] = INCBIN_U32("graphics/pokemon/oricorio/sensu/back.4bpp.smol"); const u16 gMonShinyPalette_OricorioSensu[] = INCBIN_U16("graphics/pokemon/oricorio/sensu/shiny.gbapal"); const u8 gMonIcon_OricorioSensu[] = INCBIN_U8("graphics/pokemon/oricorio/sensu/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21193,9 +21193,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORICORIO #if P_FAMILY_CUTIEFLY - const u32 gMonFrontPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/anim_front.4bpp.smol"); const u16 gMonPalette_Cutiefly[] = INCBIN_U16("graphics/pokemon/cutiefly/normal.gbapal"); - const u32 gMonBackPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/back.4bpp.lz"); + const u32 gMonBackPic_Cutiefly[] = INCBIN_U32("graphics/pokemon/cutiefly/back.4bpp.smol"); const u16 gMonShinyPalette_Cutiefly[] = INCBIN_U16("graphics/pokemon/cutiefly/shiny.gbapal"); const u8 gMonIcon_Cutiefly[] = INCBIN_U8("graphics/pokemon/cutiefly/icon.4bpp"); #if P_FOOTPRINTS @@ -21209,9 +21209,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/anim_front.4bpp.smol"); const u16 gMonPalette_Ribombee[] = INCBIN_U16("graphics/pokemon/ribombee/normal.gbapal"); - const u32 gMonBackPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/back.4bpp.lz"); + const u32 gMonBackPic_Ribombee[] = INCBIN_U32("graphics/pokemon/ribombee/back.4bpp.smol"); const u16 gMonShinyPalette_Ribombee[] = INCBIN_U16("graphics/pokemon/ribombee/shiny.gbapal"); const u8 gMonIcon_Ribombee[] = INCBIN_U8("graphics/pokemon/ribombee/icon.4bpp"); #if P_FOOTPRINTS @@ -21227,9 +21227,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUTIEFLY #if P_FAMILY_ROCKRUFF - const u32 gMonFrontPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/anim_front.4bpp.smol"); const u16 gMonPalette_Rockruff[] = INCBIN_U16("graphics/pokemon/rockruff/normal.gbapal"); - const u32 gMonBackPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/back.4bpp.lz"); + const u32 gMonBackPic_Rockruff[] = INCBIN_U32("graphics/pokemon/rockruff/back.4bpp.smol"); const u16 gMonShinyPalette_Rockruff[] = INCBIN_U16("graphics/pokemon/rockruff/shiny.gbapal"); const u8 gMonIcon_Rockruff[] = INCBIN_U8("graphics/pokemon/rockruff/icon.4bpp"); #if P_FOOTPRINTS @@ -21243,9 +21243,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocMidday[] = INCBIN_U16("graphics/pokemon/lycanroc/normal.gbapal"); - const u32 gMonBackPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocMidday[] = INCBIN_U32("graphics/pokemon/lycanroc/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocMidday[] = INCBIN_U16("graphics/pokemon/lycanroc/shiny.gbapal"); const u8 gMonIcon_LycanrocMidday[] = INCBIN_U8("graphics/pokemon/lycanroc/icon.4bpp"); #if P_FOOTPRINTS @@ -21259,9 +21259,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocMidnight[] = INCBIN_U16("graphics/pokemon/lycanroc/midnight/normal.gbapal"); - const u32 gMonBackPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocMidnight[] = INCBIN_U32("graphics/pokemon/lycanroc/midnight/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocMidnight[] = INCBIN_U16("graphics/pokemon/lycanroc/midnight/shiny.gbapal"); const u8 gMonIcon_LycanrocMidnight[] = INCBIN_U8("graphics/pokemon/lycanroc/midnight/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21272,9 +21272,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/anim_front.4bpp.smol"); const u16 gMonPalette_LycanrocDusk[] = INCBIN_U16("graphics/pokemon/lycanroc/dusk/normal.gbapal"); - const u32 gMonBackPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/back.4bpp.lz"); + const u32 gMonBackPic_LycanrocDusk[] = INCBIN_U32("graphics/pokemon/lycanroc/dusk/back.4bpp.smol"); const u16 gMonShinyPalette_LycanrocDusk[] = INCBIN_U16("graphics/pokemon/lycanroc/dusk/shiny.gbapal"); const u8 gMonIcon_LycanrocDusk[] = INCBIN_U8("graphics/pokemon/lycanroc/dusk/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21287,9 +21287,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROCKRUFF #if P_FAMILY_WISHIWASHI - const u32 gMonFrontPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/front.4bpp.lz"); + const u32 gMonFrontPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/front.4bpp.smol"); const u16 gMonPalette_WishiwashiSolo[] = INCBIN_U16("graphics/pokemon/wishiwashi/normal.gbapal"); - const u32 gMonBackPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/back.4bpp.lz"); + const u32 gMonBackPic_WishiwashiSolo[] = INCBIN_U32("graphics/pokemon/wishiwashi/back.4bpp.smol"); const u16 gMonShinyPalette_WishiwashiSolo[] = INCBIN_U16("graphics/pokemon/wishiwashi/shiny.gbapal"); const u8 gMonIcon_WishiwashiSolo[] = INCBIN_U8("graphics/pokemon/wishiwashi/icon.4bpp"); #if P_FOOTPRINTS @@ -21303,9 +21303,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/front.4bpp.lz"); + const u32 gMonFrontPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/front.4bpp.smol"); const u16 gMonPalette_WishiwashiSchool[] = INCBIN_U16("graphics/pokemon/wishiwashi/school/normal.gbapal"); - const u32 gMonBackPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/back.4bpp.lz"); + const u32 gMonBackPic_WishiwashiSchool[] = INCBIN_U32("graphics/pokemon/wishiwashi/school/back.4bpp.smol"); const u16 gMonShinyPalette_WishiwashiSchool[] = INCBIN_U16("graphics/pokemon/wishiwashi/school/shiny.gbapal"); const u8 gMonIcon_WishiwashiSchool[] = INCBIN_U8("graphics/pokemon/wishiwashi/school/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21318,9 +21318,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WISHIWASHI #if P_FAMILY_MAREANIE - const u32 gMonFrontPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/front.4bpp.lz"); + const u32 gMonFrontPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/front.4bpp.smol"); const u16 gMonPalette_Mareanie[] = INCBIN_U16("graphics/pokemon/mareanie/normal.gbapal"); - const u32 gMonBackPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/back.4bpp.lz"); + const u32 gMonBackPic_Mareanie[] = INCBIN_U32("graphics/pokemon/mareanie/back.4bpp.smol"); const u16 gMonShinyPalette_Mareanie[] = INCBIN_U16("graphics/pokemon/mareanie/shiny.gbapal"); const u8 gMonIcon_Mareanie[] = INCBIN_U8("graphics/pokemon/mareanie/icon.4bpp"); #if P_FOOTPRINTS @@ -21334,9 +21334,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/front.4bpp.lz"); + const u32 gMonFrontPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/front.4bpp.smol"); const u16 gMonPalette_Toxapex[] = INCBIN_U16("graphics/pokemon/toxapex/normal.gbapal"); - const u32 gMonBackPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/back.4bpp.lz"); + const u32 gMonBackPic_Toxapex[] = INCBIN_U32("graphics/pokemon/toxapex/back.4bpp.smol"); const u16 gMonShinyPalette_Toxapex[] = INCBIN_U16("graphics/pokemon/toxapex/shiny.gbapal"); const u8 gMonIcon_Toxapex[] = INCBIN_U8("graphics/pokemon/toxapex/icon.4bpp"); #if P_FOOTPRINTS @@ -21352,9 +21352,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MAREANIE #if P_FAMILY_MUDBRAY - const u32 gMonFrontPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/front.4bpp.lz"); + const u32 gMonFrontPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/front.4bpp.smol"); const u16 gMonPalette_Mudbray[] = INCBIN_U16("graphics/pokemon/mudbray/normal.gbapal"); - const u32 gMonBackPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/back.4bpp.lz"); + const u32 gMonBackPic_Mudbray[] = INCBIN_U32("graphics/pokemon/mudbray/back.4bpp.smol"); const u16 gMonShinyPalette_Mudbray[] = INCBIN_U16("graphics/pokemon/mudbray/shiny.gbapal"); const u8 gMonIcon_Mudbray[] = INCBIN_U8("graphics/pokemon/mudbray/icon.4bpp"); #if P_FOOTPRINTS @@ -21368,9 +21368,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/front.4bpp.lz"); + const u32 gMonFrontPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/front.4bpp.smol"); const u16 gMonPalette_Mudsdale[] = INCBIN_U16("graphics/pokemon/mudsdale/normal.gbapal"); - const u32 gMonBackPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/back.4bpp.lz"); + const u32 gMonBackPic_Mudsdale[] = INCBIN_U32("graphics/pokemon/mudsdale/back.4bpp.smol"); const u16 gMonShinyPalette_Mudsdale[] = INCBIN_U16("graphics/pokemon/mudsdale/shiny.gbapal"); const u8 gMonIcon_Mudsdale[] = INCBIN_U8("graphics/pokemon/mudsdale/icon.4bpp"); #if P_FOOTPRINTS @@ -21386,9 +21386,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUDBRAY #if P_FAMILY_DEWPIDER - const u32 gMonFrontPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/anim_front.4bpp.smol"); const u16 gMonPalette_Dewpider[] = INCBIN_U16("graphics/pokemon/dewpider/normal.gbapal"); - const u32 gMonBackPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/back.4bpp.lz"); + const u32 gMonBackPic_Dewpider[] = INCBIN_U32("graphics/pokemon/dewpider/back.4bpp.smol"); const u16 gMonShinyPalette_Dewpider[] = INCBIN_U16("graphics/pokemon/dewpider/shiny.gbapal"); const u8 gMonIcon_Dewpider[] = INCBIN_U8("graphics/pokemon/dewpider/icon.4bpp"); #if P_FOOTPRINTS @@ -21402,9 +21402,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/anim_front.4bpp.smol"); const u16 gMonPalette_Araquanid[] = INCBIN_U16("graphics/pokemon/araquanid/normal.gbapal"); - const u32 gMonBackPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/back.4bpp.lz"); + const u32 gMonBackPic_Araquanid[] = INCBIN_U32("graphics/pokemon/araquanid/back.4bpp.smol"); const u16 gMonShinyPalette_Araquanid[] = INCBIN_U16("graphics/pokemon/araquanid/shiny.gbapal"); const u8 gMonIcon_Araquanid[] = INCBIN_U8("graphics/pokemon/araquanid/icon.4bpp"); #if P_FOOTPRINTS @@ -21420,9 +21420,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DEWPIDER #if P_FAMILY_FOMANTIS - const u32 gMonFrontPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/front.4bpp.lz"); + const u32 gMonFrontPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/front.4bpp.smol"); const u16 gMonPalette_Fomantis[] = INCBIN_U16("graphics/pokemon/fomantis/normal.gbapal"); - const u32 gMonBackPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/back.4bpp.lz"); + const u32 gMonBackPic_Fomantis[] = INCBIN_U32("graphics/pokemon/fomantis/back.4bpp.smol"); const u16 gMonShinyPalette_Fomantis[] = INCBIN_U16("graphics/pokemon/fomantis/shiny.gbapal"); const u8 gMonIcon_Fomantis[] = INCBIN_U8("graphics/pokemon/fomantis/icon.4bpp"); #if P_FOOTPRINTS @@ -21436,9 +21436,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/anim_front.4bpp.smol"); const u16 gMonPalette_Lurantis[] = INCBIN_U16("graphics/pokemon/lurantis/normal.gbapal"); - const u32 gMonBackPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/back.4bpp.lz"); + const u32 gMonBackPic_Lurantis[] = INCBIN_U32("graphics/pokemon/lurantis/back.4bpp.smol"); const u16 gMonShinyPalette_Lurantis[] = INCBIN_U16("graphics/pokemon/lurantis/shiny.gbapal"); const u8 gMonIcon_Lurantis[] = INCBIN_U8("graphics/pokemon/lurantis/icon.4bpp"); #if P_FOOTPRINTS @@ -21454,9 +21454,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FOMANTIS #if P_FAMILY_MORELULL - const u32 gMonFrontPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/front.4bpp.lz"); + const u32 gMonFrontPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/front.4bpp.smol"); const u16 gMonPalette_Morelull[] = INCBIN_U16("graphics/pokemon/morelull/normal.gbapal"); - const u32 gMonBackPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/back.4bpp.lz"); + const u32 gMonBackPic_Morelull[] = INCBIN_U32("graphics/pokemon/morelull/back.4bpp.smol"); const u16 gMonShinyPalette_Morelull[] = INCBIN_U16("graphics/pokemon/morelull/shiny.gbapal"); const u8 gMonIcon_Morelull[] = INCBIN_U8("graphics/pokemon/morelull/icon.4bpp"); #if P_FOOTPRINTS @@ -21470,9 +21470,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/front.4bpp.lz"); + const u32 gMonFrontPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/front.4bpp.smol"); const u16 gMonPalette_Shiinotic[] = INCBIN_U16("graphics/pokemon/shiinotic/normal.gbapal"); - const u32 gMonBackPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/back.4bpp.lz"); + const u32 gMonBackPic_Shiinotic[] = INCBIN_U32("graphics/pokemon/shiinotic/back.4bpp.smol"); const u16 gMonShinyPalette_Shiinotic[] = INCBIN_U16("graphics/pokemon/shiinotic/shiny.gbapal"); const u8 gMonIcon_Shiinotic[] = INCBIN_U8("graphics/pokemon/shiinotic/icon.4bpp"); #if P_FOOTPRINTS @@ -21488,9 +21488,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MORELULL #if P_FAMILY_SALANDIT - const u32 gMonFrontPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/anim_front.4bpp.smol"); const u16 gMonPalette_Salandit[] = INCBIN_U16("graphics/pokemon/salandit/normal.gbapal"); - const u32 gMonBackPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/back.4bpp.lz"); + const u32 gMonBackPic_Salandit[] = INCBIN_U32("graphics/pokemon/salandit/back.4bpp.smol"); const u16 gMonShinyPalette_Salandit[] = INCBIN_U16("graphics/pokemon/salandit/shiny.gbapal"); const u8 gMonIcon_Salandit[] = INCBIN_U8("graphics/pokemon/salandit/icon.4bpp"); #if P_FOOTPRINTS @@ -21504,9 +21504,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/anim_front.4bpp.smol"); const u16 gMonPalette_Salazzle[] = INCBIN_U16("graphics/pokemon/salazzle/normal.gbapal"); - const u32 gMonBackPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/back.4bpp.lz"); + const u32 gMonBackPic_Salazzle[] = INCBIN_U32("graphics/pokemon/salazzle/back.4bpp.smol"); const u16 gMonShinyPalette_Salazzle[] = INCBIN_U16("graphics/pokemon/salazzle/shiny.gbapal"); const u8 gMonIcon_Salazzle[] = INCBIN_U8("graphics/pokemon/salazzle/icon.4bpp"); #if P_FOOTPRINTS @@ -21522,9 +21522,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SALANDIT #if P_FAMILY_STUFFUL - const u32 gMonFrontPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/anim_front.4bpp.smol"); const u16 gMonPalette_Stufful[] = INCBIN_U16("graphics/pokemon/stufful/normal.gbapal"); - const u32 gMonBackPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/back.4bpp.lz"); + const u32 gMonBackPic_Stufful[] = INCBIN_U32("graphics/pokemon/stufful/back.4bpp.smol"); const u16 gMonShinyPalette_Stufful[] = INCBIN_U16("graphics/pokemon/stufful/shiny.gbapal"); const u8 gMonIcon_Stufful[] = INCBIN_U8("graphics/pokemon/stufful/icon.4bpp"); #if P_FOOTPRINTS @@ -21538,9 +21538,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/anim_front.4bpp.smol"); const u16 gMonPalette_Bewear[] = INCBIN_U16("graphics/pokemon/bewear/normal.gbapal"); - const u32 gMonBackPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/back.4bpp.lz"); + const u32 gMonBackPic_Bewear[] = INCBIN_U32("graphics/pokemon/bewear/back.4bpp.smol"); const u16 gMonShinyPalette_Bewear[] = INCBIN_U16("graphics/pokemon/bewear/shiny.gbapal"); const u8 gMonIcon_Bewear[] = INCBIN_U8("graphics/pokemon/bewear/icon.4bpp"); #if P_FOOTPRINTS @@ -21556,9 +21556,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STUFFUL #if P_FAMILY_BOUNSWEET - const u32 gMonFrontPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/front.4bpp.lz"); + const u32 gMonFrontPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/front.4bpp.smol"); const u16 gMonPalette_Bounsweet[] = INCBIN_U16("graphics/pokemon/bounsweet/normal.gbapal"); - const u32 gMonBackPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/back.4bpp.lz"); + const u32 gMonBackPic_Bounsweet[] = INCBIN_U32("graphics/pokemon/bounsweet/back.4bpp.smol"); const u16 gMonShinyPalette_Bounsweet[] = INCBIN_U16("graphics/pokemon/bounsweet/shiny.gbapal"); const u8 gMonIcon_Bounsweet[] = INCBIN_U8("graphics/pokemon/bounsweet/icon.4bpp"); #if P_FOOTPRINTS @@ -21572,9 +21572,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/front.4bpp.lz"); + const u32 gMonFrontPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/front.4bpp.smol"); const u16 gMonPalette_Steenee[] = INCBIN_U16("graphics/pokemon/steenee/normal.gbapal"); - const u32 gMonBackPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/back.4bpp.lz"); + const u32 gMonBackPic_Steenee[] = INCBIN_U32("graphics/pokemon/steenee/back.4bpp.smol"); const u16 gMonShinyPalette_Steenee[] = INCBIN_U16("graphics/pokemon/steenee/shiny.gbapal"); const u8 gMonIcon_Steenee[] = INCBIN_U8("graphics/pokemon/steenee/icon.4bpp"); #if P_FOOTPRINTS @@ -21588,9 +21588,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/front.4bpp.lz"); + const u32 gMonFrontPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/front.4bpp.smol"); const u16 gMonPalette_Tsareena[] = INCBIN_U16("graphics/pokemon/tsareena/normal.gbapal"); - const u32 gMonBackPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/back.4bpp.lz"); + const u32 gMonBackPic_Tsareena[] = INCBIN_U32("graphics/pokemon/tsareena/back.4bpp.smol"); const u16 gMonShinyPalette_Tsareena[] = INCBIN_U16("graphics/pokemon/tsareena/shiny.gbapal"); const u8 gMonIcon_Tsareena[] = INCBIN_U8("graphics/pokemon/tsareena/icon.4bpp"); #if P_FOOTPRINTS @@ -21606,9 +21606,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOUNSWEET #if P_FAMILY_COMFEY - const u32 gMonFrontPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/front.4bpp.lz"); + const u32 gMonFrontPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/front.4bpp.smol"); const u16 gMonPalette_Comfey[] = INCBIN_U16("graphics/pokemon/comfey/normal.gbapal"); - const u32 gMonBackPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/back.4bpp.lz"); + const u32 gMonBackPic_Comfey[] = INCBIN_U32("graphics/pokemon/comfey/back.4bpp.smol"); const u16 gMonShinyPalette_Comfey[] = INCBIN_U16("graphics/pokemon/comfey/shiny.gbapal"); const u8 gMonIcon_Comfey[] = INCBIN_U8("graphics/pokemon/comfey/icon.4bpp"); #if P_FOOTPRINTS @@ -21624,9 +21624,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COMFEY #if P_FAMILY_ORANGURU - const u32 gMonFrontPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/anim_front.4bpp.smol"); const u16 gMonPalette_Oranguru[] = INCBIN_U16("graphics/pokemon/oranguru/normal.gbapal"); - const u32 gMonBackPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/back.4bpp.lz"); + const u32 gMonBackPic_Oranguru[] = INCBIN_U32("graphics/pokemon/oranguru/back.4bpp.smol"); const u16 gMonShinyPalette_Oranguru[] = INCBIN_U16("graphics/pokemon/oranguru/shiny.gbapal"); const u8 gMonIcon_Oranguru[] = INCBIN_U8("graphics/pokemon/oranguru/icon.4bpp"); #if P_FOOTPRINTS @@ -21642,9 +21642,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORANGURU #if P_FAMILY_PASSIMIAN - const u32 gMonFrontPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/anim_front.4bpp.smol"); const u16 gMonPalette_Passimian[] = INCBIN_U16("graphics/pokemon/passimian/normal.gbapal"); - const u32 gMonBackPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/back.4bpp.lz"); + const u32 gMonBackPic_Passimian[] = INCBIN_U32("graphics/pokemon/passimian/back.4bpp.smol"); const u16 gMonShinyPalette_Passimian[] = INCBIN_U16("graphics/pokemon/passimian/shiny.gbapal"); const u8 gMonIcon_Passimian[] = INCBIN_U8("graphics/pokemon/passimian/icon.4bpp"); #if P_FOOTPRINTS @@ -21660,9 +21660,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PASSIMIAN #if P_FAMILY_WIMPOD - const u32 gMonFrontPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/anim_front.4bpp.smol"); const u16 gMonPalette_Wimpod[] = INCBIN_U16("graphics/pokemon/wimpod/normal.gbapal"); - const u32 gMonBackPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/back.4bpp.lz"); + const u32 gMonBackPic_Wimpod[] = INCBIN_U32("graphics/pokemon/wimpod/back.4bpp.smol"); const u16 gMonShinyPalette_Wimpod[] = INCBIN_U16("graphics/pokemon/wimpod/shiny.gbapal"); const u8 gMonIcon_Wimpod[] = INCBIN_U8("graphics/pokemon/wimpod/icon.4bpp"); #if P_FOOTPRINTS @@ -21676,9 +21676,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/anim_front.4bpp.smol"); const u16 gMonPalette_Golisopod[] = INCBIN_U16("graphics/pokemon/golisopod/normal.gbapal"); - const u32 gMonBackPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/back.4bpp.lz"); + const u32 gMonBackPic_Golisopod[] = INCBIN_U32("graphics/pokemon/golisopod/back.4bpp.smol"); const u16 gMonShinyPalette_Golisopod[] = INCBIN_U16("graphics/pokemon/golisopod/shiny.gbapal"); const u8 gMonIcon_Golisopod[] = INCBIN_U8("graphics/pokemon/golisopod/icon.4bpp"); #if P_FOOTPRINTS @@ -21694,9 +21694,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WIMPOD #if P_FAMILY_SANDYGAST - const u32 gMonFrontPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/front.4bpp.lz"); + const u32 gMonFrontPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/front.4bpp.smol"); const u16 gMonPalette_Sandygast[] = INCBIN_U16("graphics/pokemon/sandygast/normal.gbapal"); - const u32 gMonBackPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/back.4bpp.lz"); + const u32 gMonBackPic_Sandygast[] = INCBIN_U32("graphics/pokemon/sandygast/back.4bpp.smol"); const u16 gMonShinyPalette_Sandygast[] = INCBIN_U16("graphics/pokemon/sandygast/shiny.gbapal"); const u8 gMonIcon_Sandygast[] = INCBIN_U8("graphics/pokemon/sandygast/icon.4bpp"); #if P_FOOTPRINTS @@ -21710,9 +21710,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/front.4bpp.lz"); + const u32 gMonFrontPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/front.4bpp.smol"); const u16 gMonPalette_Palossand[] = INCBIN_U16("graphics/pokemon/palossand/normal.gbapal"); - const u32 gMonBackPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/back.4bpp.lz"); + const u32 gMonBackPic_Palossand[] = INCBIN_U32("graphics/pokemon/palossand/back.4bpp.smol"); const u16 gMonShinyPalette_Palossand[] = INCBIN_U16("graphics/pokemon/palossand/shiny.gbapal"); const u8 gMonIcon_Palossand[] = INCBIN_U8("graphics/pokemon/palossand/icon.4bpp"); #if P_FOOTPRINTS @@ -21728,9 +21728,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDYGAST #if P_FAMILY_PYUKUMUKU - const u32 gMonFrontPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/anim_front.4bpp.smol"); const u16 gMonPalette_Pyukumuku[] = INCBIN_U16("graphics/pokemon/pyukumuku/normal.gbapal"); - const u32 gMonBackPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/back.4bpp.lz"); + const u32 gMonBackPic_Pyukumuku[] = INCBIN_U32("graphics/pokemon/pyukumuku/back.4bpp.smol"); const u16 gMonShinyPalette_Pyukumuku[] = INCBIN_U16("graphics/pokemon/pyukumuku/shiny.gbapal"); const u8 gMonIcon_Pyukumuku[] = INCBIN_U8("graphics/pokemon/pyukumuku/icon.4bpp"); #if P_FOOTPRINTS @@ -21746,9 +21746,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PYUKUMUKU #if P_FAMILY_TYPE_NULL - const u32 gMonFrontPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/front.4bpp.lz"); + const u32 gMonFrontPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/front.4bpp.smol"); const u16 gMonPalette_TypeNull[] = INCBIN_U16("graphics/pokemon/type_null/normal.gbapal"); - const u32 gMonBackPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/back.4bpp.lz"); + const u32 gMonBackPic_TypeNull[] = INCBIN_U32("graphics/pokemon/type_null/back.4bpp.smol"); const u16 gMonShinyPalette_TypeNull[] = INCBIN_U16("graphics/pokemon/type_null/shiny.gbapal"); const u8 gMonIcon_TypeNull[] = INCBIN_U8("graphics/pokemon/type_null/icon.4bpp"); #if P_FOOTPRINTS @@ -21762,8 +21762,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/front.4bpp.lz"); - const u32 gMonBackPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/back.4bpp.lz"); + const u32 gMonFrontPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/front.4bpp.smol"); + const u32 gMonBackPic_Silvally[] = INCBIN_U32("graphics/pokemon/silvally/back.4bpp.smol"); const u8 gMonIcon_Silvally[] = INCBIN_U8("graphics/pokemon/silvally/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Silvally[] = INCBIN_U8("graphics/pokemon/silvally/footprint.1bpp"); @@ -21832,17 +21832,17 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TYPE_NULL #if P_FAMILY_MINIOR - const u32 gMonFrontPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/front.4bpp.lz"); + const u32 gMonFrontPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/front.4bpp.smol"); const u16 gMonPalette_MiniorMeteor[] = INCBIN_U16("graphics/pokemon/minior/normal.gbapal"); - const u32 gMonBackPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/back.4bpp.lz"); + const u32 gMonBackPic_MiniorMeteor[] = INCBIN_U32("graphics/pokemon/minior/back.4bpp.smol"); const u16 gMonShinyPalette_MiniorMeteor[] = INCBIN_U16("graphics/pokemon/minior/shiny.gbapal"); const u8 gMonIcon_MiniorMeteor[] = INCBIN_U8("graphics/pokemon/minior/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Minior[] = INCBIN_U8("graphics/pokemon/minior/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/front.4bpp.lz"); - const u32 gMonBackPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/back.4bpp.lz"); + const u32 gMonFrontPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/front.4bpp.smol"); + const u32 gMonBackPic_MiniorCore[] = INCBIN_U32("graphics/pokemon/minior/core/back.4bpp.smol"); const u16 gMonShinyPalette_MiniorCore[] = INCBIN_U16("graphics/pokemon/minior/core/shiny.gbapal"); const u16 gMonPalette_MiniorCoreRed[] = INCBIN_U16("graphics/pokemon/minior/core/red/normal.gbapal"); @@ -21876,9 +21876,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MINIOR #if P_FAMILY_KOMALA - const u32 gMonFrontPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/front.4bpp.lz"); + const u32 gMonFrontPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/front.4bpp.smol"); const u16 gMonPalette_Komala[] = INCBIN_U16("graphics/pokemon/komala/normal.gbapal"); - const u32 gMonBackPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/back.4bpp.lz"); + const u32 gMonBackPic_Komala[] = INCBIN_U32("graphics/pokemon/komala/back.4bpp.smol"); const u16 gMonShinyPalette_Komala[] = INCBIN_U16("graphics/pokemon/komala/shiny.gbapal"); const u8 gMonIcon_Komala[] = INCBIN_U8("graphics/pokemon/komala/icon.4bpp"); #if P_FOOTPRINTS @@ -21894,9 +21894,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KOMALA #if P_FAMILY_TURTONATOR - const u32 gMonFrontPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/anim_front.4bpp.smol"); const u16 gMonPalette_Turtonator[] = INCBIN_U16("graphics/pokemon/turtonator/normal.gbapal"); - const u32 gMonBackPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/back.4bpp.lz"); + const u32 gMonBackPic_Turtonator[] = INCBIN_U32("graphics/pokemon/turtonator/back.4bpp.smol"); const u16 gMonShinyPalette_Turtonator[] = INCBIN_U16("graphics/pokemon/turtonator/shiny.gbapal"); const u8 gMonIcon_Turtonator[] = INCBIN_U8("graphics/pokemon/turtonator/icon.4bpp"); #if P_FOOTPRINTS @@ -21912,9 +21912,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TURTONATOR #if P_FAMILY_TOGEDEMARU - const u32 gMonFrontPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/anim_front.4bpp.smol"); const u16 gMonPalette_Togedemaru[] = INCBIN_U16("graphics/pokemon/togedemaru/normal.gbapal"); - const u32 gMonBackPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/back.4bpp.lz"); + const u32 gMonBackPic_Togedemaru[] = INCBIN_U32("graphics/pokemon/togedemaru/back.4bpp.smol"); const u16 gMonShinyPalette_Togedemaru[] = INCBIN_U16("graphics/pokemon/togedemaru/shiny.gbapal"); const u8 gMonIcon_Togedemaru[] = INCBIN_U8("graphics/pokemon/togedemaru/icon.4bpp"); #if P_FOOTPRINTS @@ -21930,9 +21930,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOGEDEMARU #if P_FAMILY_MIMIKYU - const u32 gMonFrontPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/front.4bpp.lz"); + const u32 gMonFrontPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/front.4bpp.smol"); const u16 gMonPalette_MimikyuDisguised[] = INCBIN_U16("graphics/pokemon/mimikyu/normal.gbapal"); - const u32 gMonBackPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/back.4bpp.lz"); + const u32 gMonBackPic_MimikyuDisguised[] = INCBIN_U32("graphics/pokemon/mimikyu/back.4bpp.smol"); const u16 gMonShinyPalette_MimikyuDisguised[] = INCBIN_U16("graphics/pokemon/mimikyu/shiny.gbapal"); const u8 gMonIcon_MimikyuDisguised[] = INCBIN_U8("graphics/pokemon/mimikyu/icon.4bpp"); #if P_FOOTPRINTS @@ -21946,9 +21946,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/front.4bpp.lz"); + const u32 gMonFrontPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/front.4bpp.smol"); const u16 gMonPalette_MimikyuBusted[] = INCBIN_U16("graphics/pokemon/mimikyu/busted/normal.gbapal"); - const u32 gMonBackPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/back.4bpp.lz"); + const u32 gMonBackPic_MimikyuBusted[] = INCBIN_U32("graphics/pokemon/mimikyu/busted/back.4bpp.smol"); const u16 gMonShinyPalette_MimikyuBusted[] = INCBIN_U16("graphics/pokemon/mimikyu/busted/shiny.gbapal"); const u8 gMonIcon_MimikyuBusted[] = INCBIN_U8("graphics/pokemon/mimikyu/busted/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -21961,9 +21961,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIMIKYU #if P_FAMILY_BRUXISH - const u32 gMonFrontPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/front.4bpp.lz"); + const u32 gMonFrontPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/front.4bpp.smol"); const u16 gMonPalette_Bruxish[] = INCBIN_U16("graphics/pokemon/bruxish/normal.gbapal"); - const u32 gMonBackPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/back.4bpp.lz"); + const u32 gMonBackPic_Bruxish[] = INCBIN_U32("graphics/pokemon/bruxish/back.4bpp.smol"); const u16 gMonShinyPalette_Bruxish[] = INCBIN_U16("graphics/pokemon/bruxish/shiny.gbapal"); const u8 gMonIcon_Bruxish[] = INCBIN_U8("graphics/pokemon/bruxish/icon.4bpp"); #if P_FOOTPRINTS @@ -21979,9 +21979,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRUXISH #if P_FAMILY_DRAMPA - const u32 gMonFrontPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/anim_front.4bpp.smol"); const u16 gMonPalette_Drampa[] = INCBIN_U16("graphics/pokemon/drampa/normal.gbapal"); - const u32 gMonBackPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/back.4bpp.lz"); + const u32 gMonBackPic_Drampa[] = INCBIN_U32("graphics/pokemon/drampa/back.4bpp.smol"); const u16 gMonShinyPalette_Drampa[] = INCBIN_U16("graphics/pokemon/drampa/shiny.gbapal"); const u8 gMonIcon_Drampa[] = INCBIN_U8("graphics/pokemon/drampa/icon.4bpp"); #if P_FOOTPRINTS @@ -21997,9 +21997,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRAMPA #if P_FAMILY_DHELMISE - const u32 gMonFrontPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/front.4bpp.lz"); + const u32 gMonFrontPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/front.4bpp.smol"); const u16 gMonPalette_Dhelmise[] = INCBIN_U16("graphics/pokemon/dhelmise/normal.gbapal"); - const u32 gMonBackPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/back.4bpp.lz"); + const u32 gMonBackPic_Dhelmise[] = INCBIN_U32("graphics/pokemon/dhelmise/back.4bpp.smol"); const u16 gMonShinyPalette_Dhelmise[] = INCBIN_U16("graphics/pokemon/dhelmise/shiny.gbapal"); const u8 gMonIcon_Dhelmise[] = INCBIN_U8("graphics/pokemon/dhelmise/icon.4bpp"); #if P_FOOTPRINTS @@ -22015,9 +22015,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DHELMISE #if P_FAMILY_JANGMO_O - const u32 gMonFrontPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/anim_front.4bpp.smol"); const u16 gMonPalette_JangmoO[] = INCBIN_U16("graphics/pokemon/jangmo_o/normal.gbapal"); - const u32 gMonBackPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/back.4bpp.lz"); + const u32 gMonBackPic_JangmoO[] = INCBIN_U32("graphics/pokemon/jangmo_o/back.4bpp.smol"); const u16 gMonShinyPalette_JangmoO[] = INCBIN_U16("graphics/pokemon/jangmo_o/shiny.gbapal"); const u8 gMonIcon_JangmoO[] = INCBIN_U8("graphics/pokemon/jangmo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22031,9 +22031,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/anim_front.4bpp.smol"); const u16 gMonPalette_HakamoO[] = INCBIN_U16("graphics/pokemon/hakamo_o/normal.gbapal"); - const u32 gMonBackPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/back.4bpp.lz"); + const u32 gMonBackPic_HakamoO[] = INCBIN_U32("graphics/pokemon/hakamo_o/back.4bpp.smol"); const u16 gMonShinyPalette_HakamoO[] = INCBIN_U16("graphics/pokemon/hakamo_o/shiny.gbapal"); const u8 gMonIcon_HakamoO[] = INCBIN_U8("graphics/pokemon/hakamo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22047,9 +22047,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/anim_front.4bpp.lz"); + const u32 gMonFrontPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/anim_front.4bpp.smol"); const u16 gMonPalette_KommoO[] = INCBIN_U16("graphics/pokemon/kommo_o/normal.gbapal"); - const u32 gMonBackPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/back.4bpp.lz"); + const u32 gMonBackPic_KommoO[] = INCBIN_U32("graphics/pokemon/kommo_o/back.4bpp.smol"); const u16 gMonShinyPalette_KommoO[] = INCBIN_U16("graphics/pokemon/kommo_o/shiny.gbapal"); const u8 gMonIcon_KommoO[] = INCBIN_U8("graphics/pokemon/kommo_o/icon.4bpp"); #if P_FOOTPRINTS @@ -22065,9 +22065,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_JANGMO_O #if P_FAMILY_TAPU_KOKO - const u32 gMonFrontPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/anim_front.4bpp.smol"); const u16 gMonPalette_TapuKoko[] = INCBIN_U16("graphics/pokemon/tapu_koko/normal.gbapal"); - const u32 gMonBackPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/back.4bpp.lz"); + const u32 gMonBackPic_TapuKoko[] = INCBIN_U32("graphics/pokemon/tapu_koko/back.4bpp.smol"); const u16 gMonShinyPalette_TapuKoko[] = INCBIN_U16("graphics/pokemon/tapu_koko/shiny.gbapal"); const u8 gMonIcon_TapuKoko[] = INCBIN_U8("graphics/pokemon/tapu_koko/icon.4bpp"); #if P_FOOTPRINTS @@ -22083,9 +22083,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_KOKO #if P_FAMILY_TAPU_LELE - const u32 gMonFrontPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/anim_front.4bpp.smol"); const u16 gMonPalette_TapuLele[] = INCBIN_U16("graphics/pokemon/tapu_lele/normal.gbapal"); - const u32 gMonBackPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/back.4bpp.lz"); + const u32 gMonBackPic_TapuLele[] = INCBIN_U32("graphics/pokemon/tapu_lele/back.4bpp.smol"); const u16 gMonShinyPalette_TapuLele[] = INCBIN_U16("graphics/pokemon/tapu_lele/shiny.gbapal"); const u8 gMonIcon_TapuLele[] = INCBIN_U8("graphics/pokemon/tapu_lele/icon.4bpp"); #if P_FOOTPRINTS @@ -22101,9 +22101,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_LELE #if P_FAMILY_TAPU_BULU - const u32 gMonFrontPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/anim_front.4bpp.smol"); const u16 gMonPalette_TapuBulu[] = INCBIN_U16("graphics/pokemon/tapu_bulu/normal.gbapal"); - const u32 gMonBackPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/back.4bpp.lz"); + const u32 gMonBackPic_TapuBulu[] = INCBIN_U32("graphics/pokemon/tapu_bulu/back.4bpp.smol"); const u16 gMonShinyPalette_TapuBulu[] = INCBIN_U16("graphics/pokemon/tapu_bulu/shiny.gbapal"); const u8 gMonIcon_TapuBulu[] = INCBIN_U8("graphics/pokemon/tapu_bulu/icon.4bpp"); #if P_FOOTPRINTS @@ -22119,9 +22119,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_BULU #if P_FAMILY_TAPU_FINI - const u32 gMonFrontPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/anim_front.4bpp.lz"); + const u32 gMonFrontPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/anim_front.4bpp.smol"); const u16 gMonPalette_TapuFini[] = INCBIN_U16("graphics/pokemon/tapu_fini/normal.gbapal"); - const u32 gMonBackPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/back.4bpp.lz"); + const u32 gMonBackPic_TapuFini[] = INCBIN_U32("graphics/pokemon/tapu_fini/back.4bpp.smol"); const u16 gMonShinyPalette_TapuFini[] = INCBIN_U16("graphics/pokemon/tapu_fini/shiny.gbapal"); const u8 gMonIcon_TapuFini[] = INCBIN_U8("graphics/pokemon/tapu_fini/icon.4bpp"); #if P_FOOTPRINTS @@ -22137,9 +22137,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAPU_FINI #if P_FAMILY_COSMOG - const u32 gMonFrontPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/front.4bpp.lz"); + const u32 gMonFrontPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/front.4bpp.smol"); const u16 gMonPalette_Cosmog[] = INCBIN_U16("graphics/pokemon/cosmog/normal.gbapal"); - const u32 gMonBackPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/back.4bpp.lz"); + const u32 gMonBackPic_Cosmog[] = INCBIN_U32("graphics/pokemon/cosmog/back.4bpp.smol"); const u16 gMonShinyPalette_Cosmog[] = INCBIN_U16("graphics/pokemon/cosmog/shiny.gbapal"); const u8 gMonIcon_Cosmog[] = INCBIN_U8("graphics/pokemon/cosmog/icon.4bpp"); #if P_FOOTPRINTS @@ -22153,9 +22153,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/front.4bpp.lz"); + const u32 gMonFrontPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/front.4bpp.smol"); const u16 gMonPalette_Cosmoem[] = INCBIN_U16("graphics/pokemon/cosmoem/normal.gbapal"); - const u32 gMonBackPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/back.4bpp.lz"); + const u32 gMonBackPic_Cosmoem[] = INCBIN_U32("graphics/pokemon/cosmoem/back.4bpp.smol"); const u16 gMonShinyPalette_Cosmoem[] = INCBIN_U16("graphics/pokemon/cosmoem/shiny.gbapal"); const u8 gMonIcon_Cosmoem[] = INCBIN_U8("graphics/pokemon/cosmoem/icon.4bpp"); #if P_FOOTPRINTS @@ -22169,9 +22169,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/front.4bpp.lz"); + const u32 gMonFrontPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/front.4bpp.smol"); const u16 gMonPalette_Solgaleo[] = INCBIN_U16("graphics/pokemon/solgaleo/normal.gbapal"); - const u32 gMonBackPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/back.4bpp.lz"); + const u32 gMonBackPic_Solgaleo[] = INCBIN_U32("graphics/pokemon/solgaleo/back.4bpp.smol"); const u16 gMonShinyPalette_Solgaleo[] = INCBIN_U16("graphics/pokemon/solgaleo/shiny.gbapal"); const u8 gMonIcon_Solgaleo[] = INCBIN_U8("graphics/pokemon/solgaleo/icon.4bpp"); #if P_FOOTPRINTS @@ -22185,9 +22185,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/front.4bpp.lz"); + const u32 gMonFrontPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/front.4bpp.smol"); const u16 gMonPalette_Lunala[] = INCBIN_U16("graphics/pokemon/lunala/normal.gbapal"); - const u32 gMonBackPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/back.4bpp.lz"); + const u32 gMonBackPic_Lunala[] = INCBIN_U32("graphics/pokemon/lunala/back.4bpp.smol"); const u16 gMonShinyPalette_Lunala[] = INCBIN_U16("graphics/pokemon/lunala/shiny.gbapal"); const u8 gMonIcon_Lunala[] = INCBIN_U8("graphics/pokemon/lunala/icon.4bpp"); #if P_FOOTPRINTS @@ -22203,9 +22203,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_COSMOG #if P_FAMILY_NIHILEGO - const u32 gMonFrontPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/front.4bpp.lz"); + const u32 gMonFrontPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/front.4bpp.smol"); const u16 gMonPalette_Nihilego[] = INCBIN_U16("graphics/pokemon/nihilego/normal.gbapal"); - const u32 gMonBackPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/back.4bpp.lz"); + const u32 gMonBackPic_Nihilego[] = INCBIN_U32("graphics/pokemon/nihilego/back.4bpp.smol"); const u16 gMonShinyPalette_Nihilego[] = INCBIN_U16("graphics/pokemon/nihilego/shiny.gbapal"); const u8 gMonIcon_Nihilego[] = INCBIN_U8("graphics/pokemon/nihilego/icon.4bpp"); #if P_FOOTPRINTS @@ -22221,9 +22221,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NIHILEGO #if P_FAMILY_BUZZWOLE - const u32 gMonFrontPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/front.4bpp.lz"); + const u32 gMonFrontPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/front.4bpp.smol"); const u16 gMonPalette_Buzzwole[] = INCBIN_U16("graphics/pokemon/buzzwole/normal.gbapal"); - const u32 gMonBackPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/back.4bpp.lz"); + const u32 gMonBackPic_Buzzwole[] = INCBIN_U32("graphics/pokemon/buzzwole/back.4bpp.smol"); const u16 gMonShinyPalette_Buzzwole[] = INCBIN_U16("graphics/pokemon/buzzwole/shiny.gbapal"); const u8 gMonIcon_Buzzwole[] = INCBIN_U8("graphics/pokemon/buzzwole/icon.4bpp"); #if P_FOOTPRINTS @@ -22239,9 +22239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BUZZWOLE #if P_FAMILY_PHEROMOSA - const u32 gMonFrontPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/front.4bpp.lz"); + const u32 gMonFrontPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/front.4bpp.smol"); const u16 gMonPalette_Pheromosa[] = INCBIN_U16("graphics/pokemon/pheromosa/normal.gbapal"); - const u32 gMonBackPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/back.4bpp.lz"); + const u32 gMonBackPic_Pheromosa[] = INCBIN_U32("graphics/pokemon/pheromosa/back.4bpp.smol"); const u16 gMonShinyPalette_Pheromosa[] = INCBIN_U16("graphics/pokemon/pheromosa/shiny.gbapal"); const u8 gMonIcon_Pheromosa[] = INCBIN_U8("graphics/pokemon/pheromosa/icon.4bpp"); #if P_FOOTPRINTS @@ -22257,9 +22257,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PHEROMOSA #if P_FAMILY_XURKITREE - const u32 gMonFrontPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/front.4bpp.lz"); + const u32 gMonFrontPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/front.4bpp.smol"); const u16 gMonPalette_Xurkitree[] = INCBIN_U16("graphics/pokemon/xurkitree/normal.gbapal"); - const u32 gMonBackPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/back.4bpp.lz"); + const u32 gMonBackPic_Xurkitree[] = INCBIN_U32("graphics/pokemon/xurkitree/back.4bpp.smol"); const u16 gMonShinyPalette_Xurkitree[] = INCBIN_U16("graphics/pokemon/xurkitree/shiny.gbapal"); const u8 gMonIcon_Xurkitree[] = INCBIN_U8("graphics/pokemon/xurkitree/icon.4bpp"); #if P_FOOTPRINTS @@ -22275,9 +22275,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_XURKITREE #if P_FAMILY_CELESTEELA - const u32 gMonFrontPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/front.4bpp.lz"); + const u32 gMonFrontPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/front.4bpp.smol"); const u16 gMonPalette_Celesteela[] = INCBIN_U16("graphics/pokemon/celesteela/normal.gbapal"); - const u32 gMonBackPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/back.4bpp.lz"); + const u32 gMonBackPic_Celesteela[] = INCBIN_U32("graphics/pokemon/celesteela/back.4bpp.smol"); const u16 gMonShinyPalette_Celesteela[] = INCBIN_U16("graphics/pokemon/celesteela/shiny.gbapal"); const u8 gMonIcon_Celesteela[] = INCBIN_U8("graphics/pokemon/celesteela/icon.4bpp"); #if P_FOOTPRINTS @@ -22293,9 +22293,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CELESTEELA #if P_FAMILY_KARTANA - const u32 gMonFrontPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/front.4bpp.lz"); + const u32 gMonFrontPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/front.4bpp.smol"); const u16 gMonPalette_Kartana[] = INCBIN_U16("graphics/pokemon/kartana/normal.gbapal"); - const u32 gMonBackPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/back.4bpp.lz"); + const u32 gMonBackPic_Kartana[] = INCBIN_U32("graphics/pokemon/kartana/back.4bpp.smol"); const u16 gMonShinyPalette_Kartana[] = INCBIN_U16("graphics/pokemon/kartana/shiny.gbapal"); const u8 gMonIcon_Kartana[] = INCBIN_U8("graphics/pokemon/kartana/icon.4bpp"); #if P_FOOTPRINTS @@ -22311,9 +22311,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KARTANA #if P_FAMILY_GUZZLORD - const u32 gMonFrontPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/front.4bpp.lz"); + const u32 gMonFrontPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/front.4bpp.smol"); const u16 gMonPalette_Guzzlord[] = INCBIN_U16("graphics/pokemon/guzzlord/normal.gbapal"); - const u32 gMonBackPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/back.4bpp.lz"); + const u32 gMonBackPic_Guzzlord[] = INCBIN_U32("graphics/pokemon/guzzlord/back.4bpp.smol"); const u16 gMonShinyPalette_Guzzlord[] = INCBIN_U16("graphics/pokemon/guzzlord/shiny.gbapal"); const u8 gMonIcon_Guzzlord[] = INCBIN_U8("graphics/pokemon/guzzlord/icon.4bpp"); #if P_FOOTPRINTS @@ -22329,9 +22329,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GUZZLORD #if P_FAMILY_NECROZMA - const u32 gMonFrontPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/front.4bpp.lz"); + const u32 gMonFrontPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/front.4bpp.smol"); const u16 gMonPalette_Necrozma[] = INCBIN_U16("graphics/pokemon/necrozma/normal.gbapal"); - const u32 gMonBackPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/back.4bpp.lz"); + const u32 gMonBackPic_Necrozma[] = INCBIN_U32("graphics/pokemon/necrozma/back.4bpp.smol"); const u16 gMonShinyPalette_Necrozma[] = INCBIN_U16("graphics/pokemon/necrozma/shiny.gbapal"); const u8 gMonIcon_Necrozma[] = INCBIN_U8("graphics/pokemon/necrozma/icon.4bpp"); #if P_FOOTPRINTS @@ -22346,9 +22346,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/front.4bpp.smol"); const u16 gMonPalette_NecrozmaDuskMane[] = INCBIN_U16("graphics/pokemon/necrozma/dusk_mane/normal.gbapal"); - const u32 gMonBackPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaDuskMane[] = INCBIN_U32("graphics/pokemon/necrozma/dusk_mane/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaDuskMane[] = INCBIN_U16("graphics/pokemon/necrozma/dusk_mane/shiny.gbapal"); const u8 gMonIcon_NecrozmaDuskMane[] = INCBIN_U8("graphics/pokemon/necrozma/dusk_mane/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22359,9 +22359,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/front.4bpp.smol"); const u16 gMonPalette_NecrozmaDawnWings[] = INCBIN_U16("graphics/pokemon/necrozma/dawn_wings/normal.gbapal"); - const u32 gMonBackPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaDawnWings[] = INCBIN_U32("graphics/pokemon/necrozma/dawn_wings/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaDawnWings[] = INCBIN_U16("graphics/pokemon/necrozma/dawn_wings/shiny.gbapal"); const u8 gMonIcon_NecrozmaDawnWings[] = INCBIN_U8("graphics/pokemon/necrozma/dawn_wings/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22373,9 +22373,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_ULTRA_BURST_FORMS - const u32 gMonFrontPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/front.4bpp.lz"); + const u32 gMonFrontPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/front.4bpp.smol"); const u16 gMonPalette_NecrozmaUltra[] = INCBIN_U16("graphics/pokemon/necrozma/ultra/normal.gbapal"); - const u32 gMonBackPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/back.4bpp.lz"); + const u32 gMonBackPic_NecrozmaUltra[] = INCBIN_U32("graphics/pokemon/necrozma/ultra/back.4bpp.smol"); const u16 gMonShinyPalette_NecrozmaUltra[] = INCBIN_U16("graphics/pokemon/necrozma/ultra/shiny.gbapal"); const u8 gMonIcon_NecrozmaUltra[] = INCBIN_U8("graphics/pokemon/necrozma/ultra/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22390,9 +22390,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NECROZMA #if P_FAMILY_MAGEARNA - const u32 gMonFrontPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/front.4bpp.lz"); + const u32 gMonFrontPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/front.4bpp.smol"); const u16 gMonPalette_Magearna[] = INCBIN_U16("graphics/pokemon/magearna/normal.gbapal"); - const u32 gMonBackPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/back.4bpp.lz"); + const u32 gMonBackPic_Magearna[] = INCBIN_U32("graphics/pokemon/magearna/back.4bpp.smol"); const u16 gMonShinyPalette_Magearna[] = INCBIN_U16("graphics/pokemon/magearna/shiny.gbapal"); const u8 gMonIcon_Magearna[] = INCBIN_U8("graphics/pokemon/magearna/icon.4bpp"); #if P_FOOTPRINTS @@ -22406,9 +22406,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/front.4bpp.lz"); + const u32 gMonFrontPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/front.4bpp.smol"); const u16 gMonPalette_MagearnaOriginal[] = INCBIN_U16("graphics/pokemon/magearna/original_color/normal.gbapal"); - const u32 gMonBackPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/back.4bpp.lz"); + const u32 gMonBackPic_MagearnaOriginal[] = INCBIN_U32("graphics/pokemon/magearna/original_color/back.4bpp.smol"); const u16 gMonShinyPalette_MagearnaOriginal[] = INCBIN_U16("graphics/pokemon/magearna/original_color/shiny.gbapal"); const u8 gMonIcon_MagearnaOriginal[] = INCBIN_U8("graphics/pokemon/magearna/original_color/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -22421,9 +22421,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MAGEARNA #if P_FAMILY_MARSHADOW - const u32 gMonFrontPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/anim_front.4bpp.smol"); const u16 gMonPalette_Marshadow[] = INCBIN_U16("graphics/pokemon/marshadow/normal.gbapal"); - const u32 gMonBackPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/back.4bpp.lz"); + const u32 gMonBackPic_Marshadow[] = INCBIN_U32("graphics/pokemon/marshadow/back.4bpp.smol"); const u16 gMonShinyPalette_Marshadow[] = INCBIN_U16("graphics/pokemon/marshadow/shiny.gbapal"); const u8 gMonIcon_Marshadow[] = INCBIN_U8("graphics/pokemon/marshadow/icon.4bpp"); #if P_FOOTPRINTS @@ -22439,9 +22439,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MARSHADOW #if P_FAMILY_POIPOLE - const u32 gMonFrontPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/front.4bpp.lz"); + const u32 gMonFrontPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/front.4bpp.smol"); const u16 gMonPalette_Poipole[] = INCBIN_U16("graphics/pokemon/poipole/normal.gbapal"); - const u32 gMonBackPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/back.4bpp.lz"); + const u32 gMonBackPic_Poipole[] = INCBIN_U32("graphics/pokemon/poipole/back.4bpp.smol"); const u16 gMonShinyPalette_Poipole[] = INCBIN_U16("graphics/pokemon/poipole/shiny.gbapal"); const u8 gMonIcon_Poipole[] = INCBIN_U8("graphics/pokemon/poipole/icon.4bpp"); #if P_FOOTPRINTS @@ -22455,9 +22455,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/front.4bpp.lz"); + const u32 gMonFrontPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/front.4bpp.smol"); const u16 gMonPalette_Naganadel[] = INCBIN_U16("graphics/pokemon/naganadel/normal.gbapal"); - const u32 gMonBackPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/back.4bpp.lz"); + const u32 gMonBackPic_Naganadel[] = INCBIN_U32("graphics/pokemon/naganadel/back.4bpp.smol"); const u16 gMonShinyPalette_Naganadel[] = INCBIN_U16("graphics/pokemon/naganadel/shiny.gbapal"); const u8 gMonIcon_Naganadel[] = INCBIN_U8("graphics/pokemon/naganadel/icon.4bpp"); #if P_FOOTPRINTS @@ -22473,9 +22473,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POIPOLE #if P_FAMILY_STAKATAKA - const u32 gMonFrontPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/front.4bpp.lz"); + const u32 gMonFrontPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/front.4bpp.smol"); const u16 gMonPalette_Stakataka[] = INCBIN_U16("graphics/pokemon/stakataka/normal.gbapal"); - const u32 gMonBackPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/back.4bpp.lz"); + const u32 gMonBackPic_Stakataka[] = INCBIN_U32("graphics/pokemon/stakataka/back.4bpp.smol"); const u16 gMonShinyPalette_Stakataka[] = INCBIN_U16("graphics/pokemon/stakataka/shiny.gbapal"); const u8 gMonIcon_Stakataka[] = INCBIN_U8("graphics/pokemon/stakataka/icon.4bpp"); #if P_FOOTPRINTS @@ -22491,9 +22491,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STAKATAKA #if P_FAMILY_BLACEPHALON - const u32 gMonFrontPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/front.4bpp.lz"); + const u32 gMonFrontPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/front.4bpp.smol"); const u16 gMonPalette_Blacephalon[] = INCBIN_U16("graphics/pokemon/blacephalon/normal.gbapal"); - const u32 gMonBackPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/back.4bpp.lz"); + const u32 gMonBackPic_Blacephalon[] = INCBIN_U32("graphics/pokemon/blacephalon/back.4bpp.smol"); const u16 gMonShinyPalette_Blacephalon[] = INCBIN_U16("graphics/pokemon/blacephalon/shiny.gbapal"); const u8 gMonIcon_Blacephalon[] = INCBIN_U8("graphics/pokemon/blacephalon/icon.4bpp"); #if P_FOOTPRINTS @@ -22509,9 +22509,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLACEPHALON #if P_FAMILY_ZERAORA - const u32 gMonFrontPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/front.4bpp.lz"); + const u32 gMonFrontPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/front.4bpp.smol"); const u16 gMonPalette_Zeraora[] = INCBIN_U16("graphics/pokemon/zeraora/normal.gbapal"); - const u32 gMonBackPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/back.4bpp.lz"); + const u32 gMonBackPic_Zeraora[] = INCBIN_U32("graphics/pokemon/zeraora/back.4bpp.smol"); const u16 gMonShinyPalette_Zeraora[] = INCBIN_U16("graphics/pokemon/zeraora/shiny.gbapal"); const u8 gMonIcon_Zeraora[] = INCBIN_U8("graphics/pokemon/zeraora/icon.4bpp"); #if P_FOOTPRINTS @@ -22527,9 +22527,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZERAORA #if P_FAMILY_MELTAN - const u32 gMonFrontPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/front.4bpp.lz"); + const u32 gMonFrontPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/front.4bpp.smol"); const u16 gMonPalette_Meltan[] = INCBIN_U16("graphics/pokemon/meltan/normal.gbapal"); - const u32 gMonBackPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/back.4bpp.lz"); + const u32 gMonBackPic_Meltan[] = INCBIN_U32("graphics/pokemon/meltan/back.4bpp.smol"); const u16 gMonShinyPalette_Meltan[] = INCBIN_U16("graphics/pokemon/meltan/shiny.gbapal"); const u8 gMonIcon_Meltan[] = INCBIN_U8("graphics/pokemon/meltan/icon.4bpp"); #if P_FOOTPRINTS @@ -22543,9 +22543,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/front.4bpp.lz"); + const u32 gMonFrontPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/front.4bpp.smol"); const u16 gMonPalette_Melmetal[] = INCBIN_U16("graphics/pokemon/melmetal/normal.gbapal"); - const u32 gMonBackPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/back.4bpp.lz"); + const u32 gMonBackPic_Melmetal[] = INCBIN_U32("graphics/pokemon/melmetal/back.4bpp.smol"); const u16 gMonShinyPalette_Melmetal[] = INCBIN_U16("graphics/pokemon/melmetal/shiny.gbapal"); const u8 gMonIcon_Melmetal[] = INCBIN_U8("graphics/pokemon/melmetal/icon.4bpp"); #if P_FOOTPRINTS @@ -22560,8 +22560,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/front.4bpp.lz"); - const u32 gMonBackPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/front.4bpp.smol"); + const u32 gMonBackPic_MelmetalGmax[] = INCBIN_U32("graphics/pokemon/melmetal/gmax/back.4bpp.smol"); const u16 gMonPalette_MelmetalGmax[] = INCBIN_U16("graphics/pokemon/melmetal/gmax/normal.gbapal"); const u16 gMonShinyPalette_MelmetalGmax[] = INCBIN_U16("graphics/pokemon/melmetal/gmax/shiny.gbapal"); const u8 gMonIcon_MelmetalGmax[] = INCBIN_U8("graphics/pokemon/melmetal/gmax/icon.4bpp"); @@ -22576,9 +22576,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MELTAN #if P_FAMILY_GROOKEY - const u32 gMonFrontPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/front.4bpp.lz"); + const u32 gMonFrontPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/front.4bpp.smol"); const u16 gMonPalette_Grookey[] = INCBIN_U16("graphics/pokemon/grookey/normal.gbapal"); - const u32 gMonBackPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/back.4bpp.lz"); + const u32 gMonBackPic_Grookey[] = INCBIN_U32("graphics/pokemon/grookey/back.4bpp.smol"); const u16 gMonShinyPalette_Grookey[] = INCBIN_U16("graphics/pokemon/grookey/shiny.gbapal"); const u8 gMonIcon_Grookey[] = INCBIN_U8("graphics/pokemon/grookey/icon.4bpp"); #if P_FOOTPRINTS @@ -22592,9 +22592,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/front.4bpp.lz"); + const u32 gMonFrontPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/front.4bpp.smol"); const u16 gMonPalette_Thwackey[] = INCBIN_U16("graphics/pokemon/thwackey/normal.gbapal"); - const u32 gMonBackPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/back.4bpp.lz"); + const u32 gMonBackPic_Thwackey[] = INCBIN_U32("graphics/pokemon/thwackey/back.4bpp.smol"); const u16 gMonShinyPalette_Thwackey[] = INCBIN_U16("graphics/pokemon/thwackey/shiny.gbapal"); const u8 gMonIcon_Thwackey[] = INCBIN_U8("graphics/pokemon/thwackey/icon.4bpp"); #if P_FOOTPRINTS @@ -22608,9 +22608,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/front.4bpp.lz"); + const u32 gMonFrontPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/front.4bpp.smol"); const u16 gMonPalette_Rillaboom[] = INCBIN_U16("graphics/pokemon/rillaboom/normal.gbapal"); - const u32 gMonBackPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/back.4bpp.lz"); + const u32 gMonBackPic_Rillaboom[] = INCBIN_U32("graphics/pokemon/rillaboom/back.4bpp.smol"); const u16 gMonShinyPalette_Rillaboom[] = INCBIN_U16("graphics/pokemon/rillaboom/shiny.gbapal"); const u8 gMonIcon_Rillaboom[] = INCBIN_U8("graphics/pokemon/rillaboom/icon.4bpp"); #if P_FOOTPRINTS @@ -22625,8 +22625,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/front.4bpp.lz"); - const u32 gMonBackPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/front.4bpp.smol"); + const u32 gMonBackPic_RillaboomGmax[] = INCBIN_U32("graphics/pokemon/rillaboom/gmax/back.4bpp.smol"); const u16 gMonPalette_RillaboomGmax[] = INCBIN_U16("graphics/pokemon/rillaboom/gmax/normal.gbapal"); const u16 gMonShinyPalette_RillaboomGmax[] = INCBIN_U16("graphics/pokemon/rillaboom/gmax/shiny.gbapal"); const u8 gMonIcon_RillaboomGmax[] = INCBIN_U8("graphics/pokemon/rillaboom/gmax/icon.4bpp"); @@ -22641,9 +22641,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GROOKEY #if P_FAMILY_SCORBUNNY - const u32 gMonFrontPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/front.4bpp.lz"); + const u32 gMonFrontPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/front.4bpp.smol"); const u16 gMonPalette_Scorbunny[] = INCBIN_U16("graphics/pokemon/scorbunny/normal.gbapal"); - const u32 gMonBackPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/back.4bpp.lz"); + const u32 gMonBackPic_Scorbunny[] = INCBIN_U32("graphics/pokemon/scorbunny/back.4bpp.smol"); const u16 gMonShinyPalette_Scorbunny[] = INCBIN_U16("graphics/pokemon/scorbunny/shiny.gbapal"); const u8 gMonIcon_Scorbunny[] = INCBIN_U8("graphics/pokemon/scorbunny/icon.4bpp"); #if P_FOOTPRINTS @@ -22657,9 +22657,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/front.4bpp.lz"); + const u32 gMonFrontPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/front.4bpp.smol"); const u16 gMonPalette_Raboot[] = INCBIN_U16("graphics/pokemon/raboot/normal.gbapal"); - const u32 gMonBackPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/back.4bpp.lz"); + const u32 gMonBackPic_Raboot[] = INCBIN_U32("graphics/pokemon/raboot/back.4bpp.smol"); const u16 gMonShinyPalette_Raboot[] = INCBIN_U16("graphics/pokemon/raboot/shiny.gbapal"); const u8 gMonIcon_Raboot[] = INCBIN_U8("graphics/pokemon/raboot/icon.4bpp"); #if P_FOOTPRINTS @@ -22673,9 +22673,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/front.4bpp.lz"); + const u32 gMonFrontPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/front.4bpp.smol"); const u16 gMonPalette_Cinderace[] = INCBIN_U16("graphics/pokemon/cinderace/normal.gbapal"); - const u32 gMonBackPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/back.4bpp.lz"); + const u32 gMonBackPic_Cinderace[] = INCBIN_U32("graphics/pokemon/cinderace/back.4bpp.smol"); const u16 gMonShinyPalette_Cinderace[] = INCBIN_U16("graphics/pokemon/cinderace/shiny.gbapal"); const u8 gMonIcon_Cinderace[] = INCBIN_U8("graphics/pokemon/cinderace/icon.4bpp"); #if P_FOOTPRINTS @@ -22690,8 +22690,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CinderaceGmax[] = INCBIN_U32("graphics/pokemon/cinderace/gmax/back.4bpp.smol"); const u16 gMonPalette_CinderaceGmax[] = INCBIN_U16("graphics/pokemon/cinderace/gmax/normal.gbapal"); const u16 gMonShinyPalette_CinderaceGmax[] = INCBIN_U16("graphics/pokemon/cinderace/gmax/shiny.gbapal"); const u8 gMonIcon_CinderaceGmax[] = INCBIN_U8("graphics/pokemon/cinderace/gmax/icon.4bpp"); @@ -22706,9 +22706,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCORBUNNY #if P_FAMILY_SOBBLE - const u32 gMonFrontPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/front.4bpp.lz"); + const u32 gMonFrontPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/front.4bpp.smol"); const u16 gMonPalette_Sobble[] = INCBIN_U16("graphics/pokemon/sobble/normal.gbapal"); - const u32 gMonBackPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/back.4bpp.lz"); + const u32 gMonBackPic_Sobble[] = INCBIN_U32("graphics/pokemon/sobble/back.4bpp.smol"); const u16 gMonShinyPalette_Sobble[] = INCBIN_U16("graphics/pokemon/sobble/shiny.gbapal"); const u8 gMonIcon_Sobble[] = INCBIN_U8("graphics/pokemon/sobble/icon.4bpp"); #if P_FOOTPRINTS @@ -22722,9 +22722,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/front.4bpp.lz"); + const u32 gMonFrontPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/front.4bpp.smol"); const u16 gMonPalette_Drizzile[] = INCBIN_U16("graphics/pokemon/drizzile/normal.gbapal"); - const u32 gMonBackPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/back.4bpp.lz"); + const u32 gMonBackPic_Drizzile[] = INCBIN_U32("graphics/pokemon/drizzile/back.4bpp.smol"); const u16 gMonShinyPalette_Drizzile[] = INCBIN_U16("graphics/pokemon/drizzile/shiny.gbapal"); const u8 gMonIcon_Drizzile[] = INCBIN_U8("graphics/pokemon/drizzile/icon.4bpp"); #if P_FOOTPRINTS @@ -22738,9 +22738,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/front.4bpp.lz"); + const u32 gMonFrontPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/front.4bpp.smol"); const u16 gMonPalette_Inteleon[] = INCBIN_U16("graphics/pokemon/inteleon/normal.gbapal"); - const u32 gMonBackPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/back.4bpp.lz"); + const u32 gMonBackPic_Inteleon[] = INCBIN_U32("graphics/pokemon/inteleon/back.4bpp.smol"); const u16 gMonShinyPalette_Inteleon[] = INCBIN_U16("graphics/pokemon/inteleon/shiny.gbapal"); const u8 gMonIcon_Inteleon[] = INCBIN_U8("graphics/pokemon/inteleon/icon.4bpp"); #if P_FOOTPRINTS @@ -22755,8 +22755,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/front.4bpp.lz"); - const u32 gMonBackPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/front.4bpp.smol"); + const u32 gMonBackPic_InteleonGmax[] = INCBIN_U32("graphics/pokemon/inteleon/gmax/back.4bpp.smol"); const u16 gMonPalette_InteleonGmax[] = INCBIN_U16("graphics/pokemon/inteleon/gmax/normal.gbapal"); const u16 gMonShinyPalette_InteleonGmax[] = INCBIN_U16("graphics/pokemon/inteleon/gmax/shiny.gbapal"); const u8 gMonIcon_InteleonGmax[] = INCBIN_U8("graphics/pokemon/inteleon/gmax/icon.4bpp"); @@ -22771,9 +22771,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SOBBLE #if P_FAMILY_SKWOVET - const u32 gMonFrontPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/front.4bpp.lz"); + const u32 gMonFrontPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/front.4bpp.smol"); const u16 gMonPalette_Skwovet[] = INCBIN_U16("graphics/pokemon/skwovet/normal.gbapal"); - const u32 gMonBackPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/back.4bpp.lz"); + const u32 gMonBackPic_Skwovet[] = INCBIN_U32("graphics/pokemon/skwovet/back.4bpp.smol"); const u16 gMonShinyPalette_Skwovet[] = INCBIN_U16("graphics/pokemon/skwovet/shiny.gbapal"); const u8 gMonIcon_Skwovet[] = INCBIN_U8("graphics/pokemon/skwovet/icon.4bpp"); #if P_FOOTPRINTS @@ -22787,9 +22787,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/front.4bpp.lz"); + const u32 gMonFrontPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/front.4bpp.smol"); const u16 gMonPalette_Greedent[] = INCBIN_U16("graphics/pokemon/greedent/normal.gbapal"); - const u32 gMonBackPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/back.4bpp.lz"); + const u32 gMonBackPic_Greedent[] = INCBIN_U32("graphics/pokemon/greedent/back.4bpp.smol"); const u16 gMonShinyPalette_Greedent[] = INCBIN_U16("graphics/pokemon/greedent/shiny.gbapal"); const u8 gMonIcon_Greedent[] = INCBIN_U8("graphics/pokemon/greedent/icon.4bpp"); #if P_FOOTPRINTS @@ -22805,9 +22805,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SKWOVET #if P_FAMILY_ROOKIDEE - const u32 gMonFrontPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/anim_front.4bpp.smol"); const u16 gMonPalette_Rookidee[] = INCBIN_U16("graphics/pokemon/rookidee/normal.gbapal"); - const u32 gMonBackPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/back.4bpp.lz"); + const u32 gMonBackPic_Rookidee[] = INCBIN_U32("graphics/pokemon/rookidee/back.4bpp.smol"); const u16 gMonShinyPalette_Rookidee[] = INCBIN_U16("graphics/pokemon/rookidee/shiny.gbapal"); const u8 gMonIcon_Rookidee[] = INCBIN_U8("graphics/pokemon/rookidee/icon.4bpp"); #if P_FOOTPRINTS @@ -22821,9 +22821,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/anim_front.4bpp.smol"); const u16 gMonPalette_Corvisquire[] = INCBIN_U16("graphics/pokemon/corvisquire/normal.gbapal"); - const u32 gMonBackPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/back.4bpp.lz"); + const u32 gMonBackPic_Corvisquire[] = INCBIN_U32("graphics/pokemon/corvisquire/back.4bpp.smol"); const u16 gMonShinyPalette_Corvisquire[] = INCBIN_U16("graphics/pokemon/corvisquire/shiny.gbapal"); const u8 gMonIcon_Corvisquire[] = INCBIN_U8("graphics/pokemon/corvisquire/icon.4bpp"); #if P_FOOTPRINTS @@ -22837,9 +22837,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/anim_front.4bpp.smol"); const u16 gMonPalette_Corviknight[] = INCBIN_U16("graphics/pokemon/corviknight/normal.gbapal"); - const u32 gMonBackPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/back.4bpp.lz"); + const u32 gMonBackPic_Corviknight[] = INCBIN_U32("graphics/pokemon/corviknight/back.4bpp.smol"); const u16 gMonShinyPalette_Corviknight[] = INCBIN_U16("graphics/pokemon/corviknight/shiny.gbapal"); const u8 gMonIcon_Corviknight[] = INCBIN_U8("graphics/pokemon/corviknight/icon.4bpp"); #if P_FOOTPRINTS @@ -22854,8 +22854,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CorviknightGmax[] = INCBIN_U32("graphics/pokemon/corviknight/gmax/back.4bpp.smol"); const u16 gMonPalette_CorviknightGmax[] = INCBIN_U16("graphics/pokemon/corviknight/gmax/normal.gbapal"); const u16 gMonShinyPalette_CorviknightGmax[] = INCBIN_U16("graphics/pokemon/corviknight/gmax/shiny.gbapal"); const u8 gMonIcon_CorviknightGmax[] = INCBIN_U8("graphics/pokemon/corviknight/gmax/icon.4bpp"); @@ -22870,9 +22870,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROOKIDEE #if P_FAMILY_BLIPBUG - const u32 gMonFrontPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/front.4bpp.lz"); + const u32 gMonFrontPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/front.4bpp.smol"); const u16 gMonPalette_Blipbug[] = INCBIN_U16("graphics/pokemon/blipbug/normal.gbapal"); - const u32 gMonBackPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/back.4bpp.lz"); + const u32 gMonBackPic_Blipbug[] = INCBIN_U32("graphics/pokemon/blipbug/back.4bpp.smol"); const u16 gMonShinyPalette_Blipbug[] = INCBIN_U16("graphics/pokemon/blipbug/shiny.gbapal"); const u8 gMonIcon_Blipbug[] = INCBIN_U8("graphics/pokemon/blipbug/icon.4bpp"); #if P_FOOTPRINTS @@ -22886,9 +22886,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/front.4bpp.lz"); + const u32 gMonFrontPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/front.4bpp.smol"); const u16 gMonPalette_Dottler[] = INCBIN_U16("graphics/pokemon/dottler/normal.gbapal"); - const u32 gMonBackPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/back.4bpp.lz"); + const u32 gMonBackPic_Dottler[] = INCBIN_U32("graphics/pokemon/dottler/back.4bpp.smol"); const u16 gMonShinyPalette_Dottler[] = INCBIN_U16("graphics/pokemon/dottler/shiny.gbapal"); const u8 gMonIcon_Dottler[] = INCBIN_U8("graphics/pokemon/dottler/icon.4bpp"); #if P_FOOTPRINTS @@ -22902,9 +22902,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/front.4bpp.lz"); + const u32 gMonFrontPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/front.4bpp.smol"); const u16 gMonPalette_Orbeetle[] = INCBIN_U16("graphics/pokemon/orbeetle/normal.gbapal"); - const u32 gMonBackPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/back.4bpp.lz"); + const u32 gMonBackPic_Orbeetle[] = INCBIN_U32("graphics/pokemon/orbeetle/back.4bpp.smol"); const u16 gMonShinyPalette_Orbeetle[] = INCBIN_U16("graphics/pokemon/orbeetle/shiny.gbapal"); const u8 gMonIcon_Orbeetle[] = INCBIN_U8("graphics/pokemon/orbeetle/icon.4bpp"); #if P_FOOTPRINTS @@ -22919,8 +22919,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/front.4bpp.lz"); - const u32 gMonBackPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/front.4bpp.smol"); + const u32 gMonBackPic_OrbeetleGmax[] = INCBIN_U32("graphics/pokemon/orbeetle/gmax/back.4bpp.smol"); const u16 gMonPalette_OrbeetleGmax[] = INCBIN_U16("graphics/pokemon/orbeetle/gmax/normal.gbapal"); const u16 gMonShinyPalette_OrbeetleGmax[] = INCBIN_U16("graphics/pokemon/orbeetle/gmax/shiny.gbapal"); const u8 gMonIcon_OrbeetleGmax[] = INCBIN_U8("graphics/pokemon/orbeetle/gmax/icon.4bpp"); @@ -22935,9 +22935,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BLIPBUG #if P_FAMILY_NICKIT - const u32 gMonFrontPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/front.4bpp.lz"); + const u32 gMonFrontPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/front.4bpp.smol"); const u16 gMonPalette_Nickit[] = INCBIN_U16("graphics/pokemon/nickit/normal.gbapal"); - const u32 gMonBackPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/back.4bpp.lz"); + const u32 gMonBackPic_Nickit[] = INCBIN_U32("graphics/pokemon/nickit/back.4bpp.smol"); const u16 gMonShinyPalette_Nickit[] = INCBIN_U16("graphics/pokemon/nickit/shiny.gbapal"); const u8 gMonIcon_Nickit[] = INCBIN_U8("graphics/pokemon/nickit/icon.4bpp"); #if P_FOOTPRINTS @@ -22951,9 +22951,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/front.4bpp.lz"); + const u32 gMonFrontPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/front.4bpp.smol"); const u16 gMonPalette_Thievul[] = INCBIN_U16("graphics/pokemon/thievul/normal.gbapal"); - const u32 gMonBackPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/back.4bpp.lz"); + const u32 gMonBackPic_Thievul[] = INCBIN_U32("graphics/pokemon/thievul/back.4bpp.smol"); const u16 gMonShinyPalette_Thievul[] = INCBIN_U16("graphics/pokemon/thievul/shiny.gbapal"); const u8 gMonIcon_Thievul[] = INCBIN_U8("graphics/pokemon/thievul/icon.4bpp"); #if P_FOOTPRINTS @@ -22969,9 +22969,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NICKIT #if P_FAMILY_GOSSIFLEUR - const u32 gMonFrontPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/front.4bpp.lz"); + const u32 gMonFrontPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/front.4bpp.smol"); const u16 gMonPalette_Gossifleur[] = INCBIN_U16("graphics/pokemon/gossifleur/normal.gbapal"); - const u32 gMonBackPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/back.4bpp.lz"); + const u32 gMonBackPic_Gossifleur[] = INCBIN_U32("graphics/pokemon/gossifleur/back.4bpp.smol"); const u16 gMonShinyPalette_Gossifleur[] = INCBIN_U16("graphics/pokemon/gossifleur/shiny.gbapal"); const u8 gMonIcon_Gossifleur[] = INCBIN_U8("graphics/pokemon/gossifleur/icon.4bpp"); #if P_FOOTPRINTS @@ -22985,9 +22985,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/front.4bpp.lz"); + const u32 gMonFrontPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/front.4bpp.smol"); const u16 gMonPalette_Eldegoss[] = INCBIN_U16("graphics/pokemon/eldegoss/normal.gbapal"); - const u32 gMonBackPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/back.4bpp.lz"); + const u32 gMonBackPic_Eldegoss[] = INCBIN_U32("graphics/pokemon/eldegoss/back.4bpp.smol"); const u16 gMonShinyPalette_Eldegoss[] = INCBIN_U16("graphics/pokemon/eldegoss/shiny.gbapal"); const u8 gMonIcon_Eldegoss[] = INCBIN_U8("graphics/pokemon/eldegoss/icon.4bpp"); #if P_FOOTPRINTS @@ -23003,9 +23003,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOSSIFLEUR #if P_FAMILY_WOOLOO - const u32 gMonFrontPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/front.4bpp.lz"); + const u32 gMonFrontPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/front.4bpp.smol"); const u16 gMonPalette_Wooloo[] = INCBIN_U16("graphics/pokemon/wooloo/normal.gbapal"); - const u32 gMonBackPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/back.4bpp.lz"); + const u32 gMonBackPic_Wooloo[] = INCBIN_U32("graphics/pokemon/wooloo/back.4bpp.smol"); const u16 gMonShinyPalette_Wooloo[] = INCBIN_U16("graphics/pokemon/wooloo/shiny.gbapal"); const u8 gMonIcon_Wooloo[] = INCBIN_U8("graphics/pokemon/wooloo/icon.4bpp"); #if P_FOOTPRINTS @@ -23019,9 +23019,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/front.4bpp.lz"); + const u32 gMonFrontPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/front.4bpp.smol"); const u16 gMonPalette_Dubwool[] = INCBIN_U16("graphics/pokemon/dubwool/normal.gbapal"); - const u32 gMonBackPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/back.4bpp.lz"); + const u32 gMonBackPic_Dubwool[] = INCBIN_U32("graphics/pokemon/dubwool/back.4bpp.smol"); const u16 gMonShinyPalette_Dubwool[] = INCBIN_U16("graphics/pokemon/dubwool/shiny.gbapal"); const u8 gMonIcon_Dubwool[] = INCBIN_U8("graphics/pokemon/dubwool/icon.4bpp"); #if P_FOOTPRINTS @@ -23037,9 +23037,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WOOLOO #if P_FAMILY_CHEWTLE - const u32 gMonFrontPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/anim_front.4bpp.smol"); const u16 gMonPalette_Chewtle[] = INCBIN_U16("graphics/pokemon/chewtle/normal.gbapal"); - const u32 gMonBackPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/back.4bpp.lz"); + const u32 gMonBackPic_Chewtle[] = INCBIN_U32("graphics/pokemon/chewtle/back.4bpp.smol"); const u16 gMonShinyPalette_Chewtle[] = INCBIN_U16("graphics/pokemon/chewtle/shiny.gbapal"); const u8 gMonIcon_Chewtle[] = INCBIN_U8("graphics/pokemon/chewtle/icon.4bpp"); #if P_FOOTPRINTS @@ -23053,9 +23053,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/anim_front.4bpp.smol"); const u16 gMonPalette_Drednaw[] = INCBIN_U16("graphics/pokemon/drednaw/normal.gbapal"); - const u32 gMonBackPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/back.4bpp.lz"); + const u32 gMonBackPic_Drednaw[] = INCBIN_U32("graphics/pokemon/drednaw/back.4bpp.smol"); const u16 gMonShinyPalette_Drednaw[] = INCBIN_U16("graphics/pokemon/drednaw/shiny.gbapal"); const u8 gMonIcon_Drednaw[] = INCBIN_U8("graphics/pokemon/drednaw/icon.4bpp"); #if P_FOOTPRINTS @@ -23070,8 +23070,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/front.4bpp.lz"); - const u32 gMonBackPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/front.4bpp.smol"); + const u32 gMonBackPic_DrednawGmax[] = INCBIN_U32("graphics/pokemon/drednaw/gmax/back.4bpp.smol"); const u16 gMonPalette_DrednawGmax[] = INCBIN_U16("graphics/pokemon/drednaw/gmax/normal.gbapal"); const u16 gMonShinyPalette_DrednawGmax[] = INCBIN_U16("graphics/pokemon/drednaw/gmax/shiny.gbapal"); const u8 gMonIcon_DrednawGmax[] = INCBIN_U8("graphics/pokemon/drednaw/gmax/icon.4bpp"); @@ -23086,9 +23086,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHEWTLE #if P_FAMILY_YAMPER - const u32 gMonFrontPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/front.4bpp.lz"); + const u32 gMonFrontPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/front.4bpp.smol"); const u16 gMonPalette_Yamper[] = INCBIN_U16("graphics/pokemon/yamper/normal.gbapal"); - const u32 gMonBackPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/back.4bpp.lz"); + const u32 gMonBackPic_Yamper[] = INCBIN_U32("graphics/pokemon/yamper/back.4bpp.smol"); const u16 gMonShinyPalette_Yamper[] = INCBIN_U16("graphics/pokemon/yamper/shiny.gbapal"); const u8 gMonIcon_Yamper[] = INCBIN_U8("graphics/pokemon/yamper/icon.4bpp"); #if P_FOOTPRINTS @@ -23102,9 +23102,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/front.4bpp.lz"); + const u32 gMonFrontPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/front.4bpp.smol"); const u16 gMonPalette_Boltund[] = INCBIN_U16("graphics/pokemon/boltund/normal.gbapal"); - const u32 gMonBackPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/back.4bpp.lz"); + const u32 gMonBackPic_Boltund[] = INCBIN_U32("graphics/pokemon/boltund/back.4bpp.smol"); const u16 gMonShinyPalette_Boltund[] = INCBIN_U16("graphics/pokemon/boltund/shiny.gbapal"); const u8 gMonIcon_Boltund[] = INCBIN_U8("graphics/pokemon/boltund/icon.4bpp"); #if P_FOOTPRINTS @@ -23120,9 +23120,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_YAMPER #if P_FAMILY_ROLYCOLY - const u32 gMonFrontPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/anim_front.4bpp.smol"); const u16 gMonPalette_Rolycoly[] = INCBIN_U16("graphics/pokemon/rolycoly/normal.gbapal"); - const u32 gMonBackPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/back.4bpp.lz"); + const u32 gMonBackPic_Rolycoly[] = INCBIN_U32("graphics/pokemon/rolycoly/back.4bpp.smol"); const u16 gMonShinyPalette_Rolycoly[] = INCBIN_U16("graphics/pokemon/rolycoly/shiny.gbapal"); const u8 gMonIcon_Rolycoly[] = INCBIN_U8("graphics/pokemon/rolycoly/icon.4bpp"); #if P_FOOTPRINTS @@ -23136,9 +23136,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/anim_front.4bpp.smol"); const u16 gMonPalette_Carkol[] = INCBIN_U16("graphics/pokemon/carkol/normal.gbapal"); - const u32 gMonBackPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/back.4bpp.lz"); + const u32 gMonBackPic_Carkol[] = INCBIN_U32("graphics/pokemon/carkol/back.4bpp.smol"); const u16 gMonShinyPalette_Carkol[] = INCBIN_U16("graphics/pokemon/carkol/shiny.gbapal"); const u8 gMonIcon_Carkol[] = INCBIN_U8("graphics/pokemon/carkol/icon.4bpp"); #if P_FOOTPRINTS @@ -23152,9 +23152,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/anim_front.4bpp.smol"); const u16 gMonPalette_Coalossal[] = INCBIN_U16("graphics/pokemon/coalossal/normal.gbapal"); - const u32 gMonBackPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/back.4bpp.lz"); + const u32 gMonBackPic_Coalossal[] = INCBIN_U32("graphics/pokemon/coalossal/back.4bpp.smol"); const u16 gMonShinyPalette_Coalossal[] = INCBIN_U16("graphics/pokemon/coalossal/shiny.gbapal"); const u8 gMonIcon_Coalossal[] = INCBIN_U8("graphics/pokemon/coalossal/icon.4bpp"); #if P_FOOTPRINTS @@ -23169,8 +23169,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CoalossalGmax[] = INCBIN_U32("graphics/pokemon/coalossal/gmax/back.4bpp.smol"); const u16 gMonPalette_CoalossalGmax[] = INCBIN_U16("graphics/pokemon/coalossal/gmax/normal.gbapal"); const u16 gMonShinyPalette_CoalossalGmax[] = INCBIN_U16("graphics/pokemon/coalossal/gmax/shiny.gbapal"); const u8 gMonIcon_CoalossalGmax[] = INCBIN_U8("graphics/pokemon/coalossal/gmax/icon.4bpp"); @@ -23185,9 +23185,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROLYCOLY #if P_FAMILY_APPLIN - const u32 gMonFrontPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/anim_front.4bpp.smol"); const u16 gMonPalette_Applin[] = INCBIN_U16("graphics/pokemon/applin/normal.gbapal"); - const u32 gMonBackPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/back.4bpp.lz"); + const u32 gMonBackPic_Applin[] = INCBIN_U32("graphics/pokemon/applin/back.4bpp.smol"); const u16 gMonShinyPalette_Applin[] = INCBIN_U16("graphics/pokemon/applin/shiny.gbapal"); const u8 gMonIcon_Applin[] = INCBIN_U8("graphics/pokemon/applin/icon.4bpp"); #if P_FOOTPRINTS @@ -23201,9 +23201,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/anim_front.4bpp.smol"); const u16 gMonPalette_Flapple[] = INCBIN_U16("graphics/pokemon/flapple/normal.gbapal"); - const u32 gMonBackPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/back.4bpp.lz"); + const u32 gMonBackPic_Flapple[] = INCBIN_U32("graphics/pokemon/flapple/back.4bpp.smol"); const u16 gMonShinyPalette_Flapple[] = INCBIN_U16("graphics/pokemon/flapple/shiny.gbapal"); const u8 gMonIcon_Flapple[] = INCBIN_U8("graphics/pokemon/flapple/icon.4bpp"); #if P_FOOTPRINTS @@ -23218,8 +23218,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/front.4bpp.lz"); - const u32 gMonBackPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/front.4bpp.smol"); + const u32 gMonBackPic_FlappleGmax[] = INCBIN_U32("graphics/pokemon/flapple/gmax/back.4bpp.smol"); const u16 gMonPalette_FlappleGmax[] = INCBIN_U16("graphics/pokemon/flapple/gmax/normal.gbapal"); const u16 gMonShinyPalette_FlappleGmax[] = INCBIN_U16("graphics/pokemon/flapple/gmax/shiny.gbapal"); const u8 gMonIcon_FlappleGmax[] = INCBIN_U8("graphics/pokemon/flapple/gmax/icon.4bpp"); @@ -23232,9 +23232,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/anim_front.4bpp.smol"); const u16 gMonPalette_Appletun[] = INCBIN_U16("graphics/pokemon/appletun/normal.gbapal"); - const u32 gMonBackPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/back.4bpp.lz"); + const u32 gMonBackPic_Appletun[] = INCBIN_U32("graphics/pokemon/appletun/back.4bpp.smol"); const u16 gMonShinyPalette_Appletun[] = INCBIN_U16("graphics/pokemon/appletun/shiny.gbapal"); const u8 gMonIcon_Appletun[] = INCBIN_U8("graphics/pokemon/appletun/icon.4bpp"); #if P_FOOTPRINTS @@ -23249,8 +23249,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/front.4bpp.lz"); - const u32 gMonBackPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/front.4bpp.smol"); + const u32 gMonBackPic_AppletunGmax[] = INCBIN_U32("graphics/pokemon/appletun/gmax/back.4bpp.smol"); const u16 gMonPalette_AppletunGmax[] = INCBIN_U16("graphics/pokemon/appletun/gmax/normal.gbapal"); const u16 gMonShinyPalette_AppletunGmax[] = INCBIN_U16("graphics/pokemon/appletun/gmax/shiny.gbapal"); const u8 gMonIcon_AppletunGmax[] = INCBIN_U8("graphics/pokemon/appletun/gmax/icon.4bpp"); @@ -23264,9 +23264,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GIGANTAMAX_FORMS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/front.4bpp.lz"); + const u32 gMonFrontPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/front.4bpp.smol"); const u16 gMonPalette_Dipplin[] = INCBIN_U16("graphics/pokemon/dipplin/normal.gbapal"); - const u32 gMonBackPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/back.4bpp.lz"); + const u32 gMonBackPic_Dipplin[] = INCBIN_U32("graphics/pokemon/dipplin/back.4bpp.smol"); const u16 gMonShinyPalette_Dipplin[] = INCBIN_U16("graphics/pokemon/dipplin/shiny.gbapal"); const u8 gMonIcon_Dipplin[] = INCBIN_U8("graphics/pokemon/dipplin/icon.4bpp"); #if P_FOOTPRINTS @@ -23280,9 +23280,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/front.4bpp.lz"); + const u32 gMonFrontPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/front.4bpp.smol"); const u16 gMonPalette_Hydrapple[] = INCBIN_U16("graphics/pokemon/hydrapple/normal.gbapal"); - const u32 gMonBackPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/back.4bpp.lz"); + const u32 gMonBackPic_Hydrapple[] = INCBIN_U32("graphics/pokemon/hydrapple/back.4bpp.smol"); const u16 gMonShinyPalette_Hydrapple[] = INCBIN_U16("graphics/pokemon/hydrapple/shiny.gbapal"); const u8 gMonIcon_Hydrapple[] = INCBIN_U8("graphics/pokemon/hydrapple/icon.4bpp"); #if P_FOOTPRINTS @@ -23299,9 +23299,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_APPLIN #if P_FAMILY_SILICOBRA - const u32 gMonFrontPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/front.4bpp.lz"); + const u32 gMonFrontPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/front.4bpp.smol"); const u16 gMonPalette_Silicobra[] = INCBIN_U16("graphics/pokemon/silicobra/normal.gbapal"); - const u32 gMonBackPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/back.4bpp.lz"); + const u32 gMonBackPic_Silicobra[] = INCBIN_U32("graphics/pokemon/silicobra/back.4bpp.smol"); const u16 gMonShinyPalette_Silicobra[] = INCBIN_U16("graphics/pokemon/silicobra/shiny.gbapal"); const u8 gMonIcon_Silicobra[] = INCBIN_U8("graphics/pokemon/silicobra/icon.4bpp"); #if P_FOOTPRINTS @@ -23315,9 +23315,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/front.4bpp.lz"); + const u32 gMonFrontPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/front.4bpp.smol"); const u16 gMonPalette_Sandaconda[] = INCBIN_U16("graphics/pokemon/sandaconda/normal.gbapal"); - const u32 gMonBackPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/back.4bpp.lz"); + const u32 gMonBackPic_Sandaconda[] = INCBIN_U32("graphics/pokemon/sandaconda/back.4bpp.smol"); const u16 gMonShinyPalette_Sandaconda[] = INCBIN_U16("graphics/pokemon/sandaconda/shiny.gbapal"); const u8 gMonIcon_Sandaconda[] = INCBIN_U8("graphics/pokemon/sandaconda/icon.4bpp"); #if P_FOOTPRINTS @@ -23332,8 +23332,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/front.4bpp.lz"); - const u32 gMonBackPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/front.4bpp.smol"); + const u32 gMonBackPic_SandacondaGmax[] = INCBIN_U32("graphics/pokemon/sandaconda/gmax/back.4bpp.smol"); const u16 gMonPalette_SandacondaGmax[] = INCBIN_U16("graphics/pokemon/sandaconda/gmax/normal.gbapal"); const u16 gMonShinyPalette_SandacondaGmax[] = INCBIN_U16("graphics/pokemon/sandaconda/gmax/shiny.gbapal"); const u8 gMonIcon_SandacondaGmax[] = INCBIN_U8("graphics/pokemon/sandaconda/gmax/icon.4bpp"); @@ -23348,9 +23348,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SILICOBRA #if P_FAMILY_CRAMORANT - const u32 gMonFrontPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/front.4bpp.lz"); + const u32 gMonFrontPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/front.4bpp.smol"); const u16 gMonPalette_Cramorant[] = INCBIN_U16("graphics/pokemon/cramorant/normal.gbapal"); - const u32 gMonBackPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/back.4bpp.lz"); + const u32 gMonBackPic_Cramorant[] = INCBIN_U32("graphics/pokemon/cramorant/back.4bpp.smol"); const u16 gMonShinyPalette_Cramorant[] = INCBIN_U16("graphics/pokemon/cramorant/shiny.gbapal"); const u8 gMonIcon_Cramorant[] = INCBIN_U8("graphics/pokemon/cramorant/icon.4bpp"); #if P_FOOTPRINTS @@ -23364,9 +23364,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/front.4bpp.lz"); + const u32 gMonFrontPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/front.4bpp.smol"); const u16 gMonPalette_CramorantGulping[] = INCBIN_U16("graphics/pokemon/cramorant/gulping/normal.gbapal"); - const u32 gMonBackPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/back.4bpp.lz"); + const u32 gMonBackPic_CramorantGulping[] = INCBIN_U32("graphics/pokemon/cramorant/gulping/back.4bpp.smol"); const u16 gMonShinyPalette_CramorantGulping[] = INCBIN_U16("graphics/pokemon/cramorant/gulping/shiny.gbapal"); const u8 gMonIcon_CramorantGulping[] = INCBIN_U8("graphics/pokemon/cramorant/gulping/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23377,9 +23377,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/front.4bpp.lz"); + const u32 gMonFrontPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/front.4bpp.smol"); const u16 gMonPalette_CramorantGorging[] = INCBIN_U16("graphics/pokemon/cramorant/gorging/normal.gbapal"); - const u32 gMonBackPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/back.4bpp.lz"); + const u32 gMonBackPic_CramorantGorging[] = INCBIN_U32("graphics/pokemon/cramorant/gorging/back.4bpp.smol"); const u16 gMonShinyPalette_CramorantGorging[] = INCBIN_U16("graphics/pokemon/cramorant/gorging/shiny.gbapal"); const u8 gMonIcon_CramorantGorging[] = INCBIN_U8("graphics/pokemon/cramorant/gorging/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23392,9 +23392,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CRAMORANT #if P_FAMILY_ARROKUDA - const u32 gMonFrontPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/front.4bpp.lz"); + const u32 gMonFrontPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/front.4bpp.smol"); const u16 gMonPalette_Arrokuda[] = INCBIN_U16("graphics/pokemon/arrokuda/normal.gbapal"); - const u32 gMonBackPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/back.4bpp.lz"); + const u32 gMonBackPic_Arrokuda[] = INCBIN_U32("graphics/pokemon/arrokuda/back.4bpp.smol"); const u16 gMonShinyPalette_Arrokuda[] = INCBIN_U16("graphics/pokemon/arrokuda/shiny.gbapal"); const u8 gMonIcon_Arrokuda[] = INCBIN_U8("graphics/pokemon/arrokuda/icon.4bpp"); #if P_FOOTPRINTS @@ -23408,9 +23408,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/front.4bpp.lz"); + const u32 gMonFrontPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/front.4bpp.smol"); const u16 gMonPalette_Barraskewda[] = INCBIN_U16("graphics/pokemon/barraskewda/normal.gbapal"); - const u32 gMonBackPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/back.4bpp.lz"); + const u32 gMonBackPic_Barraskewda[] = INCBIN_U32("graphics/pokemon/barraskewda/back.4bpp.smol"); const u16 gMonShinyPalette_Barraskewda[] = INCBIN_U16("graphics/pokemon/barraskewda/shiny.gbapal"); const u8 gMonIcon_Barraskewda[] = INCBIN_U8("graphics/pokemon/barraskewda/icon.4bpp"); #if P_FOOTPRINTS @@ -23426,9 +23426,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARROKUDA #if P_FAMILY_TOXEL - const u32 gMonFrontPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/front.4bpp.lz"); + const u32 gMonFrontPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/front.4bpp.smol"); const u16 gMonPalette_Toxel[] = INCBIN_U16("graphics/pokemon/toxel/normal.gbapal"); - const u32 gMonBackPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/back.4bpp.lz"); + const u32 gMonBackPic_Toxel[] = INCBIN_U32("graphics/pokemon/toxel/back.4bpp.smol"); const u16 gMonShinyPalette_Toxel[] = INCBIN_U16("graphics/pokemon/toxel/shiny.gbapal"); const u8 gMonIcon_Toxel[] = INCBIN_U8("graphics/pokemon/toxel/icon.4bpp"); #if P_FOOTPRINTS @@ -23442,9 +23442,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/front.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/front.4bpp.smol"); const u16 gMonPalette_ToxtricityAmped[] = INCBIN_U16("graphics/pokemon/toxtricity/normal.gbapal"); - const u32 gMonBackPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/back.4bpp.lz"); + const u32 gMonBackPic_ToxtricityAmped[] = INCBIN_U32("graphics/pokemon/toxtricity/back.4bpp.smol"); const u16 gMonShinyPalette_ToxtricityAmped[] = INCBIN_U16("graphics/pokemon/toxtricity/shiny.gbapal"); const u8 gMonIcon_ToxtricityAmped[] = INCBIN_U8("graphics/pokemon/toxtricity/icon.4bpp"); #if P_FOOTPRINTS @@ -23458,9 +23458,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/front.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/front.4bpp.smol"); const u16 gMonPalette_ToxtricityLowKey[] = INCBIN_U16("graphics/pokemon/toxtricity/low_key/normal.gbapal"); - const u32 gMonBackPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/back.4bpp.lz"); + const u32 gMonBackPic_ToxtricityLowKey[] = INCBIN_U32("graphics/pokemon/toxtricity/low_key/back.4bpp.smol"); const u16 gMonShinyPalette_ToxtricityLowKey[] = INCBIN_U16("graphics/pokemon/toxtricity/low_key/shiny.gbapal"); const u8 gMonIcon_ToxtricityLowKey[] = INCBIN_U8("graphics/pokemon/toxtricity/low_key/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -23472,8 +23472,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/front.4bpp.lz"); - const u32 gMonBackPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/front.4bpp.smol"); + const u32 gMonBackPic_ToxtricityGmax[] = INCBIN_U32("graphics/pokemon/toxtricity/gmax/back.4bpp.smol"); const u16 gMonPalette_ToxtricityGmax[] = INCBIN_U16("graphics/pokemon/toxtricity/gmax/normal.gbapal"); const u16 gMonShinyPalette_ToxtricityGmax[] = INCBIN_U16("graphics/pokemon/toxtricity/gmax/shiny.gbapal"); const u8 gMonIcon_ToxtricityGmax[] = INCBIN_U8("graphics/pokemon/toxtricity/gmax/icon.4bpp"); @@ -23488,9 +23488,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOXEL #if P_FAMILY_SIZZLIPEDE - const u32 gMonFrontPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/anim_front.4bpp.smol"); const u16 gMonPalette_Sizzlipede[] = INCBIN_U16("graphics/pokemon/sizzlipede/normal.gbapal"); - const u32 gMonBackPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/back.4bpp.lz"); + const u32 gMonBackPic_Sizzlipede[] = INCBIN_U32("graphics/pokemon/sizzlipede/back.4bpp.smol"); const u16 gMonShinyPalette_Sizzlipede[] = INCBIN_U16("graphics/pokemon/sizzlipede/shiny.gbapal"); const u8 gMonIcon_Sizzlipede[] = INCBIN_U8("graphics/pokemon/sizzlipede/icon.4bpp"); #if P_FOOTPRINTS @@ -23504,9 +23504,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/anim_front.4bpp.smol"); const u16 gMonPalette_Centiskorch[] = INCBIN_U16("graphics/pokemon/centiskorch/normal.gbapal"); - const u32 gMonBackPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/back.4bpp.lz"); + const u32 gMonBackPic_Centiskorch[] = INCBIN_U32("graphics/pokemon/centiskorch/back.4bpp.smol"); const u16 gMonShinyPalette_Centiskorch[] = INCBIN_U16("graphics/pokemon/centiskorch/shiny.gbapal"); const u8 gMonIcon_Centiskorch[] = INCBIN_U8("graphics/pokemon/centiskorch/icon.4bpp"); #if P_FOOTPRINTS @@ -23521,8 +23521,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CentiskorchGmax[] = INCBIN_U32("graphics/pokemon/centiskorch/gmax/back.4bpp.smol"); const u16 gMonPalette_CentiskorchGmax[] = INCBIN_U16("graphics/pokemon/centiskorch/gmax/normal.gbapal"); const u16 gMonShinyPalette_CentiskorchGmax[] = INCBIN_U16("graphics/pokemon/centiskorch/gmax/shiny.gbapal"); const u8 gMonIcon_CentiskorchGmax[] = INCBIN_U8("graphics/pokemon/centiskorch/gmax/icon.4bpp"); @@ -23537,9 +23537,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SIZZLIPEDE #if P_FAMILY_CLOBBOPUS - const u32 gMonFrontPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/front.4bpp.lz"); + const u32 gMonFrontPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/front.4bpp.smol"); const u16 gMonPalette_Clobbopus[] = INCBIN_U16("graphics/pokemon/clobbopus/normal.gbapal"); - const u32 gMonBackPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/back.4bpp.lz"); + const u32 gMonBackPic_Clobbopus[] = INCBIN_U32("graphics/pokemon/clobbopus/back.4bpp.smol"); const u16 gMonShinyPalette_Clobbopus[] = INCBIN_U16("graphics/pokemon/clobbopus/shiny.gbapal"); const u8 gMonIcon_Clobbopus[] = INCBIN_U8("graphics/pokemon/clobbopus/icon.4bpp"); #if P_FOOTPRINTS @@ -23553,9 +23553,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/front.4bpp.lz"); + const u32 gMonFrontPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/front.4bpp.smol"); const u16 gMonPalette_Grapploct[] = INCBIN_U16("graphics/pokemon/grapploct/normal.gbapal"); - const u32 gMonBackPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/back.4bpp.lz"); + const u32 gMonBackPic_Grapploct[] = INCBIN_U32("graphics/pokemon/grapploct/back.4bpp.smol"); const u16 gMonShinyPalette_Grapploct[] = INCBIN_U16("graphics/pokemon/grapploct/shiny.gbapal"); const u8 gMonIcon_Grapploct[] = INCBIN_U8("graphics/pokemon/grapploct/icon.4bpp"); #if P_FOOTPRINTS @@ -23571,9 +23571,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CLOBBOPUS #if P_FAMILY_SINISTEA - const u32 gMonFrontPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/front.4bpp.lz"); + const u32 gMonFrontPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/front.4bpp.smol"); const u16 gMonPalette_Sinistea[] = INCBIN_U16("graphics/pokemon/sinistea/normal.gbapal"); - const u32 gMonBackPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/back.4bpp.lz"); + const u32 gMonBackPic_Sinistea[] = INCBIN_U32("graphics/pokemon/sinistea/back.4bpp.smol"); const u16 gMonShinyPalette_Sinistea[] = INCBIN_U16("graphics/pokemon/sinistea/shiny.gbapal"); const u8 gMonIcon_Sinistea[] = INCBIN_U8("graphics/pokemon/sinistea/icon.4bpp"); #if P_FOOTPRINTS @@ -23587,9 +23587,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/front.4bpp.lz"); + const u32 gMonFrontPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/front.4bpp.smol"); const u16 gMonPalette_Polteageist[] = INCBIN_U16("graphics/pokemon/polteageist/normal.gbapal"); - const u32 gMonBackPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/back.4bpp.lz"); + const u32 gMonBackPic_Polteageist[] = INCBIN_U32("graphics/pokemon/polteageist/back.4bpp.smol"); const u16 gMonShinyPalette_Polteageist[] = INCBIN_U16("graphics/pokemon/polteageist/shiny.gbapal"); const u8 gMonIcon_Polteageist[] = INCBIN_U8("graphics/pokemon/polteageist/icon.4bpp"); #if P_FOOTPRINTS @@ -23605,9 +23605,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SINISTEA #if P_FAMILY_HATENNA - const u32 gMonFrontPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/front.4bpp.lz"); + const u32 gMonFrontPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/front.4bpp.smol"); const u16 gMonPalette_Hatenna[] = INCBIN_U16("graphics/pokemon/hatenna/normal.gbapal"); - const u32 gMonBackPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/back.4bpp.lz"); + const u32 gMonBackPic_Hatenna[] = INCBIN_U32("graphics/pokemon/hatenna/back.4bpp.smol"); const u16 gMonShinyPalette_Hatenna[] = INCBIN_U16("graphics/pokemon/hatenna/shiny.gbapal"); const u8 gMonIcon_Hatenna[] = INCBIN_U8("graphics/pokemon/hatenna/icon.4bpp"); #if P_FOOTPRINTS @@ -23621,9 +23621,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/front.4bpp.lz"); + const u32 gMonFrontPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/front.4bpp.smol"); const u16 gMonPalette_Hattrem[] = INCBIN_U16("graphics/pokemon/hattrem/normal.gbapal"); - const u32 gMonBackPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/back.4bpp.lz"); + const u32 gMonBackPic_Hattrem[] = INCBIN_U32("graphics/pokemon/hattrem/back.4bpp.smol"); const u16 gMonShinyPalette_Hattrem[] = INCBIN_U16("graphics/pokemon/hattrem/shiny.gbapal"); const u8 gMonIcon_Hattrem[] = INCBIN_U8("graphics/pokemon/hattrem/icon.4bpp"); #if P_FOOTPRINTS @@ -23637,9 +23637,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/front.4bpp.lz"); + const u32 gMonFrontPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/front.4bpp.smol"); const u16 gMonPalette_Hatterene[] = INCBIN_U16("graphics/pokemon/hatterene/normal.gbapal"); - const u32 gMonBackPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/back.4bpp.lz"); + const u32 gMonBackPic_Hatterene[] = INCBIN_U32("graphics/pokemon/hatterene/back.4bpp.smol"); const u16 gMonShinyPalette_Hatterene[] = INCBIN_U16("graphics/pokemon/hatterene/shiny.gbapal"); const u8 gMonIcon_Hatterene[] = INCBIN_U8("graphics/pokemon/hatterene/icon.4bpp"); #if P_FOOTPRINTS @@ -23654,8 +23654,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/front.4bpp.lz"); - const u32 gMonBackPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/front.4bpp.smol"); + const u32 gMonBackPic_HattereneGmax[] = INCBIN_U32("graphics/pokemon/hatterene/gmax/back.4bpp.smol"); const u16 gMonPalette_HattereneGmax[] = INCBIN_U16("graphics/pokemon/hatterene/gmax/normal.gbapal"); const u16 gMonShinyPalette_HattereneGmax[] = INCBIN_U16("graphics/pokemon/hatterene/gmax/shiny.gbapal"); const u8 gMonIcon_HattereneGmax[] = INCBIN_U8("graphics/pokemon/hatterene/gmax/icon.4bpp"); @@ -23670,9 +23670,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_HATENNA #if P_FAMILY_IMPIDIMP - const u32 gMonFrontPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/front.4bpp.lz"); + const u32 gMonFrontPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/front.4bpp.smol"); const u16 gMonPalette_Impidimp[] = INCBIN_U16("graphics/pokemon/impidimp/normal.gbapal"); - const u32 gMonBackPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/back.4bpp.lz"); + const u32 gMonBackPic_Impidimp[] = INCBIN_U32("graphics/pokemon/impidimp/back.4bpp.smol"); const u16 gMonShinyPalette_Impidimp[] = INCBIN_U16("graphics/pokemon/impidimp/shiny.gbapal"); const u8 gMonIcon_Impidimp[] = INCBIN_U8("graphics/pokemon/impidimp/icon.4bpp"); #if P_FOOTPRINTS @@ -23686,9 +23686,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/front.4bpp.lz"); + const u32 gMonFrontPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/front.4bpp.smol"); const u16 gMonPalette_Morgrem[] = INCBIN_U16("graphics/pokemon/morgrem/normal.gbapal"); - const u32 gMonBackPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/back.4bpp.lz"); + const u32 gMonBackPic_Morgrem[] = INCBIN_U32("graphics/pokemon/morgrem/back.4bpp.smol"); const u16 gMonShinyPalette_Morgrem[] = INCBIN_U16("graphics/pokemon/morgrem/shiny.gbapal"); const u8 gMonIcon_Morgrem[] = INCBIN_U8("graphics/pokemon/morgrem/icon.4bpp"); #if P_FOOTPRINTS @@ -23702,9 +23702,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/front.4bpp.lz"); + const u32 gMonFrontPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/front.4bpp.smol"); const u16 gMonPalette_Grimmsnarl[] = INCBIN_U16("graphics/pokemon/grimmsnarl/normal.gbapal"); - const u32 gMonBackPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/back.4bpp.lz"); + const u32 gMonBackPic_Grimmsnarl[] = INCBIN_U32("graphics/pokemon/grimmsnarl/back.4bpp.smol"); const u16 gMonShinyPalette_Grimmsnarl[] = INCBIN_U16("graphics/pokemon/grimmsnarl/shiny.gbapal"); const u8 gMonIcon_Grimmsnarl[] = INCBIN_U8("graphics/pokemon/grimmsnarl/icon.4bpp"); #if P_FOOTPRINTS @@ -23719,8 +23719,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/front.4bpp.lz"); - const u32 gMonBackPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/front.4bpp.smol"); + const u32 gMonBackPic_GrimmsnarlGmax[] = INCBIN_U32("graphics/pokemon/grimmsnarl/gmax/back.4bpp.smol"); const u16 gMonPalette_GrimmsnarlGmax[] = INCBIN_U16("graphics/pokemon/grimmsnarl/gmax/normal.gbapal"); const u16 gMonShinyPalette_GrimmsnarlGmax[] = INCBIN_U16("graphics/pokemon/grimmsnarl/gmax/shiny.gbapal"); const u8 gMonIcon_GrimmsnarlGmax[] = INCBIN_U8("graphics/pokemon/grimmsnarl/gmax/icon.4bpp"); @@ -23735,9 +23735,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IMPIDIMP #if P_FAMILY_MILCERY - const u32 gMonFrontPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/front.4bpp.lz"); + const u32 gMonFrontPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/front.4bpp.smol"); const u16 gMonPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/normal.gbapal"); - const u32 gMonBackPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/back.4bpp.lz"); + const u32 gMonBackPic_Milcery[] = INCBIN_U32("graphics/pokemon/milcery/back.4bpp.smol"); const u16 gMonShinyPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/shiny.gbapal"); const u8 gMonIcon_Milcery[] = INCBIN_U8("graphics/pokemon/milcery/icon.4bpp"); #if P_FOOTPRINTS @@ -23750,8 +23750,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gShinyOverworldPalette_Milcery[] = INCBIN_U16("graphics/pokemon/milcery/overworld_shiny.gbapal"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/front.4bpp.lz"); - const u32 gMonBackPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/back.4bpp.lz"); + const u32 gMonFrontPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/front.4bpp.smol"); + const u32 gMonBackPic_Alcremie[] = INCBIN_U32("graphics/pokemon/alcremie/back.4bpp.smol"); const u16 gMonPalette_Alcremie[] = INCBIN_U16("graphics/pokemon/alcremie/normal.gbapal"); const u16 gMonShinyPalette_Alcremie[] = INCBIN_U16("graphics/pokemon/alcremie/shiny.gbapal"); @@ -23765,7 +23765,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ //const u8 gMonIcon_AlcremieStrawberryCaramelSwirl[] = INCBIN_U8("graphics/pokemon/alcremie/caramel_swirl/icon.4bpp"); //const u8 gMonIcon_AlcremieStrawberryRainbowSwirl[] = INCBIN_U8("graphics/pokemon/alcremie/rainbow_swirl/icon.4bpp"); - const u32 gMonFrontPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/front.4bpp.smol"); const u16 gMonPalette_AlcremieStrawberryVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_default.gbapal"); const u16 gMonPalette_AlcremieStrawberryRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieStrawberryMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_matcha_cream.gbapal"); @@ -23775,13 +23775,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieStrawberryRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieStrawberryCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieStrawberryRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieStrawberry[] = INCBIN_U32("graphics/pokemon/alcremie/strawberry/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieStrawberry[] = INCBIN_U16("graphics/pokemon/alcremie/strawberry/strawberry_shiny.gbapal"); #if P_FOOTPRINTS const u8 gMonFootprint_Alcremie[] = INCBIN_U8("graphics/pokemon/alcremie/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/front.4bpp.smol"); const u16 gMonPalette_AlcremieBerryVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_default.gbapal"); const u16 gMonPalette_AlcremieBerryRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieBerryMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_matcha_cream.gbapal"); @@ -23791,10 +23791,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieBerryRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieBerryCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieBerryRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieBerry[] = INCBIN_U32("graphics/pokemon/alcremie/berry/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieBerry[] = INCBIN_U16("graphics/pokemon/alcremie/berry/berry_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/front.4bpp.smol"); const u16 gMonPalette_AlcremieLoveVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_default.gbapal"); const u16 gMonPalette_AlcremieLoveRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieLoveMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_matcha_cream.gbapal"); @@ -23804,10 +23804,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieLoveRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieLoveCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieLoveRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieLove[] = INCBIN_U32("graphics/pokemon/alcremie/love/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieLove[] = INCBIN_U16("graphics/pokemon/alcremie/love/love_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/front.4bpp.smol"); const u16 gMonPalette_AlcremieStarVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_default.gbapal"); const u16 gMonPalette_AlcremieStarRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieStarMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_matcha_cream.gbapal"); @@ -23817,10 +23817,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieStarRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieStarCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieStarRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieStar[] = INCBIN_U32("graphics/pokemon/alcremie/star/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieStar[] = INCBIN_U16("graphics/pokemon/alcremie/star/star_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/front.4bpp.smol"); const u16 gMonPalette_AlcremieCloverVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_default.gbapal"); const u16 gMonPalette_AlcremieCloverRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieCloverMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_matcha_cream.gbapal"); @@ -23830,10 +23830,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieCloverRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieCloverCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieCloverRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieClover[] = INCBIN_U32("graphics/pokemon/alcremie/clover/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieClover[] = INCBIN_U16("graphics/pokemon/alcremie/clover/clover_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/front.4bpp.smol"); const u16 gMonPalette_AlcremieFlowerVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_default.gbapal"); const u16 gMonPalette_AlcremieFlowerRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieFlowerMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_matcha_cream.gbapal"); @@ -23843,10 +23843,10 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieFlowerRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieFlowerCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieFlowerRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieFlower[] = INCBIN_U32("graphics/pokemon/alcremie/flower/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieFlower[] = INCBIN_U16("graphics/pokemon/alcremie/flower/flower_shiny.gbapal"); - const u32 gMonFrontPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/front.4bpp.lz"); + const u32 gMonFrontPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/front.4bpp.smol"); const u16 gMonPalette_AlcremieRibbonVanillaCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_default.gbapal"); const u16 gMonPalette_AlcremieRibbonRubyCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_ruby_cream.gbapal"); const u16 gMonPalette_AlcremieRibbonMatchaCream[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_matcha_cream.gbapal"); @@ -23856,7 +23856,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_AlcremieRibbonRubySwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_ruby_swirl.gbapal"); const u16 gMonPalette_AlcremieRibbonCaramelSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_caramel_swirl.gbapal"); const u16 gMonPalette_AlcremieRibbonRainbowSwirl[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_rainbow_swirl.gbapal"); - const u32 gMonBackPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/back.4bpp.lz"); + const u32 gMonBackPic_AlcremieRibbon[] = INCBIN_U32("graphics/pokemon/alcremie/ribbon/back.4bpp.smol"); const u16 gMonShinyPalette_AlcremieRibbon[] = INCBIN_U16("graphics/pokemon/alcremie/ribbon/ribbon_shiny.gbapal"); #if OW_POKEMON_OBJECT_EVENTS @@ -23868,8 +23868,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/front.4bpp.lz"); - const u32 gMonBackPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/front.4bpp.smol"); + const u32 gMonBackPic_AlcremieGmax[] = INCBIN_U32("graphics/pokemon/alcremie/gmax/back.4bpp.smol"); const u16 gMonPalette_AlcremieGmax[] = INCBIN_U16("graphics/pokemon/alcremie/gmax/normal.gbapal"); const u16 gMonShinyPalette_AlcremieGmax[] = INCBIN_U16("graphics/pokemon/alcremie/gmax/shiny.gbapal"); const u8 gMonIcon_AlcremieGmax[] = INCBIN_U8("graphics/pokemon/alcremie/gmax/icon.4bpp"); @@ -23884,9 +23884,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS - const u32 gMonFrontPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/front.4bpp.lz"); + const u32 gMonFrontPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/front.4bpp.smol"); const u16 gMonPalette_Falinks[] = INCBIN_U16("graphics/pokemon/falinks/normal.gbapal"); - const u32 gMonBackPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/back.4bpp.lz"); + const u32 gMonBackPic_Falinks[] = INCBIN_U32("graphics/pokemon/falinks/back.4bpp.smol"); const u16 gMonShinyPalette_Falinks[] = INCBIN_U16("graphics/pokemon/falinks/shiny.gbapal"); const u8 gMonIcon_Falinks[] = INCBIN_U8("graphics/pokemon/falinks/icon.4bpp"); #if P_FOOTPRINTS @@ -23902,9 +23902,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FALINKS #if P_FAMILY_PINCURCHIN - const u32 gMonFrontPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/anim_front.4bpp.smol"); const u16 gMonPalette_Pincurchin[] = INCBIN_U16("graphics/pokemon/pincurchin/normal.gbapal"); - const u32 gMonBackPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/back.4bpp.lz"); + const u32 gMonBackPic_Pincurchin[] = INCBIN_U32("graphics/pokemon/pincurchin/back.4bpp.smol"); const u16 gMonShinyPalette_Pincurchin[] = INCBIN_U16("graphics/pokemon/pincurchin/shiny.gbapal"); const u8 gMonIcon_Pincurchin[] = INCBIN_U8("graphics/pokemon/pincurchin/icon.4bpp"); #if P_FOOTPRINTS @@ -23920,9 +23920,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PINCURCHIN #if P_FAMILY_SNOM - const u32 gMonFrontPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/front.4bpp.lz"); + const u32 gMonFrontPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/front.4bpp.smol"); const u16 gMonPalette_Snom[] = INCBIN_U16("graphics/pokemon/snom/normal.gbapal"); - const u32 gMonBackPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/back.4bpp.lz"); + const u32 gMonBackPic_Snom[] = INCBIN_U32("graphics/pokemon/snom/back.4bpp.smol"); const u16 gMonShinyPalette_Snom[] = INCBIN_U16("graphics/pokemon/snom/shiny.gbapal"); const u8 gMonIcon_Snom[] = INCBIN_U8("graphics/pokemon/snom/icon.4bpp"); #if P_FOOTPRINTS @@ -23936,9 +23936,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/front.4bpp.lz"); + const u32 gMonFrontPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/front.4bpp.smol"); const u16 gMonPalette_Frosmoth[] = INCBIN_U16("graphics/pokemon/frosmoth/normal.gbapal"); - const u32 gMonBackPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/back.4bpp.lz"); + const u32 gMonBackPic_Frosmoth[] = INCBIN_U32("graphics/pokemon/frosmoth/back.4bpp.smol"); const u16 gMonShinyPalette_Frosmoth[] = INCBIN_U16("graphics/pokemon/frosmoth/shiny.gbapal"); const u8 gMonIcon_Frosmoth[] = INCBIN_U8("graphics/pokemon/frosmoth/icon.4bpp"); #if P_FOOTPRINTS @@ -23954,9 +23954,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SNOM #if P_FAMILY_STONJOURNER - const u32 gMonFrontPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/front.4bpp.lz"); + const u32 gMonFrontPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/front.4bpp.smol"); const u16 gMonPalette_Stonjourner[] = INCBIN_U16("graphics/pokemon/stonjourner/normal.gbapal"); - const u32 gMonBackPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/back.4bpp.lz"); + const u32 gMonBackPic_Stonjourner[] = INCBIN_U32("graphics/pokemon/stonjourner/back.4bpp.smol"); const u16 gMonShinyPalette_Stonjourner[] = INCBIN_U16("graphics/pokemon/stonjourner/shiny.gbapal"); const u8 gMonIcon_Stonjourner[] = INCBIN_U8("graphics/pokemon/stonjourner/icon.4bpp"); #if P_FOOTPRINTS @@ -23972,9 +23972,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_STONJOURNER #if P_FAMILY_EISCUE - const u32 gMonFrontPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/front.4bpp.lz"); + const u32 gMonFrontPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/front.4bpp.smol"); const u16 gMonPalette_EiscueIce[] = INCBIN_U16("graphics/pokemon/eiscue/normal.gbapal"); - const u32 gMonBackPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/back.4bpp.lz"); + const u32 gMonBackPic_EiscueIce[] = INCBIN_U32("graphics/pokemon/eiscue/back.4bpp.smol"); const u16 gMonShinyPalette_EiscueIce[] = INCBIN_U16("graphics/pokemon/eiscue/shiny.gbapal"); const u8 gMonIcon_EiscueIce[] = INCBIN_U8("graphics/pokemon/eiscue/icon.4bpp"); #if P_FOOTPRINTS @@ -23988,9 +23988,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/front.4bpp.lz"); + const u32 gMonFrontPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/front.4bpp.smol"); const u16 gMonPalette_EiscueNoice[] = INCBIN_U16("graphics/pokemon/eiscue/noice_face/normal.gbapal"); - const u32 gMonBackPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/back.4bpp.lz"); + const u32 gMonBackPic_EiscueNoice[] = INCBIN_U32("graphics/pokemon/eiscue/noice_face/back.4bpp.smol"); const u16 gMonShinyPalette_EiscueNoice[] = INCBIN_U16("graphics/pokemon/eiscue/noice_face/shiny.gbapal"); const u8 gMonIcon_EiscueNoice[] = INCBIN_U8("graphics/pokemon/eiscue/noice_face/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24003,9 +24003,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_EISCUE #if P_FAMILY_INDEEDEE - const u32 gMonFrontPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/front.4bpp.lz"); + const u32 gMonFrontPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/front.4bpp.smol"); const u16 gMonPalette_IndeedeeM[] = INCBIN_U16("graphics/pokemon/indeedee/normal.gbapal"); - const u32 gMonBackPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/back.4bpp.lz"); + const u32 gMonBackPic_IndeedeeM[] = INCBIN_U32("graphics/pokemon/indeedee/back.4bpp.smol"); const u16 gMonShinyPalette_IndeedeeM[] = INCBIN_U16("graphics/pokemon/indeedee/shiny.gbapal"); const u8 gMonIcon_IndeedeeM[] = INCBIN_U8("graphics/pokemon/indeedee/icon.4bpp"); #if P_FOOTPRINTS @@ -24019,9 +24019,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/front.4bpp.lz"); + const u32 gMonFrontPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/front.4bpp.smol"); const u16 gMonPalette_IndeedeeF[] = INCBIN_U16("graphics/pokemon/indeedee/f/normal.gbapal"); - const u32 gMonBackPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/back.4bpp.lz"); + const u32 gMonBackPic_IndeedeeF[] = INCBIN_U32("graphics/pokemon/indeedee/f/back.4bpp.smol"); const u16 gMonShinyPalette_IndeedeeF[] = INCBIN_U16("graphics/pokemon/indeedee/f/shiny.gbapal"); const u8 gMonIcon_IndeedeeF[] = INCBIN_U8("graphics/pokemon/indeedee/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24034,9 +24034,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_INDEEDEE #if P_FAMILY_MORPEKO - const u32 gMonFrontPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/front.4bpp.lz"); + const u32 gMonFrontPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/front.4bpp.smol"); const u16 gMonPalette_MorpekoFullBelly[] = INCBIN_U16("graphics/pokemon/morpeko/normal.gbapal"); - const u32 gMonBackPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/back.4bpp.lz"); + const u32 gMonBackPic_MorpekoFullBelly[] = INCBIN_U32("graphics/pokemon/morpeko/back.4bpp.smol"); const u16 gMonShinyPalette_MorpekoFullBelly[] = INCBIN_U16("graphics/pokemon/morpeko/shiny.gbapal"); const u8 gMonIcon_MorpekoFullBelly[] = INCBIN_U8("graphics/pokemon/morpeko/icon.4bpp"); #if P_FOOTPRINTS @@ -24050,9 +24050,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/front.4bpp.lz"); + const u32 gMonFrontPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/front.4bpp.smol"); const u16 gMonPalette_MorpekoHangry[] = INCBIN_U16("graphics/pokemon/morpeko/hangry/normal.gbapal"); - const u32 gMonBackPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/back.4bpp.lz"); + const u32 gMonBackPic_MorpekoHangry[] = INCBIN_U32("graphics/pokemon/morpeko/hangry/back.4bpp.smol"); const u16 gMonShinyPalette_MorpekoHangry[] = INCBIN_U16("graphics/pokemon/morpeko/hangry/shiny.gbapal"); const u8 gMonIcon_MorpekoHangry[] = INCBIN_U8("graphics/pokemon/morpeko/hangry/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24065,9 +24065,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MORPEKO #if P_FAMILY_CUFANT - const u32 gMonFrontPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/front.4bpp.lz"); + const u32 gMonFrontPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/front.4bpp.smol"); const u16 gMonPalette_Cufant[] = INCBIN_U16("graphics/pokemon/cufant/normal.gbapal"); - const u32 gMonBackPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/back.4bpp.lz"); + const u32 gMonBackPic_Cufant[] = INCBIN_U32("graphics/pokemon/cufant/back.4bpp.smol"); const u16 gMonShinyPalette_Cufant[] = INCBIN_U16("graphics/pokemon/cufant/shiny.gbapal"); const u8 gMonIcon_Cufant[] = INCBIN_U8("graphics/pokemon/cufant/icon.4bpp"); #if P_FOOTPRINTS @@ -24081,9 +24081,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/front.4bpp.lz"); + const u32 gMonFrontPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/front.4bpp.smol"); const u16 gMonPalette_Copperajah[] = INCBIN_U16("graphics/pokemon/copperajah/normal.gbapal"); - const u32 gMonBackPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/back.4bpp.lz"); + const u32 gMonBackPic_Copperajah[] = INCBIN_U32("graphics/pokemon/copperajah/back.4bpp.smol"); const u16 gMonShinyPalette_Copperajah[] = INCBIN_U16("graphics/pokemon/copperajah/shiny.gbapal"); const u8 gMonIcon_Copperajah[] = INCBIN_U8("graphics/pokemon/copperajah/icon.4bpp"); #if P_FOOTPRINTS @@ -24098,8 +24098,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/front.4bpp.lz"); - const u32 gMonBackPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/front.4bpp.smol"); + const u32 gMonBackPic_CopperajahGmax[] = INCBIN_U32("graphics/pokemon/copperajah/gmax/back.4bpp.smol"); const u16 gMonPalette_CopperajahGmax[] = INCBIN_U16("graphics/pokemon/copperajah/gmax/normal.gbapal"); const u16 gMonShinyPalette_CopperajahGmax[] = INCBIN_U16("graphics/pokemon/copperajah/gmax/shiny.gbapal"); const u8 gMonIcon_CopperajahGmax[] = INCBIN_U8("graphics/pokemon/copperajah/gmax/icon.4bpp"); @@ -24114,9 +24114,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CUFANT #if P_FAMILY_DRACOZOLT - const u32 gMonFrontPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/front.4bpp.lz"); + const u32 gMonFrontPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/front.4bpp.smol"); const u16 gMonPalette_Dracozolt[] = INCBIN_U16("graphics/pokemon/dracozolt/normal.gbapal"); - const u32 gMonBackPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/back.4bpp.lz"); + const u32 gMonBackPic_Dracozolt[] = INCBIN_U32("graphics/pokemon/dracozolt/back.4bpp.smol"); const u16 gMonShinyPalette_Dracozolt[] = INCBIN_U16("graphics/pokemon/dracozolt/shiny.gbapal"); const u8 gMonIcon_Dracozolt[] = INCBIN_U8("graphics/pokemon/dracozolt/icon.4bpp"); #if P_FOOTPRINTS @@ -24132,9 +24132,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRACOZOLT #if P_FAMILY_ARCTOZOLT - const u32 gMonFrontPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/front.4bpp.lz"); + const u32 gMonFrontPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/front.4bpp.smol"); const u16 gMonPalette_Arctozolt[] = INCBIN_U16("graphics/pokemon/arctozolt/normal.gbapal"); - const u32 gMonBackPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/back.4bpp.lz"); + const u32 gMonBackPic_Arctozolt[] = INCBIN_U32("graphics/pokemon/arctozolt/back.4bpp.smol"); const u16 gMonShinyPalette_Arctozolt[] = INCBIN_U16("graphics/pokemon/arctozolt/shiny.gbapal"); const u8 gMonIcon_Arctozolt[] = INCBIN_U8("graphics/pokemon/arctozolt/icon.4bpp"); #if P_FOOTPRINTS @@ -24150,9 +24150,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCTOZOLT #if P_FAMILY_DRACOVISH - const u32 gMonFrontPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/front.4bpp.lz"); + const u32 gMonFrontPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/front.4bpp.smol"); const u16 gMonPalette_Dracovish[] = INCBIN_U16("graphics/pokemon/dracovish/normal.gbapal"); - const u32 gMonBackPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/back.4bpp.lz"); + const u32 gMonBackPic_Dracovish[] = INCBIN_U32("graphics/pokemon/dracovish/back.4bpp.smol"); const u16 gMonShinyPalette_Dracovish[] = INCBIN_U16("graphics/pokemon/dracovish/shiny.gbapal"); const u8 gMonIcon_Dracovish[] = INCBIN_U8("graphics/pokemon/dracovish/icon.4bpp"); #if P_FOOTPRINTS @@ -24168,9 +24168,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DRACOVISH #if P_FAMILY_ARCTOVISH - const u32 gMonFrontPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/front.4bpp.lz"); + const u32 gMonFrontPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/front.4bpp.smol"); const u16 gMonPalette_Arctovish[] = INCBIN_U16("graphics/pokemon/arctovish/normal.gbapal"); - const u32 gMonBackPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/back.4bpp.lz"); + const u32 gMonBackPic_Arctovish[] = INCBIN_U32("graphics/pokemon/arctovish/back.4bpp.smol"); const u16 gMonShinyPalette_Arctovish[] = INCBIN_U16("graphics/pokemon/arctovish/shiny.gbapal"); const u8 gMonIcon_Arctovish[] = INCBIN_U8("graphics/pokemon/arctovish/icon.4bpp"); #if P_FOOTPRINTS @@ -24186,9 +24186,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ARCTOVISH #if P_FAMILY_DURALUDON - const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/anim_front.4bpp.smol"); const u16 gMonPalette_Duraludon[] = INCBIN_U16("graphics/pokemon/duraludon/normal.gbapal"); - const u32 gMonBackPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/back.4bpp.lz"); + const u32 gMonBackPic_Duraludon[] = INCBIN_U32("graphics/pokemon/duraludon/back.4bpp.smol"); const u16 gMonShinyPalette_Duraludon[] = INCBIN_U16("graphics/pokemon/duraludon/shiny.gbapal"); const u8 gMonIcon_Duraludon[] = INCBIN_U8("graphics/pokemon/duraludon/icon.4bpp"); #if P_FOOTPRINTS @@ -24203,8 +24203,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/front.4bpp.lz"); - const u32 gMonBackPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/back.4bpp.lz"); + const u32 gMonFrontPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/front.4bpp.smol"); + const u32 gMonBackPic_DuraludonGmax[] = INCBIN_U32("graphics/pokemon/duraludon/gmax/back.4bpp.smol"); const u16 gMonPalette_DuraludonGmax[] = INCBIN_U16("graphics/pokemon/duraludon/gmax/normal.gbapal"); const u16 gMonShinyPalette_DuraludonGmax[] = INCBIN_U16("graphics/pokemon/duraludon/gmax/shiny.gbapal"); const u8 gMonIcon_DuraludonGmax[] = INCBIN_U8("graphics/pokemon/duraludon/gmax/icon.4bpp"); @@ -24218,9 +24218,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_GIGANTAMAX_FORMS #if P_GEN_9_CROSS_EVOS - const u32 gMonFrontPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/front.4bpp.lz"); + const u32 gMonFrontPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/front.4bpp.smol"); const u16 gMonPalette_Archaludon[] = INCBIN_U16("graphics/pokemon/archaludon/normal.gbapal"); - const u32 gMonBackPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/back.4bpp.lz"); + const u32 gMonBackPic_Archaludon[] = INCBIN_U32("graphics/pokemon/archaludon/back.4bpp.smol"); const u16 gMonShinyPalette_Archaludon[] = INCBIN_U16("graphics/pokemon/archaludon/shiny.gbapal"); const u8 gMonIcon_Archaludon[] = INCBIN_U8("graphics/pokemon/archaludon/icon.4bpp"); #if P_FOOTPRINTS @@ -24237,9 +24237,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DURALUDON #if P_FAMILY_DREEPY - const u32 gMonFrontPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/front.4bpp.lz"); + const u32 gMonFrontPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/front.4bpp.smol"); const u16 gMonPalette_Dreepy[] = INCBIN_U16("graphics/pokemon/dreepy/normal.gbapal"); - const u32 gMonBackPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/back.4bpp.lz"); + const u32 gMonBackPic_Dreepy[] = INCBIN_U32("graphics/pokemon/dreepy/back.4bpp.smol"); const u16 gMonShinyPalette_Dreepy[] = INCBIN_U16("graphics/pokemon/dreepy/shiny.gbapal"); const u8 gMonIcon_Dreepy[] = INCBIN_U8("graphics/pokemon/dreepy/icon.4bpp"); #if P_FOOTPRINTS @@ -24253,9 +24253,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/front.4bpp.lz"); + const u32 gMonFrontPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/front.4bpp.smol"); const u16 gMonPalette_Drakloak[] = INCBIN_U16("graphics/pokemon/drakloak/normal.gbapal"); - const u32 gMonBackPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/back.4bpp.lz"); + const u32 gMonBackPic_Drakloak[] = INCBIN_U32("graphics/pokemon/drakloak/back.4bpp.smol"); const u16 gMonShinyPalette_Drakloak[] = INCBIN_U16("graphics/pokemon/drakloak/shiny.gbapal"); const u8 gMonIcon_Drakloak[] = INCBIN_U8("graphics/pokemon/drakloak/icon.4bpp"); #if P_FOOTPRINTS @@ -24269,9 +24269,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/front.4bpp.lz"); + const u32 gMonFrontPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/front.4bpp.smol"); const u16 gMonPalette_Dragapult[] = INCBIN_U16("graphics/pokemon/dragapult/normal.gbapal"); - const u32 gMonBackPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/back.4bpp.lz"); + const u32 gMonBackPic_Dragapult[] = INCBIN_U32("graphics/pokemon/dragapult/back.4bpp.smol"); const u16 gMonShinyPalette_Dragapult[] = INCBIN_U16("graphics/pokemon/dragapult/shiny.gbapal"); const u8 gMonIcon_Dragapult[] = INCBIN_U8("graphics/pokemon/dragapult/icon.4bpp"); #if P_FOOTPRINTS @@ -24287,9 +24287,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DREEPY #if P_FAMILY_ZACIAN - const u32 gMonFrontPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/front.4bpp.lz"); + const u32 gMonFrontPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/front.4bpp.smol"); const u16 gMonPalette_ZacianHero[] = INCBIN_U16("graphics/pokemon/zacian/normal.gbapal"); - const u32 gMonBackPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/back.4bpp.lz"); + const u32 gMonBackPic_ZacianHero[] = INCBIN_U32("graphics/pokemon/zacian/back.4bpp.smol"); const u16 gMonShinyPalette_ZacianHero[] = INCBIN_U16("graphics/pokemon/zacian/shiny.gbapal"); const u8 gMonIcon_ZacianHero[] = INCBIN_U8("graphics/pokemon/zacian/icon.4bpp"); #if P_FOOTPRINTS @@ -24303,9 +24303,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/front.4bpp.lz"); + const u32 gMonFrontPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/front.4bpp.smol"); const u16 gMonPalette_ZacianCrowned[] = INCBIN_U16("graphics/pokemon/zacian/crowned_sword/normal.gbapal"); - const u32 gMonBackPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/back.4bpp.lz"); + const u32 gMonBackPic_ZacianCrowned[] = INCBIN_U32("graphics/pokemon/zacian/crowned_sword/back.4bpp.smol"); const u16 gMonShinyPalette_ZacianCrowned[] = INCBIN_U16("graphics/pokemon/zacian/crowned_sword/shiny.gbapal"); const u8 gMonIcon_ZacianCrowned[] = INCBIN_U8("graphics/pokemon/zacian/crowned_sword/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24318,9 +24318,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA - const u32 gMonFrontPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/front.4bpp.lz"); + const u32 gMonFrontPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/front.4bpp.smol"); const u16 gMonPalette_ZamazentaHero[] = INCBIN_U16("graphics/pokemon/zamazenta/normal.gbapal"); - const u32 gMonBackPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/back.4bpp.lz"); + const u32 gMonBackPic_ZamazentaHero[] = INCBIN_U32("graphics/pokemon/zamazenta/back.4bpp.smol"); const u16 gMonShinyPalette_ZamazentaHero[] = INCBIN_U16("graphics/pokemon/zamazenta/shiny.gbapal"); const u8 gMonIcon_ZamazentaHero[] = INCBIN_U8("graphics/pokemon/zamazenta/icon.4bpp"); #if P_FOOTPRINTS @@ -24334,9 +24334,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/front.4bpp.lz"); + const u32 gMonFrontPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/front.4bpp.smol"); const u16 gMonPalette_ZamazentaCrowned[] = INCBIN_U16("graphics/pokemon/zamazenta/crowned_shield/normal.gbapal"); - const u32 gMonBackPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/back.4bpp.lz"); + const u32 gMonBackPic_ZamazentaCrowned[] = INCBIN_U32("graphics/pokemon/zamazenta/crowned_shield/back.4bpp.smol"); const u16 gMonShinyPalette_ZamazentaCrowned[] = INCBIN_U16("graphics/pokemon/zamazenta/crowned_shield/shiny.gbapal"); const u8 gMonIcon_ZamazentaCrowned[] = INCBIN_U8("graphics/pokemon/zamazenta/crowned_shield/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24349,9 +24349,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZAMAZENTA #if P_FAMILY_ETERNATUS - const u32 gMonFrontPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/front.4bpp.lz"); + const u32 gMonFrontPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/front.4bpp.smol"); const u16 gMonPalette_Eternatus[] = INCBIN_U16("graphics/pokemon/eternatus/normal.gbapal"); - const u32 gMonBackPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/back.4bpp.lz"); + const u32 gMonBackPic_Eternatus[] = INCBIN_U32("graphics/pokemon/eternatus/back.4bpp.smol"); const u16 gMonShinyPalette_Eternatus[] = INCBIN_U16("graphics/pokemon/eternatus/shiny.gbapal"); const u8 gMonIcon_Eternatus[] = INCBIN_U8("graphics/pokemon/eternatus/icon.4bpp"); #if P_FOOTPRINTS @@ -24365,9 +24365,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/front.4bpp.lz"); + const u32 gMonFrontPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/front.4bpp.smol"); const u16 gMonPalette_EternatusEternamax[] = INCBIN_U16("graphics/pokemon/eternatus/eternamax/normal.gbapal"); - const u32 gMonBackPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/back.4bpp.lz"); + const u32 gMonBackPic_EternatusEternamax[] = INCBIN_U32("graphics/pokemon/eternatus/eternamax/back.4bpp.smol"); const u16 gMonShinyPalette_EternatusEternamax[] = INCBIN_U16("graphics/pokemon/eternatus/eternamax/shiny.gbapal"); const u8 gMonIcon_EternatusEternamax[] = INCBIN_U8("graphics/pokemon/eternatus/eternamax/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24380,9 +24380,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ETERNATUS #if P_FAMILY_KUBFU - const u32 gMonFrontPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/front.4bpp.lz"); + const u32 gMonFrontPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/front.4bpp.smol"); const u16 gMonPalette_Kubfu[] = INCBIN_U16("graphics/pokemon/kubfu/normal.gbapal"); - const u32 gMonBackPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/back.4bpp.lz"); + const u32 gMonBackPic_Kubfu[] = INCBIN_U32("graphics/pokemon/kubfu/back.4bpp.smol"); const u16 gMonShinyPalette_Kubfu[] = INCBIN_U16("graphics/pokemon/kubfu/shiny.gbapal"); const u8 gMonIcon_Kubfu[] = INCBIN_U8("graphics/pokemon/kubfu/icon.4bpp"); #if P_FOOTPRINTS @@ -24396,9 +24396,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/front.4bpp.lz"); + const u32 gMonFrontPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/front.4bpp.smol"); const u16 gMonPalette_UrshifuSingleStrike[] = INCBIN_U16("graphics/pokemon/urshifu/normal.gbapal"); - const u32 gMonBackPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/back.4bpp.lz"); + const u32 gMonBackPic_UrshifuSingleStrike[] = INCBIN_U32("graphics/pokemon/urshifu/back.4bpp.smol"); const u16 gMonShinyPalette_UrshifuSingleStrike[] = INCBIN_U16("graphics/pokemon/urshifu/shiny.gbapal"); const u8 gMonIcon_Urshifu[] = INCBIN_U8("graphics/pokemon/urshifu/icon.4bpp"); #if P_FOOTPRINTS @@ -24412,20 +24412,20 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/front.4bpp.lz"); + const u32 gMonFrontPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/front.4bpp.smol"); const u16 gMonPalette_UrshifuRapidStrike[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike/normal.gbapal"); - const u32 gMonBackPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/back.4bpp.lz"); + const u32 gMonBackPic_UrshifuRapidStrike[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike/back.4bpp.smol"); const u16 gMonShinyPalette_UrshifuRapidStrike[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike/shiny.gbapal"); #if P_GIGANTAMAX_FORMS - const u32 gMonFrontPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/front.4bpp.lz"); - const u32 gMonBackPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/back.4bpp.lz"); + const u32 gMonFrontPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/front.4bpp.smol"); + const u32 gMonBackPic_UrshifuSingleStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/single_strike_gmax/back.4bpp.smol"); const u16 gMonPalette_UrshifuSingleStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/single_strike_gmax/normal.gbapal"); const u16 gMonShinyPalette_UrshifuSingleStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/single_strike_gmax/shiny.gbapal"); const u8 gMonIcon_UrshifuSingleStrikeGmax[] = INCBIN_U8("graphics/pokemon/urshifu/single_strike_gmax/icon.4bpp"); - const u32 gMonFrontPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/front.4bpp.lz"); - const u32 gMonBackPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/back.4bpp.lz"); + const u32 gMonFrontPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/front.4bpp.smol"); + const u32 gMonBackPic_UrshifuRapidStrikeGmax[] = INCBIN_U32("graphics/pokemon/urshifu/rapid_strike_gmax/back.4bpp.smol"); const u16 gMonPalette_UrshifuRapidStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike_gmax/normal.gbapal"); const u16 gMonShinyPalette_UrshifuRapidStrikeGmax[] = INCBIN_U16("graphics/pokemon/urshifu/rapid_strike_gmax/shiny.gbapal"); const u8 gMonIcon_UrshifuRapidStrikeGmax[] = INCBIN_U8("graphics/pokemon/urshifu/rapid_strike_gmax/icon.4bpp"); @@ -24438,9 +24438,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KUBFU #if P_FAMILY_ZARUDE - const u32 gMonFrontPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/front.4bpp.lz"); + const u32 gMonFrontPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/front.4bpp.smol"); const u16 gMonPalette_Zarude[] = INCBIN_U16("graphics/pokemon/zarude/normal.gbapal"); - const u32 gMonBackPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/back.4bpp.lz"); + const u32 gMonBackPic_Zarude[] = INCBIN_U32("graphics/pokemon/zarude/back.4bpp.smol"); const u16 gMonShinyPalette_Zarude[] = INCBIN_U16("graphics/pokemon/zarude/shiny.gbapal"); const u8 gMonIcon_Zarude[] = INCBIN_U8("graphics/pokemon/zarude/icon.4bpp"); #if P_FOOTPRINTS @@ -24454,9 +24454,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/front.4bpp.lz"); + const u32 gMonFrontPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/front.4bpp.smol"); const u16 gMonPalette_ZarudeDada[] = INCBIN_U16("graphics/pokemon/zarude/dada/normal.gbapal"); - const u32 gMonBackPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/back.4bpp.lz"); + const u32 gMonBackPic_ZarudeDada[] = INCBIN_U32("graphics/pokemon/zarude/dada/back.4bpp.smol"); const u16 gMonShinyPalette_ZarudeDada[] = INCBIN_U16("graphics/pokemon/zarude/dada/shiny.gbapal"); const u8 gMonIcon_ZarudeDada[] = INCBIN_U8("graphics/pokemon/zarude/dada/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24469,9 +24469,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ZARUDE #if P_FAMILY_REGIELEKI - const u32 gMonFrontPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/front.4bpp.lz"); + const u32 gMonFrontPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/front.4bpp.smol"); const u16 gMonPalette_Regieleki[] = INCBIN_U16("graphics/pokemon/regieleki/normal.gbapal"); - const u32 gMonBackPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/back.4bpp.lz"); + const u32 gMonBackPic_Regieleki[] = INCBIN_U32("graphics/pokemon/regieleki/back.4bpp.smol"); const u16 gMonShinyPalette_Regieleki[] = INCBIN_U16("graphics/pokemon/regieleki/shiny.gbapal"); const u8 gMonIcon_Regieleki[] = INCBIN_U8("graphics/pokemon/regieleki/icon.4bpp"); #if P_FOOTPRINTS @@ -24487,9 +24487,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIELEKI #if P_FAMILY_REGIDRAGO - const u32 gMonFrontPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/front.4bpp.lz"); + const u32 gMonFrontPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/front.4bpp.smol"); const u16 gMonPalette_Regidrago[] = INCBIN_U16("graphics/pokemon/regidrago/normal.gbapal"); - const u32 gMonBackPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/back.4bpp.lz"); + const u32 gMonBackPic_Regidrago[] = INCBIN_U32("graphics/pokemon/regidrago/back.4bpp.smol"); const u16 gMonShinyPalette_Regidrago[] = INCBIN_U16("graphics/pokemon/regidrago/shiny.gbapal"); const u8 gMonIcon_Regidrago[] = INCBIN_U8("graphics/pokemon/regidrago/icon.4bpp"); #if P_FOOTPRINTS @@ -24505,9 +24505,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_REGIDRAGO #if P_FAMILY_GLASTRIER - const u32 gMonFrontPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/front.4bpp.lz"); + const u32 gMonFrontPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/front.4bpp.smol"); const u16 gMonPalette_Glastrier[] = INCBIN_U16("graphics/pokemon/glastrier/normal.gbapal"); - const u32 gMonBackPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/back.4bpp.lz"); + const u32 gMonBackPic_Glastrier[] = INCBIN_U32("graphics/pokemon/glastrier/back.4bpp.smol"); const u16 gMonShinyPalette_Glastrier[] = INCBIN_U16("graphics/pokemon/glastrier/shiny.gbapal"); const u8 gMonIcon_Glastrier[] = INCBIN_U8("graphics/pokemon/glastrier/icon.4bpp"); #if P_FOOTPRINTS @@ -24523,9 +24523,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLASTRIER #if P_FAMILY_SPECTRIER - const u32 gMonFrontPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/front.4bpp.lz"); + const u32 gMonFrontPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/front.4bpp.smol"); const u16 gMonPalette_Spectrier[] = INCBIN_U16("graphics/pokemon/spectrier/normal.gbapal"); - const u32 gMonBackPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/back.4bpp.lz"); + const u32 gMonBackPic_Spectrier[] = INCBIN_U32("graphics/pokemon/spectrier/back.4bpp.smol"); const u16 gMonShinyPalette_Spectrier[] = INCBIN_U16("graphics/pokemon/spectrier/shiny.gbapal"); const u8 gMonIcon_Spectrier[] = INCBIN_U8("graphics/pokemon/spectrier/icon.4bpp"); #if P_FOOTPRINTS @@ -24541,9 +24541,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPECTRIER #if P_FAMILY_CALYREX - const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.lz"); + const u32 gMonFrontPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/front.4bpp.smol"); const u16 gMonPalette_Calyrex[] = INCBIN_U16("graphics/pokemon/calyrex/normal.gbapal"); - const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.lz"); + const u32 gMonBackPic_Calyrex[] = INCBIN_U32("graphics/pokemon/calyrex/back.4bpp.smol"); const u16 gMonShinyPalette_Calyrex[] = INCBIN_U16("graphics/pokemon/calyrex/shiny.gbapal"); const u8 gMonIcon_Calyrex[] = INCBIN_U8("graphics/pokemon/calyrex/icon.4bpp"); #if P_FOOTPRINTS @@ -24558,9 +24558,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #if P_FUSION_FORMS - const u32 gMonFrontPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/front.4bpp.lz"); + const u32 gMonFrontPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/front.4bpp.smol"); const u16 gMonPalette_CalyrexIce[] = INCBIN_U16("graphics/pokemon/calyrex/ice/normal.gbapal"); - const u32 gMonBackPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/back.4bpp.lz"); + const u32 gMonBackPic_CalyrexIce[] = INCBIN_U32("graphics/pokemon/calyrex/ice/back.4bpp.smol"); const u16 gMonShinyPalette_CalyrexIce[] = INCBIN_U16("graphics/pokemon/calyrex/ice/shiny.gbapal"); const u8 gMonIcon_CalyrexIce[] = INCBIN_U8("graphics/pokemon/calyrex/ice/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24573,9 +24573,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FUSION_FORMS #if P_FUSION_FORMS - const u32 gMonFrontPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/front.4bpp.lz"); + const u32 gMonFrontPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/front.4bpp.smol"); const u16 gMonPalette_CalyrexShadow[] = INCBIN_U16("graphics/pokemon/calyrex/shadow/normal.gbapal"); - const u32 gMonBackPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/back.4bpp.lz"); + const u32 gMonBackPic_CalyrexShadow[] = INCBIN_U32("graphics/pokemon/calyrex/shadow/back.4bpp.smol"); const u16 gMonShinyPalette_CalyrexShadow[] = INCBIN_U16("graphics/pokemon/calyrex/shadow/shiny.gbapal"); const u8 gMonIcon_CalyrexShadow[] = INCBIN_U8("graphics/pokemon/calyrex/shadow/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24589,9 +24589,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CALYREX #if P_FAMILY_SPRIGATITO - const u32 gMonFrontPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/front.4bpp.lz"); + const u32 gMonFrontPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/front.4bpp.smol"); const u16 gMonPalette_Sprigatito[] = INCBIN_U16("graphics/pokemon/sprigatito/normal.gbapal"); - const u32 gMonBackPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/back.4bpp.lz"); + const u32 gMonBackPic_Sprigatito[] = INCBIN_U32("graphics/pokemon/sprigatito/back.4bpp.smol"); const u16 gMonShinyPalette_Sprigatito[] = INCBIN_U16("graphics/pokemon/sprigatito/shiny.gbapal"); const u8 gMonIcon_Sprigatito[] = INCBIN_U8("graphics/pokemon/sprigatito/icon.4bpp"); #if P_FOOTPRINTS @@ -24605,9 +24605,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/front.4bpp.lz"); + const u32 gMonFrontPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/front.4bpp.smol"); const u16 gMonPalette_Floragato[] = INCBIN_U16("graphics/pokemon/floragato/normal.gbapal"); - const u32 gMonBackPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/back.4bpp.lz"); + const u32 gMonBackPic_Floragato[] = INCBIN_U32("graphics/pokemon/floragato/back.4bpp.smol"); const u16 gMonShinyPalette_Floragato[] = INCBIN_U16("graphics/pokemon/floragato/shiny.gbapal"); const u8 gMonIcon_Floragato[] = INCBIN_U8("graphics/pokemon/floragato/icon.4bpp"); #if P_FOOTPRINTS @@ -24621,9 +24621,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/front.4bpp.lz"); + const u32 gMonFrontPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/front.4bpp.smol"); const u16 gMonPalette_Meowscarada[] = INCBIN_U16("graphics/pokemon/meowscarada/normal.gbapal"); - const u32 gMonBackPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/back.4bpp.lz"); + const u32 gMonBackPic_Meowscarada[] = INCBIN_U32("graphics/pokemon/meowscarada/back.4bpp.smol"); const u16 gMonShinyPalette_Meowscarada[] = INCBIN_U16("graphics/pokemon/meowscarada/shiny.gbapal"); const u8 gMonIcon_Meowscarada[] = INCBIN_U8("graphics/pokemon/meowscarada/icon.4bpp"); #if P_FOOTPRINTS @@ -24639,9 +24639,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPRIGATITO #if P_FAMILY_FUECOCO - const u32 gMonFrontPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/front.4bpp.lz"); + const u32 gMonFrontPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/front.4bpp.smol"); const u16 gMonPalette_Fuecoco[] = INCBIN_U16("graphics/pokemon/fuecoco/normal.gbapal"); - const u32 gMonBackPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/back.4bpp.lz"); + const u32 gMonBackPic_Fuecoco[] = INCBIN_U32("graphics/pokemon/fuecoco/back.4bpp.smol"); const u16 gMonShinyPalette_Fuecoco[] = INCBIN_U16("graphics/pokemon/fuecoco/shiny.gbapal"); const u8 gMonIcon_Fuecoco[] = INCBIN_U8("graphics/pokemon/fuecoco/icon.4bpp"); #if P_FOOTPRINTS @@ -24655,9 +24655,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/front.4bpp.lz"); + const u32 gMonFrontPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/front.4bpp.smol"); const u16 gMonPalette_Crocalor[] = INCBIN_U16("graphics/pokemon/crocalor/normal.gbapal"); - const u32 gMonBackPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/back.4bpp.lz"); + const u32 gMonBackPic_Crocalor[] = INCBIN_U32("graphics/pokemon/crocalor/back.4bpp.smol"); const u16 gMonShinyPalette_Crocalor[] = INCBIN_U16("graphics/pokemon/crocalor/shiny.gbapal"); const u8 gMonIcon_Crocalor[] = INCBIN_U8("graphics/pokemon/crocalor/icon.4bpp"); #if P_FOOTPRINTS @@ -24671,9 +24671,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/front.4bpp.lz"); + const u32 gMonFrontPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/front.4bpp.smol"); const u16 gMonPalette_Skeledirge[] = INCBIN_U16("graphics/pokemon/skeledirge/normal.gbapal"); - const u32 gMonBackPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/back.4bpp.lz"); + const u32 gMonBackPic_Skeledirge[] = INCBIN_U32("graphics/pokemon/skeledirge/back.4bpp.smol"); const u16 gMonShinyPalette_Skeledirge[] = INCBIN_U16("graphics/pokemon/skeledirge/shiny.gbapal"); const u8 gMonIcon_Skeledirge[] = INCBIN_U8("graphics/pokemon/skeledirge/icon.4bpp"); #if P_FOOTPRINTS @@ -24689,9 +24689,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FUECOCO #if P_FAMILY_QUAXLY - const u32 gMonFrontPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/front.4bpp.lz"); + const u32 gMonFrontPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/front.4bpp.smol"); const u16 gMonPalette_Quaxly[] = INCBIN_U16("graphics/pokemon/quaxly/normal.gbapal"); - const u32 gMonBackPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/back.4bpp.lz"); + const u32 gMonBackPic_Quaxly[] = INCBIN_U32("graphics/pokemon/quaxly/back.4bpp.smol"); const u16 gMonShinyPalette_Quaxly[] = INCBIN_U16("graphics/pokemon/quaxly/shiny.gbapal"); const u8 gMonIcon_Quaxly[] = INCBIN_U8("graphics/pokemon/quaxly/icon.4bpp"); #if P_FOOTPRINTS @@ -24705,9 +24705,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/front.4bpp.lz"); + const u32 gMonFrontPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/front.4bpp.smol"); const u16 gMonPalette_Quaxwell[] = INCBIN_U16("graphics/pokemon/quaxwell/normal.gbapal"); - const u32 gMonBackPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/back.4bpp.lz"); + const u32 gMonBackPic_Quaxwell[] = INCBIN_U32("graphics/pokemon/quaxwell/back.4bpp.smol"); const u16 gMonShinyPalette_Quaxwell[] = INCBIN_U16("graphics/pokemon/quaxwell/shiny.gbapal"); const u8 gMonIcon_Quaxwell[] = INCBIN_U8("graphics/pokemon/quaxwell/icon.4bpp"); #if P_FOOTPRINTS @@ -24721,9 +24721,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/front.4bpp.lz"); + const u32 gMonFrontPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/front.4bpp.smol"); const u16 gMonPalette_Quaquaval[] = INCBIN_U16("graphics/pokemon/quaquaval/normal.gbapal"); - const u32 gMonBackPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/back.4bpp.lz"); + const u32 gMonBackPic_Quaquaval[] = INCBIN_U32("graphics/pokemon/quaquaval/back.4bpp.smol"); const u16 gMonShinyPalette_Quaquaval[] = INCBIN_U16("graphics/pokemon/quaquaval/shiny.gbapal"); const u8 gMonIcon_Quaquaval[] = INCBIN_U8("graphics/pokemon/quaquaval/icon.4bpp"); #if P_FOOTPRINTS @@ -24739,9 +24739,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_QUAXLY #if P_FAMILY_LECHONK - const u32 gMonFrontPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/front.4bpp.lz"); + const u32 gMonFrontPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/front.4bpp.smol"); const u16 gMonPalette_Lechonk[] = INCBIN_U16("graphics/pokemon/lechonk/normal.gbapal"); - const u32 gMonBackPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/back.4bpp.lz"); + const u32 gMonBackPic_Lechonk[] = INCBIN_U32("graphics/pokemon/lechonk/back.4bpp.smol"); const u16 gMonShinyPalette_Lechonk[] = INCBIN_U16("graphics/pokemon/lechonk/shiny.gbapal"); const u8 gMonIcon_Lechonk[] = INCBIN_U8("graphics/pokemon/lechonk/icon.4bpp"); #if P_FOOTPRINTS @@ -24755,9 +24755,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/front.4bpp.lz"); + const u32 gMonFrontPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/front.4bpp.smol"); const u16 gMonPalette_OinkologneM[] = INCBIN_U16("graphics/pokemon/oinkologne/normal.gbapal"); - const u32 gMonBackPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/back.4bpp.lz"); + const u32 gMonBackPic_OinkologneM[] = INCBIN_U32("graphics/pokemon/oinkologne/back.4bpp.smol"); const u16 gMonShinyPalette_OinkologneM[] = INCBIN_U16("graphics/pokemon/oinkologne/shiny.gbapal"); const u8 gMonIcon_OinkologneM[] = INCBIN_U8("graphics/pokemon/oinkologne/icon.4bpp"); #if P_FOOTPRINTS @@ -24771,9 +24771,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/front.4bpp.lz"); + const u32 gMonFrontPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/front.4bpp.smol"); const u16 gMonPalette_OinkologneF[] = INCBIN_U16("graphics/pokemon/oinkologne/f/normal.gbapal"); - const u32 gMonBackPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/back.4bpp.lz"); + const u32 gMonBackPic_OinkologneF[] = INCBIN_U32("graphics/pokemon/oinkologne/f/back.4bpp.smol"); const u16 gMonShinyPalette_OinkologneF[] = INCBIN_U16("graphics/pokemon/oinkologne/f/shiny.gbapal"); const u8 gMonIcon_OinkologneF[] = INCBIN_U8("graphics/pokemon/oinkologne/f/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -24786,9 +24786,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_LECHONK #if P_FAMILY_TAROUNTULA - const u32 gMonFrontPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/front.4bpp.lz"); + const u32 gMonFrontPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/front.4bpp.smol"); const u16 gMonPalette_Tarountula[] = INCBIN_U16("graphics/pokemon/tarountula/normal.gbapal"); - const u32 gMonBackPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/back.4bpp.lz"); + const u32 gMonBackPic_Tarountula[] = INCBIN_U32("graphics/pokemon/tarountula/back.4bpp.smol"); const u16 gMonShinyPalette_Tarountula[] = INCBIN_U16("graphics/pokemon/tarountula/shiny.gbapal"); const u8 gMonIcon_Tarountula[] = INCBIN_U8("graphics/pokemon/tarountula/icon.4bpp"); #if P_FOOTPRINTS @@ -24802,9 +24802,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/front.4bpp.lz"); + const u32 gMonFrontPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/front.4bpp.smol"); const u16 gMonPalette_Spidops[] = INCBIN_U16("graphics/pokemon/spidops/normal.gbapal"); - const u32 gMonBackPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/back.4bpp.lz"); + const u32 gMonBackPic_Spidops[] = INCBIN_U32("graphics/pokemon/spidops/back.4bpp.smol"); const u16 gMonShinyPalette_Spidops[] = INCBIN_U16("graphics/pokemon/spidops/shiny.gbapal"); const u8 gMonIcon_Spidops[] = INCBIN_U8("graphics/pokemon/spidops/icon.4bpp"); #if P_FOOTPRINTS @@ -24820,9 +24820,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TAROUNTULA #if P_FAMILY_NYMBLE - const u32 gMonFrontPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/front.4bpp.lz"); + const u32 gMonFrontPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/front.4bpp.smol"); const u16 gMonPalette_Nymble[] = INCBIN_U16("graphics/pokemon/nymble/normal.gbapal"); - const u32 gMonBackPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/back.4bpp.lz"); + const u32 gMonBackPic_Nymble[] = INCBIN_U32("graphics/pokemon/nymble/back.4bpp.smol"); const u16 gMonShinyPalette_Nymble[] = INCBIN_U16("graphics/pokemon/nymble/shiny.gbapal"); const u8 gMonIcon_Nymble[] = INCBIN_U8("graphics/pokemon/nymble/icon.4bpp"); #if P_FOOTPRINTS @@ -24836,9 +24836,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/front.4bpp.lz"); + const u32 gMonFrontPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/front.4bpp.smol"); const u16 gMonPalette_Lokix[] = INCBIN_U16("graphics/pokemon/lokix/normal.gbapal"); - const u32 gMonBackPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/back.4bpp.lz"); + const u32 gMonBackPic_Lokix[] = INCBIN_U32("graphics/pokemon/lokix/back.4bpp.smol"); const u16 gMonShinyPalette_Lokix[] = INCBIN_U16("graphics/pokemon/lokix/shiny.gbapal"); const u8 gMonIcon_Lokix[] = INCBIN_U8("graphics/pokemon/lokix/icon.4bpp"); #if P_FOOTPRINTS @@ -24854,9 +24854,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NYMBLE #if P_FAMILY_PAWMI - const u32 gMonFrontPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/front.4bpp.smol"); const u16 gMonPalette_Pawmi[] = INCBIN_U16("graphics/pokemon/pawmi/normal.gbapal"); - const u32 gMonBackPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/back.4bpp.lz"); + const u32 gMonBackPic_Pawmi[] = INCBIN_U32("graphics/pokemon/pawmi/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmi[] = INCBIN_U16("graphics/pokemon/pawmi/shiny.gbapal"); const u8 gMonIcon_Pawmi[] = INCBIN_U8("graphics/pokemon/pawmi/icon.4bpp"); #if P_FOOTPRINTS @@ -24870,9 +24870,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/front.4bpp.smol"); const u16 gMonPalette_Pawmo[] = INCBIN_U16("graphics/pokemon/pawmo/normal.gbapal"); - const u32 gMonBackPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/back.4bpp.lz"); + const u32 gMonBackPic_Pawmo[] = INCBIN_U32("graphics/pokemon/pawmo/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmo[] = INCBIN_U16("graphics/pokemon/pawmo/shiny.gbapal"); const u8 gMonIcon_Pawmo[] = INCBIN_U8("graphics/pokemon/pawmo/icon.4bpp"); #if P_FOOTPRINTS @@ -24886,9 +24886,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/front.4bpp.lz"); + const u32 gMonFrontPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/front.4bpp.smol"); const u16 gMonPalette_Pawmot[] = INCBIN_U16("graphics/pokemon/pawmot/normal.gbapal"); - const u32 gMonBackPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/back.4bpp.lz"); + const u32 gMonBackPic_Pawmot[] = INCBIN_U32("graphics/pokemon/pawmot/back.4bpp.smol"); const u16 gMonShinyPalette_Pawmot[] = INCBIN_U16("graphics/pokemon/pawmot/shiny.gbapal"); const u8 gMonIcon_Pawmot[] = INCBIN_U8("graphics/pokemon/pawmot/icon.4bpp"); #if P_FOOTPRINTS @@ -24904,9 +24904,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_PAWMI #if P_FAMILY_TANDEMAUS - const u32 gMonFrontPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/front.4bpp.lz"); + const u32 gMonFrontPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/front.4bpp.smol"); const u16 gMonPalette_Tandemaus[] = INCBIN_U16("graphics/pokemon/tandemaus/normal.gbapal"); - const u32 gMonBackPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/back.4bpp.lz"); + const u32 gMonBackPic_Tandemaus[] = INCBIN_U32("graphics/pokemon/tandemaus/back.4bpp.smol"); const u16 gMonShinyPalette_Tandemaus[] = INCBIN_U16("graphics/pokemon/tandemaus/shiny.gbapal"); const u8 gMonIcon_Tandemaus[] = INCBIN_U8("graphics/pokemon/tandemaus/icon.4bpp"); #if P_FOOTPRINTS @@ -24923,8 +24923,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_Maushold[] = INCBIN_U16("graphics/pokemon/maushold/normal.gbapal"); const u16 gMonShinyPalette_Maushold[] = INCBIN_U16("graphics/pokemon/maushold/shiny.gbapal"); - const u32 gMonFrontPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/front.4bpp.lz"); - const u32 gMonBackPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/back.4bpp.lz"); + const u32 gMonFrontPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/front.4bpp.smol"); + const u32 gMonBackPic_MausholdThree[] = INCBIN_U32("graphics/pokemon/maushold/back.4bpp.smol"); const u8 gMonIcon_MausholdThree[] = INCBIN_U8("graphics/pokemon/maushold/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_MausholdThree[] = INCBIN_U8("graphics/pokemon/maushold/footprint.1bpp"); @@ -24937,8 +24937,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/front.4bpp.lz"); - const u32 gMonBackPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/back.4bpp.lz"); + const u32 gMonFrontPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/front.4bpp.smol"); + const u32 gMonBackPic_MausholdFour[] = INCBIN_U32("graphics/pokemon/maushold/four/back.4bpp.smol"); const u8 gMonIcon_MausholdFour[] = INCBIN_U8("graphics/pokemon/maushold/four/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_MausholdFour[] = INCBIN_U8("graphics/pokemon/maushold/four/footprint.1bpp"); @@ -24953,9 +24953,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TANDEMAUS #if P_FAMILY_FIDOUGH - const u32 gMonFrontPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/front.4bpp.lz"); + const u32 gMonFrontPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/front.4bpp.smol"); const u16 gMonPalette_Fidough[] = INCBIN_U16("graphics/pokemon/fidough/normal.gbapal"); - const u32 gMonBackPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/back.4bpp.lz"); + const u32 gMonBackPic_Fidough[] = INCBIN_U32("graphics/pokemon/fidough/back.4bpp.smol"); const u16 gMonShinyPalette_Fidough[] = INCBIN_U16("graphics/pokemon/fidough/shiny.gbapal"); const u8 gMonIcon_Fidough[] = INCBIN_U8("graphics/pokemon/fidough/icon.4bpp"); #if P_FOOTPRINTS @@ -24969,9 +24969,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/front.4bpp.lz"); + const u32 gMonFrontPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/front.4bpp.smol"); const u16 gMonPalette_Dachsbun[] = INCBIN_U16("graphics/pokemon/dachsbun/normal.gbapal"); - const u32 gMonBackPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/back.4bpp.lz"); + const u32 gMonBackPic_Dachsbun[] = INCBIN_U32("graphics/pokemon/dachsbun/back.4bpp.smol"); const u16 gMonShinyPalette_Dachsbun[] = INCBIN_U16("graphics/pokemon/dachsbun/shiny.gbapal"); const u8 gMonIcon_Dachsbun[] = INCBIN_U8("graphics/pokemon/dachsbun/icon.4bpp"); #if P_FOOTPRINTS @@ -24987,9 +24987,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FIDOUGH #if P_FAMILY_SMOLIV - const u32 gMonFrontPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/front.4bpp.lz"); + const u32 gMonFrontPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/front.4bpp.smol"); const u16 gMonPalette_Smoliv[] = INCBIN_U16("graphics/pokemon/smoliv/normal.gbapal"); - const u32 gMonBackPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/back.4bpp.lz"); + const u32 gMonBackPic_Smoliv[] = INCBIN_U32("graphics/pokemon/smoliv/back.4bpp.smol"); const u16 gMonShinyPalette_Smoliv[] = INCBIN_U16("graphics/pokemon/smoliv/shiny.gbapal"); const u8 gMonIcon_Smoliv[] = INCBIN_U8("graphics/pokemon/smoliv/icon.4bpp"); #if P_FOOTPRINTS @@ -25003,9 +25003,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/front.4bpp.lz"); + const u32 gMonFrontPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/front.4bpp.smol"); const u16 gMonPalette_Dolliv[] = INCBIN_U16("graphics/pokemon/dolliv/normal.gbapal"); - const u32 gMonBackPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/back.4bpp.lz"); + const u32 gMonBackPic_Dolliv[] = INCBIN_U32("graphics/pokemon/dolliv/back.4bpp.smol"); const u16 gMonShinyPalette_Dolliv[] = INCBIN_U16("graphics/pokemon/dolliv/shiny.gbapal"); const u8 gMonIcon_Dolliv[] = INCBIN_U8("graphics/pokemon/dolliv/icon.4bpp"); #if P_FOOTPRINTS @@ -25019,9 +25019,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/front.4bpp.lz"); + const u32 gMonFrontPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/front.4bpp.smol"); const u16 gMonPalette_Arboliva[] = INCBIN_U16("graphics/pokemon/arboliva/normal.gbapal"); - const u32 gMonBackPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/back.4bpp.lz"); + const u32 gMonBackPic_Arboliva[] = INCBIN_U32("graphics/pokemon/arboliva/back.4bpp.smol"); const u16 gMonShinyPalette_Arboliva[] = INCBIN_U16("graphics/pokemon/arboliva/shiny.gbapal"); const u8 gMonIcon_Arboliva[] = INCBIN_U8("graphics/pokemon/arboliva/icon.4bpp"); #if P_FOOTPRINTS @@ -25037,8 +25037,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SMOLIV #if P_FAMILY_SQUAWKABILLY - const u32 gMonFrontPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/front.4bpp.lz"); - const u32 gMonBackPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/back.4bpp.lz"); + const u32 gMonFrontPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/front.4bpp.smol"); + const u32 gMonBackPic_Squawkabilly[] = INCBIN_U32("graphics/pokemon/squawkabilly/back.4bpp.smol"); #if P_FOOTPRINTS const u8 gMonFootprint_Squawkabilly[] = INCBIN_U8("graphics/pokemon/squawkabilly/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -25089,9 +25089,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SQUAWKABILLY #if P_FAMILY_NACLI - const u32 gMonFrontPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/front.4bpp.lz"); + const u32 gMonFrontPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/front.4bpp.smol"); const u16 gMonPalette_Nacli[] = INCBIN_U16("graphics/pokemon/nacli/normal.gbapal"); - const u32 gMonBackPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/back.4bpp.lz"); + const u32 gMonBackPic_Nacli[] = INCBIN_U32("graphics/pokemon/nacli/back.4bpp.smol"); const u16 gMonShinyPalette_Nacli[] = INCBIN_U16("graphics/pokemon/nacli/shiny.gbapal"); const u8 gMonIcon_Nacli[] = INCBIN_U8("graphics/pokemon/nacli/icon.4bpp"); #if P_FOOTPRINTS @@ -25105,9 +25105,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/front.4bpp.lz"); + const u32 gMonFrontPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/front.4bpp.smol"); const u16 gMonPalette_Naclstack[] = INCBIN_U16("graphics/pokemon/naclstack/normal.gbapal"); - const u32 gMonBackPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/back.4bpp.lz"); + const u32 gMonBackPic_Naclstack[] = INCBIN_U32("graphics/pokemon/naclstack/back.4bpp.smol"); const u16 gMonShinyPalette_Naclstack[] = INCBIN_U16("graphics/pokemon/naclstack/shiny.gbapal"); const u8 gMonIcon_Naclstack[] = INCBIN_U8("graphics/pokemon/naclstack/icon.4bpp"); #if P_FOOTPRINTS @@ -25121,9 +25121,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/front.4bpp.lz"); + const u32 gMonFrontPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/front.4bpp.smol"); const u16 gMonPalette_Garganacl[] = INCBIN_U16("graphics/pokemon/garganacl/normal.gbapal"); - const u32 gMonBackPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/back.4bpp.lz"); + const u32 gMonBackPic_Garganacl[] = INCBIN_U32("graphics/pokemon/garganacl/back.4bpp.smol"); const u16 gMonShinyPalette_Garganacl[] = INCBIN_U16("graphics/pokemon/garganacl/shiny.gbapal"); const u8 gMonIcon_Garganacl[] = INCBIN_U8("graphics/pokemon/garganacl/icon.4bpp"); #if P_FOOTPRINTS @@ -25139,9 +25139,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_NACLI #if P_FAMILY_CHARCADET - const u32 gMonFrontPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/front.4bpp.lz"); + const u32 gMonFrontPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/front.4bpp.smol"); const u16 gMonPalette_Charcadet[] = INCBIN_U16("graphics/pokemon/charcadet/normal.gbapal"); - const u32 gMonBackPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/back.4bpp.lz"); + const u32 gMonBackPic_Charcadet[] = INCBIN_U32("graphics/pokemon/charcadet/back.4bpp.smol"); const u16 gMonShinyPalette_Charcadet[] = INCBIN_U16("graphics/pokemon/charcadet/shiny.gbapal"); const u8 gMonIcon_Charcadet[] = INCBIN_U8("graphics/pokemon/charcadet/icon.4bpp"); #if P_FOOTPRINTS @@ -25155,9 +25155,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/front.4bpp.lz"); + const u32 gMonFrontPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/front.4bpp.smol"); const u16 gMonPalette_Armarouge[] = INCBIN_U16("graphics/pokemon/armarouge/normal.gbapal"); - const u32 gMonBackPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/back.4bpp.lz"); + const u32 gMonBackPic_Armarouge[] = INCBIN_U32("graphics/pokemon/armarouge/back.4bpp.smol"); const u16 gMonShinyPalette_Armarouge[] = INCBIN_U16("graphics/pokemon/armarouge/shiny.gbapal"); const u8 gMonIcon_Armarouge[] = INCBIN_U8("graphics/pokemon/armarouge/icon.4bpp"); #if P_FOOTPRINTS @@ -25171,9 +25171,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/front.4bpp.lz"); + const u32 gMonFrontPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/front.4bpp.smol"); const u16 gMonPalette_Ceruledge[] = INCBIN_U16("graphics/pokemon/ceruledge/normal.gbapal"); - const u32 gMonBackPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/back.4bpp.lz"); + const u32 gMonBackPic_Ceruledge[] = INCBIN_U32("graphics/pokemon/ceruledge/back.4bpp.smol"); const u16 gMonShinyPalette_Ceruledge[] = INCBIN_U16("graphics/pokemon/ceruledge/shiny.gbapal"); const u8 gMonIcon_Ceruledge[] = INCBIN_U8("graphics/pokemon/ceruledge/icon.4bpp"); #if P_FOOTPRINTS @@ -25189,9 +25189,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHARCADET #if P_FAMILY_TADBULB - const u32 gMonFrontPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/front.4bpp.lz"); + const u32 gMonFrontPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/front.4bpp.smol"); const u16 gMonPalette_Tadbulb[] = INCBIN_U16("graphics/pokemon/tadbulb/normal.gbapal"); - const u32 gMonBackPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/back.4bpp.lz"); + const u32 gMonBackPic_Tadbulb[] = INCBIN_U32("graphics/pokemon/tadbulb/back.4bpp.smol"); const u16 gMonShinyPalette_Tadbulb[] = INCBIN_U16("graphics/pokemon/tadbulb/shiny.gbapal"); const u8 gMonIcon_Tadbulb[] = INCBIN_U8("graphics/pokemon/tadbulb/icon.4bpp"); #if P_FOOTPRINTS @@ -25205,9 +25205,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/front.4bpp.lz"); + const u32 gMonFrontPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/front.4bpp.smol"); const u16 gMonPalette_Bellibolt[] = INCBIN_U16("graphics/pokemon/bellibolt/normal.gbapal"); - const u32 gMonBackPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/back.4bpp.lz"); + const u32 gMonBackPic_Bellibolt[] = INCBIN_U32("graphics/pokemon/bellibolt/back.4bpp.smol"); const u16 gMonShinyPalette_Bellibolt[] = INCBIN_U16("graphics/pokemon/bellibolt/shiny.gbapal"); const u8 gMonIcon_Bellibolt[] = INCBIN_U8("graphics/pokemon/bellibolt/icon.4bpp"); #if P_FOOTPRINTS @@ -25223,9 +25223,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TADBULB #if P_FAMILY_WATTREL - const u32 gMonFrontPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/front.4bpp.lz"); + const u32 gMonFrontPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/front.4bpp.smol"); const u16 gMonPalette_Wattrel[] = INCBIN_U16("graphics/pokemon/wattrel/normal.gbapal"); - const u32 gMonBackPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/back.4bpp.lz"); + const u32 gMonBackPic_Wattrel[] = INCBIN_U32("graphics/pokemon/wattrel/back.4bpp.smol"); const u16 gMonShinyPalette_Wattrel[] = INCBIN_U16("graphics/pokemon/wattrel/shiny.gbapal"); const u8 gMonIcon_Wattrel[] = INCBIN_U8("graphics/pokemon/wattrel/icon.4bpp"); #if P_FOOTPRINTS @@ -25239,9 +25239,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/front.4bpp.lz"); + const u32 gMonFrontPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/front.4bpp.smol"); const u16 gMonPalette_Kilowattrel[] = INCBIN_U16("graphics/pokemon/kilowattrel/normal.gbapal"); - const u32 gMonBackPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/back.4bpp.lz"); + const u32 gMonBackPic_Kilowattrel[] = INCBIN_U32("graphics/pokemon/kilowattrel/back.4bpp.smol"); const u16 gMonShinyPalette_Kilowattrel[] = INCBIN_U16("graphics/pokemon/kilowattrel/shiny.gbapal"); const u8 gMonIcon_Kilowattrel[] = INCBIN_U8("graphics/pokemon/kilowattrel/icon.4bpp"); #if P_FOOTPRINTS @@ -25257,9 +25257,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WATTREL #if P_FAMILY_MASCHIFF - const u32 gMonFrontPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/front.4bpp.lz"); + const u32 gMonFrontPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/front.4bpp.smol"); const u16 gMonPalette_Maschiff[] = INCBIN_U16("graphics/pokemon/maschiff/normal.gbapal"); - const u32 gMonBackPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/back.4bpp.lz"); + const u32 gMonBackPic_Maschiff[] = INCBIN_U32("graphics/pokemon/maschiff/back.4bpp.smol"); const u16 gMonShinyPalette_Maschiff[] = INCBIN_U16("graphics/pokemon/maschiff/shiny.gbapal"); const u8 gMonIcon_Maschiff[] = INCBIN_U8("graphics/pokemon/maschiff/icon.4bpp"); #if P_FOOTPRINTS @@ -25273,9 +25273,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/front.4bpp.lz"); + const u32 gMonFrontPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/front.4bpp.smol"); const u16 gMonPalette_Mabosstiff[] = INCBIN_U16("graphics/pokemon/mabosstiff/normal.gbapal"); - const u32 gMonBackPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/back.4bpp.lz"); + const u32 gMonBackPic_Mabosstiff[] = INCBIN_U32("graphics/pokemon/mabosstiff/back.4bpp.smol"); const u16 gMonShinyPalette_Mabosstiff[] = INCBIN_U16("graphics/pokemon/mabosstiff/shiny.gbapal"); const u8 gMonIcon_Mabosstiff[] = INCBIN_U8("graphics/pokemon/mabosstiff/icon.4bpp"); #if P_FOOTPRINTS @@ -25291,9 +25291,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MASCHIFF #if P_FAMILY_SHROODLE - const u32 gMonFrontPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/front.4bpp.lz"); + const u32 gMonFrontPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/front.4bpp.smol"); const u16 gMonPalette_Shroodle[] = INCBIN_U16("graphics/pokemon/shroodle/normal.gbapal"); - const u32 gMonBackPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/back.4bpp.lz"); + const u32 gMonBackPic_Shroodle[] = INCBIN_U32("graphics/pokemon/shroodle/back.4bpp.smol"); const u16 gMonShinyPalette_Shroodle[] = INCBIN_U16("graphics/pokemon/shroodle/shiny.gbapal"); const u8 gMonIcon_Shroodle[] = INCBIN_U8("graphics/pokemon/shroodle/icon.4bpp"); #if P_FOOTPRINTS @@ -25307,9 +25307,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/front.4bpp.lz"); + const u32 gMonFrontPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/front.4bpp.smol"); const u16 gMonPalette_Grafaiai[] = INCBIN_U16("graphics/pokemon/grafaiai/normal.gbapal"); - const u32 gMonBackPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/back.4bpp.lz"); + const u32 gMonBackPic_Grafaiai[] = INCBIN_U32("graphics/pokemon/grafaiai/back.4bpp.smol"); const u16 gMonShinyPalette_Grafaiai[] = INCBIN_U16("graphics/pokemon/grafaiai/shiny.gbapal"); const u8 gMonIcon_Grafaiai[] = INCBIN_U8("graphics/pokemon/grafaiai/icon.4bpp"); #if P_FOOTPRINTS @@ -25325,9 +25325,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SHROODLE #if P_FAMILY_BRAMBLIN - const u32 gMonFrontPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/front.4bpp.lz"); + const u32 gMonFrontPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/front.4bpp.smol"); const u16 gMonPalette_Bramblin[] = INCBIN_U16("graphics/pokemon/bramblin/normal.gbapal"); - const u32 gMonBackPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/back.4bpp.lz"); + const u32 gMonBackPic_Bramblin[] = INCBIN_U32("graphics/pokemon/bramblin/back.4bpp.smol"); const u16 gMonShinyPalette_Bramblin[] = INCBIN_U16("graphics/pokemon/bramblin/shiny.gbapal"); const u8 gMonIcon_Bramblin[] = INCBIN_U8("graphics/pokemon/bramblin/icon.4bpp"); #if P_FOOTPRINTS @@ -25341,9 +25341,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/front.4bpp.lz"); + const u32 gMonFrontPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/front.4bpp.smol"); const u16 gMonPalette_Brambleghast[] = INCBIN_U16("graphics/pokemon/brambleghast/normal.gbapal"); - const u32 gMonBackPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/back.4bpp.lz"); + const u32 gMonBackPic_Brambleghast[] = INCBIN_U32("graphics/pokemon/brambleghast/back.4bpp.smol"); const u16 gMonShinyPalette_Brambleghast[] = INCBIN_U16("graphics/pokemon/brambleghast/shiny.gbapal"); const u8 gMonIcon_Brambleghast[] = INCBIN_U8("graphics/pokemon/brambleghast/icon.4bpp"); #if P_FOOTPRINTS @@ -25359,9 +25359,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRAMBLIN #if P_FAMILY_TOEDSCOOL - const u32 gMonFrontPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/front.4bpp.lz"); + const u32 gMonFrontPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/front.4bpp.smol"); const u16 gMonPalette_Toedscool[] = INCBIN_U16("graphics/pokemon/toedscool/normal.gbapal"); - const u32 gMonBackPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/back.4bpp.lz"); + const u32 gMonBackPic_Toedscool[] = INCBIN_U32("graphics/pokemon/toedscool/back.4bpp.smol"); const u16 gMonShinyPalette_Toedscool[] = INCBIN_U16("graphics/pokemon/toedscool/shiny.gbapal"); const u8 gMonIcon_Toedscool[] = INCBIN_U8("graphics/pokemon/toedscool/icon.4bpp"); #if P_FOOTPRINTS @@ -25375,9 +25375,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/front.4bpp.lz"); + const u32 gMonFrontPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/front.4bpp.smol"); const u16 gMonPalette_Toedscruel[] = INCBIN_U16("graphics/pokemon/toedscruel/normal.gbapal"); - const u32 gMonBackPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/back.4bpp.lz"); + const u32 gMonBackPic_Toedscruel[] = INCBIN_U32("graphics/pokemon/toedscruel/back.4bpp.smol"); const u16 gMonShinyPalette_Toedscruel[] = INCBIN_U16("graphics/pokemon/toedscruel/shiny.gbapal"); const u8 gMonIcon_Toedscruel[] = INCBIN_U8("graphics/pokemon/toedscruel/icon.4bpp"); #if P_FOOTPRINTS @@ -25393,9 +25393,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TOEDSCOOL #if P_FAMILY_KLAWF - const u32 gMonFrontPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/front.4bpp.lz"); + const u32 gMonFrontPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/front.4bpp.smol"); const u16 gMonPalette_Klawf[] = INCBIN_U16("graphics/pokemon/klawf/normal.gbapal"); - const u32 gMonBackPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/back.4bpp.lz"); + const u32 gMonBackPic_Klawf[] = INCBIN_U32("graphics/pokemon/klawf/back.4bpp.smol"); const u16 gMonShinyPalette_Klawf[] = INCBIN_U16("graphics/pokemon/klawf/shiny.gbapal"); const u8 gMonIcon_Klawf[] = INCBIN_U8("graphics/pokemon/klawf/icon.4bpp"); #if P_FOOTPRINTS @@ -25411,9 +25411,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KLAWF #if P_FAMILY_CAPSAKID - const u32 gMonFrontPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/front.4bpp.lz"); + const u32 gMonFrontPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/front.4bpp.smol"); const u16 gMonPalette_Capsakid[] = INCBIN_U16("graphics/pokemon/capsakid/normal.gbapal"); - const u32 gMonBackPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/back.4bpp.lz"); + const u32 gMonBackPic_Capsakid[] = INCBIN_U32("graphics/pokemon/capsakid/back.4bpp.smol"); const u16 gMonShinyPalette_Capsakid[] = INCBIN_U16("graphics/pokemon/capsakid/shiny.gbapal"); const u8 gMonIcon_Capsakid[] = INCBIN_U8("graphics/pokemon/capsakid/icon.4bpp"); #if P_FOOTPRINTS @@ -25427,9 +25427,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/front.4bpp.lz"); + const u32 gMonFrontPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/front.4bpp.smol"); const u16 gMonPalette_Scovillain[] = INCBIN_U16("graphics/pokemon/scovillain/normal.gbapal"); - const u32 gMonBackPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/back.4bpp.lz"); + const u32 gMonBackPic_Scovillain[] = INCBIN_U32("graphics/pokemon/scovillain/back.4bpp.smol"); const u16 gMonShinyPalette_Scovillain[] = INCBIN_U16("graphics/pokemon/scovillain/shiny.gbapal"); const u8 gMonIcon_Scovillain[] = INCBIN_U8("graphics/pokemon/scovillain/icon.4bpp"); #if P_FOOTPRINTS @@ -25445,9 +25445,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CAPSAKID #if P_FAMILY_RELLOR - const u32 gMonFrontPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/front.4bpp.lz"); + const u32 gMonFrontPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/front.4bpp.smol"); const u16 gMonPalette_Rellor[] = INCBIN_U16("graphics/pokemon/rellor/normal.gbapal"); - const u32 gMonBackPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/back.4bpp.lz"); + const u32 gMonBackPic_Rellor[] = INCBIN_U32("graphics/pokemon/rellor/back.4bpp.smol"); const u16 gMonShinyPalette_Rellor[] = INCBIN_U16("graphics/pokemon/rellor/shiny.gbapal"); const u8 gMonIcon_Rellor[] = INCBIN_U8("graphics/pokemon/rellor/icon.4bpp"); #if P_FOOTPRINTS @@ -25461,9 +25461,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/front.4bpp.lz"); + const u32 gMonFrontPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/front.4bpp.smol"); const u16 gMonPalette_Rabsca[] = INCBIN_U16("graphics/pokemon/rabsca/normal.gbapal"); - const u32 gMonBackPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/back.4bpp.lz"); + const u32 gMonBackPic_Rabsca[] = INCBIN_U32("graphics/pokemon/rabsca/back.4bpp.smol"); const u16 gMonShinyPalette_Rabsca[] = INCBIN_U16("graphics/pokemon/rabsca/shiny.gbapal"); const u8 gMonIcon_Rabsca[] = INCBIN_U8("graphics/pokemon/rabsca/icon.4bpp"); #if P_FOOTPRINTS @@ -25479,9 +25479,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RELLOR #if P_FAMILY_FLITTLE - const u32 gMonFrontPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/front.4bpp.lz"); + const u32 gMonFrontPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/front.4bpp.smol"); const u16 gMonPalette_Flittle[] = INCBIN_U16("graphics/pokemon/flittle/normal.gbapal"); - const u32 gMonBackPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/back.4bpp.lz"); + const u32 gMonBackPic_Flittle[] = INCBIN_U32("graphics/pokemon/flittle/back.4bpp.smol"); const u16 gMonShinyPalette_Flittle[] = INCBIN_U16("graphics/pokemon/flittle/shiny.gbapal"); const u8 gMonIcon_Flittle[] = INCBIN_U8("graphics/pokemon/flittle/icon.4bpp"); #if P_FOOTPRINTS @@ -25495,9 +25495,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/front.4bpp.lz"); + const u32 gMonFrontPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/front.4bpp.smol"); const u16 gMonPalette_Espathra[] = INCBIN_U16("graphics/pokemon/espathra/normal.gbapal"); - const u32 gMonBackPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/back.4bpp.lz"); + const u32 gMonBackPic_Espathra[] = INCBIN_U32("graphics/pokemon/espathra/back.4bpp.smol"); const u16 gMonShinyPalette_Espathra[] = INCBIN_U16("graphics/pokemon/espathra/shiny.gbapal"); const u8 gMonIcon_Espathra[] = INCBIN_U8("graphics/pokemon/espathra/icon.4bpp"); #if P_FOOTPRINTS @@ -25513,9 +25513,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLITTLE #if P_FAMILY_TINKATINK - const u32 gMonFrontPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/front.4bpp.smol"); const u16 gMonPalette_Tinkatink[] = INCBIN_U16("graphics/pokemon/tinkatink/normal.gbapal"); - const u32 gMonBackPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/back.4bpp.lz"); + const u32 gMonBackPic_Tinkatink[] = INCBIN_U32("graphics/pokemon/tinkatink/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkatink[] = INCBIN_U16("graphics/pokemon/tinkatink/shiny.gbapal"); const u8 gMonIcon_Tinkatink[] = INCBIN_U8("graphics/pokemon/tinkatink/icon.4bpp"); #if P_FOOTPRINTS @@ -25529,9 +25529,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/front.4bpp.smol"); const u16 gMonPalette_Tinkatuff[] = INCBIN_U16("graphics/pokemon/tinkatuff/normal.gbapal"); - const u32 gMonBackPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/back.4bpp.lz"); + const u32 gMonBackPic_Tinkatuff[] = INCBIN_U32("graphics/pokemon/tinkatuff/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkatuff[] = INCBIN_U16("graphics/pokemon/tinkatuff/shiny.gbapal"); const u8 gMonIcon_Tinkatuff[] = INCBIN_U8("graphics/pokemon/tinkatuff/icon.4bpp"); #if P_FOOTPRINTS @@ -25545,9 +25545,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/front.4bpp.lz"); + const u32 gMonFrontPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/front.4bpp.smol"); const u16 gMonPalette_Tinkaton[] = INCBIN_U16("graphics/pokemon/tinkaton/normal.gbapal"); - const u32 gMonBackPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/back.4bpp.lz"); + const u32 gMonBackPic_Tinkaton[] = INCBIN_U32("graphics/pokemon/tinkaton/back.4bpp.smol"); const u16 gMonShinyPalette_Tinkaton[] = INCBIN_U16("graphics/pokemon/tinkaton/shiny.gbapal"); const u8 gMonIcon_Tinkaton[] = INCBIN_U8("graphics/pokemon/tinkaton/icon.4bpp"); #if P_FOOTPRINTS @@ -25563,9 +25563,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TINKATINK #if P_FAMILY_WIGLETT - const u32 gMonFrontPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/front.4bpp.lz"); + const u32 gMonFrontPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/front.4bpp.smol"); const u16 gMonPalette_Wiglett[] = INCBIN_U16("graphics/pokemon/wiglett/normal.gbapal"); - const u32 gMonBackPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/back.4bpp.lz"); + const u32 gMonBackPic_Wiglett[] = INCBIN_U32("graphics/pokemon/wiglett/back.4bpp.smol"); const u16 gMonShinyPalette_Wiglett[] = INCBIN_U16("graphics/pokemon/wiglett/shiny.gbapal"); const u8 gMonIcon_Wiglett[] = INCBIN_U8("graphics/pokemon/wiglett/icon.4bpp"); #if P_FOOTPRINTS @@ -25579,9 +25579,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/front.4bpp.lz"); + const u32 gMonFrontPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/front.4bpp.smol"); const u16 gMonPalette_Wugtrio[] = INCBIN_U16("graphics/pokemon/wugtrio/normal.gbapal"); - const u32 gMonBackPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/back.4bpp.lz"); + const u32 gMonBackPic_Wugtrio[] = INCBIN_U32("graphics/pokemon/wugtrio/back.4bpp.smol"); const u16 gMonShinyPalette_Wugtrio[] = INCBIN_U16("graphics/pokemon/wugtrio/shiny.gbapal"); const u8 gMonIcon_Wugtrio[] = INCBIN_U8("graphics/pokemon/wugtrio/icon.4bpp"); #if P_FOOTPRINTS @@ -25597,9 +25597,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WIGLETT #if P_FAMILY_BOMBIRDIER - const u32 gMonFrontPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/front.4bpp.lz"); + const u32 gMonFrontPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/front.4bpp.smol"); const u16 gMonPalette_Bombirdier[] = INCBIN_U16("graphics/pokemon/bombirdier/normal.gbapal"); - const u32 gMonBackPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/back.4bpp.lz"); + const u32 gMonBackPic_Bombirdier[] = INCBIN_U32("graphics/pokemon/bombirdier/back.4bpp.smol"); const u16 gMonShinyPalette_Bombirdier[] = INCBIN_U16("graphics/pokemon/bombirdier/shiny.gbapal"); const u8 gMonIcon_Bombirdier[] = INCBIN_U8("graphics/pokemon/bombirdier/icon.4bpp"); #if P_FOOTPRINTS @@ -25615,9 +25615,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BOMBIRDIER #if P_FAMILY_FINIZEN - const u32 gMonFrontPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/front.4bpp.lz"); + const u32 gMonFrontPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/front.4bpp.smol"); const u16 gMonPalette_Finizen[] = INCBIN_U16("graphics/pokemon/finizen/normal.gbapal"); - const u32 gMonBackPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/back.4bpp.lz"); + const u32 gMonBackPic_Finizen[] = INCBIN_U32("graphics/pokemon/finizen/back.4bpp.smol"); const u16 gMonShinyPalette_Finizen[] = INCBIN_U16("graphics/pokemon/finizen/shiny.gbapal"); const u8 gMonIcon_Finizen[] = INCBIN_U8("graphics/pokemon/finizen/icon.4bpp"); #if P_FOOTPRINTS @@ -25631,9 +25631,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/front.4bpp.lz"); + const u32 gMonFrontPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/front.4bpp.smol"); const u16 gMonPalette_PalafinZero[] = INCBIN_U16("graphics/pokemon/palafin/normal.gbapal"); - const u32 gMonBackPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/back.4bpp.lz"); + const u32 gMonBackPic_PalafinZero[] = INCBIN_U32("graphics/pokemon/palafin/back.4bpp.smol"); const u16 gMonShinyPalette_PalafinZero[] = INCBIN_U16("graphics/pokemon/palafin/shiny.gbapal"); const u8 gMonIcon_PalafinZero[] = INCBIN_U8("graphics/pokemon/palafin/icon.4bpp"); #if P_FOOTPRINTS @@ -25647,9 +25647,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/front.4bpp.lz"); + const u32 gMonFrontPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/front.4bpp.smol"); const u16 gMonPalette_PalafinHero[] = INCBIN_U16("graphics/pokemon/palafin/hero/normal.gbapal"); - const u32 gMonBackPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/back.4bpp.lz"); + const u32 gMonBackPic_PalafinHero[] = INCBIN_U32("graphics/pokemon/palafin/hero/back.4bpp.smol"); const u16 gMonShinyPalette_PalafinHero[] = INCBIN_U16("graphics/pokemon/palafin/hero/shiny.gbapal"); const u8 gMonIcon_PalafinHero[] = INCBIN_U8("graphics/pokemon/palafin/hero/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25662,9 +25662,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FINIZEN #if P_FAMILY_VAROOM - const u32 gMonFrontPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/front.4bpp.lz"); + const u32 gMonFrontPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/front.4bpp.smol"); const u16 gMonPalette_Varoom[] = INCBIN_U16("graphics/pokemon/varoom/normal.gbapal"); - const u32 gMonBackPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/back.4bpp.lz"); + const u32 gMonBackPic_Varoom[] = INCBIN_U32("graphics/pokemon/varoom/back.4bpp.smol"); const u16 gMonShinyPalette_Varoom[] = INCBIN_U16("graphics/pokemon/varoom/shiny.gbapal"); const u8 gMonIcon_Varoom[] = INCBIN_U8("graphics/pokemon/varoom/icon.4bpp"); #if P_FOOTPRINTS @@ -25678,9 +25678,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/front.4bpp.lz"); + const u32 gMonFrontPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/front.4bpp.smol"); const u16 gMonPalette_Revavroom[] = INCBIN_U16("graphics/pokemon/revavroom/normal.gbapal"); - const u32 gMonBackPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/back.4bpp.lz"); + const u32 gMonBackPic_Revavroom[] = INCBIN_U32("graphics/pokemon/revavroom/back.4bpp.smol"); const u16 gMonShinyPalette_Revavroom[] = INCBIN_U16("graphics/pokemon/revavroom/shiny.gbapal"); const u8 gMonIcon_Revavroom[] = INCBIN_U8("graphics/pokemon/revavroom/icon.4bpp"); #if P_FOOTPRINTS @@ -25696,9 +25696,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VAROOM #if P_FAMILY_CYCLIZAR - const u32 gMonFrontPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/front.4bpp.lz"); + const u32 gMonFrontPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/front.4bpp.smol"); const u16 gMonPalette_Cyclizar[] = INCBIN_U16("graphics/pokemon/cyclizar/normal.gbapal"); - const u32 gMonBackPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/back.4bpp.lz"); + const u32 gMonBackPic_Cyclizar[] = INCBIN_U32("graphics/pokemon/cyclizar/back.4bpp.smol"); const u16 gMonShinyPalette_Cyclizar[] = INCBIN_U16("graphics/pokemon/cyclizar/shiny.gbapal"); const u8 gMonIcon_Cyclizar[] = INCBIN_U8("graphics/pokemon/cyclizar/icon.4bpp"); #if P_FOOTPRINTS @@ -25714,9 +25714,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CYCLIZAR #if P_FAMILY_ORTHWORM - const u32 gMonFrontPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/front.4bpp.lz"); + const u32 gMonFrontPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/front.4bpp.smol"); const u16 gMonPalette_Orthworm[] = INCBIN_U16("graphics/pokemon/orthworm/normal.gbapal"); - const u32 gMonBackPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/back.4bpp.lz"); + const u32 gMonBackPic_Orthworm[] = INCBIN_U32("graphics/pokemon/orthworm/back.4bpp.smol"); const u16 gMonShinyPalette_Orthworm[] = INCBIN_U16("graphics/pokemon/orthworm/shiny.gbapal"); const u8 gMonIcon_Orthworm[] = INCBIN_U8("graphics/pokemon/orthworm/icon.4bpp"); #if P_FOOTPRINTS @@ -25732,9 +25732,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ORTHWORM #if P_FAMILY_GLIMMET - const u32 gMonFrontPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/front.4bpp.lz"); + const u32 gMonFrontPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/front.4bpp.smol"); const u16 gMonPalette_Glimmet[] = INCBIN_U16("graphics/pokemon/glimmet/normal.gbapal"); - const u32 gMonBackPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/back.4bpp.lz"); + const u32 gMonBackPic_Glimmet[] = INCBIN_U32("graphics/pokemon/glimmet/back.4bpp.smol"); const u16 gMonShinyPalette_Glimmet[] = INCBIN_U16("graphics/pokemon/glimmet/shiny.gbapal"); const u8 gMonIcon_Glimmet[] = INCBIN_U8("graphics/pokemon/glimmet/icon.4bpp"); #if P_FOOTPRINTS @@ -25748,9 +25748,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/front.4bpp.lz"); + const u32 gMonFrontPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/front.4bpp.smol"); const u16 gMonPalette_Glimmora[] = INCBIN_U16("graphics/pokemon/glimmora/normal.gbapal"); - const u32 gMonBackPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/back.4bpp.lz"); + const u32 gMonBackPic_Glimmora[] = INCBIN_U32("graphics/pokemon/glimmora/back.4bpp.smol"); const u16 gMonShinyPalette_Glimmora[] = INCBIN_U16("graphics/pokemon/glimmora/shiny.gbapal"); const u8 gMonIcon_Glimmora[] = INCBIN_U8("graphics/pokemon/glimmora/icon.4bpp"); #if P_FOOTPRINTS @@ -25766,9 +25766,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GLIMMET #if P_FAMILY_GREAVARD - const u32 gMonFrontPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/front.4bpp.lz"); + const u32 gMonFrontPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/front.4bpp.smol"); const u16 gMonPalette_Greavard[] = INCBIN_U16("graphics/pokemon/greavard/normal.gbapal"); - const u32 gMonBackPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/back.4bpp.lz"); + const u32 gMonBackPic_Greavard[] = INCBIN_U32("graphics/pokemon/greavard/back.4bpp.smol"); const u16 gMonShinyPalette_Greavard[] = INCBIN_U16("graphics/pokemon/greavard/shiny.gbapal"); const u8 gMonIcon_Greavard[] = INCBIN_U8("graphics/pokemon/greavard/icon.4bpp"); #if P_FOOTPRINTS @@ -25782,9 +25782,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/front.4bpp.lz"); + const u32 gMonFrontPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/front.4bpp.smol"); const u16 gMonPalette_Houndstone[] = INCBIN_U16("graphics/pokemon/houndstone/normal.gbapal"); - const u32 gMonBackPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/back.4bpp.lz"); + const u32 gMonBackPic_Houndstone[] = INCBIN_U32("graphics/pokemon/houndstone/back.4bpp.smol"); const u16 gMonShinyPalette_Houndstone[] = INCBIN_U16("graphics/pokemon/houndstone/shiny.gbapal"); const u8 gMonIcon_Houndstone[] = INCBIN_U8("graphics/pokemon/houndstone/icon.4bpp"); #if P_FOOTPRINTS @@ -25800,9 +25800,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GREAVARD #if P_FAMILY_FLAMIGO - const u32 gMonFrontPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/front.4bpp.lz"); + const u32 gMonFrontPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/front.4bpp.smol"); const u16 gMonPalette_Flamigo[] = INCBIN_U16("graphics/pokemon/flamigo/normal.gbapal"); - const u32 gMonBackPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/back.4bpp.lz"); + const u32 gMonBackPic_Flamigo[] = INCBIN_U32("graphics/pokemon/flamigo/back.4bpp.smol"); const u16 gMonShinyPalette_Flamigo[] = INCBIN_U16("graphics/pokemon/flamigo/shiny.gbapal"); const u8 gMonIcon_Flamigo[] = INCBIN_U8("graphics/pokemon/flamigo/icon.4bpp"); #if P_FOOTPRINTS @@ -25818,9 +25818,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLAMIGO #if P_FAMILY_CETODDLE - const u32 gMonFrontPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/front.4bpp.lz"); + const u32 gMonFrontPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/front.4bpp.smol"); const u16 gMonPalette_Cetoddle[] = INCBIN_U16("graphics/pokemon/cetoddle/normal.gbapal"); - const u32 gMonBackPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/back.4bpp.lz"); + const u32 gMonBackPic_Cetoddle[] = INCBIN_U32("graphics/pokemon/cetoddle/back.4bpp.smol"); const u16 gMonShinyPalette_Cetoddle[] = INCBIN_U16("graphics/pokemon/cetoddle/shiny.gbapal"); const u8 gMonIcon_Cetoddle[] = INCBIN_U8("graphics/pokemon/cetoddle/icon.4bpp"); #if P_FOOTPRINTS @@ -25834,9 +25834,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/front.4bpp.lz"); + const u32 gMonFrontPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/front.4bpp.smol"); const u16 gMonPalette_Cetitan[] = INCBIN_U16("graphics/pokemon/cetitan/normal.gbapal"); - const u32 gMonBackPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/back.4bpp.lz"); + const u32 gMonBackPic_Cetitan[] = INCBIN_U32("graphics/pokemon/cetitan/back.4bpp.smol"); const u16 gMonShinyPalette_Cetitan[] = INCBIN_U16("graphics/pokemon/cetitan/shiny.gbapal"); const u8 gMonIcon_Cetitan[] = INCBIN_U8("graphics/pokemon/cetitan/icon.4bpp"); #if P_FOOTPRINTS @@ -25852,9 +25852,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CETODDLE #if P_FAMILY_VELUZA - const u32 gMonFrontPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/front.4bpp.lz"); + const u32 gMonFrontPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/front.4bpp.smol"); const u16 gMonPalette_Veluza[] = INCBIN_U16("graphics/pokemon/veluza/normal.gbapal"); - const u32 gMonBackPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/back.4bpp.lz"); + const u32 gMonBackPic_Veluza[] = INCBIN_U32("graphics/pokemon/veluza/back.4bpp.smol"); const u16 gMonShinyPalette_Veluza[] = INCBIN_U16("graphics/pokemon/veluza/shiny.gbapal"); const u8 gMonIcon_Veluza[] = INCBIN_U8("graphics/pokemon/veluza/icon.4bpp"); #if P_FOOTPRINTS @@ -25870,9 +25870,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_VELUZA #if P_FAMILY_DONDOZO - const u32 gMonFrontPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/front.4bpp.lz"); + const u32 gMonFrontPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/front.4bpp.smol"); const u16 gMonPalette_Dondozo[] = INCBIN_U16("graphics/pokemon/dondozo/normal.gbapal"); - const u32 gMonBackPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/back.4bpp.lz"); + const u32 gMonBackPic_Dondozo[] = INCBIN_U32("graphics/pokemon/dondozo/back.4bpp.smol"); const u16 gMonShinyPalette_Dondozo[] = INCBIN_U16("graphics/pokemon/dondozo/shiny.gbapal"); const u8 gMonIcon_Dondozo[] = INCBIN_U8("graphics/pokemon/dondozo/icon.4bpp"); #if P_FOOTPRINTS @@ -25888,9 +25888,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DONDOZO #if P_FAMILY_TATSUGIRI - const u32 gMonFrontPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/front.4bpp.smol"); const u16 gMonPalette_TatsugiriCurly[] = INCBIN_U16("graphics/pokemon/tatsugiri/normal.gbapal"); - const u32 gMonBackPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriCurly[] = INCBIN_U32("graphics/pokemon/tatsugiri/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriCurly[] = INCBIN_U16("graphics/pokemon/tatsugiri/shiny.gbapal"); const u8 gMonIcon_TatsugiriCurly[] = INCBIN_U8("graphics/pokemon/tatsugiri/icon.4bpp"); #if P_FOOTPRINTS @@ -25904,9 +25904,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/front.4bpp.smol"); const u16 gMonPalette_TatsugiriDroopy[] = INCBIN_U16("graphics/pokemon/tatsugiri/droopy/normal.gbapal"); - const u32 gMonBackPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriDroopy[] = INCBIN_U32("graphics/pokemon/tatsugiri/droopy/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriDroopy[] = INCBIN_U16("graphics/pokemon/tatsugiri/droopy/shiny.gbapal"); const u8 gMonIcon_TatsugiriDroopy[] = INCBIN_U8("graphics/pokemon/tatsugiri/droopy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25917,9 +25917,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/front.4bpp.lz"); + const u32 gMonFrontPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/front.4bpp.smol"); const u16 gMonPalette_TatsugiriStretchy[] = INCBIN_U16("graphics/pokemon/tatsugiri/stretchy/normal.gbapal"); - const u32 gMonBackPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/back.4bpp.lz"); + const u32 gMonBackPic_TatsugiriStretchy[] = INCBIN_U32("graphics/pokemon/tatsugiri/stretchy/back.4bpp.smol"); const u16 gMonShinyPalette_TatsugiriStretchy[] = INCBIN_U16("graphics/pokemon/tatsugiri/stretchy/shiny.gbapal"); const u8 gMonIcon_TatsugiriStretchy[] = INCBIN_U8("graphics/pokemon/tatsugiri/stretchy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -25932,9 +25932,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DONDOZO #if P_FAMILY_GREAT_TUSK - const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/front.4bpp.lz"); + const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/front.4bpp.smol"); const u16 gMonPalette_GreatTusk[] = INCBIN_U16("graphics/pokemon/great_tusk/normal.gbapal"); - const u32 gMonBackPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/back.4bpp.lz"); + const u32 gMonBackPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/back.4bpp.smol"); const u16 gMonShinyPalette_GreatTusk[] = INCBIN_U16("graphics/pokemon/great_tusk/shiny.gbapal"); const u8 gMonIcon_GreatTusk[] = INCBIN_U8("graphics/pokemon/great_tusk/icon.4bpp"); #if P_FOOTPRINTS @@ -25950,9 +25950,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GREAT_TUSK #if P_FAMILY_SCREAM_TAIL - const u32 gMonFrontPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/front.4bpp.lz"); + const u32 gMonFrontPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/front.4bpp.smol"); const u16 gMonPalette_ScreamTail[] = INCBIN_U16("graphics/pokemon/scream_tail/normal.gbapal"); - const u32 gMonBackPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/back.4bpp.lz"); + const u32 gMonBackPic_ScreamTail[] = INCBIN_U32("graphics/pokemon/scream_tail/back.4bpp.smol"); const u16 gMonShinyPalette_ScreamTail[] = INCBIN_U16("graphics/pokemon/scream_tail/shiny.gbapal"); const u8 gMonIcon_ScreamTail[] = INCBIN_U8("graphics/pokemon/scream_tail/icon.4bpp"); #if P_FOOTPRINTS @@ -25968,9 +25968,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SCREAM_TAIL #if P_FAMILY_BRUTE_BONNET - const u32 gMonFrontPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/front.4bpp.lz"); + const u32 gMonFrontPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/front.4bpp.smol"); const u16 gMonPalette_BruteBonnet[] = INCBIN_U16("graphics/pokemon/brute_bonnet/normal.gbapal"); - const u32 gMonBackPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/back.4bpp.lz"); + const u32 gMonBackPic_BruteBonnet[] = INCBIN_U32("graphics/pokemon/brute_bonnet/back.4bpp.smol"); const u16 gMonShinyPalette_BruteBonnet[] = INCBIN_U16("graphics/pokemon/brute_bonnet/shiny.gbapal"); const u8 gMonIcon_BruteBonnet[] = INCBIN_U8("graphics/pokemon/brute_bonnet/icon.4bpp"); #if P_FOOTPRINTS @@ -25986,9 +25986,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_BRUTE_BONNET #if P_FAMILY_FLUTTER_MANE - const u32 gMonFrontPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/front.4bpp.lz"); + const u32 gMonFrontPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/front.4bpp.smol"); const u16 gMonPalette_FlutterMane[] = INCBIN_U16("graphics/pokemon/flutter_mane/normal.gbapal"); - const u32 gMonBackPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/back.4bpp.lz"); + const u32 gMonBackPic_FlutterMane[] = INCBIN_U32("graphics/pokemon/flutter_mane/back.4bpp.smol"); const u16 gMonShinyPalette_FlutterMane[] = INCBIN_U16("graphics/pokemon/flutter_mane/shiny.gbapal"); const u8 gMonIcon_FlutterMane[] = INCBIN_U8("graphics/pokemon/flutter_mane/icon.4bpp"); #if P_FOOTPRINTS @@ -26004,9 +26004,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FLUTTER_MANE #if P_FAMILY_SLITHER_WING - const u32 gMonFrontPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/front.4bpp.lz"); + const u32 gMonFrontPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/front.4bpp.smol"); const u16 gMonPalette_SlitherWing[] = INCBIN_U16("graphics/pokemon/slither_wing/normal.gbapal"); - const u32 gMonBackPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/back.4bpp.lz"); + const u32 gMonBackPic_SlitherWing[] = INCBIN_U32("graphics/pokemon/slither_wing/back.4bpp.smol"); const u16 gMonShinyPalette_SlitherWing[] = INCBIN_U16("graphics/pokemon/slither_wing/shiny.gbapal"); const u8 gMonIcon_SlitherWing[] = INCBIN_U8("graphics/pokemon/slither_wing/icon.4bpp"); #if P_FOOTPRINTS @@ -26022,9 +26022,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SLITHER_WING #if P_FAMILY_SANDY_SHOCKS - const u32 gMonFrontPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/front.4bpp.lz"); + const u32 gMonFrontPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/front.4bpp.smol"); const u16 gMonPalette_SandyShocks[] = INCBIN_U16("graphics/pokemon/sandy_shocks/normal.gbapal"); - const u32 gMonBackPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/back.4bpp.lz"); + const u32 gMonBackPic_SandyShocks[] = INCBIN_U32("graphics/pokemon/sandy_shocks/back.4bpp.smol"); const u16 gMonShinyPalette_SandyShocks[] = INCBIN_U16("graphics/pokemon/sandy_shocks/shiny.gbapal"); const u8 gMonIcon_SandyShocks[] = INCBIN_U8("graphics/pokemon/sandy_shocks/icon.4bpp"); #if P_FOOTPRINTS @@ -26040,9 +26040,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SANDY_SHOCKS #if P_FAMILY_IRON_TREADS - const u32 gMonFrontPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/front.4bpp.lz"); + const u32 gMonFrontPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/front.4bpp.smol"); const u16 gMonPalette_IronTreads[] = INCBIN_U16("graphics/pokemon/iron_treads/normal.gbapal"); - const u32 gMonBackPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/back.4bpp.lz"); + const u32 gMonBackPic_IronTreads[] = INCBIN_U32("graphics/pokemon/iron_treads/back.4bpp.smol"); const u16 gMonShinyPalette_IronTreads[] = INCBIN_U16("graphics/pokemon/iron_treads/shiny.gbapal"); const u8 gMonIcon_IronTreads[] = INCBIN_U8("graphics/pokemon/iron_treads/icon.4bpp"); #if P_FOOTPRINTS @@ -26058,9 +26058,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_TREADS #if P_FAMILY_IRON_BUNDLE - const u32 gMonFrontPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/front.4bpp.lz"); + const u32 gMonFrontPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/front.4bpp.smol"); const u16 gMonPalette_IronBundle[] = INCBIN_U16("graphics/pokemon/iron_bundle/normal.gbapal"); - const u32 gMonBackPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/back.4bpp.lz"); + const u32 gMonBackPic_IronBundle[] = INCBIN_U32("graphics/pokemon/iron_bundle/back.4bpp.smol"); const u16 gMonShinyPalette_IronBundle[] = INCBIN_U16("graphics/pokemon/iron_bundle/shiny.gbapal"); const u8 gMonIcon_IronBundle[] = INCBIN_U8("graphics/pokemon/iron_bundle/icon.4bpp"); #if P_FOOTPRINTS @@ -26076,9 +26076,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_BUNDLE #if P_FAMILY_IRON_HANDS - const u32 gMonFrontPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/front.4bpp.lz"); + const u32 gMonFrontPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/front.4bpp.smol"); const u16 gMonPalette_IronHands[] = INCBIN_U16("graphics/pokemon/iron_hands/normal.gbapal"); - const u32 gMonBackPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/back.4bpp.lz"); + const u32 gMonBackPic_IronHands[] = INCBIN_U32("graphics/pokemon/iron_hands/back.4bpp.smol"); const u16 gMonShinyPalette_IronHands[] = INCBIN_U16("graphics/pokemon/iron_hands/shiny.gbapal"); const u8 gMonIcon_IronHands[] = INCBIN_U8("graphics/pokemon/iron_hands/icon.4bpp"); #if P_FOOTPRINTS @@ -26094,9 +26094,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_HANDS #if P_FAMILY_IRON_JUGULIS - const u32 gMonFrontPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/front.4bpp.lz"); + const u32 gMonFrontPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/front.4bpp.smol"); const u16 gMonPalette_IronJugulis[] = INCBIN_U16("graphics/pokemon/iron_jugulis/normal.gbapal"); - const u32 gMonBackPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/back.4bpp.lz"); + const u32 gMonBackPic_IronJugulis[] = INCBIN_U32("graphics/pokemon/iron_jugulis/back.4bpp.smol"); const u16 gMonShinyPalette_IronJugulis[] = INCBIN_U16("graphics/pokemon/iron_jugulis/shiny.gbapal"); const u8 gMonIcon_IronJugulis[] = INCBIN_U8("graphics/pokemon/iron_jugulis/icon.4bpp"); #if P_FOOTPRINTS @@ -26112,9 +26112,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_JUGULIS #if P_FAMILY_IRON_MOTH - const u32 gMonFrontPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/front.4bpp.lz"); + const u32 gMonFrontPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/front.4bpp.smol"); const u16 gMonPalette_IronMoth[] = INCBIN_U16("graphics/pokemon/iron_moth/normal.gbapal"); - const u32 gMonBackPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/back.4bpp.lz"); + const u32 gMonBackPic_IronMoth[] = INCBIN_U32("graphics/pokemon/iron_moth/back.4bpp.smol"); const u16 gMonShinyPalette_IronMoth[] = INCBIN_U16("graphics/pokemon/iron_moth/shiny.gbapal"); const u8 gMonIcon_IronMoth[] = INCBIN_U8("graphics/pokemon/iron_moth/icon.4bpp"); #if P_FOOTPRINTS @@ -26130,9 +26130,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_MOTH #if P_FAMILY_IRON_THORNS - const u32 gMonFrontPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/front.4bpp.lz"); + const u32 gMonFrontPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/front.4bpp.smol"); const u16 gMonPalette_IronThorns[] = INCBIN_U16("graphics/pokemon/iron_thorns/normal.gbapal"); - const u32 gMonBackPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/back.4bpp.lz"); + const u32 gMonBackPic_IronThorns[] = INCBIN_U32("graphics/pokemon/iron_thorns/back.4bpp.smol"); const u16 gMonShinyPalette_IronThorns[] = INCBIN_U16("graphics/pokemon/iron_thorns/shiny.gbapal"); const u8 gMonIcon_IronThorns[] = INCBIN_U8("graphics/pokemon/iron_thorns/icon.4bpp"); #if P_FOOTPRINTS @@ -26148,9 +26148,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_THORNS #if P_FAMILY_FRIGIBAX - const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/front.4bpp.lz"); + const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/front.4bpp.smol"); const u16 gMonPalette_Frigibax[] = INCBIN_U16("graphics/pokemon/frigibax/normal.gbapal"); - const u32 gMonBackPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/back.4bpp.lz"); + const u32 gMonBackPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/back.4bpp.smol"); const u16 gMonShinyPalette_Frigibax[] = INCBIN_U16("graphics/pokemon/frigibax/shiny.gbapal"); const u8 gMonIcon_Frigibax[] = INCBIN_U8("graphics/pokemon/frigibax/icon.4bpp"); #if P_FOOTPRINTS @@ -26164,9 +26164,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/front.4bpp.lz"); + const u32 gMonFrontPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/front.4bpp.smol"); const u16 gMonPalette_Arctibax[] = INCBIN_U16("graphics/pokemon/arctibax/normal.gbapal"); - const u32 gMonBackPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/back.4bpp.lz"); + const u32 gMonBackPic_Arctibax[] = INCBIN_U32("graphics/pokemon/arctibax/back.4bpp.smol"); const u16 gMonShinyPalette_Arctibax[] = INCBIN_U16("graphics/pokemon/arctibax/shiny.gbapal"); const u8 gMonIcon_Arctibax[] = INCBIN_U8("graphics/pokemon/arctibax/icon.4bpp"); #if P_FOOTPRINTS @@ -26180,9 +26180,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/front.4bpp.lz"); + const u32 gMonFrontPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/front.4bpp.smol"); const u16 gMonPalette_Baxcalibur[] = INCBIN_U16("graphics/pokemon/baxcalibur/normal.gbapal"); - const u32 gMonBackPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/back.4bpp.lz"); + const u32 gMonBackPic_Baxcalibur[] = INCBIN_U32("graphics/pokemon/baxcalibur/back.4bpp.smol"); const u16 gMonShinyPalette_Baxcalibur[] = INCBIN_U16("graphics/pokemon/baxcalibur/shiny.gbapal"); const u8 gMonIcon_Baxcalibur[] = INCBIN_U8("graphics/pokemon/baxcalibur/icon.4bpp"); #if P_FOOTPRINTS @@ -26198,9 +26198,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FRIGIBAX #if P_FAMILY_GIMMIGHOUL - const u32 gMonFrontPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/front.4bpp.lz"); + const u32 gMonFrontPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/front.4bpp.smol"); const u16 gMonPalette_GimmighoulChest[] = INCBIN_U16("graphics/pokemon/gimmighoul/normal.gbapal"); - const u32 gMonBackPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/back.4bpp.lz"); + const u32 gMonBackPic_GimmighoulChest[] = INCBIN_U32("graphics/pokemon/gimmighoul/back.4bpp.smol"); const u16 gMonShinyPalette_GimmighoulChest[] = INCBIN_U16("graphics/pokemon/gimmighoul/shiny.gbapal"); const u8 gMonIcon_GimmighoulChest[] = INCBIN_U8("graphics/pokemon/gimmighoul/icon.4bpp"); #if P_FOOTPRINTS @@ -26214,9 +26214,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/front.4bpp.lz"); + const u32 gMonFrontPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/front.4bpp.smol"); const u16 gMonPalette_GimmighoulRoaming[] = INCBIN_U16("graphics/pokemon/gimmighoul/roaming/normal.gbapal"); - const u32 gMonBackPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/back.4bpp.lz"); + const u32 gMonBackPic_GimmighoulRoaming[] = INCBIN_U32("graphics/pokemon/gimmighoul/roaming/back.4bpp.smol"); const u16 gMonShinyPalette_GimmighoulRoaming[] = INCBIN_U16("graphics/pokemon/gimmighoul/roaming/shiny.gbapal"); const u8 gMonIcon_GimmighoulRoaming[] = INCBIN_U8("graphics/pokemon/gimmighoul/roaming/icon.4bpp"); #if P_FOOTPRINTS @@ -26230,9 +26230,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/front.4bpp.lz"); + const u32 gMonFrontPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/front.4bpp.smol"); const u16 gMonPalette_Gholdengo[] = INCBIN_U16("graphics/pokemon/gholdengo/normal.gbapal"); - const u32 gMonBackPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/back.4bpp.lz"); + const u32 gMonBackPic_Gholdengo[] = INCBIN_U32("graphics/pokemon/gholdengo/back.4bpp.smol"); const u16 gMonShinyPalette_Gholdengo[] = INCBIN_U16("graphics/pokemon/gholdengo/shiny.gbapal"); const u8 gMonIcon_Gholdengo[] = INCBIN_U8("graphics/pokemon/gholdengo/icon.4bpp"); #if P_FOOTPRINTS @@ -26248,9 +26248,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GIMMIGHOUL #if P_FAMILY_WO_CHIEN - const u32 gMonFrontPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/front.4bpp.lz"); + const u32 gMonFrontPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/front.4bpp.smol"); const u16 gMonPalette_WoChien[] = INCBIN_U16("graphics/pokemon/wo_chien/normal.gbapal"); - const u32 gMonBackPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/back.4bpp.lz"); + const u32 gMonBackPic_WoChien[] = INCBIN_U32("graphics/pokemon/wo_chien/back.4bpp.smol"); const u16 gMonShinyPalette_WoChien[] = INCBIN_U16("graphics/pokemon/wo_chien/shiny.gbapal"); const u8 gMonIcon_WoChien[] = INCBIN_U8("graphics/pokemon/wo_chien/icon.4bpp"); #if P_FOOTPRINTS @@ -26266,9 +26266,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WO_CHIEN #if P_FAMILY_CHIEN_PAO - const u32 gMonFrontPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/front.4bpp.lz"); + const u32 gMonFrontPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/front.4bpp.smol"); const u16 gMonPalette_ChienPao[] = INCBIN_U16("graphics/pokemon/chien_pao/normal.gbapal"); - const u32 gMonBackPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/back.4bpp.lz"); + const u32 gMonBackPic_ChienPao[] = INCBIN_U32("graphics/pokemon/chien_pao/back.4bpp.smol"); const u16 gMonShinyPalette_ChienPao[] = INCBIN_U16("graphics/pokemon/chien_pao/shiny.gbapal"); const u8 gMonIcon_ChienPao[] = INCBIN_U8("graphics/pokemon/chien_pao/icon.4bpp"); #if P_FOOTPRINTS @@ -26284,9 +26284,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHIEN_PAO #if P_FAMILY_TING_LU - const u32 gMonFrontPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/front.4bpp.lz"); + const u32 gMonFrontPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/front.4bpp.smol"); const u16 gMonPalette_TingLu[] = INCBIN_U16("graphics/pokemon/ting_lu/normal.gbapal"); - const u32 gMonBackPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/back.4bpp.lz"); + const u32 gMonBackPic_TingLu[] = INCBIN_U32("graphics/pokemon/ting_lu/back.4bpp.smol"); const u16 gMonShinyPalette_TingLu[] = INCBIN_U16("graphics/pokemon/ting_lu/shiny.gbapal"); const u8 gMonIcon_TingLu[] = INCBIN_U8("graphics/pokemon/ting_lu/icon.4bpp"); #if P_FOOTPRINTS @@ -26302,9 +26302,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TING_LU #if P_FAMILY_CHI_YU - const u32 gMonFrontPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/front.4bpp.lz"); + const u32 gMonFrontPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/front.4bpp.smol"); const u16 gMonPalette_ChiYu[] = INCBIN_U16("graphics/pokemon/chi_yu/normal.gbapal"); - const u32 gMonBackPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/back.4bpp.lz"); + const u32 gMonBackPic_ChiYu[] = INCBIN_U32("graphics/pokemon/chi_yu/back.4bpp.smol"); const u16 gMonShinyPalette_ChiYu[] = INCBIN_U16("graphics/pokemon/chi_yu/shiny.gbapal"); const u8 gMonIcon_ChiYu[] = INCBIN_U8("graphics/pokemon/chi_yu/icon.4bpp"); #if P_FOOTPRINTS @@ -26320,9 +26320,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_CHI_YU #if P_FAMILY_ROARING_MOON - const u32 gMonFrontPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/front.4bpp.lz"); + const u32 gMonFrontPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/front.4bpp.smol"); const u16 gMonPalette_RoaringMoon[] = INCBIN_U16("graphics/pokemon/roaring_moon/normal.gbapal"); - const u32 gMonBackPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/back.4bpp.lz"); + const u32 gMonBackPic_RoaringMoon[] = INCBIN_U32("graphics/pokemon/roaring_moon/back.4bpp.smol"); const u16 gMonShinyPalette_RoaringMoon[] = INCBIN_U16("graphics/pokemon/roaring_moon/shiny.gbapal"); const u8 gMonIcon_RoaringMoon[] = INCBIN_U8("graphics/pokemon/roaring_moon/icon.4bpp"); #if P_FOOTPRINTS @@ -26338,9 +26338,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_ROARING_MOON #if P_FAMILY_IRON_VALIANT - const u32 gMonFrontPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/front.4bpp.lz"); + const u32 gMonFrontPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/front.4bpp.smol"); const u16 gMonPalette_IronValiant[] = INCBIN_U16("graphics/pokemon/iron_valiant/normal.gbapal"); - const u32 gMonBackPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/back.4bpp.lz"); + const u32 gMonBackPic_IronValiant[] = INCBIN_U32("graphics/pokemon/iron_valiant/back.4bpp.smol"); const u16 gMonShinyPalette_IronValiant[] = INCBIN_U16("graphics/pokemon/iron_valiant/shiny.gbapal"); const u8 gMonIcon_IronValiant[] = INCBIN_U8("graphics/pokemon/iron_valiant/icon.4bpp"); #if P_FOOTPRINTS @@ -26356,9 +26356,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_VALIANT #if P_FAMILY_KORAIDON - const u32 gMonFrontPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/front.4bpp.lz"); + const u32 gMonFrontPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/front.4bpp.smol"); const u16 gMonPalette_Koraidon[] = INCBIN_U16("graphics/pokemon/koraidon/normal.gbapal"); - const u32 gMonBackPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/back.4bpp.lz"); + const u32 gMonBackPic_Koraidon[] = INCBIN_U32("graphics/pokemon/koraidon/back.4bpp.smol"); const u16 gMonShinyPalette_Koraidon[] = INCBIN_U16("graphics/pokemon/koraidon/shiny.gbapal"); const u8 gMonIcon_Koraidon[] = INCBIN_U8("graphics/pokemon/koraidon/icon.4bpp"); #if P_FOOTPRINTS @@ -26374,9 +26374,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_KORAIDON #if P_FAMILY_MIRAIDON - const u32 gMonFrontPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/front.4bpp.lz"); + const u32 gMonFrontPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/front.4bpp.smol"); const u16 gMonPalette_Miraidon[] = INCBIN_U16("graphics/pokemon/miraidon/normal.gbapal"); - const u32 gMonBackPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/back.4bpp.lz"); + const u32 gMonBackPic_Miraidon[] = INCBIN_U32("graphics/pokemon/miraidon/back.4bpp.smol"); const u16 gMonShinyPalette_Miraidon[] = INCBIN_U16("graphics/pokemon/miraidon/shiny.gbapal"); const u8 gMonIcon_Miraidon[] = INCBIN_U8("graphics/pokemon/miraidon/icon.4bpp"); #if P_FOOTPRINTS @@ -26392,9 +26392,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MIRAIDON #if P_FAMILY_WALKING_WAKE - const u32 gMonFrontPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/front.4bpp.lz"); + const u32 gMonFrontPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/front.4bpp.smol"); const u16 gMonPalette_WalkingWake[] = INCBIN_U16("graphics/pokemon/walking_wake/normal.gbapal"); - const u32 gMonBackPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/back.4bpp.lz"); + const u32 gMonBackPic_WalkingWake[] = INCBIN_U32("graphics/pokemon/walking_wake/back.4bpp.smol"); const u16 gMonShinyPalette_WalkingWake[] = INCBIN_U16("graphics/pokemon/walking_wake/shiny.gbapal"); const u8 gMonIcon_WalkingWake[] = INCBIN_U8("graphics/pokemon/walking_wake/icon.4bpp"); #if P_FOOTPRINTS @@ -26410,9 +26410,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_WALKING_WAKE #if P_FAMILY_IRON_LEAVES - const u32 gMonFrontPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/front.4bpp.lz"); + const u32 gMonFrontPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/front.4bpp.smol"); const u16 gMonPalette_IronLeaves[] = INCBIN_U16("graphics/pokemon/iron_leaves/normal.gbapal"); - const u32 gMonBackPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/back.4bpp.lz"); + const u32 gMonBackPic_IronLeaves[] = INCBIN_U32("graphics/pokemon/iron_leaves/back.4bpp.smol"); const u16 gMonShinyPalette_IronLeaves[] = INCBIN_U16("graphics/pokemon/iron_leaves/shiny.gbapal"); const u8 gMonIcon_IronLeaves[] = INCBIN_U8("graphics/pokemon/iron_leaves/icon.4bpp"); #if P_FOOTPRINTS @@ -26428,9 +26428,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_LEAVES #if P_FAMILY_POLTCHAGEIST - const u32 gMonFrontPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/front.4bpp.lz"); + const u32 gMonFrontPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/front.4bpp.smol"); const u16 gMonPalette_Poltchageist[] = INCBIN_U16("graphics/pokemon/poltchageist/normal.gbapal"); - const u32 gMonBackPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/back.4bpp.lz"); + const u32 gMonBackPic_Poltchageist[] = INCBIN_U32("graphics/pokemon/poltchageist/back.4bpp.smol"); const u16 gMonShinyPalette_Poltchageist[] = INCBIN_U16("graphics/pokemon/poltchageist/shiny.gbapal"); const u8 gMonIcon_Poltchageist[] = INCBIN_U8("graphics/pokemon/poltchageist/icon.4bpp"); #if P_FOOTPRINTS @@ -26444,9 +26444,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/front.4bpp.lz"); + const u32 gMonFrontPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/front.4bpp.smol"); const u16 gMonPalette_Sinistcha[] = INCBIN_U16("graphics/pokemon/sinistcha/normal.gbapal"); - const u32 gMonBackPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/back.4bpp.lz"); + const u32 gMonBackPic_Sinistcha[] = INCBIN_U32("graphics/pokemon/sinistcha/back.4bpp.smol"); const u16 gMonShinyPalette_Sinistcha[] = INCBIN_U16("graphics/pokemon/sinistcha/shiny.gbapal"); const u8 gMonIcon_Sinistcha[] = INCBIN_U8("graphics/pokemon/sinistcha/icon.4bpp"); #if P_FOOTPRINTS @@ -26462,9 +26462,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_POLTCHAGEIST #if P_FAMILY_OKIDOGI - const u32 gMonFrontPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/front.4bpp.lz"); + const u32 gMonFrontPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/front.4bpp.smol"); const u16 gMonPalette_Okidogi[] = INCBIN_U16("graphics/pokemon/okidogi/normal.gbapal"); - const u32 gMonBackPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/back.4bpp.lz"); + const u32 gMonBackPic_Okidogi[] = INCBIN_U32("graphics/pokemon/okidogi/back.4bpp.smol"); const u16 gMonShinyPalette_Okidogi[] = INCBIN_U16("graphics/pokemon/okidogi/shiny.gbapal"); const u8 gMonIcon_Okidogi[] = INCBIN_U8("graphics/pokemon/okidogi/icon.4bpp"); #if P_FOOTPRINTS @@ -26480,9 +26480,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OKIDOGI #if P_FAMILY_MUNKIDORI - const u32 gMonFrontPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/front.4bpp.lz"); + const u32 gMonFrontPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/front.4bpp.smol"); const u16 gMonPalette_Munkidori[] = INCBIN_U16("graphics/pokemon/munkidori/normal.gbapal"); - const u32 gMonBackPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/back.4bpp.lz"); + const u32 gMonBackPic_Munkidori[] = INCBIN_U32("graphics/pokemon/munkidori/back.4bpp.smol"); const u16 gMonShinyPalette_Munkidori[] = INCBIN_U16("graphics/pokemon/munkidori/shiny.gbapal"); const u8 gMonIcon_Munkidori[] = INCBIN_U8("graphics/pokemon/munkidori/icon.4bpp"); #if P_FOOTPRINTS @@ -26498,9 +26498,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_MUNKIDORI #if P_FAMILY_FEZANDIPITI - const u32 gMonFrontPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/front.4bpp.lz"); + const u32 gMonFrontPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/front.4bpp.smol"); const u16 gMonPalette_Fezandipiti[] = INCBIN_U16("graphics/pokemon/fezandipiti/normal.gbapal"); - const u32 gMonBackPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/back.4bpp.lz"); + const u32 gMonBackPic_Fezandipiti[] = INCBIN_U32("graphics/pokemon/fezandipiti/back.4bpp.smol"); const u16 gMonShinyPalette_Fezandipiti[] = INCBIN_U16("graphics/pokemon/fezandipiti/shiny.gbapal"); const u8 gMonIcon_Fezandipiti[] = INCBIN_U8("graphics/pokemon/fezandipiti/icon.4bpp"); #if P_FOOTPRINTS @@ -26516,51 +26516,51 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FEZANDIPITI #if P_FAMILY_OGERPON - const u32 gMonFrontPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/front.4bpp.smol"); const u16 gMonPalette_OgerponTeal[] = INCBIN_U16("graphics/pokemon/ogerpon/normal.gbapal"); - const u32 gMonBackPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/back.4bpp.lz"); + const u32 gMonBackPic_OgerponTeal[] = INCBIN_U32("graphics/pokemon/ogerpon/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponTeal[] = INCBIN_U16("graphics/pokemon/ogerpon/shiny.gbapal"); const u8 gMonIcon_OgerponTeal[] = INCBIN_U8("graphics/pokemon/ogerpon/icon.4bpp"); #if P_FOOTPRINTS const u8 gMonFootprint_Ogerpon[] = INCBIN_U8("graphics/pokemon/ogerpon/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/front.4bpp.smol"); const u16 gMonPalette_OgerponWellspring[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring/normal.gbapal"); - const u32 gMonBackPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/back.4bpp.lz"); + const u32 gMonBackPic_OgerponWellspring[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponWellspring[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring/shiny.gbapal"); const u8 gMonIcon_OgerponWellspring[] = INCBIN_U8("graphics/pokemon/ogerpon/wellspring/icon.4bpp"); - const u32 gMonFrontPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/front.4bpp.smol"); const u16 gMonPalette_OgerponHearthflame[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/normal.gbapal"); - const u32 gMonBackPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/back.4bpp.lz"); + const u32 gMonBackPic_OgerponHearthflame[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponHearthflame[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/shiny.gbapal"); const u8 gMonIcon_OgerponHearthflame[] = INCBIN_U8("graphics/pokemon/ogerpon/hearthflame/icon.4bpp"); - const u32 gMonFrontPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/front.4bpp.smol"); const u16 gMonPalette_OgerponCornerstone[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/normal.gbapal"); - const u32 gMonBackPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/back.4bpp.lz"); + const u32 gMonBackPic_OgerponCornerstone[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponCornerstone[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/shiny.gbapal"); const u8 gMonIcon_OgerponCornerstone[] = INCBIN_U8("graphics/pokemon/ogerpon/cornerstone/icon.4bpp"); - const u32 gMonFrontPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponTealTera[] = INCBIN_U16("graphics/pokemon/ogerpon/teal_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponTealTera[] = INCBIN_U32("graphics/pokemon/ogerpon/teal_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponTealTera[] = INCBIN_U16("graphics/pokemon/ogerpon/teal_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponWellspringTera[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponWellspringTera[] = INCBIN_U32("graphics/pokemon/ogerpon/wellspring_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponWellspringTera[] = INCBIN_U16("graphics/pokemon/ogerpon/wellspring_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponHearthflameTera[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponHearthflameTera[] = INCBIN_U32("graphics/pokemon/ogerpon/hearthflame_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponHearthflameTera[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame_tera/shiny.gbapal"); - const u32 gMonFrontPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/front.4bpp.lz"); + const u32 gMonFrontPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/front.4bpp.smol"); const u16 gMonPalette_OgerponCornerstoneTera[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone_tera/normal.gbapal"); - const u32 gMonBackPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/back.4bpp.lz"); + const u32 gMonBackPic_OgerponCornerstoneTera[] = INCBIN_U32("graphics/pokemon/ogerpon/cornerstone_tera/back.4bpp.smol"); const u16 gMonShinyPalette_OgerponCornerstoneTera[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone_tera/shiny.gbapal"); #if OW_POKEMON_OBJECT_EVENTS @@ -26593,9 +26593,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_OGERPON #if P_FAMILY_GOUGING_FIRE - const u32 gMonFrontPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/front.4bpp.lz"); + const u32 gMonFrontPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/front.4bpp.smol"); const u16 gMonPalette_GougingFire[] = INCBIN_U16("graphics/pokemon/gouging_fire/normal.gbapal"); - const u32 gMonBackPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/back.4bpp.lz"); + const u32 gMonBackPic_GougingFire[] = INCBIN_U32("graphics/pokemon/gouging_fire/back.4bpp.smol"); const u16 gMonShinyPalette_GougingFire[] = INCBIN_U16("graphics/pokemon/gouging_fire/shiny.gbapal"); const u8 gMonIcon_GougingFire[] = INCBIN_U8("graphics/pokemon/gouging_fire/icon.4bpp"); #if P_FOOTPRINTS @@ -26611,9 +26611,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_GOUGING_FIRE #if P_FAMILY_RAGING_BOLT - const u32 gMonFrontPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/front.4bpp.lz"); + const u32 gMonFrontPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/front.4bpp.smol"); const u16 gMonPalette_RagingBolt[] = INCBIN_U16("graphics/pokemon/raging_bolt/normal.gbapal"); - const u32 gMonBackPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/back.4bpp.lz"); + const u32 gMonBackPic_RagingBolt[] = INCBIN_U32("graphics/pokemon/raging_bolt/back.4bpp.smol"); const u16 gMonShinyPalette_RagingBolt[] = INCBIN_U16("graphics/pokemon/raging_bolt/shiny.gbapal"); const u8 gMonIcon_RagingBolt[] = INCBIN_U8("graphics/pokemon/raging_bolt/icon.4bpp"); #if P_FOOTPRINTS @@ -26629,9 +26629,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_RAGING_BOLT #if P_FAMILY_IRON_BOULDER - const u32 gMonFrontPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/front.4bpp.lz"); + const u32 gMonFrontPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/front.4bpp.smol"); const u16 gMonPalette_IronBoulder[] = INCBIN_U16("graphics/pokemon/iron_boulder/normal.gbapal"); - const u32 gMonBackPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/back.4bpp.lz"); + const u32 gMonBackPic_IronBoulder[] = INCBIN_U32("graphics/pokemon/iron_boulder/back.4bpp.smol"); const u16 gMonShinyPalette_IronBoulder[] = INCBIN_U16("graphics/pokemon/iron_boulder/shiny.gbapal"); const u8 gMonIcon_IronBoulder[] = INCBIN_U8("graphics/pokemon/iron_boulder/icon.4bpp"); #if P_FOOTPRINTS @@ -26647,9 +26647,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_BOULDER #if P_FAMILY_IRON_CROWN - const u32 gMonFrontPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/front.4bpp.lz"); + const u32 gMonFrontPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/front.4bpp.smol"); const u16 gMonPalette_IronCrown[] = INCBIN_U16("graphics/pokemon/iron_crown/normal.gbapal"); - const u32 gMonBackPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/back.4bpp.lz"); + const u32 gMonBackPic_IronCrown[] = INCBIN_U32("graphics/pokemon/iron_crown/back.4bpp.smol"); const u16 gMonShinyPalette_IronCrown[] = INCBIN_U16("graphics/pokemon/iron_crown/shiny.gbapal"); const u8 gMonIcon_IronCrown[] = INCBIN_U8("graphics/pokemon/iron_crown/icon.4bpp"); #if P_FOOTPRINTS @@ -26665,9 +26665,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_CROWN #if P_FAMILY_TERAPAGOS - const u32 gMonFrontPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/front.4bpp.smol"); const u16 gMonPalette_TerapagosNormal[] = INCBIN_U16("graphics/pokemon/terapagos/normal.gbapal"); - const u32 gMonBackPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosNormal[] = INCBIN_U32("graphics/pokemon/terapagos/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosNormal[] = INCBIN_U16("graphics/pokemon/terapagos/shiny.gbapal"); const u8 gMonIcon_TerapagosNormal[] = INCBIN_U8("graphics/pokemon/terapagos/icon.4bpp"); #if P_FOOTPRINTS @@ -26681,9 +26681,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/front.4bpp.smol"); const u16 gMonPalette_TerapagosTerastal[] = INCBIN_U16("graphics/pokemon/terapagos/terastal/normal.gbapal"); - const u32 gMonBackPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosTerastal[] = INCBIN_U32("graphics/pokemon/terapagos/terastal/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosTerastal[] = INCBIN_U16("graphics/pokemon/terapagos/terastal/shiny.gbapal"); const u8 gMonIcon_TerapagosTerastal[] = INCBIN_U8("graphics/pokemon/terapagos/terastal/icon.4bpp"); #if P_FOOTPRINTS @@ -26697,9 +26697,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_PKMN_OBJECTS_SHARE_PALETTES #endif //OW_POKEMON_OBJECT_EVENTS - const u32 gMonFrontPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/front.4bpp.lz"); + const u32 gMonFrontPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/front.4bpp.smol"); const u16 gMonPalette_TerapagosStellar[] = INCBIN_U16("graphics/pokemon/terapagos/stellar/normal.gbapal"); - const u32 gMonBackPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/back.4bpp.lz"); + const u32 gMonBackPic_TerapagosStellar[] = INCBIN_U32("graphics/pokemon/terapagos/stellar/back.4bpp.smol"); const u16 gMonShinyPalette_TerapagosStellar[] = INCBIN_U16("graphics/pokemon/terapagos/stellar/shiny.gbapal"); const u8 gMonIcon_TerapagosStellar[] = INCBIN_U8("graphics/pokemon/terapagos/stellar/icon.4bpp"); #if P_FOOTPRINTS @@ -26715,9 +26715,9 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_TERAPAGOS #if P_FAMILY_PECHARUNT - const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.smol"); const u16 gMonPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/normal.gbapal"); - const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.smol"); const u16 gMonShinyPalette_Pecharunt[] = INCBIN_U16("graphics/pokemon/pecharunt/shiny.gbapal"); const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); #if P_FOOTPRINTS @@ -26732,6 +26732,6 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //OW_POKEMON_OBJECT_EVENTS #endif //P_FAMILY_PECHARUNT - const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.smol"); const u16 gMonPalette_Egg[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal"); const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index 6580c0bb57..305c1db7d0 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -1,60 +1,60 @@ // Scene 1 (RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE) -const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); -const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); -const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); -const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); -const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.4bpp.lz"); -const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.4bpp.lz"); +const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.smol"); +const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.smol"); +const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.smol"); +const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.smol"); +const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.4bpp.smol"); +const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.4bpp.smol"); const u16 gRaySceneDuoFight_Groudon_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/groudon.gbapal"); const u16 gRaySceneDuoFight_Kyogre_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/kyogre.gbapal"); -const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); +const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.smol"); const u16 gRaySceneDuoFight_Clouds_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_1/clouds.gbapal"); // pal 1 clouds, pal 2 rain -const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); -const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); -const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); +const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.smolTM"); +const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.smolTM"); +const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.smolTM"); // Scene 2 (RAY_ANIM_TAKES_FLIGHT) -const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); +const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.smol"); const u16 gRaySceneTakesFlight_Smoke_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_2/smoke.gbapal"); -const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.smol"); const u16 gRaySceneTakesFlight_Rayquaza_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_2/rayquaza.gbapal"); -const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); -const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal -const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.smolTM"); +const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.smol"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal +const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.smolTM"); // Scene 3 (RAY_ANIM_DESCENDS) -const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); -const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.lz"); -const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); -const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal +const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.smol"); +const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail.4bpp.smol"); +const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.smol"); +const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.smol"); // uses pal 2 of gRaySceneDescends_Bg_Pal const u16 gRaySceneDescends_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_3/bg.gbapal"); -const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); -const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); +const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.smolTM"); +const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.smolTM"); // Scene 4 (RAY_ANIM_CHARGES) -const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); -const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); -const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); -const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); -const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); -const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); -const u32 gRaySceneCharges_Orbs_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/orbs.bin.lz"); +const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.smol"); +const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.smolTM"); +const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.smol"); +const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.smolTM"); +const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.smol"); +const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.smolTM"); +const u32 gRaySceneCharges_Orbs_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/orbs.bin.smolTM"); const u16 gRaySceneCharges_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_4/bg.gbapal"); // Scene 5 (RAY_ANIM_CHASES_AWAY) -const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); -const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); -const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); -const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); -const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); -const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); +const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.smol"); +const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.smol"); +const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.smol"); +const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.smol"); +const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.smol"); +const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.smol"); const u16 gRaySceneChasesAway_Groudon_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/groudon.gbapal"); const u16 gRaySceneChasesAway_Kyogre_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/kyogre.gbapal"); const u16 gRaySceneChasesAway_Rayquaza_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/rayquaza.gbapal"); const u16 gRaySceneChasesAway_KyogreSplash_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal"); -const u32 gRaySceneChasesAway_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.4bpp.lz"); -const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); -const u32 gRaySceneChasesAway_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.bin.lz"); -const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); -const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); +const u32 gRaySceneChasesAway_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.4bpp.smol"); +const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.smol"); +const u32 gRaySceneChasesAway_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.bin.smolTM"); +const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.smolTM"); +const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.smolTM"); const u16 gRaySceneChasesAway_Bg_Pal[] = INCBIN_U16("graphics/rayquaza_scene/scene_5/bg.gbapal"); diff --git a/src/data/graphics/slot_machine.h b/src/data/graphics/slot_machine.h index 6500ad7f3b..54799b14b5 100644 --- a/src/data/graphics/slot_machine.h +++ b/src/data/graphics/slot_machine.h @@ -1,5 +1,5 @@ const u16 gSlotMachineMenu_Pal[] = INCBIN_U16("graphics/slot_machine/menu.gbapal"); -const u32 gSlotMachineMenu_Gfx[] = INCBIN_U32("graphics/slot_machine/menu.4bpp.lz"); +const u32 gSlotMachineMenu_Gfx[] = INCBIN_U32("graphics/slot_machine/menu.4bpp.smol"); const u16 gSlotMachineMenu_Tilemap[] = INCBIN_U16("graphics/slot_machine/menu.bin"); const u16 gSlotMachineInfoBox_Tilemap[] = INCBIN_U16("graphics/slot_machine/info_box.bin"); @@ -20,7 +20,7 @@ const u8 gSlotMachineReelSymbol5Tiles[] = INCBIN_U8("graphics/slot_machine/reel_ const u8 gSlotMachineReelSymbol6Tiles[] = INCBIN_U8("graphics/slot_machine/reel_symbols/6.4bpp"); const u8 gSlotMachineReelSymbol7Tiles[] = INCBIN_U8("graphics/slot_machine/reel_symbols/7.4bpp"); -const u32 gSlotMachineDigitalDisplay_Gfx[] = INCBIN_U32("graphics/slot_machine/digital_display.4bpp.lz"); +const u32 gSlotMachineDigitalDisplay_Gfx[] = INCBIN_U32("graphics/slot_machine/digital_display.4bpp.smol"); const u8 gSlotMachineNumber0Tiles[] = INCBIN_U8("graphics/slot_machine/numbers/0.4bpp"); const u8 gSlotMachineNumber1Tiles[] = INCBIN_U8("graphics/slot_machine/numbers/1.4bpp"); diff --git a/src/data/graphics/trainers.h b/src/data/graphics/trainers.h index bfc3283ad3..eb107b34e8 100644 --- a/src/data/graphics/trainers.h +++ b/src/data/graphics/trainers.h @@ -1,283 +1,283 @@ #include "constants/trainers.h" #include "data.h" -const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker.4bpp.lz"); +const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker.4bpp.smol"); const u16 gTrainerPalette_Hiker[] = INCBIN_U16("graphics/trainers/front_pics/hiker.gbapal"); -const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m.4bpp.lz"); +const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m.4bpp.smol"); const u16 gTrainerPalette_AquaGruntM[] = INCBIN_U16("graphics/trainers/front_pics/aqua_grunt_m.gbapal"); -const u32 gTrainerFrontPic_PokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_f.4bpp.smol"); const u16 gTrainerPalette_PokemonBreederF[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_breeder_f.gbapal"); -const u32 gTrainerFrontPic_CoolTrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_m.4bpp.lz"); +const u32 gTrainerFrontPic_CoolTrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_m.4bpp.smol"); const u16 gTrainerPalette_CoolTrainerM[] = INCBIN_U16("graphics/trainers/front_pics/cooltrainer_m.gbapal"); -const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper.4bpp.lz"); +const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper.4bpp.smol"); const u16 gTrainerPalette_BirdKeeper[] = INCBIN_U16("graphics/trainers/front_pics/bird_keeper.gbapal"); -const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector.4bpp.lz"); +const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector.4bpp.smol"); const u16 gTrainerPalette_Collector[] = INCBIN_U16("graphics/trainers/front_pics/collector.gbapal"); -const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f.4bpp.lz"); +const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f.4bpp.smol"); const u16 gTrainerPalette_AquaGruntF[] = INCBIN_U16("graphics/trainers/front_pics/aqua_grunt_f.gbapal"); -const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m.4bpp.smol"); const u16 gTrainerPalette_SwimmerM[] = INCBIN_U16("graphics/trainers/front_pics/swimmer_m.gbapal"); -const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m.4bpp.smol"); const u16 gTrainerPalette_MagmaGruntM[] = INCBIN_U16("graphics/trainers/front_pics/magma_grunt_m.gbapal"); -const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m.4bpp.lz"); +const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m.4bpp.smol"); const u16 gTrainerPalette_ExpertM[] = INCBIN_U16("graphics/trainers/front_pics/expert_m.gbapal"); -const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m.4bpp.lz"); +const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m.4bpp.smol"); const u16 gTrainerPalette_AquaAdminM[] = INCBIN_U16("graphics/trainers/front_pics/aqua_admin_m.gbapal"); -const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt.4bpp.lz"); +const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt.4bpp.smol"); const u16 gTrainerPalette_BlackBelt[] = INCBIN_U16("graphics/trainers/front_pics/black_belt.gbapal"); -const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f.4bpp.lz"); +const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f.4bpp.smol"); const u16 gTrainerPalette_AquaAdminF[] = INCBIN_U16("graphics/trainers/front_pics/aqua_admin_f.gbapal"); -const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie.4bpp.lz"); +const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie.4bpp.smol"); const u16 gTrainerPalette_AquaLeaderArchie[] = INCBIN_U16("graphics/trainers/front_pics/aqua_leader_archie.gbapal"); -const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac.4bpp.smol"); const u16 gTrainerPalette_HexManiac[] = INCBIN_U16("graphics/trainers/front_pics/hex_maniac.gbapal"); -const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady.4bpp.lz"); +const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady.4bpp.smol"); const u16 gTrainerPalette_AromaLady[] = INCBIN_U16("graphics/trainers/front_pics/aroma_lady.gbapal"); -const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac.4bpp.smol"); const u16 gTrainerPalette_RuinManiac[] = INCBIN_U16("graphics/trainers/front_pics/ruin_maniac.gbapal"); -const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer.4bpp.lz"); +const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer.4bpp.smol"); const u16 gTrainerPalette_Interviewer[] = INCBIN_U16("graphics/trainers/front_pics/interviewer.gbapal"); -const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f.4bpp.lz"); +const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f.4bpp.smol"); const u16 gTrainerPalette_TuberF[] = INCBIN_U16("graphics/trainers/front_pics/tuber_f.gbapal"); -const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m.4bpp.lz"); +const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m.4bpp.smol"); const u16 gTrainerPalette_TuberM[] = INCBIN_U16("graphics/trainers/front_pics/tuber_m.gbapal"); -const u32 gTrainerFrontPic_CoolTrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_f.4bpp.lz"); +const u32 gTrainerFrontPic_CoolTrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cooltrainer_f.4bpp.smol"); const u16 gTrainerPalette_CoolTrainerF[] = INCBIN_U16("graphics/trainers/front_pics/cooltrainer_f.gbapal"); -const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady.4bpp.lz"); +const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady.4bpp.smol"); const u16 gTrainerPalette_Lady[] = INCBIN_U16("graphics/trainers/front_pics/lady.gbapal"); -const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty.4bpp.lz"); +const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty.4bpp.smol"); const u16 gTrainerPalette_Beauty[] = INCBIN_U16("graphics/trainers/front_pics/beauty.gbapal"); -const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy.4bpp.lz"); +const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy.4bpp.smol"); const u16 gTrainerPalette_RichBoy[] = INCBIN_U16("graphics/trainers/front_pics/rich_boy.gbapal"); -const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f.4bpp.lz"); +const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f.4bpp.smol"); const u16 gTrainerPalette_ExpertF[] = INCBIN_U16("graphics/trainers/front_pics/expert_f.gbapal"); -const u32 gTrainerFrontPic_Pokemaniac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac.4bpp.lz"); +const u32 gTrainerFrontPic_Pokemaniac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac.4bpp.smol"); const u16 gTrainerPalette_Pokemaniac[] = INCBIN_U16("graphics/trainers/front_pics/pokemaniac.gbapal"); -const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f.4bpp.smol"); const u16 gTrainerPalette_MagmaGruntF[] = INCBIN_U16("graphics/trainers/front_pics/magma_grunt_f.gbapal"); -const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist.4bpp.lz"); +const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist.4bpp.smol"); const u16 gTrainerPalette_Guitarist[] = INCBIN_U16("graphics/trainers/front_pics/guitarist.gbapal"); -const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler.4bpp.lz"); +const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler.4bpp.smol"); const u16 gTrainerPalette_Kindler[] = INCBIN_U16("graphics/trainers/front_pics/kindler.gbapal"); -const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper.4bpp.lz"); +const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper.4bpp.smol"); const u16 gTrainerPalette_Camper[] = INCBIN_U16("graphics/trainers/front_pics/camper.gbapal"); -const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker.4bpp.lz"); +const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker.4bpp.smol"); const u16 gTrainerPalette_Picnicker[] = INCBIN_U16("graphics/trainers/front_pics/picnicker.gbapal"); -const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac.4bpp.lz"); +const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac.4bpp.smol"); const u16 gTrainerPalette_BugManiac[] = INCBIN_U16("graphics/trainers/front_pics/bug_maniac.gbapal"); -const u32 gTrainerFrontPic_PokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_m.4bpp.smol"); const u16 gTrainerPalette_PokemonBreederM[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_breeder_m.gbapal"); -const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m.4bpp.lz"); +const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m.4bpp.smol"); const u16 gTrainerPalette_PsychicM[] = INCBIN_U16("graphics/trainers/front_pics/psychic_m.gbapal"); -const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f.4bpp.lz"); +const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f.4bpp.smol"); const u16 gTrainerPalette_PsychicF[] = INCBIN_U16("graphics/trainers/front_pics/psychic_f.gbapal"); -const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman.4bpp.lz"); +const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman.4bpp.smol"); const u16 gTrainerPalette_Gentleman[] = INCBIN_U16("graphics/trainers/front_pics/gentleman.gbapal"); -const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney.4bpp.smol"); const u16 gTrainerPalette_EliteFourSidney[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_sidney.gbapal"); -const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe.4bpp.smol"); const u16 gTrainerPalette_EliteFourPhoebe[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_phoebe.gbapal"); -const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia.4bpp.smol"); const u16 gTrainerPalette_EliteFourGlacia[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_glacia.gbapal"); -const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake.4bpp.lz"); +const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake.4bpp.smol"); const u16 gTrainerPalette_EliteFourDrake[] = INCBIN_U16("graphics/trainers/front_pics/elite_four_drake.gbapal"); -const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne.4bpp.smol"); const u16 gTrainerPalette_LeaderRoxanne[] = INCBIN_U16("graphics/trainers/front_pics/leader_roxanne.gbapal"); -const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly.4bpp.smol"); const u16 gTrainerPalette_LeaderBrawly[] = INCBIN_U16("graphics/trainers/front_pics/leader_brawly.gbapal"); -const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson.4bpp.smol"); const u16 gTrainerPalette_LeaderWattson[] = INCBIN_U16("graphics/trainers/front_pics/leader_wattson.gbapal"); -const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery.4bpp.smol"); const u16 gTrainerPalette_LeaderFlannery[] = INCBIN_U16("graphics/trainers/front_pics/leader_flannery.gbapal"); -const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman.4bpp.smol"); const u16 gTrainerPalette_LeaderNorman[] = INCBIN_U16("graphics/trainers/front_pics/leader_norman.gbapal"); -const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona.4bpp.smol"); const u16 gTrainerPalette_LeaderWinona[] = INCBIN_U16("graphics/trainers/front_pics/leader_winona.gbapal"); -const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza.4bpp.smol"); const u16 gTrainerPalette_LeaderTateAndLiza[] = INCBIN_U16("graphics/trainers/front_pics/leader_tate_and_liza.gbapal"); -const u32 gTrainerFrontPic_LeaderJuan[] = INCBIN_U32("graphics/trainers/front_pics/leader_juan.4bpp.lz"); +const u32 gTrainerFrontPic_LeaderJuan[] = INCBIN_U32("graphics/trainers/front_pics/leader_juan.4bpp.smol"); const u16 gTrainerPalette_LeaderJuan[] = INCBIN_U16("graphics/trainers/front_pics/leader_juan.gbapal"); -const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m.4bpp.lz"); +const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m.4bpp.smol"); const u16 gTrainerPalette_SchoolKidM[] = INCBIN_U16("graphics/trainers/front_pics/school_kid_m.gbapal"); -const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f.4bpp.lz"); +const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f.4bpp.smol"); const u16 gTrainerPalette_SchoolKidF[] = INCBIN_U16("graphics/trainers/front_pics/school_kid_f.gbapal"); -const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr.4bpp.lz"); +const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr.4bpp.smol"); const u16 gTrainerPalette_SrAndJr[] = INCBIN_U16("graphics/trainers/front_pics/sr_and_jr.gbapal"); -const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m.4bpp.smol"); const u16 gTrainerPalette_PokefanM[] = INCBIN_U16("graphics/trainers/front_pics/pokefan_m.gbapal"); -const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f.4bpp.smol"); const u16 gTrainerPalette_PokefanF[] = INCBIN_U16("graphics/trainers/front_pics/pokefan_f.gbapal"); -const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster.4bpp.lz"); +const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster.4bpp.smol"); const u16 gTrainerPalette_Youngster[] = INCBIN_U16("graphics/trainers/front_pics/youngster.gbapal"); -const u32 gTrainerFrontPic_ChampionWallace[] = INCBIN_U32("graphics/trainers/front_pics/champion_wallace.4bpp.lz"); +const u32 gTrainerFrontPic_ChampionWallace[] = INCBIN_U32("graphics/trainers/front_pics/champion_wallace.4bpp.smol"); const u16 gTrainerPalette_ChampionWallace[] = INCBIN_U16("graphics/trainers/front_pics/champion_wallace.gbapal"); -const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman.4bpp.lz"); +const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman.4bpp.smol"); const u16 gTrainerPalette_Fisherman[] = INCBIN_U16("graphics/trainers/front_pics/fisherman.gbapal"); -const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_CyclingTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/cycling_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_CyclingTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/cycling_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_RunningTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/running_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_RunningTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/running_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m.4bpp.smol"); const u16 gTrainerPalette_SwimmingTriathleteM[] = INCBIN_U16("graphics/trainers/front_pics/swimming_triathlete_m.gbapal"); -const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f.4bpp.smol"); const u16 gTrainerPalette_SwimmingTriathleteF[] = INCBIN_U16("graphics/trainers/front_pics/swimming_triathlete_f.gbapal"); -const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer.4bpp.lz"); +const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer.4bpp.smol"); const u16 gTrainerPalette_DragonTamer[] = INCBIN_U16("graphics/trainers/front_pics/dragon_tamer.gbapal"); -const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy.4bpp.lz"); +const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy.4bpp.smol"); const u16 gTrainerPalette_NinjaBoy[] = INCBIN_U16("graphics/trainers/front_pics/ninja_boy.gbapal"); -const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl.4bpp.lz"); +const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl.4bpp.smol"); const u16 gTrainerPalette_BattleGirl[] = INCBIN_U16("graphics/trainers/front_pics/battle_girl.gbapal"); -const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady.4bpp.lz"); +const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady.4bpp.smol"); const u16 gTrainerPalette_ParasolLady[] = INCBIN_U16("graphics/trainers/front_pics/parasol_lady.gbapal"); -const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f.4bpp.lz"); +const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f.4bpp.smol"); const u16 gTrainerPalette_SwimmerF[] = INCBIN_U16("graphics/trainers/front_pics/swimmer_f.gbapal"); -const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins.4bpp.lz"); +const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins.4bpp.smol"); const u16 gTrainerPalette_Twins[] = INCBIN_U16("graphics/trainers/front_pics/twins.gbapal"); -const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor.4bpp.lz"); +const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor.4bpp.smol"); const u16 gTrainerPalette_Sailor[] = INCBIN_U16("graphics/trainers/front_pics/sailor.gbapal"); -const u32 gTrainerFrontPic_MagmaAdmin[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaAdmin[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin.4bpp.smol"); const u16 gTrainerPalette_MagmaAdmin[] = INCBIN_U16("graphics/trainers/front_pics/magma_admin.gbapal"); -const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally.4bpp.lz"); +const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally.4bpp.smol"); const u16 gTrainerPalette_Wally[] = INCBIN_U16("graphics/trainers/palettes/wally.gbapal"); -const u32 gTrainerFrontPic_Brendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan.4bpp.lz"); +const u32 gTrainerFrontPic_Brendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan.4bpp.smol"); const u16 gTrainerPalette_Brendan[] = INCBIN_U16("graphics/trainers/palettes/brendan.gbapal"); -const u32 gTrainerFrontPic_May[] = INCBIN_U32("graphics/trainers/front_pics/may.4bpp.lz"); +const u32 gTrainerFrontPic_May[] = INCBIN_U32("graphics/trainers/front_pics/may.4bpp.smol"); const u16 gTrainerPalette_May[] = INCBIN_U16("graphics/trainers/palettes/may.gbapal"); -const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher.4bpp.lz"); +const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher.4bpp.smol"); const u16 gTrainerPalette_BugCatcher[] = INCBIN_U16("graphics/trainers/front_pics/bug_catcher.gbapal"); -const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m.4bpp.smol"); const u16 gTrainerPalette_PokemonRangerM[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_ranger_m.gbapal"); -const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f.4bpp.lz"); +const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f.4bpp.smol"); const u16 gTrainerPalette_PokemonRangerF[] = INCBIN_U16("graphics/trainers/front_pics/pokemon_ranger_f.gbapal"); -const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie.4bpp.lz"); +const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie.4bpp.smol"); const u16 gTrainerPalette_MagmaLeaderMaxie[] = INCBIN_U16("graphics/trainers/front_pics/magma_leader_maxie.gbapal"); -const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass.4bpp.lz"); +const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass.4bpp.smol"); const u16 gTrainerPalette_Lass[] = INCBIN_U16("graphics/trainers/front_pics/lass.gbapal"); -const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple.4bpp.lz"); +const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple.4bpp.smol"); const u16 gTrainerPalette_YoungCouple[] = INCBIN_U16("graphics/trainers/front_pics/young_couple.gbapal"); -const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple.4bpp.lz"); +const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple.4bpp.smol"); const u16 gTrainerPalette_OldCouple[] = INCBIN_U16("graphics/trainers/front_pics/old_couple.gbapal"); -const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro.4bpp.lz"); +const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro.4bpp.smol"); const u16 gTrainerPalette_SisAndBro[] = INCBIN_U16("graphics/trainers/front_pics/sis_and_bro.gbapal"); -const u32 gTrainerFrontPic_Steven[] = INCBIN_U32("graphics/trainers/front_pics/steven.4bpp.lz"); +const u32 gTrainerFrontPic_Steven[] = INCBIN_U32("graphics/trainers/front_pics/steven.4bpp.smol"); const u16 gTrainerPalette_Steven[] = INCBIN_U16("graphics/trainers/front_pics/steven.gbapal"); -const u32 gTrainerFrontPic_SalonMaidenAnabel[] = INCBIN_U32("graphics/trainers/front_pics/salon_maiden_anabel.4bpp.lz"); +const u32 gTrainerFrontPic_SalonMaidenAnabel[] = INCBIN_U32("graphics/trainers/front_pics/salon_maiden_anabel.4bpp.smol"); const u16 gTrainerPalette_SalonMaidenAnabel[] = INCBIN_U16("graphics/trainers/front_pics/salon_maiden_anabel.gbapal"); -const u32 gTrainerFrontPic_DomeAceTucker[] = INCBIN_U32("graphics/trainers/front_pics/dome_ace_tucker.4bpp.lz"); +const u32 gTrainerFrontPic_DomeAceTucker[] = INCBIN_U32("graphics/trainers/front_pics/dome_ace_tucker.4bpp.smol"); const u16 gTrainerPalette_DomeAceTucker[] = INCBIN_U16("graphics/trainers/front_pics/dome_ace_tucker.gbapal"); -const u32 gTrainerFrontPic_PalaceMavenSpenser[] = INCBIN_U32("graphics/trainers/front_pics/palace_maven_spenser.4bpp.lz"); +const u32 gTrainerFrontPic_PalaceMavenSpenser[] = INCBIN_U32("graphics/trainers/front_pics/palace_maven_spenser.4bpp.smol"); const u16 gTrainerPalette_PalaceMavenSpenser[] = INCBIN_U16("graphics/trainers/front_pics/palace_maven_spenser.gbapal"); -const u32 gTrainerFrontPic_ArenaTycoonGreta[] = INCBIN_U32("graphics/trainers/front_pics/arena_tycoon_greta.4bpp.lz"); +const u32 gTrainerFrontPic_ArenaTycoonGreta[] = INCBIN_U32("graphics/trainers/front_pics/arena_tycoon_greta.4bpp.smol"); const u16 gTrainerPalette_ArenaTycoonGreta[] = INCBIN_U16("graphics/trainers/front_pics/arena_tycoon_greta.gbapal"); -const u32 gTrainerFrontPic_FactoryHeadNoland[] = INCBIN_U32("graphics/trainers/front_pics/factory_head_noland.4bpp.lz"); +const u32 gTrainerFrontPic_FactoryHeadNoland[] = INCBIN_U32("graphics/trainers/front_pics/factory_head_noland.4bpp.smol"); const u16 gTrainerPalette_FactoryHeadNoland[] = INCBIN_U16("graphics/trainers/front_pics/factory_head_noland.gbapal"); -const u32 gTrainerFrontPic_PikeQueenLucy[] = INCBIN_U32("graphics/trainers/front_pics/pike_queen_lucy.4bpp.lz"); +const u32 gTrainerFrontPic_PikeQueenLucy[] = INCBIN_U32("graphics/trainers/front_pics/pike_queen_lucy.4bpp.smol"); const u16 gTrainerPalette_PikeQueenLucy[] = INCBIN_U16("graphics/trainers/front_pics/pike_queen_lucy.gbapal"); -const u32 gTrainerFrontPic_PyramidKingBrandon[] = INCBIN_U32("graphics/trainers/front_pics/pyramid_king_brandon.4bpp.lz"); +const u32 gTrainerFrontPic_PyramidKingBrandon[] = INCBIN_U32("graphics/trainers/front_pics/pyramid_king_brandon.4bpp.smol"); const u16 gTrainerPalette_PyramidKingBrandon[] = INCBIN_U16("graphics/trainers/front_pics/pyramid_king_brandon.gbapal"); -const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red.4bpp.lz"); +const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red.4bpp.smol"); const u16 gTrainerPalette_Red[] = INCBIN_U16("graphics/trainers/front_pics/red.gbapal"); -const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf.4bpp.lz"); +const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf.4bpp.smol"); const u16 gTrainerPalette_Leaf[] = INCBIN_U16("graphics/trainers/front_pics/leaf.gbapal"); -const u32 gTrainerFrontPic_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan_rs.4bpp.lz"); +const u32 gTrainerFrontPic_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/front_pics/brendan_rs.4bpp.smol"); const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/brendan_rs.gbapal"); -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.lz"); +const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.smol"); const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/may_rs.gbapal"); const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); diff --git a/src/data/region_map/city_map_tilemaps.h b/src/data/region_map/city_map_tilemaps.h index 11a48c15dc..52df1c0086 100644 --- a/src/data/region_map/city_map_tilemaps.h +++ b/src/data/region_map/city_map_tilemaps.h @@ -1,22 +1,22 @@ -const u32 gPokenavCityMap_Lavaridge_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lavaridge_0.bin.lz"); -const u32 gPokenavCityMap_Fallarbor_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fallarbor_0.bin.lz"); -const u32 gPokenavCityMap_Fortree_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fortree_0.bin.lz"); -const u32 gPokenavCityMap_Slateport_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_0.bin.lz"); -const u32 gPokenavCityMap_Slateport_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_1.bin.lz"); -const u32 gPokenavCityMap_Rustboro_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_0.bin.lz"); -const u32 gPokenavCityMap_Rustboro_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_1.bin.lz"); -const u32 gPokenavCityMap_Pacifidlog_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/pacifidlog_0.bin.lz"); -const u32 gPokenavCityMap_Mauville_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_1.bin.lz"); -const u32 gPokenavCityMap_Mauville_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_0.bin.lz"); -const u32 gPokenavCityMap_Oldale_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/oldale_0.bin.lz"); -const u32 gPokenavCityMap_Lilycove_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_1.bin.lz"); -const u32 gPokenavCityMap_Lilycove_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_0.bin.lz"); -const u32 gPokenavCityMap_Littleroot_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/littleroot_0.bin.lz"); -const u32 gPokenavCityMap_Dewford_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/dewford_0.bin.lz"); -const u32 gPokenavCityMap_Sootopolis_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/sootopolis_0.bin.lz"); -const u32 gPokenavCityMap_EverGrande_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_0.bin.lz"); -const u32 gPokenavCityMap_EverGrande_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_1.bin.lz"); -const u32 gPokenavCityMap_Verdanturf_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/verdanturf_0.bin.lz"); -const u32 gPokenavCityMap_Mossdeep_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_1.bin.lz"); -const u32 gPokenavCityMap_Mossdeep_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_0.bin.lz"); -const u32 gPokenavCityMap_Petalburg_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/petalburg_0.bin.lz"); +const u32 gPokenavCityMap_Lavaridge_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lavaridge_0.bin.smolTM"); +const u32 gPokenavCityMap_Fallarbor_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fallarbor_0.bin.smolTM"); +const u32 gPokenavCityMap_Fortree_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/fortree_0.bin.smolTM"); +const u32 gPokenavCityMap_Slateport_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_0.bin.smolTM"); +const u32 gPokenavCityMap_Slateport_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/slateport_1.bin.smolTM"); +const u32 gPokenavCityMap_Rustboro_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_0.bin.smolTM"); +const u32 gPokenavCityMap_Rustboro_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/rustboro_1.bin.smolTM"); +const u32 gPokenavCityMap_Pacifidlog_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/pacifidlog_0.bin.smolTM"); +const u32 gPokenavCityMap_Mauville_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_1.bin.smolTM"); +const u32 gPokenavCityMap_Mauville_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mauville_0.bin.smolTM"); +const u32 gPokenavCityMap_Oldale_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/oldale_0.bin.smolTM"); +const u32 gPokenavCityMap_Lilycove_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_1.bin.smolTM"); +const u32 gPokenavCityMap_Lilycove_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/lilycove_0.bin.smolTM"); +const u32 gPokenavCityMap_Littleroot_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/littleroot_0.bin.smolTM"); +const u32 gPokenavCityMap_Dewford_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/dewford_0.bin.smolTM"); +const u32 gPokenavCityMap_Sootopolis_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/sootopolis_0.bin.smolTM"); +const u32 gPokenavCityMap_EverGrande_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_0.bin.smolTM"); +const u32 gPokenavCityMap_EverGrande_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/ever_grande_1.bin.smolTM"); +const u32 gPokenavCityMap_Verdanturf_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/verdanturf_0.bin.smolTM"); +const u32 gPokenavCityMap_Mossdeep_1[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_1.bin.smolTM"); +const u32 gPokenavCityMap_Mossdeep_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/mossdeep_0.bin.smolTM"); +const u32 gPokenavCityMap_Petalburg_0[] = INCBIN_U32("graphics/pokenav/region_map/city_maps/petalburg_0.bin.smolTM"); diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index a4cec62cf5..a8b2d7593b 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -1,4 +1,4 @@ -const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz"); +const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Petalburg[][16] = { @@ -20,7 +20,7 @@ const u16 gTilesetPalettes_Petalburg[][16] = INCBIN_U16("data/tilesets/secondary/petalburg/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.lz"); +const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Rustboro[][16] = { @@ -42,7 +42,7 @@ const u16 gTilesetPalettes_Rustboro[][16] = INCBIN_U16("data/tilesets/secondary/rustboro/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.lz"); +const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Dewford[][16] = { @@ -64,7 +64,7 @@ const u16 gTilesetPalettes_Dewford[][16] = INCBIN_U16("data/tilesets/secondary/dewford/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.lz"); +const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Slateport[][16] = { @@ -86,7 +86,7 @@ const u16 gTilesetPalettes_Slateport[][16] = INCBIN_U16("data/tilesets/secondary/slateport/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.lz"); +const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Mauville[][16] = { @@ -108,7 +108,7 @@ const u16 gTilesetPalettes_Mauville[][16] = INCBIN_U16("data/tilesets/secondary/mauville/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lavaridge[][16] = { @@ -130,7 +130,7 @@ const u16 gTilesetPalettes_Lavaridge[][16] = INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.lz"); +const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Fallarbor[][16] = { @@ -152,7 +152,7 @@ const u16 gTilesetPalettes_Fallarbor[][16] = INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.lz"); +const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Fortree[][16] = { @@ -174,7 +174,7 @@ const u16 gTilesetPalettes_Fortree[][16] = INCBIN_U16("data/tilesets/secondary/fortree/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lilycove[][16] = { @@ -196,7 +196,7 @@ const u16 gTilesetPalettes_Lilycove[][16] = INCBIN_U16("data/tilesets/secondary/lilycove/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.lz"); +const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Mossdeep[][16] = { @@ -218,7 +218,7 @@ const u16 gTilesetPalettes_Mossdeep[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/15.gbapal"), }; -const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.lz"); +const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_EverGrande[][16] = { @@ -240,7 +240,7 @@ const u16 gTilesetPalettes_EverGrande[][16] = INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.lz"); +const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Pacifidlog[][16] = { @@ -262,7 +262,7 @@ const u16 gTilesetPalettes_Pacifidlog[][16] = INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.lz"); +const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Sootopolis[][16] = { @@ -284,7 +284,7 @@ const u16 gTilesetPalettes_Sootopolis[][16] = INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = { @@ -306,7 +306,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = { @@ -328,7 +328,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/15.gbapal"), }; -const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.smol"); const u16 gTilesetPalettes_InsideBuilding[][16] = { @@ -350,7 +350,7 @@ const u16 gTilesetPalettes_InsideBuilding[][16] = INCBIN_U16("data/tilesets/primary/building/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Shop[][16] = { @@ -372,7 +372,7 @@ const u16 gTilesetPalettes_Shop[][16] = INCBIN_U16("data/tilesets/secondary/shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonCenter[][16] = { @@ -394,7 +394,7 @@ const u16 gTilesetPalettes_PokemonCenter[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); +const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Cave[][16] = { @@ -416,7 +416,7 @@ const u16 gTilesetPalettes_Cave[][16] = INCBIN_U16("data/tilesets/secondary/cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonSchool[][16] = { @@ -438,7 +438,7 @@ const u16 gTilesetPalettes_PokemonSchool[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonFanClub[][16] = { @@ -460,7 +460,7 @@ const u16 gTilesetPalettes_PokemonFanClub[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.lz"); +const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Unused1[][16] = { @@ -482,7 +482,7 @@ const u16 gTilesetPalettes_Unused1[][16] = INCBIN_U16("data/tilesets/secondary/unused_1/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.lz"); +const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MeteorFalls[][16] = { @@ -504,7 +504,7 @@ const u16 gTilesetPalettes_MeteorFalls[][16] = INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/15.gbapal"), }; -const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.lz"); +const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_OceanicMuseum[][16] = { @@ -549,7 +549,7 @@ const u16 gTilesetPalettes_CableClub[][16] = INCBIN_U16("data/tilesets/secondary/cable_club/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SeashoreHouse[][16] = { @@ -571,7 +571,7 @@ const u16 gTilesetPalettes_SeashoreHouse[][16] = INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = { @@ -593,7 +593,7 @@ const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.lz"); +const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PokemonDayCare[][16] = { @@ -615,7 +615,7 @@ const u16 gTilesetPalettes_PokemonDayCare[][16] = INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.lz"); +const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Facility[][16] = { @@ -637,7 +637,7 @@ const u16 gTilesetPalettes_Facility[][16] = INCBIN_U16("data/tilesets/secondary/facility/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); +const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BikeShop[][16] = { @@ -659,7 +659,7 @@ const u16 gTilesetPalettes_BikeShop[][16] = INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/15.gbapal"), }; -const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.lz"); +const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_RusturfTunnel[][16] = { @@ -681,7 +681,7 @@ const u16 gTilesetPalettes_RusturfTunnel[][16] = INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = { @@ -703,7 +703,7 @@ const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseTree[][16] = { @@ -725,7 +725,7 @@ const u16 gTilesetPalettes_SecretBaseTree[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseShrub[][16] = { @@ -747,7 +747,7 @@ const u16 gTilesetPalettes_SecretBaseShrub[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = { @@ -769,7 +769,7 @@ const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = { @@ -791,7 +791,7 @@ const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.lz"); +const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SecretBaseRedCave[][16] = { @@ -820,7 +820,7 @@ const u32 gTilesetTiles_SecretBaseBlueCave[] = INCBIN_U32("data/tilesets/seconda const u32 gTilesetTiles_SecretBaseYellowCave[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/tiles.4bpp"); const u32 gTilesetTiles_SecretBaseRedCave[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/tiles.4bpp"); -const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_InsideOfTruck[][16] = { @@ -842,7 +842,7 @@ const u16 gTilesetPalettes_InsideOfTruck[][16] = INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.lz"); +const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Contest[][16] = { @@ -864,7 +864,7 @@ const u16 gTilesetPalettes_Contest[][16] = INCBIN_U16("data/tilesets/secondary/contest/palettes/15.gbapal"), }; -const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.lz"); +const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_LilycoveMuseum[][16] = { @@ -886,7 +886,7 @@ const u16 gTilesetPalettes_LilycoveMuseum[][16] = INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BrendansMaysHouse[][16] = { @@ -908,7 +908,7 @@ const u16 gTilesetPalettes_BrendansMaysHouse[][16] = INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); +const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Lab[][16] = { @@ -930,7 +930,7 @@ const u16 gTilesetPalettes_Lab[][16] = INCBIN_U16("data/tilesets/secondary/lab/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); +const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Underwater[][16] = { @@ -952,7 +952,7 @@ const u16 gTilesetPalettes_Underwater[][16] = INCBIN_U16("data/tilesets/secondary/underwater/palettes/15.gbapal"), }; -const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.lz"); +const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_GenericBuilding[][16] = { @@ -974,7 +974,7 @@ const u16 gTilesetPalettes_GenericBuilding[][16] = INCBIN_U16("data/tilesets/secondary/generic_building/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.lz"); +const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MauvilleGameCorner[][16] = { @@ -996,7 +996,7 @@ const u16 gTilesetPalettes_MauvilleGameCorner[][16] = INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/15.gbapal"), }; -const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.lz"); +const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_Unused2[][16] = { @@ -1018,7 +1018,7 @@ const u16 gTilesetPalettes_Unused2[][16] = INCBIN_U16("data/tilesets/secondary/unused_2/palettes/15.gbapal"), }; -const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_RustboroGym[][16] = { @@ -1040,7 +1040,7 @@ const u16 gTilesetPalettes_RustboroGym[][16] = INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_DewfordGym[][16] = { @@ -1062,7 +1062,7 @@ const u16 gTilesetPalettes_DewfordGym[][16] = INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MauvilleGym[][16] = { @@ -1084,7 +1084,7 @@ const u16 gTilesetPalettes_MauvilleGym[][16] = INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_LavaridgeGym[][16] = { @@ -1106,7 +1106,7 @@ const u16 gTilesetPalettes_LavaridgeGym[][16] = INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_PetalburgGym[][16] = { @@ -1128,7 +1128,7 @@ const u16 gTilesetPalettes_PetalburgGym[][16] = INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_FortreeGym[][16] = { @@ -1150,7 +1150,7 @@ const u16 gTilesetPalettes_FortreeGym[][16] = INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MossdeepGym[][16] = { @@ -1172,7 +1172,7 @@ const u16 gTilesetPalettes_MossdeepGym[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.lz"); +const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_SootopolisGym[][16] = { @@ -1194,7 +1194,7 @@ const u16 gTilesetPalettes_SootopolisGym[][16] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/15.gbapal"), }; -const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.lz"); +const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_TrickHousePuzzle[][16] = { @@ -1216,7 +1216,7 @@ const u16 gTilesetPalettes_TrickHousePuzzle[][16] = INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/15.gbapal"), }; -const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.lz"); +const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_InsideShip[][16] = { @@ -1261,7 +1261,7 @@ const u16 gTilesetPalettes_SecretBase[][16] = INCBIN_U16("data/tilesets/primary/secret_base/palettes/15.gbapal"), }; -const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.lz"); +const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_EliteFour[][16] = { @@ -1283,7 +1283,7 @@ const u16 gTilesetPalettes_EliteFour[][16] = INCBIN_U16("data/tilesets/secondary/elite_four/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontier[][16] = { @@ -1305,7 +1305,7 @@ const u16 gTilesetPalettes_BattleFrontier[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePalace[][16] = { @@ -1327,7 +1327,7 @@ const u16 gTilesetPalettes_BattlePalace[][16] = INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleDome[][16] = { @@ -1349,7 +1349,7 @@ const u16 gTilesetPalettes_BattleDome[][16] = INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFactory[][16] = { @@ -1371,7 +1371,7 @@ const u16 gTilesetPalettes_BattleFactory[][16] = INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePike[][16] = { @@ -1393,7 +1393,7 @@ const u16 gTilesetPalettes_BattlePike[][16] = INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleArena[][16] = { @@ -1415,7 +1415,7 @@ const u16 gTilesetPalettes_BattleArena[][16] = INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattlePyramid[][16] = { @@ -1437,7 +1437,7 @@ const u16 gTilesetPalettes_BattlePyramid[][16] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.lz"); +const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MirageTower[][16] = { @@ -1459,7 +1459,7 @@ const u16 gTilesetPalettes_MirageTower[][16] = INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.lz"); +const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MossdeepGameCorner[][16] = { @@ -1481,7 +1481,7 @@ const u16 gTilesetPalettes_MossdeepGameCorner[][16] = INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/15.gbapal"), }; -const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); +const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_IslandHarbor[][16] = { @@ -1503,7 +1503,7 @@ const u16 gTilesetPalettes_IslandHarbor[][16] = INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/15.gbapal"), }; -const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.lz"); +const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_TrainerHill[][16] = { @@ -1525,7 +1525,7 @@ const u16 gTilesetPalettes_TrainerHill[][16] = INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/15.gbapal"), }; -const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); +const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_NavelRock[][16] = { @@ -1547,7 +1547,7 @@ const u16 gTilesetPalettes_NavelRock[][16] = INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = { @@ -1569,7 +1569,7 @@ const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/15.gbapal"), }; -const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.lz"); +const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_BattleTent[][16] = { @@ -1591,7 +1591,7 @@ const u16 gTilesetPalettes_BattleTent[][16] = INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/15.gbapal"), }; -const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.lz"); +const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.fastSmol"); const u16 gTilesetPalettes_MysteryEventsHouse[][16] = { @@ -1633,4 +1633,4 @@ const u16 gTilesetPalettes_UnionRoom[][16] = INCBIN_U16("data/tilesets/secondary/union_room/palettes/15.gbapal"), }; -const u32 gTilesetTiles_UnionRoom[] = INCBIN_U32("data/tilesets/secondary/union_room/tiles.4bpp.lz"); +const u32 gTilesetTiles_UnionRoom[] = INCBIN_U32("data/tilesets/secondary/union_room/tiles.4bpp.fastSmol"); diff --git a/src/data/trade.h b/src/data/trade.h index ba49f4b874..592ced339d 100644 --- a/src/data/trade.h +++ b/src/data/trade.h @@ -642,12 +642,12 @@ static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_ static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); -static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.lz"); +static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.smolTM"); static const u16 sWirelessSignalSend_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); static const u16 sWirelessSignalRecv_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); static const u16 sWirelessSignalNone_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal"); -static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); -static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); +static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.smol"); +static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.smolTM"); static const struct OamData sOamData_Pokeball = { diff --git a/src/data/wallpapers.h b/src/data/wallpapers.h index d204d44130..e2ef3e8ae3 100644 --- a/src/data/wallpapers.h +++ b/src/data/wallpapers.h @@ -25,127 +25,127 @@ static const u16 sWallpaperPalettes_Forest[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/bg.gbapal"), }; -static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_City[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/city/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/city/bg.gbapal"), }; -static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz"); +static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Desert[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/bg.gbapal"), }; -static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Savanna[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/bg.gbapal"), }; -static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Crag[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/bg.gbapal"), }; -static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Volcano[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/bg.gbapal"), }; -static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Snow[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/bg.gbapal"), }; -static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Cave[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/bg.gbapal"), }; -static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Beach[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/bg.gbapal"), }; -static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Seafloor[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/bg.gbapal"), }; -static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_River[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/river/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/river/bg.gbapal"), }; -static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz"); +static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Sky[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/bg.gbapal"), }; -static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_PolkaDot[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/bg.gbapal"), }; -static const u32 sWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tilemap.bin.lz"); +static const u32 sWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pokecenter[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Machine[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/bg.gbapal"), }; -static const u32 sWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Plain[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/frame.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/bg.gbapal"), }; -static const u32 sWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tilemap.bin.smolTM"); // 12x18 tilemap static const u32 sWallpaperTilemap_Unused[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/unused.bin"); @@ -203,143 +203,143 @@ static const u16 sWallpaperPalettes_Zigzagoon[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), }; -static const u32 sWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Screen[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/screen/bg.gbapal"), }; -static const u32 sWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Diagonal[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/diagonal/bg.gbapal"), }; -static const u32 sWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Block[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), }; -static const u32 sWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pokecenter2[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Frame[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), }; -static const u32 sWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Blank[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), }; -static const u32 sWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Circles[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/circles/bg.gbapal"), }; -static const u32 sWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Azumarill[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/azumarill/bg.gbapal"), }; -static const u32 sWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Pikachu[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/pikachu/bg.gbapal"), }; -static const u32 sWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Legendary[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/legendary/bg.gbapal"), }; -static const u32 sWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Dusclops[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/dusclops/bg.gbapal"), }; -static const u32 sWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Ludicolo[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/ludicolo/bg.gbapal"), }; -static const u32 sWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tilemap.bin.smolTM"); static const u16 sWallpaperPalettes_Whiscash[][16] = { INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), INCBIN_U16("graphics/pokemon_storage/wallpapers/whiscash/bg.gbapal"), }; -static const u32 sWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tiles.4bpp.lz"); -static const u32 sWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tilemap.bin.lz"); +static const u32 sWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tiles.4bpp.smol"); +static const u32 sWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tilemap.bin.smolTM"); -static const u32 sWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/aqua.4bpp.lz"); -static const u32 sWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/heart.4bpp.lz"); -static const u32 sWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/five_star.4bpp.lz"); -static const u32 sWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/brick.4bpp.lz"); -static const u32 sWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_star.4bpp.lz"); -static const u32 sWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/asterisk.4bpp.lz"); -static const u32 sWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/dot.4bpp.lz"); -static const u32 sWallpaperIcon_CrossJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross_japan.4bpp.lz"); -static const u32 sWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/line_circle.4bpp.lz"); -static const u32 sWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pokeball.4bpp.lz"); -static const u32 sWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/maze.4bpp.lz"); -static const u32 sWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/footprint.4bpp.lz"); -static const u32 sWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/big_asterisk.4bpp.lz"); -static const u32 sWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/circle.4bpp.lz"); -static const u32 sWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/koffing.4bpp.lz"); -static const u32 sWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/ribbon.4bpp.lz"); -static const u32 sWallpaperIcon_BoltJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt_japan.4bpp.lz"); -static const u32 sWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_circles.4bpp.lz"); -static const u32 sWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/lotad.4bpp.lz"); -static const u32 sWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/crystal.4bpp.lz"); -static const u32 sWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pichu.4bpp.lz"); -static const u32 sWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/diglett.4bpp.lz"); -static const u32 sWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/luvdisc.4bpp.lz"); -static const u32 sWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/star_in_circle.4bpp.lz"); -static const u32 sWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/spinda.4bpp.lz"); -static const u32 sWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/latis.4bpp.lz"); -static const u32 sWallpaperIcon_PlusleJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle_japan.4bpp.lz"); -static const u32 sWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/minun.4bpp.lz"); -static const u32 sWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/togepi.4bpp.lz"); -static const u32 sWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/magma.4bpp.lz"); +static const u32 sWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/aqua.4bpp.smol"); +static const u32 sWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/heart.4bpp.smol"); +static const u32 sWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/five_star.4bpp.smol"); +static const u32 sWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/brick.4bpp.smol"); +static const u32 sWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_star.4bpp.smol"); +static const u32 sWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/asterisk.4bpp.smol"); +static const u32 sWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/dot.4bpp.smol"); +static const u32 sWallpaperIcon_CrossJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross_japan.4bpp.smol"); +static const u32 sWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/line_circle.4bpp.smol"); +static const u32 sWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pokeball.4bpp.smol"); +static const u32 sWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/maze.4bpp.smol"); +static const u32 sWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/footprint.4bpp.smol"); +static const u32 sWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/big_asterisk.4bpp.smol"); +static const u32 sWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/circle.4bpp.smol"); +static const u32 sWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/koffing.4bpp.smol"); +static const u32 sWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/ribbon.4bpp.smol"); +static const u32 sWallpaperIcon_BoltJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt_japan.4bpp.smol"); +static const u32 sWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_circles.4bpp.smol"); +static const u32 sWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/lotad.4bpp.smol"); +static const u32 sWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/crystal.4bpp.smol"); +static const u32 sWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pichu.4bpp.smol"); +static const u32 sWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/diglett.4bpp.smol"); +static const u32 sWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/luvdisc.4bpp.smol"); +static const u32 sWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/star_in_circle.4bpp.smol"); +static const u32 sWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/spinda.4bpp.smol"); +static const u32 sWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/latis.4bpp.smol"); +static const u32 sWallpaperIcon_PlusleJapan[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle_japan.4bpp.smol"); +static const u32 sWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/minun.4bpp.smol"); +static const u32 sWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/togepi.4bpp.smol"); +static const u32 sWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/magma.4bpp.smol"); static const struct Wallpaper sWaldaWallpapers[] = { diff --git a/src/decompress.c b/src/decompress.c index f4e43e3cf6..3de5a9ce31 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -243,7 +243,7 @@ u32 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer) { - LZ77UnCompWram(src->data, buffer); + DecompressDataWithHeaderWram(src->data, buffer); } void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 personality) diff --git a/src/dexnav.c b/src/dexnav.c index 6857de210c..61906fabaa 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -164,21 +164,21 @@ static void DrawHiddenSearchWindow(u8 width); //// Const Data // gui image data -static const u32 sDexNavGuiTiles[] = INCBIN_U32("graphics/dexnav/gui_tiles.4bpp.lz"); -static const u32 sDexNavGuiTilemap[] = INCBIN_U32("graphics/dexnav/gui_tilemap.bin.lz"); +static const u32 sDexNavGuiTiles[] = INCBIN_U32("graphics/dexnav/gui_tiles.4bpp.smol"); +static const u32 sDexNavGuiTilemap[] = INCBIN_U32("graphics/dexnav/gui_tilemap.bin.smolTM"); static const u32 sDexNavGuiPal[] = INCBIN_U32("graphics/dexnav/gui.gbapal"); -static const u32 sSelectionCursorGfx[] = INCBIN_U32("graphics/dexnav/cursor.4bpp.lz"); +static const u32 sSelectionCursorGfx[] = INCBIN_U32("graphics/dexnav/cursor.4bpp.smol"); static const u16 sSelectionCursorPal[] = INCBIN_U16("graphics/dexnav/cursor.gbapal"); -static const u32 sCapturedAllMonsTiles[] = INCBIN_U32("graphics/dexnav/captured_all.4bpp.lz"); //uses selection cursor pal +static const u32 sCapturedAllMonsTiles[] = INCBIN_U32("graphics/dexnav/captured_all.4bpp.smol"); //uses selection cursor pal -static const u32 sNoDataGfx[] = INCBIN_U32("graphics/dexnav/no_data.4bpp.lz"); +static const u32 sNoDataGfx[] = INCBIN_U32("graphics/dexnav/no_data.4bpp.smol"); // searching image data -static const u32 sPotentialStarGfx[] = INCBIN_U32("graphics/dexnav/star.4bpp.lz"); -static const u32 sHiddenSearchIconGfx[] = INCBIN_U32("graphics/dexnav/hidden_search.4bpp.lz"); -static const u32 sOwnedIconGfx[] = INCBIN_U32("graphics/dexnav/owned_icon.4bpp.lz"); -static const u32 sHiddenMonIconGfx[] = INCBIN_U32("graphics/dexnav/hidden.4bpp.lz"); +static const u32 sPotentialStarGfx[] = INCBIN_U32("graphics/dexnav/star.4bpp.smol"); +static const u32 sHiddenSearchIconGfx[] = INCBIN_U32("graphics/dexnav/hidden_search.4bpp.smol"); +static const u32 sOwnedIconGfx[] = INCBIN_U32("graphics/dexnav/owned_icon.4bpp.smol"); +static const u32 sHiddenMonIconGfx[] = INCBIN_U32("graphics/dexnav/hidden.4bpp.smol"); // strings static const u8 sText_DexNav_NoInfo[] = _("--------"); diff --git a/src/diploma.c b/src/diploma.c index 50284f7cc6..80b0cb42ef 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -44,8 +44,8 @@ static const u16 sDiplomaPalettes[][16] = INCBIN_U16("graphics/diploma/hoenn.gbapal"), }; -static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.lz"); -static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.lz"); +static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.smolTM"); +static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.smol"); void CB2_ShowDiploma(void) { diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 0393afae8b..8f29f498f0 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -559,16 +559,16 @@ static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tre "graphics/dodrio_berry_picking/shiny.gbapal", "graphics/dodrio_berry_picking/status.gbapal", "graphics/dodrio_berry_picking/berries.gbapal", - "graphics/dodrio_berry_picking/berries.4bpp.lz", + "graphics/dodrio_berry_picking/berries.4bpp.smol", "graphics/dodrio_berry_picking/cloud.gbapal", - "graphics/dodrio_berry_picking/bg.4bpp.lz", - "graphics/dodrio_berry_picking/tree_border.4bpp.lz", - "graphics/dodrio_berry_picking/status.4bpp.lz", - "graphics/dodrio_berry_picking/cloud.4bpp.lz", - "graphics/dodrio_berry_picking/dodrio.4bpp.lz", - "graphics/dodrio_berry_picking/bg.bin.lz", - "graphics/dodrio_berry_picking/tree_border_right.bin.lz", - "graphics/dodrio_berry_picking/tree_border_left.bin.lz"); + "graphics/dodrio_berry_picking/bg.4bpp.smol", + "graphics/dodrio_berry_picking/tree_border.4bpp.smol", + "graphics/dodrio_berry_picking/status.4bpp.smol", + "graphics/dodrio_berry_picking/cloud.4bpp.smol", + "graphics/dodrio_berry_picking/dodrio.4bpp.smol", + "graphics/dodrio_berry_picking/bg.bin.smolTM", + "graphics/dodrio_berry_picking/tree_border_right.bin.smolTM", + "graphics/dodrio_berry_picking/tree_border_left.bin.smolTM"); static const u8 sBerryFallDelays[][3] = @@ -3599,16 +3599,16 @@ static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_ static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); static const u16 sBerries_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/berries.gbapal"); -static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.lz"); +static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.smol"); static const u16 sCloud_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/cloud.gbapal"); -static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.lz"); -static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.lz"); -static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.lz"); -static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.lz"); -static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.lz"); -static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.lz"); -static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.lz"); -static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.lz"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.smol"); +static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.smol"); +static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.smol"); +static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.smol"); +static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.smol"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.smolTM"); +static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.smolTM"); +static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.smolTM"); static const struct OamData sOamData_Dodrio = { diff --git a/src/easy_chat.c b/src/easy_chat.c index 0de7abad25..7bb3107120 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -714,10 +714,10 @@ static const u32 sStartSelectButtons_Gfx[] = INCBIN_U32("graphics/easy_chat/star // on screen the interview_frame gfx was shown behind them. // In Emerald all Easy Chat screens have a filled background, so these gfx go unused static const u16 sRSInterviewFrame_Pal[] = INCBIN_U16("graphics/easy_chat/interview_frame.gbapal"); -static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.lz"); +static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.smol"); static const u16 sTextInputFrameOrange_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_orange.gbapal"); static const u16 sTextInputFrameGreen_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_green.gbapal"); -static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.lz"); +static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.smol"); static const u16 sTitleText_Pal[] = INCBIN_U16("graphics/easy_chat/title_text.gbapal"); static const u16 sText_Pal[] = INCBIN_U16("graphics/easy_chat/text.gbapal"); diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index 1568c18d5f..f05cd8c916 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -39,7 +39,7 @@ static void EndOnPostEvoMon(u8 taskId); #define TAG_SPARKLE 1001 static const u16 sEvoSparkle_Pal[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); -static const u32 sEvoSparkle_Gfx[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.lz"); +static const u32 sEvoSparkle_Gfx[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.smol"); static const struct CompressedSpriteSheet sEvoSparkleSpriteSheets[] = { diff --git a/src/evolution_scene.c b/src/evolution_scene.c index d0dbb688fa..73f8c78527 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -67,9 +67,9 @@ static void Task_AnimateBg(u8 taskId); static void RestoreBgAfterAnim(void); static const u16 sUnusedPal1[] = INCBIN_U16("graphics/evolution_scene/unused_1.gbapal"); -static const u32 sBgAnim_Gfx[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); -static const u32 sBgAnim_Inner_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_inner.bin.lz"); -static const u32 sBgAnim_Outer_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_outer.bin.lz"); +static const u32 sBgAnim_Gfx[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.smol"); +static const u32 sBgAnim_Inner_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_inner.bin.smolTM"); +static const u32 sBgAnim_Outer_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_outer.bin.smolTM"); static const u16 sBgAnim_Intro_Pal[] = INCBIN_U16("graphics/evolution_scene/bg_anim_intro.gbapal"); static const u16 sUnusedPal2[] = INCBIN_U16("graphics/evolution_scene/unused_2.gbapal"); static const u16 sUnusedPal3[] = INCBIN_U16("graphics/evolution_scene/unused_3.gbapal"); diff --git a/src/expansion_intro.c b/src/expansion_intro.c index 668661e8dd..d7b4cd7154 100644 --- a/src/expansion_intro.c +++ b/src/expansion_intro.c @@ -52,13 +52,13 @@ enum ANIM_DIZZY_DIZZY }; -static const u32 sBgTiles_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.4bpp.lz"); -static const u32 sBgTiles_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.8bpp.lz"); -static const u32 sBgMap_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.bin.lz"); -static const u32 sBgMap_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.bin.lz"); +static const u32 sBgTiles_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.4bpp.smol"); +static const u32 sBgTiles_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.8bpp.smol"); +static const u32 sBgMap_PoweredBy[] = INCBIN_U32("graphics/expansion_intro/powered_by.bin.smolTM"); +static const u32 sBgMap_RhhCredits[] = INCBIN_U32("graphics/expansion_intro/rhh_credits.bin.smolTM"); static const u16 sBgPal_Credits[] = INCBIN_U16("graphics/expansion_intro/credits.gbapal"); -static const u32 sSpriteTiles_DizzyEgg[] = INCBIN_U32("graphics/expansion_intro/sprites/dizzy_egg.4bpp.lz"); -static const u32 sSpriteTiles_Porygon[] = INCBIN_U32("graphics/expansion_intro/sprites/porygon.4bpp.lz"); +static const u32 sSpriteTiles_DizzyEgg[] = INCBIN_U32("graphics/expansion_intro/sprites/dizzy_egg.4bpp.smol"); +static const u32 sSpriteTiles_Porygon[] = INCBIN_U32("graphics/expansion_intro/sprites/porygon.4bpp.smol"); static const u16 sSpritePal_DizzyEgg[] = INCBIN_U16("graphics/expansion_intro/sprites/dizzy_egg.gbapal"); static const u16 sSpritePal_Porygon[] = INCBIN_U16("graphics/expansion_intro/sprites/porygon.gbapal"); static const u16 sSpritePal_PorygonShiny[] = INCBIN_U16("graphics/expansion_intro/sprites/shiny.gbapal"); diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 249163cca7..7ad0d6ddbb 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -67,8 +67,8 @@ static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/cave_tran static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/cave_transition/enter.gbapal"); -static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.lz"); -static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.lz"); +static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.smolTM"); +static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.smol"); bool32 SetUpFieldMove_Flash(void) { diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 12bb1f3ea7..33ec2e2375 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -178,15 +178,15 @@ static void SpriteCB_PlayerHead(struct Sprite *); static const u16 sMaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads.gbapal"); static const u16 sFemaleHead_Pal[] = INCBIN_U16("graphics/frontier_pass/map_heads_female.gbapal"); -static const u32 sMapScreen_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.lz"); -static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.lz"); -static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.lz"); -static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz"); -static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz"); -static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz"); +static const u32 sMapScreen_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.smol"); +static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.smol"); +static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.smol"); +static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.smol"); +static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.smolTM"); +static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.smolTM"); static const u32 sCardBall_Filled_Tilemap[] = INCBIN_U32("graphics/frontier_pass/card_ball_filled.bin"); // Unused -static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz"); -static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz"); +static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.smolTM"); +static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.smolTM"); static const s16 sBgAffineCoords[][2] = { diff --git a/src/graphics.c b/src/graphics.c index 97acda7732..9289ac997f 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1,318 +1,318 @@ #include "global.h" -const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.lz"); +const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.smol"); const u16 gBattleTextboxPalette[] = INCBIN_U16("graphics/battle_interface/textbox.gbapal"); -const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/battle_interface/textbox_map.bin.lz"); +const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/battle_interface/textbox_map.bin.smolTM"); -const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.lz"); // japanese table and bunch of stuff -const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.lz"); +const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.smol"); // japanese table and bunch of stuff +const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.smolTM"); const u16 gUnusedPal_OldCharmap[] = INCBIN_U16("graphics/unused/old_charmap.gbapal"); -const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz"); +const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.smol"); const u16 gSmokescreenImpactPalette[] = INCBIN_U16("graphics/battle_anims/sprites/smokescreen_impact.gbapal"); #include "data/graphics/pokeballs.h" -const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz"); +const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.smol"); // New Battle anims Particles -const u32 gBattleAnimSpriteGfx_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteStreak[] = INCBIN_U16("graphics/battle_anims/sprites/white_streak.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleJab[] = INCBIN_U16("graphics/battle_anims/sprites/purple_jab.gbapal"); const u16 gBattleAnimSpritePal_ToxicSpikes[] = INCBIN_U16("graphics/battle_anims/sprites/toxic_spikes.gbapal"); -const u32 gBattleAnimSpriteGfx_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_EnergyBall[] = INCBIN_U16("graphics/battle_anims/sprites/energy_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaStone[] = INCBIN_U16("graphics/battle_anims/sprites/mega_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U16("graphics/battle_anims/sprites/mega_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/mega_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AlphaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_AlphaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/alpha_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_OmegaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/omega_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U16("graphics/battle_anims/sprites/flash_cannon_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterGun[] = INCBIN_U16("graphics/battle_anims/sprites/water_gun.gbapal"); -const u32 gBattleAnimSpriteGfx_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.4bpp.smol"); const u16 gBattleAnimSpritePal_Punishment[] = INCBIN_U16("graphics/battle_anims/sprites/punishment.gbapal"); -const u32 gBattleAnimSpriteGfx_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.4bpp.smol"); const u16 gBattleAnimSpritePal_QuickGuard[] = INCBIN_U16("graphics/battle_anims/sprites/quick_guard.gbapal"); -const u32 gBattleAnimSpriteGfx_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/alpha_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_AlphaStone[] = INCBIN_U16("graphics/battle_anims/sprites/alpha_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraCrystal[] = INCBIN_U32("graphics/battle_anims/sprites/tera_crystal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraCrystal[] = INCBIN_U32("graphics/battle_anims/sprites/tera_crystal.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraCrystal[] = INCBIN_U16("graphics/battle_anims/sprites/tera_crystal.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraShatter[] = INCBIN_U32("graphics/battle_anims/sprites/tera_shatter.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraShatter[] = INCBIN_U32("graphics/battle_anims/sprites/tera_shatter.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraShatter[] = INCBIN_U16("graphics/battle_anims/sprites/tera_shatter.gbapal"); -const u32 gBattleAnimSpriteGfx_Anchor[] = INCBIN_U32("graphics/battle_anims/sprites/anchor.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Anchor[] = INCBIN_U32("graphics/battle_anims/sprites/anchor.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/apple.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/apple.4bpp.smol"); const u16 gBattleAnimSpritePal_Apple[] = INCBIN_U16("graphics/battle_anims/sprites/apple.gbapal"); -const u32 gBattleAnimSpriteGfx_Arrows[] = INCBIN_U32("graphics/battle_anims/sprites/arrows.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Arrows[] = INCBIN_U32("graphics/battle_anims/sprites/arrows.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/assurance_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/assurance_hand.4bpp.smol"); const u16 gBattleAnimSpritePal_AssuranceHand[] = INCBIN_U16("graphics/battle_anims/sprites/assurance_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/aura_sphere.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/aura_sphere.4bpp.smol"); const u16 gBattleAnimSpritePal_AuraSphere[] = INCBIN_U16("graphics/battle_anims/sprites/aura_sphere.gbapal"); const u16 gBattleAnimSpritePal_AvalancheRocks[] = INCBIN_U16("graphics/battle_anims/sprites/avalanche_rocks.gbapal"); -const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/baton_pass_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_NewPokeball[] = INCBIN_U16("graphics/battle_anims/sprites/baton_pass_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Beam[] = INCBIN_U32("graphics/battle_anims/sprites/beam.4bpp.smol"); const u16 gBattleAnimSpritePal_Beam[] = INCBIN_U16("graphics/battle_anims/sprites/beam.gbapal"); -const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/berry_eaten.4bpp.smol"); const u16 gBattleAnimSpritePal_BerryEaten[] = INCBIN_U16("graphics/battle_anims/sprites/berry_eaten.gbapal"); -const u32 gBattleAnimSpriteGfx_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/berry_normal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/berry_normal.4bpp.smol"); const u16 gBattleAnimSpritePal_BerryNormal[] = INCBIN_U16("graphics/battle_anims/sprites/berry_normal.gbapal"); -const u32 gBattleAnimSpriteGfx_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/big_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/big_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_BigRock[] = INCBIN_U16("graphics/battle_anims/sprites/big_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/blacephalon_head.4bpp.smol"); const u16 gBattleAnimSpritePal_BlacephalonHead[] = INCBIN_U16("graphics/battle_anims/sprites/blacephalon_head.gbapal"); -const u32 gBattleAnimSpriteGfx_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BloodMoon[] = INCBIN_U32("graphics/battle_anims/sprites/blood_moon.4bpp.smol"); const u16 gBattleAnimSpritePal_BloodMoon[] = INCBIN_U16("graphics/battle_anims/sprites/blood_moon.gbapal"); const u16 gBattleAnimSpritePal_BlueFlare[] = INCBIN_U16("graphics/battle_anims/sprites/blue_flare.gbapal"); -const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/branch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/branch.4bpp.smol"); const u16 gBattleAnimSpritePal_Branch[] = INCBIN_U16("graphics/battle_anims/sprites/branch.gbapal"); -const u32 gBattleAnimSpriteGfx_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/brine.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/brine.4bpp.smol"); const u16 gBattleAnimSpritePal_Brine[] = INCBIN_U16("graphics/battle_anims/sprites/brine.gbapal"); -const u32 gBattleAnimSpriteGfx_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/chain_link.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/chain_link.4bpp.smol"); const u16 gBattleAnimSpritePal_ChainLink[] = INCBIN_U16("graphics/battle_anims/sprites/chain_link.gbapal"); -const u32 gBattleAnimSpriteGfx_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/chop.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/chop.4bpp.smol"); const u16 gBattleAnimSpritePal_Chop[] = INCBIN_U16("graphics/battle_anims/sprites/chop.gbapal"); -const u32 gBattleAnimSpriteGfx_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/cacoon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/cacoon.4bpp.smol"); const u16 gBattleAnimSpritePal_Cacoon[] = INCBIN_U16("graphics/battle_anims/sprites/cacoon.gbapal"); -const u32 gBattleAnimSpriteGfx_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/confide.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/confide.4bpp.smol"); const u16 gBattleAnimSpritePal_Confide[] = INCBIN_U16("graphics/battle_anims/sprites/confide.gbapal"); -const u32 gBattleAnimSpriteGfx_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/crafty_shield.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/crafty_shield.4bpp.smol"); const u16 gBattleAnimSpritePal_CraftyShield[] = INCBIN_U16("graphics/battle_anims/sprites/crafty_shield.gbapal"); -const u32 gBattleAnimSpriteGfx_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/curse_nail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/curse_nail.4bpp.smol"); const u16 gBattleAnimSpritePal_NewNail[] = INCBIN_U16("graphics/battle_anims/sprites/curse_nail.gbapal"); const u16 gBattleAnimSpritePal_DracoMeteor[] = INCBIN_U16("graphics/battle_anims/sprites/draco_meteor.gbapal"); -const u32 gBattleAnimSpriteGfx_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_DragonPulseRing[] = INCBIN_U16("graphics/battle_anims/sprites/dragon_pulse_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.smol"); const u16 gBattleAnimSpritePal_DreepyMissile[] = INCBIN_U16("graphics/battle_anims/sprites/dreepy_missile.gbapal"); -const u32 gBattleAnimSpriteGfx_DreepyMissileShiny[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DreepyMissileShiny[] = INCBIN_U32("graphics/battle_anims/sprites/dreepy_missile.4bpp.smol"); const u16 gBattleAnimSpritePal_DreepyMissileShiny[] = INCBIN_U16("graphics/battle_anims/sprites/dreepy_missile_shiny.gbapal"); -const u32 gBattleAnimSpriteGfx_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/drill.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/drill.4bpp.smol"); const u16 gBattleAnimSpritePal_Drill[] = INCBIN_U16("graphics/battle_anims/sprites/drill.gbapal"); -const u32 gBattleAnimSpriteGfx_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/embers.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/embers.4bpp.smol"); const u16 gBattleAnimSpritePal_NewEmbers[] = INCBIN_U16("graphics/battle_anims/sprites/embers.gbapal"); -const u32 gBattleAnimSpriteGfx_FairyLockChains[] = INCBIN_U32("graphics/battle_anims/sprites/fairy_lock_chains.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FairyLockChains[] = INCBIN_U32("graphics/battle_anims/sprites/fairy_lock_chains.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/fishies.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/fishies.4bpp.smol"); const u16 gBattleAnimSpritePal_Fishies[] = INCBIN_U16("graphics/battle_anims/sprites/fishies.gbapal"); -const u32 gBattleAnimSpriteGfx_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/fly.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/fly.4bpp.smol"); const u16 gBattleAnimSpritePal_NewFly[] = INCBIN_U16("graphics/battle_anims/sprites/fly.gbapal"); const u16 gBattleAnimSpritePal_FusionFlare[] = INCBIN_U16("graphics/battle_anims/sprites/fusion_flare.gbapal"); const u16 gBattleAnimSpritePal_GarbagePoisonPillar[] = INCBIN_U16("graphics/battle_anims/sprites/garbage_poison_column.gbapal"); -const u32 gBattleAnimSpriteGfx_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/gear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/gear.4bpp.smol"); const u16 gBattleAnimSpritePal_Gear[] = INCBIN_U16("graphics/battle_anims/sprites/gear.gbapal"); -const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/gigavolt_havoc_spear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/gigavolt_havoc_spear.4bpp.smol"); const u16 gBattleAnimSpritePal_GigavoltHavocSpear[] = INCBIN_U16("graphics/battle_anims/sprites/gigavolt_havoc_spear.gbapal"); -const u32 gBattleAnimSpriteGfx_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/golden_apple.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/golden_apple.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldenApple[] = INCBIN_U16("graphics/battle_anims/sprites/golden_apple.gbapal"); const u16 gBattleAnimSpritePal_GreenDrake[] = INCBIN_U16("graphics/battle_anims/sprites/green_drake.gbapal"); -const u32 gBattleAnimSpriteGfx_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewGreenStar[] = INCBIN_U16("graphics/battle_anims/sprites/green_star_new.gbapal"); -const u32 gBattleAnimSpriteGfx_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/heart_stamp.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/heart_stamp.4bpp.smol"); const u16 gBattleAnimSpritePal_HeartStamp[] = INCBIN_U16("graphics/battle_anims/sprites/heart_stamp.gbapal"); -const u32 gBattleAnimSpriteGfx_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/hexes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/hexes.4bpp.smol"); const u16 gBattleAnimSpritePal_ZygardeHexes[] = INCBIN_U16("graphics/battle_anims/sprites/hexes.gbapal"); -const u32 gBattleAnimSpriteGfx_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_hand.4bpp.smol"); const u16 gBattleAnimSpritePal_HoopaHand[] = INCBIN_U16("graphics/battle_anims/sprites/hoopa_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/hoopa_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_HoopaRing[] = INCBIN_U16("graphics/battle_anims/sprites/hoopa_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewHornHit[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit_new.gbapal"); -const u32 gBattleAnimSpriteGfx_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/horn_leech.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/horn_leech.4bpp.smol"); const u16 gBattleAnimSpritePal_HornLeech[] = INCBIN_U16("graphics/battle_anims/sprites/horn_leech.gbapal"); -const u32 gBattleAnimSpriteGfx_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/horseshoe_fist.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/horseshoe_fist.4bpp.smol"); const u16 gBattleAnimSpritePal_HorseshoeFist[] = INCBIN_U16("graphics/battle_anims/sprites/horseshoe_fist.gbapal"); -const u32 gBattleAnimSpriteGfx_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/hydro_pump.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/hydro_pump.4bpp.smol"); const u16 gBattleAnimSpritePal_HydroPump[] = INCBIN_U16("graphics/battle_anims/sprites/hydro_pump.gbapal"); -const u32 gBattleAnimSpriteGfx_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/ice_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/ice_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_IceRock[] = INCBIN_U16("graphics/battle_anims/sprites/ice_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/large_spike.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/large_spike.4bpp.smol"); const u16 gBattleAnimSpritePal_LargeSpike[] = INCBIN_U16("graphics/battle_anims/sprites/large_spike.gbapal"); -const u32 gBattleAnimSpriteGfx_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaves.4bpp.smol"); const u16 gBattleAnimSpritePal_NewLeaf[] = INCBIN_U16("graphics/battle_anims/sprites/leaves.gbapal"); -const u32 gBattleAnimSpriteGfx_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/leech_seed.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/leech_seed.4bpp.smol"); const u16 gBattleAnimSpritePal_NewLeechSeed[] = INCBIN_U16("graphics/battle_anims/sprites/leech_seed.gbapal"); -const u32 gBattleAnimSpriteGfx_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_rain.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_rain.4bpp.smol"); const u16 gBattleAnimSpritePal_LightningRain[] = INCBIN_U16("graphics/battle_anims/sprites/lightning_rain.gbapal"); -const u32 gBattleAnimSpriteGfx_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/mean_look.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/mean_look.4bpp.smol"); const u16 gBattleAnimSpritePal_NewEye[] = INCBIN_U16("graphics/battle_anims/sprites/mean_look.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalBits[] = INCBIN_U32("graphics/battle_anims/sprites/metal_bits.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalBits[] = INCBIN_U32("graphics/battle_anims/sprites/metal_bits.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/mud_bomb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/mud_bomb.4bpp.smol"); const u16 gBattleAnimSpritePal_MudBomb[] = INCBIN_U16("graphics/battle_anims/sprites/mud_bomb.gbapal"); -const u32 gBattleAnimSpriteGfx_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/mushroom.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/mushroom.4bpp.smol"); const u16 gBattleAnimSpritePal_Mushroom[] = INCBIN_U16("graphics/battle_anims/sprites/mushroom.gbapal"); const u16 gBattleAnimSpritePal_NaturalGiftRing[] = INCBIN_U16("graphics/battle_anims/sprites/natural_gift_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/necrozma_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/necrozma_star.4bpp.smol"); const u16 gBattleAnimSpritePal_NecrozmaStar[] = INCBIN_U16("graphics/battle_anims/sprites/necrozma_star.gbapal"); const u16 gBattleAnimSpritePal_NewImpact[] = INCBIN_U16("graphics/battle_anims/sprites/impact_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/obstruct.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/obstruct.4bpp.smol"); const u16 gBattleAnimSpritePal_Obstruct[] = INCBIN_U16("graphics/battle_anims/sprites/obstruct.gbapal"); -const u32 gBattleAnimSpriteGfx_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/omega_stone.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/omega_stone.4bpp.smol"); const u16 gBattleAnimSpritePal_OmegaStone[] = INCBIN_U16("graphics/battle_anims/sprites/omega_stone.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/pink_diamond.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/pink_diamond.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkDiamond[] = INCBIN_U16("graphics/battle_anims/sprites/pink_diamond.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/poison_column.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/poison_column.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonColumn[] = INCBIN_U16("graphics/battle_anims/sprites/poison_column.gbapal"); -const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/power_trick.4bpp.smol"); const u16 gBattleAnimSpritePal_PowerTrick[] = INCBIN_U16("graphics/battle_anims/sprites/power_trick.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleChain[] = INCBIN_U32("graphics/battle_anims/sprites/purple_chain.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleChain[] = INCBIN_U16("graphics/battle_anims/sprites/purple_chain.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/purple_drake.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleDrake[] = INCBIN_U16("graphics/battle_anims/sprites/purple_drake.gbapal"); -const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/razor_shell.4bpp.smol"); const u16 gBattleAnimSpritePal_RazorShell[] = INCBIN_U16("graphics/battle_anims/sprites/razor_shell.gbapal"); -const u32 gBattleAnimSpriteGfx_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedExplosion[] = INCBIN_U32("graphics/battle_anims/sprites/red_explosion.4bpp.smol"); const u16 gBattleAnimSpritePal_RedExplosion[] = INCBIN_U16("graphics/battle_anims/sprites/red_explosion.gbapal"); -const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/rock_small.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/rock_small.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewRocks[] = INCBIN_U16("graphics/battle_anims/sprites/rocks_new.gbapal"); -const u32 gBattleAnimSpriteGfx_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/shell_left.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/shell_left.4bpp.smol"); const u16 gBattleAnimSpritePal_ShellLeft[] = INCBIN_U16("graphics/battle_anims/sprites/shell_left.gbapal"); -const u32 gBattleAnimSpriteGfx_ShellRight[] = INCBIN_U32("graphics/battle_anims/sprites/shell_right.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShellRight[] = INCBIN_U32("graphics/battle_anims/sprites/shell_right.4bpp.smol"); const u16 gBattleAnimSpritePal_SpacialRendSlices[] = INCBIN_U16("graphics/battle_anims/sprites/spacial_rend_slices.gbapal"); -const u32 gBattleAnimSpriteGfx_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewSpikes[] = INCBIN_U16("graphics/battle_anims/sprites/spikes_new.gbapal"); -const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/spirit_shackle_arrow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/spirit_shackle_arrow.4bpp.smol"); const u16 gBattleAnimSpritePal_SpiritShackleArrow[] = INCBIN_U16("graphics/battle_anims/sprites/spirit_shackle_arrow.gbapal"); -const u32 gBattleAnimSpriteGfx_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/steam_eruption.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/steam_eruption.4bpp.smol"); const u16 gBattleAnimSpritePal_SteamEruption[] = INCBIN_U16("graphics/battle_anims/sprites/steam_eruption.gbapal"); -const u32 gBattleAnimSpriteGfx_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/steamroller.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/steamroller.4bpp.smol"); const u16 gBattleAnimSpritePal_Steamroller[] = INCBIN_U16("graphics/battle_anims/sprites/steamroller.gbapal"); -const u32 gBattleAnimSpriteGfx_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/stone_pillar.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/stone_pillar.4bpp.smol"); const u16 gBattleAnimSpritePal_StonePillar[] = INCBIN_U16("graphics/battle_anims/sprites/stone_pillar.gbapal"); const u16 gBattleAnimSpritePal_Poltergeist[] = INCBIN_U16("graphics/battle_anims/sprites/poltergeist.gbapal"); const u16 gBattleAnimSpritePal_SteelBeam[] = INCBIN_U16("graphics/battle_anims/sprites/steel_beam.gbapal"); -const u32 gBattleAnimSpriteGfx_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/straight_beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/straight_beam.4bpp.smol"); const u16 gBattleAnimSpritePal_StraightBeam[] = INCBIN_U16("graphics/battle_anims/sprites/straight_beam.gbapal"); const u16 gBattleAnimSpritePal_NewSurf[] = INCBIN_U16("graphics/battle_anims/sprites/surf_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/sword_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/sword_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewSword[] = INCBIN_U16("graphics/battle_anims/sprites/sword_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewTeeth[] = INCBIN_U16("graphics/battle_anims/sprites/teeth_new.gbapal"); -const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet_new.4bpp.smol"); const u16 gBattleAnimSpritePal_NewHandsAndFeet[] = INCBIN_U16("graphics/battle_anims/sprites/hands_and_feet_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/tornado.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/tornado.4bpp.smol"); const u16 gBattleAnimSpritePal_Tornado[] = INCBIN_U16("graphics/battle_anims/sprites/tornado.gbapal"); -const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/z_move_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_ZMoveSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/z_move_symbol.gbapal"); -const u32 gBattleAnimSpriteGfx_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Teapot[] = INCBIN_U32("graphics/battle_anims/sprites/new/teapot.4bpp.smol"); const u16 gBattleAnimSpritePal_Teapot[] = INCBIN_U16("graphics/battle_anims/sprites/new/teapot.gbapal"); // Battle anims -const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.4bpp.smol"); const u16 gBattleAnimSpritePal_RainDrops[] = INCBIN_U16("graphics/battle_anims/sprites/rain_drops.gbapal"); const u16 gBattleAnimSpritePal_Bone[] = INCBIN_U16("graphics/battle_anims/sprites/bone.gbapal"); @@ -322,162 +322,162 @@ const u16 gBattleAnimSpritePal_Sword[] = INCBIN_U16("graphics/battle_anims/sprit const u16 gBattleAnimSpritePal_Seed[] = INCBIN_U16("graphics/battle_anims/sprites/seed.gbapal"); const u16 gBattleAnimSpritePal_SeedBrown[] = INCBIN_U16("graphics/battle_anims/sprites/seed_new.gbapal"); -const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.smol"); const u16 gBattleAnimSpritePal_Needle[] = INCBIN_U16("graphics/battle_anims/sprites/needle.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion6[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_6.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkOrb[] = INCBIN_U16("graphics/battle_anims/sprites/pink_orb.gbapal"); const u16 gBattleAnimSpritePal_IceCube[] = INCBIN_U16("graphics/battle_anims/sprites/ice_cube.gbapal"); -const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.smol"); const u16 gBattleAnimSpritePal_Gust[] = INCBIN_U16("graphics/battle_anims/sprites/gust.gbapal"); -const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Spark2[] = INCBIN_U16("graphics/battle_anims/sprites/spark_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.smol"); const u16 gBattleAnimSpritePal_Orange[] = INCBIN_U16("graphics/battle_anims/sprites/orange.gbapal"); -const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.smol"); const u16 gBattleAnimSpritePal_Spikes[] = INCBIN_U16("graphics/battle_anims/sprites/spikes.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowBall[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_TiedBag[] = INCBIN_U16("graphics/battle_anims/sprites/tied_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackSmoke[] = INCBIN_U16("graphics/battle_anims/sprites/black_smoke.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackBall[] = INCBIN_U16("graphics/battle_anims/sprites/black_ball.gbapal"); const u16 gBattleAnimSpritePal_Glass[] = INCBIN_U16("graphics/battle_anims/sprites/glass.gbapal"); -const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.smol"); const u16 gBattleAnimSpritePal_HornHit[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit.gbapal"); const u16 gBattleAnimSpritePal_BlueShards[] = INCBIN_U16("graphics/battle_anims/sprites/blue_shards.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.smol"); const u16 gBattleAnimUnusedPal_MusicNotes[] = INCBIN_U16("graphics/battle_anims/unused/music_notes.gbapal"); -const u32 gBattleAnimUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/unused/music_notes.4bpp.lz"); +const u32 gBattleAnimUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/unused/music_notes.4bpp.smol"); const u16 gBattleAnimSpritePal_Hit[] = INCBIN_U16("graphics/battle_anims/sprites/hit.gbapal"); -const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.smol"); const u16 gBattleAnimSpritePal_Hit2[] = INCBIN_U16("graphics/battle_anims/sprites/hit_2.gbapal"); const u16 gBattleAnimSpritePal_WavingHand[] = INCBIN_U16("graphics/battle_anims/sprites/waving_hand.gbapal"); -const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.4bpp.smol"); const u16 gBattleAnimSpritePal_Feint[] = INCBIN_U16("graphics/battle_anims/sprites/feint_punch.gbapal"); -const u32 gBattleAnimSpriteGfx_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.4bpp.smol"); const u16 gBattleAnimSpritePal_TrumpCard[] = INCBIN_U16("graphics/battle_anims/sprites/trump_cards.gbapal"); -const u32 gBattleAnimSpriteGfx_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_TrumpCardParticles[] = INCBIN_U16("graphics/battle_anims/sprites/trump_card_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_Acupressure[] = INCBIN_U32("graphics/battle_anims/sprites/acupressure.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Acupressure[] = INCBIN_U32("graphics/battle_anims/sprites/acupressure.4bpp.smol"); const u16 gBattleAnimSpritePal_Acupressure[] = INCBIN_U16("graphics/battle_anims/sprites/acupressure.gbapal"); -const u32 gBattleAnimSpriteGfx_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.4bpp.smol"); const u16 gBattleAnimSpritePal_WringOut[] = INCBIN_U16("graphics/battle_anims/sprites/wring_out.gbapal"); -const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U16("graphics/battle_anims/sprites/closing_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueStar[] = INCBIN_U16("graphics/battle_anims/sprites/blue_star.gbapal"); const u16 gBattleAnimSpritePal_BubbleBurst[] = INCBIN_U16("graphics/battle_anims/sprites/bubble_burst.gbapal"); -const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.smol"); const u16 gBattleAnimSpritePal_HitDuplicate[] = INCBIN_U16("graphics/battle_anims/sprites/hit_duplicate.gbapal"); const u16 gBattleAnimSpritePal_Leer[] = INCBIN_U16("graphics/battle_anims/sprites/leer.gbapal"); -const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueBurst[] = INCBIN_U16("graphics/battle_anims/sprites/blue_burst.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallEmber[] = INCBIN_U16("graphics/battle_anims/sprites/small_ember.gbapal"); -const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_GraySmoke[] = INCBIN_U16("graphics/battle_anims/sprites/gray_smoke.gbapal"); const u16 gBattleAnimSpritePal_Fire[] = INCBIN_U16("graphics/battle_anims/sprites/fire.gbapal"); -const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.smol"); const u16 gBattleAnimSpritePal_Lightning2[] = INCBIN_U16("graphics/battle_anims/sprites/lightning_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_ColoredOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/colored_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.4bpp.smol"); const u16 gBattleAnimSpritePal_WorrySeed[] = INCBIN_U16("graphics/battle_anims/sprites/worry_seed.gbapal"); -const u32 gBattleAnimSpriteGfx_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallCloud[] = INCBIN_U16("graphics/battle_anims/sprites/small_cloud.gbapal"); -const u32 gBattleAnimSpriteGfx_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.4bpp.smol"); const u16 gBattleAnimSpritePal_AttackOrder[] = INCBIN_U16("graphics/battle_anims/sprites/attack_order.gbapal"); -const u32 gBattleAnimSpriteGfx_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.4bpp.smol"); const u16 gBattleAnimSpritePal_DragonPulse[] = INCBIN_U16("graphics/battle_anims/sprites/dragon_pulse.gbapal"); -const u32 gBattleAnimSpriteGfx_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.4bpp.smol"); const u16 gBattleAnimSpritePal_WoodHammer[] = INCBIN_U16("graphics/battle_anims/sprites/wood_hammer.gbapal"); -const u32 gBattleAnimSpriteGfx_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.4bpp.smol"); const u16 gBattleAnimSpritePal_PsychoCut[] = INCBIN_U16("graphics/battle_anims/sprites/psycho_cut.gbapal"); -const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.4bpp.smol"); const u16 gBattleAnimSpritePal_PowerGem[] = INCBIN_U16("graphics/battle_anims/sprites/power_gem.gbapal"); -const u32 gBattleAnimSpriteGfx_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.4bpp.smol"); const u16 gBattleAnimSpritePal_StoneEdge[] = INCBIN_U16("graphics/battle_anims/sprites/stone_edge.gbapal"); -const u32 gBattleAnimSpriteGfx_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_StealthRock[] = INCBIN_U16("graphics/battle_anims/sprites/stealth_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonJab[] = INCBIN_U16("graphics/battle_anims/sprites/poison_jab.gbapal"); -const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningBall[] = INCBIN_U32("graphics/battle_anims/unused/spinning_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_SpinningBall[] = INCBIN_U16("graphics/battle_anims/unused/spinning_ball.gbapal"); const u16 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U16("graphics/battle_anims/unused/spinning_ball_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.smol"); const u16 gBattleAnimSpritePal_WoodHammerHammer[] = INCBIN_U16("graphics/battle_anims/sprites/wood_hammer_hammer.gbapal"); -const u32 gBattleAnimSpriteGfx_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.4bpp.smol"); const u16 gBattleAnimSpritePal_Snowflakes[] = INCBIN_U16("graphics/battle_anims/sprites/snowflakes.gbapal"); -const u32 gBattleAnimSpriteGfx_SyrupBlob[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_blob.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SyrupShell[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_shell.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SyrupSplat[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_splat.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SyrupBlob[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_blob.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SyrupShell[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_shell.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SyrupSplat[] = INCBIN_U32("graphics/battle_anims/sprites/syrup_bomb_splat.4bpp.smol"); const u16 gBattleAnimSpritePal_SyrupRed[] = INCBIN_U16("graphics/battle_anims/sprites/syrup_red.gbapal"); const u16 gBattleAnimSpritePal_SyrupYellow[] = INCBIN_U16("graphics/battle_anims/sprites/syrup_yellow.gbapal"); -const u32 gBattleAnimSpriteGfx_IvyCudgel[] = INCBIN_U32("graphics/battle_anims/sprites/cudgel.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IvyCudgel[] = INCBIN_U32("graphics/battle_anims/sprites/cudgel.4bpp.smol"); const u16 gBattleAnimSpritePal_IvyCudgelGrass[] = INCBIN_U16("graphics/pokemon/ogerpon/normal.gbapal"); const u16 gBattleAnimSpritePal_IvyCudgelFire[] = INCBIN_U16("graphics/pokemon/ogerpon/hearthflame/normal.gbapal"); const u16 gBattleAnimSpritePal_IvyCudgelRock[] = INCBIN_U16("graphics/pokemon/ogerpon/cornerstone/normal.gbapal"); @@ -485,135 +485,135 @@ const u16 gBattleAnimSpritePal_IvyCudgelWater[] = INCBIN_U16("graphics/pokemon/o // old battle interface data, unused -const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz"); +const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.smol"); const u16 gOldBattleInterfacePal_1_2_3[] = INCBIN_U16("graphics/unused/obi_palpak1.gbapal"); // palettes 1-3 const u16 gOldBattleInterfacePal4[] = INCBIN_U16("graphics/unused/old_pal4.gbapal"); // 4 is by itself const u16 gOldBattleInterfacePal_5_6_7[] = INCBIN_U16("graphics/unused/obi_palpak3.gbapal"); // palettes 5-7 -const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.lz"); -const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.lz"); +const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.smol"); +const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.smolTM"); const u16 gBattleAnimSpritePal_ClawSlash2[] = INCBIN_U16("graphics/battle_anims/sprites/claw_slash_2.gbapal"); const u16 gBattleAnimSpritePal_ClawSlash[] = INCBIN_U16("graphics/battle_anims/sprites/claw_slash.gbapal"); -const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.smol"); -const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/battle_interface/hpbar_unused.4bpp.lz"); +const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/battle_interface/hpbar_unused.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.smol"); const u16 gBattleAnimSpritePal_BubbleBurst2[] = INCBIN_U16("graphics/battle_anims/sprites/bubble_burst_2.gbapal"); -const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.smol"); const u16 gBattleAnimSpritePal_IceChunk[] = INCBIN_U16("graphics/battle_anims/sprites/ice_chunk.gbapal"); const u16 gBattleAnimSpritePal_Glass2[] = INCBIN_U16("graphics/battle_anims/sprites/glass_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkHeart2[] = INCBIN_U16("graphics/battle_anims/sprites/pink_heart_2.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.smol"); -const u32 gBattleInterfaceGfx_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.smol"); const u16 gBattleInterfacePal_UnusedWindow1[] = INCBIN_U16("graphics/battle_interface/unused_window.gbapal"); -const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/battle_interface/battle_bar.4bpp.lz"); +const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/battle_interface/battle_bar.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.smol"); const u16 gBattleAnimSpritePal_SapDrip[] = INCBIN_U16("graphics/battle_anims/sprites/sap_drip.gbapal"); const u16 gBattleAnimSpritePal_SapDrip2[] = INCBIN_U16("graphics/battle_anims/sprites/sap_drip_2.gbapal"); -const u32 gBattleInterfaceGfx_UnusedWindow2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.lz"); -const u32 gBattleInterfaceGfx_UnusedWindow2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.smol"); +const u32 gBattleInterfaceGfx_UnusedWindow2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle1[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_1.gbapal"); const u16 gBattleAnimSpritePal_Sparkle2[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_2.gbapal"); const u16 gBattleAnimSpritePal_HumanoidFoot[] = INCBIN_U16("graphics/battle_anims/sprites/humanoid_foot.gbapal"); -const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_LineSketch[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LineSketch[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch.4bpp.smol"); const u16 gBattleAnimSpritePal_LineSketch[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowUnk[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_unk.gbapal"); -const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.smol"); const u16 gBattleAnimSpritePal_SlamHit[] = INCBIN_U16("graphics/battle_anims/sprites/slam_hit.gbapal"); -const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.smol"); const u16 gBattleAnimSpritePal_Ring[] = INCBIN_U16("graphics/battle_anims/sprites/ring.gbapal"); -const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.smol"); const u16 gBattleAnimSpritePal_Rocks[] = INCBIN_U16("graphics/battle_anims/sprites/rocks.gbapal"); -const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.smol"); const u16 gBattleAnimSpritePal_Z[] = INCBIN_U16("graphics/battle_anims/sprites/z.gbapal"); -const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowUnk2[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_unk_2.gbapal"); -const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.smol"); const u16 gBattleAnimSpritePal_AirSlash[] = INCBIN_U16("graphics/battle_anims/sprites/air_slash.gbapal"); -const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_SpinningGreenOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/spinning_green_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.smol"); const u16 gBattleAnimSpritePal_Leaf[] = INCBIN_U16("graphics/battle_anims/sprites/leaf.gbapal"); -const u32 gBattleAnimSpriteGfx_MetronomeSmallHand[] = INCBIN_U32("graphics/battle_anims/unused/metronome_hand_small.4bpp.lz"); // unused, was for metronome at one point +const u32 gBattleAnimSpriteGfx_MetronomeSmallHand[] = INCBIN_U32("graphics/battle_anims/unused/metronome_hand_small.4bpp.smol"); // unused, was for metronome at one point const u16 gBattleAnimSpritePal_Clapping[] = INCBIN_U16("graphics/battle_anims/sprites/clapping.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonPowder[] = INCBIN_U16("graphics/battle_anims/sprites/poison_powder.gbapal"); -const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.smol"); const u16 gBattleAnimSpritePal_BrownTriangle[] = INCBIN_U16("graphics/battle_anims/sprites/brown_triangle.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle3[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_3.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.smol"); const u16 gBattleAnimSpritePal_MusicNotes[] = INCBIN_U16("graphics/battle_anims/sprites/music_notes.gbapal"); -const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.smol"); const u16 gBattleAnimSpritePal_Duck[] = INCBIN_U16("graphics/battle_anims/sprites/duck.gbapal"); -const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.smol"); const u16 gBattleAnimSpritePal_Alert[] = INCBIN_U16("graphics/battle_anims/sprites/alert.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.smol"); const u16 gBattleAnimSpritePal_Shock4[] = INCBIN_U16("graphics/battle_anims/sprites/shock_4.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Bell2[] = INCBIN_U16("graphics/battle_anims/sprites/bell_2.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkGlove[] = INCBIN_U16("graphics/battle_anims/sprites/pink_glove.gbapal"); const u16 gBattleAnimUnused_Unknown1[] = INCBIN_U16("graphics/battle_anims/unused/unknown_1.bin"); const u16 gBattleAnimUnused_Unknown2[] = INCBIN_U16("graphics/battle_anims/unused/unknown_2.bin"); const u16 gBattleAnimUnused_Unknown3[] = INCBIN_U16("graphics/battle_anims/unused/unknown_3.bin"); -const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.lz"); +const u32 gBattleAnimUnusedGfx_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.8bpp.smol"); const u16 gBattleAnimUnusedPal_LineSketch2[] = INCBIN_U16("graphics/battle_anims/unused/line_sketch_2.gbapal"); -const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.lz"); +const u32 gBattleAnimUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/battle_anims/unused/line_sketch_2.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueLines[] = INCBIN_U16("graphics/battle_anims/sprites/blue_lines.gbapal"); const u16 gBattleAnimSpritePal_Impact3[] = INCBIN_U16("graphics/battle_anims/sprites/impact_3.gbapal"); @@ -627,7 +627,7 @@ const u16 gBattleAnimSpritePal_RedTube[] = INCBIN_U16("graphics/battle_anims/spr const u16 gBattleAnimSpritePal_Amnesia[] = INCBIN_U16("graphics/battle_anims/sprites/amnesia.gbapal"); const u16 gBattleAnimSpritePal_String2[] = INCBIN_U16("graphics/battle_anims/sprites/string_2.gbapal"); -const u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32("graphics/battle_anims/unused/unknown_4.bin.lz"); +const u32 gBattleAnimUnused_Unknown4[] = INCBIN_U32("graphics/battle_anims/unused/unknown_4.bin.smolTM"); const u16 gBattleAnimSpritePal_Pencil2[] = INCBIN_U16("graphics/battle_anims/sprites/pencil_2.gbapal"); const u16 gBattleAnimSpritePal_Petal[] = INCBIN_U16("graphics/battle_anims/sprites/petal.gbapal"); @@ -636,70 +636,70 @@ const u16 gBattleAnimSpritePal_Coin[] = INCBIN_U16("graphics/battle_anims/sprite const u16 gBattleAnimSpritePal_CrackedEgg[] = INCBIN_U16("graphics/battle_anims/sprites/cracked_egg.gbapal"); const u16 gBattleAnimSpritePal_FreshEgg[] = INCBIN_U16("graphics/battle_anims/sprites/fresh_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.smol"); const u16 gBattleAnimSpritePal_Fangs[] = INCBIN_U16("graphics/battle_anims/sprites/fangs.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion2[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterDroplet[] = INCBIN_U16("graphics/battle_anims/sprites/water_droplet.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Seed2[] = INCBIN_U16("graphics/battle_anims/sprites/seed_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.smol"); const u16 gBattleAnimSpritePal_RedWand[] = INCBIN_U16("graphics/battle_anims/sprites/red_wand.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleGreenUnk[] = INCBIN_U16("graphics/battle_anims/sprites/purple_green_unk.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterColumn[] = INCBIN_U16("graphics/battle_anims/sprites/water_column.gbapal"); -const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.smol"); const u16 gBattleAnimSpritePal_MudUnk[] = INCBIN_U16("graphics/battle_anims/sprites/mud_unk.gbapal"); -const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.lz"); // P1, P2, P3 and P4 tilemaps? -const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.lz"); -const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.lz"); +const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.smolTM"); // P1, P2, P3 and P4 tilemaps? +const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.smolTM"); +const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.smol"); const u16 gUnusedPal_ColorFrames[] = INCBIN_U16("graphics/unused/color_frames.gbapal"); -const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.smol"); -const u32 gBattleAnimUnusedGfx_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.8bpp.lz"); -const u32 gBattleAnimUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.bin.lz"); +const u32 gBattleAnimUnusedGfx_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.8bpp.smol"); +const u32 gBattleAnimUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/battle_anims/unused/water_splash.bin.smolTM"); const u16 gBattleAnimUnusedPal_WaterSplash[] = INCBIN_U16("graphics/battle_anims/unused/water_splash.gbapal"); -const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.lz"); +const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.smol"); const u16 gUnusedPal_BasicFrame[] = INCBIN_U16("graphics/unused/basic_frame.gbapal"); -const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.lz"); +const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.smolTM"); // Battle Interface @@ -720,191 +720,191 @@ const u8 gHealthboxElementsGfxTable[] = INCBIN_U8("graphics/battle_interface/hpb "graphics/battle_interface/status4.4bpp", "graphics/battle_interface/healthbox_doubles_frameend.4bpp", "graphics/battle_interface/healthbox_doubles_frameend_bar.4bpp"); -const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.lz"); -const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.lz"); +const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.smol"); +const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.smol"); const u16 gBattleAnimSpritePal_FurySwipes[] = INCBIN_U16("graphics/battle_anims/sprites/fury_swipes.gbapal"); -const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Vine2[] = INCBIN_U16("graphics/battle_anims/sprites/vine_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.smol"); const u16 gBattleAnimSpritePal_Teeth[] = INCBIN_U16("graphics/battle_anims/sprites/teeth.gbapal"); -const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Bone2[] = INCBIN_U16("graphics/battle_anims/sprites/bone_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteBag[] = INCBIN_U16("graphics/battle_anims/sprites/white_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.smol"); const u16 gBattleAnimSpritePal_Unknown[] = INCBIN_U16("graphics/battle_anims/sprites/unknown.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleCoral[] = INCBIN_U16("graphics/battle_anims/sprites/purple_coral.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.smol"); const u16 gBattleAnimSpritePal_Shock2[] = INCBIN_U16("graphics/battle_anims/sprites/shock_2.gbapal"); -const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.smol"); const u16 gBattleAnimSpritePal_ClosingEye2[] = INCBIN_U16("graphics/battle_anims/sprites/closing_eye_2.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_MetalBall[] = INCBIN_U16("graphics/battle_anims/sprites/metal_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.smol"); const u16 gBattleAnimSpritePal_MonsterDoll[] = INCBIN_U16("graphics/battle_anims/sprites/monster_doll.gbapal"); -const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.smol"); const u16 gBattleAnimSpritePal_Whirlwind[] = INCBIN_U16("graphics/battle_anims/sprites/whirlwind.gbapal"); -const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion4[] = INCBIN_U16("graphics/battle_anims/sprites/explosion_4.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.smol"); const u16 gBattleAnimSpritePal_Tongue[] = INCBIN_U16("graphics/battle_anims/sprites/tongue.gbapal"); -const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.smol"); const u16 gBattleAnimSpritePal_Smoke[] = INCBIN_U16("graphics/battle_anims/sprites/smoke.gbapal"); -const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.smol"); const u16 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U16("graphics/battle_anims/sprites/blue_flames.gbapal"); -const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.smol"); // Contest -const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.lz"); +const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.smol"); const u16 gJPContestPal[] = INCBIN_U16("graphics/contest/japanese/palette.gbapal"); -const u32 gJPContestBgTilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.lz"); -const u32 gJPContestWindowsTilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.lz"); -const u32 gJPContestGfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.lz"); +const u32 gJPContestBgTilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.smolTM"); +const u32 gJPContestWindowsTilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.smolTM"); +const u32 gJPContestGfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.smol"); const u16 gContestInterfaceAudiencePalette[] = INCBIN_U16("graphics/contest/interface.gbapal"); -const u32 gContestAudienceTilemap[] = INCBIN_U32("graphics/contest/audience.bin.lz"); -const u32 gContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/interface.bin.lz"); -const u32 gJPContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.lz"); -const u32 gJPContestAudienceTilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.lz"); -const u32 gContestCurtainTilemap[] = INCBIN_U32("graphics/contest/curtain.bin.lz"); +const u32 gContestAudienceTilemap[] = INCBIN_U32("graphics/contest/audience.bin.smolTM"); +const u32 gContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/interface.bin.smolTM"); +const u32 gJPContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.smolTM"); +const u32 gJPContestAudienceTilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.smolTM"); +const u32 gContestCurtainTilemap[] = INCBIN_U32("graphics/contest/curtain.bin.smolTM"); -const u32 gContestInterfaceGfx[] = INCBIN_U32("graphics/contest/interface.4bpp.lz"); -const u32 gContestAudienceGfx[] = INCBIN_U32("graphics/contest/audience.4bpp.lz"); -const u32 gContestFaces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.lz"); -const u32 gContestJudgeSymbolsGfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.lz"); +const u32 gContestInterfaceGfx[] = INCBIN_U32("graphics/contest/interface.4bpp.smol"); +const u32 gContestAudienceGfx[] = INCBIN_U32("graphics/contest/audience.4bpp.smol"); +const u32 gContestFaces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.smol"); +const u32 gContestJudgeSymbolsGfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.smol"); const u16 gContestJudgeSymbolsPal[] = INCBIN_U16("graphics/contest/judge_symbols.gbapal"); const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4bpp"); // JP equivalent of the Applause meter -const u32 gJPContestVoltageGfx[] = INCBIN_U32("graphics/contest/japanese/voltage.4bpp.lz"); +const u32 gJPContestVoltageGfx[] = INCBIN_U32("graphics/contest/japanese/voltage.4bpp.smol"); const u16 gJPContestVoltagePal[] = INCBIN_U16("graphics/contest/japanese/voltage.gbapal"); // Contest results -const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.lz"); -const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.lz"); -const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.lz"); -const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.lz"); +const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.smol"); +const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.smolTM"); +const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.smolTM"); +const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.smolTM"); const u16 gContestResults_Pal[] = INCBIN_U16("graphics/contest/results_screen/tiles.gbapal"); -const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.smol"); const u16 gBattleAnimSpritePal_Impact[] = INCBIN_U16("graphics/battle_anims/sprites/impact.gbapal"); -const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.smol"); const u16 gBattleAnimSpritePal_Particles2[] = INCBIN_U16("graphics/battle_anims/sprites/particles2.gbapal"); -const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U16("graphics/battle_anims/sprites/circle_impact.gbapal"); -const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.smol"); const u16 gBattleAnimSpritePal_SharpTeeth[] = INCBIN_U16("graphics/battle_anims/sprites/sharp_teeth.gbapal"); -const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.smol"); const u16 gBattleAnimSpritePal_RainbowRings[] = INCBIN_U16("graphics/battle_anims/sprites/rainbow_rings.gbapal"); -const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.smol"); const u16 gBattleAnimSpritePal_IceCrystals[] = INCBIN_U16("graphics/battle_anims/sprites/ice_crystals.gbapal"); -const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_OldBeatUp[] = INCBIN_U32("graphics/battle_anims/unused/old_beatup.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OldBeatUp[] = INCBIN_U32("graphics/battle_anims/unused/old_beatup.4bpp.smol"); const u16 gBattleAnimSpritePal_OldBeatUp[] = INCBIN_U16("graphics/battle_anims/unused/old_beatup.gbapal"); -const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.smol"); const u16 gBattleAnimSpritePal_Orbs[] = INCBIN_U16("graphics/battle_anims/sprites/orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_WaterImpact[] = INCBIN_U16("graphics/battle_anims/sprites/water_impact.gbapal"); const u16 gBattleAnimSpritePal_BrownOrb[] = INCBIN_U16("graphics/battle_anims/sprites/brown_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.smol"); const u16 gBattleAnimSpritePal_MudSand[] = INCBIN_U16("graphics/battle_anims/sprites/mud_sand.gbapal"); -const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.smol"); const u16 gBattleAnimSpritePal_PoisonBubble[] = INCBIN_U16("graphics/battle_anims/sprites/poison_bubble.gbapal"); -const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.smol"); const u16 gBattleAnimSpritePal_HornHit2[] = INCBIN_U16("graphics/battle_anims/sprites/horn_hit_2.gbapal"); -const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.smol"); const u16 gBattleAnimSpritePal_AirWave2[] = INCBIN_U16("graphics/battle_anims/sprites/air_wave_2.gbapal"); -const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallBubbles[] = INCBIN_U16("graphics/battle_anims/sprites/small_bubbles.gbapal"); -const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.smol"); const u16 gBattleAnimSpritePal_RoundShadow[] = INCBIN_U16("graphics/battle_anims/sprites/round_shadow.gbapal"); -const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.smol"); const u16 gBattleAnimSpritePal_Sunlight[] = INCBIN_U16("graphics/battle_anims/sprites/sunlight.gbapal"); -const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.smol"); const u16 gBattleAnimSpritePal_Spore[] = INCBIN_U16("graphics/battle_anims/sprites/spore.gbapal"); -const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.smol"); const u16 gBattleAnimSpritePal_Flower[] = INCBIN_U16("graphics/battle_anims/sprites/flower.gbapal"); -const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.smol"); const u16 gBattleAnimSpritePal_RazorLeaf[] = INCBIN_U16("graphics/battle_anims/sprites/razor_leaf.gbapal"); -const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_MistCloud[] = INCBIN_U16("graphics/battle_anims/sprites/mist_cloud.gbapal"); -const u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.4bpp.lz"); +const u32 gBattleAnimUnusedGfx_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.4bpp.smol"); const u16 gBattleAnimUnusedPal_Lights[] = INCBIN_U16("graphics/battle_anims/unused/lights.gbapal"); -const u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.bin.lz"); +const u32 gBattleAnimUnusedTilemap_Lights[] = INCBIN_U32("graphics/battle_anims/unused/lights.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_WhirlwindLines[] = INCBIN_U16("graphics/battle_anims/sprites/whirlwind_lines.gbapal"); -const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldRing[] = INCBIN_U16("graphics/battle_anims/sprites/gold_ring.gbapal"); const u16 gBattleAnimSpritePal_BlueRing2[] = INCBIN_U16("graphics/battle_anims/sprites/blue_ring_2.gbapal"); const u16 gBattleAnimSpritePal_PurpleRing[] = INCBIN_U16("graphics/battle_anims/sprites/purple_ring.gbapal"); const u16 gBattleAnimSpritePal_BlueRing[] = INCBIN_U16("graphics/battle_anims/sprites/blue_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/green_light_wall.gbapal"); const u16 gBattleAnimSpritePal_BlueLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/blue_light_wall.gbapal"); @@ -912,318 +912,318 @@ const u16 gBattleAnimSpritePal_RedLightWall[] = INCBIN_U16("graphics/battle_anim const u16 gBattleAnimSpritePal_GrayLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/gray_light_wall.gbapal"); const u16 gBattleAnimSpritePal_OrangeLightWall[] = INCBIN_U16("graphics/battle_anims/sprites/orange_light_wall.gbapal"); -const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.smol"); const u16 gBattleAnimSpritePal_BlackBall2[] = INCBIN_U16("graphics/battle_anims/sprites/black_ball_2.gbapal"); const u16 gBattleAnimSpritePal_PurpleGasCloud[] = INCBIN_U16("graphics/battle_anims/sprites/purple_gas_cloud.gbapal"); -const u32 gContestJudgeGfx[] = INCBIN_U32("graphics/contest/judge.4bpp.lz"); +const u32 gContestJudgeGfx[] = INCBIN_U32("graphics/contest/judge.4bpp.smol"); const u16 gContest2Pal[] = INCBIN_U16("graphics/contest/judge.gbapal"); -const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.smol"); const u16 gBattleAnimSpritePal_Spark[] = INCBIN_U16("graphics/battle_anims/sprites/spark.gbapal"); -const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.smol"); -const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.lz"); +const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.smol"); const u16 gBattleAnimBgPalette_Dark[] = INCBIN_U16("graphics/battle_anims/backgrounds/dark.gbapal"); -const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.lz"); +const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.smolTM"); -const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.lz"); +const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.smol"); const u16 gMetalShinePalette[] = INCBIN_U16("graphics/battle_anims/masks/metal_shine.gbapal"); -const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.lz"); +const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.smolTM"); -const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.4bpp.lz"); // ghost +const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.4bpp.smol"); // ghost const u16 gUnusedPal_Goosuto[] = INCBIN_U16("graphics/battle_anims/unused/goosuto.gbapal"); -const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.bin.lz"); +const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/battle_anims/unused/goosuto.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.smol"); const u16 gBattleAnimSpritePal_YellowStar[] = INCBIN_U16("graphics/battle_anims/sprites/yellow_star.gbapal"); -const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.smol"); const u16 gBattleAnimSpritePal_LargeFreshEgg[] = INCBIN_U16("graphics/battle_anims/sprites/large_fresh_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_ShadowBall[] = INCBIN_U16("graphics/battle_anims/sprites/shadow_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.smol"); const u16 gBattleAnimSpritePal_Lick[] = INCBIN_U16("graphics/battle_anims/sprites/lick.gbapal"); -const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.smol"); const u16 gBattleAnimSpritePal_VoidLines[] = INCBIN_U16("graphics/battle_anims/sprites/void_lines.gbapal"); const u16 gBattleAnimSpritePal_String[] = INCBIN_U16("graphics/battle_anims/sprites/string.gbapal"); -const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.smol"); const u16 gBattleAnimSpritePal_Lightbulb[] = INCBIN_U16("graphics/battle_anims/sprites/lightbulb.gbapal"); -const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.smol"); const u16 gBattleAnimSpritePal_Slash[] = INCBIN_U16("graphics/battle_anims/sprites/slash.gbapal"); -const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.smol"); const u16 gBattleAnimSpritePal_FocusEnergy[] = INCBIN_U16("graphics/battle_anims/sprites/focus_energy.gbapal"); -const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.smol"); const u16 gBattleAnimSpritePal_SphereToCube[] = INCBIN_U16("graphics/battle_anims/sprites/sphere_to_cube.gbapal"); -const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.lz"); +const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.smol"); const u16 gBattleAnimBgPalette_Psychic[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic.gbapal"); -const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.lz"); +const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.smol"); const u16 gBattleAnimSpritePal_Eye[] = INCBIN_U16("graphics/battle_anims/sprites/eye.gbapal"); -const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.smol"); const u16 gBattleAnimSpritePal_Tendrils[] = INCBIN_U16("graphics/battle_anims/sprites/tendrils.gbapal"); -const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.lz"); -const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.lz"); -const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.lz"); -const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.lz"); -const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.lz"); +const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.smol"); +const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.smol"); +const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.smol"); +const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.smol"); +const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.smol"); -const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.lz"); +const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.smol"); const u16 gUnusedPal_Shadow[] = INCBIN_U16("graphics/unused/shadow.gbapal"); -const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.smol"); const u16 gBattleAnimSpritePal_LockOn[] = INCBIN_U16("graphics/battle_anims/sprites/lock_on.gbapal"); -const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_OpeningEye[] = INCBIN_U16("graphics/battle_anims/sprites/opening_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.smol"); const u16 gBattleAnimSpritePal_RoundWhiteHalo[] = INCBIN_U16("graphics/battle_anims/sprites/round_white_halo.gbapal"); -const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.smol"); const u16 gBattleAnimSpritePal_TealAlert[] = INCBIN_U16("graphics/battle_anims/sprites/teal_alert.gbapal"); -const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.smol"); const u16 gBattleAnimSpritePal_FangAttack[] = INCBIN_U16("graphics/battle_anims/sprites/fang_attack.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U16("graphics/battle_anims/sprites/purple_hand_outline.gbapal"); -const u32 gBattleAnimMaskImage_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz"); -const u32 gBattleAnimMaskTilemap_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz"); +const u32 gBattleAnimMaskImage_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.smol"); +const u32 gBattleAnimMaskTilemap_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.smol"); const u16 gBattleAnimSpritePal_Pencil[] = INCBIN_U16("graphics/battle_anims/sprites/pencil.gbapal"); -const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.smol"); const u16 gBattleAnimSpritePal_Spiral[] = INCBIN_U16("graphics/battle_anims/sprites/spiral.gbapal"); -const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.smol"); const u16 gBattleAnimSpritePal_Moon[] = INCBIN_U16("graphics/battle_anims/sprites/moon.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenSparkle[] = INCBIN_U16("graphics/battle_anims/sprites/green_sparkle.gbapal"); -const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.smol"); const u16 gBattleAnimSpritePal_SnoreZ[] = INCBIN_U16("graphics/battle_anims/sprites/snore_z.gbapal"); -const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.smol"); const u16 gBattleAnimSpritePal_Explosion[] = INCBIN_U16("graphics/battle_anims/sprites/explosion.gbapal"); -const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.smol"); const u16 gBattleAnimSpritePal_Nail[] = INCBIN_U16("graphics/battle_anims/sprites/nail.gbapal"); -const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.smol"); const u16 gBattleAnimSpritePal_GhostlySpirit[] = INCBIN_U16("graphics/battle_anims/sprites/ghostly_spirit.gbapal"); -const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_WarmRock[] = INCBIN_U16("graphics/battle_anims/sprites/warm_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_PunchImpact[] = INCBIN_U16("graphics/battle_anims/sprites/punch_impact.gbapal"); -const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.smol"); const u16 gBattleAnimSpritePal_BreakingEgg[] = INCBIN_U16("graphics/battle_anims/sprites/breaking_egg.gbapal"); -const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_ThinRing[] = INCBIN_U16("graphics/battle_anims/sprites/thin_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.smol"); const u16 gBattleAnimSpritePal_MusicNotes2[] = INCBIN_U16("graphics/battle_anims/sprites/music_notes_2.gbapal"); -const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.smol"); const u16 gBattleAnimSpritePal_Bell[] = INCBIN_U16("graphics/battle_anims/sprites/bell.gbapal"); -const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.smol"); const u16 gBattleAnimSpritePal_SpeedDust[] = INCBIN_U16("graphics/battle_anims/sprites/speed_dust.gbapal"); -const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.smol"); const u16 gBattleAnimSpritePal_ThoughtBubble[] = INCBIN_U16("graphics/battle_anims/sprites/thought_bubble.gbapal"); -const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.smol"); const u16 gBattleAnimSpritePal_Finger[] = INCBIN_U16("graphics/battle_anims/sprites/finger.gbapal"); -const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkHeart[] = INCBIN_U16("graphics/battle_anims/sprites/pink_heart.gbapal"); const u16 gBattleAnimSpritePal_MagentaHeart[] = INCBIN_U16("graphics/battle_anims/sprites/magenta_heart.gbapal"); const u16 gBattleAnimSpritePal_RedHeart[] = INCBIN_U16("graphics/battle_anims/sprites/red_heart.gbapal"); -const u32 gBattleAnimBgImage_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.lz"); +const u32 gBattleAnimBgImage_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.smol"); const u16 gBattleAnimBgPalette_Attract[] = INCBIN_U16("graphics/battle_anims/backgrounds/attract.gbapal"); -const u32 gBattleAnimBgTilemap_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.lz"); +const u32 gBattleAnimBgTilemap_Attract[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_RedOrb[] = INCBIN_U16("graphics/battle_anims/sprites/red_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.smol"); const u16 gBattleAnimSpritePal_ElectricOrbs[] = INCBIN_U16("graphics/battle_anims/sprites/electric_orbs.gbapal"); -const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.smol"); const u16 gBattleAnimSpritePal_MovementWaves[] = INCBIN_U16("graphics/battle_anims/sprites/movement_waves.gbapal"); const u16 gBattleAnimBgPalette_ScaryFace[] = INCBIN_U16("graphics/battle_anims/backgrounds/scary_face.gbapal"); -const u32 gBattleAnimBgImage_ScaryFace[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.lz"); +const u32 gBattleAnimBgImage_ScaryFace[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.smol"); const u16 gBattleAnimSpritePal_EyeSparkle[] = INCBIN_U16("graphics/battle_anims/sprites/eye_sparkle.gbapal"); -const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.smol"); const u16 gBattleAnimSpritePal_Anger[] = INCBIN_U16("graphics/battle_anims/sprites/anger.gbapal"); -const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.smol"); const u16 gBattleAnimSpritePal_Conversion[] = INCBIN_U16("graphics/battle_anims/sprites/conversion.gbapal"); const u16 gBattleAnimSpritePal_Angel[] = INCBIN_U16("graphics/battle_anims/sprites/angel.gbapal"); -const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.smol"); const u16 gBattleAnimSpritePal_Devil[] = INCBIN_U16("graphics/battle_anims/sprites/devil.gbapal"); -const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.smol"); const u16 gBattleAnimSpritePal_Swipe[] = INCBIN_U16("graphics/battle_anims/sprites/swipe.gbapal"); const u16 gBattleAnimSpritePal_Roots[] = INCBIN_U16("graphics/battle_anims/sprites/roots.gbapal"); -const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.smol"); const u16 gBattleAnimSpritePal_ItemBag[] = INCBIN_U16("graphics/battle_anims/sprites/item_bag.gbapal"); -const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.smol"); const u16 gBattleAnimSpritePal_TriAttackTriangle[] = INCBIN_U16("graphics/battle_anims/sprites/tri_attack_triangle.gbapal"); -const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TriAttackTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.smol"); const u16 gBattleAnimSpritePal_LetterZ[] = INCBIN_U16("graphics/battle_anims/sprites/letter_z.gbapal"); -const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.smol"); const u16 gBattleAnimBgPalette_Impact[] = INCBIN_U16("graphics/battle_anims/backgrounds/impact.gbapal"); -const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.lz"); -const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.lz"); +const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.smol"); +const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.smolTM"); -const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.lz"); -const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.smol"); const u16 gBattleAnimSpritePal_JaggedMusicNote[] = INCBIN_U16("graphics/battle_anims/sprites/jagged_music_note.gbapal"); -const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.smol"); const u16 gBattleAnimSpritePal_Pokeball[] = INCBIN_U16("graphics/battle_anims/sprites/pokeball.gbapal"); -const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.smol"); const u16 gBattleAnimSpritePal_RapidSpin[] = INCBIN_U16("graphics/battle_anims/sprites/rapid_spin.gbapal"); -const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.smol"); const u16 gBattleAnimSpritePal_MilkBottle[] = INCBIN_U16("graphics/battle_anims/sprites/milk_bottle.gbapal"); -const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.smol"); const u16 gBattleAnimSpritePal_WispOrb[] = INCBIN_U16("graphics/battle_anims/sprites/wisp_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.smol"); const u16 gBattleAnimSpritePal_GoldStars[] = INCBIN_U16("graphics/battle_anims/sprites/gold_stars.gbapal"); -const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_EclipsingOrb[] = INCBIN_U16("graphics/battle_anims/sprites/eclipsing_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkPetal[] = INCBIN_U16("graphics/battle_anims/sprites/pink_petal.gbapal"); -const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_GrayOrb[] = INCBIN_U16("graphics/battle_anims/sprites/gray_orb.gbapal"); const u16 gBattleAnimSpritePal_BlueOrb[] = INCBIN_U16("graphics/battle_anims/sprites/blue_orb.gbapal"); const u16 gBattleAnimSpritePal_RedOrb2[] = INCBIN_U16("graphics/battle_anims/sprites/red_orb_2.gbapal"); -const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.lz"); +const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.smol"); const u16 gBattleAnimBgPalette_Drill[] = INCBIN_U16("graphics/battle_anims/backgrounds/drill.gbapal"); const u16 gBattleAnimBgPalette_Sky[] = INCBIN_U16("graphics/battle_anims/backgrounds/sky.gbapal"); -const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.lz"); -const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.smolTM"); +const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.smolTM"); -const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.lz"); +const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.smol"); const u16 gBattleAnimBgPalette_Aurora[] = INCBIN_U16("graphics/battle_anims/backgrounds/aurora.gbapal"); -const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.lz"); +const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.smolTM"); -const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.lz"); +const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.smolTM"); const u16 gBattleAnimBgPalette_Highspeed[] = INCBIN_U16("graphics/battle_anims/backgrounds/highspeed.gbapal"); const u16 gBattleAnimBgPalette_Bug[] = INCBIN_U16("graphics/battle_anims/backgrounds/bug.gbapal"); -const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.lz"); -const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.lz"); +const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.smol"); +const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.smolTM"); -const u32 gBattleAnimMaskImage_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.lz"); +const u32 gBattleAnimMaskImage_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.smol"); const u16 gBattleAnimMaskPalette_LightBeam[] = INCBIN_U16("graphics/battle_anims/masks/light_beam.gbapal"); -const u32 gBattleAnimMaskTilemap_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.lz"); +const u32 gBattleAnimMaskTilemap_LightBeam[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.smolTM"); -const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.lz"); -const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.lz"); +const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.smolTM"); -const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.lz"); +const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.smol"); const u16 gBattleAnimBgPalette_Guillotine[] = INCBIN_U16("graphics/battle_anims/backgrounds/guillotine.gbapal"); -const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.lz"); +const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.smol"); const u16 gBattleAnimBgPalette_Thunder[] = INCBIN_U16("graphics/battle_anims/backgrounds/thunder.gbapal"); -const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.lz"); +const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.smol"); const u16 gBattleAnimSpritePal_PainSplit[] = INCBIN_U16("graphics/battle_anims/sprites/pain_split.gbapal"); -const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.smol"); const u16 gBattleAnimSpritePal_HandsAndFeet[] = INCBIN_U16("graphics/battle_anims/sprites/hands_and_feet.gbapal"); -const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.smol"); const u16 gBattleAnimSpritePal_Confetti[] = INCBIN_U16("graphics/battle_anims/sprites/confetti.gbapal"); -const u32 gBattleAnimSpriteGfx_Substitute[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_SubstituteBack[] = INCBIN_U32("graphics/battle_anims/sprites/substitute_back.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Substitute[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_SubstituteBack[] = INCBIN_U32("graphics/battle_anims/sprites/substitute_back.4bpp.smol"); const u16 gBattleAnimSpritePal_Substitute[] = INCBIN_U16("graphics/battle_anims/sprites/substitute.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenStar[] = INCBIN_U16("graphics/battle_anims/sprites/green_star.gbapal"); -const u32 gConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz"); +const u32 gConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.smol"); const u16 gConfetti_Pal[] = INCBIN_U16("graphics/misc/confetti.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U16("graphics/battle_anims/sprites/pink_cloud.gbapal"); -const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.smol"); const u16 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U16("graphics/battle_anims/sprites/sweat_drop.gbapal"); -const u32 gStatAnim_Gfx[] = INCBIN_U32("graphics/battle_anims/stat_change/tiles.4bpp.lz"); -const u32 gStatAnim_Increase_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/increase.bin.lz"); -const u32 gStatAnim_Decrease_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/decrease.bin.lz"); +const u32 gStatAnim_Gfx[] = INCBIN_U32("graphics/battle_anims/stat_change/tiles.4bpp.smol"); +const u32 gStatAnim_Increase_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/increase.bin.smolTM"); +const u32 gStatAnim_Decrease_Tilemap[] = INCBIN_U32("graphics/battle_anims/stat_change/decrease.bin.smolTM"); const u16 gStatAnim_Defense_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/defense.gbapal"); const u16 gStatAnim_Attack_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/attack.gbapal"); const u16 gStatAnim_Accuracy_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/accuracy.gbapal"); @@ -1233,93 +1233,93 @@ const u16 gStatAnim_Evasion_Pal[] = INCBIN_U16("graphics/battle_anims/stat_ const u16 gStatAnim_SpAttack_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/sp_attack.gbapal"); const u16 gStatAnim_SpDefense_Pal[] = INCBIN_U16("graphics/battle_anims/stat_change/sp_defense.gbapal"); -const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); +const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.smol"); const u16 gCureBubblesPal[] = INCBIN_U16("graphics/battle_anims/masks/cure_bubbles.gbapal"); -const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz"); +const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.smolTM"); const u16 gBattleAnimSpritePal_PurpleScratch[] = INCBIN_U16("graphics/battle_anims/sprites/purple_scratch.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.smol"); const u16 gBattleAnimSpritePal_GuardRing[] = INCBIN_U16("graphics/battle_anims/sprites/guard_ring.gbapal"); -const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.smol"); -const u32 UnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.lz"); -const u32 UnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.lz"); +const u32 UnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.smol"); +const u32 UnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.smol"); const u16 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U16("graphics/battle_anims/sprites/small_red_eye.gbapal"); -const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_HollowOrb[] = INCBIN_U16("graphics/battle_anims/sprites/hollow_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U16("graphics/battle_anims/sprites/bluegreen_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PinkVioletOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pinkvio_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_PinkVioletOrb[] = INCBIN_U16("graphics/battle_anims/sprites/pinkvio_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.smol"); const u16 gBattleAnimSpritePal_PawPrint[] = INCBIN_U16("graphics/battle_anims/sprites/paw_print.gbapal"); -const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.smol"); const u16 gBattleAnimSpritePal_PurpleFlame[] = INCBIN_U16("graphics/battle_anims/sprites/purple_flame.gbapal"); -const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_RedBall[] = INCBIN_U16("graphics/battle_anims/sprites/red_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.smol"); const u16 gBattleAnimSpritePal_SmellingsaltEffect[] = INCBIN_U16("graphics/battle_anims/sprites/smellingsalt_effect.gbapal"); -const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.smol"); const u16 gBattleAnimSpritePal_MagnifyingGlass[] = INCBIN_U16("graphics/battle_anims/sprites/magnifying_glass.gbapal"); -const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.smol"); const u16 gBattleAnimSpritePal_Meteor[] = INCBIN_U16("graphics/battle_anims/sprites/meteor.gbapal"); -const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.smol"); const u16 gBattleAnimSpritePal_FlatRock[] = INCBIN_U16("graphics/battle_anims/sprites/flat_rock.gbapal"); -const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.smol"); const u16 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U16("graphics/battle_anims/sprites/starstorm_beam.gbapal"); -const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SaltParticle[] = INCBIN_U32("graphics/battle_anims/sprites/salt_particle.4bpp.smol"); const u16 gBattleAnimSpritePal_SaltParticle[] = INCBIN_U16("graphics/battle_anims/sprites/salt_particle.gbapal"); const u16 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U16("graphics/battle_anims/unused/unknown_2.gbapal"); #include "data/graphics/trainers.h" -const u32 gBattleVSFrame_Gfx[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.lz"); -const u32 gBattleVSFrame_Tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.lz"); +const u32 gBattleVSFrame_Gfx[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.smol"); +const u32 gBattleVSFrame_Tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.smolTM"); const u16 gBattleVSFrame_Pal[] = INCBIN_U16("graphics/battle_transitions/vs_frame.gbapal"); -const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz"); +const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.smol"); #include "data/graphics/battle_environment.h" // Battle Dome -const u32 gDomeTourneyTree_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.4bpp.lz"); -const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.lz"); // the red glow mask for the tourney advancement lines -const u32 gDomeTourneyTree_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.bin.lz"); -const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.lz"); -const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.lz"); -const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.lz"); -const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.lz"); -const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.lz"); -const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.lz"); // exit/cancel and Poké Ball buttons +const u32 gDomeTourneyTree_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.4bpp.smol"); +const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.smol"); // the red glow mask for the tourney advancement lines +const u32 gDomeTourneyTree_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.bin.smolTM"); +const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.smolTM"); +const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.smolTM"); +const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.smol"); +const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.smolTM"); +const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.smolTM"); +const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.smol"); // exit/cancel and Poké Ball buttons const u16 gDomeTourneyTree_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_tree.gbapal"); const u16 gDomeTourneyTreeButtons_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_buttons.gbapal"); const u16 gDomeTourneyMatchCardBg_Pal[] = INCBIN_U16("graphics/battle_frontier/tourney_match_card_bg.gbapal"); -const u32 gBattleArenaJudgmentSymbolsGfx[] = INCBIN_U32("graphics/battle_frontier/arena_judgment_symbols.4bpp.lz"); +const u32 gBattleArenaJudgmentSymbolsGfx[] = INCBIN_U32("graphics/battle_frontier/arena_judgment_symbols.4bpp.smol"); const u16 gBattleArenaJudgmentSymbolsPalette[] = INCBIN_U16("graphics/battle_frontier/arena_judgment_symbols.gbapal"); const u16 gBattleWindowTextPalette[] = INCBIN_U16("graphics/battle_interface/text.gbapal"); @@ -1334,407 +1334,407 @@ static const u16 sUnused0[] = {0x13F, 0x119, 0x113, 0x10E}; const u16 gBattlePyramidFloor_Pal[] = INCBIN_U16("graphics/battle_frontier/pyramid_floor.gbapal"); -const u32 gMultiBattleIntroBg_Opponent_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_opponent.bin.lz"); -const u32 gMultiBattleIntroBg_Player_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_player.bin.lz"); +const u32 gMultiBattleIntroBg_Opponent_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_opponent.bin.smolTM"); +const u32 gMultiBattleIntroBg_Player_Tilemap[] = INCBIN_U32("graphics/battle_frontier/multi_battle_intro_bg_player.bin.smolTM"); #include "data/graphics/intro_scene.h" -const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.smol"); const u16 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U16("graphics/battle_anims/sprites/flying_dirt.gbapal"); -const u32 gBattleAnimBgTilemap_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz"); -const u32 gBattleAnimBgImage_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz"); +const u32 gBattleAnimBgTilemap_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.smolTM"); +const u32 gBattleAnimBgImage_Sandstorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.smol"); const u16 gBattleAnimSpritePal_Windstorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/windstorm_brew.gbapal"); -const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.smol"); const u16 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U16("graphics/battle_anims/sprites/metal_sound_waves.gbapal"); -const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.lz"); +const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.smol"); const u16 gBattleAnimBgPalette_Ice[] = INCBIN_U16("graphics/battle_anims/backgrounds/ice.gbapal"); -const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.lz"); +const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.smol"); const u16 gBattleAnimSpritePal_IcicleSpear[] = INCBIN_U16("graphics/battle_anims/sprites/icicle_spear.gbapal"); -const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.lz"); +const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.smol"); const u8 gContestNextTurnNumbersGfx[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); const u8 gContestNextTurnRandomGfx[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); -const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.smol"); const u16 gBattleAnimSpritePal_GlowyRedOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_red_orb.gbapal"); const u16 gBattleAnimSpritePal_GlowyGreenOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_green_orb.gbapal"); const u16 gBattleAnimSpritePal_SleepPowder[] = INCBIN_U16("graphics/battle_anims/sprites/sleep_powder.gbapal"); const u16 gBattleAnimSpritePal_StunSpore[] = INCBIN_U16("graphics/battle_anims/sprites/stun_spore.gbapal"); -const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.lz"); +const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.smol"); const u8 gContestApplauseMeterGfx[] = INCBIN_U8("graphics/contest/applause_meter.4bpp"); const u16 gContestPal[] = INCBIN_U16("graphics/contest/nextturn.gbapal"); -const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.smol"); const u16 gBattleAnimSpritePal_Splash[] = INCBIN_U16("graphics/battle_anims/sprites/splash.gbapal"); -const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.smol"); -const u32 gBattleAnimSpriteGfx_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.4bpp.smol"); const u16 gBattleAnimSpritePal_Pokeblock[] = INCBIN_U16("graphics/battle_anims/sprites/pokeblock.gbapal"); -const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.lz"); -const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.smol"); const u16 gBattleAnimSpritePal_Gem1[] = INCBIN_U16("graphics/battle_anims/sprites/gem_1.gbapal"); -const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.lz"); +const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.smol"); const u16 gBattleAnimBgPalette_InAir[] = INCBIN_U16("graphics/battle_anims/backgrounds/in_air.gbapal"); -const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.lz"); +const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.smol"); const u16 gBattleAnimSpritePal_Protect[] = INCBIN_U16("graphics/battle_anims/sprites/protect.gbapal"); const u16 gBattleAnimBackgroundImageMuddyWater_Pal[] = INCBIN_U16("graphics/battle_anims/backgrounds/water_muddy.gbapal"); -const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz"); -const u32 gEnemyMonShadowsSized_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadows_sized.4bpp.lz"); +const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.smol"); +const u32 gEnemyMonShadowsSized_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadows_sized.4bpp.smol"); -const u32 gBattleInterface_BallStatusBarGfx[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz"); +const u32 gBattleInterface_BallStatusBarGfx[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.smol"); -const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.lz"); +const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.smol"); const u16 gBattleAnimBgPalette_Ghost[] = INCBIN_U16("graphics/battle_anims/backgrounds/ghost.gbapal"); -const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.lz"); +const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.smolTM"); const u16 gBattleAnimSpritePal_WhipHit[] = INCBIN_U16("graphics/battle_anims/sprites/whip_hit.gbapal"); const u16 gBattleAnimBgPalette_SolarBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/solarbeam.gbapal"); -const u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.bin.lz"); // Unused +const u32 gBattleAnimBgTilemap_SolarBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.bin.smolTM"); // Unused const u16 gBattleAnimBgPalette_MagmaStorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/magma_storm.gbapal"); //new battle bgs -const u32 gBattleAnimBgImage_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.4bpp.lz"); +const u32 gBattleAnimBgImage_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.4bpp.smol"); const u16 gBattleAnimBgPalette_Hurricane[] = INCBIN_U16("graphics/battle_anims/backgrounds/hurricane.gbapal"); -const u32 gBattleAnimBgTilemap_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.bin.lz"); +const u32 gBattleAnimBgTilemap_Hurricane[] = INCBIN_U32("graphics/battle_anims/backgrounds/hurricane.bin.smolTM"); const u16 gBattleAnimBgPalette_RockWrecker[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_wrecker.gbapal"); -const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_player.bin.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.bin.lz"); -const u32 gBattleAnimBgImage_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.4bpp.lz"); -const u32 gBattleAnimBgImage_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.4bpp.lz"); +const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.bin.smolTM"); +const u32 gBattleAnimBgImage_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.4bpp.smol"); +const u32 gBattleAnimBgImage_GigaImpactContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact_contest.4bpp.smol"); const u16 gBattleAnimBgPalette_GigaImpact[] = INCBIN_U16("graphics/battle_anims/backgrounds/giga_impact.gbapal"); -const u32 gBattleAnimBgImage_SpacialRend[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend.4bpp.lz"); +const u32 gBattleAnimBgImage_SpacialRend[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend.4bpp.smol"); const u16 gBattleAnimBgPalette_SpacialRend[] = INCBIN_U16("graphics/battle_anims/backgrounds/spacial_rend.gbapal"); const u16 gBattleAnimBgPalette_SludgeWave[] = INCBIN_U16("graphics/battle_anims/backgrounds/sludge_wave.gbapal"); -const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_tiles.4bpp.lz"); +const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_tiles.4bpp.smol"); const u16 gBattleAnimBgPalette_Aeroblast[] = INCBIN_U16("graphics/battle_anims/backgrounds/aeroblast.gbapal"); -const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_map.bin.lz"); +const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/aeroblast_map.bin.smolTM"); const u16 gBattleAnimBgPalette_AuraSphere[] = INCBIN_U16("graphics/battle_anims/backgrounds/aura_sphere.gbapal"); -const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.4bpp.lz"); +const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.4bpp.smol"); const u16 gBattleAnimBgPalette_BlackholeEclipse[] = INCBIN_U16("graphics/battle_anims/backgrounds/blackhole_eclipse.gbapal"); -const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.bin.lz"); +const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/blackhole_eclipse.bin.smolTM"); -const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.4bpp.lz"); +const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.4bpp.smol"); const u16 gBattleAnimBgPalette_BloomDoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/bloom_doom.gbapal"); -const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.bin.lz"); +const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/bloom_doom.bin.smolTM"); -const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.4bpp.lz"); +const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.4bpp.smol"); const u16 gBattleAnimBgPalette_BoltStrike[] = INCBIN_U16("graphics/battle_anims/backgrounds/bolt_strike.gbapal"); -const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.bin.lz"); +const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/bolt_strike.bin.smolTM"); -const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.4bpp.lz"); +const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.4bpp.smol"); const u16 gBattleAnimBgPalette_ClangorousSoulblaze[] = INCBIN_U16("graphics/battle_anims/backgrounds/clangorous_soulblaze.gbapal"); -const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.bin.lz"); +const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/clangorous_soulblaze.bin.smolTM"); const u16 gBattleAnimBgPalette_DynamaxCannon[] = INCBIN_U16("graphics/battle_anims/backgrounds/dynamax_cannon.gbapal"); -const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.4bpp.lz"); +const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.4bpp.smol"); const u16 gBattleAnimBgPalette_Fire1[] = INCBIN_U16("graphics/battle_anims/backgrounds/fire1.gbapal"); -const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.bin.lz"); +const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/fire1.bin.smolTM"); const u16 gBattleAnimBgPalette_Fire2[] = INCBIN_U16("graphics/battle_anims/backgrounds/fire2.gbapal"); -const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.4bpp.lz"); +const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.4bpp.smol"); const u16 gBattleAnimBgPalette_FocusBlast[] = INCBIN_U16("graphics/battle_anims/backgrounds/focus_blast.gbapal"); -const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.bin.lz"); +const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/focus_blast.bin.smolTM"); const u16 gBattleAnimBgPalette_GarbageFalls[] = INCBIN_U16("graphics/battle_anims/backgrounds/garbage_falls.gbapal"); const u16 gBattleAnimBgPalette_GunkShot[] = INCBIN_U16("graphics/battle_anims/backgrounds/gunk_shot.gbapal"); -const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.4bpp.lz"); +const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.4bpp.smol"); const u16 gBattleAnimBgPalette_HydroCannon[] = INCBIN_U16("graphics/battle_anims/backgrounds/hydro_cannon.gbapal"); -const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.bin.lz"); +const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_cannon.bin.smolTM"); const u16 gBattleAnimBgPalette_Chloroblast[] = INCBIN_U16("graphics/battle_anims/backgrounds/chloroblast.gbapal"); -const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.4bpp.lz"); +const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.4bpp.smol"); const u16 gBattleAnimBgPalette_HydroPump[] = INCBIN_U16("graphics/battle_anims/backgrounds/hydro_pump.gbapal"); -const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.bin.lz"); +const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/hydro_pump.bin.smolTM"); const u16 gBattleAnimBgPalette_HyperBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/hyper_beam.gbapal"); const u16 gBattleAnimBgPalette_HyperspaceFury[] = INCBIN_U16("graphics/battle_anims/backgrounds/hyperspace_fury.gbapal"); -const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.4bpp.lz"); +const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.4bpp.smol"); const u16 gBattleAnimBgPalette_InfernoOverdrive[] = INCBIN_U16("graphics/battle_anims/backgrounds/inferno_overdrive.gbapal"); -const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.bin.lz"); +const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/inferno_overdrive.bin.smolTM"); -const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.4bpp.lz"); +const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.4bpp.smol"); const u16 gBattleAnimBgPalette_LeafStorm[] = INCBIN_U16("graphics/battle_anims/backgrounds/leaf_storm.gbapal"); -const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.bin.lz"); +const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/leaf_storm.bin.smolTM"); -const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.4bpp.lz"); +const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.4bpp.smol"); const u16 gBattleAnimBgPalette_MaliciousMoonsault[] = INCBIN_U16("graphics/battle_anims/backgrounds/malicious_moonsault.gbapal"); -const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.bin.lz"); +const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/malicious_moonsault.bin.smolTM"); -const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.4bpp.lz"); +const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.4bpp.smol"); const u16 gBattleAnimBgPalette_MaxLightning[] = INCBIN_U16("graphics/battle_anims/backgrounds/max_lightning.gbapal"); -const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.bin.lz"); +const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/max_lightning.bin.smolTM"); -const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.4bpp.lz"); +const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.4bpp.smol"); const u16 gBattleAnimBgPalette_NeverendingNightmare[] = INCBIN_U16("graphics/battle_anims/backgrounds/neverending_nightmare.gbapal"); -const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.bin.lz"); +const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/neverending_nightmare.bin.smolTM"); #if B_NEW_TERRAIN_BACKGROUNDS -const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_electric_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_electric_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_grassy_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_grassy_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_misty_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_misty_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/new_psychic_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new_psychic_terrain.bin.smolTM"); #else -const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/electric_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/electric_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/grassy_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/grassy_terrain.bin.smolTM"); -const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.4bpp.lz"); +const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.4bpp.smol"); const u16 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U16("graphics/battle_anims/backgrounds/misty_terrain.gbapal"); -const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.bin.lz"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/misty_terrain.bin.smolTM"); #endif -const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.4bpp.lz"); +const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.4bpp.smol"); const u16 gBattleAnimBgPalette_Nightmare[] = INCBIN_U16("graphics/battle_anims/backgrounds/nightmare.gbapal"); -const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.bin.lz"); +const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/nightmare.bin.smolTM"); const u16 gBattleAnimBgPalette_PoisonFalls[] = INCBIN_U16("graphics/battle_anims/backgrounds/poison_falls.gbapal"); const u16 gBattleAnimBgPalette_PsychicNew[] = INCBIN_U16("graphics/battle_anims/backgrounds/psychic_new.gbapal"); -const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.4bpp.lz"); +const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.4bpp.smol"); const u16 gBattleAnimBgPalette_ShatteredPsyche[] = INCBIN_U16("graphics/battle_anims/backgrounds/shattered_psyche.gbapal"); -const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.bin.lz"); +const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/shattered_psyche.bin.smolTM"); -const u32 gBattleAnimBgImage_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.4bpp.lz"); +const u32 gBattleAnimBgImage_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.4bpp.smol"); const u16 gBattleAnimBgPalette_RockDay[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_day.gbapal"); -const u32 gBattleAnimBgTilemap_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.bin.lz"); +const u32 gBattleAnimBgTilemap_RockField[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_field.bin.smolTM"); const u16 gBattleAnimBgPalette_RockAfternoon[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_afternoon.gbapal"); const u16 gBattleAnimBgPalette_RockNight[] = INCBIN_U16("graphics/battle_anims/backgrounds/rock_night.gbapal"); -const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.4bpp.lz"); +const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.4bpp.smol"); const u16 gBattleAnimBgPalette_SnuggleForever[] = INCBIN_U16("graphics/battle_anims/backgrounds/snuggle_forever.gbapal"); -const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.bin.lz"); +const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/snuggle_forever.bin.smolTM"); -const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.4bpp.lz"); +const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.4bpp.smol"); const u16 gBattleAnimBgPalette_SoulStealing7StarStrike[] = INCBIN_U16("graphics/battle_anims/backgrounds/soulstealing_7star_strike.gbapal"); -const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.bin.lz"); +const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/soulstealing_7star_strike.bin.smolTM"); const u16 gBattleAnimBgPalette_TectonicRage[] = INCBIN_U16("graphics/battle_anims/backgrounds/tectonic_rage.gbapal"); -const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.lz"); +const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.smol"); const u16 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/trick_room.gbapal"); -const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.bin.lz"); +const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.bin.smolTM"); const u16 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/magic_room.gbapal"); const u16 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U16("graphics/battle_anims/backgrounds/wonder_room.gbapal"); -const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.4bpp.lz"); +const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.4bpp.smol"); const u16 gBattleAnimBgPalette_TwinkleTackle[] = INCBIN_U16("graphics/battle_anims/backgrounds/twinkle_tackle.gbapal"); -const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.bin.lz"); +const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/twinkle_tackle.bin.smolTM"); -const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.4bpp.lz"); +const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.4bpp.smol"); const u16 gBattleAnimBgPalette_WaterPulse[] = INCBIN_U16("graphics/battle_anims/backgrounds/water_pulse.gbapal"); -const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.bin.lz"); +const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_pulse.bin.smolTM"); -const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.4bpp.lz"); +const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.4bpp.smol"); const u16 gBattleAnimBgPalette_Waterfall[] = INCBIN_U16("graphics/battle_anims/backgrounds/waterfall.gbapal"); -const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.bin.lz"); +const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/waterfall.bin.smolTM"); const u16 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U16("graphics/battle_anims/backgrounds/dark_void.gbapal"); -const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.lz"); +const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin.smolTM"); -const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.4bpp.lz"); +const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.4bpp.smol"); const u16 gBattleAnimBgPalette_ZMoveActivate[] = INCBIN_U16("graphics/battle_anims/backgrounds/zmove_activate.gbapal"); -const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.bin.lz"); +const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_activate.bin.smolTM"); -const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.4bpp.lz"); +const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.4bpp.smol"); const u16 gBattleAnimBgPalette_ZMoveMountain[] = INCBIN_U16("graphics/battle_anims/backgrounds/zmove_mountain.gbapal"); -const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.bin.lz"); +const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/zmove_mountain.bin.smolTM"); const u16 gBattleAnimBgPalette_SteelBeam[] = INCBIN_U16("graphics/battle_anims/backgrounds/steel_beam.gbapal"); // misc -const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); -const u32 gBerryBlenderOuter_Gfx[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz"); -const u32 gBerryBlenderOuter_Tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz"); +const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.smol"); +const u32 gBerryBlenderOuter_Gfx[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.smol"); +const u32 gBerryBlenderOuter_Tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.smolTM"); const u16 gBattleAnimBgPalette_Cosmic[] = INCBIN_U16("graphics/battle_anims/backgrounds/cosmic.gbapal"); -const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.lz"); -const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.lz"); +const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.smol"); +const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.smolTM"); const u16 gBattleAnimSpritePal_SlamHit2[] = INCBIN_U16("graphics/battle_anims/sprites/slam_hit_2.gbapal"); -const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.smol"); -const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.lz"); +const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.smolTM"); const u16 gBattleAnimSpritePal_WeatherBall[] = INCBIN_U16("graphics/battle_anims/sprites/weather_ball.gbapal"); -const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.smol"); -const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.lz"); -const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.lz"); +const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.smol"); const u16 gBattleAnimSpritePal_Hail[] = INCBIN_U16("graphics/battle_anims/sprites/hail.gbapal"); -const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.smol"); const u16 gBattleAnimSpritePal_GreenSpike[] = INCBIN_U16("graphics/battle_anims/sprites/green_spike.gbapal"); const u16 gBattleAnimSpritePal_WhiteCircleOfLight[] = INCBIN_U16("graphics/battle_anims/sprites/white_circle_of_light.gbapal"); const u16 gBattleAnimSpritePal_GlowyBlueOrb[] = INCBIN_U16("graphics/battle_anims/sprites/glowy_blue_orb.gbapal"); -const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.smol"); const u16 gBattleAnimSpritePal_Recycle[] = INCBIN_U16("graphics/battle_anims/sprites/recycle.gbapal"); -const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.smol"); const u16 gBattleAnimSpritePal_RedParticles[] = INCBIN_U16("graphics/battle_anims/sprites/red_particles.gbapal"); -const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.smol"); const u16 gBattleAnimSpritePal_DirtMound[] = INCBIN_U16("graphics/battle_anims/sprites/dirt_mound.gbapal"); -const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.lz"); +const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.smol"); const u16 gBattleAnimBgPalette_Fissure[] = INCBIN_U16("graphics/battle_anims/backgrounds/fissure.gbapal"); -const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.lz"); +const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.smolTM"); -const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.smol"); const u16 gBattleAnimSpritePal_Bird[] = INCBIN_U16("graphics/battle_anims/sprites/bird.gbapal"); -const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.smol"); const u16 gBattleAnimSpritePal_CrossImpact[] = INCBIN_U16("graphics/battle_anims/sprites/cross_impact.gbapal"); -const u32 gBattleAnimBgImage_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.lz"); +const u32 gBattleAnimBgImage_Surf[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.smol"); const u16 gBattleAnimBgPalette_Surf[] = INCBIN_U16("graphics/battle_anims/backgrounds/water.gbapal"); -const u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_opponent.bin.lz"); -const u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_player.bin.lz"); -const u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_contest.bin.lz"); +const u32 gBattleAnimBgTilemap_SurfOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_opponent.bin.smolTM"); +const u32 gBattleAnimBgTilemap_SurfPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_player.bin.smolTM"); +const u32 gBattleAnimBgTilemap_SurfContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_contest.bin.smolTM"); const u16 gBattleAnimSpritePal_Slash2[] = INCBIN_U16("graphics/battle_anims/sprites/slash_2.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U16("graphics/battle_anims/sprites/white_shadow.gbapal"); // Pledge Effect field status - Rainbow -const u32 gBattleAnimBgImage_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.4bpp.lz"); +const u32 gBattleAnimBgImage_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.4bpp.smol"); const u16 gBattleAnimBGPalette_Rainbow[] = INCBIN_U16("graphics/battle_anims/backgrounds/rainbow.gbapal"); -const u32 gBattleAnimBgTilemap_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.bin.lz"); +const u32 gBattleAnimBgTilemap_Rainbow[] = INCBIN_U32("graphics/battle_anims/backgrounds/rainbow.bin.smolTM"); // Pledge Effect field status - Swamp -const u32 gBattleAnimBgImage_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.4bpp.lz"); +const u32 gBattleAnimBgImage_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.4bpp.smol"); const u16 gBattleAnimBGPalette_Swamp[] = INCBIN_U16("graphics/battle_anims/backgrounds/swampswizzle.gbapal"); -const u32 gBattleAnimBgTilemap_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.bin.lz"); +const u32 gBattleAnimBgTilemap_Swamp[] = INCBIN_U32("graphics/battle_anims/backgrounds/swampswizzle.bin.smolTM"); -const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.lz"); +const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.smol"); const u16 gPartyMenuBg_Pal[] = INCBIN_U16("graphics/party_menu/bg.gbapal"); -const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.lz"); +const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.smolTM"); -const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.lz"); -const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.lz"); //unused +const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.smol"); +const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.smol"); //unused const u16 gPartyMenuPokeball_Pal[] = INCBIN_U16("graphics/party_menu/pokeball.gbapal"); -const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.lz"); +const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.smol"); const u16 gStatusPal_Icons[] = INCBIN_U16("graphics/interface/status_icons.gbapal"); const u16 gCategoryIcons_Pal[] = INCBIN_U16("graphics/interface/category_icons.gbapal"); -const u32 gCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.lz"); +const u32 gCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.smol"); -const u32 gMoveTypes_Gfx[] = INCBIN_U32("graphics/types/move_types.4bpp.lz"); +const u32 gMoveTypes_Gfx[] = INCBIN_U32("graphics/types/move_types.4bpp.smol"); const u16 gMoveTypes_Pal[] = INCBIN_U16("graphics/types/move_types.gbapal"); -const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.lz"); +const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.smol"); const u16 gSummaryMoveSelect_Pal[] = INCBIN_U16("graphics/summary_screen/move_select.gbapal"); #if P_SUMMARY_SCREEN_IV_EV_TILESET -const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/iv_ev_tiles.4bpp.lz"); +const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/iv_ev_tiles.4bpp.smol"); #else -const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.lz"); +const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.smol"); #endif // P_SUMMARY_SCREEN_IV_EV_TILESET const u16 gSummaryScreen_Pal[] = INCBIN_U16("graphics/summary_screen/tiles.gbapal"); -const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.lz"); -const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.lz"); -const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_battle_moves.bin.lz"); -const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_contest_moves.bin.lz"); -const u32 gSummaryPage_InfoEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info_egg.bin.lz"); +const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.smolTM"); +const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.smolTM"); +const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_battle_moves.bin.smolTM"); +const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_contest_moves.bin.smolTM"); +const u32 gSummaryPage_InfoEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info_egg.bin.smolTM"); -const u32 gBagMaleTiles[] = INCBIN_U32("graphics/bag/bag_male.4bpp.lz"); -const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/bag/bag_female.4bpp.lz"); +const u32 gBagMaleTiles[] = INCBIN_U32("graphics/bag/bag_male.4bpp.smol"); +const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/bag/bag_female.4bpp.smol"); const u16 gBagPalette[] = INCBIN_U16("graphics/bag/bag.gbapal"); const u16 gBagScreenMale_Pal[] = INCBIN_U16("graphics/bag/menu_male.gbapal"); const u16 gBagScreenFemale_Pal[] = INCBIN_U16("graphics/bag/menu_female.gbapal"); -const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/bag/menu.4bpp.lz"); -const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/bag/menu.bin.lz"); +const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/bag/menu.4bpp.smol"); +const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/bag/menu.bin.smolTM"); -const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/bag/bag_pyramid.4bpp.lz"); +const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/bag/bag_pyramid.4bpp.smol"); const u16 gBattlePyramidBag_Pal[] = INCBIN_U16("graphics/bag/bag_pyramid.gbapal"); // female palette is first and male is second. -const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/bag/menu_pyramid.bin.lz"); +const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/bag/menu_pyramid.bin.smolTM"); const u16 gBattlePyramidBagInterface_Pal[] = INCBIN_U16("graphics/bag/menu_pyramid.gbapal"); -const u32 gSwapLineGfx[] = INCBIN_U32("graphics/interface/swap_line.4bpp.lz"); +const u32 gSwapLineGfx[] = INCBIN_U32("graphics/interface/swap_line.4bpp.smol"); const u16 gSwapLinePal[] = INCBIN_U16("graphics/interface/swap_line.gbapal"); -const u32 gShopMenu_Gfx[] = INCBIN_U32("graphics/shop/menu.4bpp.lz"); +const u32 gShopMenu_Gfx[] = INCBIN_U32("graphics/shop/menu.4bpp.smol"); const u16 gShopMenu_Pal[] = INCBIN_U16("graphics/shop/menu.gbapal"); -const u32 gShopMenu_Tilemap[] = INCBIN_U32("graphics/shop/menu.bin.lz"); -const u32 gShopMenuMoney_Gfx[] = INCBIN_U32("graphics/shop/money.4bpp.lz"); +const u32 gShopMenu_Tilemap[] = INCBIN_U32("graphics/shop/menu.bin.smolTM"); +const u32 gShopMenuMoney_Gfx[] = INCBIN_U32("graphics/shop/money.4bpp.smol"); // Pokeblock -const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/menu.4bpp.lz"); +const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/menu.4bpp.smol"); const u16 gMenuPokeblock_Pal[] = INCBIN_U16("graphics/pokeblock/menu.gbapal"); -const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/pokeblock/device.4bpp.lz"); +const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/pokeblock/device.4bpp.smol"); const u16 gMenuPokeblockDevice_Pal[] = INCBIN_U16("graphics/pokeblock/device.gbapal"); -const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/pokeblock/menu.bin.lz"); +const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/pokeblock/menu.bin.smolTM"); -const u32 gPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/pokeblock.4bpp.lz"); +const u32 gPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/pokeblock.4bpp.smol"); const u16 gPokeblockRed_Pal[] = INCBIN_U16("graphics/pokeblock/red.gbapal"); const u16 gPokeblockBlue_Pal[] = INCBIN_U16("graphics/pokeblock/blue.gbapal"); const u16 gPokeblockPink_Pal[] = INCBIN_U16("graphics/pokeblock/pink.gbapal"); @@ -1750,7 +1750,7 @@ const u16 gPokeblockBlack_Pal[] = INCBIN_U16("graphics/pokeblock/black.gbapal"); const u16 gPokeblockWhite_Pal[] = INCBIN_U16("graphics/pokeblock/white.gbapal"); const u16 gPokeblockGold_Pal[] = INCBIN_U16("graphics/pokeblock/gold.gbapal"); -const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg.bin.lz"); +const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg.bin.smolTM"); #include "data/graphics/berries.h" #include "data/graphics/rayquaza_scene.h" @@ -1758,29 +1758,29 @@ const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg #include "data/graphics/decorations.h" const u16 gBattleAnimSpritePal_Shock3[] = INCBIN_U16("graphics/battle_anims/sprites/shock_3.gbapal"); -const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.smol"); const u16 gBattleAnimSpritePal_WhiteFeather[] = INCBIN_U16("graphics/battle_anims/sprites/white_feather.gbapal"); -const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.smol"); const u16 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U16("graphics/battle_anims/sprites/sparkle_6.gbapal"); -const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.smol"); const u16 gCableCarBg_Pal[] = INCBIN_U16("graphics/cable_car/bg.gbapal"); const u16 gCableCar_Pal[] = INCBIN_U16("graphics/cable_car/cable_car.gbapal"); -const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.lz"); -const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.lz"); -const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.lz"); -const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.lz"); +const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.smol"); +const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.smol"); +const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.smol"); +const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.smol"); // Roulette -const u32 gRouletteMenu_Gfx[] = INCBIN_U32("graphics/roulette/window.4bpp.lz"); -const u32 gRouletteWheel_Gfx[] = INCBIN_U32("graphics/roulette/wheel.8bpp.lz"); -const u32 gRouletteCenter_Gfx[] = INCBIN_U32("graphics/roulette/center.4bpp.lz"); -const u32 gRouletteHeaders_Gfx[] = INCBIN_U32("graphics/roulette/headers.4bpp.lz"); -const u32 gRouletteCredit_Gfx[] = INCBIN_U32("graphics/roulette/credit.4bpp.lz"); -const u32 gRouletteNumbers_Gfx[] = INCBIN_U32("graphics/roulette/numbers.4bpp.lz"); -const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4bpp.lz"); +const u32 gRouletteMenu_Gfx[] = INCBIN_U32("graphics/roulette/window.4bpp.smol"); +const u32 gRouletteWheel_Gfx[] = INCBIN_U32("graphics/roulette/wheel.8bpp.smol"); +const u32 gRouletteCenter_Gfx[] = INCBIN_U32("graphics/roulette/center.4bpp.smol"); +const u32 gRouletteHeaders_Gfx[] = INCBIN_U32("graphics/roulette/headers.4bpp.smol"); +const u32 gRouletteCredit_Gfx[] = INCBIN_U32("graphics/roulette/credit.4bpp.smol"); +const u32 gRouletteNumbers_Gfx[] = INCBIN_U32("graphics/roulette/numbers.4bpp.smol"); +const u32 gRouletteMultiplier_Gfx[] = INCBIN_U32("graphics/roulette/multiplier.4bpp.smol"); #include "data/graphics/mail.h" @@ -1788,7 +1788,7 @@ const u16 gFrontierFactoryMenu_Pal[] = INCBIN_U16("graphics/battle_frontier/fact const u16 gFrontierFactoryMenu_Gfx[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.4bpp"); const u16 gFrontierFactoryMenu_Tilemap[] = INCBIN_U16("graphics/battle_frontier/factory_screen/menu.bin"); -const u32 gFrontierPassMedals_Gfx[] = INCBIN_U32("graphics/frontier_pass/medals.4bpp.lz"); +const u32 gFrontierPassMedals_Gfx[] = INCBIN_U32("graphics/frontier_pass/medals.4bpp.smol"); const u16 gFrontierPassCursor_Pal[] = INCBIN_U16("graphics/frontier_pass/cursor.gbapal"); @@ -1801,33 +1801,33 @@ const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gol const u16 gPokedexBgHoenn_Pal[] = INCBIN_U16("graphics/pokedex/bg_hoenn.gbapal"); const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal"); -const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); -const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.lz"); -const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.lz"); -const u32 gPokedexStartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_main.bin.lz"); -const u32 gPokedexStartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_search_results.bin.lz"); -const u32 gPokedexList_Tilemap[] = INCBIN_U32("graphics/pokedex/list.bin.lz"); -const u32 gPokedexListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/list_underlay.bin.lz"); -const u32 gPokedexSizeScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/size_screen.bin.lz"); -const u32 gPokedexScreenSelectBarMain_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_main.bin.lz"); -const u32 gPokedexScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu.bin.lz"); -const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.lz"); -const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.lz"); +const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.smol"); +const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.smol"); +const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.smol"); +const u32 gPokedexStartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_main.bin.smolTM"); +const u32 gPokedexStartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_search_results.bin.smolTM"); +const u32 gPokedexList_Tilemap[] = INCBIN_U32("graphics/pokedex/list.bin.smolTM"); +const u32 gPokedexListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/list_underlay.bin.smolTM"); +const u32 gPokedexSizeScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/size_screen.bin.smolTM"); +const u32 gPokedexScreenSelectBarMain_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_main.bin.smolTM"); +const u32 gPokedexScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu.bin.smolTM"); +const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.smolTM"); +const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.smolTM"); const u16 gPokedexSearchMenu_Pal[] = INCBIN_U16("graphics/pokedex/search_menu.gbapal"); -const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.lz"); -const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.lz"); -const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.lz"); +const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.smol"); +const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.smolTM"); +const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.smolTM"); const u16 gSummaryScreen_MoveEffect_Battle_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_battle.bin"); const u16 gSummaryScreen_MoveEffect_Contest_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_contest.bin"); const u16 gSummaryScreen_MoveEffect_Cancel_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_cancel.bin"); const u16 gIntroCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal"); -const u32 gIntroCopyright_Gfx[] = INCBIN_U32("graphics/intro/copyright.4bpp.lz"); -const u32 gIntroCopyright_Tilemap[] = INCBIN_U32("graphics/intro/copyright.bin.lz"); +const u32 gIntroCopyright_Gfx[] = INCBIN_U32("graphics/intro/copyright.4bpp.smol"); +const u32 gIntroCopyright_Tilemap[] = INCBIN_U32("graphics/intro/copyright.bin.smolTM"); const u16 gPokedexAreaScreenAreaUnknown_Pal[] = INCBIN_U16("graphics/pokedex/area_unknown.gbapal"); -const u32 gPokedexAreaScreenAreaUnknown_Gfx[] = INCBIN_U32("graphics/pokedex/area_unknown.4bpp.lz"); +const u32 gPokedexAreaScreenAreaUnknown_Gfx[] = INCBIN_U32("graphics/pokedex/area_unknown.4bpp.smol"); const u16 gMenuInfoElements1_Pal[] = INCBIN_U16("graphics/interface/menu_info1.gbapal"); const u16 gMenuInfoElements2_Pal[] = INCBIN_U16("graphics/interface/menu_info2.gbapal"); @@ -1853,37 +1853,37 @@ const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/r // PokéNav const u16 gPokenavCondition_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph.gbapal"); -const u32 gPokenavCondition_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph.4bpp.lz"); -const u32 gPokenavCondition_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph.bin.lz"); +const u32 gPokenavCondition_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph.4bpp.smol"); +const u32 gPokenavCondition_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph.bin.smolTM"); const u16 gPokenavOptions_Tilemap[] = INCBIN_U16("graphics/pokenav/options/options.bin"); -const u32 gPokenavOptions_Gfx[] = INCBIN_U32("graphics/pokenav/options/options.4bpp.lz"); +const u32 gPokenavOptions_Gfx[] = INCBIN_U32("graphics/pokenav/options/options.4bpp.smol"); const u16 gPokenavOptions_Pal[] = INCBIN_U16("graphics/pokenav/options/options.gbapal"); const u16 gPokenavHeader_Pal[] = INCBIN_U16("graphics/pokenav/header.gbapal"); -const u32 gPokenavHeader_Gfx[] = INCBIN_U32("graphics/pokenav/header.4bpp.lz"); // TODO: use width 9 and makefile rule for cleanliness, make wasnt behaving, didnt want to apply num_tiles to this -const u32 gPokenavHeader_Tilemap[] = INCBIN_U32("graphics/pokenav/header.bin.lz"); +const u32 gPokenavHeader_Gfx[] = INCBIN_U32("graphics/pokenav/header.4bpp.smol"); // TODO: use width 9 and makefile rule for cleanliness, make wasnt behaving, didnt want to apply num_tiles to this +const u32 gPokenavHeader_Tilemap[] = INCBIN_U32("graphics/pokenav/header.bin.smolTM"); const u16 gPokenavLeftHeader_Pal[] = INCBIN_U16("graphics/pokenav/left_headers/palette.gbapal"); -const u32 gPokenavLeftHeaderBeauty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/beauty.4bpp.lz"); -const u32 gPokenavLeftHeaderSmart_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/smart.4bpp.lz"); -const u32 gPokenavLeftHeaderCondition_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/condition.4bpp.lz"); -const u32 gPokenavLeftHeaderCute_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cute.4bpp.lz"); -const u32 gPokenavLeftHeaderMatchCall_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/match_call.4bpp.lz"); -const u32 gPokenavLeftHeaderMainMenu_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/main_menu.4bpp.lz"); -const u32 gPokenavLeftHeaderHoennMap_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/hoenn_map.4bpp.lz"); -const u32 gPokenavLeftHeaderRibbons_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/ribbons.4bpp.lz"); -const u32 gPokenavLeftHeaderSearch_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/search.4bpp.lz"); -const u32 gPokenavLeftHeaderTough_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/tough.4bpp.lz"); -const u32 gPokenavLeftHeaderCool_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cool.4bpp.lz"); -const u32 gPokenavLeftHeaderParty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/party.4bpp.lz"); +const u32 gPokenavLeftHeaderBeauty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/beauty.4bpp.smol"); +const u32 gPokenavLeftHeaderSmart_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/smart.4bpp.smol"); +const u32 gPokenavLeftHeaderCondition_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/condition.4bpp.smol"); +const u32 gPokenavLeftHeaderCute_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cute.4bpp.smol"); +const u32 gPokenavLeftHeaderMatchCall_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/match_call.4bpp.smol"); +const u32 gPokenavLeftHeaderMainMenu_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/main_menu.4bpp.smol"); +const u32 gPokenavLeftHeaderHoennMap_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/hoenn_map.4bpp.smol"); +const u32 gPokenavLeftHeaderRibbons_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/ribbons.4bpp.smol"); +const u32 gPokenavLeftHeaderSearch_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/search.4bpp.smol"); +const u32 gPokenavLeftHeaderTough_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/tough.4bpp.smol"); +const u32 gPokenavLeftHeaderCool_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/cool.4bpp.smol"); +const u32 gPokenavLeftHeaderParty_Gfx[] = INCBIN_U32("graphics/pokenav/left_headers/party.4bpp.smol"); const u16 gPokenavMessageBox_Pal[] = INCBIN_U16("graphics/pokenav/message.gbapal"); -const u32 gPokenavMessageBox_Gfx[] = INCBIN_U32("graphics/pokenav/message.4bpp.lz"); -const u32 gPokenavMessageBox_Tilemap[] = INCBIN_U32("graphics/pokenav/message.bin.lz"); +const u32 gPokenavMessageBox_Gfx[] = INCBIN_U32("graphics/pokenav/message.4bpp.smol"); +const u32 gPokenavMessageBox_Tilemap[] = INCBIN_U32("graphics/pokenav/message.bin.smolTM"); const u16 gRegionMapCityZoomTiles_Pal[] = INCBIN_U16("graphics/pokenav/region_map/zoom_tiles.gbapal"); -const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/city_zoom_text.4bpp.lz"); +const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/city_zoom_text.4bpp.smol"); const u16 gPokenavConditionCancel_Pal[] = INCBIN_U16("graphics/pokenav/condition/cancel.gbapal"); const u8 gPokenavConditionCancel_Gfx[] = INCBIN_U8("graphics/pokenav/condition/cancel.4bpp"); @@ -1904,33 +1904,33 @@ const u8 gBerryBlenderPlayerArrow_Gfx[] = INCBIN_U8("graphics/berry_blender/arro static const u8 sEmpty2[0x2C0] = {0}; const u16 gEasyChatRectangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/rectangle_cursor.gbapal"); -const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.lz"); +const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.smol"); const u16 gEasyChatButtonWindow_Pal[] = INCBIN_U16("graphics/easy_chat/button_window.gbapal"); -const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.lz"); +const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.smol"); -const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.lz"); +const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.smol"); const u16 gEasyChatMode_Pal[] = INCBIN_U16("graphics/easy_chat/mode.gbapal"); -const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/window.4bpp.lz"); // uses mode pal -const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/easy_chat/window.bin.lz"); +const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/window.4bpp.smol"); // uses mode pal +const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/easy_chat/window.bin.smolTM"); const u16 gWallClockMale_Pal[] = INCBIN_U16("graphics/wallclock/male.gbapal"); const u16 gWallClockFemale_Pal[] = INCBIN_U16("graphics/wallclock/female.gbapal"); -const u32 gWallClock_Gfx[] = INCBIN_U32("graphics/wallclock/clock.4bpp.lz"); -const u32 gWallClockStart_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_start.bin.lz"); -const u32 gWallClockView_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_view.bin.lz"); +const u32 gWallClock_Gfx[] = INCBIN_U32("graphics/wallclock/clock.4bpp.smol"); +const u32 gWallClockStart_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_start.bin.smolTM"); +const u32 gWallClockView_Tilemap[] = INCBIN_U32("graphics/wallclock/clock_view.bin.smolTM"); const u16 gUsePokeblockCondition_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/condition.gbapal"); -const u32 gUsePokeblockCondition_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/condition.4bpp.lz"); +const u32 gUsePokeblockCondition_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/condition.4bpp.smol"); const u16 gUsePokeblockUpDown_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/updown.gbapal"); const u8 gUsePokeblockUpDown_Gfx[] = INCBIN_U8("graphics/pokeblock/use_screen/updown.4bpp"); const u16 gUsePokeblockGraph_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/graph.gbapal"); -const u32 gUsePokeblockGraph_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.4bpp.lz"); +const u32 gUsePokeblockGraph_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.4bpp.smol"); -const u32 gUsePokeblockGraph_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.bin.lz"); +const u32 gUsePokeblockGraph_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph.bin.smolTM"); const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_screen/nature.gbapal"); #include "data/graphics/slot_machine.h" @@ -1938,24 +1938,24 @@ const u16 gUsePokeblockNatureWin_Pal[] = INCBIN_U16("graphics/pokeblock/use_scre // trainer card const u16 gHoennTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/green.gbapal"); -const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/tiles.4bpp.lz"); -const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.lz"); -const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.lz"); -const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.lz"); -const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.lz"); +const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/tiles.4bpp.smol"); +const u32 gHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin.smolTM"); +const u32 gHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin.smolTM"); +const u32 gHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin.smolTM"); +const u32 gHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin.smolTM"); const u16 gKantoTrainerCardBlue_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/blue.gbapal"); -const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/tiles.4bpp.lz"); -const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/bg.bin.lz"); -const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front.bin.lz"); -const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/back.bin.lz"); -const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front_link.bin.lz"); +const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/tiles.4bpp.smol"); +const u32 gKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/bg.bin.smolTM"); +const u32 gKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front.bin.smolTM"); +const u32 gKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/back.bin.smolTM"); +const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/frlg/front_link.bin.smolTM"); // Pokémon storage system -const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); +const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.smol"); const u16 gStorageSystemPartyMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/party_menu.gbapal"); -const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.lz"); +const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.smolTM"); // naming screen @@ -1968,7 +1968,7 @@ const u16 gNamingScreenMenu_Pal[6][16] = INCBIN_U16("graphics/naming_screen/buttons.gbapal"), INCBIN_U16("graphics/naming_screen/cursor.gbapal"), }; -const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.lz"); +const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/naming_screen/menu.4bpp.smol"); const u32 gNamingScreenPageSwapFrame_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_frame.4bpp"); const u32 gNamingScreenBackButton_Gfx[] = INCBIN_U32("graphics/naming_screen/back_button.4bpp"); const u32 gNamingScreenOKButton_Gfx[] = INCBIN_U32("graphics/naming_screen/ok_button.4bpp"); @@ -1981,20 +1981,20 @@ const u32 gNamingScreenCursorFilled_Gfx[] = INCBIN_U32("graphics/naming_s const u32 gNamingScreenPageSwapButton_Gfx[] = INCBIN_U32("graphics/naming_screen/page_swap_button.4bpp"); const u32 gNamingScreenInputArrow_Gfx[] = INCBIN_U32("graphics/naming_screen/input_arrow.4bpp"); const u32 gNamingScreenUnderscore_Gfx[] = INCBIN_U32("graphics/naming_screen/underscore.4bpp"); -const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.lz"); -const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.lz"); -const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.lz"); -const u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_symbols.bin.lz"); +const u32 gNamingScreenBackground_Tilemap[] = INCBIN_U32("graphics/naming_screen/background.bin.smolTM"); +const u32 gNamingScreenKeyboardUpper_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_upper.bin.smolTM"); +const u32 gNamingScreenKeyboardLower_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_lower.bin.smolTM"); +const u32 gNamingScreenKeyboardSymbols_Tilemap[] = INCBIN_U32("graphics/naming_screen/keyboard_symbols.bin.smolTM"); // union room chat const u16 gUnionRoomChat_Background_Pal[] = INCBIN_U16("graphics/union_room_chat/background.gbapal"); -const u32 gUnionRoomChat_Background_Gfx[] = INCBIN_U32("graphics/union_room_chat/background.4bpp.lz"); -const u32 gUnionRoomChat_Background_Tilemap[] = INCBIN_U32("graphics/union_room_chat/background.bin.lz"); +const u32 gUnionRoomChat_Background_Gfx[] = INCBIN_U32("graphics/union_room_chat/background.4bpp.smol"); +const u32 gUnionRoomChat_Background_Tilemap[] = INCBIN_U32("graphics/union_room_chat/background.bin.smolTM"); const u16 gUnionRoomChat_InputText_Pal[] = INCBIN_U16("graphics/union_room_chat/input_text.gbapal"); const u16 gUnionRoomChat_Keyboard_Pal[] = INCBIN_U16("graphics/union_room_chat/keyboard.gbapal"); -const u32 gUnionRoomChat_Keyboard_Gfx[] = INCBIN_U32("graphics/union_room_chat/keyboard.4bpp.lz"); -const u32 gUnionRoomChat_Keyboard_Tilemap[] = INCBIN_U32("graphics/union_room_chat/keyboard.bin.lz"); -const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.lz"); +const u32 gUnionRoomChat_Keyboard_Gfx[] = INCBIN_U32("graphics/union_room_chat/keyboard.4bpp.smol"); +const u32 gUnionRoomChat_Keyboard_Tilemap[] = INCBIN_U32("graphics/union_room_chat/keyboard.bin.smolTM"); +const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.smol"); const u16 ALIGNED(4) gTilesetPalettes_General[][16] = { @@ -2016,7 +2016,7 @@ const u16 ALIGNED(4) gTilesetPalettes_General[][16] = INCBIN_U16("data/tilesets/primary/general/palettes/15.gbapal"), }; -const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.lz"); +const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.smol"); // trade/egg hatch @@ -2041,9 +2041,9 @@ const u16 gMessageBox_Pal[] = INCBIN_U16("graphics/text_window/message_box.gbapa const u8 gMessageBox_Gfx[] = INCBIN_U8("graphics/text_window/message_box.4bpp"); const u8 gSignpostWindow_Gfx[] = INCBIN_U8("graphics/text_window/signpost.4bpp"); -const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.lz"); -const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.lz"); -const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle.4bpp.lz"); +const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.smol"); +const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.smol"); +const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle.4bpp.smol"); const u16 gWallpaperPalettes_Horizontal[][16] = { @@ -2051,8 +2051,8 @@ const u16 gWallpaperPalettes_Horizontal[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/horizontal/bg.gbapal"), }; -const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tiles.4bpp.lz"); -const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tilemap.bin.lz"); +const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tiles.4bpp.smol"); +const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tilemap.bin.smolTM"); const u16 gWallpaperPalettes_Ribbon[][16] = { @@ -2060,12 +2060,12 @@ const u16 gWallpaperPalettes_Ribbon[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/ribbon/bg.gbapal"), }; -const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tiles.4bpp.lz"); -const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tilemap.bin.lz"); +const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tiles.4bpp.smol"); +const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tilemap.bin.smolTM"); const u16 gPokenavRibbonsSummaryBg_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/summary_bg.gbapal"); -const u32 gPokenavRibbonsSummaryBg_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.4bpp.lz"); -const u32 gPokenavRibbonsSummaryBg_Tilemap[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.bin.lz"); +const u32 gPokenavRibbonsSummaryBg_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.4bpp.smol"); +const u32 gPokenavRibbonsSummaryBg_Tilemap[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.bin.smolTM"); const u16 gMonIconPalettes[][16] = { @@ -2080,27 +2080,27 @@ const u16 gMonIconPalettes[][16] = const u16 gTitleScreenBgPalettes[] = INCBIN_U16("graphics/title_screen/pokemon_logo.gbapal", "graphics/title_screen/rayquaza_and_clouds.gbapal"); const u16 gTitleScreenEmeraldVersionPal[] = INCBIN_U16("graphics/title_screen/emerald_version.gbapal"); -const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/clouds.bin.lz"); -const u32 gTitleScreenPokemonLogoGfx[] = INCBIN_U32("graphics/title_screen/pokemon_logo.8bpp.lz"); -const u32 gTitleScreenEmeraldVersionGfx[] = INCBIN_U32("graphics/title_screen/emerald_version.8bpp.lz"); +const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/clouds.bin.smolTM"); +const u32 gTitleScreenPokemonLogoGfx[] = INCBIN_U32("graphics/title_screen/pokemon_logo.8bpp.smol"); +const u32 gTitleScreenEmeraldVersionGfx[] = INCBIN_U32("graphics/title_screen/emerald_version.8bpp.smol"); const u16 gTitleScreenPressStartPal[] = INCBIN_U16("graphics/title_screen/press_start.gbapal"); -const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.lz"); -const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.lz"); +const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.smol"); +const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.smolTM"); const u16 gFrontierPassBg_Pal[] = INCBIN_U16("graphics/frontier_pass/bg.gbapal"); // 8 x 16 -const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.lz"); -const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.lz"); -const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.lz"); +const u32 gFrontierPassBg_Gfx[] = INCBIN_U32("graphics/frontier_pass/bg.4bpp.smol"); +const u32 gFrontierPassMapAndCard_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_and_card.8bpp.smol"); +const u32 gFrontierPassBg_Tilemap[] = INCBIN_U32("graphics/frontier_pass/bg.bin.smolTM"); const u16 gFrontierPassCancelButton_Tilemap[] = INCBIN_U16("graphics/frontier_pass/cancel.bin"); const u16 gFrontierPassCancelButtonHighlighted_Tilemap[] = INCBIN_U16("graphics/frontier_pass/cancel_highlighted.bin"); // Berry Crush const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); -const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); -const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz"); +const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.smol"); +const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.smolTM"); -const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.lz"); -const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.lz"); +const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.smol"); +const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.smol"); const u16 gBattleIcons_Pal1[] = INCBIN_U16("graphics/types/battle_icons1.gbapal"); const u16 gBattleIcons_Pal2[] = INCBIN_U16("graphics/types/battle_icons2.gbapal"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 06142b0bb0..08b6bfb8f3 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -317,7 +317,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofConfetti = static const u16 sHallOfFame_Pal[] = INCBIN_U16("graphics/misc/japanese_hof.gbapal"); -static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/misc/japanese_hof.4bpp.lz"); +static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/misc/japanese_hof.4bpp.smol"); static const struct HallofFameMon sDummyFameMon = { diff --git a/src/intro.c b/src/intro.c index fb4c757567..48b5de9a77 100644 --- a/src/intro.c +++ b/src/intro.c @@ -183,24 +183,24 @@ COMMON_DATA struct GcmbStruct gMultibootProgramStruct = {0}; static const u16 sIntroDrops_Pal[] = INCBIN_U16("graphics/intro/scene_1/drops.gbapal"); static const u16 sIntroLogo_Pal[] = INCBIN_U16("graphics/intro/scene_1/logo.gbapal"); -static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.lz"); +static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.smol"); static const u16 sIntro1Bg_Pal[] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); // 16 x 16 -static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.lz"); -static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.lz"); -static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.lz"); -static const u32 sIntro1Bg3_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg3_map.bin.lz"); -static const u32 sIntro1Bg_Gfx[] = INCBIN_U32("graphics/intro/scene_1/bg.4bpp.lz"); +static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.smolTM"); +static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.smolTM"); +static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.smolTM"); +static const u32 sIntro1Bg3_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg3_map.bin.smolTM"); +static const u32 sIntro1Bg_Gfx[] = INCBIN_U32("graphics/intro/scene_1/bg.4bpp.smol"); static const u16 sIntroPokeball_Pal[] = INCBIN_U16("graphics/intro/scene_3/pokeball.gbapal"); -static const u32 sIntroPokeball_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/pokeball_map.bin.lz"); -static const u32 sIntroPokeball_Gfx[] = INCBIN_U32("graphics/intro/scene_3/pokeball.8bpp.lz"); +static const u32 sIntroPokeball_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/pokeball_map.bin.smolTM"); +static const u32 sIntroPokeball_Gfx[] = INCBIN_U32("graphics/intro/scene_3/pokeball.8bpp.smol"); static const u16 sIntroStreaks_Pal[] = INCBIN_U16("graphics/intro/scene_3/streaks.gbapal"); // Unused -static const u32 sIntroStreaks_Gfx[] = INCBIN_U32("graphics/intro/scene_3/streaks.4bpp.lz"); // Unused -static const u32 sIntroStreaks_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/streaks_map.bin.lz"); // Unused +static const u32 sIntroStreaks_Gfx[] = INCBIN_U32("graphics/intro/scene_3/streaks.4bpp.smol"); // Unused +static const u32 sIntroStreaks_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/streaks_map.bin.smolTM"); // Unused static const u16 sIntroRayquzaOrb_Pal[] = INCBIN_U16("graphics/intro/scene_3/rayquaza_orb.gbapal"); static const u16 sIntroMisc_Pal[] = INCBIN_U16("graphics/intro/scene_3/misc.gbapal"); // Unused -static const u32 sIntroMisc_Gfx[] = INCBIN_U32("graphics/intro/scene_3/misc.4bpp.lz"); // Rayquza orb, and misc unused gfx +static const u32 sIntroMisc_Gfx[] = INCBIN_U32("graphics/intro/scene_3/misc.4bpp.smol"); // Rayquza orb, and misc unused gfx static const u16 sIntroFlygonSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_1/flygon.gbapal"); -static const u32 sIntroLati_Gfx[] = INCBIN_U32("graphics/intro/scene_1/lati.4bpp.lz"); // Unused +static const u32 sIntroLati_Gfx[] = INCBIN_U32("graphics/intro/scene_1/lati.4bpp.smol"); // Unused static const u8 sUnusedData[] = { 0x02, 0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x02, 0x0D, 0x0E, 0x0F, diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index 3df3119304..f59d661110 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -40,36 +40,36 @@ struct IntroCreditsSpriteMetadata static const u16 sGrass_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass.gbapal"); static const u16 sGrassSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_sunset.gbapal"); static const u16 sGrassNight_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_night.gbapal"); -static const u32 sGrass_Gfx[] = INCBIN_U32("graphics/intro/scene_2/grass.4bpp.lz"); -static const u32 sGrass_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/grass_map.bin.lz"); +static const u32 sGrass_Gfx[] = INCBIN_U32("graphics/intro/scene_2/grass.4bpp.smol"); +static const u32 sGrass_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/grass_map.bin.smolTM"); static const u16 sCloudsBg_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg.gbapal"); static const u16 sCloudsBgSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg_sunset.gbapal"); -static const u32 sCloudsBg_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg.4bpp.lz"); -static const u32 sCloudsBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg_map.bin.lz"); +static const u32 sCloudsBg_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg.4bpp.smol"); +static const u32 sCloudsBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg_map.bin.smolTM"); static const u16 sClouds_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds.gbapal"); static const u16 sCloudsSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_sunset.gbapal"); -static const u32 sClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds.4bpp.lz"); +static const u32 sClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds.4bpp.smol"); static const u16 sTrees_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees.gbapal"); static const u16 sTreesSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_sunset.gbapal"); -static const u32 sTrees_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees.4bpp.lz"); -static const u32 sTrees_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/trees_map.bin.lz"); +static const u32 sTrees_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees.4bpp.smol"); +static const u32 sTrees_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/trees_map.bin.smolTM"); static const u16 sTreesSmall_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_small.gbapal"); -static const u32 sTreesSmall_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees_small.4bpp.lz"); +static const u32 sTreesSmall_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees_small.4bpp.smol"); static const u16 sHouses_Pal[] = INCBIN_U16("graphics/intro/scene_2/houses.gbapal"); -static const u32 sHouses_Gfx[] = INCBIN_U32("graphics/intro/scene_2/houses.4bpp.lz"); +static const u32 sHouses_Gfx[] = INCBIN_U32("graphics/intro/scene_2/houses.4bpp.smol"); static const u16 sHouseSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_2/house_silhouette.gbapal"); -static const u32 sHouses_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/houses_map.bin.lz"); -static const u32 sHouseSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_2/house_silhouette.4bpp.lz"); +static const u32 sHouses_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/houses_map.bin.smolTM"); +static const u32 sHouseSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_2/house_silhouette.4bpp.smol"); static const u16 sBrendanCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/brendan_credits.gbapal"); -static const u32 sBrendanCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan_credits.4bpp.lz"); +static const u32 sBrendanCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan_credits.4bpp.smol"); static const u16 sMayCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/may_credits.gbapal"); static const u16 sUnused[0xF0] = {0}; -static const u32 sMayCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may_credits.4bpp.lz"); -static const u32 sBicycle_Gfx[] = INCBIN_U32("graphics/intro/scene_2/bicycle.4bpp.lz"); +static const u32 sMayCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may_credits.4bpp.smol"); +static const u32 sBicycle_Gfx[] = INCBIN_U32("graphics/intro/scene_2/bicycle.4bpp.smol"); static const u16 sLatios_Pal[] = INCBIN_U16("graphics/intro/scene_2/latios.gbapal"); -static const u32 sLatios_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latios.4bpp.lz"); +static const u32 sLatios_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latios.4bpp.smol"); static const u16 sLatias_Pal[] = INCBIN_U16("graphics/intro/scene_2/latias.gbapal"); -static const u32 sLatias_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latias.4bpp.lz"); +static const u32 sLatias_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latias.4bpp.smol"); static void SpriteCB_MovingScenery(struct Sprite *sprite); static void SpriteCB_Player(struct Sprite *sprite); diff --git a/src/link.c b/src/link.c index fe633c58d7..30caf34d3b 100644 --- a/src/link.c +++ b/src/link.c @@ -156,8 +156,8 @@ static void StopTimer(void); static void SendRecvDone(void); static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/link/wireless_display.gbapal"); -static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/link/wireless_display.4bpp.lz"); -static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/link/wireless_display.bin.lz"); +static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/link/wireless_display.4bpp.smol"); +static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/link/wireless_display.bin.smolTM"); static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/link/test_digits.gbapal"); static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/link/test_digits.4bpp"); static const u8 sUnusedTransparentWhite[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 1f3f895c21..cecd818d15 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -35,7 +35,7 @@ EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0; static u8 sSequenceArrayValOffset; static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/link/wireless_icon.gbapal"); -static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.lz"); +static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.smol"); // Most of the below two tables won't make sense with ASCII encoding. static const u8 sWireless_ASCIItoRSETable[256] = { diff --git a/src/list_menu.c b/src/list_menu.c index 35300de955..e8cb9f16c3 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -305,9 +305,9 @@ static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor = }; static const u16 sRedInterface_Pal[] = INCBIN_U16("graphics/interface/red.gbapal"); // Shared by all of the below gfx -static const u32 sScrollIndicator_Gfx[] = INCBIN_U32("graphics/interface/scroll_indicator.4bpp.lz"); -static const u32 sOutlineCursor_Gfx[] = INCBIN_U32("graphics/interface/outline_cursor.4bpp.lz"); -static const u32 sArrowCursor_Gfx[] = INCBIN_U32("graphics/interface/arrow_cursor.4bpp.lz"); +static const u32 sScrollIndicator_Gfx[] = INCBIN_U32("graphics/interface/scroll_indicator.4bpp.smol"); +static const u32 sOutlineCursor_Gfx[] = INCBIN_U32("graphics/interface/outline_cursor.4bpp.smol"); +static const u32 sArrowCursor_Gfx[] = INCBIN_U32("graphics/interface/arrow_cursor.4bpp.smol"); // code static void ListMenuDummyTask(u8 taskId) diff --git a/src/main_menu.c b/src/main_menu.c index 8fcc225cce..1beae8c497 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -252,8 +252,8 @@ static const u16 sBirchSpeechBgPals[][16] = { INCBIN_U16("graphics/birch_speech/bg1.gbapal") }; -static const u32 sBirchSpeechShadowGfx[] = INCBIN_U32("graphics/birch_speech/shadow.4bpp.lz"); -static const u32 sBirchSpeechBgMap[] = INCBIN_U32("graphics/birch_speech/map.bin.lz"); +static const u32 sBirchSpeechShadowGfx[] = INCBIN_U32("graphics/birch_speech/shadow.4bpp.smol"); +static const u32 sBirchSpeechBgMap[] = INCBIN_U32("graphics/birch_speech/map.bin.smolTM"); static const u16 sBirchSpeechBgGradientPal[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); static const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded."); diff --git a/src/match_call.c b/src/match_call.c index 7b76d63813..221714de0e 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1198,7 +1198,7 @@ static void StartMatchCall(void) static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/window.gbapal"); static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call/window.4bpp"); static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/match_call/nav_icon.gbapal"); -static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.lz"); +static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/nav_icon.4bpp.smol"); static const u8 sText_PokenavCallEllipsis[] = _("………………\p"); diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index 617922e5aa..30d76cb4b4 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -49,7 +49,7 @@ static void Task_StaticCountdown_Start(u8 taskId); static void Task_StaticCountdown_Run(u8 taskId); static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/link/321start_static.gbapal"); -static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start_static.4bpp.lz"); +static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start_static.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] = { @@ -374,7 +374,7 @@ static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3); static void SpriteCB_Start(struct Sprite *sprite); static const u16 s321Start_Pal[] = INCBIN_U16("graphics/link/321start.gbapal"); -static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.lz"); +static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.smol"); #define tState data[0] #define tTilesTag data[2] diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 8cbbbac3f9..a1bdd9083e 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -49,7 +49,7 @@ EWRAM_DATA static u8 sDownArrowCounterAndYCoordIdx[8] = {}; EWRAM_DATA bool8 gGiftIsFromEReader = FALSE; static const u16 sTextboxBorder_Pal[] = INCBIN_U16("graphics/interface/mystery_gift_textbox_border.gbapal"); -static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.lz"); +static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.smol"); struct MysteryGiftTaskData { diff --git a/src/mystery_gift_view.c b/src/mystery_gift_view.c index b1163663af..6546ab43b1 100644 --- a/src/mystery_gift_view.c +++ b/src/mystery_gift_view.c @@ -127,16 +127,16 @@ static const u16 sWonderCardBgPal5[] = INCBIN_U16("graphics/wonder_card/bg5. static const u16 sWonderCardBgPal6[] = INCBIN_U16("graphics/wonder_card/bg6.gbapal"); static const u16 sWonderCardBgPal7[] = INCBIN_U16("graphics/wonder_card/bg7.gbapal"); static const u16 sWonderCardBgPal8[] = INCBIN_U16("graphics/wonder_card/bg8.gbapal"); -static const u32 sWonderCardBgGfx1[] = INCBIN_U32("graphics/wonder_card/bg1.4bpp.lz"); -static const u32 sWonderCardBgTilemap1[] = INCBIN_U32("graphics/wonder_card/bg1.bin.lz"); -static const u32 sWonderCardBgGfx2[] = INCBIN_U32("graphics/wonder_card/bg2.4bpp.lz"); -static const u32 sWonderCardBgTilemap2[] = INCBIN_U32("graphics/wonder_card/bg2.bin.lz"); -static const u32 sWonderCardBgGfx3[] = INCBIN_U32("graphics/wonder_card/bg3.4bpp.lz"); -static const u32 sWonderCardBgTilemap3[] = INCBIN_U32("graphics/wonder_card/bg3.bin.lz"); -static const u32 sWonderCardBgGfx7[] = INCBIN_U32("graphics/wonder_card/bg7.4bpp.lz"); -static const u32 sWonderCardBgTilemap7[] = INCBIN_U32("graphics/wonder_card/bg7.bin.lz"); -static const u32 sWonderCardBgGfx8[] = INCBIN_U32("graphics/wonder_card/bg8.4bpp.lz"); -static const u32 sWonderCardBgTilemap8[] = INCBIN_U32("graphics/wonder_card/bg8.bin.lz"); +static const u32 sWonderCardBgGfx1[] = INCBIN_U32("graphics/wonder_card/bg1.4bpp.smol"); +static const u32 sWonderCardBgTilemap1[] = INCBIN_U32("graphics/wonder_card/bg1.bin.smolTM"); +static const u32 sWonderCardBgGfx2[] = INCBIN_U32("graphics/wonder_card/bg2.4bpp.smol"); +static const u32 sWonderCardBgTilemap2[] = INCBIN_U32("graphics/wonder_card/bg2.bin.smolTM"); +static const u32 sWonderCardBgGfx3[] = INCBIN_U32("graphics/wonder_card/bg3.4bpp.smol"); +static const u32 sWonderCardBgTilemap3[] = INCBIN_U32("graphics/wonder_card/bg3.bin.smolTM"); +static const u32 sWonderCardBgGfx7[] = INCBIN_U32("graphics/wonder_card/bg7.4bpp.smol"); +static const u32 sWonderCardBgTilemap7[] = INCBIN_U32("graphics/wonder_card/bg7.bin.smolTM"); +static const u32 sWonderCardBgGfx8[] = INCBIN_U32("graphics/wonder_card/bg8.4bpp.smol"); +static const u32 sWonderCardBgTilemap8[] = INCBIN_U32("graphics/wonder_card/bg8.bin.smolTM"); static const u16 sStampShadowPal1[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_1.gbapal"); static const u16 sStampShadowPal2[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_2.gbapal"); static const u16 sStampShadowPal3[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_3.gbapal"); @@ -145,7 +145,7 @@ static const u16 sStampShadowPal5[] = INCBIN_U16("graphics/wonder_card/stam static const u16 sStampShadowPal6[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_6.gbapal"); static const u16 sStampShadowPal7[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_7.gbapal"); static const u16 sStampShadowPal8[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_8.gbapal"); -static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.lz"); +static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheet_StampShadow = { sStampShadowGfx, 0x100, TAG_STAMP_SHADOW @@ -618,16 +618,16 @@ static const struct ScrollArrowsTemplate sNews_ArrowsTemplate = { static const u16 sWonderNewsPal1[] = INCBIN_U16("graphics/wonder_news/bg1.gbapal"); static const u16 sWonderNewsPal7[] = INCBIN_U16("graphics/wonder_news/bg7.gbapal"); static const u16 sWonderNewsPal8[] = INCBIN_U16("graphics/wonder_news/bg8.gbapal"); -static const u32 sWonderNewsGfx1[] = INCBIN_U32("graphics/wonder_news/bg1.4bpp.lz"); -static const u32 sWonderNewsTilemap1[] = INCBIN_U32("graphics/wonder_news/bg1.bin.lz"); -static const u32 sWonderNewsGfx2[] = INCBIN_U32("graphics/wonder_news/bg2.4bpp.lz"); -static const u32 sWonderNewsTilemap2[] = INCBIN_U32("graphics/wonder_news/bg2.bin.lz"); -static const u32 sWonderNewsGfx3[] = INCBIN_U32("graphics/wonder_news/bg3.4bpp.lz"); -static const u32 sWonderNewsTilemap3[] = INCBIN_U32("graphics/wonder_news/bg3.bin.lz"); -static const u32 sWonderNewsGfx7[] = INCBIN_U32("graphics/wonder_news/bg7.4bpp.lz"); -static const u32 sWonderNewsTilemap7[] = INCBIN_U32("graphics/wonder_news/bg7.bin.lz"); -static const u32 sWonderNewsGfx8[] = INCBIN_U32("graphics/wonder_news/bg8.4bpp.lz"); -static const u32 sWonderNewsTilemap8[] = INCBIN_U32("graphics/wonder_news/bg8.bin.lz"); +static const u32 sWonderNewsGfx1[] = INCBIN_U32("graphics/wonder_news/bg1.4bpp.smol"); +static const u32 sWonderNewsTilemap1[] = INCBIN_U32("graphics/wonder_news/bg1.bin.smolTM"); +static const u32 sWonderNewsGfx2[] = INCBIN_U32("graphics/wonder_news/bg2.4bpp.smol"); +static const u32 sWonderNewsTilemap2[] = INCBIN_U32("graphics/wonder_news/bg2.bin.smolTM"); +static const u32 sWonderNewsGfx3[] = INCBIN_U32("graphics/wonder_news/bg3.4bpp.smol"); +static const u32 sWonderNewsTilemap3[] = INCBIN_U32("graphics/wonder_news/bg3.bin.smolTM"); +static const u32 sWonderNewsGfx7[] = INCBIN_U32("graphics/wonder_news/bg7.4bpp.smol"); +static const u32 sWonderNewsTilemap7[] = INCBIN_U32("graphics/wonder_news/bg7.bin.smolTM"); +static const u32 sWonderNewsGfx8[] = INCBIN_U32("graphics/wonder_news/bg8.4bpp.smol"); +static const u32 sWonderNewsTilemap8[] = INCBIN_U32("graphics/wonder_news/bg8.bin.smolTM"); static const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sWonderNewsGfx1, .map = sWonderNewsTilemap1, .pal = sWonderNewsPal1}, diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c index 06bd05a87b..2725b5f2d3 100644 --- a/src/pokedex_area_region_map.c +++ b/src/pokedex_area_region_map.c @@ -9,10 +9,10 @@ static EWRAM_DATA u8 *sPokedexAreaMapBgNum = NULL; static const u16 ALIGNED(4) sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal"); -static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.lz"); -static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.lz"); -static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.lz"); -static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map_affine.bin.lz"); +static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.smol"); +static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.smolTM"); +static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.smol"); +static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map_affine.bin.smolTM"); void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template) { diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 6b95e55b79..2cb9cce9a3 100644 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -137,9 +137,9 @@ static void ClearAreaWindowLabel(enum PokedexAreaLabels labelId); bool32 ShouldShowAreaUnknownLabel(void); static const u32 sAreaGlow_Pal[] = INCBIN_U32("graphics/pokedex/area_glow.gbapal"); -static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.lz"); +static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.smol"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.lz"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.smolTM"); static void LoadHGSSScreenSelectBarSubmenu(void); static const u16 sSpeciesHiddenFromAreaScreen[] = { SPECIES_WYNAUT }; diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 2fb3d55a24..b567aac391 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -72,7 +72,7 @@ static const u8 sCryMeterNeedle_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter_ne static const u16 sCryMeter_Tilemap[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); // Unused static const u16 sCryMeter_Pal[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal"); -static const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz"); +static const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.smol"); static const u16 sWaveformOffsets[][72] = { diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 955c8f9b17..25d2faeced 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -239,30 +239,30 @@ static const u16 sPokedexPlusHGSS_Default_dark_Pal[] = INCBIN_U16("graphics/poke static const u16 sPokedexPlusHGSS_National_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_national_dark.gbapal"); static const u16 sPokedexPlusHGSS_MenuSearch_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_search_menu_dark.gbapal"); static const u16 sPokedexPlusHGSS_SearchResults_dark_Pal[] = INCBIN_U16("graphics/pokedex/hgss/palette_search_results_dark.gbapal"); -static const u32 sPokedexPlusHGSS_MenuList_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuList_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Interface_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Interface_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_1_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu1.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_2_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu2.4bpp.lz"); -static const u32 sPokedexPlusHGSS_Menu_3_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu3.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuSearch_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search.4bpp.lz"); -static const u32 sPokedexPlusHGSS_MenuSearch_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search_DECA.4bpp.lz"); -static const u32 sPokedexPlusHGSS_StartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu.bin.lz"); -static const u32 sPokedexPlusHGSS_StartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu_search_results.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap_Clear[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar_clear.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenList_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen_underlay.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenInfo_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_info_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenStats_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_stats_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen_PE.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenForms_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_forms_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenCry_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_cry_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSize_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_size_screen.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSearchHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_hoenn.bin.lz"); -static const u32 sPokedexPlusHGSS_ScreenSearchNational_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_national.bin.lz"); +static const u32 sPokedexPlusHGSS_MenuList_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuList_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_list_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Interface_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Interface_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_interface_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_1_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu1.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_2_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu2.4bpp.smol"); +static const u32 sPokedexPlusHGSS_Menu_3_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu3.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuSearch_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search.4bpp.smol"); +static const u32 sPokedexPlusHGSS_MenuSearch_DECA_Gfx[] = INCBIN_U32("graphics/pokedex/hgss/tileset_menu_search_DECA.4bpp.smol"); +static const u32 sPokedexPlusHGSS_StartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu.bin.smolTM"); +static const u32 sPokedexPlusHGSS_StartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_start_menu_search_results.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSelectBarSubmenu_Tilemap_Clear[] = INCBIN_U32("graphics/pokedex/hgss/SelectBar_clear.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenList_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_list_screen_underlay.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenInfo_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_info_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenStats_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_stats_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_evo_screen_PE.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenForms_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_forms_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenCry_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_cry_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSize_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_size_screen.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSearchHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_hoenn.bin.smolTM"); +static const u32 sPokedexPlusHGSS_ScreenSearchNational_Tilemap[] = INCBIN_U32("graphics/pokedex/hgss/tilemap_search_screen_national.bin.smolTM"); #define SCROLLING_MON_X 146 diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index e186e07b96..4ede87e3d7 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -2242,12 +2242,12 @@ void IsPokemonJumpSpeciesInParty(void) static const u16 sPokeJumpPal1[] = INCBIN_U16("graphics/pokemon_jump/pal1.gbapal"); static const u16 sPokeJumpPal2[] = INCBIN_U16("graphics/pokemon_jump/pal2.gbapal"); -static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.lz"); -static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.lz"); -static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.lz"); -static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.lz"); +static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.smol"); +static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.smol"); +static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.smol"); +static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.smol"); -static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.lz"); +static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.smol"); static const struct CompressedSpriteSheet sCompressedSpriteSheets[] = { @@ -2918,16 +2918,16 @@ static void InitPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_jump/interface.gbapal"); static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_jump/bg.gbapal"); -static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.lz"); -static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.lz"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.smol"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.smolTM"); static const u16 sVenusaur_Pal[] = INCBIN_U16("graphics/pokemon_jump/venusaur.gbapal"); -static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.lz"); -static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.lz"); +static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.smol"); +static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.smolTM"); static const u16 sBonuses_Pal[] = INCBIN_U16("graphics/pokemon_jump/bonuses.gbapal"); -static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.lz"); -static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.lz"); +static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.smol"); +static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 05e7442194..2a687b2215 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -924,10 +924,10 @@ static const u8 sText_OutOf30[] = _("/30"); static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); static const u8 sChooseBoxMenuSides_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); -static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); +static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.smol"); +static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.smolTM"); static const u16 sDisplayMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/display_menu.gbapal"); // Unused -static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.lz"); +static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.smolTM"); static const u16 sPkmnData_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data.bin"); // sInterface_Pal - parts of the display frame, "PkmnData"'s normal color, Close Box static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal"); diff --git a/src/pokenav_conditions_gfx.c b/src/pokenav_conditions_gfx.c index 35464dfea6..a73a33b769 100644 --- a/src/pokenav_conditions_gfx.c +++ b/src/pokenav_conditions_gfx.c @@ -26,8 +26,8 @@ static u8 sInitialLoadId; // Never read const u16 gConditionGraphData_Pal[] = INCBIN_U16("graphics/pokenav/condition/graph_data.gbapal"); const u16 gConditionText_Pal[] = INCBIN_U16("graphics/pokenav/condition/text.gbapal"); -static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.lz"); -static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.lz"); +static const u32 sConditionGraphData_Gfx[] = INCBIN_U32("graphics/pokenav/condition/graph_data.4bpp.smol"); +static const u32 sConditionGraphData_Tilemap[] = INCBIN_U32("graphics/pokenav/condition/graph_data.bin.smolTM"); static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/pokenav/condition/mon_markings.gbapal"); static const u8 gText_Number2[] = _("No. "); diff --git a/src/pokenav_conditions_search_results.c b/src/pokenav_conditions_search_results.c index e7b317d7ea..dfca6b268d 100644 --- a/src/pokenav_conditions_search_results.c +++ b/src/pokenav_conditions_search_results.c @@ -80,8 +80,8 @@ static const LoopedTask sConditionSearchLoopedTaskFuncs[] = }; static const u16 sConditionSearchResultFramePal[] = INCBIN_U16("graphics/pokenav/condition/search_results.gbapal"); -static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.lz"); -static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.lz"); +static const u32 sConditionSearchResultTiles[] = INCBIN_U32("graphics/pokenav/condition/search_results.4bpp.smol"); +static const u32 sConditionSearchResultTilemap[] = INCBIN_U32("graphics/pokenav/condition/search_results.bin.smolTM"); static const u16 sListBg_Pal[] = INCBIN_U16("graphics/pokenav/condition/search_results_list.gbapal"); static const struct BgTemplate sConditionSearchResultBgTemplates[] = diff --git a/src/pokenav_list.c b/src/pokenav_list.c index c39c7b1b4c..85393ca68a 100644 --- a/src/pokenav_list.c +++ b/src/pokenav_list.c @@ -94,7 +94,7 @@ static u32 LoopedTask_ReshowListFromCheckPage(s32); static u32 LoopedTask_PrintCheckPageInfo(s32); static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); -static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); +static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.smol"); static const u8 gText_PokenavMatchCall_Strategy[] = _("STRATEGY"); static const u8 gText_PokenavMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index 2dc10f34b2..f3324254c2 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -55,8 +55,8 @@ static void SpriteCB_SpinningPokenav(struct Sprite *); static u32 LoopedTask_InitPokenavMenu(s32); static const u16 sSpinningPokenav_Pal[] = INCBIN_U16("graphics/pokenav/nav_icon.gbapal"); -static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.lz"); -static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); // Unused copy of sMatchCallBlueLightTiles +static const u32 sSpinningPokenav_Gfx[] = INCBIN_U32("graphics/pokenav/nav_icon.4bpp.smol"); +static const u32 sBlueLightCopy[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.smol"); // Unused copy of sMatchCallBlueLightTiles const struct BgTemplate gPokenavMainMenuBgTemplates[] = { diff --git a/src/pokenav_match_call_gfx.c b/src/pokenav_match_call_gfx.c index e844b6843a..e989bffd70 100755 --- a/src/pokenav_match_call_gfx.c +++ b/src/pokenav_match_call_gfx.c @@ -115,14 +115,14 @@ static u32 ExitCheckPage(s32); static u32 ExitMatchCall(s32); static const u16 sMatchCallUI_Pal[] = INCBIN_U16("graphics/pokenav/match_call/ui.gbapal"); -static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/ui.4bpp.lz"); -static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/match_call/ui.bin.lz"); +static const u32 sMatchCallUI_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/ui.4bpp.smol"); +static const u32 sMatchCallUI_Tilemap[] = INCBIN_U32("graphics/pokenav/match_call/ui.bin.smolTM"); static const u16 sOptionsCursor_Pal[] = INCBIN_U16("graphics/pokenav/match_call/options_cursor.gbapal"); -static const u32 sOptionsCursor_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/options_cursor.4bpp.lz"); +static const u32 sOptionsCursor_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/options_cursor.4bpp.smol"); static const u16 sCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/call_window.gbapal"); static const u16 sListWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call/list_window.gbapal"); static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/pokenav/match_call/pokeball.gbapal"); -static const u32 sPokeball_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/pokeball.4bpp.lz"); +static const u32 sPokeball_Gfx[] = INCBIN_U32("graphics/pokenav/match_call/pokeball.4bpp.smol"); static const u8 gText_NumberRegistered[] = _("No. registered"); static const u8 gText_NumberOfBattles[] = _("No. of battles"); diff --git a/src/pokenav_menu_handler_gfx.c b/src/pokenav_menu_handler_gfx.c index 6004f52ebb..9d6bbe501e 100644 --- a/src/pokenav_menu_handler_gfx.c +++ b/src/pokenav_menu_handler_gfx.c @@ -100,13 +100,13 @@ static void Task_CurrentMenuOptionGlow(u8); static void SetMenuOptionGlow(void); static const u16 sPokenavBgDotsPal[] = INCBIN_U16("graphics/pokenav/bg_dots.gbapal"); -static const u32 sPokenavBgDotsTiles[] = INCBIN_U32("graphics/pokenav/bg_dots.4bpp.lz"); -static const u32 sPokenavBgDotsTilemap[] = INCBIN_U32("graphics/pokenav/bg_dots.bin.lz"); +static const u32 sPokenavBgDotsTiles[] = INCBIN_U32("graphics/pokenav/bg_dots.4bpp.smol"); +static const u32 sPokenavBgDotsTilemap[] = INCBIN_U32("graphics/pokenav/bg_dots.bin.smolTM"); static const u16 sPokenavDeviceBgPal[] = INCBIN_U16("graphics/pokenav/device_outline.gbapal"); -static const u32 sPokenavDeviceBgTiles[] = INCBIN_U32("graphics/pokenav/device_outline.4bpp.lz"); -static const u32 sPokenavDeviceBgTilemap[] = INCBIN_U32("graphics/pokenav/device_outline_map.bin.lz"); +static const u32 sPokenavDeviceBgTiles[] = INCBIN_U32("graphics/pokenav/device_outline.4bpp.smol"); +static const u32 sPokenavDeviceBgTilemap[] = INCBIN_U32("graphics/pokenav/device_outline_map.bin.smolTM"); static const u16 sMatchCallBlueLightPal[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal"); -static const u32 sMatchCallBlueLightTiles[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz"); +static const u32 sMatchCallBlueLightTiles[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.smol"); static const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners."); diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c index 5dbf73b118..750a9b5b76 100755 --- a/src/pokenav_region_map.c +++ b/src/pokenav_region_map.c @@ -82,7 +82,7 @@ extern const u16 gRegionMapCityZoomTiles_Pal[]; extern const u32 gRegionMapCityZoomText_Gfx[]; static const u16 sMapSecInfoWindow_Pal[] = INCBIN_U16("graphics/pokenav/region_map/info_window.gbapal"); -static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/zoom_tiles.4bpp.lz"); +static const u32 sRegionMapCityZoomTiles_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/zoom_tiles.4bpp.smol"); #include "data/region_map/city_map_tilemaps.h" diff --git a/src/pokenav_ribbons_list.c b/src/pokenav_ribbons_list.c index 6b4ce42824..34ea457275 100644 --- a/src/pokenav_ribbons_list.c +++ b/src/pokenav_ribbons_list.c @@ -73,8 +73,8 @@ static const LoopedTask sMonRibbonListLoopTaskFuncs[] = }; static const u16 sMonRibbonListFramePal[] = INCBIN_U16("graphics/pokenav/ribbons/list_bg.gbapal"); -static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.4bpp.lz"); -static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.bin.lz"); +static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.4bpp.smol"); +static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.bin.smolTM"); static const u16 sMonRibbonListUi_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/list_ui.gbapal"); static const struct BgTemplate sMonRibbonListBgTemplates[] = diff --git a/src/pokenav_ribbons_summary.c b/src/pokenav_ribbons_summary.c index 85082c2620..4b08b05cac 100644 --- a/src/pokenav_ribbons_summary.c +++ b/src/pokenav_ribbons_summary.c @@ -152,8 +152,8 @@ static const u16 sRibbonIcons3_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icon static const u16 sRibbonIcons4_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons4.gbapal"); static const u16 sRibbonIcons5_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons5.gbapal"); static const u16 sMonInfo_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/mon_info.gbapal"); // palette for Pokémon's name/gender/level text -static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons.4bpp.lz"); -static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons_big.4bpp.lz"); +static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons.4bpp.smol"); +static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons_big.4bpp.smol"); static const struct BgTemplate sBgTemplates[] = { diff --git a/src/region_map.c b/src/region_map.c index 46d317be1e..7dab708863 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -118,11 +118,11 @@ static void CB_HandleFlyMapInput(void); static void CB_ExitFlyMap(void); static const u16 sRegionMapCursorPal[] = INCBIN_U16("graphics/pokenav/region_map/cursor.gbapal"); -static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.lz"); -static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.lz"); +static const u32 sRegionMapCursorSmallGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_small.4bpp.smol"); +static const u32 sRegionMapCursorLargeGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/cursor_large.4bpp.smol"); static const u16 sRegionMapBg_Pal[] = INCBIN_U16("graphics/pokenav/region_map/map.gbapal"); -static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.8bpp.lz"); -static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.bin.lz"); +static const u32 sRegionMapBg_GfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.8bpp.smol"); +static const u32 sRegionMapBg_TilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/map.bin.smolTM"); static const u16 sRegionMapPlayerIcon_BrendanPal[] = INCBIN_U16("graphics/pokenav/region_map/brendan_icon.gbapal"); static const u8 sRegionMapPlayerIcon_BrendanGfx[] = INCBIN_U8("graphics/pokenav/region_map/brendan_icon.4bpp"); static const u16 sRegionMapPlayerIcon_MayPal[] = INCBIN_U16("graphics/pokenav/region_map/may_icon.gbapal"); @@ -282,10 +282,10 @@ static const u8 sMapSecIdsOffMap[] = }; static const u16 sRegionMapFramePal[] = INCBIN_U16("graphics/pokenav/region_map/frame.gbapal"); -static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.lz"); -static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.lz"); +static const u32 sRegionMapFrameGfxLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.4bpp.smol"); +static const u32 sRegionMapFrameTilemapLZ[] = INCBIN_U32("graphics/pokenav/region_map/frame.bin.smolTM"); static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/region_map/fly_target_icons.gbapal"); -static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.lz"); +static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map/fly_target_icons.4bpp.smol"); static const u8 sMapHealLocations[][3] = { diff --git a/src/roulette.c b/src/roulette.c index fd15ab70bc..4bea3b6852 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -417,8 +417,8 @@ static void SpriteCB_Shroomish(struct Sprite *); static void SpriteCB_Taillow(struct Sprite *); static const u16 sWheel_Pal[] = INCBIN_U16("graphics/roulette/wheel.gbapal"); // also palette for grid -static const u32 sGrid_Tilemap[] = INCBIN_U32("graphics/roulette/grid.bin.lz"); -static const u32 sWheel_Tilemap[] = INCBIN_U32("graphics/roulette/wheel.bin.lz"); +static const u32 sGrid_Tilemap[] = INCBIN_U32("graphics/roulette/grid.bin.smolTM"); +static const u32 sWheel_Tilemap[] = INCBIN_U32("graphics/roulette/wheel.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { // Text box @@ -2339,13 +2339,13 @@ static const u16 sUnused1_Pal[] = INCBIN_U16("graphics/roulette/unused_1.gbapal" static const u16 sUnused2_Pal[] = INCBIN_U16("graphics/roulette/unused_2.gbapal"); static const u16 sUnused3_Pal[] = INCBIN_U16("graphics/roulette/unused_3.gbapal"); static const u16 sUnused4_Pal[] = INCBIN_U16("graphics/roulette/unused_4.gbapal"); -static const u32 sBall_Gfx[] = INCBIN_U32("graphics/roulette/ball.4bpp.lz"); -static const u32 sBallCounter_Gfx[] = INCBIN_U32("graphics/roulette/ball_counter.4bpp.lz"); -static const u32 sShroomishTaillow_Gfx[] = INCBIN_U32("graphics/roulette/roulette_tilt.4bpp.lz"); -static const u32 sGridIcons_Gfx[] = INCBIN_U32("graphics/roulette/grid_icons.4bpp.lz"); -static const u32 sWheelIcons_Gfx[] = INCBIN_U32("graphics/roulette/wheel_icons.4bpp.lz"); -static const u32 sShadow_Gfx[] = INCBIN_U32("graphics/roulette/shadow.4bpp.lz"); -static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/roulette/cursor.4bpp.lz"); +static const u32 sBall_Gfx[] = INCBIN_U32("graphics/roulette/ball.4bpp.smol"); +static const u32 sBallCounter_Gfx[] = INCBIN_U32("graphics/roulette/ball_counter.4bpp.smol"); +static const u32 sShroomishTaillow_Gfx[] = INCBIN_U32("graphics/roulette/roulette_tilt.4bpp.smol"); +static const u32 sGridIcons_Gfx[] = INCBIN_U32("graphics/roulette/grid_icons.4bpp.smol"); +static const u32 sWheelIcons_Gfx[] = INCBIN_U32("graphics/roulette/wheel_icons.4bpp.smol"); +static const u32 sShadow_Gfx[] = INCBIN_U32("graphics/roulette/shadow.4bpp.smol"); +static const u32 sCursor_Gfx[] = INCBIN_U32("graphics/roulette/cursor.4bpp.smol"); static const struct SpritePalette sSpritePalettes[] = { diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 39451d89d3..d4ce636357 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -133,7 +133,7 @@ static const u8 sClockFrames[8][3] = }; static const u8 sSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); -static const u32 sSaveFailedClockGfx[] = INCBIN_U32("graphics/misc/clock_small.4bpp.lz"); +static const u32 sSaveFailedClockGfx[] = INCBIN_U32("graphics/misc/clock_small.4bpp.smol"); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); diff --git a/src/slot_machine.c b/src/slot_machine.c index 0d1e7301eb..5e6406f0a8 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -7945,6 +7945,6 @@ static const struct SpritePalette sSlotMachineSpritePalettes[] = {} }; -static const u32 sReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.lz"); // reel_time_machine and reel_time_pikachu +static const u32 sReelTimeGfx[] = INCBIN_U32("graphics/slot_machine/reel_time_gfx.4bpp.smol"); // reel_time_machine and reel_time_pikachu static const u16 sReelTimeWindow_Tilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window.bin"); static const u16 sEmptyTilemap[] = {0}; diff --git a/src/starter_choose.c b/src/starter_choose.c index d836d819fc..9455746857 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -54,11 +54,11 @@ static u16 sStarterLabelWindowId; const u16 gBirchBagGrass_Pal[] = INCBIN_U16("graphics/starter_choose/tiles.gbapal"); static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/starter_choose/pokeball_selection.gbapal"); static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/starter_choose/starter_circle.gbapal"); -const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/starter_choose/birch_bag.bin.lz"); -const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/starter_choose/birch_grass.bin.lz"); -const u32 gBirchBagGrass_Gfx[] = INCBIN_U32("graphics/starter_choose/tiles.4bpp.lz"); -const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/starter_choose/pokeball_selection.4bpp.lz"); -static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/starter_choose/starter_circle.4bpp.lz"); +const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/starter_choose/birch_bag.bin.smolTM"); +const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/starter_choose/birch_grass.bin.smolTM"); +const u32 gBirchBagGrass_Gfx[] = INCBIN_U32("graphics/starter_choose/tiles.4bpp.smol"); +const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/starter_choose/pokeball_selection.4bpp.smol"); +static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/starter_choose/starter_circle.4bpp.smol"); static const struct WindowTemplate sWindowTemplates[] = { diff --git a/src/title_screen.c b/src/title_screen.c index 215abea813..a443da0f4c 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -60,10 +60,10 @@ static void SpriteCB_PokemonLogoShine(struct Sprite *sprite); // const rom data static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unused.gbapal"); -static const u32 sTitleScreenRayquazaGfx[] = INCBIN_U32("graphics/title_screen/rayquaza.4bpp.lz"); -static const u32 sTitleScreenRayquazaTilemap[] = INCBIN_U32("graphics/title_screen/rayquaza.bin.lz"); -static const u32 sTitleScreenLogoShineGfx[] = INCBIN_U32("graphics/title_screen/logo_shine.4bpp.lz"); -static const u32 sTitleScreenCloudsGfx[] = INCBIN_U32("graphics/title_screen/clouds.4bpp.lz"); +static const u32 sTitleScreenRayquazaGfx[] = INCBIN_U32("graphics/title_screen/rayquaza.4bpp.smol"); +static const u32 sTitleScreenRayquazaTilemap[] = INCBIN_U32("graphics/title_screen/rayquaza.bin.smolTM"); +static const u32 sTitleScreenLogoShineGfx[] = INCBIN_U32("graphics/title_screen/logo_shine.4bpp.smol"); +static const u32 sTitleScreenCloudsGfx[] = INCBIN_U32("graphics/title_screen/clouds.4bpp.smol"); diff --git a/src/trainer_card.c b/src/trainer_card.c index 2e066156df..d385898f44 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -169,7 +169,7 @@ static bool8 Task_EndCardFlip(struct Task *task); static void UpdateCardFlipRegs(u16); static void LoadMonIconGfx(void); -static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/stickers.4bpp.lz"); +static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/stickers.4bpp.smol"); static const u16 sUnused_Pal[] = INCBIN_U16("graphics/trainer_card/unused.gbapal"); static const u16 sHoennTrainerCardBronze_Pal[] = INCBIN_U16("graphics/trainer_card/bronze.gbapal"); static const u16 sKantoTrainerCardGreen_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/green.gbapal"); @@ -188,8 +188,8 @@ static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_ static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers2.gbapal"); static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers3.gbapal"); static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/frlg/stickers4.gbapal"); -static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); -static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/badges.4bpp.lz"); +static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.smol"); +static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/frlg/badges.4bpp.smol"); static const struct BgTemplate sTrainerCardBgTemplates[4] = { diff --git a/src/union_room_chat.c b/src/union_room_chat.c index b32f23c467..17f5097c68 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -752,10 +752,10 @@ static const struct MenuAction sKeyboardPageTitleTexts[UNION_ROOM_KB_PAGE_COUNT }; static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/interface.gbapal"); -static const u32 sKeyboardCursorTiles[] = INCBIN_U32("graphics/union_room_chat/keyboard_cursor.4bpp.lz"); -static const u32 sTextEntryCursorTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.lz"); -static const u32 sTextEntryArrowTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_arrow.4bpp.lz"); -static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.lz"); +static const u32 sKeyboardCursorTiles[] = INCBIN_U32("graphics/union_room_chat/keyboard_cursor.4bpp.smol"); +static const u32 sTextEntryCursorTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.smol"); +static const u32 sTextEntryArrowTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_arrow.4bpp.smol"); +static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.smol"); static const struct CompressedSpriteSheet sSpriteSheets[] = { {.data = sKeyboardCursorTiles, .size = 0x1000, .tag = GFXTAG_KEYBOARD_CURSOR}, diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index 4a58a2ee83..27e5639a54 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -173,8 +173,8 @@ static EWRAM_DATA struct UsePokeblockMenu *sMenu = NULL; static const u32 sMonFrame_Pal[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame_pal.bin"); static const u32 sMonFrame_Gfx[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.4bpp"); -static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin.lz"); -static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin.lz"); +static const u32 sMonFrame_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/mon_frame.bin.smolTM"); +static const u32 sGraphData_Tilemap[] = INCBIN_U32("graphics/pokeblock/use_screen/graph_data.bin.smolTM"); // The condition/flavors aren't listed in their normal order in this file, they're listed as shown on the graph going counter-clockwise // Normally they would go Cool/Spicy, Beauty/Dry, Cute/Sweet, Smart/Bitter, Tough/Sour (also graph order, but clockwise) diff --git a/src/wallclock.c b/src/wallclock.c index ec5410f520..28c96fc972 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -71,7 +71,7 @@ enum { WIN_BUTTON_LABEL, }; -static const u32 sHand_Gfx[] = INCBIN_U32("graphics/wallclock/hand.4bpp.lz"); +static const u32 sHand_Gfx[] = INCBIN_U32("graphics/wallclock/hand.4bpp.smol"); static const u16 sTextPrompt_Pal[] = INCBIN_U16("graphics/wallclock/text_prompt.gbapal"); // for "Cancel" or "Confirm" static const struct WindowTemplate sWindowTemplates[] = diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 7734c39d24..a4e0167c21 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -79,8 +79,8 @@ static const u16 sPalettes[][16] = { INCBIN_U16("graphics/wireless_status_screen/anim_12.gbapal"), INCBIN_U16("graphics/wireless_status_screen/anim_13.gbapal") }; -static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/wireless_status_screen/bg.4bpp.lz"); -static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/wireless_status_screen/bg.bin.lz"); +static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/wireless_status_screen/bg.4bpp.smol"); +static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/wireless_status_screen/bg.bin.smolTM"); static const struct BgTemplate sBgTemplates[] = { { diff --git a/tools/preproc/c_file.cpp b/tools/preproc/c_file.cpp index 4b40d18bc8..f613812439 100644 --- a/tools/preproc/c_file.cpp +++ b/tools/preproc/c_file.cpp @@ -353,7 +353,7 @@ void CFile::TryConvertIncbin() // INCBIN_COMP; include *compressed* version of file if (incbinType == 7) - path = path.append(".lz"); + path = path.append(".smol"); m_pos++; diff --git a/tools/scaninc/c_file.cpp b/tools/scaninc/c_file.cpp index a978b9a506..d34b1aa235 100644 --- a/tools/scaninc/c_file.cpp +++ b/tools/scaninc/c_file.cpp @@ -257,7 +257,7 @@ void CFile::CheckIncbin() // INCBIN_COMP; include *compressed* version of file if (incbinType == 6) - path = path.append(".lz"); + path = path.append(".smol"); SkipWhitespace(); From 392d4db31950c1d77535764056934296fdb495ed Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 1 Jun 2025 10:06:12 +0200 Subject: [PATCH 023/248] Fix follower compression (#7038) Co-authored-by: Hedara --- include/decompress.h | 1 + src/decompress.c | 52 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/include/decompress.h b/include/decompress.h index 5fac4f794b..52fcc10a3f 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -81,5 +81,6 @@ void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 pe void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic); u32 GetDecompressedDataSize(const u32 *ptr); +bool32 IsCompressedData(const u32 *ptr); #endif // GUARD_DECOMPRESS_H diff --git a/src/decompress.c b/src/decompress.c index 3de5a9ce31..2490059cd0 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -227,18 +227,21 @@ u32 LoadCompressedSpriteSheetByTemplate(const struct SpriteTemplate *template, s u32 size; // Check for LZ77 header and read uncompressed size, or fallback if not compressed (zero size) - if ((size = IsLZ77Data(template->images->data, TILE_SIZE_4BPP, MAX_DECOMPRESSION_BUFFER_SIZE)) == 0) - return LoadSpriteSheetByTemplate(template, 0, offset); + if (IsCompressedData(template->images->data)) + { + size = GetDecompressedDataSize(template->images->data); + void *buffer = malloc_and_decompress(template->images->data, NULL); + myImage.data = buffer; + myImage.size = size + offset; + myTemplate.images = &myImage; + myTemplate.tileTag = template->tileTag; - void *buffer = malloc_and_decompress(template->images->data, NULL); - myImage.data = buffer; - myImage.size = size + offset; - myTemplate.images = &myImage; - myTemplate.tileTag = template->tileTag; + u32 ret = LoadSpriteSheetByTemplate(&myTemplate, 0, offset); + Free(buffer); + return ret; + } + return LoadSpriteSheetByTemplate(template, 0, offset); - u32 ret = LoadSpriteSheetByTemplate(&myTemplate, 0, offset); - Free(buffer); - return ret; } void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer) @@ -1324,6 +1327,35 @@ u32 GetDecompressedDataSize(const u32 *ptr) } } +bool32 IsCompressedData(const u32 *ptr) +{ + u32 size; + union CompressionHeader *header = (union CompressionHeader *)ptr; + switch (header->smol.mode) + { + case MODE_LZ77: + return IsLZ77Data(ptr, TILE_SIZE_4BPP, MAX_DECOMPRESSION_BUFFER_SIZE); + case BASE_ONLY: + case ENCODE_SYMS: + case ENCODE_DELTA_SYMS: + case ENCODE_LO: + case ENCODE_BOTH: + case ENCODE_BOTH_DELTA_SYMS: + size = GetDecompressedDataSize(ptr); + if (size % TILE_SIZE_4BPP == 0 && size < MAX_DECOMPRESSION_BUFFER_SIZE) + return TRUE; + break; + case IS_FRAME_CONTAINER: + // No implemented yet + case IS_TILEMAP: + // Has to use another assumption + default: + // Is not one of these cases, it's not compressed data + return FALSE; + } + return FALSE; +} + bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src) { struct SpriteSheet dest; From 8697bef20c0b742987b7cc066cc3577a6f135873 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Jun 2025 05:29:02 -0400 Subject: [PATCH 024/248] `BtlController_EmitTwoReturnValues` cleanup (#6855) --- include/battle.h | 1 + src/battle_ai_switch_items.c | 2 +- src/battle_controller_opponent.c | 16 +++++++------- src/battle_controller_player.c | 26 +++++++++++------------ src/battle_controller_player_partner.c | 4 ++-- src/battle_controller_recorded_opponent.c | 4 ++-- src/battle_controller_recorded_player.c | 4 ++-- src/battle_controller_wally.c | 2 +- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/include/battle.h b/include/battle.h index 0c36e07383..b6cebae74a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -64,6 +64,7 @@ #define B_ACTION_FINISHED 12 #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_NOTHING_FAINTED 13 // when choosing an action +#define B_ACTION_UNK_14 14 #define B_ACTION_DEBUG 20 #define B_ACTION_THROW_BALL 21 // R to throw last used ball #define B_ACTION_NONE 0xFF diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 60030acef5..342bc03537 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1324,7 +1324,7 @@ void AI_TrySwitchOrUseItem(u32 battler) { if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) { - BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 7dfb46efd4..e8cdb43945 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -495,7 +495,7 @@ static void OpponentHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else if (gAiBattleData->actionFlee) { @@ -524,11 +524,11 @@ static void OpponentHandleChooseMove(u32 battler) // If opponent can and should use a gimmick (considering trainer data), do it if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } } OpponentBufferExecCompleted(battler); @@ -545,7 +545,7 @@ static void OpponentHandleChooseMove(u32 battler) if (GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_USER) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (battler << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (battler << 8)); } else if (IsDoubleBattle()) { @@ -579,17 +579,17 @@ static void OpponentHandleChooseMove(u32 battler) } } if (isPartnerEnemy && CanTargetBattler(battler, target, move)) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (GetBattlerAtPosition(BATTLE_PARTNER(battler)) << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(BATTLE_PARTNER(battler)) << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (target << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (target << 8)); } } else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(battler); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index f374345206..1e9ac6cb5f 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -449,9 +449,9 @@ void HandleInputChooseTarget(u32 battler) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); TryHideLastUsedBall(); HideGimmickTriggerSprite(); @@ -609,9 +609,9 @@ void HandleInputShowEntireFieldTargets(u32 battler) PlaySE(SE_SELECT); HideAllTargets(); if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); PlayerBufferExecCompleted(battler); } @@ -637,9 +637,9 @@ void HandleInputShowTargets(u32 battler) PlaySE(SE_SELECT); HideShownTargets(battler); if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); PlayerBufferExecCompleted(battler); @@ -741,9 +741,9 @@ void HandleInputChooseMove(u32 battler) case 0: default: if (gBattleStruct->gimmick.playerSelect) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | RET_GIMMICK | (gMultiUsePlayerCursor << 8)); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); PlayerBufferExecCompleted(battler); @@ -781,7 +781,7 @@ void HandleInputChooseMove(u32 battler) } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0xFFFF); HideGimmickTriggerSprite(); PlayerBufferExecCompleted(battler); TryToHideMoveInfoWindow(); @@ -1665,9 +1665,9 @@ static void PlayerHandleYesNoInput(u32 battler) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0xE, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_UNK_14, 0); else - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0xD, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_NOTHING_FAINTED, 0); PlayerBufferExecCompleted(battler); } @@ -2138,7 +2138,7 @@ static void PlayerChooseMoveInBattlePalace(u32 battler) if (--gBattleStruct->arenaMindPoints[battler] == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); PlayerBufferExecCompleted(battler); } } @@ -2306,7 +2306,7 @@ static void PlayerHandlePlayBGM(u32 battler) static void PlayerHandleTwoReturnValues(u32 battler) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 0, 0); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); PlayerBufferExecCompleted(battler); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 6aa5746f85..d7eec61c32 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -330,11 +330,11 @@ static void PlayerPartnerHandleChooseMove(u32 battler) // If partner can and should use a gimmick (considering trainer data), do it if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, (chosenMoveIndex) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } PlayerPartnerBufferExecCompleted(battler); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1e471044d5..b670a4d001 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -391,13 +391,13 @@ static void RecordedOpponentHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else { u8 moveId = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveId | (target << 8)); } RecordedOpponentBufferExecCompleted(battler); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2476929282..f3686d7805 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -418,13 +418,13 @@ static void RecordedPlayerHandleChooseMove(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace(battler)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); } else { u8 moveIndex = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, moveIndex | (target << 8)); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8)); } RecordedPlayerBufferExecCompleted(battler); diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 3381e5a5bd..cea2578ac4 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -378,7 +378,7 @@ static void WallyHandleChooseMove(u32 battler) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, 10, 0x100); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0x100); WallyBufferExecCompleted(battler); } break; From d3af14b2bb622b9f9a28defb6b093b5fdf7de377 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:22:00 +0200 Subject: [PATCH 025/248] Adds FRLG asserts to Alloc/Free (#7025) --- src/malloc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/malloc.c b/src/malloc.c index 95d41fbb97..f4f079f30a 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -101,6 +101,11 @@ void *AllocInternal(void *heapStart, u32 size, const char *location) while (block != head); Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L%s:%d, %s: OOM allocating %d bytes", gTestRunnerState.test->filename, SourceLine(0), location, size); #endif + if (location) + { + DebugPrintfLevel(MGBA_LOG_ERROR, "%s: out of memory trying to allocate %d bytes", location, size); + } + AGB_ASSERT(FALSE); return NULL; } @@ -114,6 +119,8 @@ void FreeInternal(void *heapStart, void *pointer) { struct MemBlock *head = (struct MemBlock *)heapStart; struct MemBlock *block = (struct MemBlock *)((u8 *)pointer - sizeof(struct MemBlock)); + AGB_ASSERT(block->magic == MALLOC_SYSTEM_ID); + AGB_ASSERT(block->allocated == TRUE); block->allocated = FALSE; // If the freed block isn't the last one, merge with the next block @@ -136,6 +143,8 @@ void FreeInternal(void *heapStart, void *pointer) { if (!block->prev->allocated) { + AGB_ASSERT(block->prev->magic == MALLOC_SYSTEM_ID); + block->prev->next = block->next; if (block->next != head) From 3565c7a8a656c392240b38d4b59c410333168911 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Jun 2025 11:11:42 -0400 Subject: [PATCH 026/248] Documented usage of `delay X` (#6951) --- data/battle_anim_scripts.s | 5196 ++++++++++++++++++------------------ 1 file changed, 2598 insertions(+), 2598 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9a4d6cee98..cc1487d190 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -617,9 +617,9 @@ gBattleAnimMove_PowerTrick:: loopsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET 0xa 0x3 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 createsprite gPowerTrickSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 0, SOUND_PAN_TARGET, 0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion 0x2, 0x0 waitforvisualfinish end @@ -2102,9 +2102,9 @@ gBattleAnimMove_ShadowSneak:: waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x30 + delay 48 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 15, RGB_BLACK createsprite gShadowSneakImpactSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 call ShadowSneakMovement @@ -2122,7 +2122,7 @@ gBattleAnimMove_ShadowSneak:: ShadowSneakMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 return gBattleAnimMove_MudBomb:: @@ -2366,7 +2366,7 @@ gBattleAnimGeneral_TrickRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_TRICK_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -3091,7 +3091,7 @@ gBattleAnimMove_Judgment:: call JudgmentInwardSpikes2 delay 5 call JudgmentInwardSpikes2 - delay 0x2F + delay 47 call JudgmentOutwardSpikes delay 5 call JudgmentOutwardSpikes2 @@ -3488,7 +3488,7 @@ gBattleAnimMove_RoarOfTime:: loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_WATER_GUN createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 - delay 0x20 + delay 32 monbg ANIM_ATK_PARTNER setalpha 0xc, 0x8 loopsewithpan 133, SOUND_PAN_ATTACKER 13 3 @@ -3500,7 +3500,7 @@ gBattleAnimMove_RoarOfTime:: waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL - delay 0x20 + delay 32 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan 170, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 @@ -3937,7 +3937,7 @@ gBattleAnimMove_WideGuard:: createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0x18 delay 3 createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0x18 - delay 0x14 + delay 20 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createvisualtask AnimTask_ConversionAlphaBlend, 5 waitforvisualfinish @@ -3966,7 +3966,7 @@ gBattleAnimMove_GuardSplit:: GuardSplitLaunch: createsprite gGuardSwapOrbs1Template, ANIM_TARGET, 2, 0xfff4, 0x0 createsprite gGuardSwapOrbs2Template, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1E, 0x0 - delay 0x5 + delay 5 return gBattleAnimMove_PowerSplit:: @@ -4000,7 +4000,7 @@ gBattleAnimGeneral_WonderRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_WONDER_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -4120,16 +4120,16 @@ gBattleAnimMove_Autotomize:: playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 - delay 0xc + delay 12 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 - delay 0x18 + delay 24 waitforvisualfinish stopsound clearmonbg ANIM_ATK_PARTNER @@ -4151,11 +4151,11 @@ gBattleAnimMove_RagePowder:: end RagePowderSprinkle: createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xffec, 0x55, 0x50, 0x0 - delay 0xc + delay 12 createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 - delay 0xc + delay 12 createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff1, 0x0, 0x50, 0x0 - delay 0xc + delay 12 return gBattleAnimMove_Telekinesis:: @@ -4163,14 +4163,14 @@ gBattleAnimMove_Telekinesis:: createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x1, 0x0, 0x9, 0x7fff - delay 0x12 + delay 18 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec waitforvisualfinish loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x3 createvisualtask AnimTask_SwayMon, 5, 1, 24, 208, 1, ANIM_TARGET waitforvisualfinish - delay 0xA + delay 10 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x7fff waitforvisualfinish @@ -4182,7 +4182,7 @@ gBattleAnimGeneral_MagicRoom:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET fadetobg BG_MAGIC_ROOM waitbgfadein - delay 0x40 + delay 64 restorebg waitbgfadein blendoff @@ -4329,16 +4329,16 @@ gBattleAnimMove_Synchronoise:: waitforvisualfinish panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x25 + delay 37 panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 waitforvisualfinish loopsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET, 0x3, 0x5 @@ -4363,13 +4363,13 @@ gBattleAnimMove_ElectroBall:: setalpha 12, 8 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gGrowingChargeOrb2SpriteTemplate, ANIM_ATTACKER, 2, 0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xF + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 loopsewithpan SE_M_CHARGE, 0xC, 0x6, 0x5 waitforvisualfinish createsprite gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 16, 16, 8 @@ -4424,24 +4424,24 @@ gBattleAnimMove_FlameCharge:: loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x20, 0x6 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl - delay 0x9 + delay 9 call FlameChargeSwirl waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 - delay 0x3 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 waitforvisualfinish clearmonbg ANIM_TARGET @@ -4454,14 +4454,14 @@ gBattleAnimMove_Coil:: loadspritegfx ANIM_TAG_TENDRILS loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x0, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x0, 0x2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x8, 0x1, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x14 + delay 20 createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 playsewithpan SE_M_BIND, SOUND_PAN_TARGET @@ -4515,13 +4515,13 @@ gBattleAnimMove_FoulPlay:: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createsprite gFoulPlayImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 @@ -4550,9 +4550,9 @@ gBattleAnimMove_SimpleBeam:: call SimpleBeamWithRings call SimpleBeamWithRings createsprite gSimpleBeamBrownRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 stopsound waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7FFF @@ -4563,29 +4563,29 @@ gBattleAnimMove_SimpleBeam:: end SimpleBeamsRegular: createsprite gSimpleBeamBrownTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 - delay 0x2 + delay 2 return SimpleBeamWithRings: createsprite gSimpleBeamBrownTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 createsprite gSimpleBeamBrownRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 createsprite gSimpleBeamPinkTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0 createsprite gSimpleBeamPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1F, 0x8 - delay 0x2 + delay 2 return gBattleAnimMove_Entrainment:: createvisualtask AnimTask_TeeterDanceMovement, 5 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 waitforvisualfinish @@ -4595,11 +4595,11 @@ gBattleAnimMove_AfterYou:: loadspritegfx ANIM_TAG_ANGER @rage loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @green color createvisualtask AnimTask_SwayMon, 5, 1, 15, 1536, 2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0xffe0 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xffe5 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0x14, 0xffe0 createsprite gAfterYouGreenRageTemplate, ANIM_ATTACKER, 2, 0x0, 0x23, 0xffe5 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER @@ -4639,13 +4639,13 @@ gBattleAnimMove_EchoedVoice:: call MetalSoundPlayNote waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x0 + delay 0 waitforvisualfinish end MetalSoundPlayNote: panse SE_M_UPROAR, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 createsprite gMetalSoundSpriteTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_ChipAway:: @@ -4655,7 +4655,7 @@ gBattleAnimMove_ChipAway:: monbg ANIM_ATK_PARTNER setalpha 12, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET @@ -4729,14 +4729,14 @@ gBattleAnimMove_QuickGuard:: loadspritegfx ANIM_TAG_SPARKLE_4 @sparkles setalpha 12, 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 10, RGB_WHITE - delay 0x10 + delay 16 monbg ANIM_ATTACKER createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 - delay 0x1 + delay 1 createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 - delay 0x1 + delay 1 createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 waitforvisualfinish @@ -4879,7 +4879,7 @@ gBattleAnimMove_Hex:: createvisualtask AnimTask_PurpleFlamesOnTarget, 0x3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 37, 1 playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET - delay 0x20 + delay 32 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(10, 2, 19) @;Deep purple createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 waitforvisualfinish @@ -4898,7 +4898,7 @@ SkyDropSetup: loadspritegfx ANIM_TAG_SMALL_BUBBLES @mist ball loadspritegfx ANIM_TAG_WHITE_FEATHER loadspritegfx ANIM_TAG_ROUND_SHADOW @fly - delay 0x0 + delay 0 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER createsprite gSkyDropFlyBallTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0 waitforvisualfinish @@ -4912,7 +4912,7 @@ SkyDropUnleash: setalpha 12, 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 @@ -4941,17 +4941,17 @@ gBattleAnimMove_CircleThrow:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -24, 0, 0, 4 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitforvisualfinish - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 - delay 0xb + delay 11 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xa waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -5005,7 +5005,7 @@ gBattleAnimMove_Quash:: setalpha 12, 8 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gQuashArmHitTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf - delay 0x13 + delay 19 playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SquishTarget, 0x2 waitforvisualfinish @@ -5099,29 +5099,29 @@ gBattleAnimMove_ReflectType:: setalpha 8, 8 playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gReflectTypeBlueStringTemplate, ANIM_TARGET, 2, 0x0, 0xa - delay 0x4 + delay 4 createsprite gReflectTypeVioletStringTemplate, ANIM_TARGET, 2, 0x0, 0xfffe - delay 0x4 + delay 4 createsprite gReflectTypeWhiteStringTemplate, ANIM_TARGET, 2, 0x0, 0x16 waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x1F + delay 31 monbg ANIM_ATTACKER playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gReflectTypeWhiteRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypePinkRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeVioletRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeBlueRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeWhiteRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypePinkRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeVioletRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gReflectTypeBlueRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -5138,7 +5138,7 @@ gBattleAnimMove_Retaliate:: playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x1 - delay 0x38 + delay 56 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x43D waitforvisualfinish @@ -5160,13 +5160,13 @@ gBattleAnimMove_FinalGambit:: waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER createsprite gFinalGambitBlueYawnTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x25 - delay 0x4 + delay 4 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 waitforvisualfinish monbg ANIM_TARGET - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gFinalGambitExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 @@ -5619,7 +5619,7 @@ gBattleAnimMove_StruggleBug:: gBattleAnimMove_Bulldoze:: createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 - delay 0x8 + delay 8 goto gBattleAnimMove_Earthquake gBattleAnimMove_FrostBreath:: @@ -5641,19 +5641,19 @@ gBattleAnimMove_FrostBreath:: loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xfff6, 0xfff1 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x19 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xf, 0x5 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0xffe7, 0x0 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x1e - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 2, 0x1, 0xffe5, 0x19 - delay 0x1 + delay 1 createsprite gFrostBreathBlueRageTemplate, ANIM_TARGET, 66, 0x1, 0x0, 0x8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0x0, 0x0, 0x4 @@ -5671,18 +5671,18 @@ gBattleAnimMove_DragonTail:: setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 - delay 0x1 + delay 1 createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 call TailWhackDown - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5761,7 +5761,7 @@ gBattleAnimMove_WildCharge:: setalpha 12, 8 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 @electric circle - delay 0x1e + delay 30 waitforvisualfinish loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x1c, 0x2 call ScreenFlash @@ -5771,9 +5771,9 @@ gBattleAnimMove_WildCharge:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish - delay 0xb + delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET @@ -5798,7 +5798,7 @@ gBattleAnimMove_DrillRun:: createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 createsprite gHornHitSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0xc waitforvisualfinish @@ -5807,37 +5807,37 @@ gBattleAnimMove_DrillRun:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x2, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfffc, 0x3, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff8, 0xfffb, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x4, 0xfff4, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x0, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x5, 0x12, 0x1, 0x3 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffef, 0xc, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffeb, 0xfff1, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x8, 0xffe5, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x0, 0x1, 0x2 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x2 waitforvisualfinish call UnsetPsychicBg @@ -5852,7 +5852,7 @@ gBattleAnimMove_DualChop:: setalpha 12, 8 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @left createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0x0515, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @right @@ -5870,7 +5870,7 @@ gBattleAnimMove_HeartStamp:: monbg ANIM_TARGET loopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 0xc, 0x3 createsprite gHeartStampSpinningHeartTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x1, 0x1e - delay 0x1E + delay 30 clearmonbg ANIM_TARGET playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 131, ANIM_TARGET, 4, 0, 5, 1 @@ -5904,16 +5904,16 @@ gBattleAnimMove_SacredSword:: setalpha 12, 8 playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x16 + delay 22 createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSacredSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gSacredSwordCutTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5928,7 +5928,7 @@ gBattleAnimMove_RazorShell:: createsprite gRazorShellTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x0, 25, 0 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 1, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -5943,11 +5943,11 @@ gBattleAnimMove_HeatCrash:: setalpha 12, 8 playsewithpan SE_SUCCESS, SOUND_PAN_TARGET createsprite gHeatCrashEruptionRockTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf - delay 0x13 + delay 19 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, -8, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 9, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 @@ -5977,17 +5977,17 @@ gBattleAnimMove_LeafTornado:: end LeafTornadoVortex: createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return gBattleAnimMove_Steamroller:: @@ -6031,19 +6031,19 @@ gBattleAnimMove_CottonGuard:: end CottonSporesSpiralInward: createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xffdd, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xf, 0xffd8, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffe0, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x19, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gCottonGuardSporeTemplate, ANIM_ATTACKER, 2, 0x5, 0xffd8, 0xd - delay 0x3 + delay 3 return gBattleAnimMove_NightDaze:: @@ -6062,20 +6062,20 @@ gBattleAnimMove_NightDaze:: createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0xa0 createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0x0 createsprite gNightDazeVioletCirclesTemplate, ANIM_TARGET, 2, 0xe0 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0xF + delay 15 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x1 + delay 1 createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x2002 - delay 0x6 + delay 6 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x2002 @@ -6134,15 +6134,15 @@ gBattleAnimMove_Hurricane:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 64, 1 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust - delay 0xA + delay 10 call HurricaneGust waitforvisualfinish stopsound @@ -6166,7 +6166,7 @@ gBattleAnimMove_HeadCharge:: createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 4, 1 @@ -6187,13 +6187,13 @@ gBattleAnimMove_GearGrind:: playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x0, 0x333, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x0, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x0, 0xfccd, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x0, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish @@ -6217,45 +6217,45 @@ gBattleAnimMove_SearingShot:: createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gSearingShotRedChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xf + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x20, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x40, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x60, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x80, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0xffec createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0xffec - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xe0, 0x1e, 0x19, 0xffec - delay 0xF + delay 15 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x20, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x40, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x60, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 2, 0x1, 0x80, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0x0 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xa0, 0x1e, 0x19, 0x0 - delay 0x2 + delay 2 createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xe0, 0x1e, 0x19, 0x0 - delay 0x15 + delay 21 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1F clearmonbg ANIM_ATTACKER @@ -6263,7 +6263,7 @@ gBattleAnimMove_SearingShot:: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xA00, 0x0, 0x1, 0xffff waitbgfadein - delay 0x1E + delay 30 monbg ANIM_ATK_PARTNER createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x0, 0x9, 0x1F playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -6277,11 +6277,11 @@ gBattleAnimMove_SearingShot:: createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, 5, 10, 0x1, 0x1E, ANIM_DEF_PARTNER createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, -5, -5, 0x1, 0x1E, ANIM_ATK_PARTNER createsprite gSearingShotEruptionImpactTemplate, ANIM_TARGET, 3, 5, 10, 0x1, 0x1E, ANIM_ATK_PARTNER - delay 0x1E + delay 30 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x9, 0x0, 0x1F - delay 0x1E + delay 30 call UnsetPsychicBg createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 clearmonbg ANIM_ATK_PARTNER @@ -6307,36 +6307,36 @@ TechnoBlastNormal: waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteChargeTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastWhiteCircles call TechnoBlastWhiteCircles createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gTechnoBlastWhiteBlastTemplate, ANIM_TARGET, 3, 0xa, 0x0, 0x0, 0x0, 0x1e, 0x0 @@ -6352,11 +6352,11 @@ TechnoBlastNormal: playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @@ -6366,33 +6366,33 @@ TechnoBlastNormal: end TechnoBlastWhiteCircles: createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x14, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffec, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x14, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 return TechnoBlastElectric: @@ -6408,21 +6408,21 @@ TechnoBlastElectric: loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gTechnoBlastYellowBlastTemplate, ANIM_TARGET, 3, 0xa, 0x0, 0x0, 0x0, 0x1e, 0x0 @@ -6440,15 +6440,15 @@ TechnoBlastElectric: createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gTechnoBlastYellowSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 @@ -6461,7 +6461,7 @@ TechnoBlastElectric: TechnoBlastCharging1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -6469,7 +6469,7 @@ TechnoBlastCharging2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -6487,74 +6487,74 @@ TechnoBlastWater: createsprite gTechnoBlastBlueChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 waitforvisualfinish @@ -6574,15 +6574,15 @@ TechnoBlastWater: createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x1 - delay 0x2 + delay 2 createsprite gTechnoBlastBlueSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 @@ -6606,7 +6606,7 @@ TechnoBlastFire: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 waitforvisualfinish createsprite gTechnoBlastRedChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x5 + delay 5 call TechnoBlastFireSpiral call TechnoBlastFireSpiral call TechnoBlastFireSpiral @@ -6632,11 +6632,11 @@ TechnoBlastFire: createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @@ -6647,25 +6647,25 @@ TechnoBlastFire: TechnoBlastFireSpiral: createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 return TechnoBlastIce: @@ -6679,19 +6679,19 @@ TechnoBlastIce: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 waitforvisualfinish createsprite gTechnoBlastIceChargeTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x5 + delay 5 call TechnoBlastIceChargeParticles call TechnoBlastIceChargeParticles call TechnoBlastIceChargeParticles createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0x14, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfffb, 0xa, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x11, 0xfff4, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish @@ -6710,15 +6710,15 @@ TechnoBlastIce: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x1, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x2 + delay 2 createsprite gTechnoBlastIceSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 @@ -6730,25 +6730,25 @@ TechnoBlastIce: TechnoBlastIceChargeParticles: createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0x14, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfffb, 0xa, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x11, 0xfff4, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xf, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gTechnoBlastIceCrystalsTemplate, ANIM_ATTACKER, 2, 0x14, 0x2, 0x0, 0x2 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 return gBattleAnimMove_RelicSong:: @@ -6765,49 +6765,49 @@ gBattleAnimMove_RelicSong:: createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x7, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x3, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x0, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc - delay 0x5 + delay 5 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x3, 0xc - delay 0x5 + delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 @@ -6817,13 +6817,13 @@ gBattleAnimMove_RelicSong:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x5 + delay 5 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -6842,16 +6842,16 @@ gBattleAnimMove_SecretSword:: playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 - delay 0x16 + delay 22 createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSecretSwordBladesTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xFF00, 0xA createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x0 @@ -6903,20 +6903,20 @@ gBattleAnimMove_BoltStrike:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x07FE createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 64, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 waitforvisualfinish clearmonbg ANIM_ATTACKER playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 0x8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 - delay 0xA + delay 10 fadetobg BG_BOLT_STRIKE waitbgfadeout waitforvisualfinish monbg ANIM_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 32, 1 @@ -6941,28 +6941,28 @@ gBattleAnimMove_BlueFlare:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x7, 0x9 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 + delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x1, 0x0, 0x9, 0x1F createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET @@ -6983,17 +6983,17 @@ gBattleAnimMove_BlueFlare:: end BlueFlareFireSpin: createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gBlueFlareFlameSwirlTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return BlueFlareFlameSpreadEffect: createsprite gBlueFlareBurnTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x0, 0xb0, 0x28 @@ -7036,7 +7036,7 @@ FreezeShockCharge: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff createsprite gFreezeShockCircleTemplate, ANIM_ATTACKER, 2 @electric circle - delay 0x14 + delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff waitforvisualfinish end @@ -7057,7 +7057,7 @@ FreezeShockAttack: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 - delay 0xf + delay 15 waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 0x13 call ElectricityEffect waitforvisualfinish @@ -7081,7 +7081,7 @@ IceBurnCharge: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff - delay 0x14 + delay 20 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @@ -7108,22 +7108,22 @@ IceBurnUnleash: createsprite gIceBurnSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7fff @@ -7144,13 +7144,13 @@ gBattleAnimMove_Snarl:: playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 - delay 0x10 + delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER @@ -7161,13 +7161,13 @@ gBattleAnimMove_Snarl:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -7183,17 +7183,17 @@ gBattleAnimMove_IcicleCrash:: monbg ANIM_DEF_PARTNER createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xfffb, 0x0, 0xfffb, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 0x1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x13, 0x0, 0xa, 0x01 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffe9, 0x0, 0xfff6, 0x1 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 - delay 0x2 + delay 2 call LaunchIcicleCrashSpear call LaunchIcicleCrashSpear waitforvisualfinish @@ -7204,28 +7204,28 @@ gBattleAnimMove_IcicleCrash:: LaunchIcicleCrashSpear: createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x1c, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xfff6, 0x0, 0xfffb, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x18, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffe0, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gIcicleCrashSpearTemplate, ANIM_TARGET, 2, 0x1e, 0x0, 0xa, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x2 + delay 2 return gBattleAnimMove_VCreate:: @@ -7237,7 +7237,7 @@ gBattleAnimMove_VCreate:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken createsprite gVCreateRedOrbTemplate, ANIM_ATTACKER, 2, 0x0, 0x11, 0x0, 0x1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gVCreateRedRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1f @@ -7266,21 +7266,21 @@ gBattleAnimMove_VCreate:: waitbgfadein playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x1f playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, 0x1, 0x1 waitforvisualfinish @@ -7292,7 +7292,7 @@ gBattleAnimMove_VCreate:: waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1f createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x1f - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -7303,7 +7303,7 @@ gBattleAnimMove_VCreate:: VCreateFlames: createsprite gVCreateFlameTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x16, 0xFFEA, 0x10 @upperright createsprite gVCreateFlameTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFEE, 0xFFEE, 0x10 @upperleft - delay 0x3 + delay 3 return gBattleAnimMove_FusionFlare:: @@ -7320,23 +7320,23 @@ gBattleAnimMove_FusionFlare:: waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call FusionFlareBuff - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x1, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gFusionFlareRedBallUpTemplate, ANIM_ATTACKER, 2 - delay 0x20 + delay 32 createsprite gFusionFlareRedBallTemplate, ANIM_ATTACKER, 3, 0x0, 0xffA0, 0x2F createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0xc8, 0x50, 0x8, 0x1, 0x28, 0x14, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 - delay 0x29 + delay 41 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 11, RGB_RED - delay 0x5 + delay 5 createsprite gFusionFlareRedRingTemplate, ANIM_ATTACKER, 3, 0x1, 0x1, 0x1, 0x1, 0x1F, 0x8 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 @@ -7344,7 +7344,7 @@ gBattleAnimMove_FusionFlare:: createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x50, 0x3c, 0xa, 0x3, 0x14, 0x32, 0x0 createsprite gFusionFlareRedBubblesTemplate, ANIM_ATTACKER, 66, 0x8c, 0x64, 0x10, 0x1, 0x14, 0x1e, 0x1 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 16 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @@ -7354,13 +7354,13 @@ gBattleAnimMove_FusionFlare:: end FusionFlareBuff: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -7377,7 +7377,7 @@ gBattleAnimMove_FusionBolt:: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x0 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER waitforvisualfinish @@ -7392,19 +7392,19 @@ gBattleAnimMove_FusionBolt:: waitforvisualfinish createsprite gFusionBoltBallTemplate, ANIM_TARGET, 2, 0x10 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x8 + delay 8 createvisualtask AnimTask_VoltTackleAttackerReappear, 0x5 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xE, 0x0, 0x0 waitforvisualfinish @@ -7418,27 +7418,27 @@ gBattleAnimMove_FlyingPress:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish - delay 0xF + delay 15 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x2 + delay 2 createvisualtask AnimTask_SquishTarget, 0x2 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0x8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0x8, 0xfff8, 0x1, 0x0 - delay 0x2 + delay 2 createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 0, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish blendoff @@ -7450,26 +7450,26 @@ gBattleAnimMove_MatBlock:: monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 16, 0 - delay 0x0 + delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x18 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x18 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xfff8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xffe8 createsprite gMatBlockGreenConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xffe8 - delay 0x14 + delay 20 createvisualtask AnimTask_ConversionAlphaBlend, 0x5 waitforvisualfinish - delay 0x1 + delay 1 clearmonbg ANIM_ATK_PARTNER blendoff end @@ -7482,23 +7482,23 @@ gBattleAnimMove_Belch:: setalpha 12, 8 playsewithpan SE_SUCCESS, SOUND_PAN_ATTACKER createsprite gBelchBerryTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff8, 0xfff8, 0xfff8, 0x14, 0xffe0 - delay 0x13 + delay 19 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, 0x1, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, 0x1, 0x1 waitforvisualfinish @@ -7806,7 +7806,7 @@ gBattleAnimMove_ForestsCurse:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x02E3 - delay 0x3 + delay 3 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -7820,23 +7820,23 @@ gBattleAnimMove_PetalBlizzard:: splitbgprio ANIM_TARGET playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30 - delay 0x1 + delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0x6, 0x3c, 0x19 - delay 0x1 + delay 1 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x3c, 0x7, 0x3c, 0x1e createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x73, 0x37, 0xA, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x64, 0x32, 0x4, 0x32, 0x1A - delay 0x1 + delay 1 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x69, 0x19, 0x8, 0x3c, 0x14 - delay 0x1 + delay 1 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x73, 0x28, 0xA, 0x30, 0x1E - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister1Template, ANIM_TARGET, 2, 0x78, 0x1E, 0x6, 0x2d, 0x19 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x23, 0xA, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gPetalBlizzardTwister2Template, ANIM_TARGET, 2, 0x69, 0x14, 0x8, 0x28, 0x0 - delay 0x3 + delay 3 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x6e, 0xA, 0x8, 0x20, 0x14 waitforvisualfinish @@ -7845,13 +7845,13 @@ gBattleAnimMove_PetalBlizzard:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATK_PARTNER, 3, 0, 12, 1 - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -7901,7 +7901,7 @@ gBattleAnimMove_DisarmingVoice:: waitforvisualfinish createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect - delay 0xA + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 26, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 26, 1 waitforvisualfinish @@ -7982,51 +7982,51 @@ gBattleAnimMove_CraftyShield:: splitbgprio ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x4DBF setalpha 16, 0 - delay 0x0 + delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xffe8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0xfff8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x8 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0x8 - delay 0x3 + delay 3 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xffe8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x8, 0x18 - delay 0x3 + delay 3 createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0x18 - delay 0x14 + delay 20 playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2722, 0x1, 0x1, 0x37ff, 0xc, 0x0, 0x0 - delay 0x6 + delay 6 createvisualtask AnimTask_ConversionAlphaBlend, 0x5 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x4DBF waitforvisualfinish - delay 0x1 + delay 1 clearmonbg ANIM_ATK_PARTNER blendoff end @@ -8041,18 +8041,18 @@ gBattleAnimMove_FlowerShield:: createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8, 0x8, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8, 0x8, 0x64 - delay 0x1e + delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x0, 0x64 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x0, 0x64 - delay 0x1e + delay 30 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 waitforvisualfinish @@ -8148,9 +8148,9 @@ gBattleAnimMove_Electrify:: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0x4 + delay 4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 @@ -8165,32 +8165,32 @@ gBattleAnimMove_Electrify:: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x60, 0x28, 0x1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xa0, 0x28, 0x0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 - delay 0xA + delay 10 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xB, 0x039B createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x039B - delay 0x4 + delay 4 clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_DEF_PARTNER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - delay 0x1 + delay 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 createsprite gElectrifyYellowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0, 0x1f, 0x8 - delay 0x1 + delay 1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xB, 0x0, 0x039B @@ -8221,7 +8221,7 @@ gBattleAnimMove_PlayRough:: createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x80, 0xfff2 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x1a0, 0xffda createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff80, 0xffea - delay 0x0 + delay 0 call SubmissionHit playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xa0, 0xffe0 @@ -8230,14 +8230,14 @@ gBattleAnimMove_PlayRough:: createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0x1a0, 0xffda createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff80, 0xffea createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xfe80, 0xffe1 - delay 0x0 + delay 0 call SubmissionHit playsewithpan SE_M_DIVE, SOUND_PAN_TARGET createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff00, 0xffd6 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x80, 0xfff2 createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0x1a0, 0xffda createsprite gPinkHeartSpriteTemplate, ANIM_TARGET, 3, 0xff80, 0xffea - delay 0x0 + delay 0 playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xa0, 0xffe0 createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff00, 0xffd8 @@ -8245,10 +8245,10 @@ gBattleAnimMove_PlayRough:: createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0x1a0, 0xffda createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xff80, 0xffea createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x8, 0xfe80, 0xffe1 - delay 0x0 + delay 0 call SubmissionHit waitforvisualfinish - delay 0xD + delay 13 stopsound clearmonbg 0x3 blendoff @@ -8263,16 +8263,16 @@ gBattleAnimMove_FairyWind:: waitforvisualfinish playsewithpan SE_M_GUST, SOUND_PAN_TARGET createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x14, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x5, 0x16, 0xffee, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0xfff6, 0x16, 0xf, 0x1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 18, 1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xffec, 0x1 - delay 0x5 + delay 5 createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xc, 0x1 - delay 0x5 + delay 5 waitforvisualfinish stopsound playsewithpan SE_M_GUST2, SOUND_PAN_TARGET @@ -8386,7 +8386,7 @@ gBattleAnimMove_PlayNice:: loadspritegfx ANIM_TAG_RED_HEART loopsewithpan SE_M_SANDSTORM, SOUND_PAN_ATTACKER, 0xc, 0x3 createvisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER - delay 0xF + delay 15 createsprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff8 end @@ -8409,44 +8409,44 @@ gBattleAnimMove_DiamondStorm:: panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff1, 0x0, 0xfff1, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfffb, 0x0, 0xfffb, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff1, 0x0, 0xfff1, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xffe7, 0x0, 0xffe7, 0x48, 0x1 createsprite gDiamondStormBlizzardTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x50, 0x0, 0x0, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x78, 0x46, 0x5, 0x46, 0x1e - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0x6, 0x3c, 0x19 - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x3c, 0x7, 0x3c, 0x1e createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0xa, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x64, 0x32, 0x4, 0x32, 0x1a - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x69, 0x19, 0x8, 0x3c, 0x14 - delay 0x1 + delay 1 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x28, 0xa, 0x30, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x78, 0x1e, 0x6, 0x2d, 0x19 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x73, 0x23, 0xa, 0x3c, 0x1e - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x69, 0x14, 0x8, 0x28, 0x0 - delay 0x3 + delay 3 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x6e, 0xa, 0x8, 0x20, 0x14 waitforvisualfinish @@ -8455,13 +8455,13 @@ gBattleAnimMove_DiamondStorm:: playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish @@ -8474,7 +8474,7 @@ gBattleAnimMove_DiamondStorm:: gBattleAnimMove_SteamEruption:: loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x043D - delay 0x20 + delay 32 monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @@ -8482,7 +8482,7 @@ gBattleAnimMove_SteamEruption:: call SteamEruptionBreath createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f call SteamEruptionBreath - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 call SteamEruptionBreath call SteamEruptionBreath @@ -8508,7 +8508,7 @@ gBattleAnimMove_SteamEruption:: end SteamEruptionBreath: createsprite gSteamEruptionBreathTemplate, ANIM_TARGET, 2, 0x0, 0x5, 0x0, 0x5, 0x14 - delay 0x1 + delay 1 return gBattleAnimMove_HyperspaceHole:: @@ -8520,23 +8520,23 @@ gBattleAnimMove_HyperspaceHole:: waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER waitsound createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x17 + delay 23 createvisualtask AnimTask_IsTargetSameSide, 0x2 createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x19 + delay 25 visible ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x5 + delay 5 createsprite gHyperspaceHoleImpactTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 call HyperspaceHoleMovement createsprite gHyperspaceHoleImpactTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 @@ -8547,13 +8547,13 @@ gBattleAnimMove_HyperspaceHole:: call HyperspaceHoleMovement waitforvisualfinish visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF waitforvisualfinish @@ -8561,7 +8561,7 @@ gBattleAnimMove_HyperspaceHole:: HyperspaceHoleMovement: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 15, 1 - delay 0x4 + delay 4 return gBattleAnimMove_WaterShuriken:: @@ -8574,13 +8574,13 @@ gBattleAnimMove_WaterShuriken:: splitbgprio ANIM_TARGET createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0x87, 0xffc0, SOUND_PAN_TARGET, 0x5, 0x5, 0x0, 0x5 createsprite gWaterShurikenStarTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x27 - delay 0x8 + delay 8 createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0x5 + delay 5 createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0x5 + delay 5 createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf - delay 0xC + delay 12 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gWaterShurikenImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 waitforvisualfinish @@ -8598,19 +8598,19 @@ gBattleAnimMove_MysticalFire:: waitsound blendoff createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0x0 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x0, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0xffff - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x2, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x1, 0xffff - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0xffff, 0x1 - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x1, 0xfffe - delay 0x1 + delay 1 createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x1e, 0x3, 0x1 playse 0x8c waitforvisualfinish @@ -8624,29 +8624,29 @@ gBattleAnimMove_SpikyShield:: splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0x0, 0x5a - delay 0xF + delay 15 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0xFFE0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x16, 0xFFEA, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x1E, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0x1C, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFED, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFE5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0xFFEE, 0xFFEE, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x0, 0xFFE7, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x11, 0xFFEF, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1, 0x10, 0x10, 0x10 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -8657,7 +8657,7 @@ gBattleAnimMove_AromaticMist:: playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6E7D createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x64 - delay 0x19 + delay 25 setpan 0x0 call SweetScentEffect createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x0 @@ -8678,9 +8678,9 @@ gBattleAnimMove_EerieImpulse:: loadspritegfx ANIM_TAG_GOLD_RING @psybeam ring monbg ANIM_DEF_PARTNER waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET 0x13 - delay 0x4 + delay 4 createsprite gEerieImpulseRingTemplate, ANIM_ATTACKER, 0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 - delay 0xB + delay 11 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 1 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 @@ -8698,15 +8698,15 @@ gBattleAnimMove_EerieImpulse:: createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xa, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xfff1, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x7 + delay 7 createsprite gEerieImpulseImpactTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffb, 0x1, 0x0, 0x20, 0x10 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 @@ -8719,16 +8719,16 @@ gBattleAnimMove_VenomDrench:: monbg ANIM_DEF_PARTNER createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xfffb, 0x1, 0xfffb, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x13, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffe9, 0x2, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 call AcidDrench call AcidDrench waitforvisualfinish @@ -8737,28 +8737,28 @@ gBattleAnimMove_VenomDrench:: AcidDrench: createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x1c, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xfff6, 0x1, 0xfffb, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x18, 0x1, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffe0, 0x2, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gVenomDrenchAcidTemplate, ANIM_TARGET, 2, 0x1e, 0x2, 0xa, 1 playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET - delay 0x2 + delay 2 return gBattleAnimMove_Powder:: @@ -8775,11 +8775,11 @@ gBattleAnimMove_Powder:: end POWDER_SPORE: createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0x55, 0x50, 0x0 - delay 0xc + delay 12 createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 - delay 0xc + delay 12 createsprite gPowderBlackSporeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff1, 0x0, 0x50, 0x0 - delay 0xc + delay 12 return gBattleAnimMove_Geomancy:: @@ -8815,63 +8815,63 @@ GeomancyRingBuff: createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x2 + delay 2 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x2 + delay 2 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gGeomancyBlueCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x0 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRedCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x0 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyGreenCellVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x0 - delay 0x2 + delay 2 return GeomancyUnleash: loadspritegfx ANIM_TAG_FIRE_PLUME @dragon rage createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x24CF playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 - delay 0x1 + delay 1 createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER @@ -8895,21 +8895,21 @@ GeomancyUnleash: end GeomancyRageBuff: createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0x5, 0x0 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xfff6, 0xfff1 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x19 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xf, 0x5 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0xffe7, 0x0 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0x1e, 0x1e - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 2, 0x0, 0xffe5, 0x19 - delay 0x1 + delay 1 createsprite gGeomancyYellowRageTemplate, ANIM_TARGET, 66, 0x0, 0x0, 0x8 - delay 0x1 + delay 1 return gBattleAnimMove_MagneticFlux:: @@ -8920,11 +8920,11 @@ gBattleAnimMove_MagneticFlux:: loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 0x12, 0x3 createvisualtask AnimTask_DefenseCurlDeformMon, 0x5 call MagneticFluxSparks1 - delay 0xA + delay 10 call MagneticFluxSparks2 - delay 0xA + delay 10 call MagneticFluxSparks1 - delay 0xA + delay 10 createsprite gMagneticFluxUproarTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 call MagneticFluxSparks2 waitforvisualfinish @@ -8933,14 +8933,14 @@ gBattleAnimMove_MagneticFlux:: end MagneticFluxSparks1: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return MagneticFluxSparks2: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -8949,13 +8949,13 @@ gBattleAnimMove_HappyHour:: monbg ANIM_ATTACKER loopsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET, 0x8, 10 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xfffb, 0x0, 0xfffb, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x13, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffe9, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 call CoinShower call CoinShower waitforvisualfinish @@ -8963,21 +8963,21 @@ gBattleAnimMove_HappyHour:: end CoinShower: createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x1c, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xfff6, 0x0, 0xfffb, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x18, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffe0, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0xffec, 0x0, 0xfff6, 0x1 - delay 0x2 + delay 2 createsprite gHappyHourCoinShowerTemplate, ANIM_TARGET, 2, 0x1e, 0x0, 0xa, 0x1 - delay 0x2 + delay 2 return gBattleAnimMove_ElectricTerrain:: @@ -9026,7 +9026,7 @@ gBattleAnimMove_DazzlingGleam:: delay 8 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 3, 0, 16, RGB_WHITE - delay 0x4 + delay 4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB_WHITE @@ -9039,9 +9039,9 @@ gBattleAnimMove_Celebrate:: loadspritegfx ANIM_TAG_ITEM_BAG createsprite gCelebrateBagTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - delay 0x12 + delay 18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x47 + delay 71 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER 0x16 0x3 end @@ -9052,35 +9052,35 @@ gBattleAnimMove_HoldHands:: playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 6, 6, 3 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - delay 0x8 + delay 8 createsprite gHoldHandsHeartTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c waitforvisualfinish createvisualtask AnimTask_HelpingHandAttackerMovement, 0x5 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0x0 createsprite gHelpingHandClapSpriteTemplate, ANIM_ATTACKER, 40, 0x1 - delay 0x13 + delay 19 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 - delay 0xe + delay 14 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 5, 1 - delay 0x14 + delay 20 playsewithpan SE_M_ENCORE, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 3, 0, 10, 1 createvisualtask AnimTask_BlendMonInAndOut, 2, ANIM_ATK_PARTNER, RGB_YELLOW, 12, 1, 1 @@ -9095,11 +9095,11 @@ gBattleAnimMove_BabyDollEyes:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xA, 0x7FFF waitforvisualfinish createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 - delay 0x20 + delay 32 playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 waitforvisualfinish - delay 0xa + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x7FFF @@ -9116,10 +9116,10 @@ gBattleAnimMove_Nuzzle:: createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0xffec, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createsprite gMagentaHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x14, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9176,17 +9176,17 @@ gBattleAnimMove_Infestation:: end InfestationVortex: createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x1 + delay 1 createsprite gInfestationBubbleTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x1 + delay 1 return gBattleAnimMove_PowerUpPunch:: @@ -9241,9 +9241,9 @@ gBattleAnimMove_OblivionWing:: end OblivionWingBeam: createsprite gOblivionWingBeamTemplate, ANIM_TARGET, 2, 0, -90, 0, 20, 0x15, 0x0 - delay 0x2 + delay 2 createsprite gOblivionWingBeamTemplate, ANIM_TARGET, 2, 0, -90, 0, 20, 0x15, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_ThousandArrows:: @@ -9260,9 +9260,9 @@ gBattleAnimMove_ThousandArrows:: waitforvisualfinish createsprite gThousandArrowsGreenChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x18 + delay 24 call ThousandArrowsHexes call ThousandArrowsHexes call ThousandArrowsHexes @@ -9271,11 +9271,11 @@ gBattleAnimMove_ThousandArrows:: call ThousandArrowsHexes call ThousandArrowsHexes createsprite gThousandArrowsGreenDischargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gThousandArrowsGreenDischargeTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x30 + delay 48 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x32 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x32 call ThousandArrowsDown @@ -9291,45 +9291,45 @@ gBattleAnimMove_ThousandArrows:: ThousandArrowsHexes: createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0xfffc, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0x100D, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0x4, 0xfff4 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenHexTemplate, ANIM_TARGET, 2, 0x0, 0xfff0, 0xfff0 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 return ThousandArrowsDown: createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xdc, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x3c, 0x64 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x8c, 0x37 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xb4, 0x32 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x14, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x5a, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xa0, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x5a playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0x78, 0x3c playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gThousandArrowsGreenArrowTemplate, ANIM_TARGET, 2, 0x1, 0xc8, 0x28 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER return @@ -9355,41 +9355,41 @@ gBattleAnimMove_ThousandWaves:: loopsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x3, 0x15 call ThousandWavesRecover createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffdd, 0x8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffdd, 0xfff6, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xf, 0xffd8, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffe0, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x5, 0x27, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x19, 0xffec, 0xd - delay 0x3 + delay 3 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0xd - delay 0x3 + delay 3 createvisualtask AnimTask_AttackerStretchAndDisappear, 0x2 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x5, 0xffd8, 0xd waitforvisualfinish panse SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - delay 0x4 + delay 4 createvisualtask AnimTask_MoveHeatWaveTargets, 0x5 - delay 0xc + delay 12 monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x14, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 call ThousandWavesRotatingImpact call ThousandWavesRotatingImpact waitforvisualfinish @@ -9402,63 +9402,63 @@ gBattleAnimMove_ThousandWaves:: end ThousandWavesRecover: createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffec, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffec, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x14, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffec, 0xffe2, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x14, 0x1e, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gThousandWavesGreenRecoverTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0x2 + delay 2 return ThousandWavesRotatingImpact: createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x1 @1 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x46, 0x7c0, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x1 @2 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x0, 0xb00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x5, 0xfff4, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x1 @3 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x3c, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0x9, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x1 @4 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0xfff4, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x1 @5 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0x5, 0x9, 0x3 createsprite gThousandWavesRotatingImpactTemplate, ANIM_TARGET, 2, 0x23, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x1 @6 createsprite gThousandWavesGreenWaveTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gThousandWavesPoundImpactTemplate, ANIM_TARGET, 2, 0x1, 0xfffa, 0x0, 0x3 return @@ -9489,17 +9489,17 @@ gBattleAnimMove_LandsWrath:: LandsWrathVortex: playsewithpan SE_M_SACRED_FIRE2 SOUND_PAN_TARGET createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x0 - delay 0x2 + delay 2 createsprite gLandsWrathVortexTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_LightOfRuin:: @@ -9543,15 +9543,15 @@ gBattleAnimMove_LightOfRuin:: call LightOfRuinBeam call LightOfRuinBeam call LightOfRuinBeam - delay 0x20 + delay 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gLightOfRuinPinkDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gLightOfRuinPinkDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 createsprite gLightOfRuinPinkExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x10 + delay 16 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x1, 0x0, 0x0, 0x0 @@ -9560,7 +9560,7 @@ gBattleAnimMove_LightOfRuin:: LightOfRuinBeam: createsprite gLightOfRuinPinkOrbsTemplate, ANIM_TARGET, 2 createsprite gLightOfRuinPinkOrbsTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_OriginPulse:: @@ -9576,9 +9576,9 @@ gBattleAnimMove_OriginPulse:: waitbgfadein createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 playsewithpan SE_INTRO_BLAST, SOUND_PAN_ATTACKER waitforvisualfinish @@ -9588,12 +9588,12 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gOriginPulseOrbTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0x35 + delay 53 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 - delay 0x10 + delay 16 createsprite gOriginPulseRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish - delay 0x2F + delay 47 createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xFF90, 0x10 @up createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x5F, 0xFF9D, 0x10 @upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x73, 0x0, 0x10 @right @@ -9602,7 +9602,7 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFFB0, 0x43, 0x10 @lower left createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFF60, 0x0, 0x10 @left createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xFFAA, 0xFF94, 0x10 @upper left - delay 0x5 + delay 5 createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x2D, 0xFF9D, 0x10 @between up and upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xDF, 0xFF9D, 0x10 @between right and upper right createsprite gOriginPulseOrbInwardTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x9F, 0x37, 0x10 @between right and lower right @@ -9617,17 +9617,17 @@ gBattleAnimMove_OriginPulse:: createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffb0, 0xfff0, 0x1, 0x1 stopsound playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffc0, 0x14, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gOriginPulseBasicSplatTemplate, ANIM_TARGET, 3, 0xffe0, 0x5, 0x1, 0x1 waitsound call UnsetPsychicBg @@ -9659,21 +9659,21 @@ PrecipiceBladesPlayer: delay 5 createsprite gPrecipiceBladesSpikeTemplate, ANIM_ATTACKER, 5, ANIM_ATTACKER, -10, 17, 120, 0x0 PrecipiceBladesContinue: - delay 0x10 + delay 16 createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, -15, 18, ANIM_TARGET createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, -15, 18, ANIM_DEF_PARTNER - delay 0x20 + delay 32 createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, 15, 18, ANIM_TARGET createsprite gPrecipiceBladesPlumeTemplate, ANIM_TARGET, 2, 15, 18, ANIM_DEF_PARTNER - delay 0x20 + delay 32 stopsound playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -25, 40, 0x0 createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0, -25, 40, 0x0 - delay 0x6 + delay 6 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -20, 0, 6, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, -20, 0, 6, 1 - delay 0x22 + delay 34 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0x0, 0x6 waitforvisualfinish @@ -9740,15 +9740,15 @@ gBattleAnimMove_HyperspaceFury:: waitforvisualfinish playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc - delay 0x5 + delay 5 createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 - delay 0x15 + delay 21 invisible ANIM_ATTACKER waitforvisualfinish fadetobg BG_HYPERSPACE_FURY @@ -9759,42 +9759,42 @@ gBattleAnimMove_HyperspaceFury:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 32, 1 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createvisualtask AnimTask_IsTargetSameSide, 0x2 createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 call HyperspaceFuryRandomImpact - delay 0x2 + delay 2 createsprite gHyperspaceFuryHandTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 call HyperspaceFuryRandomImpact - delay 0x7 + delay 7 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL visible ANIM_ATTACKER createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 0, 3, 32, 1 @@ -9803,13 +9803,13 @@ gBattleAnimMove_HyperspaceFury:: call UnsetPsychicBg waitforvisualfinish visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER - delay 0x1 + delay 1 invisible ANIM_ATTACKER - delay 0x1 + delay 1 visible ANIM_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 end @@ -9823,19 +9823,19 @@ gBattleAnimMove_ShoreUp:: loadspritegfx ANIM_TAG_BLUE_STAR @heal2 playsewithpan SE_M_SANDSTORM, 0x0 createvisualtask AnimTask_LoadSandstormBackground, 0x5, 0x0 - delay 0x10 + delay 16 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0xa, 0x900, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0x800, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x32, 0xa00, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x14, 0x900, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x46, 0x7c0, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xb00, 0x60, 0x0 - delay 0xa + delay 10 createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xa00, 0x60, 0x0 call HealingEffect waitforvisualfinish @@ -9851,21 +9851,21 @@ gBattleAnimMove_FirstImpression:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 createvisualtask AnimTask_StretchTargetUp, 0x3 waitforvisualfinish - delay 0x19 + delay 25 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x6 waitforvisualfinish monbg ANIM_TARGET @This is placed here on purpose (to not ruin astonishs animation) - delay 0x1 + delay 1 createsprite gFirstImpressionPoundTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET 0xA 0x2 - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x6 - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 waitforvisualfinish clearmonbg ANIM_TARGET @@ -9879,19 +9879,19 @@ gBattleAnimMove_BanefulBunker:: waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER 0x10 createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0x0, 0x5a createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gBanefulBunkerPoisonBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -9952,11 +9952,11 @@ gBattleAnimMove_DarkestLariat:: end DarkestLariatImpact: createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0xfff4, 0x1, 0x1 - delay 0x8 + delay 8 createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0xfff4, 0x8, 0x1, 0x1 - delay 0x8 + delay 8 createsprite gDarkestLariatImpactTemplate, ANIM_ATTACKER, 3, 0xc, 0x0, 0x1, 0x1 - delay 0x8 + delay 8 return gBattleAnimMove_SparklingAria:: @@ -9972,7 +9972,7 @@ gBattleAnimMove_SparklingAria:: call SparklingAriaCharge call SparklingAriaCharge waitforvisualfinish - delay 0x1E + delay 30 playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER call SparklingAriaRain call SparklingAriaRain @@ -9986,69 +9986,69 @@ SparklingAriaRain: createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xdc, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x3c, 0x64 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x8c, 0x37 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xb4, 0x32 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x14, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0x5a, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0xa0, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x1e, 0x5a createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaRainTemplate, ANIM_TARGET, 2, 0x1, 0x78, 0x3c createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 createsprite gSparklingAriaBubbleRainTemplate, ANIM_TARGET, 2, 0x1, 0xc8, 0x28 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 6, 1 - delay 0x2 + delay 2 return SparklingAriaCharge: playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER createsprite gSparklingAriaBubblesTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 return gBattleAnimMove_IceHammer:: @@ -10061,7 +10061,7 @@ gBattleAnimMove_IceHammer:: waitforvisualfinish playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf - delay 0x13 + delay 19 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_SquishTarget, 0x2 createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b @@ -10097,27 +10097,27 @@ gBattleAnimMove_FloralHealing:: playsewithpan SE_M_TWISTER, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 clearmonbg ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 @2 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5f, 0x1, 0x50 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x4b, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x0, 0x78 - delay 0x2 + delay 2 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa monbg ANIM_TARGET call FloralHealingSpores @@ -10126,7 +10126,7 @@ gBattleAnimMove_FloralHealing:: waitforvisualfinish playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 16, 0xfff1, 0x0, 0x1, 0x0, 0x20, 0x3c, 0x1 - delay 0x8 + delay 8 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 16, 0xc, 0xfffb, 0x1, 0x0, 0x20, 0x3c, 0x1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10134,70 +10134,70 @@ gBattleAnimMove_FloralHealing:: FloralHealingSpores: createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0x55, 0x50, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x3 + delay 3 createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5f, 0x1, 0x50 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x4b, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 - delay 0x3 + delay 3 createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff1, 0x0, 0x50, 0x0 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x1, 0x40 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3a, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x78 - delay 0x2 + delay 2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x5a, 0x0, 0x40 - delay 0x2 + delay 2 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x0, 0x40 - delay 0x3 + delay 3 return CIRCLES_LEAVES: createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingOrbsTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x0 - delay 0x2 + delay 2 createsprite gFloralHealingLeavesTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x0 - delay 0x2 + delay 2 return gBattleAnimMove_HighHorsepower:: loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @horseshoe monbg ANIM_TARGET - delay 0x2 + delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gHighHorsepowerHorseshoeTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x7, 0x7fff - delay 0x32 + delay 50 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 @@ -10207,7 +10207,7 @@ gBattleAnimMove_HighHorsepower:: waitforvisualfinish clearmonbg ANIM_TARGET blendoff - delay 0x2 + delay 2 restorebg waitbgfadein end @@ -10228,7 +10228,7 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffce, 0xffd8, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffd8, 0x28, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x1, 0x0 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffe2, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x3c, 0xa, 0x6 @@ -10236,7 +10236,7 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x0, 0xffd8, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0xffe2, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x1, 0x0 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffce, 0x32, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 @@ -10244,32 +10244,32 @@ gBattleAnimMove_StrengthSap:: createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x14, 0xffc4, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 createsprite gStrengthSapRedInwardTemplate, ANIM_ATTACKER, 4, 0x23, 0x28, 0x6 - delay 0x2 + delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x07FD - delay 0x5 + delay 5 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0x5, 0x8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xa, 0xfffb, 0xfff8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xfffb, 0xf, 0x10, 0x21 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0xfff1, 0xfff0, 0x24 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0x5, 0x8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xa, 0xfffb, 0xfff8, 0x1a - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0xfff6, 0x14, 0x14, 0x27 - delay 0x4 + delay 4 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x5, 0xffee, 0xffec, 0x23 waitforvisualfinish @@ -10304,7 +10304,7 @@ SolarBladeUnleash: call SetSolarBeamBg playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSolarBladeImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1 - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, 0x7fff @@ -10315,7 +10315,7 @@ SolarBladeUnleash: end SolarBladeSunRays: createsprite gSunlightRaySpriteTemplate, ANIM_ATTACKER, 40 - delay 0x6 + delay 6 return gBattleAnimMove_Leafage:: @@ -10326,7 +10326,7 @@ gBattleAnimMove_Leafage:: createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x14, 0x1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0xffec, 0x1 createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x0, 0x1 - delay 0x14 + delay 20 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gLeafageImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 waitforvisualfinish @@ -10341,7 +10341,7 @@ gBattleAnimMove_Spotlight:: waitforvisualfinish playsewithpan SE_CONTEST_ICON_CHANGE, SOUND_PAN_ATTACKER createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff8 - delay 0x40 + delay 64 createvisualtask AnimTask_HardwarePaletteFade, 0x2, 0xf8, 0x3, 0xa, 0x0, 0x1 waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 0x2 @@ -10353,7 +10353,7 @@ gBattleAnimMove_ToxicThread:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 0xA, 0xA, 0x6038 @Purple createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0x0, 0xA, 0xA, 0x6038 @Purple monbg ANIM_DEF_PARTNER - delay 0x0 + delay 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 waitforvisualfinish loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 0x9, 0x6 @@ -10378,13 +10378,13 @@ gBattleAnimMove_ToxicThread:: waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0xa - delay 0x4 + delay 4 createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0xfffe - delay 0x4 + delay 4 createsprite gToxicThreadString, ANIM_TARGET, 2, 0x0, 0x16 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x1 + delay 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 end @@ -10413,31 +10413,31 @@ gBattleAnimMove_GearUp:: createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER call GearUpSparks call GearUpSparks call GearUpSparks playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish @@ -10447,16 +10447,16 @@ gBattleAnimMove_GearUp:: GearUpSparks: playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0xF + delay 15 return gBattleAnimMove_ThroatChop:: @@ -10471,19 +10471,19 @@ gBattleAnimMove_ThroatChop:: waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 - delay 0x3 + delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 @@ -10512,13 +10512,13 @@ PollenPuffOpponent: createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER @@ -10533,7 +10533,7 @@ PollenPuffOpponent: createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x10, 0x1e, 0x110, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xB0, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x100, 0x28, 0x0 - delay 0x1 + delay 1 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gPollenPuffSporeTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 waitforvisualfinish @@ -10542,11 +10542,11 @@ PollenPuffOpponent: createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0xFFE0, 0x10 @up createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFEE, 0xFFEE, 0x10 @upperleft createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x1C, 0x10 @down - delay 0x4 + delay 4 createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFE5, 0x0, 0x10 @left createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x14, 0x14, 0x10 @lowerright createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0xFFED, 0x13, 0x10 @lowerleft - delay 0x4 + delay 4 createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x1E, 0x0, 0x10 @right createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x16, 0xFFEA, 0x10 @upperright waitforvisualfinish @@ -10568,13 +10568,13 @@ PollenPuffAlly: createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0xD + delay 13 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER clearmonbg ANIM_ATTACKER @@ -10590,18 +10590,18 @@ PollenPuffAlly: createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x10, 0x1e, 0x120, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x90, 0x28, 0x0 createsprite gPollenPuffYellowSparkleTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0x110, 0x28, 0x0 - delay 0x1 + delay 1 createsprite gPollenPuffSporeTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 @stars loadspritegfx ANIM_TAG_BLUE_STAR @heal playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xa, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xfff1, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffb, 0x1, 0x0 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x1, 0x0 @@ -10619,14 +10619,14 @@ gBattleAnimMove_AnchorShot:: waitforvisualfinish createsprite gAnchorShotAnchorTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - delay 0x25 + delay 37 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER 0x1c 0x2 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0xfff0 - delay 0x4 + delay 4 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0x0 - delay 0x4 + delay 4 createsprite gAnchorShotChainTemplate, ANIM_TARGET, 2, 0xfff0, 0x10 waitforvisualfinish clearmonbg ANIM_TARGET @@ -10681,18 +10681,18 @@ gBattleAnimMove_Lunge:: createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 240, 0 loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gLungeGreenChargeTemplate, ANIM_ATTACKER, 2 - delay 0x6e - delay 0x3e + delay 110 + delay 62 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x15 + delay 21 clearmonbg ANIM_ATK_PARTNER invisible ANIM_ATTACKER waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER createsprite gLungeGreenBubbleTemplate, ANIM_TARGET, 2, 0xa, 0x0, 0x0, 0x0, 0x19, 0xffe0 - delay 0xF + delay 15 monbg ANIM_DEF_PARTNER - delay 0x1 + delay 1 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x46, 0x0, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x28, 0x28, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xa, 0xffc4, 0x6 @@ -10700,14 +10700,14 @@ gBattleAnimMove_Lunge:: createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffd8, 0x28, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffce, 0x6 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 - delay 0x2 + delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x32, 0xffe2, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x3c, 0xa, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x3c, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0xffd8, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0xffe2, 0x6 - delay 0x2 + delay 2 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffce, 0x32, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffc4, 0x14, 0x6 createsprite gTealAlertSpriteTemplate, ANIM_ATTACKER, 4, 0xffd8, 0xffd8, 0x6 @@ -10728,38 +10728,38 @@ gBattleAnimMove_FireLash:: splitbgprio_foes ANIM_TARGET createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_SLASH createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0xfff8, 0x0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x8, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0x7 + delay 7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x9 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -10773,21 +10773,21 @@ gBattleAnimMove_PowerTrip:: monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp - delay 0x8 + delay 8 call PowerTripBuffUp waitforvisualfinish playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xFFF5, 0xA, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0xFFF5, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createsprite gPowerTripImpactTemplate, ANIM_ATTACKER, 2, 0xA, 0x0, 0x1, 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -10796,13 +10796,13 @@ gBattleAnimMove_PowerTrip:: end PowerTripBuffUp: createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -10822,42 +10822,42 @@ gBattleAnimMove_BurnUp:: createvisualtask AnimTask_AllocBackupPalBuffer, 0x5 waitforvisualfinish createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x0, 0x1 - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x0 - delay 0x1 + delay 1 loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x1, 0x0 - delay 0x1 + delay 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xd, 0x1c createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish - delay 0x1E + delay 30 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createsprite gBurnUpRedYawnTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0 - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x1 - delay 0x1 + delay 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xd, 0x4a52 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 - delay 0xF + delay 15 createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xC, 0x1C - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x0, 0x1 - delay 0x1 + delay 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x1c - delay 0x1 + delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x1, 0x0 - delay 0x1 + delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 15, 1 call FireSpreadEffect waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xd, 0x0, 0x4a52 - delay 0x1 + delay 1 createvisualtask AnimTask_FreeBackupPalBuffer, 0x5 - delay 0x1 + delay 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xC, 0x0, 0x1C waitforvisualfinish @@ -10872,9 +10872,9 @@ gBattleAnimMove_SpeedSwap:: loadspritegfx ANIM_TAG_ORBS @circle monbg ANIM_TARGET panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 - delay 0xf + delay 15 createsprite gSpeedSwapCircleTemplate, ANIM_TARGET, 2, 0xfff4, 0x18 - delay 0x5 + delay 5 createsprite gSpeedSwapRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 createsprite gSpeedSwapOrbTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xFFE0, 0x10 createsprite gSpeedSwapOrbTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xFFEA, 0x10 @@ -10911,7 +10911,7 @@ gBattleAnimMove_SmartStrike:: createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x2 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x3 createsprite gLockOnMoveTargetSpriteTemplate, ANIM_ATTACKER, 40, 0x4 - delay 0x78 + delay 120 setarg 0x7 0xffff waitforvisualfinish monbg ANIM_DEF_PARTNER @@ -10948,7 +10948,7 @@ gBattleAnimMove_Purify:: setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gPurifyWhiteBallTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff8, 0xfff8, 0xfff8, 0x14, 0xffe0 - delay 0x13 + delay 19 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createsprite gPurifySmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b createsprite gPurifySmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x48, 0x1, 0x4b @@ -10981,18 +10981,18 @@ gBattleAnimMove_RevelationDance:: createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe8, 0x8, 0x64 - delay 0xf + delay 15 createsprite gRevelationDanceYellowOrbsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x18, 0xffe8, 0x8, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xffe8, 0x8, 0x64 - delay 0x1e + delay 30 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x10, 0xffe8, 0x0, 0x64 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffe8, 0x0, 0x64 - delay 0x1e + delay 30 createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gRevelationDanceYellowFlowerTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 @@ -11039,102 +11039,102 @@ gBattleAnimMove_CoreEnforcer:: createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerBlueRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerYellowRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerGreenRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 - delay 0x5 + delay 5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x5 + delay 5 createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 waitforvisualfinish unloadspritegfx ANIM_TAG_SPARK_2 @yellow color @@ -11151,7 +11151,7 @@ gBattleAnimMove_CoreEnforcer:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 0xD, 0xD, 0x079F @Yellow createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 0xA, 0xA, 0x7501 @Royal Blue createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 0xA, 0xA, 0x0688 @Green - delay 0x10 + delay 16 monbg ANIM_TARGET createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 0x5 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @@ -11159,79 +11159,79 @@ gBattleAnimMove_CoreEnforcer:: createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 65, 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x0 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff5, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffa, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xffff, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x5, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xA, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xF, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x14, 0xffe2, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xF, 0xffe7, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x2 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xC, 0xffea, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x9, 0xffed, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x6, 0xfff0, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x3, 0xfff3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x3 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x0, 0xfff6, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffc, 0xfff9, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff9, 0xfffc, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff6, 0xffff, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x4 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff3, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfff8, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xfffd, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x2, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x5 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x7, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0xC, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x11, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerImpactTemplate, ANIM_TARGET, 3, 0x16, 0x3, 0x1, 0x3 - delay 0x1 + delay 1 createsprite gCoreEnforcerBeamTemplate, ANIM_TARGET, 3, 0xf, 0x0, 0x14, 0x6 - delay 0x7 + delay 7 createsprite gCoreEnforcerSnoreTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 30, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 30, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gCoreEnforcerExplosionTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, ANIM_TARGET, 0x1 waitforvisualfinish @@ -11248,7 +11248,7 @@ gBattleAnimMove_TropKick:: createsprite gTropKickGreenFootTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x8, 0x0, 0x0, 0xa, 0x1, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0xA + delay 10 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 @@ -11266,25 +11266,25 @@ gBattleAnimMove_Instruct:: loadspritegfx ANIM_TAG_SPOTLIGHT @spotlight setalpha 12, 8 createsprite gMetronomeFingerSpriteTemplate, ANIM_ATTACKER, 12, 0x0 - delay 0x18 + delay 24 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0x16, 0x3 waitforvisualfinish createvisualtask AnimTask_HardwarePaletteFade, 0x2, 0xf8, 0x3, 0x0, 0xa, 0x0 waitforvisualfinish createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x7DB9 - delay 0x4 + delay 4 monbg ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 41, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1A + delay 26 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1A + delay 26 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET - delay 0x1D + delay 29 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x7DB9 waitforvisualfinish clearmonbg ANIM_TARGET @@ -11294,7 +11294,7 @@ gBattleAnimMove_Instruct:: gBattleAnimGeneral_BeakBlastSetUp:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 waitforvisualfinish @@ -11306,9 +11306,9 @@ gBattleAnimMove_BeakBlast:: createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x2 + delay 2 createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x1 - delay 0x2 + delay 2 loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET 0x4 0x8 createvisualtask AnimTask_DrillPeckHitSplats, 0x5 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 @@ -11334,12 +11334,12 @@ gBattleAnimMove_ClangingScales:: call ClangingScalesMetalSound call ClangingScalesMetalSound call ClangingScalesMetalSound - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - delay 0x0 + delay 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x2002 waitforvisualfinish end @@ -11347,7 +11347,7 @@ ClangingScalesMetalSound: panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gClangingScalesPurpleMetalSoundTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0, ANIM_TARGET createsprite gClangingScalesPurpleMetalSoundTemplate, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x1e, 0x0, ANIM_DEF_PARTNER - delay 0x2 + delay 2 return gBattleAnimMove_DragonHammer:: @@ -11360,12 +11360,12 @@ gBattleAnimMove_DragonHammer:: waitbgfadein setalpha 15, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x2 + delay 2 createvisualtask AnimTask_SquishTarget, 0x2 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0 delay 2 @@ -11399,21 +11399,21 @@ gBattleAnimMove_BrutalSwing:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish - delay 0xb + delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 - delay 0x6 + delay 6 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 3, 21, 1 - delay 0x4 + delay 4 createsprite gBrutalSwingRandomImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBrutalSwingRandomImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitsound @@ -11434,9 +11434,9 @@ gBattleAnimMove_AuroraVeil:: setalpha 8, 8 playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 - delay 0x4 + delay 4 createsprite gAuroraVeilRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER @@ -11454,9 +11454,9 @@ gBattleAnimGeneral_ShellTrapSetUp:: monbg ANIM_TARGET setalpha 12, 8 call FireSpreadEffect - delay 0x4 + delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET - delay 0x15 + delay 21 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 @@ -11474,171 +11474,171 @@ ShellTrapUnleash: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red monbg ANIM_TARGET waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 - delay 0x6 + delay 6 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapYellowImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 createsprite gShellTrapRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - delay 0x5 + delay 5 waitforvisualfinish call ShellTrapFireLaunch1 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 - delay 0x3 + delay 3 call ShellTrapFireLaunch2 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 - delay 0x3 + delay 3 waitforvisualfinish clearmonbg ANIM_TARGET end ShellTrapFireLaunch1: createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x38, 0x4, 0x4, 0x1 - delay 0x3 + delay 3 return ShellTrapFireLaunch2: createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xa, 0x0, 0xa, 0x38, 0xfffc, 0x3, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0xfffc, 0x5, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xf, 0x0, 0xf, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0xffec, 0x0, 0xffec, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 createsprite gShellTrapFireHitsTemplate, ANIM_ATTACKER, 40, 0x0, 0x14, 0x0, 0x14, 0x38, 0x4, 0x4, 0x1 createvisualtaskontargets AnimTask_ShakeMon, 2, 0, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER - delay 0x3 + delay 3 return gBattleAnimMove_FleurCannon:: @@ -11675,11 +11675,11 @@ gBattleAnimMove_FleurCannon:: call FleurCannonBeam call FleurCannonBeam call FleurCannonBeam - delay 0x20 + delay 32 createsprite gFleurCannonDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gFleurCannonDischargeTemplate, ANIM_ATTACKER, 2, 0x1, 0xfff0, 0xfff0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7440 @@ -11690,10 +11690,10 @@ gBattleAnimMove_FleurCannon:: FleurCannonBeam: createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 createsprite gFleurCannonOrbTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_PsychicFangs:: @@ -11709,14 +11709,14 @@ PsychicFangsRegular: playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 - delay 0x10 + delay 16 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 PsychicFangsEnd: @@ -11731,14 +11731,14 @@ PsychicFangsDestroyWall: playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 - delay 0x10 + delay 16 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0xfff8, 0xfff4 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x8, 0xfff4 @@ -11746,7 +11746,7 @@ PsychicFangsDestroyWall: createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3, 0x8, 0xc playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 - delay 0x10 + delay 16 goto PsychicFangsEnd gBattleAnimMove_StompingTantrum:: @@ -11756,7 +11756,7 @@ gBattleAnimMove_StompingTantrum:: loadspritegfx ANIM_TAG_SMALL_EMBER @hit color monbg ANIM_TARGET createvisualtask AnimTask_Splash, 2, ANIM_ATTACKER, 3 - delay 0x5 + delay 5 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x5 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x5 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @@ -11765,14 +11765,14 @@ gBattleAnimMove_StompingTantrum:: createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 call StompingTantrumImpact playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x25 + delay 37 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 call StompingTantrumImpact playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x25 + delay 37 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gStompingTantrumRockTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 @@ -11796,7 +11796,7 @@ gBattleAnimMove_ShadowBone:: setalpha 12, 8 playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, 0xffd6, 0xffe7, 0x0, 0x0, 0xf - delay 0xc + delay 12 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 @@ -11820,7 +11820,7 @@ gBattleAnimMove_Accelerock:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 createvisualtask AnimTask_TraceMonBlended, 0x2, 0x0, 0x4, 0x7, 0x3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - delay 0x4 + delay 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -11843,7 +11843,7 @@ gBattleAnimMove_Liquidation:: monbg ANIM_TARGET setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 - delay 0x6 + delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET @@ -11877,22 +11877,22 @@ gBattleAnimMove_PrismaticLaser:: playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER call PrismaticLaserInwardSpikes playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER - delay 0x1E + delay 30 call PrismaticLaserOutwardSpikes - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes2 - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes2 - delay 0x5 + delay 5 call PrismaticLaserOutwardSpikes waitforvisualfinish unloadspritegfx ANIM_TAG_TEAL_ALERT unloadspritegfx ANIM_TAG_GREEN_SPIKE unloadspritegfx ANIM_TAG_ICE_CHUNK unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - delay 0x1E + delay 30 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x32 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x32 playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER @@ -11931,48 +11931,48 @@ PrismaticLaserOutwardSpikes2: PrismaticLaserInwardSpikes: createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0, 0xFF90, 0x10 @up createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFE0, 0x43, 0x10 @between lower left and down - delay 0x1 + delay 1 createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x5F, 0xFF9D, 0x10 @upper right createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1F, 0x37, 0x10 @between lower right and down createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFDA, 0xFF94, 0x10 @between up and upper left - delay 0x1 + delay 1 createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x73, 0x0, 0x10 @right createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF60, 0x43, 0x10 @between left and lower left - delay 0x1 + delay 1 createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x4F, 0x37, 0x10 @lower right createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF2A, 0xFFAA, 0x10 @between left and upper left - delay 0x1 + delay 1 createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0, 0x53, 0x10 @down createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x2D, 0xFF9D, 0x10 @between up and upper right - delay 0x1 + delay 1 createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFB0, 0x43, 0x10 @lower left createsprite gPrismaticLaserRedInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xDF, 0xFF9D, 0x10 @between right and upper right - delay 0x1 + delay 1 createsprite gPrismaticLaserYellowInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFF60, 0x0, 0x10 @left createsprite gPrismaticLaserGreenInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x9F, 0x37, 0x10 @between right and lower right - delay 0x1 + delay 1 createsprite gPrismaticLaserVioletInwardTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xFFAA, 0xFF94, 0x10 @upper left - delay 0x1 + delay 1 return PrismaticLaserRain: createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 35, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -30, 0x44, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserRedRainTemplate, ANIM_TARGET, 2, 27, 0x37, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserVioletRainTemplate, ANIM_TARGET, 2, -20, 0x32, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 33, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -12, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserRedRainTemplate, ANIM_TARGET, 2, 19, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserVioletRainTemplate, ANIM_TARGET, 2, -38, 0x3a, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserYellowRainTemplate, ANIM_TARGET, 2, 5, 0x3c, 4, ANIM_TARGET - delay 0x2 + delay 2 createsprite gPrismaticLaserGreenRainTemplate, ANIM_TARGET, 2, -23, 0x28, 4, ANIM_TARGET return @@ -11987,77 +11987,77 @@ SpectralThiefUnleash: loadspritegfx ANIM_TAG_POISON_BUBBLE fadetobg BG_GHOST waitbgfadein - delay 0x5 + delay 5 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x0, 0x0 invisible ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0x8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0x8, 0xfff8, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSpectralThiefBlackSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x0, 0x0 waitforvisualfinish playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x30 + delay 48 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1 createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0x0, 0xc, 0x77bd - delay 0x18 + delay 24 createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0xc, 0x0, 0x77bd waitforvisualfinish setalpha 0, 16 - delay 0x1 + delay 1 monbg_static ANIM_TARGET createvisualtask AnimTask_MoveTargetMementoShadow, 0x5 playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET waitforvisualfinish clearmonbg_static ANIM_TARGET - delay 0x1 + delay 1 blendoff - delay 0x1 + delay 1 setalpha 12, 8 monbg ANIM_TARGET - delay 0x1 + delay 1 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x4 + delay 4 createsprite gSpectralThiefThiefImpactTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish visible ANIM_ATTACKER - delay 0x2 + delay 2 restorebg waitbgfadein clearmonbg ANIM_TARGET @@ -12070,30 +12070,30 @@ SpectralThiefSteal: setalpha 11, 5 splitbgprio_all panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 - delay 0xf + delay 15 createsprite gSpectralThiefBlackOrbsTemplate, ANIM_TARGET, 2, 0xfff4, 0x18 - delay 0xB + delay 11 setarg 0x7 0xffff waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SpectralThiefBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SpectralThiefBuffUp - delay 0x8 + delay 8 call SpectralThiefBuffUp waitforvisualfinish blendoff end SpectralThiefBuffUp: createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gSpectralThiefBlackBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -12107,7 +12107,7 @@ gBattleAnimMove_SunsteelStrike:: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 - delay 0x18 + delay 24 createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @The rock particles mess up the fly animation createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 @@ -12135,7 +12135,7 @@ gBattleAnimMove_SunsteelStrike:: stopsound playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 0x14 - delay 0x14 + delay 20 createsprite gSunsteelStrikeRedImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 waitforvisualfinish @@ -12145,7 +12145,7 @@ gBattleAnimMove_SunsteelStrike:: unloadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect call FireSpreadEffect - delay 0x4 + delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish visible ANIM_ATTACKER @@ -12156,9 +12156,9 @@ gBattleAnimMove_SunsteelStrike:: end SunsteelStrikeBeam: createsprite gSunsteelStrikeYellowBeamTemplate, ANIM_TARGET, 2, 0x14 - delay 0x1 + delay 1 createsprite gSunsteelStrikeRedBeamTemplate, ANIM_TARGET, 2, 0x14 - delay 0x1 + delay 1 return gBattleAnimMove_MoongeistBeam:: @@ -12182,7 +12182,7 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamCharge createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @;Charge circle call MoongeistBeamCharge - delay 0x20 + delay 32 createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xCC, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 @@ -12223,7 +12223,7 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamOrbs call MoongeistBeamOrbs createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0xb, 0x0, 0x6739 - delay 0x1A + delay 26 stopsound createvisualtask AnimTask_MoonlightEndFade, 0x2 end @@ -12234,12 +12234,12 @@ MoongeistBeamCharge: createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, 25, -40, 0, 0, 30, 20 @From top right createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, 25, 20, 0, 0, 30, 20 @From bottom right createsprite gMoongeistBeamChargeTemplate, ANIM_ATTACKER, 0, -25, 40, 0, 0, 30, -20 @From bottom left - delay 0x5 + delay 5 return MoongeistBeamOrbs: createsprite gMoongeistBeamBlueOrbsTemplate, ANIM_TARGET, 2 createsprite gMoongeistBeamPurpleOrbsTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return gBattleAnimMove_TearfulLook:: @@ -12250,14 +12250,14 @@ gBattleAnimMove_TearfulLook:: waitforvisualfinish playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 - delay 0x35 + delay 53 loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0xC, 0x2 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2 @@ -12277,24 +12277,24 @@ gBattleAnimMove_ZingZap:: monbg ANIM_TARGET call ZingZapSparks1 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks1 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 call ZingZapSparks2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 4, 0, 6, 1 - delay 0xA + delay 10 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 - delay 0x4 + delay 4 call ZingZapSparks1 invisible ANIM_ATTACKER createsprite gZingZapYellowBallTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xF - delay 0xA + delay 10 call ZingZapSparks2 - delay 0x5 + delay 5 stopsound playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER waitforvisualfinish @@ -12308,7 +12308,7 @@ gBattleAnimMove_ZingZap:: ZingZapSparks1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -12316,7 +12316,7 @@ ZingZapSparks2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return @@ -12328,47 +12328,47 @@ gBattleAnimMove_NaturesMadness:: loadspritegfx ANIM_TAG_ICE_CHUNK @blue green CrystalsTemplate monbg ANIM_ATTACKER setalpha 14, 8 - delay 0x1 + delay 1 loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x14, 0xa, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xf, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0x19, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x0 - delay 0x4 + delay 4 createsprite gNaturesMadnessPinkRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 createsprite gNaturesMadnessPinkStarsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x0 clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 monbg ANIM_TARGET waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green grayRing createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER - delay 0xe + delay 14 createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER - delay 0xe + delay 14 createsprite gNaturesMadnessGrayRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER waitforvisualfinish @@ -12393,9 +12393,9 @@ gBattleAnimMove_NaturesMadness:: createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gNaturesMadnessCrystalsTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -12410,14 +12410,14 @@ gBattleAnimMove_MultiAttack:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MultiAttackBuff - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MultiAttackBuff - delay 0x8 + delay 8 call MultiAttackBuff waitforvisualfinish - delay 0xF + delay 15 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffe0, 0x0 createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffd0, 0x0 @@ -12429,13 +12429,13 @@ gBattleAnimMove_MultiAttack:: end MultiAttackBuff: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -12455,20 +12455,20 @@ gBattleAnimMove_MindBlown:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 2, 0, 15, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 2, 0, 15, 1 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMindBlownBlueImpactTemplate, ANIM_TARGET, 3, 0x1, 0x0 createsprite gMindBlownPinkImpactTemplate, ANIM_TARGET, 3, 0x1, 0x0 call MindBlownBlueOrbs - delay 0x1 + delay 1 call MindBlownPinkOrbs - delay 0x1 + delay 1 call MindBlownBlueOrbs - delay 0x1 + delay 1 call MindBlownPinkOrbs - delay 0x1 + delay 1 call MindBlownBlueOrbs - delay 0x1 + delay 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish @@ -12510,27 +12510,27 @@ gBattleAnimMove_PlasmaFists:: createsprite gPlasmaFistsChargeTemplate, ANIM_ATTACKER, 2, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 3, 92, 1 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 - delay 0xA + delay 10 call PlasmaFistSpark1 - delay 0xA + delay 10 call PlasmaFistSpark2 waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -12550,7 +12550,7 @@ PlasmaFistSpark1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB(31, 31, 22) createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return @@ -12558,25 +12558,25 @@ PlasmaFistSpark2: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return PlasmaFistsImpact: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 - delay 0x1 + delay 1 createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffd0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10 - delay 0x1 + delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 return @@ -12594,31 +12594,31 @@ gBattleAnimMove_PhotonGeyser:: call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x28, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd8, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0x14, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0x0, 0x10 createsprite gPowerAbsorptionOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0x0, 0x10 - delay 0xA + delay 10 call PhotonGeyserSparks2 - delay 0xA + delay 10 call PhotonGeyserSparks1 - delay 0xA + delay 10 call PhotonGeyserSparks2 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 @@ -12664,7 +12664,7 @@ PhotonGeyserSparks1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - delay 0x0 + delay 0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 return @@ -12672,22 +12672,22 @@ PhotonGeyserSparks2: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createsprite gPhotonGeyserSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 return PhotonGeyserBeam: createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, 19, ANIM_TARGET, 180, 2, 6 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, 3, ANIM_TARGET, 180, 2, 5 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -13, ANIM_TARGET, 180, 2, 4 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -29, ANIM_TARGET, 180, 2, 3 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -45, ANIM_TARGET, 180, 2, 2 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -61, ANIM_TARGET, 180, 2, 1 - delay 0x1 + delay 1 createsprite gPhotonGeyserBeam, ANIM_TARGET, 3, 0, -77, ANIM_TARGET, 180, 2, 0 return @@ -13086,9 +13086,9 @@ gBattleAnimMove_DoubleIronBash:: createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0xffe7, 0x0, 0x0, 0x0, 0x0 @wing attack createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0x19, 0x0, 0x0, 0x0, 0x0 @wing attack - delay 0x18 + delay 24 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 9 - delay 0x11 + delay 17 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish @@ -13096,7 +13096,7 @@ gBattleAnimMove_DoubleIronBash:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xb waitforvisualfinish - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 clearmonbg ANIM_DEF_PARTNER blendoff @@ -13176,7 +13176,7 @@ gBattleAnimMove_SnipeShot:: createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 0x18, -12 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x20 + delay 32 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 16 waitforvisualfinish @@ -13196,14 +13196,14 @@ gBattleAnimMove_JawLock:: playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa, 15 createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa, 15 - delay 0xa + delay 10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 10, 2 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0 @;Black waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x1 + delay 1 end gBattleAnimMove_StuffCheeks:: @@ -13212,20 +13212,20 @@ gBattleAnimMove_StuffCheeks:: loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_METRONOME, 0xc0 createsprite gFloatingBerryTemplate, ANIM_ATTACKER, 1, 0x0 - delay 0x45 + delay 69 createvisualtask AnimTask_IsTargetPlayerSide, 0x2 jumpargeq 0x7 0x1 BERRYEAT_ON_PLAYER BerryEatingOpponent: call BiteOpponent - delay 0x10 + delay 16 call BiteOpponent - delay 0xA + delay 10 goto POST_BERRY_EAT BERRYEAT_ON_PLAYER: call BitePlayer - delay 0x10 + delay 16 call BitePlayer - delay 0xA + delay 10 POST_BERRY_EAT: playsewithpan SE_SHINY, 0xc0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x2, 0x3, 0x7, 0x0, 0x67f1 @@ -13258,18 +13258,18 @@ gBattleAnimMove_TarShot:: monbg ANIM_TARGET createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x0, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 16, RGB_BLACK @;Black createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xf, 0xffe5, 0x0, 0xC, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xfff1, 0xffef, 0x0, 0xa, 0x2d playsewithpan SE_M_BUBBLE SOUND_PAN_TARGET waitforvisualfinish @@ -13283,17 +13283,17 @@ gBattleAnimMove_MagicPowder:: createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xffea, 0x75, 0x50, 0x5, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xa, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xffe7, 0xffea, 0x75, 0x70, 0x5, 0x3 - delay 0xf + delay 15 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfffb, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xffea, 0x75, 0x60, 0x5, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x75, 0x45, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xffea, 0x75, 0x70, 0x5, 0x2 - delay 0x1e + delay 30 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff1, 0xffea, 0x75, 0x70, 0x5, 0x2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xf, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff6, 0xffea, 0x75, 0x60, 0x7, 0x2 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xffea, 0x75, 0x5a, 0xfff8, 0x0 - delay 0x14 + delay 20 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0xfff6, 0xffea, 0x75, 0x50, 0xfffb, 0x1 createsprite gPoisonPowderParticleSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x75, 0x59, 0x5, 0x2 createsprite gMagicPowderBluePowderTemplate, ANIM_TARGET, 2, 0x14, 0xffea, 0x75, 0x70, 0xfff8, 0x2 @@ -13311,7 +13311,7 @@ gBattleAnimMove_DragonDarts:: loadspritegfx ANIM_TAG_EXPLOSION playsewithpan SE_FALL, SOUND_PAN_ATTACKER createdragondartsprite ANIM_TARGET, 2, 0x0, 0x0, 0x19 - delay 0x19 + delay 25 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 16, 1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 @@ -13337,14 +13337,14 @@ gBattleAnimMove_Octolock:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, 0x3D98 @Pinkish Red loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET 0x6 0x4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x0, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x0, 0x2 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x8, 0x1, 0x2 - delay 0x7 + delay 7 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x2 - delay 0x8 + delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 6, 1 - delay 0x14 + delay 20 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 8, RGB_RED playsewithpan SE_M_BIND, SOUND_PAN_TARGET setarg 0x7 0xffff @@ -13362,7 +13362,7 @@ gBattleAnimMove_BoltBeak:: waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) createsprite gHorizontalLungeSpriteTemplate, 0x2, 0x2, 0x4, 0x4 - delay 0x4 + delay 4 createsprite gHornHitSpriteTemplate, 0x84, 0x3, 0x8, 0x8, 0xa waitforvisualfinish createsprite gFlashingHitSplatSpriteTemplate, 0x83, 0x4, 0x0, 0x0, 0x1, 0x1 @@ -13376,21 +13376,21 @@ gBattleAnimMove_BoltBeak:: BoltBeakSparks: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 - delay 0x0 + delay 0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) - delay 0xa + delay 10 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 22) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(1, 23, 29) - delay 0x14 + delay 20 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 4, 4, RGB(1, 23, 29) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, 0x4, 0x8, 0x0, 0x0, 0x20, 0xc, 0x0, 0x14, 0x0, 0x0 @@ -13401,7 +13401,7 @@ BoltBeakSparks: createsprite gBoltBeakBlueFlashingSparkTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0x60, 0x14, 0x1, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0xa0, 0x14, 0x0, 0x0 createsprite gBoltBeakBlueFlashingSparkTemplate, 0x4, 0x8, 0x0, 0x0, 0x10, 0xc, 0xe0, 0x14, 0x2, 0x0 - delay 0x4 + delay 4 return gBattleAnimMove_FishiousRend:: @@ -13417,43 +13417,43 @@ gBattleAnimMove_FishiousRend:: FishousRendBubbles: createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xF, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xF, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xffec, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xffec, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff1, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xfffb, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0xA, 0x0 return @@ -13489,14 +13489,14 @@ gBattleAnimMove_ClangorousSoul:: ClangorousSoulStarBuffEffect: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createsprite gClangorousSoulBlueBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gClangorousSoulPurpleBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c - delay 0x4 + delay 4 createsprite gClangorousSoulWhiteBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c return @@ -13506,12 +13506,12 @@ gBattleAnimMove_BodyPress:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 0xD, 0xD, 0x1E5D @Orange playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 @Fly up waitforvisualfinish - delay 0x2F + delay 47 createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 @Bounce down - delay 0x2 + delay 2 playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER createvisualtask AnimTask_SquishTarget, 0x2 waitforvisualfinish @@ -13532,48 +13532,48 @@ gBattleAnimMove_DrumBeating:: call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x1, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0xf + delay 15 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x3, 0x3, 0x80 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0x0, 0x80 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumRight createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0x1, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 call BellyDrumLeft createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x3, 0x0 playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x10, 0x6, 0x0, 0x3, 0x50 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0xfff0, 0xfffa, 0x0, 0x2, 0x4b playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - delay 0x5 + delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 8, 0, 20, 1 - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish @@ -13612,25 +13612,25 @@ gBattleAnimMove_PyroBall:: loadspritegfx ANIM_TAG_SMALL_EMBER playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop createsprite gPyroBallRockTemplate, ANIM_ATTACKER, 2, 0, 0, 0 - delay 0x19 + delay 25 playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x3, 0x0, 0x7, 0x043D createsprite gPyroBallBurningRockTemplate, ANIM_ATTACKER, 2, 0, 0, 0 - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET createsprite gPyroBallFlamesUpTemplate, ANIM_ATTACKER, 2, 0, 0, 1 - delay 0x19 + delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gPyroBallEmberBallTemplate, ANIM_ATTACKER, 2, 0, 10, 0, 5, 20, -20 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB_RED createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect - delay 0x20 + delay 32 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D waitforvisualfinish end @@ -13845,27 +13845,27 @@ gBattleAnimMove_AuraWheel:: splitbgprio_foes ANIM_TARGET createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelRedElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 - delay 0x4 + delay 4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 @@ -13874,7 +13874,7 @@ gBattleAnimMove_AuraWheel:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0xc0, 0x28, 0x2, 0x8003 - delay 0x7 + delay 7 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x9 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -13893,15 +13893,15 @@ gBattleAnimMove_BreakingSwipe:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -13932,9 +13932,9 @@ gBattleAnimMove_Overdrive:: waitforvisualfinish createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, 0x17BF @Yellow Electricity call OverdriveRings - delay 0x8 + delay 8 call OverdriveRings - delay 0x10 + delay 16 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, 0x76E1 @Blue Electricity waitforvisualfinish end @@ -13955,30 +13955,30 @@ gBattleAnimMove_AppleAcid:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER createsprite gAppleAcidFloatingAppleTemplate, ANIM_ATTACKER, 12, 0x0 - delay 0x30 + delay 48 monbg ANIM_TARGET createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x0, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x18, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0xffe8, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xf + delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0x0, 0xffea, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xffe6, 0xffe8, 0x0, 0xf, 0x37 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xf, 0xffe5, 0x0, 0xf, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0xfff1, 0xffef, 0x0, 0xa, 0x2d playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - delay 0xa + delay 10 createsprite gAppleAcidDripTemplate, ANIM_TARGET, 2, 0x1b, 0xffea, 0x0, 0xf, 0x32 playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET waitforvisualfinish @@ -13994,10 +13994,10 @@ gBattleAnimMove_GravApple:: call SmallAppleShower call SmallAppleShower createsprite gGravAppleLargeApple, ANIM_TARGET, 2, 0x0, 0x3c, 4, ANIM_TARGET - delay 0x7 + delay 7 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 21, 0, 4 - delay 0x30 + delay 48 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish call UnsetPsychicBg @@ -14005,34 +14005,34 @@ gBattleAnimMove_GravApple:: SmallAppleShower: createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 35, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -30, 0x44, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 27, 0x37, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -20, 0x32, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 33, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -12, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 19, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -38, 0x3a, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, 5, 0x3c, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 createsprite gGravAppleSmallApple, ANIM_TARGET, 2, -23, 0x28, 4, ANIM_TARGET playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x2 + delay 2 return @ credits to Skeli @@ -14056,7 +14056,7 @@ gBattleAnimMove_SpiritBreak:: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gSpriteTemplate_SpiritBreakExplode, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 clearmonbg ANIM_DEF_PARTNER waitforvisualfinish @@ -14089,10 +14089,10 @@ StrangeSteamCloud: createsprite gStrangeSteamPinkCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0, 0 createsprite gStrangeSteamGreenCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xa, 0x5 createsprite gStrangeSteamPinkCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xfff6, 0xfffb - delay 0x1 + delay 1 createsprite gStrangeSteamGreenCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0x14, 0xa createsprite gStrangeSteamBlueCloudTemplate, ANIM_TARGET, 2, 0xf, 0xf, 0x14, 0xffec, 0xfff6 - delay 0x2 + delay 2 return gBattleAnimMove_LifeDew:: @@ -14101,22 +14101,22 @@ gBattleAnimMove_LifeDew:: monbg ANIM_ATK_PARTNER createsprite gLifeDewDropletTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATTACKER createsprite gLifeDewDropletTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATK_PARTNER - delay 0x15 + delay 21 playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 0, -5, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 0, -5, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, 10, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, 10, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, -15, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, -15, -15, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 10, -5, ANIM_ATTACKER, FALSE createsprite gLifeDewSpecialOrbsTemplate, ANIM_ATTACKER, 2, 10, -5, ANIM_ATK_PARTNER, FALSE - delay 0x7 + delay 7 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER end @@ -14130,7 +14130,7 @@ gBattleAnimMove_Obstruct:: createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect waitforvisualfinish - delay 0x10 + delay 16 monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 @@ -14149,18 +14149,18 @@ gBattleAnimMove_FalseSurrender:: monbg ANIM_ATTACKER fadetobg BG_DARK waitbgfadein - delay 0x0 + delay 0 playsewithpan SE_M_FAINT_ATTACK, 0xc0 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 0x2, monbg ANIM_TARGET setalpha 12, 8 - delay 0x1 + delay 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x7fff, 0xa, 0x0, 0xa createsprite gSpriteTemplate_LargeCrossImpact, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x14 @@ -14168,15 +14168,15 @@ gBattleAnimMove_FalseSurrender:: waitforvisualfinish clearmonbg ANIM_TARGET blendoff - delay 0x1 + delay 1 setarg 0x7, 0x1000 - delay 0x1 + delay 1 createvisualtask AnimTask_InitAttackerFadeFromInvisible, 0x2, monbg ANIM_ATTACKER createvisualtask AnimTask_AttackerFadeFromInvisible, 0x2, 0x1 waitforvisualfinish clearmonbg ANIM_ATTACKER - delay 0x1 + delay 1 restorebg waitbgfadein end @@ -14193,7 +14193,7 @@ gBattleAnimMove_MeteorAssault:: invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0xF + delay 15 createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0x10, 0x7FFF @Screen flash white createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 32, 1 call BasicExplosion @@ -14206,16 +14206,16 @@ gBattleAnimMove_MeteorAssault:: BasicExplosion: playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, 0x1, 0x1 - delay 0x3 + delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, 0x1, 0x1 return @@ -14403,74 +14403,74 @@ ExpandingForceBothTargets: ExpandingForceExplosionGeyser: createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET - delay 0x0 + delay 0 createsprite gSpriteTemplate_ExpandingForceExplode, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET return MaxKnuckleExplosionGeyser: createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 return @@ -14503,14 +14503,14 @@ gBattleAnimMove_ScaleShot:: loadspritegfx ANIM_TAG_SHELL_RIGHT loadspritegfx ANIM_TAG_IMPACT createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x6 - delay 0x3 + delay 3 playsewithpan SE_M_BONEMERANG, SOUND_PAN_ATTACKER createsprite gSpriteTemplate_ScaleShotScale, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x14, 0x101 waitforvisualfinish playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 - delay 0x10 + delay 16 stopsound waitforvisualfinish end @@ -14570,9 +14570,9 @@ MeteorBeamBlast: MeteorBeamRockLaunch: createsprite gSpriteTemplate_MeteorBeamRock, ANIM_TARGET, 2, 0, 0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_MeteorBeamRock, ANIM_TARGET, 2, 0, 0, 0x10 - delay 0x2 + delay 2 return gBattleAnimMove_ShellSideArm:: @@ -14613,7 +14613,7 @@ gBattleAnimMove_ShellSideArmSpecial:: @ Modified Snipe Shot, placeholder playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_TARGET, 2, 0x18, -12 waitforvisualfinish - delay 0x20 + delay 32 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET createsprite gSnipeShotBallTemplate, ANIM_TARGET, 2, 0, 0, 24 waitforvisualfinish @@ -14634,7 +14634,7 @@ gBattleAnimMove_MistyExplosion:: call Explosion1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x1, 0x10, 0x10, 0x7F7F @;White Pink - delay 0x32 + delay 50 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x3, 0x10, 0x0, 0x7F7F @;White Pink end @@ -14645,7 +14645,7 @@ gBattleAnimMove_GrassyGlide:: loadspritegfx ANIM_TAG_WHIP_HIT createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_IMPACT, 0x0, 0xD, 0xD, 0x0266 @;Leaf Green createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(12, 29, 0) - delay 0x2 + delay 2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 10 @;Slide off off, screen waitforvisualfinish @@ -14669,16 +14669,16 @@ ANIM_RISING_VOLTAGE_NORMAL: waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 30, 0, 3 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 0, 0x0 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x34, 0x1, 0x0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 call StokedSparksurferSparkGeyser call StokedSparksurferSparkGeyser @@ -14693,30 +14693,30 @@ ANIM_RISING_VOLTAGE_STRONGER: waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 55, 0, 0 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2, waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x54, 0x1, 0x0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x079D playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0x10 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xfff0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xffe0 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0x10 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xfff0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xffe0 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 call StokedSparksurferSparkGeyser waitforvisualfinish @@ -14829,10 +14829,10 @@ gBattleAnimMove_SkitterSmack:: invisible ANIM_ATTACKER waitsound createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 - delay 0x17 + delay 23 createvisualtask AnimTask_IsTargetSameSide, 0x2, createvisualtask AnimTask_SnatchOpposingMonMove, 0x2, - delay 0x19 + delay 25 visible ANIM_ATTACKER invisible ANIM_ATTACKER delay 5 @@ -14865,19 +14865,19 @@ gBattleAnimMove_BurningJealousy:: createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 42, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB_RED call BurningJealousyFireBuffEffect - delay 0x8 + delay 8 call BurningJealousyFireBuffEffect createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 8, RGB_RED - delay 0x4 + delay 4 call BurningJealousyFireBuffEffect waitforvisualfinish monbg ANIM_TARGET playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER call BurningJealousyFlames - delay 0x8 + delay 8 call BurningJealousyFlames - delay 0x8 + delay 8 call BurningJealousyFlames playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 @@ -14891,13 +14891,13 @@ gBattleAnimMove_BurningJealousy:: BurningJealousyFireBuffEffect: createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xffe8, 0x1a, 0x2, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xe, 0x1c, 0x1, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfffb, 0xa, 0x2, 0x18 - delay 0x3 + delay 3 createsprite gSpriteTemplate_BurningJealousyFireBuff, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1c, 0x1a, 0x3, 0x18 - delay 0x3 + delay 3 return BurningJealousyFlames: @@ -14921,31 +14921,31 @@ gBattleAnimMove_LashOut:: monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call PowerTripBuffUp - delay 0x8 + delay 8 call PowerTripBuffUp waitforvisualfinish fadetobg BG_DARK waitbgfadein playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gSpriteTemplate_LashOutStrike, ANIM_TARGET, 2, 0xfff0, 0xfff0, FALSE - delay 0x8 + delay 8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, 10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 - delay 0x8 + delay 8 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gSpriteTemplate_LashOutStrike, ANIM_TARGET, 2, 0xfff0, 0xfff0, TRUE - delay 0x8 + delay 8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, -10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 12, 10, 0, 3 - delay 0x8 + delay 8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 restorebg @@ -14969,9 +14969,9 @@ gBattleAnimMove_Poltergeist:: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x24 - delay 0x30 + delay 48 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_PoltergeistItem, 2 waitforvisualfinish @@ -14997,18 +14997,18 @@ gBattleAnimMove_CorrosiveGas:: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PINK_CLOUD, 0x0, 0xE, 0xE, 0x19EF @;Garbage green monbg ANIM_ATTACKER loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER, 0x8, 0x3 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 1, 2, 0, 15, RGB(15, 15, 6) @;Garbage green createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7a, 0x3, 0xfff2, 0x12, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x79, 0x3, 0xe, 0xfff2, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x78, 0x3, 0xfff4, 0xfff6, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x77, 0x3, 0xe, 0xe, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x76, 0x3, 0x0, 0x0, 0x2e - delay 0x0 + delay 0 createsprite gSpriteTemplate_CorrosiveGasSmoke, ANIM_ATTACKER, 0x7b, 0x3, 0x4, 0x4, 0x1e waitforvisualfinish playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET @@ -15188,28 +15188,28 @@ gBattleAnimMove_JungleHealing:: waitbgfadeout createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x1a, 0xffff, 0x2, 0x96 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x14, 0x1, 0x1, 0x8c playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x16, 0x1, 0x0, 0x82 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0xa + delay 10 createsprite gIngrainRootSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x19, 0xffff, 0x3, 0x78 playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - delay 0x28 + delay 40 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0x1a, 0xffff, 0x3, 0x1e - delay 0x5 + delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0xffd0, 0x14, 0x1, 0x2, 0x1e playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createsprite gIngrainOrbSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0x1a, 0xfffe, 0x3, 0x12 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER - delay 0xa + delay 10 playsewithpan SE_M_STAT_INCREASE, 0xc0 createvisualtask AnimTask_StatusClearedEffect, 0x2, 0x1 waitforvisualfinish @@ -15261,18 +15261,18 @@ gBattleAnimMove_WickedBlow:: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FOCUS_ENERGY, 0x0, 0x8, 0x8, 0x1F playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call WickedBlowBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call WickedBlowBuffEffect - delay 0x8 + delay 8 call WickedBlowBuffEffect waitforvisualfinish fadetobg BG_DARK waitbgfadeout playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 28, 0, 0, 5 - delay 0x5 + delay 5 createsprite gSpriteTemplate_WickedBlowFist, ANIM_TARGET, 4, ANIM_TARGET, 0, 0, 16, 32 delay 6 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 0x4, 0x6 @@ -15301,13 +15301,13 @@ gBattleAnimMove_WickedBlow:: WickedBlowBuffEffect: createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gPowerTripFocusEnergyTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -15379,7 +15379,7 @@ gBattleAnimMove_ThunderCage:: createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 16 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 call ThunderCageBolts - delay 0x4 + delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, -16 delay 4 createsprite gThunderWaveSpriteTemplate, ANIM_TARGET, 2, -16, 0 @@ -15391,11 +15391,11 @@ gBattleAnimMove_ThunderCage:: end ThunderCageBolts: createvisualtask AnimTask_ElectricBolt, 2, 25, -40, 1 - delay 0x9 + delay 9 createvisualtask AnimTask_ElectricBolt, 2, -25, -40, 1 - delay 0x9 + delay 9 createvisualtask AnimTask_ElectricBolt, 2, 0, -40, 1 - delay 0x9 + delay 9 return @@ -15452,9 +15452,9 @@ gBattleAnimMove_DragonEnergy:: DragonEnergyShot: createsprite gSpriteTemplate_DragonEnergyShot, ANIM_TARGET, 2, 0x19 - delay 0x1 + delay 1 createsprite gSpriteTemplate_DragonEnergyShot, ANIM_TARGET, 2, 0x19 - delay 0x1 + delay 1 return @@ -15508,52 +15508,52 @@ gBattleAnimMove_FieryWrath:: FieryWrathGeyser: createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 createsprite gSpriteTemplate_FieryWrathGeyser, ANIM_TARGET, 4, ANIM_DEF_PARTNER, 0xfff0, 0x10 - delay 0x0 + delay 0 return @@ -15572,15 +15572,15 @@ gBattleAnimMove_ThunderousKick:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x7fff createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 22, 1 call ZingZapSparks1 - delay 0xA + delay 10 call ZingZapSparks2 - delay 0xA + delay 10 call ZingZapSparks1 - delay 0xA + delay 10 call ZingZapSparks2 - delay 0x3 + delay 3 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 48, 3, 0, 4 - delay 0x7 + delay 7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 @@ -15681,25 +15681,25 @@ gBattleAnimMove_EerieSpell:: EerieSpellConvergingFlames: createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gSpriteTemplate_EerieSpellFlame, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 return @@ -15713,11 +15713,11 @@ gBattleAnimMove_DireClaw:: delay 6 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 36, 1 - delay 0x2 + delay 2 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0 call PoisonBubblesEffect @@ -15735,18 +15735,18 @@ gBattleAnimMove_PsyshieldBash:: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xB, 0x7FAF @;Light blue createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 56, 10 - delay 0x23 + delay 35 createsprite gSpriteTemplate_PsyshieldBashHit, ANIM_ATTACKER, 4, -10, 0x0, 0x1, 0x0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0x2 + delay 2 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x7FAF @;Light blue createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x5 - delay 0x3 + delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x7 waitforvisualfinish call UnsetPsychicBg @@ -15778,11 +15778,11 @@ gBattleAnimMove_StoneAxe:: splitbgprio ANIM_TARGET playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSpriteTemplate_StoneAxeSlash, ANIM_TARGET, 2, 50, -10, 100, 8, 1 @;Move left - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 16, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET call StoneAxeRockFragments - delay 0x8 + delay 8 call StoneAxeRockFragments waitforvisualfinish clearmonbg ANIM_TARGET @@ -15826,15 +15826,15 @@ gBattleAnimMove_SpringtideStorm:: SpringtideStormHeartSwirl: createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -15849,11 +15849,11 @@ gBattleAnimMove_MysticalPower:: monbg ANIM_TARGET splitbgprio ANIM_TARGET call PsystrikeInwardRing - delay 0xA + delay 10 call PsystrikeInwardRing - delay 0xA + delay 10 call PsystrikeInwardRing - delay 0xA + delay 10 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0xB, 0x7FAF @;Light blue createvisualtask AnimTask_ExtrasensoryDistortion, 0x5, 0x0 @@ -15924,7 +15924,7 @@ gBattleAnimMove_WaveCrash:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 5, 1 call RisingWaterHitEffect waitforvisualfinish - delay 0x5 + delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x726A clearmonbg ANIM_DEF_PARTNER @@ -15943,16 +15943,16 @@ gBattleAnimMove_Chloroblast:: createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x10, 0x0 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 - delay 0xe + delay 14 createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 - delay 0xe + delay 14 createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 waitforvisualfinish createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA, fadetobg BG_CHLOROBLAST waitbgfadeout createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x10, 0x0, 0x0 - delay 0x10 + delay 16 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 74, 1 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xFF00 | SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x17, 0x0, 0x5 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 1, 67 @@ -15976,7 +15976,7 @@ gBattleAnimMove_Chloroblast:: call ChloroblastShot call ChloroblastShot waitforvisualfinish - delay 0x5 + delay 5 createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x0, 0x0 @;From Black createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x03AC restorebg @@ -15988,9 +15988,9 @@ gBattleAnimMove_Chloroblast:: end ChloroblastShot: createsprite gSpriteTemplate_ChloroblastShot, ANIM_TARGET, 2, 0, 0, 0x19 - delay 0x2 + delay 2 createsprite gSpriteTemplate_ChloroblastShot, ANIM_TARGET, 2, 0, 0, 0x19 - delay 0x2 + delay 2 return @Credits to Skeli @@ -15999,21 +15999,21 @@ gBattleAnimMove_MountainGale:: loadspritegfx ANIM_TAG_DRAGON_ASCENT_FOE @White Rock Colour monbg ANIM_TARGET call MountainGaleIceRock - delay 0x6 + delay 6 call MountainGaleIceRock - delay 0x6 + delay 6 call MountainGaleIceRock createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 24, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 call MountainGaleIceRock playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 call MountainGaleIceRock playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - delay 0x6 + delay 6 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -16031,7 +16031,7 @@ gBattleAnimMove_VictoryDance:: loadspritegfx ANIM_TAG_HOLLOW_ORB createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 40, 6, 3, 3 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x0B1D, 0xe, 0x0, 0x3 @;Light orange createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x2b @@ -16039,9 +16039,9 @@ gBattleAnimMove_VictoryDance:: createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0x1e + delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER - delay 0x1e + delay 30 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitforvisualfinish end @@ -16069,7 +16069,7 @@ gBattleAnimMove_HeadlongRush:: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 42, 0, 0, 5 createsprite gSpriteTemplate_HeadlongRushImpact, ANIM_TARGET, 4, 0xfff6, 0x0, 0x1, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 44, 1 call MaxQuake_DirtGeyser call MaxQuake_DirtGeyser @@ -16083,52 +16083,52 @@ MaxQuake_DirtGeyser: createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0x0005, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff1, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xfffb, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0x0012, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0x0005, 0x1, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gSpriteTemplate_MaxQuakeDirtGeyser, ANIM_TARGET, 4, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gSpriteTemplate_MaxQuakeRockGeyser, ANIM_TARGET, 4, ANIM_TARGET, 0xfff0, 0x10 return @@ -16142,25 +16142,25 @@ gBattleAnimMove_BarbBarrage:: call BarbBarrageSpikeShoot loopsewithpan SE_M_DIG, SOUND_PAN_ATTACKER, 0x7, 0x3 createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER - delay 0x14 + delay 20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 32, 1 call PoisonBubblesEffect clearmonbg ANIM_TARGET end BarbBarrageSpikeShoot: - delay 0x3 + delay 3 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0x0, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0, 0x0500, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0, 0xfb00, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0500, 0x0300, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0x0300, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0x0500, 0xfd00, 0x3 - delay 0x0 + delay 0 createsprite gSpriteTemplate_BarbBarrage, ANIM_TARGET, 2, 0x0, 0x0, 0x1e, 0xfb00, 0xfd00, 0x3 return @@ -16216,7 +16216,7 @@ gBattleAnimMove_BitterMalice:: call BitterMaliceSwirl call BitterMaliceSwirl call BitterMaliceSwirl - delay 0x4 @;Wait until the blends are reset after the scary face fades out + delay 4 @;Wait until the blends are reset after the scary face fades out call IceCrystalEffectShort waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xF, 0x0, 0x3006 @;Dark Purple @@ -16224,17 +16224,17 @@ gBattleAnimMove_BitterMalice:: BitterMaliceSwirl: createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, 0x1 - delay 0x2 + delay 2 createsprite gSpriteTemplate_BitterMaliceRing, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, 0x1 - delay 0x2 + delay 2 return @ credits to Skeli @@ -16264,20 +16264,20 @@ gBattleAnimMove_TripleArrows:: waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 6, 1 - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, -40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME - delay 0x3 + delay 3 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 40, 0, 0, 0, TRIPLE_ARROW_FLY_TIME - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER createvisualtask AnimTask_IsAttackerPlayerSide, 0x2, jumpargeq 0x7, FALSE, TripleArrowsOnOpponent createsprite gSpiritShackleArrowTemplate, ANIM_TARGET, 2, 0, -60, 0, 0, TRIPLE_ARROW_FLY_TIME TripleArrowsEnd: - delay 0x3 + delay 3 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -16297,11 +16297,11 @@ gBattleAnimMove_InfernalParade:: playsewithpan SE_M_PSYBEAM, 0xc0 waitbgfadein createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right - delay 0x3 + delay 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 call InfernalFlames call InfernalFlames @@ -16315,20 +16315,20 @@ gBattleAnimMove_InfernalParade:: createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0xa8 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0xd2 waitforvisualfinish - delay 0xC + delay 12 restorebg waitbgfadein clearmonbg ANIM_TARGET end InfernalFlames: createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right - delay 0x3 + delay 3 createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right - delay 0x3 + delay 3 return @@ -16342,13 +16342,13 @@ gBattleAnimMove_CeaselessEdge:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x10, 0x1F @;Fully to to, Red createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_TARGET), 0x0, 0x10, 0x10, 0x0 @;Fully to to, Black createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xa, - delay 0x10 + delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 48, 1 call CeaselessEdgeSlashes call CeaselessEdgeSlashes call CeaselessEdgeSlashes waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA, @@ -16359,13 +16359,13 @@ gBattleAnimMove_CeaselessEdge:: CeaselessEdgeSlashes: playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, 8, 0, FALSE, FALSE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, -8, -8, TRUE, FALSE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, -8, 0, TRUE, TRUE - delay 0x4 + delay 4 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET createsprite gSpriteTemplate_CeaselessEdgeSlash, ANIM_TARGET, 2, 8, -4, FALSE, TRUE return @@ -16398,15 +16398,15 @@ gBattleAnimMove_BleakwindStorm:: end BleakwindStormIceSwirl: createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16444,15 +16444,15 @@ gBattleAnimMove_WildboltStorm:: WildboltStormSparkSwirl: createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16486,15 +16486,15 @@ gBattleAnimMove_SandsearStorm:: SandsearStormFireSpin: createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_TARGET return @@ -16516,17 +16516,17 @@ gBattleAnimMove_LunarBlessing:: loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 call HealingEffect2 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, - delay 0x24 + delay 36 clearmonbg ANIM_ATK_PARTNER call HealingEffect - delay 0x28 + delay 40 createvisualtask AnimTask_AllBattlersInvisible, 0xA, createvisualtask AnimTask_MoonlightEndFade, 0x2, - delay 0x10 + delay 16 createvisualtask AnimTask_AllBattlersVisible, 0xA, waitforvisualfinish blendoff @@ -16540,7 +16540,7 @@ gBattleAnimMove_TakeHeart:: loadspritegfx ANIM_TAG_GUARD_RING playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER createsprite gSpriteTemplate_TakeHeartFallingHeart, ANIM_ATTACKER, 2, 0, 0x3a, 4, ANIM_ATTACKER - delay 0x15 + delay 21 loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x4 createvisualtask AnimTask_StatusClearedEffect, 0x2, 0x0 call TakeHeartRings @@ -16560,7 +16560,7 @@ gBattleAnimMove_TakeHeart:: TakeHeartRings: createsprite gSpriteTemplate_TakeHeartRing, ANIM_ATTACKER, 2, - delay 0x4 + delay 4 return gBattleAnimMove_BitterBlade:: @@ -16845,7 +16845,7 @@ gBattleAnimMove_AlluringVoice:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 createvisualtask AnimTask_ShakeBattlePlatforms, 2, 1, 0, 6, 1 createvisualtask SoundTask_WaitForCry, 5 - delay 0xA + delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 26, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 26, 1 waitforvisualfinish @@ -17203,7 +17203,7 @@ gBattleAnimMove_Trailblaze:: call TrailblazeVortex waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 - delay 0x3 + delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 @@ -17216,24 +17216,24 @@ gBattleAnimMove_Trailblaze:: createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER waitforvisualfinish - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x7 waitforvisualfinish clearmonbg ANIM_TARGET end TrailblazeVortex: createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gLeafTornadoVortexTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return gBattleAnimMove_LastRespects:: @@ -17632,25 +17632,25 @@ ElectroShotSetUp: loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 call TechnoBlastCharging1 - delay 0xF + delay 15 call TechnoBlastCharging2 - delay 0xF + delay 15 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish @@ -17790,9 +17790,9 @@ gBattleAnimMove_SpicyExtract:: createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears waitsound waitforvisualfinish @@ -29817,13 +29817,13 @@ gBattleAnimGeneral_ZMoveActivate:: end ZMoveBuffEffect: createsprite gBlueZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x3 + delay 3 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 @Red Buff - delay 0x3 + delay 3 createsprite gGreenZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x3 + delay 3 createsprite gYellowZMoveEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x3 + delay 3 return gBattleAnimGeneral_TotemFlare:: @@ -29847,13 +29847,13 @@ gBattleAnimGeneral_TotemFlare:: RainbowEndureEffect: createsprite gBlueEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x3 + delay 3 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 @Red Buff - delay 0x3 + delay 3 createsprite gGreenEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x3 + delay 3 createsprite gYellowEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x3 + delay 3 return gBattleAnimGeneral_GulpMissile:: @ Tackle anim (placeholder) @@ -30024,7 +30024,7 @@ gBattleAnimGeneral_UltraBurst:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker - delay 0x1e + delay 30 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 3, 0x0 call LightThatBurnsTheSkyGreenSparks @@ -30339,7 +30339,7 @@ gBattleAnimMove_BreakneckBlitz:: playsewithpan SE_M_EARTHQUAKE, 0x0 monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x4c00, 0xe, 0x0, 0x3 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x2b @@ -30347,7 +30347,7 @@ gBattleAnimMove_BreakneckBlitz:: createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x80 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0xaa createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0xd5 - delay 0xf + delay 15 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x55 @@ -30363,26 +30363,26 @@ gBattleAnimMove_BreakneckBlitz:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xf700, 0x300, 0x1, 0xffff waitbgfadein setalpha 12, 8 - delay 0x10 + delay 16 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 @ 0, 0 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff6, 0x1, 0x1 @ +10, -10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0xf, 0xfff1, 0x1, 0x1 @ +15, -15 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x14, 0xffec, 0x1, 0x1 @ +20, -20 - delay 0x1 + delay 1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x19, 0xffe7, 0x1, 0x1 @ +25, -25 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @@ -30391,15 +30391,15 @@ gBattleAnimMove_BreakneckBlitz:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - delay 0x4 + delay 4 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -512, ANIM_TARGET, 1 - delay 0xa - delay 0x19 + delay 10 + delay 25 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x6 - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish - delay 0x10 + delay 16 blendoff clearmonbg ANIM_DEF_PARTNER createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -30430,66 +30430,66 @@ gBattleAnimMove_AllOutPummeling:: monbg ANIM_DEF_PARTNER createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xfffa, 0x12, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x14, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x17, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x11, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffb0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 - delay 0x2 + delay 2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x8 + delay 8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffa0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - delay 0x10 + delay 16 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 - delay 0x23 + delay 35 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - delay 0xc + delay 12 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -48, 0, 0, 4 waitforvisualfinish - delay 0x30 + delay 48 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish - delay 0x10 + delay 16 blendoff clearmonbg ANIM_DEF_PARTNER createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -30513,26 +30513,26 @@ gBattleAnimMove_SupersonicSkystrike:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff clearmonbg ANIM_DEF_PARTNER call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x20 - delay 0xA + delay 32 + delay 10 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 - delay 0x30 + delay 48 createvisualtask AnimTask_DoomDesireLightBeam, 0x5 - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, 0x0 - delay 0x9 + delay 9 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET - delay 0x19 + delay 25 fadetobg BG_SKY waitbgfadeout createvisualtask AnimTask_IsTargetPlayerSide, 0x2 @@ -30549,7 +30549,7 @@ FinishSupersonicSkystrike: setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gSupersonicSkystrikeFlySpriteTemplate, ANIM_ATTACKER, 2, 0x14 - delay 0x10 + delay 16 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 @@ -30561,7 +30561,7 @@ FinishSupersonicSkystrike: createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 - delay 0x30 + delay 48 clearmonbg ANIM_DEF_PARTNER blendoff createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -30593,12 +30593,12 @@ FinishAcidDownpour: call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker call AcidDownpourFlareOnAttacker - delay 0x5 + delay 5 clearmonbg ANIM_ATTACKER createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish blendoff - delay 0x20 + delay 32 loopsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET, 0xd, 0x3 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x0 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x2a @@ -30606,16 +30606,16 @@ FinishAcidDownpour: createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0x7e createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0xa8 createsprite gAcidDownpourReversalSpriteTemplate, ANIM_ATTACKER, 2, 0x1a, 0xd2 - delay 0x20 + delay 32 panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0xd87c createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call AcidDownpourFlare call AcidDownpourFlare - delay 0x15 + delay 21 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 42 - delay 0x2c + delay 44 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0xd87c invisible ANIM_TARGET waitforvisualfinish @@ -30629,31 +30629,31 @@ FinishAcidDownpour: end AcidDownpourFlare: createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_TARGET - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_TARGET - delay 0x2 + delay 2 return AcidDownpourFlareOnAttacker: createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gAcidDownpourAuraSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return @@ -30665,9 +30665,9 @@ gBattleAnimMove_TectonicRage:: createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x0, 0xb4 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x1, 0xb4 monbg_static ANIM_ATTACKER - delay 0x1 + delay 1 createvisualtask AnimTask_DigDownMovement, 0x2, 0x0 - delay 0x6 + delay 6 call DigThrowDirt call DigThrowDirt call DigThrowDirt @@ -30675,22 +30675,22 @@ gBattleAnimMove_TectonicRage:: createvisualtask AnimTask_TectonicRageRollout, 0x2 call DigThrowDirt setalpha 12, 8 - delay 0x20 + delay 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER monbg ANIM_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 - delay 0x1 + delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 - delay 0xa + delay 10 waitforvisualfinish clearmonbg ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish invisible ANIM_TARGET - delay 0x5 + delay 5 invisible ANIM_ATTACKER waitforvisualfinish - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 fadetobg BG_TECTONIC_RAGE @ brown/yellow sky uppercut unloadspritegfx ANIM_TAG_DIRT_MOUND @ dig @@ -30705,18 +30705,18 @@ gBattleAnimMove_TectonicRage:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xf800, 0x0, 0xffff waitbgfadein playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound - delay 0x1e + delay 30 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0xc8, 0xffe0, 0x0, 0x64, 0x0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x1e, 0xffe0, 0x10, 0x5a, 0x1 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x96, 0xffe0, 0x20, 0x3c, 0x2 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0xffe0, 0x30, 0x50, 0x3 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gEruptionFallingRockSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 - delay 0x16 + delay 22 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 60 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 60 loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 0x10, 0xc - delay 0x30 + delay 48 call TectonicRageExplosion playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER createsprite gTectonicRageBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 @@ -30758,19 +30758,19 @@ gBattleAnimMove_TectonicRage:: TectonicRageExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gTectonicRageExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -30785,22 +30785,22 @@ gBattleAnimMove_ContinentalCrush:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call ContinentalCrashBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call ContinentalCrashBuffEffect - delay 0x8 + delay 8 call ContinentalCrashBuffEffect - delay 0x4 - delay 0xA + delay 4 + delay 10 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 - delay 0x30 + delay 48 createvisualtask AnimTask_GetTimeOfDay, 0x2 jumpargeq 0x0 0x0 ContinentalCrushDay jumpargeq 0x0 0x2 ContinentalCrushAfternoon @@ -30813,12 +30813,12 @@ ContinentalCrushDay: ContinentalCrushAfternoon: fadetobg BG_ROCK_FIELD_AFTERNOON FinishContinentalCrush: - delay 0x18 + delay 24 invisible ANIM_TARGET waitbgfadeout - delay 0x5 + delay 5 visible ANIM_ATTACKER - delay 0x4 + delay 4 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(19, 14, 11) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER @@ -30840,14 +30840,14 @@ FinishContinentalCrush: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xf800, 0x0, 0xffff waitbgfadein loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 0x20, 0x4 @;Falling sound - delay 0x1e + delay 30 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0xc8, 0xffe0, 0x0, 0x64, 0x0 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x1e, 0xffe0, 0x10, 0x5a, 0x1 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x96, 0xffe0, 0x20, 0x3c, 0x2 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x5a, 0xffe0, 0x30, 0x50, 0x3 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x6e, 0xffe0, 0x40, 0x32, 0x0 createsprite gContinentalCrushEruptionSpriteTemplate, ANIM_ATTACKER, 40, 0x3c, 0xffe0, 0x50, 0x46, 0x1 - delay 0x16 + delay 22 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_RIGHT, 8, 28 createvisualtask AnimTask_HorizontalShake, 5, ANIM_PLAYER_LEFT, 8, 28 unloadspritegfx ANIM_TAG_ROUND_SHADOW @ fly @@ -30855,10 +30855,10 @@ FinishContinentalCrush: unloadspritegfx ANIM_TAG_FOCUS_ENERGY @ focus energy unloadspritegfx ANIM_TAG_IMPACT @ hit loadspritegfx ANIM_TAG_REALLY_BIG_ROCK - delay 0x30 + delay 48 createsprite gContinentalCrushBigRockStompSpriteTemplate, ANIM_TARGET, 2, 0, 0x3c, 3, ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x0000 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 @@ -30869,9 +30869,9 @@ FinishContinentalCrush: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0x0000 @undo pal change on tgt - delay 0x10 + delay 16 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish @@ -30880,45 +30880,45 @@ FinishContinentalCrush: setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein - delay 0x4 + delay 4 waitforvisualfinish end ContinentalCrashBuffEffect: createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gContinentalCrushFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return ContinentalCrushStockpileRocks: createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0xffc0, 0x20 @ 0,-32 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x2c, 0xffd4, 0x20 @ +44,-44 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x3c, 0x0, 0x20 @ +60,0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x28, 0x28, 0x20 @ +40,+40 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0x38, 0x20 @ +0,+56 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffda, 0x26, 0x20 @ -38,+38 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffca, 0x0, 0x20 @ -54, +0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0xffdc, 0xffdc, 0x20 @ -36, -36 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x0, 0xffce, 0x20 @ 0, -50 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x22, 0xffde, 0x20 @ +34, -34 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x2e, 0x0, 0x20 @ +46, +0 - delay 0x2 + delay 2 createsprite gContinentalCrushNeedleArmSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x20, 0x20, 0x20 @ +32, +32 - delay 0x2 + delay 2 return @@ -30934,11 +30934,11 @@ gBattleAnimMove_SavageSpinOut:: setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 createsprite gSavageSpinOutGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x19 + delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - delay 0xf + delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 @@ -30953,18 +30953,18 @@ gBattleAnimMove_SavageSpinOut:: call gSavageSpinOutStringBlastSpriteTemplateSHOT createsprite gSpiderWebSpriteTemplate, ANIM_TARGET, 2 @ spider web call gSavageSpinOutStringBlastSpriteTemplateSHOT - delay 0xe + delay 14 blendoff waitforvisualfinish unloadspritegfx ANIM_TAG_STRING unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_COCOON loadspritegfx ANIM_TAG_IMPACT @hit - delay 0x1 + delay 1 invisible ANIM_TARGET - delay 0x0 + delay 0 createvisualtask AnimTask_IsTargetPlayerSide, 0x2 - delay 0x0 + delay 0 jumpargeq 0x7 ANIM_TARGET SavageSpinOutOnPlayer SavageSpinOutOnOpponent: createsprite gSavageSpinOutCacoonSpriteTemplate, ANIM_TARGET, 2, 0x0, ANIM_TARGET, 0x2, 0x0, 0x0, 0x80 @@ -30976,7 +30976,7 @@ FinishSavageSpinOut: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x1000, 0x0, 0xffff @+0x1000 waitbgfadein - delay 0x10 + delay 16 call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed @@ -30989,20 +30989,20 @@ FinishSavageSpinOut: call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed call SlowSavageSpinOutBackgroundSpeed @-0x1000 - delay 0x4 + delay 4 call SavageSpinOutCrash_2 @SeismicToss2 - delay 0xa + delay 10 call SavageSpinOutCrash_1 @SeismicToss1 - delay 0xa + delay 10 call SavageSpinOutCrash_2 @SeismicToss2 - delay 0xa + delay 10 call SavageSpinOutCrash_1 @SeismicToss1 - delay 0xc + delay 12 call UnsetPsychicBg setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles - no idea why though - something to do with the background scrolling createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - delay 0x1E + delay 30 unloadspritegfx ANIM_TAG_MUD_SAND unloadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_CUT @cut @@ -31013,24 +31013,24 @@ FinishSavageSpinOut: createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffe0, 0x0 createsprite gSavageSpinOutGreenCutSpriteTemplate, ANIM_TARGET, 2, 0x28, 0xffd0, 0x0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - delay 0xc + delay 12 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 createsprite gSpiderWebSpriteTemplate, ANIM_TARGET, 2 @ spider web playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSavageSpinOutWhiteExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -31039,19 +31039,19 @@ gSavageSpinOutStringBlastSpriteTemplateSHOT: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x0, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x0, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x1, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x1, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x2, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x2, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0xe, 0xfff4, 0x0, 0xfff4, 0xf, 0x3, 0x0 createsprite gSavageSpinOutStringBlastSpriteTemplate, ANIM_TARGET, 2, 0x1a, 0x8, 0xc, 0x8, 0xf, 0x3, 0x0 - delay 0x3 + delay 3 return SavageSpinOutCrash_1: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -10, -8, ANIM_TARGET, 1 @@ -31071,7 +31071,7 @@ SavageSpinOutCrash_2: return SlowSavageSpinOutBackgroundSpeed: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xfd56, 0x0, 0xffff @-0x2aa - delay 0x1 + delay 1 return @@ -31086,26 +31086,26 @@ gBattleAnimMove_NeverEndingNightmare:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call NeverendingNightmareBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call NeverendingNightmareBuffEffect - delay 0x8 + delay 8 call NeverendingNightmareBuffEffect playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET call NeverendingNightmareAttackerRings - delay 0x1 + delay 1 call NeverendingNightmareAttackerRings - delay 0x1 + delay 1 call NeverendingNightmareAttackerRings - delay 0xa + delay 10 playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET call NeverendingNightmareTargetRings - delay 0x1 + delay 1 call NeverendingNightmareTargetRings - delay 0x1 + delay 1 call NeverendingNightmareTargetRings - delay 0x1 + delay 1 waitforvisualfinish fadetobg BG_NEVERENDING_NIGHTMARE waitbgfadein @@ -31113,7 +31113,7 @@ gBattleAnimMove_NeverEndingNightmare:: playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET call NeverendingNightmareHands call NeverendingNightmareHands - delay 0xa + delay 10 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_EXPLOSION_2 @@ -31162,99 +31162,99 @@ gBattleAnimMove_NeverEndingNightmare:: end NeverendingNightmareBuffEffect: createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gNeverEndingNightmareFocusEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return NeverendingNightmareTargetRings: createsprite gNeverEndingNightmareRingTargetSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x8 + delay 8 return NeverendingNightmareAttackerRings: createsprite gNeverEndingNightmareRingAttackerSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xe + delay 14 return NeverendingNightmareHands: createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0xffc0, 0x20 @ 0,-32 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x2c, 0xffd4, 0x20 @ +44,-44 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x3c, 0x0, 0x20 @ +60,0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x28, 0x28, 0x20 @ +40,+40 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0x38, 0x20 @ +0,+56 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffda, 0x26, 0x20 @ -38,+38 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffca, 0x0, 0x20 @ -54, +0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xffdc, 0xffdc, 0x20 @ -36, -36 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x0, 0xffce, 0x20 @ 0, -50 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x22, 0xffde, 0x20 @ +34, -34 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x2e, 0x0, 0x20 @ +46, +0 - delay 0x2 + delay 2 createsprite gNeverEndingNightmareHandSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x20, 0x20, 0x20 @ +32, +32 - delay 0x2 + delay 2 return NeverendingNightmareGeyser: createsprite gNeverEndingNightmareExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xfff1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xfffb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0x0012, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0x0005, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareExplosionSpriteTemplate ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gNeverEndingNightmareGeyserHexSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 return @@ -31296,24 +31296,24 @@ gBattleAnimMove_CorkscrewCrash:: CorkscrewCrashOnOpponent: createsprite gCorkscrewCrashRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 createsprite gCorkscrewCrashLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 waitforvisualfinish visible ANIM_TARGET - delay 0x5 + delay 5 goto FinishCorkscrewCrash CorkscrewCrashOnPlayer: createsprite gCorkscrewCrashLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 waitforvisualfinish - delay 0xa + delay 10 createsprite gCorkscrewCrashRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 waitforvisualfinish visible ANIM_TARGET - delay 0x5 + delay 5 FinishCorkscrewCrash: createsprite gCorkscrewCrashStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 loadspritegfx ANIM_TAG_IMPACT @hit - delay 0x10 + delay 16 stopsound playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 @@ -31322,36 +31322,36 @@ FinishCorkscrewCrash: createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffc0, 0x0f - delay 0xf + delay 15 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 48 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 call CorkscrewCrashSpinningWind call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x0 + delay 0 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x1 + delay 1 createsprite gCorkscrewCrashCorkscrewFlyDownSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfffe, 0x03 - delay 0x4 + delay 4 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks - delay 0x6 + delay 6 call CorkscrewCrashSprayRocks createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff waitforvisualfinish - delay 0x10 + delay 16 call ResetFromWhiteScreen waitforvisualfinish end @@ -31365,17 +31365,17 @@ CorkscrewCrashSpinningWind: return CorkscrewCrashMetalFlare: createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gCorkscrewCrashMetalBitSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return CorkscrewCrashSprayRocks: playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET @@ -31424,16 +31424,16 @@ FinishInfernoOverdrive: clearmonbg ANIM_ATTACKER createsprite gInfernoOverdriveSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 @ super power shot playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER - delay 0x10 + delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 79, 1 call InfernoOverdriveExplosion - delay 0x6 + delay 6 call InfernoOverdriveExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ red bg pal - delay 0x6 + delay 6 call InfernoOverdriveExplosion waitforvisualfinish call ResetFromRedScreen @@ -31441,17 +31441,17 @@ FinishInfernoOverdrive: end InfernoOverdriveFireSpin: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return InfernoOverdriveExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -31461,7 +31461,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -31469,7 +31469,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -31477,7 +31477,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -31485,7 +31485,7 @@ InfernoOverdriveExplosion: createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gInfernoOverdriveExplosionSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -31506,7 +31506,7 @@ gBattleAnimMove_HydroVortex:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish createvisualtask AnimTask_CreateSurfWave, 0x2, 0x0 - delay 0x18 + delay 24 panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 waitforvisualfinish loadspritegfx ANIM_TAG_ROUND_SHADOW @@ -31521,14 +31521,14 @@ gBattleAnimMove_HydroVortex:: call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 26 - delay 0x1a + delay 26 invisible ANIM_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 - delay 0x5 + delay 5 fadetobg BG_WATER_PULSE waitbgfadeout - delay 0x5 + delay 5 visible ANIM_ATTACKER visible ANIM_TARGET loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x3 @@ -31544,7 +31544,7 @@ gBattleAnimMove_HydroVortex:: createsprite gHydroVortexSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER - delay 0x10 + delay 16 createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x5da0 @@ -31565,25 +31565,25 @@ gBattleAnimMove_HydroVortex:: HydroVortexBubbles: createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xa, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xffec, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xffec, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0xf, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff1, 0xf, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x0, 0x0, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xffec, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff6, 0xffec, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xfff8, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x10, 0xfff8, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x8, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0x5, 0x8, 0x14, ANIM_TARGET - delay 0x4 + delay 4 createsprite gSmallBubblePairSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x0, 0x14, ANIM_ATTACKER createsprite gSmallBubblePairSpriteTemplate ANIM_TARGET, 2, 0xfff0, 0x0, 0x14, ANIM_TARGET return @@ -31593,20 +31593,20 @@ HydroVortexWhirlpoolHurricane: createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0xfff8, 0x1, 0x1 createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, 0x1 - delay 0x2 + delay 2 createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, 0x1 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, 0x1 createsprite gHydroVortexHurricaneSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 createvisualtask AnimTask_AnimateGustTornadoPalette, 0x5, 0x1, 0x46 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, 0x1 - delay 0x2 + delay 2 return @@ -31623,23 +31623,23 @@ gBattleAnimMove_BloomDoom:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 0x9, 0x3 createsprite gBloomDoomGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 - delay 0x3C + delay 60 blendoff createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x4 - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0xc - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x14 - delay 0x2 + delay 2 createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER waitforvisualfinish @@ -31673,11 +31673,11 @@ gBattleAnimMove_BloomDoom:: fadetobg BG_BLOOM_DOOM waitbgfadein loadspritegfx ANIM_TAG_ORBS - delay 0x5 + delay 5 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x18, 0x10, 0x0, 0x2, 0x2, 0x0, 0x0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 0x40, 0x18, 0x0, 0x3, 0x1, 0x1, 0x0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x10, 0x18, 0x0, 0x2, 0x1, 0x0, 0x0 - delay 0x5 + delay 5 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @ shake attacker call BloomDoomHyperBeam @@ -31714,7 +31714,7 @@ gBattleAnimMove_BloomDoom:: createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 66, 0x50, 0x1e, 0x0, 0x4, 0x1, 0x1, 0x0 createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x80, 0xc, 0x0, 0x3, 0x3, 0x0, 0x0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x5a, 0x10, 0x0, 0x2, 0x1, 0x0, 0x0 - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0xb, 0x0, 0x33ed loadspritegfx ANIM_TAG_EXPLOSION @explosion call BloomDoomPetalBlast @@ -31738,55 +31738,55 @@ BloomDoomHurricane: return BloomDoomFlowerGeyser: createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfffc, 0x10 @ -4, -0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gBloomDoomFlowerGeyserSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xfff0, 0x10 - delay 0x0 + delay 0 return BloomDoomHyperBeam: createsprite gBloomDoomGreenBeamSpriteTemplate, ANIM_TARGET, 2 createsprite gBloomDoomGreenBeamSpriteTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return BloomDoomPetalBlast: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x1c, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffed, 0x13, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffe5, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xffee, 0xffee, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe7, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x11, 0xffef, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x17, 0x0, 0x10 - delay 0x2 + delay 2 createsprite gBloomDoomPetalStarSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0x10, 0x10 - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBloomDoomExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x2 + delay 2 return ResetFromGreenScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA @@ -31798,7 +31798,7 @@ ResetFromGreenScreen: createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein waitforvisualfinish - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x33ED waitforvisualfinish return @@ -31820,27 +31820,27 @@ gBattleAnimMove_GigavoltHavoc:: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 - delay 0xa + delay 10 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x0 - delay 0x5 + delay 0 + delay 5 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 - delay 0x5 + delay 5 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x20, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x60, 0x14, 0x1, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xa0, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xe0, 0x14, 0x2, 0x0 - delay 0x5 + delay 5 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 - delay 0x0 + delay 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER monbg ANIM_ATTACKER @@ -31850,66 +31850,66 @@ gBattleAnimMove_GigavoltHavoc:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x12, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 waitforvisualfinish playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gGigavoltHavocLaunchSpearSpriteTemplate, ANIM_TARGET, 3, 0x0 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - delay 0xe + delay 14 clearmonbg ANIM_ATTACKER createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 28 @shake target unloadspritegfx ANIM_TAG_HAVOC_SPEAR @@ -31925,7 +31925,7 @@ gBattleAnimMove_GigavoltHavoc:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x8003 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_TARGET - delay 0x19 + delay 25 loadspritegfx ANIM_TAG_VERTICAL_HEX playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET @ call HavocSpearSparkTarget @@ -31994,31 +31994,31 @@ gBattleAnimMove_ShatteredPsyche:: createsprite gShatteredPsychePinkChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0xc + delay 12 createsprite gShatteredPsycheRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - delay 0x4 + delay 4 fadetobg BG_SHATTERED_PSYCHE - delay 0x4 + delay 4 createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0 - delay 0x7 + delay 7 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 @@ -32036,7 +32036,7 @@ ShatteredPsycheOnPlayer: call ShatteredPsycheFlingPlayer waitforvisualfinish ShatteredPsycheFinish: - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET restorebg createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 @@ -32054,56 +32054,56 @@ ShatteredPsycheFlingOpponent: waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 32, 1, 4 @ 0,32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0x1, 0x1 @ 0, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -32, 1, 4 @ 0,-32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x20, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, 16, 1, 4 @ 26,16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0xfff0, 0x1, 0x1 @ -26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, -32, 1, 4 @ 26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0x10, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @ -26, +16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish return @@ -32112,28 +32112,28 @@ ShatteredPsycheFlingPlayer: waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 32, 0, 1, 4 @ 32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0x0, 0x1, 0x1 @ playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 1, 4 @ -32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x0, 0x1, 0x1 @ 32, 0 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 10, 32, 1, 4 @ 10, -32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0x5, 0x1, 0x1 @ 10, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET - delay 0x2 + delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 waitforvisualfinish return @@ -32161,27 +32161,27 @@ SubzeroSlammerFinish: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xb, 0x7e80 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x4 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x8 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0xc playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x10 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x14 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER - delay 0x20 + delay 32 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0x7e80 - delay 0x20 + delay 32 createvisualtask AnimTask_FrozenIceCubeAttacker, 0x2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 0x11 waitforvisualfinish @@ -32190,12 +32190,12 @@ SubzeroSlammerFinish: createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SubzeroSlammerIceSwirl call SubzeroSlammerIceSwirl - delay 0xa + delay 10 clearmonbg ANIM_ATK_PARTNER createsoundtask SoundTask_LoopSEAdjustPanning, 0xb0, 0xffc0, SOUND_PAN_TARGET, 0x4, 0x4, 0x0, 0xa createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xc, 0x0, 0xc, 0x14 createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff4, 0x0, 0xfff4, 0x14 - delay 0x1 + delay 1 call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals @@ -32214,14 +32214,14 @@ SubzeroSlammerFinish: call IceBeamCreateCrystals call IceBeamCreateCrystals call IceCrystalEffectShort - delay 0x5 + delay 5 monbg ANIM_DEF_PARTNER createvisualtask AnimTask_FrozenIceCube, 0x82 playsewithpan SE_M_HAIL, SOUND_PAN_TARGET waitforvisualfinish loadspritegfx ANIM_TAG_TORN_METAL playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - delay 0x3 + delay 3 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0x0 @ -8, -12 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x1, 0x0, 0x0 createsprite gBrickBreakWallShardSpriteTemplate ANIM_TARGET, 2, 0x1, 0x2, 0x0, 0x0 @@ -32243,50 +32243,50 @@ SubzeroSlammerExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xa, 0x14, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 - delay 0x3 + delay 3 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSubzeroSlammerExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x11, 0xfff4, 0x0 - delay 0x3 + delay 3 createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xf, 0x0 - delay 0x3 + delay 3 return SubzeroSlammerIceSwirl: playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gSubzeroSlammerIceSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return @@ -32297,17 +32297,17 @@ gBattleAnimMove_DevastatingDrake:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @ shock wave playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call DevastatingDrakeBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(0, 6, 16) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call DevastatingDrakeBuffEffect - delay 0x8 + delay 8 call DevastatingDrakeBuffEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeShockwaveSpriteTemplate, ANIM_ATTACKER, 2 - delay 0x2a + delay 42 unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT monbg ANIM_ATTACKER playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER @@ -32326,11 +32326,11 @@ DevastatingDrakeOnOpponent: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 @left to right waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 @right to left waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0x0f, 0x15 @left to right goto DevastatingDrakeFinish @@ -32338,28 +32338,28 @@ DevastatingDrakeOnPlayer: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 @right to left waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 @left to right waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x78, 0xfff0, 0x58, 0x15 @right to left DevastatingDrakeFinish: call UnsetPsychicBg waitforvisualfinish visible ANIM_TARGET - delay 0xa + delay 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 - delay 0x10 + delay 16 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION, 0x0, 0xC, 0xC, 0x502B createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 53 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple call DevastatingDrakeExplosion - delay 0x6 + delay 6 createvisualtask AnimTask_IsTargetPartner, 0x5 jumpargeq 0x0 0x1 DevastatingDrakeFadeTargetPartner createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x6, 0x0, 0x10, 0x40c0 @@ -32411,7 +32411,7 @@ DevastatingDrakeUniversalEnding: createsprite gDevastatingDrakePurpleBlastSpriteTemplate, ANIM_ATTACKER, 2, 0xffc4, 0x1e, 0x18, 0x0, 0x0, 0x0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER call DevastatingDrakeGeyser - delay 0x4 + delay 4 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x10, 0x0, 0x40c0 @ fade from purple waitforvisualfinish @@ -32429,82 +32429,82 @@ DevastatingDrakeFadeTargetPartner: goto DevastatingDrakeUniversalEnding DevastatingDrakeBuffEffect: createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return DevastatingDrakeGeyser: createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, 0x1, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfffc, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gDevastatingDrakeHexSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x10 return DevastatingDrakeExplosion: createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gDevastatingDrakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 return @@ -32522,11 +32522,11 @@ gBattleAnimMove_BlackHoleEclipse:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -32538,13 +32538,13 @@ gBattleAnimMove_BlackHoleEclipse:: playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseHoleUserSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_ATTACKER, 0x0 createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 waitforvisualfinish stopsound createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x07, 0x0000 @@ -32552,58 +32552,58 @@ gBattleAnimMove_BlackHoleEclipse:: invisible ANIM_ATTACKER loopsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x10, 0x5 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x0 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x10, 0x1 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x10, 0x2 - delay 0x3 + delay 3 createsprite gBlackHoleEclipseWispSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x10, 0x3 waitforvisualfinish fadetobg BG_BLACKHOLE_ECLIPSE playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_VERTICAL_HEX @red createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x4 + delay 4 createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x4 + delay 4 createsprite gBlackHoleEclipseRedRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitbgfadeout unloadspritegfx ANIM_TAG_WISP_ORB createsprite gBlackHoleEclipseHoleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 @ eclipse at target origin - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) - delay 0x2 + delay 2 visible ANIM_TARGET loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x5 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin target around (0x50 (time), -0x400 (rot speed)) createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x15 + delay 21 invisible ANIM_TARGET - delay 0x8 + delay 8 createsprite gBlackHoleEclipseBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseRedRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gBlackHoleEclipseHoleShrinkSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 waitforvisualfinish unloadspritegfx ANIM_TAG_THIN_RING unloadspritegfx ANIM_TAG_ICE_CHUNK loadspritegfx ANIM_TAG_SPARKLE_4 @detect createsprite gTargetTwinkleSpriteTemplate, ANIM_ATTACKER, 13, 0x0, 0x0, ANIM_TARGET @detect star - delay 0x2 + delay 2 unloadspritegfx ANIM_TAG_VERTICAL_HEX @red unloadspritegfx ANIM_TAG_SHADOW_BALL unloadspritegfx ANIM_TAG_BLACK_BALL_2 @@ -32613,30 +32613,30 @@ gBattleAnimMove_BlackHoleEclipse:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x7fff @ bg to white pal call BlackHoleEclipseExplosion waitforvisualfinish - delay 0x18 + delay 24 invisible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 1, 0, ANIM_TARGET, 1 @ fix rotation invisible ANIM_TARGET - delay 0x1 + delay 1 waitforvisualfinish call ResetFromWhiteScreen end BlackHoleEclipseExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBlackHoleEclipseRedExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return ResetFromWhiteScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA @@ -32648,7 +32648,7 @@ ResetFromWhiteScreen: createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein waitforvisualfinish - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x7fff waitforvisualfinish return @@ -32662,12 +32662,12 @@ gBattleAnimMove_TwinkleTackle:: waitforvisualfinish playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER call TwinkleTacklePinkStars - delay 0x8 + delay 8 fadetobg BG_TWINKLE_TACKLE createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitbgfadeout invisible ANIM_TARGET - delay 0x1 + delay 1 loadspritegfx ANIM_TAG_YELLOW_STAR createsprite gTwinkleTackleStarGrowSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish @@ -32680,7 +32680,7 @@ TwinkleTackleOnPlayer: call OpponentTwinkling TwinkleTackleFinish: waitforvisualfinish - delay 0x5 + delay 5 visible ANIM_ATTACKER visible ANIM_TARGET createvisualtask AnimTask_SwayMon, 5, 0, 8, 2048, 1, ANIM_ATTACKER @@ -32692,29 +32692,29 @@ TwinkleTackleFinish: loadspritegfx ANIM_TAG_SPARKLE_4 @detect loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_PAIN_SPLIT @pain-split - delay 0x1 + delay 1 createsprite gTwinkleTackleYellowImpactSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 call TwinkleTackleStarsTarget playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET - delay 0x5 + delay 5 createvisualtask AnimTask_TwinkleTackleLaunch, 0x2, 89 delay 89 playsewithpan SE_M_DETECT, SOUND_PAN_TARGET createsprite gTwinkleTackleTwinkleSpriteTemplate, ANIM_TARGET, 13, 0x0, 0x0, ANIM_TARGET @detect star waitforvisualfinish - delay 0x10 + delay 16 restorebg - delay 0x18 + delay 24 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end TwinkleTacklePinkStars: createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 - delay 0x8 + delay 8 createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c - delay 0x8 + delay 8 createsprite gTwinkleTacklePinkRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 return PlayerTwinkling: @@ -32722,36 +32722,36 @@ PlayerTwinkling: setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x12, 0x0, 0x0, 0x0, 0x20, 0x1c - delay 0x3 + delay 3 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x16 + delay 22 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffc0, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffc0, 0x0, 0x0, 0x20, 0x1c return OpponentTwinkling: @@ -32759,40 +32759,40 @@ OpponentTwinkling: setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 @ user fly on screen on enemy side createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xa0, 0xfffb, 0x0, 0x0, 0x20, 0x1c - delay 0x5 + delay 5 playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0xa0, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x90, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x80, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x70, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x60, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x50, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x40, 0x2c, 0x0, 0x0, 0x20, 0x1c - delay 0x1 + delay 1 createsprite gTwinkleTacklePinkStarSpriteTemplate, ANIM_ATTACKER, 2, 0x30, 0x2c, 0x0, 0x0, 0x20, 0x1c return TwinkleTackleStars: @@ -32820,13 +32820,13 @@ gBattleAnimMove_Catastropika:: waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x8 + delay 8 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish @@ -32855,74 +32855,74 @@ CatastropikaFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 -@ delay 0x14 +@ delay 20 @ playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x12, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 -@ delay 0x14 +@ delay 20 @ playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x16, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1a, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x15, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 restorebg waitbgfadeout playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @@ -32936,17 +32936,17 @@ CatastropikaFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0xd + delay 13 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 loadspritegfx ANIM_TAG_MUD_SAND createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 @@ -33004,12 +33004,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -33029,64 +33029,64 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffdc - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffec - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xc - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffdc - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffec - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xc - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x14 + delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffdc - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffec - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xc - delay 0x14 + delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x40, 0x28, 0x1, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x80, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffdc - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffec - delay 0x1 + delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xc playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2a, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -33137,12 +33137,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x25, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 -@ delay 0x6 +@ delay 6 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x35, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 -@ delay 0x6 +@ delay 6 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x40, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -33170,7 +33170,7 @@ gBattleAnimMove_10000000VoltThunderbolt:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff call TenMillionVoltThunderboltSparkGeyser waitforvisualfinish - delay 0x10 + delay 16 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x10, 0x0, 0x7fff waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -33215,11 +33215,11 @@ TenMillionVoltThunderboltSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @@ -33228,23 +33228,23 @@ TenMillionVoltThunderboltSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 return @@ -33262,12 +33262,12 @@ gBattleAnimMove_StokedSparksurfer:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe0, 0x20, 0x2c, 0xe0, 0x28, 0x2, 0x3 - delay 0x2 + delay 2 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x20, 0x28, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0x60, 0x28, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffd0, 0x20, 0x2c, 0xa0, 0x28, 0x0, 0x3 @@ -33294,12 +33294,12 @@ StokedSparksurferFinish: createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 28, 2, 12 createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 60, 1 call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x5, 0x0, 0x10, 0x5bff call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_ELECTRICITY createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x5bff @@ -33317,7 +33317,7 @@ StokedSparksurferFinish: waitforvisualfinish createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x3 playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET - delay 0x1 + delay 1 fadetobg BG_ZMOVE_ACTIVATE waitbgfadeout visible ANIM_TARGET @@ -33342,15 +33342,15 @@ StokedSparksurferFinish: call StokedSparksurferSparkGeyser createvisualtask AnimTask_VoltTackleAttackerReappear, 0x5 @ attacker flicker back playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 - delay 0x2 + delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - delay 0x4 + delay 4 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_TARGET | F_PAL_ATTACKER), 0x2, 0x10, 0x0, 0x5bff restorebg - delay 0x18 + delay 24 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end @@ -33363,25 +33363,25 @@ StokedSparksurferSparkGeyser: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffea, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffd4, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x4 + delay 4 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x5, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0xffbe, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x8003 - delay 0x1a + delay 26 return @@ -33395,31 +33395,31 @@ gBattleAnimMove_ExtremeEvoboost:: playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff4 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe8, 0xfff4 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xfff0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0xfff0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0xfffe createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xfffe - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x5 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x5 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xfff0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0xfff0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x0 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffd5, 0x0 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x1c, 0x5 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0x5 - delay 0xa + delay 10 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xf, 0xfff4 createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0xffdf, 0xfff4 @@ -33439,21 +33439,21 @@ gBattleAnimMove_ExtremeEvoboost:: waitforvisualfinish playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gExtremeEvoboostRedChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 waitforvisualfinish visible ANIM_ATTACKER loopsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x15, 0xd @@ -33464,62 +33464,62 @@ gBattleAnimMove_ExtremeEvoboost:: call ExtremeEvoboostColorCharge waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x0, 0x0, 0x10, 0x7fff - delay 0x18 + delay 24 call ResetFromWhiteScreen end ExtremeEvoboostColorCircle: createsprite gExtremeEvoboostRedChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 return ExtremeEvoboostColorCharge: createsprite gExtremeEvoboostRedChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostRedStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x37, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPinkStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0xffc9, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostIceStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x37, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlackStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffc9, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostBlueStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0xffde, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostPurpleStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0x37, 0x22, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostYellowStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0xffde, 0xd - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenChargeCircleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 - delay 0x2 + delay 2 createsprite gExtremeEvoboostGreenStockpileSpriteTemplate, ANIM_ATTACKER, 2, 0xffc9, 0x22, 0xd - delay 0x2 + delay 2 return @@ -33557,7 +33557,7 @@ PulverizingPancakeFinish: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 34 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 34 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 34 @@ -33570,7 +33570,7 @@ PulverizingPancakeFinish: waitbgfadein loadspritegfx ANIM_TAG_WHITE_SHADOW createvisualtask AnimTask_PulverizingPancakeWhiteShadow, 0x5, 0x33, 0x33 @first arg is duration, last arg is move speed - delay 0x10 + delay 16 call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground @@ -33584,19 +33584,19 @@ PulverizingPancakeFinish: call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground @-0x1000 - delay 0x1 + delay 1 waitbgfadein loadspritegfx ANIM_TAG_THIN_RING @ring unloadspritegfx ANIM_TAG_MUD_SAND @dig loadspritegfx ANIM_TAG_ELECTRIC_ORBS @yellow createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 @big hit marker - delay 0x0 + delay 0 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 44 createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 - delay 0x5 + delay 5 loadspritegfx ANIM_TAG_EXPLOSION @explosion call PulverizingPancakeExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff @ everything goes white @@ -33610,30 +33610,30 @@ PulverizingPancakeDiggingRun: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - delay 0x5 + delay 5 return PulverizingPancakeSlowBackground: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xfd56, 0x0, 0xffff @-0x2aa - delay 0x1 + delay 1 return PulverizingPancakeExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 createsprite gPulverizingPancakeExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -33666,7 +33666,7 @@ GenesisSupernovaFinish: call GenesisSupernovaReversalWave call GenesisSupernovaReversalWave call GenesisSupernovaReversalWave - delay 0x15 + delay 21 unloadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge monbg ANIM_ATTACKER @@ -33677,7 +33677,7 @@ GenesisSupernovaFinish: call GenesisSupernovaFlare call GenesisSupernovaFlare call GenesisSupernovaFlare - delay 0x4 + delay 4 unloadspritegfx ANIM_TAG_BLUE_ORB @reversal loadspritegfx ANIM_TAG_WISP_ORB @will-o-wisp loadspritegfx ANIM_TAG_METEOR @superpower @@ -33686,7 +33686,7 @@ GenesisSupernovaFinish: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0xd87c playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0x0, 0xc, 0x7fff - delay 0x8 + delay 8 invisible ANIM_TARGET loadspritegfx ANIM_TAG_EXPLOSION @explosion unloadspritegfx ANIM_TAG_METEOR @superpower @@ -33695,11 +33695,11 @@ GenesisSupernovaFinish: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x7fff call GenesisSupernovaBubbleExplosion waitforvisualfinish - delay 0x10 + delay 16 createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0xc, 0x0, 0x7fff clearmonbg ANIM_ATTACKER blendoff - delay 0x0 + delay 0 call ResetFromWhiteScreen waitforvisualfinish end @@ -33708,24 +33708,24 @@ GenesisSupernovaBubbleExplosion: createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xa, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xffec, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, ANIM_TARGET, 0x0, 0x20, 0x3c createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xffec, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - delay 0x6 + delay 6 createsprite gGenesisSupernovaBubbleSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xfff8, 0x0 createsprite gGenesisSupernovaExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe0, 0xffe8, ANIM_TARGET, 0x1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -33733,37 +33733,37 @@ GenesisSupernovaBubbleExplosion: GenesisSupernovaBuffEffectPlayer_1: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x24, 0x80, 0x24, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x10, 0x80, 0x10, 0x35, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x45, 0x80, 0x45, 0x3a, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x30, 0x80, 0x30, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x55, 0x80, 0x55, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaBuffEffectPlayer_2: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x29, 0x80, 0x29, 0x31, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x73, 0x80, 0x73, 0x32, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x4a, 0x80, 0x4a, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x64, 0x80, 0x64, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x2c, 0x80, 0x2c, 0x3d, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaOrbRiseSpriteTemplate, ANIM_ATTACKER, 50, 0x6c, 0x80, 0x6c, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaReversalWave: @@ -33774,52 +33774,52 @@ GenesisSupernovaReversalWave: return GenesisSupernovaFlare: createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 return GenesisSupernovaBuffOpponent_1: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x94, 0x40, 0x94, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x80, 0x40, 0x80, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xb5, 0x40, 0xb5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xa0, 0x40, 0xa0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xc5, 0x40, 0xc5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return GenesisSupernovaBuffOpponent_2: createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x99, 0x40, 0x99, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xe3, 0x40, 0xe3, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xba, 0x40, 0xba, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xd4, 0x40, 0xd4, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0x9c, 0x40, 0x9c, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gGenesisSupernovaSpinUpSpriteTemplate, ANIM_ATTACKER, 50, 0xdc, 0x40, 0xdc, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return @@ -33840,17 +33840,17 @@ gBattleAnimMove_SinisterArrowRaid:: visible ANIM_ATTACKER playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gArrowRaidArrowUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 waitforvisualfinish invisible ANIM_ATTACKER loadspritegfx ANIM_TAG_BIRD @sky attack @@ -33861,43 +33861,43 @@ gBattleAnimMove_SinisterArrowRaid:: SinisterArrowRaidOnOpponent: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x8a, 0x100, 0x3a, 0x15 @left to right - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x8c, 0x100, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x86, 0x100, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x84, 0x100, 0x34, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightUpSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x88, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER @[x0] [y0] [xf] [yf] createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x36, 0xfff0, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x3a, 0xfff0, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x37, 0xfff0, 0x37, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x3c, 0xfff0, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftUpSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x38, 0xfff0, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0x0f, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x0a, 0x100, 0x11, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x0c, 0x100, 0x13, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x06, 0x100, 0xd, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x04, 0x100, 0xb, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightDownSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x08, 0x100, 0xf, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike @@ -33913,43 +33913,43 @@ SinisterArrowRaidOnOpponent: SinisterArrowRaidOnPlayer: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0x0f, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x0a, 0xfff0, 0x11, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x0c, 0xfff0, 0x13, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x06, 0xfff0, 0xd, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x04, 0xfff0, 0xb, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidFaceUpLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x08, 0xfff0, 0xf, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 @left to right - delay 0x5 + delay 5 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x36, 0x100, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x3a, 0x100, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x37, 0x100, 0x37, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x3c, 0x100, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidRightSpriteTemplate, ANIM_ATTACKER, 50, 0xfff0, 0x38, 0x100, 0x38, 0x15 waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyLeftSpriteTemplate, ANIM_ATTACKER, 50, 0x0120, 0x78, 0xfff0, 0x58, 0x15 @right to left - delay 0x5 + delay 5 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x8a, 0xfff0, 0x3a, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x8c, 0xfff0, 0x3c, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x86, 0xfff0, 0x36, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x84, 0xfff0, 0x34, 0x15 - delay 0x1 + delay 1 createsprite gArrowRaidLeftDownSpriteTemplate, ANIM_ATTACKER, 50, 0x100, 0x88, 0xfff0, 0x38, 0x15 waitforvisualfinish call SinisterArrowRaidFlyStrike @@ -33965,170 +33965,170 @@ SinisterArrowRaidFinish: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x10, 0x0, 0x40c0 @ return tgt to normal waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x00, 0x388C @ bg to nrml - delay 0x5 + delay 5 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end SinisterArrowRaidFlyStrike: visible ANIM_TARGET - delay 0xa + delay 10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gArrowRaidFlyStrikeSpriteTemplate, ANIM_TARGET, 2, 0x14 waitforvisualfinish - delay 0x5 + delay 5 return SinisterArrowRaidStrikeOpponent: createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x95, 0xfff0, 0xb5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x75, 0xfff0, 0x95, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa5, 0xfff0, 0xc5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x6f, 0xfff0, 0x8f, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x7b, 0xfff0, 0x9b, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa2, 0xfff0, 0xc2, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x82, 0xfff0, 0xa2, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x87, 0xfff0, 0xa7, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x72, 0xfff0, 0x92, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x8b, 0xfff0, 0xab, 0x40, 0x4 - delay 0x1 + delay 1 return SinisterArrowRaidOpponentExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x95, 0xfff0, 0xb5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x75, 0xfff0, 0x95, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa5, 0xfff0, 0xc5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x6f, 0xfff0, 0x8f, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x7b, 0xfff0, 0x9b, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xa2, 0xfff0, 0xc2, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x82, 0xfff0, 0xa2, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x87, 0xfff0, 0xa7, 0x40, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x72, 0xfff0, 0x92, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x85, 0xfff0, 0xa5, 0x40, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x8b, 0xfff0, 0xab, 0x40, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 return SinisterArrowRaidArrowsStrikePlayer: createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xfff0, 0x55, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe5, 0xfff0, 0x35, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x15, 0xfff0, 0x65, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffdf, 0xfff0, 0x2f, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffeb, 0xfff0, 0x3b, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x12, 0xfff0, 0x62, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff2, 0xfff0, 0x42, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff7, 0xfff0, 0x47, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xfff0, 0x32, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xfff0, 0x4b, 0x90, 0x4 - delay 0x1 + delay 1 return SinisterArrowRaidPlayerExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x5, 0xfff0, 0x55, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe5, 0xfff0, 0x35, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x15, 0xfff0, 0x65, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffdf, 0xfff0, 0x2f, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffeb, 0xfff0, 0x3b, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0x12, 0xfff0, 0x62, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff2, 0xfff0, 0x42, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff7, 0xfff0, 0x47, 0x90, 0x4 - delay 0x1 + delay 1 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xffe2, 0xfff0, 0x32, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfff5, 0xfff0, 0x45, 0x90, 0x4 - delay 0x1 + delay 1 createsprite gArrowRaidArrowOnslaughtSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xfff0, 0x4b, 0x90, 0x4 createsprite gArrowRaidExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x1 + delay 1 return SinisterArrowRaidFinalExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gArrowRaidExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -34144,7 +34144,7 @@ gBattleAnimMove_MaliciousMoonsault:: setalpha 12, 8 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 - delay 0x1 + delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0xffec, 0xfff6, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 0x0, 0xfff0, 0x18, 0x0, 0x0, 0x0 @@ -34154,7 +34154,7 @@ gBattleAnimMove_MaliciousMoonsault:: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x18, 0x0, 0x0, 0x0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xa, 0x18, 0x0, 0x0, 0x0 waitforvisualfinish - delay 0x0 + delay 0 monbg ANIM_ATTACKER playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET call MaliciousMoonsaultFireSpin @@ -34166,17 +34166,17 @@ gBattleAnimMove_MaliciousMoonsault:: createsprite gMaliciousMoonsaultRedFlySpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x150 call MaliciousMoonsaultFireSpin createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x5, 0x0, 0xa, 0x0000 @ target darkens - delay 0x1a + delay 26 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gMaliciousMoonsaultRedBounceSpriteTemplate, ANIM_TARGET, 3 - delay 0x7 + delay 7 createsprite gMaliciousMoonsaultRedImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 call MaliciousMoonsaultExplosion - delay 0x6 + delay 6 call MaliciousMoonsaultExplosion createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ fade all to red - delay 0x6 + delay 6 call MaliciousMoonsaultExplosion createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish @@ -34185,29 +34185,29 @@ gBattleAnimMove_MaliciousMoonsault:: end MaliciousMoonsaultFireSpin: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 return MaliciousMoonsaultExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -34217,7 +34217,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -34225,7 +34225,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -34233,7 +34233,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -34241,7 +34241,7 @@ MaliciousMoonsaultExplosion: createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gMaliciousMoonsaultFireblastSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe @@ -34264,11 +34264,11 @@ gBattleAnimMove_OceanicOperetta:: loadspritegfx ANIM_TAG_WATER_ORB @blue playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call OceanicOperettaBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call OceanicOperettaBuffEffect - delay 0x8 + delay 8 call OceanicOperettaBuffEffect waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -34282,111 +34282,111 @@ gBattleAnimMove_OceanicOperetta:: loadspritegfx ANIM_TAG_THIN_RING invisible ANIM_ATTACKER createsprite gOceanOperaBlueChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @charge - delay 0x2 + delay 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 80, 1 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 playsewithpan SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gOceanOperaBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gWhirlpoolSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x1a + delay 26 visible ANIM_TARGET loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x5 createsprite gOceanOperaMovingOrbsSpriteTemplate, ANIM_ATTACKER, 50, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0 @mist ball - delay 0x5c + delay 92 visible ANIM_ATTACKER - delay 0x0 + delay 0 loopsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET, 0x14, 0x1 createsprite gOceanOperaBlueOrbsSpriteTemplate, ANIM_ATTACKER, 50, 0x0, ANIM_TARGET, 0x0, 0x0, 0x0, 0x35 - delay 0x5 + delay 5 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x4 + delay 4 createsprite gOceanOperaExpandingRingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 - delay 0x10 + delay 16 loadspritegfx ANIM_TAG_EXPLOSION @explosion loadspritegfx ANIM_TAG_SPARKLE_2 @sparkle loadspritegfx ANIM_TAG_RAIN_DROPS @rain @@ -34408,33 +34408,33 @@ gBattleAnimMove_OceanicOperetta:: end OceanicOperettaBuffEffect: createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gOceanOperaBlueFlareSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return OceanicOperettaExplosion: createsprite gOceanOperaSparkleSpriteTemplate, ANIM_ATTACKER, 51, 0xfff1, 0x0, ANIM_TARGET, 0x0, 0x20, 0x3c playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gOceanOperaSparkleSpriteTemplate, ANIM_ATTACKER, 51, 0xc, 0xfffb, ANIM_TARGET, 0x0, 0x20, 0x3c - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gOceanOperaExplosionSpriteTemplate, ANIM_ATTACKER, 51, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@ -34463,18 +34463,18 @@ SplinteredStormshardsFinishFade: SplinteredStormshardsByPlayer: loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET, 0x10, 0xc call SplinteredStormshardsPlayer_Rising1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSplinteredShardsFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 call SplinteredStormshardsPlayer_Rising1 call SplinteredStormshardsPlayer_Rising2 visible ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 - delay 0x2 + delay 2 call SplinteredStormshardsPlayer_Rising2 call SplinteredStormshardsPlayer_Rising1 delay 16 @@ -34484,18 +34484,18 @@ SplinteredStormshardsByPlayer: loadspritegfx ANIM_TAG_EXPLOSION @explosion playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x1, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 call SplinteredStormshardsExplosionOpponent call SplinteredStormshardsExplosionOpponent SplinteredStormshardsEnd: @@ -34514,48 +34514,48 @@ SplinteredStormshardsExplosionOpponent: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xfff8, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterOpponentShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 return SplinteredStormshardsByOpponent: loopsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET 0x10 0xc call SplinteredStormshardsOpponent_Rising1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_ROUND_SHADOW @fly createsprite gSplinteredShardsFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 call SplinteredStormshardsOpponent_Rising1 call SplinteredStormshardsOpponent_Rising2 visible ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 - delay 0x2 + delay 2 call SplinteredStormshardsOpponent_Rising2 call SplinteredStormshardsOpponent_Rising1 delay 16 @@ -34564,17 +34564,17 @@ SplinteredStormshardsByOpponent: loadspritegfx ANIM_TAG_EXPLOSION @explosion playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 96, 1 @shake target up and down createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x30, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 - delay 0x4 + delay 4 + delay 4 call SplinteredStormshardsExplosionOnPlayer call SplinteredStormshardsExplosionOnPlayer goto SplinteredStormshardsEnd @@ -34582,106 +34582,106 @@ SplinteredStormshardsExplosionOnPlayer: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x20, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x35, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x1c, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerShallowSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x16, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 createsprite gSplinteredShardsSplinterPlayerSteepSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0x2d, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - delay 0x2 + delay 2 return SplinteredStormshardsBrownExplode: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSplinteredShardsExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return SplinteredStormshardsPlayer_Rising1: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x24, 0x80, 0x24, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x10, 0x80, 0x10, 0x35, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x45, 0x80, 0x45, 0x3a, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x60, 0x80, 0x60, 0x30, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x30, 0x80, 0x30, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x55, 0x80, 0x55, 0x33, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsPlayer_Rising2: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x29, 0x80, 0x29, 0x31, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x73, 0x80, 0x73, 0x32, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x4a, 0x80, 0x4a, 0x3c, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x64, 0x80, 0x64, 0x33, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x2c, 0x80, 0x2c, 0x3d, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x6c, 0x80, 0x6c, 0x30, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsOpponent_Rising1: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x94, 0x40, 0x94, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x80, 0x40, 0x80, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xb5, 0x40, 0xb5, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd0, 0x40, 0xd0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xa0, 0x40, 0xa0, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xc5, 0x40, 0xc5, 0x0, 0x30 - delay 0x2 + delay 2 return SplinteredStormshardsOpponent_Rising2: createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x99, 0x40, 0x99, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xe3, 0x40, 0xe3, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xba, 0x40, 0xba, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xd4, 0x40, 0xd4, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0x9c, 0x40, 0x9c, 0x0, 0x30 - delay 0x2 + delay 2 createsprite gSplinteredShardsRisingSpearSpriteTemplate, ANIM_ATTACKER, 50, 0xdc, 0x40, 0xdc, 0x0, 0x30 - delay 0x2 + delay 2 return @@ -34696,43 +34696,43 @@ gBattleAnimMove_LetsSnuggleForever:: createsprite gSnuggleForeverHeartSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x14 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x1, 0x0 - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x3, 0x3, 0x80 - delay 0x8 + delay 8 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0x0, 0x80 - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0x1, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER - delay 0x7 + delay 7 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x3, 0x0 - delay 0x7 + delay 7 fadetobg BG_SNUGGLE_FOREVER waitbgfadeout invisible ANIM_ATTACKER - delay 0x1 + delay 1 setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER waitforvisualfinish setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x10 + delay 16 playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears - delay 0x8 + delay 8 call LetsSnuggleForeverTears waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x0000 @@ -34741,10 +34741,10 @@ gBattleAnimMove_LetsSnuggleForever:: playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xa, 0xfff2 createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xfff6, 0xfff2 - delay 0x20 + delay 32 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x10, 0x579D createvisualtask AnimTask_GrowTarget, 0x5 - delay 0x5 + delay 5 loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_PAIN_SPLIT @painsplit loadspritegfx ANIM_TAG_DUCK @duck @@ -34762,17 +34762,17 @@ gBattleAnimMove_LetsSnuggleForever:: createvisualtask AnimTask_TranslateMonElliptical, 0x2, 0x0, 0xffee, 0x6, 0x6, 0x4 createvisualtask AnimTask_TranslateMonElliptical, 0x2, 0x1, 0x12, 0x6, 0x6, 0x4 call LetsSnuggleForeverStars_1 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts call LetsSnuggleForeverStars_2 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts call LetsSnuggleForeverStars_1 - delay 0x0 + delay 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x7fff playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET call LetsSnuggleForeverStars_2 - delay 0x0 + delay 0 call LetsSnuggleForeverImpacts invisible ANIM_TARGET stopsound @@ -34783,17 +34783,17 @@ LetsSnuggleForeverTears: playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_TARGET createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1 - delay 0x8 + delay 8 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x2 createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x3 return LetsSnuggleForeverImpacts: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -12, ANIM_TARGET, 0 - delay 0x8 + delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 8, ANIM_TARGET, 0 - delay 0x8 + delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 0, ANIM_TARGET, 0 - delay 0x8 + delay 8 return LetsSnuggleForeverStars_1: createsprite gSnuggleForeverStarSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff8, 0xa0, 0xffe0 @@ -34844,13 +34844,13 @@ gBattleAnimMove_ClangorousSoulblaze:: loadspritegfx ANIM_TAG_ROUND_SHADOW @ fly playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gClangoorousSoulblazeWhiteFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x2 + delay 2 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFFE0, 0x1, 0xffff createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 10, 0, 42 createsprite gSlideMonToOffsetPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0xa, 0x0, 0x2a - delay 0x20 + delay 32 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x20, 0x1, 0xffff - delay 0xC + delay 12 setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge @@ -34873,20 +34873,20 @@ gBattleAnimMove_ClangorousSoulblaze:: clearmonbg ANIM_ATTACKER invisible ANIM_ATTACKER invisible ANIM_ATK_PARTNER - delay 0x0 + delay 0 monbg ANIM_TARGET playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER createsprite gClangoorousSoulblazePulseSpriteTemplate, ANIM_ATTACKER, 2, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0 createsprite gSlowFlyingMusicNotesSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x0 @music note - delay 0x5 + delay 5 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 2, 60 createvisualtask AnimTask_HorizontalShake, 5, ANIM_DEF_PARTNER, 2, 60 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_4 loadspritegfx ANIM_TAG_EXPLOSION createvisualtask AnimTask_IsTargetPlayerSide, 0x2 @@ -34894,148 +34894,148 @@ gBattleAnimMove_ClangorousSoulblaze:: ClangorousSoulblazeOnPlayer: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0xfff0, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x20, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x30, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x35, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x40, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x40, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x45, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x50, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x50, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x60, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x60, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x65, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x65, 0xffe0, ANIM_ATTACKER, 0x1 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x10, 0x10, ANIM_TARGET, 0x1 goto FINISH_SOULBLAZE ClangorousSoulblazeOnOpponent: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x15, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 call ClangorousSoulblazePulse_5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x0, ANIM_ATTACKER, 0x1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x5, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x30, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x30, 0x15, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x35, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x40, 0xa, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x40, 0x0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x45, 0x10, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x50, 0x30, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x50, 0x25, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x60, 0x40, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x60, 0x45, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x65, 0x35, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x65, 0x40, ANIM_ATTACKER, 0x1 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_4 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_5 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_1 - delay 0x5 + delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 call ClangorousSoulblazePulse_2 - delay 0x5 + delay 5 createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 FINISH_SOULBLAZE: waitforvisualfinish clearmonbg ANIM_TARGET - delay 0x5 + delay 5 call ResetFromWhiteScreen blendoff createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -35045,32 +35045,32 @@ FINISH_SOULBLAZE: ClangorousSoulblazeEnergySwirl: createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x180, 0x32, 0x8, 0x32, ANIM_ATTACKER createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0xf0, 0x28, 0xb, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1a0, 0x28, 0x4, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x120, 0x2d, 0x6, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x1c0, 0x2d, 0xb, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gClangoorousSoulblazePurpleSwirlSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x32, 0xa, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 return ClangorousSoulblazeBuffEffect: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createsprite gClangorousSoulBlueBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gClangorousSoulPurpleBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c - delay 0x4 + delay 4 createsprite gClangorousSoulWhiteBuffTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c return ClangorousSoulblazePulse_1: @@ -35113,32 +35113,32 @@ gBattleAnimMove_GuardianOfAlola:: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 call GuardianOfAlolaRocksPlayer waitforvisualfinish - delay 0xa + delay 10 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer - delay 0xa + delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 call GuardianOfAlolaRocksPlayer waitforvisualfinish - delay 0xa - delay 0x10 + delay 10 + delay 16 call GuardianOfAlolaRocksPlayer createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0xC, 0xC, 0x277f @;Yellow createvisualtask AnimTask_NightShadeClone, 0x5, 0x75 - delay 0x10 + delay 16 call GuardianOfAlolaRocksPlayer - delay 0x10 + delay 16 call GuardianOfAlolaRocksPlayer - delay 0x10 + delay 16 loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST call GuardianOfAlolaRocksPlayer createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x3, 0x0, 0xb, 0x0000 - delay 0x1 + delay 1 createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_HORSESHOE_SIDE_FIST, 0x0, 0xC, 0xc, 0x277f fadetobg BG_FISSURE waitbgfadeout @@ -35147,7 +35147,7 @@ gBattleAnimMove_GuardianOfAlola:: waitbgfadein playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gGuardianOfAlolaFistSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffd0, 0x1f - delay 0x24 + delay 36 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0xb, 0x0, 0x0000 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 0x25 @@ -35188,13 +35188,13 @@ GuardianOfAlolaRocksTarget: return GuardianOfAlolaRockGeyser: createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0xfffc, 0x10 @ -4, -0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0x100D, 0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0x4, 0x10 - delay 0x0 + delay 0 createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0xfff0, 0x10 - delay 0x0 + delay 0 return @@ -35207,12 +35207,12 @@ gBattleAnimMove_SearingSunrazeSmash:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x001b playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SearingSunrazeSmashFlare - delay 0x8 + delay 8 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_WHITE createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SearingSunrazeSmashFlare - delay 0x8 + delay 8 call SearingSunrazeSmashFlare waitforvisualfinish unloadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy @@ -35223,28 +35223,28 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gSearingSunrazeSmashGrowWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call SearingSunrazeSmashRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call SearingSunrazeSmashRingsInward - delay 0xD + delay 13 invisible ANIM_TARGET createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashWhiteRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x6 + delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 @superpower createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER fadetobg BG_COSMIC waitbgfadeout @@ -35293,30 +35293,30 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_CUT @cut createsprite gSunsteelStrikeSuperpowerTemplate, ANIM_TARGET, 2, 0x14 SearingSunrazeSmashImpact: - delay 0x8 - delay 0x1 + delay 8 + delay 1 unloadspritegfx ANIM_TAG_GOLD_RING @beam createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 60 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x20, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x20, 0xffe0, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x1c, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x1c, 0xffe0, 0x1 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x2c, 0xffe0, 0x0 - delay 0x2 + delay 2 playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashWhiteCutSpriteTemplate, ANIM_TARGET, 2, 0x2c, 0xffe0, 0x1 - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_CROSS_IMPACT @x - delay 0x0 + delay 0 unloadspritegfx ANIM_TAG_METEOR @superpower unloadspritegfx ANIM_TAG_DRAGON_ASCENT @dragon ascent 1 unloadspritegfx ANIM_TAG_DRAGON_ASCENT_FOE @dragon ascent 2 @@ -35328,7 +35328,7 @@ SearingSunrazeSmashImpact: playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x0000 createsprite gSearingSunrazeSmashShockwaveSpriteTemplate, ANIM_TARGET, 2 @ charge out and in - delay 0x1c + delay 28 invisible ANIM_TARGET unloadspritegfx ANIM_TAG_CUT @cut unloadspritegfx ANIM_TAG_CROSS_IMPACT @x @@ -35341,30 +35341,30 @@ SearingSunrazeSmashImpact: call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno waitforvisualfinish - delay 0x10 + delay 16 call ResetFromRedScreen end SearingSunrazeSmashFlare: createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return SearingSunrazeSmashRingsInward: createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashWhiteRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gSearingSunrazeSmashBlueRingInwardsSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 return SearingSunrazeSmashInferno: playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER @@ -35373,45 +35373,45 @@ SearingSunrazeSmashInferno: createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0xfffe, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xa, 0x0, 0xfffe createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0xfffe, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x2, 0x0 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0xfffe, 0x2 createsprite gFireBlastCrossSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xf, 0x2, 0x2 - delay 0x3 + delay 3 return SearingSunrazeSmashCharge: createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2f, 0x490, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x2c, 0x500, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x30, 0x4e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x4d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x1 + delay 1 createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x31, 0x540, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x1 + delay 1 return ResetFromRedScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA @@ -35439,12 +35439,12 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x40c0 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromFlare - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 12, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call MenacingMoonrazeMaelstromFlare playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - delay 0x8 + delay 8 call MenacingMoonrazeMaelstromFlare waitforvisualfinish unloadspritegfx ANIM_TAG_SPARKLE_2 @sparkles @@ -35452,28 +35452,28 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x10 + delay 16 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) - delay 0x2 + delay 2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET createvisualtask AnimTask_RotateMonSpriteToSide, 2, 80, -1024, ANIM_TARGET, 0 @ spin up target call MenacingMoonrazeMaelstromRingsInward createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x30 @ target back to origin (slowly) call MenacingMoonrazeMaelstromRingsInward - delay 0xD + delay 13 invisible ANIM_TARGET createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromWhiteRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x6 + delay 6 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 @lunge forward playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER - delay 0x2 + delay 2 invisible ANIM_ATTACKER createsprite gMoonrazeMaelstromSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 @superpower createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER fadetobg BG_COSMIC waitbgfadeout @@ -35489,7 +35489,7 @@ MenacingMoonrazeMaelstromFinish: invisible ANIM_TARGET waitbgfadein visible ANIM_ATTACKER - delay 0x2 + delay 2 visible ANIM_TARGET waitforvisualfinish loadspritegfx ANIM_TAG_POISON_BUBBLE @poison bubble @@ -35554,67 +35554,67 @@ MenacingMoonrazeMaelstromFinish: MenacingMoonrazeMaelstromExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return MenacingMoonrazeMaelstromFlare: createsprite gMoonrazeMaelstromBlackSparklesSpriteTemplate, ANIM_ATTACKER, 2, 0xfff1, 0x0, 0x0, 0x0, 0x20, 0x3c createsprite gMoonrazeMaelstromBlueBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlueBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackSparklesSpriteTemplate, ANIM_ATTACKER, 2, 0xc, 0xfffb, 0x0, 0x0, 0x20, 0x3c createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gMoonrazeMaelstromBlackBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return MenacingMoonrazeMaelstromRingsInward: createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromWhiteRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 createsprite gMoonrazeMaelstromBlueRingSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, ANIM_TARGET, 0x0 - delay 0x8 + delay 8 return MenacingMoonrazeMaelstromChargeUp: createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromBlackOrbsSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_ATTACKER - delay 0x2 + delay 2 createsprite gMoonrazeMaelstromPurpleBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return MenacingMoonrazeMaelstromBeam: createsprite gMoonrazeMaelstromBeamSpriteTemplate, ANIM_TARGET, 2 createsprite gMoonrazeMaelstromBeamSpriteTemplate, ANIM_TARGET, 2 - delay 0x1 + delay 1 return @@ -35628,20 +35628,20 @@ gBattleAnimMove_LightThatBurnsTheSky:: loadspritegfx ANIM_TAG_FOCUS_ENERGY playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call EndureEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB(31, 31, 22) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call EndureEffect - delay 0x8 + delay 8 call EndureEffect - delay 0x8 + delay 8 unloadspritegfx ANIM_TAG_FOCUS_ENERGY monbg ANIM_ATTACKER setalpha 12, 8 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker - delay 0x1e + delay 30 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0xe, 0xa createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 3, 0x0 call LightThatBurnsTheSkyGreenSparks @@ -35653,7 +35653,7 @@ gBattleAnimMove_LightThatBurnsTheSky:: call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks - delay 0xe + delay 14 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x4, 0x0000 clearmonbg ANIM_ATTACKER blendoff @@ -35662,17 +35662,17 @@ gBattleAnimMove_LightThatBurnsTheSky:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xfff0, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0xffe4, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x1 + delay 1 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x20, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0x60, 0x8, 0x1, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 - delay 0x6 + delay 6 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 60 unloadspritegfx ANIM_TAG_LEAF @green unloadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge @@ -35692,7 +35692,7 @@ gBattleAnimMove_LightThatBurnsTheSky:: call LightThatBurnsTheSkyBlast_3 clearmonbg ANIM_TARGET waitforvisualfinish - delay 0x10 + delay 16 createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x0, 0x10, 0x0, 0x43FF restorebg waitbgfadeout @@ -35730,38 +35730,38 @@ LightThatBurnsTheSkyBlast_3: LightThatBurnsTheSkyGeyser: createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0x0005, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xfff1, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xfffb, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0012, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0x0005, 0x1, 0x0 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffe1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffeb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0x0002, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xfff5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0003, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfff5, 0xffd1, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0008, 0xffdb, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0xfffa, 0xfff2, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 createsprite gLightThatBurnsTheSkyExplosionSpriteTemplate, ANIM_TARGET, 4, 0x0000, 0xffe5, ANIM_TARGET, 0x0 - delay 0x0 + delay 0 return LightThatBurnsTheSkyGreenSparks: createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -35772,7 +35772,7 @@ LightThatBurnsTheSkyGreenSparks: createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x40, 0x28, 0x1, 0x3 createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x80, 0x28, 0x0, 0x3 createsprite gLightThatBurnsTheSkyGreenSparkSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x15, 0x2c, 0x0, 0x28, 0x2, 0x3 - delay 0x10 + delay 16 return @@ -35794,7 +35794,7 @@ gBattleAnimMove_SoulStealing7StarStrike:: createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 66, 0x14, 0xa, 0x18, 0x0, 0x0, 0x0 createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x18, 0x0, 0x0, 0x0 createsprite gSoulStealBlastburnSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xa, 0x18, 0x0, 0x0, 0x0 - delay 0x5 + delay 5 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSoulStealBlackFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish @@ -35805,58 +35805,58 @@ gBattleAnimMove_SoulStealing7StarStrike:: loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SoulStealingSevenStarStrikeBuffEffect - delay 0x8 + delay 8 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 2, 2, 0, 11, RGB_BLACK createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 call SoulStealingSevenStarStrikeBuffEffect - delay 0x8 + delay 8 call SoulStealingSevenStarStrikeBuffEffect - delay 0x4 + delay 4 visible ANIM_TARGET waitforvisualfinish unloadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_PAIN_SPLIT @pain split createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 37, 1 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x14, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, ANIM_TARGET, 0x2, 0x0, 0x0, 0x30 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x10, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, ANIM_TARGET, 0x12, 0x0, 0x0, 0x2c playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - delay 0x4 + delay 4 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x08, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xffeb, 0xfff8, 0x2, 0x0, 0x0, 0x28 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x12, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfffb, 0xfff4, 0x2, 0x0, 0x0, 0x24 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x15, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x5, 0xfff8, 0x2, 0x0, 0x0, 0x20 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x0c, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfff0, 0x1, 0x2, 0x0, 0x0, 0x1c playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x13, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x1, 0x2, 0x0, 0x0, 0x18 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x0e, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0xfff0, 0x10, 0x2, 0x0, 0x0, 0x14 createsprite gSoulStealBlueFistSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0x12, 0x0, 0x0, 0xa, 0x1, 0x0, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealBlueStarSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x2, 0x0, 0x0, 0x10 - delay 0x4 + delay 4 playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gSoulStealBlackFlySpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x150 - delay 0x20 + delay 32 unloadspritegfx ANIM_TAG_PAIN_SPLIT unloadspritegfx ANIM_TAG_ROUND_SHADOW unloadspritegfx ANIM_TAG_HANDS_AND_FEET @@ -35865,9 +35865,9 @@ gBattleAnimMove_SoulStealing7StarStrike:: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 - delay 0x1c + delay 28 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0x10, 0x0000 - delay 0x1 + delay 1 createsprite gSoulStealZStarSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0x0 @@ -35886,7 +35886,7 @@ gBattleAnimMove_SoulStealing7StarStrike:: loadspritegfx ANIM_TAG_EXPLOSION @ explosion playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gTargetTwinkleSpriteTemplate, ANIM_TARGET, 13, 0x0, 0x0, ANIM_TARGET @detect star - delay 0xa + delay 10 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 32 call SoulStealingSevenStarStrikeExplosion call SoulStealingSevenStarStrikeExplosion @@ -35904,49 +35904,49 @@ gBattleAnimMove_SoulStealing7StarStrike:: end SoulStealingSevenStarStrikeBuffEffect: createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xe, 0x1c, 0x1 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0xa, 0x2 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1c, 0x1a, 0x3 - delay 0x4 + delay 4 createsprite gSoulStealIceBuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0x0, 0x1 return SoulStealingSevenStarStrikeBlueParalysis: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfffb, 0xa, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xf, 0x14, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x19, 0x0, 0x5, 0x1 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 - delay 0x2 + delay 2 createsprite gSoulStealBlueParalyzeSpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 return SoulStealingSevenStarStrikeExplosion: playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x18, 0xffe8, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0xffe8, 0xfff4, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSoulStealExplosionSpriteTemplate, ANIM_TARGET, 3, 0x10, 0x10, ANIM_TARGET, 0x1 - delay 0x6 + delay 6 return @@@@@@@@@@ MAX MOVES @@@@@@@@@@ From ec15948ea8666a85d2878f0e743588b8e0a10150 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 1 Jun 2025 20:59:00 +0200 Subject: [PATCH 027/248] Put the gen 1 compression tests behind a config (#7033) Co-authored-by: Hedara --- test/compression/smol.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/compression/smol.c b/test/compression/smol.c index 90792eb6c9..8416519863 100644 --- a/test/compression/smol.c +++ b/test/compression/smol.c @@ -8,6 +8,8 @@ #include "config/test.h" #include "config/general.h" +#define ENABLE_ALL_COMPRESSION_TESTS FALSE + #ifdef NDEBUG void CycleCountStart(); u32 CycleCountEnd(); @@ -1073,6 +1075,7 @@ TEST("Compression test: table generation 32 32") EXPECT_EQ(areEqual, TRUE); } +#if ENABLE_ALL_COMPRESSION_TESTS TEST("Compression test: Bulbasaur Smol") { static const u32 origFile[] = INCBIN_U32("graphics/pokemon/bulbasaur/anim_front.4bpp"); @@ -6221,6 +6224,7 @@ TEST("Compression test: Mew fastSmol") bool32 areEqual = DecompressImgPrintResults(compFile, origFile, "Mew", COMPRESSION_FASTSMOL, sizeof(compFile)); EXPECT_EQ(areEqual, TRUE); } +#endif // ENABLE_ALL_COMPRESSION_TESTS TEST("Compression test: tilemap small smolTM") { From 5502fe2c5e1f80a4a933fbfaffd2c6f88b4fa9f0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Jun 2025 15:10:24 -0400 Subject: [PATCH 028/248] `GetBattlerMon` cleanup (#6967) --- src/battle_gfx_sfx_util.c | 9 +---- src/battle_interface.c | 16 ++++---- src/battle_script_commands.c | 76 +++++++++++++++++++----------------- src/battle_util.c | 7 +--- src/battle_util2.c | 11 +----- src/recorded_battle.c | 13 +++--- src/reshow_battle_screen.c | 16 +++++--- 7 files changed, 70 insertions(+), 78 deletions(-) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d05a9bf86a..ca9bfb3d06 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -866,15 +866,8 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battler) } break; case 5: - if (IsOnPlayerSide(*battler)) - { - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], GetBattlerMon(*battler), HEALTHBOX_ALL); - } - else - { + if (!IsOnPlayerSide(*battler) || !(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], GetBattlerMon(*battler), HEALTHBOX_ALL); - } SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battler]); (*battler)++; if (*battler == gBattlersCount) diff --git a/src/battle_interface.c b/src/battle_interface.c index 80c85bb141..92592d9fcb 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1175,12 +1175,13 @@ void SwapHpBarsWithHpText(void) for (i = 0; i < gBattlersCount; i++) { + struct Pokemon *mon = GetBattlerMon(i); if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy && IsOnPlayerSide(i) && (GetBattlerCoordsIndex(i) != BATTLE_COORDS_SINGLES || !IsOnPlayerSide(i))) { - s32 currHp = GetMonData(GetBattlerMon(i), MON_DATA_HP); - s32 maxHp = GetMonData(GetBattlerMon(i), MON_DATA_MAX_HP); + s32 currHp = GetMonData(mon, MON_DATA_HP); + s32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); bool8 noBars; gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1; @@ -1202,7 +1203,7 @@ void SwapHpBarsWithHpText(void) else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_HEALTH_BAR); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_HEALTH_BAR); CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_FRAME_END_BAR), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 32); } } @@ -1213,7 +1214,7 @@ void SwapHpBarsWithHpText(void) if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { // Most likely a debug function. - PrintSafariMonInfo(gHealthboxSpriteIds[i], GetBattlerMon(i)); + PrintSafariMonInfo(gHealthboxSpriteIds[i], mon); } else { @@ -1226,9 +1227,9 @@ void SwapHpBarsWithHpText(void) else // text to bars { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_HEALTH_BAR); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_HEALTH_BAR); if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - UpdateHealthboxAttribute(gHealthboxSpriteIds[i], GetBattlerMon(i), HEALTHBOX_NICK); + UpdateHealthboxAttribute(gHealthboxSpriteIds[i], mon, HEALTHBOX_NICK); } } gSprites[gHealthboxSpriteIds[i]].hMain_Data7 ^= 1; @@ -1805,9 +1806,9 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) battler = gSprites[healthboxSpriteId].hMain_Battler; healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; + status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); if (IsOnPlayerSide(battler)) { - status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); switch (GetBattlerCoordsIndex(battler)) { case BATTLE_COORDS_SINGLES: @@ -1820,7 +1821,6 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) } else { - status = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS); tileNumAdder = 0x11; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1563b17bd2..98050a8a94 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10158,10 +10158,7 @@ static void Cmd_various(void) case VARIOUS_UPDATE_NICK: { VARIOUS_ARGS(); - if (IsOnPlayerSide(battler)) - mon = GetBattlerMon(battler); - else - mon = GetBattlerMon(battler); + mon = GetBattlerMon(battler); UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_NICK); break; } @@ -15848,7 +15845,8 @@ static void Cmd_handleballthrow(void) MarkBattlerForControllerExec(gBattlerAttacker); TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_POKEBALL, &ballId); + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; @@ -15857,15 +15855,15 @@ static void Cmd_handleballthrow(void) if (ballId == BALL_HEAL) { - MonRestorePP(GetBattlerMon(gBattlerTarget)); - HealStatusConditions(GetBattlerMon(gBattlerTarget), STATUS1_ANY, gBattlerTarget); + MonRestorePP(caughtMon); + HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); + SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); } else if (ballId == BALL_FRIEND) { u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_FRIENDSHIP, &friendship); + SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); } } else // mon may be caught, calculate shakes @@ -15907,7 +15905,8 @@ static void Cmd_handleballthrow(void) TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_POKEBALL, &ballId); + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; @@ -15916,15 +15915,15 @@ static void Cmd_handleballthrow(void) if (ballId == BALL_HEAL) { - MonRestorePP(GetBattlerMon(gBattlerTarget)); - HealStatusConditions(GetBattlerMon(gBattlerTarget), STATUS1_ANY, gBattlerTarget); + MonRestorePP(caughtMon); + HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); + SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); } else if (ballId == BALL_FRIEND) { u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_FRIENDSHIP, &friendship); + SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); } } else // not caught @@ -16042,26 +16041,28 @@ static void Cmd_givecaughtmon(void) } break; case GIVECAUGHTMON_GIVE_AND_SHOW_MSG: + { + struct Pokemon *caughtMon = GetBattlerMon(GetCatchingBattler()); if (B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) { u16 lostItem = gBattleStruct->itemLost[B_SIDE_OPPONENT][gBattlerPartyIndexes[GetCatchingBattler()]].originalItem; if (lostItem != ITEM_NONE && GetItemPocket(lostItem) != POCKET_BERRIES) - SetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items + SetMonData(caughtMon, MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items } - if (GiveMonToPlayer(GetBattlerMon(GetCatchingBattler())) != MON_GIVEN_TO_PARTY + if (GiveMonToPlayer(caughtMon) != MON_GIVEN_TO_PARTY && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) { if (!ShouldShowBoxWasFullMessage()) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gStringVar2); + GetMonData(caughtMon, MON_DATA_NICKNAME, gStringVar2); } else { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gStringVar2); + GetMonData(caughtMon, MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; } @@ -16071,9 +16072,9 @@ static void Cmd_givecaughtmon(void) gBattleCommunication[MULTISTRING_CHOOSER]++; } - gBattleResults.caughtMonSpecies = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); - GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_POKEBALL, NULL); + gBattleResults.caughtMonSpecies = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); + GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(caughtMon, MON_DATA_POKEBALL, NULL); gSelectedMonPartyId = PARTY_SIZE; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -16084,14 +16085,16 @@ static void Cmd_givecaughtmon(void) gBattlescriptCurrInstr = cmd->nextInstr; break; } + } } static void Cmd_trysetcaughtmondexflags(void) { CMD_ARGS(const u8 *failInstr); - u32 species = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_PERSONALITY, NULL); + struct Pokemon *caughtMon = GetBattlerMon(GetCatchingBattler()); + u32 species = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL); if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { @@ -16108,7 +16111,8 @@ static void Cmd_displaydexinfo(void) { CMD_ARGS(); - u16 species = GetMonData(GetBattlerMon(GetCatchingBattler()), MON_DATA_SPECIES, NULL); + struct Pokemon *mon = GetBattlerMon(GetCatchingBattler()); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); switch (gBattleCommunication[0]) { @@ -16119,7 +16123,6 @@ static void Cmd_displaydexinfo(void) case 1: if (!gPaletteFade.active) { - struct Pokemon *mon = GetBattlerMon(GetCatchingBattler()); FreeAllWindowBuffers(); gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(species, GetMonData(mon, MON_DATA_IS_SHINY), @@ -16275,14 +16278,15 @@ static void Cmd_trygivecaughtmonnick(void) case 2: if (!gPaletteFade.active) { - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); MainCallback callback = CalculatePlayerPartyCount() == PARTY_SIZE ? ReshowBlankBattleScreenAfterMenu : BattleMainCB2; DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_SPECIES), - GetMonGender(GetBattlerMon(gBattlerTarget)), - GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_PERSONALITY, NULL), + GetMonData(caughtMon, MON_DATA_SPECIES), + GetMonGender(caughtMon), + GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL), callback); gBattleCommunication[MULTIUSE_STATE]++; @@ -17674,24 +17678,26 @@ static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 { if (evolutions[i].params[j].condition == evolutionCondition) { + struct Pokemon *monAtk = GetBattlerMon(gBattlerAttacker); + struct Pokemon *monDef = GetBattlerMon(gBattlerTarget); // We only have 10 bits to use - u16 val = min(1023, GetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER) + upAmount); + u16 val = min(1023, GetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER) + upAmount); // Reset progress if you faint for the recoil method. switch (evolutionCondition) { case IF_USED_MOVE_X_TIMES: if (evolutions[i].params[j].arg1 == usedMove) - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); break; case IF_RECOIL_DAMAGE_GE: if (gBattleMons[gBattlerAttacker].hp == 0) val = 0; - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); break; case IF_DEFEAT_X_WITH_ITEMS: - if (GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_SPECIES) == evolutions[i].params[j].arg1 - && GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) - SetMonData(GetBattlerMon(gBattlerAttacker), MON_DATA_EVOLUTION_TRACKER, &val); + if (GetMonData(monDef, MON_DATA_SPECIES) == evolutions[i].params[j].arg1 + && GetMonData(monDef, MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); break; } return; diff --git a/src/battle_util.c b/src/battle_util.c index d0f5544645..668574af18 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10194,12 +10194,7 @@ bool32 TryClearIllusion(u32 battler, u32 caseID) struct Pokemon *GetIllusionMonPtr(u32 battler) { if (gBattleStruct->illusion[battler].state == ILLUSION_NOT_SET) - { - if (IsOnPlayerSide(battler)) - SetIllusionMon(GetBattlerMon(battler), battler); - else - SetIllusionMon(GetBattlerMon(battler), battler); - } + SetIllusionMon(GetBattlerMon(battler), battler); if (gBattleStruct->illusion[battler].state != ILLUSION_ON) return NULL; diff --git a/src/battle_util2.c b/src/battle_util2.c index 607aebfba6..ba8db66f5d 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -95,17 +95,10 @@ void AdjustFriendshipOnBattleFaint(u8 battler) opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } - if (gBattleMons[opposingBattlerId].level > gBattleMons[battler].level) - { - if (gBattleMons[opposingBattlerId].level - gBattleMons[battler].level > 29) - AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_LARGE); - else - AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_SMALL); - } + if (gBattleMons[opposingBattlerId].level - gBattleMons[battler].level > 29) + AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_LARGE); else - { AdjustFriendship(GetBattlerMon(battler), FRIENDSHIP_EVENT_FAINT_SMALL); - } } void SwitchPartyOrderInGameMulti(u8 battler, u8 arg1) diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 52f9be63b5..2d9556311f 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -758,25 +758,26 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { + struct Pokemon *mon = GetBattlerMon(battler); for (j = 0; j < MAX_MON_MOVES; j++) - ppBonuses[j] = (GetMonData(GetBattlerMon(battler), MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); + ppBonuses[j] = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); for (j = 0; j < MAX_MON_MOVES; j++) { - movePp.moves[j] = GetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + moveSlots[j], NULL); - movePp.currentPp[j] = GetMonData(GetBattlerMon(battler), MON_DATA_PP1 + moveSlots[j], NULL); + movePp.moves[j] = GetMonData(mon, MON_DATA_MOVE1 + moveSlots[j], NULL); + movePp.currentPp[j] = GetMonData(mon, MON_DATA_PP1 + moveSlots[j], NULL); movePp.maxPp[j] = ppBonuses[moveSlots[j]]; } for (j = 0; j < MAX_MON_MOVES; j++) { - SetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + j, &movePp.moves[j]); - SetMonData(GetBattlerMon(battler), MON_DATA_PP1 + j, &movePp.currentPp[j]); + SetMonData(mon, MON_DATA_MOVE1 + j, &movePp.moves[j]); + SetMonData(mon, MON_DATA_PP1 + j, &movePp.currentPp[j]); } ppBonusSet = 0; for (j = 0; j < MAX_MON_MOVES; j++) ppBonusSet |= movePp.maxPp[j] << (j << 1); - SetMonData(GetBattlerMon(battler), MON_DATA_PP_BONUSES, &ppBonusSet); + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonusSet); } gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index d46ef692cc..39cb711c86 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -302,17 +302,19 @@ void CreateBattlerSprite(u32 battler) if (!IsOnPlayerSide(battler)) { - if (GetMonData(GetBattlerMon(battler), MON_DATA_HP) == 0) + struct Pokemon *mon = GetBattlerMon(battler); + if (GetMonData(mon, MON_DATA_HP) == 0) return; if (gBattleScripting.monCaught) // Don't create opponent sprite if it has been caught. return; + u32 species = GetMonData(mon, MON_DATA_SPECIES); - SetMultiuseSpriteTemplateToPokemon(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES), GetBattlerPosition(battler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; - gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); + gSprites[gBattlerSpriteIds[battler]].data[2] = species; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); } @@ -338,15 +340,17 @@ void CreateBattlerSprite(u32 battler) } else { - if (!IsValidForBattle(GetBattlerMon(battler))) + struct Pokemon *mon = GetBattlerMon(battler); + if (!IsValidForBattle(mon)) return; + u32 species = GetMonData(mon, MON_DATA_SPECIES); - SetMultiuseSpriteTemplateToPokemon(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES), GetBattlerPosition(battler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), posY, GetBattlerSpriteSubpriority(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; - gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); + gSprites[gBattlerSpriteIds[battler]].data[2] = species; StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); } From c5c7bb13c9d9fa4afa30873220437fe9945fd250 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 2 Jun 2025 15:54:37 +0200 Subject: [PATCH 029/248] Converts a bunch of defines to enums (#7041) --- include/battle_setup.h | 2 +- include/battle_tower.h | 4 +- include/constants/battle.h | 52 ++-- include/constants/form_change_types.h | 2 +- include/constants/map_types.h | 44 +-- include/constants/trade.h | 11 +- include/constants/trainers.h | 137 ++++---- include/data.h | 2 +- include/frontier_util.h | 2 +- include/overworld.h | 18 +- include/pokemon.h | 13 +- include/pokemon_animation.h | 378 ++++++++++++----------- include/trainer_hill.h | 2 +- src/battle_bg.c | 11 +- src/battle_main.c | 2 +- src/battle_script_commands.c | 1 - src/battle_setup.c | 5 +- src/battle_tower.c | 6 +- src/bike.c | 1 - src/data/pokemon/form_change_tables.h | 16 +- src/data/pokemon/trainer_class_lookups.h | 2 +- src/debug.c | 8 +- src/dexnav.c | 5 +- src/event_object_movement.c | 1 - src/field_control_avatar.c | 1 - src/field_effect.c | 1 - src/field_screen_effect.c | 4 +- src/field_specials.c | 1 - src/fldeff_flash.c | 5 +- src/fldeff_rocksmash.c | 1 - src/frontier_util.c | 2 +- src/item_use.c | 3 +- src/overworld.c | 31 +- src/pokemon.c | 10 +- src/pokemon_animation.c | 11 +- src/pokemon_sprite_visualizer.c | 2 +- src/pokenav_match_call_list.c | 2 +- src/region_map.c | 1 - src/scrcmd.c | 4 +- src/secret_base.c | 1 - src/trainer_hill.c | 2 +- test/battle/move_animations/all_anims.c | 4 +- 42 files changed, 410 insertions(+), 401 deletions(-) diff --git a/include/battle_setup.h b/include/battle_setup.h index 278ca6d9ce..7cddc06725 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -60,7 +60,7 @@ void BattleSetup_StartLatiBattle(void); void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); -u8 BattleSetup_GetEnvironmentId(void); +enum BattleEnvironment BattleSetup_GetEnvironmentId(void); u8 GetWildBattleTransition(void); u8 GetTrainerBattleTransition(void); u8 GetSpecialBattleTransition(s32 id); diff --git a/include/battle_tower.h b/include/battle_tower.h index dc118d0f21..5887c07d9b 100644 --- a/include/battle_tower.h +++ b/include/battle_tower.h @@ -49,7 +49,7 @@ void SetEReaderTrainerGfxId(void); u16 GetBattleFacilityTrainerGfxId(u16 trainerId); void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm); u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); -u8 GetFrontierOpponentClass(u16 trainerId); +enum TrainerClassID GetFrontierOpponentClass(u16 trainerId); void GetFrontierTrainerName(u8 *dst, u16 trainerId); void FillFrontierTrainerParty(u8 monsCount); void FillFrontierTrainersParties(u8 monsCount); @@ -60,7 +60,7 @@ void CalcEmeraldBattleTowerChecksum(struct EmeraldBattleTowerRecord *record); void CalcRubyBattleTowerChecksum(struct RSBattleTowerRecord *record); u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode); u8 GetEreaderTrainerFrontSpriteId(void); -u8 GetEreaderTrainerClassId(void); +enum TrainerClassID GetEreaderTrainerClassId(void); void GetEreaderTrainerName(u8 *dst); void ValidateEReaderTrainer(void); void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer); diff --git a/include/constants/battle.h b/include/constants/battle.h index 39f2dbd236..d8ade2adec 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -475,31 +475,33 @@ enum MoveEffects #define MOVE_EFFECT_CONTINUE 0x8000 // Battle environment defines for gBattleEnvironment. -#define BATTLE_ENVIRONMENT_GRASS 0 -#define BATTLE_ENVIRONMENT_LONG_GRASS 1 -#define BATTLE_ENVIRONMENT_SAND 2 -#define BATTLE_ENVIRONMENT_UNDERWATER 3 -#define BATTLE_ENVIRONMENT_WATER 4 -#define BATTLE_ENVIRONMENT_POND 5 -#define BATTLE_ENVIRONMENT_MOUNTAIN 6 -#define BATTLE_ENVIRONMENT_CAVE 7 -#define BATTLE_ENVIRONMENT_BUILDING 8 -#define BATTLE_ENVIRONMENT_PLAIN 9 -// New battle environments are used for Secret Power but not fully implemented. -#define BATTLE_ENVIRONMENT_SOARING 10 -#define BATTLE_ENVIRONMENT_SKY_PILLAR 11 -#define BATTLE_ENVIRONMENT_BURIAL_GROUND 12 -#define BATTLE_ENVIRONMENT_PUDDLE 13 -#define BATTLE_ENVIRONMENT_MARSH 14 -#define BATTLE_ENVIRONMENT_SWAMP 15 -#define BATTLE_ENVIRONMENT_SNOW 16 -#define BATTLE_ENVIRONMENT_ICE 17 -#define BATTLE_ENVIRONMENT_VOLCANO 18 -#define BATTLE_ENVIRONMENT_DISTORTION_WORLD 19 -#define BATTLE_ENVIRONMENT_SPACE 20 -#define BATTLE_ENVIRONMENT_ULTRA_SPACE 21 - -#define BATTLE_ENVIRONMENT_COUNT 22 +enum BattleEnvironment +{ + BATTLE_ENVIRONMENT_GRASS, + BATTLE_ENVIRONMENT_LONG_GRASS, + BATTLE_ENVIRONMENT_SAND, + BATTLE_ENVIRONMENT_UNDERWATER, + BATTLE_ENVIRONMENT_WATER, + BATTLE_ENVIRONMENT_POND, + BATTLE_ENVIRONMENT_MOUNTAIN, + BATTLE_ENVIRONMENT_CAVE, + BATTLE_ENVIRONMENT_BUILDING, + BATTLE_ENVIRONMENT_PLAIN, + // New battle environments are used for Secret Power but not fully implemented. + BATTLE_ENVIRONMENT_SOARING, + BATTLE_ENVIRONMENT_SKY_PILLAR, + BATTLE_ENVIRONMENT_BURIAL_GROUND, + BATTLE_ENVIRONMENT_PUDDLE, + BATTLE_ENVIRONMENT_MARSH, + BATTLE_ENVIRONMENT_SWAMP, + BATTLE_ENVIRONMENT_SNOW, + BATTLE_ENVIRONMENT_ICE, + BATTLE_ENVIRONMENT_VOLCANO, + BATTLE_ENVIRONMENT_DISTORTION_WORLD, + BATTLE_ENVIRONMENT_SPACE, + BATTLE_ENVIRONMENT_ULTRA_SPACE, + BATTLE_ENVIRONMENT_COUNT, +}; #define B_WAIT_TIME_LONG (B_WAIT_TIME_MULTIPLIER * 4) #define B_WAIT_TIME_MED (B_WAIT_TIME_MULTIPLIER * 3) diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 2565d36a54..85aa27c75b 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -64,7 +64,7 @@ enum FormChanges FORM_CHANGE_END_BATTLE, // Form change that activates at the end of a battle based on the terrain if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE. // param1: battle terrain to check. - FORM_CHANGE_END_BATTLE_TERRAIN, + FORM_CHANGE_END_BATTLE_ENVIRONMENT, // Form change that activates when the Pokémon is switched out in battle. // param1: ability to check, optional FORM_CHANGE_BATTLE_SWITCH, diff --git a/include/constants/map_types.h b/include/constants/map_types.h index 03a3f0a9a0..86571434e4 100755 --- a/include/constants/map_types.h +++ b/include/constants/map_types.h @@ -1,25 +1,31 @@ #ifndef GUARD_CONSTANTS_MAP_TYPES_H #define GUARD_CONSTANTS_MAP_TYPES_H -#define MAP_TYPE_NONE 0 -#define MAP_TYPE_TOWN 1 -#define MAP_TYPE_CITY 2 -#define MAP_TYPE_ROUTE 3 -#define MAP_TYPE_UNDERGROUND 4 -#define MAP_TYPE_UNDERWATER 5 -#define MAP_TYPE_OCEAN_ROUTE 6 -#define MAP_TYPE_UNKNOWN 7 // Not used by any map. -#define MAP_TYPE_INDOOR 8 -#define MAP_TYPE_SECRET_BASE 9 +enum MapType +{ + MAP_TYPE_NONE, + MAP_TYPE_TOWN, + MAP_TYPE_CITY, + MAP_TYPE_ROUTE, + MAP_TYPE_UNDERGROUND, + MAP_TYPE_UNDERWATER, + MAP_TYPE_OCEAN_ROUTE, + MAP_TYPE_UNKNOWN, // Not used by any map. + MAP_TYPE_INDOOR, + MAP_TYPE_SECRET_BASE, +}; -#define MAP_BATTLE_SCENE_NORMAL 0 -#define MAP_BATTLE_SCENE_GYM 1 -#define MAP_BATTLE_SCENE_MAGMA 2 -#define MAP_BATTLE_SCENE_AQUA 3 -#define MAP_BATTLE_SCENE_SIDNEY 4 -#define MAP_BATTLE_SCENE_PHOEBE 5 -#define MAP_BATTLE_SCENE_GLACIA 6 -#define MAP_BATTLE_SCENE_DRAKE 7 -#define MAP_BATTLE_SCENE_FRONTIER 8 +enum MapBattleScene +{ + MAP_BATTLE_SCENE_NORMAL, + MAP_BATTLE_SCENE_GYM, + MAP_BATTLE_SCENE_MAGMA, + MAP_BATTLE_SCENE_AQUA, + MAP_BATTLE_SCENE_SIDNEY, + MAP_BATTLE_SCENE_PHOEBE, + MAP_BATTLE_SCENE_GLACIA, + MAP_BATTLE_SCENE_DRAKE, + MAP_BATTLE_SCENE_FRONTIER, +}; #endif // GUARD_CONSTANTS_MAP_TYPES_H diff --git a/include/constants/trade.h b/include/constants/trade.h index e387d13cd8..4049a0f19a 100644 --- a/include/constants/trade.h +++ b/include/constants/trade.h @@ -5,10 +5,13 @@ #define TRADE_PARTNER 1 // In-game Trade IDs -#define INGAME_TRADE_SEEDOT 0 -#define INGAME_TRADE_PLUSLE 1 -#define INGAME_TRADE_HORSEA 2 -#define INGAME_TRADE_MEOWTH 3 +enum InGameTradeID +{ + INGAME_TRADE_SEEDOT, + INGAME_TRADE_PLUSLE, + INGAME_TRADE_HORSEA, + INGAME_TRADE_MEOWTH, +}; // Return values for CanTradeSelectedMon and CanSpinTradeMon #define CAN_TRADE_MON 0 diff --git a/include/constants/trainers.h b/include/constants/trainers.h index ebfc18eef0..4f22008410 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -285,73 +285,76 @@ #define RS_FACILITY_CLASSES_COUNT 0x4D -#define TRAINER_CLASS_PKMN_TRAINER_1 0x0 // Unused -#define TRAINER_CLASS_PKMN_TRAINER_2 0x1 // Unused -#define TRAINER_CLASS_HIKER 0x2 -#define TRAINER_CLASS_TEAM_AQUA 0x3 -#define TRAINER_CLASS_PKMN_BREEDER 0x4 -#define TRAINER_CLASS_COOLTRAINER 0x5 -#define TRAINER_CLASS_BIRD_KEEPER 0x6 -#define TRAINER_CLASS_COLLECTOR 0x7 -#define TRAINER_CLASS_SWIMMER_M 0x8 -#define TRAINER_CLASS_TEAM_MAGMA 0x9 -#define TRAINER_CLASS_EXPERT 0xa -#define TRAINER_CLASS_AQUA_ADMIN 0xb -#define TRAINER_CLASS_BLACK_BELT 0xc -#define TRAINER_CLASS_AQUA_LEADER 0xd -#define TRAINER_CLASS_HEX_MANIAC 0xe -#define TRAINER_CLASS_AROMA_LADY 0xf -#define TRAINER_CLASS_RUIN_MANIAC 0x10 -#define TRAINER_CLASS_INTERVIEWER 0x11 -#define TRAINER_CLASS_TUBER_F 0x12 -#define TRAINER_CLASS_TUBER_M 0x13 -#define TRAINER_CLASS_LADY 0x14 -#define TRAINER_CLASS_BEAUTY 0x15 -#define TRAINER_CLASS_RICH_BOY 0x16 -#define TRAINER_CLASS_POKEMANIAC 0x17 -#define TRAINER_CLASS_GUITARIST 0x18 -#define TRAINER_CLASS_KINDLER 0x19 -#define TRAINER_CLASS_CAMPER 0x1a -#define TRAINER_CLASS_PICNICKER 0x1b -#define TRAINER_CLASS_BUG_MANIAC 0x1c -#define TRAINER_CLASS_PSYCHIC 0x1d -#define TRAINER_CLASS_GENTLEMAN 0x1e -#define TRAINER_CLASS_ELITE_FOUR 0x1f -#define TRAINER_CLASS_LEADER 0x20 -#define TRAINER_CLASS_SCHOOL_KID 0x21 -#define TRAINER_CLASS_SR_AND_JR 0x22 -#define TRAINER_CLASS_WINSTRATE 0x23 -#define TRAINER_CLASS_POKEFAN 0x24 -#define TRAINER_CLASS_YOUNGSTER 0x25 -#define TRAINER_CLASS_CHAMPION 0x26 -#define TRAINER_CLASS_FISHERMAN 0x27 -#define TRAINER_CLASS_TRIATHLETE 0x28 -#define TRAINER_CLASS_DRAGON_TAMER 0x29 -#define TRAINER_CLASS_NINJA_BOY 0x2a -#define TRAINER_CLASS_BATTLE_GIRL 0x2b -#define TRAINER_CLASS_PARASOL_LADY 0x2c -#define TRAINER_CLASS_SWIMMER_F 0x2d -#define TRAINER_CLASS_TWINS 0x2e -#define TRAINER_CLASS_SAILOR 0x2f -#define TRAINER_CLASS_COOLTRAINER_2 0x30 // Used for only one trainer. -#define TRAINER_CLASS_MAGMA_ADMIN 0x31 -#define TRAINER_CLASS_RIVAL 0x32 -#define TRAINER_CLASS_BUG_CATCHER 0x33 -#define TRAINER_CLASS_PKMN_RANGER 0x34 -#define TRAINER_CLASS_MAGMA_LEADER 0x35 -#define TRAINER_CLASS_LASS 0x36 -#define TRAINER_CLASS_YOUNG_COUPLE 0x37 -#define TRAINER_CLASS_OLD_COUPLE 0x38 -#define TRAINER_CLASS_SIS_AND_BRO 0x39 -#define TRAINER_CLASS_SALON_MAIDEN 0x3a -#define TRAINER_CLASS_DOME_ACE 0x3b -#define TRAINER_CLASS_PALACE_MAVEN 0x3c -#define TRAINER_CLASS_ARENA_TYCOON 0x3d -#define TRAINER_CLASS_FACTORY_HEAD 0x3e -#define TRAINER_CLASS_PIKE_QUEEN 0x3f -#define TRAINER_CLASS_PYRAMID_KING 0x40 -#define TRAINER_CLASS_RS_PROTAG 0x41 -#define TRAINER_CLASS_COUNT 0x42 +enum TrainerClassID +{ + TRAINER_CLASS_PKMN_TRAINER_1, // Unused + TRAINER_CLASS_PKMN_TRAINER_2, // Unused + TRAINER_CLASS_HIKER, + TRAINER_CLASS_TEAM_AQUA, + TRAINER_CLASS_PKMN_BREEDER, + TRAINER_CLASS_COOLTRAINER, + TRAINER_CLASS_BIRD_KEEPER, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_SWIMMER_M, + TRAINER_CLASS_TEAM_MAGMA, + TRAINER_CLASS_EXPERT, + TRAINER_CLASS_AQUA_ADMIN, + TRAINER_CLASS_BLACK_BELT, + TRAINER_CLASS_AQUA_LEADER, + TRAINER_CLASS_HEX_MANIAC, + TRAINER_CLASS_AROMA_LADY, + TRAINER_CLASS_RUIN_MANIAC, + TRAINER_CLASS_INTERVIEWER, + TRAINER_CLASS_TUBER_F, + TRAINER_CLASS_TUBER_M, + TRAINER_CLASS_LADY, + TRAINER_CLASS_BEAUTY, + TRAINER_CLASS_RICH_BOY, + TRAINER_CLASS_POKEMANIAC, + TRAINER_CLASS_GUITARIST, + TRAINER_CLASS_KINDLER, + TRAINER_CLASS_CAMPER, + TRAINER_CLASS_PICNICKER, + TRAINER_CLASS_BUG_MANIAC, + TRAINER_CLASS_PSYCHIC, + TRAINER_CLASS_GENTLEMAN, + TRAINER_CLASS_ELITE_FOUR, + TRAINER_CLASS_LEADER, + TRAINER_CLASS_SCHOOL_KID, + TRAINER_CLASS_SR_AND_JR, + TRAINER_CLASS_WINSTRATE, + TRAINER_CLASS_POKEFAN, + TRAINER_CLASS_YOUNGSTER, + TRAINER_CLASS_CHAMPION, + TRAINER_CLASS_FISHERMAN, + TRAINER_CLASS_TRIATHLETE, + TRAINER_CLASS_DRAGON_TAMER, + TRAINER_CLASS_NINJA_BOY, + TRAINER_CLASS_BATTLE_GIRL, + TRAINER_CLASS_PARASOL_LADY, + TRAINER_CLASS_SWIMMER_F, + TRAINER_CLASS_TWINS, + TRAINER_CLASS_SAILOR, + TRAINER_CLASS_COOLTRAINER_2, // Used for only one trainer. + TRAINER_CLASS_MAGMA_ADMIN, + TRAINER_CLASS_RIVAL, + TRAINER_CLASS_BUG_CATCHER, + TRAINER_CLASS_PKMN_RANGER, + TRAINER_CLASS_MAGMA_LEADER, + TRAINER_CLASS_LASS, + TRAINER_CLASS_YOUNG_COUPLE, + TRAINER_CLASS_OLD_COUPLE, + TRAINER_CLASS_SIS_AND_BRO, + TRAINER_CLASS_SALON_MAIDEN, + TRAINER_CLASS_DOME_ACE, + TRAINER_CLASS_PALACE_MAVEN, + TRAINER_CLASS_ARENA_TYCOON, + TRAINER_CLASS_FACTORY_HEAD, + TRAINER_CLASS_PIKE_QUEEN, + TRAINER_CLASS_PYRAMID_KING, + TRAINER_CLASS_RS_PROTAG, + TRAINER_CLASS_COUNT, +}; #define TRAINER_ENCOUNTER_MUSIC_MALE 0 // standard male encounter music #define TRAINER_ENCOUNTER_MUSIC_FEMALE 1 // standard female encounter music diff --git a/include/data.h b/include/data.h index 3a697d573c..93b9e1fb1b 100644 --- a/include/data.h +++ b/include/data.h @@ -211,7 +211,7 @@ static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) return &gTrainers[difficulty][sanitizedTrainerId]; } -static inline const u8 GetTrainerClassFromId(u16 trainerId) +static inline const enum TrainerClassID GetTrainerClassFromId(u16 trainerId) { u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); diff --git a/include/frontier_util.h b/include/frontier_util.h index 0d617782a3..5494aa5f0b 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -13,7 +13,7 @@ void ScrollRankingHallRecordsWindow(void); void ClearRankingHallRecords(void); void SaveGameFrontier(void); u8 GetFrontierBrainTrainerPicIndex(void); -u8 GetFrontierBrainTrainerClass(void); +enum TrainerClassID GetFrontierBrainTrainerClass(void); void CopyFrontierBrainTrainerName(u8 *dst); bool8 IsFrontierBrainFemale(void); void SetFrontierBrainObjEventGfx_2(void); diff --git a/include/overworld.h b/include/overworld.h index 09992cf482..f4368ba57d 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -1,6 +1,8 @@ #ifndef GUARD_OVERWORLD_H #define GUARD_OVERWORLD_H +#include "constants/map_types.h" + #define LINK_KEY_CODE_NULL 0x00 #define LINK_KEY_CODE_EMPTY 0x11 #define LINK_KEY_CODE_DPAD_DOWN 0x12 @@ -126,16 +128,16 @@ void TryFadeOutOldMapMusic(void); bool8 BGMusicStopped(void); void Overworld_FadeOutMapMusic(void); void UpdateAmbientCry(s16 *state, u16 *delayCounter); -u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum); -u8 GetMapTypeByWarpData(struct WarpData *warp); -u8 GetCurrentMapType(void); -u8 GetLastUsedWarpMapType(void); -bool8 IsMapTypeOutdoors(u8 mapType); -bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType); -bool8 IsMapTypeIndoors(u8 mapType); +enum MapType GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum); +enum MapType GetMapTypeByWarpData(struct WarpData *warp); +enum MapType GetCurrentMapType(void); +enum MapType GetLastUsedWarpMapType(void); +bool8 IsMapTypeOutdoors(enum MapType mapType); +bool8 Overworld_MapTypeAllowsTeleportAndFly(enum MapType mapType); +bool8 IsMapTypeIndoors(enum MapType mapType); u8 GetSavedWarpRegionMapSectionId(void); u8 GetCurrentRegionMapSectionId(void); -u8 GetCurrentMapBattleScene(void); +enum MapBattleScene GetCurrentMapBattleScene(void); void CleanupOverworldWindowsAndTilemaps(void); bool32 IsOverworldLinkActive(void); void CB1_Overworld(void); diff --git a/include/pokemon.h b/include/pokemon.h index edc37a1a0b..7aaa708459 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -1,14 +1,15 @@ #ifndef GUARD_POKEMON_H #define GUARD_POKEMON_H +#include "contest_effect.h" #include "sprite.h" +#include "constants/battle.h" #include "constants/form_change_types.h" #include "constants/items.h" +#include "constants/map_groups.h" #include "constants/regions.h" #include "constants/region_map_sections.h" -#include "constants/map_groups.h" -#include "constants/battle.h" -#include "contest_effect.h" +#include "constants/trainers.h" #define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0)) #define FORM_SPECIES_END (0xffff) @@ -624,7 +625,7 @@ extern u32 removeBagItem; extern u32 removeBagItemCount; extern const u16 gFacilityClassToPicIndex[]; -extern const u16 gFacilityClassToTrainerClass[]; +extern const enum TrainerClassID gFacilityClassToTrainerClass[]; extern const struct SpeciesInfo gSpeciesInfo[]; extern const u32 gExperienceTables[][MAX_LEVEL + 1]; extern const u8 gPPUpGetMask[]; @@ -659,7 +660,7 @@ void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest); bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler); u16 GetUnionRoomTrainerPic(void); -u16 GetUnionRoomTrainerClass(void); +enum TrainerClassID GetUnionRoomTrainerClass(void); void CreateEnemyEventMon(void); void CalculateMonStats(struct Pokemon *mon); void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest); @@ -713,7 +714,7 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum); u16 GetMonAbility(struct Pokemon *mon); void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); -u8 GetSecretBaseTrainerClass(void); +enum TrainerClassID GetSecretBaseTrainerClass(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); bool8 IsPokemonStorageFull(void); const u8 *GetSpeciesName(u16 species); diff --git a/include/pokemon_animation.h b/include/pokemon_animation.h index 748eb4b36d..8d25d3025c 100644 --- a/include/pokemon_animation.h +++ b/include/pokemon_animation.h @@ -1,195 +1,201 @@ #ifndef GUARD_POKEMON_ANIMATION_H #define GUARD_POKEMON_ANIMATION_H -u8 GetSpeciesBackAnimSet(u16 species); -void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId); -void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId); -void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet); -void SetSpriteCB_MonAnimDummy(struct Sprite *sprite); - // Pokémon back animation sets -#define BACK_ANIM_NONE 0 -#define BACK_ANIM_H_VIBRATE 1 -#define BACK_ANIM_H_SLIDE 2 -#define BACK_ANIM_H_SPRING 3 -#define BACK_ANIM_H_SPRING_REPEATED 4 -#define BACK_ANIM_SHRINK_GROW 5 -#define BACK_ANIM_GROW 6 -#define BACK_ANIM_CIRCLE_COUNTERCLOCKWISE 7 -#define BACK_ANIM_H_SHAKE 8 -#define BACK_ANIM_V_SHAKE 9 -#define BACK_ANIM_V_SHAKE_H_SLIDE 10 -#define BACK_ANIM_V_STRETCH 11 -#define BACK_ANIM_H_STRETCH 12 -#define BACK_ANIM_GROW_STUTTER 13 -#define BACK_ANIM_V_SHAKE_LOW 14 -#define BACK_ANIM_TRIANGLE_DOWN 15 -#define BACK_ANIM_CONCAVE_ARC_LARGE 16 -#define BACK_ANIM_CONVEX_DOUBLE_ARC 17 -#define BACK_ANIM_CONCAVE_ARC_SMALL 18 -#define BACK_ANIM_DIP_RIGHT_SIDE 19 -#define BACK_ANIM_SHRINK_GROW_VIBRATE 20 -#define BACK_ANIM_JOLT_RIGHT 21 -#define BACK_ANIM_SHAKE_FLASH_YELLOW 22 -#define BACK_ANIM_SHAKE_GLOW_RED 23 -#define BACK_ANIM_SHAKE_GLOW_GREEN 24 -#define BACK_ANIM_SHAKE_GLOW_BLUE 25 +enum BackAnim +{ + BACK_ANIM_NONE, + BACK_ANIM_H_VIBRATE, + BACK_ANIM_H_SLIDE, + BACK_ANIM_H_SPRING, + BACK_ANIM_H_SPRING_REPEATED, + BACK_ANIM_SHRINK_GROW, + BACK_ANIM_GROW, + BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, + BACK_ANIM_H_SHAKE, + BACK_ANIM_V_SHAKE, + BACK_ANIM_V_SHAKE_H_SLIDE, + BACK_ANIM_V_STRETCH, + BACK_ANIM_H_STRETCH, + BACK_ANIM_GROW_STUTTER, + BACK_ANIM_V_SHAKE_LOW, + BACK_ANIM_TRIANGLE_DOWN, + BACK_ANIM_CONCAVE_ARC_LARGE, + BACK_ANIM_CONVEX_DOUBLE_ARC, + BACK_ANIM_CONCAVE_ARC_SMALL, + BACK_ANIM_DIP_RIGHT_SIDE, + BACK_ANIM_SHRINK_GROW_VIBRATE, + BACK_ANIM_JOLT_RIGHT, + BACK_ANIM_SHAKE_FLASH_YELLOW, + BACK_ANIM_SHAKE_GLOW_RED, + BACK_ANIM_SHAKE_GLOW_GREEN, + BACK_ANIM_SHAKE_GLOW_BLUE, +}; // Pokémon animation function ids (for front and back) // Each front anim uses 1, and each back anim uses a set of 3 -#define ANIM_V_SQUISH_AND_BOUNCE 0 -#define ANIM_CIRCULAR_STRETCH_TWICE 1 -#define ANIM_H_VIBRATE 2 -#define ANIM_H_SLIDE 3 -#define ANIM_V_SLIDE 4 -#define ANIM_BOUNCE_ROTATE_TO_SIDES 5 -#define ANIM_V_JUMPS_H_JUMPS 6 -#define ANIM_ROTATE_TO_SIDES 7 -#define ANIM_ROTATE_TO_SIDES_TWICE 8 -#define ANIM_GROW_VIBRATE 9 -#define ANIM_ZIGZAG_FAST 10 -#define ANIM_SWING_CONCAVE 11 -#define ANIM_SWING_CONCAVE_FAST 12 -#define ANIM_SWING_CONVEX 13 -#define ANIM_SWING_CONVEX_FAST 14 -#define ANIM_H_SHAKE 15 -#define ANIM_V_SHAKE 16 -#define ANIM_CIRCULAR_VIBRATE 17 -#define ANIM_TWIST 18 -#define ANIM_SHRINK_GROW 19 -#define ANIM_CIRCLE_C_CLOCKWISE 20 -#define ANIM_GLOW_BLACK 21 -#define ANIM_H_STRETCH 22 -#define ANIM_V_STRETCH 23 -#define ANIM_RISING_WOBBLE 24 -#define ANIM_V_SHAKE_TWICE 25 -#define ANIM_TIP_MOVE_FORWARD 26 -#define ANIM_H_PIVOT 27 -#define ANIM_V_SLIDE_WOBBLE 28 -#define ANIM_H_SLIDE_WOBBLE 29 -#define ANIM_V_JUMPS_BIG 30 -#define ANIM_SPIN_LONG 31 -#define ANIM_GLOW_ORANGE 32 -#define ANIM_GLOW_RED 33 -#define ANIM_GLOW_BLUE 34 -#define ANIM_GLOW_YELLOW 35 -#define ANIM_GLOW_PURPLE 36 -#define ANIM_BACK_AND_LUNGE 37 -#define ANIM_BACK_FLIP 38 -#define ANIM_FLICKER 39 -#define ANIM_BACK_FLIP_BIG 40 -#define ANIM_FRONT_FLIP 41 -#define ANIM_TUMBLING_FRONT_FLIP 42 -#define ANIM_FIGURE_8 43 -#define ANIM_FLASH_YELLOW 44 -#define ANIM_SWING_CONCAVE_FAST_SHORT 45 -#define ANIM_SWING_CONVEX_FAST_SHORT 46 -#define ANIM_ROTATE_UP_SLAM_DOWN 47 -#define ANIM_DEEP_V_SQUISH_AND_BOUNCE 48 -#define ANIM_H_JUMPS 49 -#define ANIM_H_JUMPS_V_STRETCH 50 -#define ANIM_ROTATE_TO_SIDES_FAST 51 -#define ANIM_ROTATE_UP_TO_SIDES 52 -#define ANIM_FLICKER_INCREASING 53 -#define ANIM_TIP_HOP_FORWARD 54 -#define ANIM_PIVOT_SHAKE 55 -#define ANIM_TIP_AND_SHAKE 56 -#define ANIM_VIBRATE_TO_CORNERS 57 -#define ANIM_GROW_IN_STAGES 58 -#define ANIM_V_SPRING 59 -#define ANIM_V_REPEATED_SPRING 60 -#define ANIM_SPRING_RISING 61 -#define ANIM_H_SPRING 62 -#define ANIM_H_REPEATED_SPRING_SLOW 63 -#define ANIM_H_SLIDE_SHRINK 64 -#define ANIM_LUNGE_GROW 65 -#define ANIM_CIRCLE_INTO_BG 66 -#define ANIM_RAPID_H_HOPS 67 -#define ANIM_FOUR_PETAL 68 -#define ANIM_V_SQUISH_AND_BOUNCE_SLOW 69 -#define ANIM_H_SLIDE_SLOW 70 -#define ANIM_V_SLIDE_SLOW 71 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL 72 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW 73 -#define ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW 74 -#define ANIM_ZIGZAG_SLOW 75 -#define ANIM_H_SHAKE_SLOW 76 -#define ANIM_V_SHAKE_SLOW 77 -#define ANIM_TWIST_TWICE 78 -#define ANIM_CIRCLE_C_CLOCKWISE_SLOW 79 -#define ANIM_V_SHAKE_TWICE_SLOW 80 -#define ANIM_V_SLIDE_WOBBLE_SMALL 81 -#define ANIM_V_JUMPS_SMALL 82 -#define ANIM_SPIN 83 -#define ANIM_TUMBLING_FRONT_FLIP_TWICE 84 -#define ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE 85 -#define ANIM_H_JUMPS_V_STRETCH_TWICE 86 -#define ANIM_V_SHAKE_BACK 87 -#define ANIM_V_SHAKE_BACK_SLOW 88 -#define ANIM_V_SHAKE_H_SLIDE_SLOW 89 -#define ANIM_V_STRETCH_BOTH_ENDS_SLOW 90 -#define ANIM_H_STRETCH_FAR_SLOW 91 -#define ANIM_V_SHAKE_LOW_TWICE 92 -#define ANIM_H_SHAKE_FAST 93 -#define ANIM_H_SLIDE_FAST 94 -#define ANIM_H_VIBRATE_FAST 95 -#define ANIM_H_VIBRATE_FASTEST 96 -#define ANIM_V_SHAKE_BACK_FAST 97 -#define ANIM_V_SHAKE_LOW_TWICE_SLOW 98 -#define ANIM_V_SHAKE_LOW_TWICE_FAST 99 -#define ANIM_CIRCLE_C_CLOCKWISE_LONG 100 -#define ANIM_GROW_STUTTER_SLOW 101 -#define ANIM_V_SHAKE_H_SLIDE 102 -#define ANIM_V_SHAKE_H_SLIDE_FAST 103 -#define ANIM_TRIANGLE_DOWN_SLOW 104 -#define ANIM_TRIANGLE_DOWN 105 -#define ANIM_TRIANGLE_DOWN_TWICE 106 -#define ANIM_GROW 107 -#define ANIM_GROW_TWICE 108 -#define ANIM_H_SPRING_FAST 109 -#define ANIM_H_SPRING_SLOW 110 -#define ANIM_H_REPEATED_SPRING_FAST 111 -#define ANIM_H_REPEATED_SPRING 112 -#define ANIM_SHRINK_GROW_FAST 113 -#define ANIM_SHRINK_GROW_SLOW 114 -#define ANIM_V_STRETCH_BOTH_ENDS 115 -#define ANIM_V_STRETCH_BOTH_ENDS_TWICE 116 -#define ANIM_H_STRETCH_FAR_TWICE 117 -#define ANIM_H_STRETCH_FAR 118 -#define ANIM_GROW_STUTTER_TWICE 119 -#define ANIM_GROW_STUTTER 120 -#define ANIM_CONCAVE_ARC_LARGE_SLOW 121 -#define ANIM_CONCAVE_ARC_LARGE 122 -#define ANIM_CONCAVE_ARC_LARGE_TWICE 123 -#define ANIM_CONVEX_DOUBLE_ARC_SLOW 124 -#define ANIM_CONVEX_DOUBLE_ARC 125 -#define ANIM_CONVEX_DOUBLE_ARC_TWICE 126 -#define ANIM_CONCAVE_ARC_SMALL_SLOW 127 -#define ANIM_CONCAVE_ARC_SMALL 128 -#define ANIM_CONCAVE_ARC_SMALL_TWICE 129 -#define ANIM_H_DIP 130 -#define ANIM_H_DIP_FAST 131 -#define ANIM_H_DIP_TWICE 132 -#define ANIM_SHRINK_GROW_VIBRATE_FAST 133 -#define ANIM_SHRINK_GROW_VIBRATE 134 -#define ANIM_SHRINK_GROW_VIBRATE_SLOW 135 -#define ANIM_JOLT_RIGHT_FAST 136 -#define ANIM_JOLT_RIGHT 137 -#define ANIM_JOLT_RIGHT_SLOW 138 -#define ANIM_SHAKE_FLASH_YELLOW_FAST 139 -#define ANIM_SHAKE_FLASH_YELLOW 140 -#define ANIM_SHAKE_FLASH_YELLOW_SLOW 141 -#define ANIM_SHAKE_GLOW_RED_FAST 142 -#define ANIM_SHAKE_GLOW_RED 143 -#define ANIM_SHAKE_GLOW_RED_SLOW 144 -#define ANIM_SHAKE_GLOW_GREEN_FAST 145 -#define ANIM_SHAKE_GLOW_GREEN 146 -#define ANIM_SHAKE_GLOW_GREEN_SLOW 147 -#define ANIM_SHAKE_GLOW_BLUE_FAST 148 -#define ANIM_SHAKE_GLOW_BLUE 149 -#define ANIM_SHAKE_GLOW_BLUE_SLOW 150 -#define ANIM_SHAKE_GLOW_BLACK_SLOW 151 -#define ANIM_SHAKE_GLOW_WHITE_SLOW 152 -#define ANIM_SHAKE_GLOW_PURPLE_SLOW 153 +enum AnimFunctionIDs +{ + ANIM_V_SQUISH_AND_BOUNCE, + ANIM_CIRCULAR_STRETCH_TWICE, + ANIM_H_VIBRATE, + ANIM_H_SLIDE, + ANIM_V_SLIDE, + ANIM_BOUNCE_ROTATE_TO_SIDES, + ANIM_V_JUMPS_H_JUMPS, + ANIM_ROTATE_TO_SIDES, + ANIM_ROTATE_TO_SIDES_TWICE, + ANIM_GROW_VIBRATE, + ANIM_ZIGZAG_FAST, + ANIM_SWING_CONCAVE, + ANIM_SWING_CONCAVE_FAST, + ANIM_SWING_CONVEX, + ANIM_SWING_CONVEX_FAST, + ANIM_H_SHAKE, + ANIM_V_SHAKE, + ANIM_CIRCULAR_VIBRATE, + ANIM_TWIST, + ANIM_SHRINK_GROW, + ANIM_CIRCLE_C_CLOCKWISE, + ANIM_GLOW_BLACK, + ANIM_H_STRETCH, + ANIM_V_STRETCH, + ANIM_RISING_WOBBLE, + ANIM_V_SHAKE_TWICE, + ANIM_TIP_MOVE_FORWARD, + ANIM_H_PIVOT, + ANIM_V_SLIDE_WOBBLE, + ANIM_H_SLIDE_WOBBLE, + ANIM_V_JUMPS_BIG, + ANIM_SPIN_LONG, + ANIM_GLOW_ORANGE, + ANIM_GLOW_RED, + ANIM_GLOW_BLUE, + ANIM_GLOW_YELLOW, + ANIM_GLOW_PURPLE, + ANIM_BACK_AND_LUNGE, + ANIM_BACK_FLIP, + ANIM_FLICKER, + ANIM_BACK_FLIP_BIG, + ANIM_FRONT_FLIP, + ANIM_TUMBLING_FRONT_FLIP, + ANIM_FIGURE_8, + ANIM_FLASH_YELLOW, + ANIM_SWING_CONCAVE_FAST_SHORT, + ANIM_SWING_CONVEX_FAST_SHORT, + ANIM_ROTATE_UP_SLAM_DOWN, + ANIM_DEEP_V_SQUISH_AND_BOUNCE, + ANIM_H_JUMPS, + ANIM_H_JUMPS_V_STRETCH, + ANIM_ROTATE_TO_SIDES_FAST, + ANIM_ROTATE_UP_TO_SIDES, + ANIM_FLICKER_INCREASING, + ANIM_TIP_HOP_FORWARD, + ANIM_PIVOT_SHAKE, + ANIM_TIP_AND_SHAKE, + ANIM_VIBRATE_TO_CORNERS, + ANIM_GROW_IN_STAGES, + ANIM_V_SPRING, + ANIM_V_REPEATED_SPRING, + ANIM_SPRING_RISING, + ANIM_H_SPRING, + ANIM_H_REPEATED_SPRING_SLOW, + ANIM_H_SLIDE_SHRINK, + ANIM_LUNGE_GROW, + ANIM_CIRCLE_INTO_BG, + ANIM_RAPID_H_HOPS, + ANIM_FOUR_PETAL, + ANIM_V_SQUISH_AND_BOUNCE_SLOW, + ANIM_H_SLIDE_SLOW, + ANIM_V_SLIDE_SLOW, + ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, + ANIM_ZIGZAG_SLOW, + ANIM_H_SHAKE_SLOW, + ANIM_V_SHAKE_SLOW, + ANIM_TWIST_TWICE, + ANIM_CIRCLE_C_CLOCKWISE_SLOW, + ANIM_V_SHAKE_TWICE_SLOW, + ANIM_V_SLIDE_WOBBLE_SMALL, + ANIM_V_JUMPS_SMALL, + ANIM_SPIN, + ANIM_TUMBLING_FRONT_FLIP_TWICE, + ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE, + ANIM_H_JUMPS_V_STRETCH_TWICE, + ANIM_V_SHAKE_BACK, + ANIM_V_SHAKE_BACK_SLOW, + ANIM_V_SHAKE_H_SLIDE_SLOW, + ANIM_V_STRETCH_BOTH_ENDS_SLOW, + ANIM_H_STRETCH_FAR_SLOW, + ANIM_V_SHAKE_LOW_TWICE, + ANIM_H_SHAKE_FAST, + ANIM_H_SLIDE_FAST, + ANIM_H_VIBRATE_FAST, + ANIM_H_VIBRATE_FASTEST, + ANIM_V_SHAKE_BACK_FAST, + ANIM_V_SHAKE_LOW_TWICE_SLOW, + ANIM_V_SHAKE_LOW_TWICE_FAST, + ANIM_CIRCLE_C_CLOCKWISE_LONG, + ANIM_GROW_STUTTER_SLOW, + ANIM_V_SHAKE_H_SLIDE, + ANIM_V_SHAKE_H_SLIDE_FAST, + ANIM_TRIANGLE_DOWN_SLOW, + ANIM_TRIANGLE_DOWN, + ANIM_TRIANGLE_DOWN_TWICE, + ANIM_GROW, + ANIM_GROW_TWICE, + ANIM_H_SPRING_FAST, + ANIM_H_SPRING_SLOW, + ANIM_H_REPEATED_SPRING_FAST, + ANIM_H_REPEATED_SPRING, + ANIM_SHRINK_GROW_FAST, + ANIM_SHRINK_GROW_SLOW, + ANIM_V_STRETCH_BOTH_ENDS, + ANIM_V_STRETCH_BOTH_ENDS_TWICE, + ANIM_H_STRETCH_FAR_TWICE, + ANIM_H_STRETCH_FAR, + ANIM_GROW_STUTTER_TWICE, + ANIM_GROW_STUTTER, + ANIM_CONCAVE_ARC_LARGE_SLOW, + ANIM_CONCAVE_ARC_LARGE, + ANIM_CONCAVE_ARC_LARGE_TWICE, + ANIM_CONVEX_DOUBLE_ARC_SLOW, + ANIM_CONVEX_DOUBLE_ARC, + ANIM_CONVEX_DOUBLE_ARC_TWICE, + ANIM_CONCAVE_ARC_SMALL_SLOW, + ANIM_CONCAVE_ARC_SMALL, + ANIM_CONCAVE_ARC_SMALL_TWICE, + ANIM_H_DIP, + ANIM_H_DIP_FAST, + ANIM_H_DIP_TWICE, + ANIM_SHRINK_GROW_VIBRATE_FAST, + ANIM_SHRINK_GROW_VIBRATE, + ANIM_SHRINK_GROW_VIBRATE_SLOW, + ANIM_JOLT_RIGHT_FAST, + ANIM_JOLT_RIGHT, + ANIM_JOLT_RIGHT_SLOW, + ANIM_SHAKE_FLASH_YELLOW_FAST, + ANIM_SHAKE_FLASH_YELLOW, + ANIM_SHAKE_FLASH_YELLOW_SLOW, + ANIM_SHAKE_GLOW_RED_FAST, + ANIM_SHAKE_GLOW_RED, + ANIM_SHAKE_GLOW_RED_SLOW, + ANIM_SHAKE_GLOW_GREEN_FAST, + ANIM_SHAKE_GLOW_GREEN, + ANIM_SHAKE_GLOW_GREEN_SLOW, + ANIM_SHAKE_GLOW_BLUE_FAST, + ANIM_SHAKE_GLOW_BLUE, + ANIM_SHAKE_GLOW_BLUE_SLOW, + ANIM_SHAKE_GLOW_BLACK_SLOW, + ANIM_SHAKE_GLOW_WHITE_SLOW, + ANIM_SHAKE_GLOW_PURPLE_SLOW, +}; + +enum BackAnim GetSpeciesBackAnimSet(u16 species); +void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId); +void StartMonSummaryAnimation(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId); +void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, enum BackAnim backAnimSet); +void SetSpriteCB_MonAnimDummy(struct Sprite *sprite); #endif // GUARD_POKEMON_ANIMATION_H diff --git a/include/trainer_hill.h b/include/trainer_hill.h index 6e2ec0ba0a..848e40e7d5 100644 --- a/include/trainer_hill.h +++ b/include/trainer_hill.h @@ -45,7 +45,7 @@ extern u32 *gTrainerHillVBlankCounter; void CallTrainerHillFunction(void); void ResetTrainerHillResults(void); -u8 GetTrainerHillOpponentClass(u16 trainerId); +enum TrainerClassID GetTrainerHillOpponentClass(u16 trainerId); void GetTrainerHillTrainerName(u8 *dst, u16 trainerId); u8 GetTrainerHillTrainerFrontSpriteId(u16 trainerId); void InitTrainerHillBattleStruct(void); diff --git a/src/battle_bg.c b/src/battle_bg.c index 7c11ce4d05..6de96168f7 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -21,7 +21,6 @@ #include "text_window.h" #include "trig.h" #include "window.h" -#include "constants/map_types.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/trainers.h" @@ -788,7 +787,7 @@ void DrawMainBattleBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1189,7 +1188,7 @@ void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); @@ -1254,7 +1253,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1316,7 +1315,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); @@ -1378,7 +1377,7 @@ bool8 LoadChosenBattleElement(u8 caseId) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); diff --git a/src/battle_main.c b/src/battle_main.c index 5bdf3fb8ec..4bd683aa29 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5576,7 +5576,7 @@ static void HandleEndTurn_FinishBattle(void) // Appeared in battle and didn't faint if ((gBattleStruct->appearedInBattle & (1u << i)) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) - changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_TERRAIN); + changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_ENVIRONMENT); if (!changedForm) changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 98050a8a94..f97def54b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -55,7 +55,6 @@ #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/item_effects.h" -#include "constants/map_types.h" #include "constants/moves.h" #include "constants/party_menu.h" #include "constants/rgb.h" diff --git a/src/battle_setup.c b/src/battle_setup.c index 5c6a01c932..da12b5fd18 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -48,7 +48,6 @@ #include "constants/game_stat.h" #include "constants/items.h" #include "constants/songs.h" -#include "constants/map_types.h" #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" @@ -622,7 +621,7 @@ static void CB2_EndScriptedWildBattle(void) } } -u8 BattleSetup_GetEnvironmentId(void) +enum BattleEnvironment BattleSetup_GetEnvironmentId(void) { u16 tileBehavior; s16 x, y; @@ -778,7 +777,7 @@ u8 GetTrainerBattleTransition(void) u8 enemyLevel; u8 playerLevel; u32 trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); - u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (DoesTrainerHaveMugshot(trainerId)) return B_TRANSITION_MUGSHOT; diff --git a/src/battle_tower.c b/src/battle_tower.c index 19a123c412..e0d3a192b7 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1351,9 +1351,9 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId) } } -u8 GetFrontierOpponentClass(u16 trainerId) +enum TrainerClassID GetFrontierOpponentClass(u16 trainerId) { - u8 trainerClass = 0; + enum TrainerClassID trainerClass = 0; enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(trainerId); SetFacilityPtrsGetLevel(); @@ -2846,7 +2846,7 @@ u8 GetEreaderTrainerFrontSpriteId(void) #endif //FREE_BATTLE_TOWER_E_READER } -u8 GetEreaderTrainerClassId(void) +enum TrainerClassID GetEreaderTrainerClassId(void) { #if FREE_BATTLE_TOWER_E_READER == FALSE return gFacilityClassToTrainerClass[gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass]; diff --git a/src/bike.c b/src/bike.c index afc3099ab7..50ed705da3 100644 --- a/src/bike.c +++ b/src/bike.c @@ -7,7 +7,6 @@ #include "metatile_behavior.h" #include "overworld.h" #include "sound.h" -#include "constants/map_types.h" #include "constants/songs.h" // this file's functions diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index b15ad80b76..a17a432834 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -528,14 +528,14 @@ static const struct FormChange sDeoxysSpeedFormChangeTable[] = { #if P_FAMILY_BURMY static const struct FormChange sBurmyFormChangeTable[] = { - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_LONG_GRASS}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_POND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_MOUNTAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_PLAIN}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_CAVE}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_SAND}, - {FORM_CHANGE_END_BATTLE_TERRAIN, SPECIES_BURMY_TRASH, BATTLE_ENVIRONMENT_BUILDING}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_GRASS}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_LONG_GRASS}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_POND}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_MOUNTAIN}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_PLAIN}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_CAVE}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_SANDY, BATTLE_ENVIRONMENT_SAND}, + {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_TRASH, BATTLE_ENVIRONMENT_BUILDING}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BURMY diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index 963537520c..b3f9282a43 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -96,7 +96,7 @@ const u16 gTrainerPicToTrainerBackPic[] = [TRAINER_BACK_PIC_STEVEN] = TRAINER_PIC_STEVEN, }; -const u16 gFacilityClassToTrainerClass[] = +const enum TrainerClassID gFacilityClassToTrainerClass[] = { [FACILITY_CLASS_HIKER] = TRAINER_CLASS_HIKER, [FACILITY_CLASS_AQUA_GRUNT_M] = TRAINER_CLASS_TEAM_AQUA, diff --git a/src/debug.c b/src/debug.c index 5a585ef62d..cbf90dc567 100644 --- a/src/debug.c +++ b/src/debug.c @@ -195,7 +195,7 @@ enum FlagsVarsDebugMenu DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING, }; -enum BattleType +enum DebugBattleType { DEBUG_BATTLE_0_MENU_ITEM_WILD, DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE, @@ -204,7 +204,7 @@ enum BattleType DEBUG_BATTLE_0_MENU_ITEM_MULTI, }; -enum BattleAIFlags +enum DebugBattleAIFlags { DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00, DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01, @@ -227,7 +227,7 @@ enum BattleAIFlags DEBUG_BATTLE_1_MENU_ITEM_CONTINUE, }; -enum BattleTerrain +enum DebugBattleTerrain { DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0, DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1, @@ -338,7 +338,7 @@ struct DebugBattleData { u8 submenu; u8 battleType; - u8 battleTerrain; + enum BattleEnvironment battleTerrain; bool8 aiFlags[AI_FLAG_COUNT]; }; diff --git a/src/dexnav.c b/src/dexnav.c index 61906fabaa..4ad2813b80 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -50,7 +50,6 @@ #include "text_window.h" #include "wild_encounter.h" #include "window.h" -#include "constants/map_types.h" #include "constants/species.h" #include "constants/maps.h" #include "constants/field_effects.h" @@ -614,7 +613,7 @@ static bool8 DexNavPickTile(enum EncounterType environment, u8 areaX, u8 areaY, bool8 nextIter; u8 scale = 0; u8 weight = 0; - u8 currMapType = GetCurrentMapType(); + enum MapType currMapType = GetCurrentMapType(); u8 tileBehaviour; u8 tileBuffer = 2; u8 *xPos = AllocZeroed((botX - topX) * (botY - topY) * sizeof(u8)); @@ -726,7 +725,7 @@ static bool8 DexNavPickTile(enum EncounterType environment, u8 areaX, u8 areaY, static bool8 TryStartHiddenMonFieldEffect(enum EncounterType environment, u8 xSize, u8 ySize, bool8 smallScan) { - u8 currMapType = GetCurrentMapType(); + enum MapType currMapType = GetCurrentMapType(); u8 fldEffId = 0; if (DexNavPickTile(environment, xSize, ySize, smallScan)) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 361111ac4e..f4418afab3 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -46,7 +46,6 @@ #include "constants/event_objects.h" #include "constants/field_effects.h" #include "constants/items.h" -#include "constants/map_types.h" #include "constants/mauville_old_man.h" #include "constants/metatile_behaviors.h" #include "constants/rgb.h" diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 1cc1f8e122..ebcd775ed9 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -37,7 +37,6 @@ #include "constants/event_bg.h" #include "constants/event_objects.h" #include "constants/field_poison.h" -#include "constants/map_types.h" #include "constants/metatile_behaviors.h" #include "constants/songs.h" #include "constants/trainer_hill.h" diff --git a/src/field_effect.c b/src/field_effect.c index 2106fcd491..5cdc3472fb 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -38,7 +38,6 @@ #include "constants/metatile_behaviors.h" #include "constants/rgb.h" #include "constants/songs.h" -#include "constants/map_types.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 9ac99465ca..af1297a0e2 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -86,7 +86,7 @@ static void FillPalBufferBlack(void) void WarpFadeInScreen(void) { - u8 previousMapType = GetLastUsedWarpMapType(); + enum MapType previousMapType = GetLastUsedWarpMapType(); switch (GetMapPairFadeFromType(previousMapType, GetCurrentMapType())) { case 0: @@ -113,7 +113,7 @@ void FadeInFromBlack(void) void WarpFadeOutScreen(void) { - u8 currentMapType = GetCurrentMapType(); + enum MapType currentMapType = GetCurrentMapType(); switch (GetMapPairFadeToType(currentMapType, GetDestinationWarpMapHeader()->mapType)) { case 0: diff --git a/src/field_specials.c b/src/field_specials.c index 971847888a..6543461998 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -59,7 +59,6 @@ #include "constants/field_specials.h" #include "constants/items.h" #include "constants/heal_locations.h" -#include "constants/map_types.h" #include "constants/mystery_gift.h" #include "constants/slot_machine.h" #include "constants/songs.h" diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 7ad0d6ddbb..2ae6b256e1 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -15,7 +15,6 @@ #include "sprite.h" #include "task.h" #include "constants/songs.h" -#include "constants/map_types.h" struct FlashStruct { @@ -155,8 +154,8 @@ void CB2_DoChangeMap(void) static bool8 TryDoMapTransition(void) { u8 i; - u8 fromType = GetLastUsedWarpMapType(); - u8 toType = GetCurrentMapType(); + enum MapType fromType = GetLastUsedWarpMapType(); + enum MapType toType = GetCurrentMapType(); for (i = 0; sTransitionTypes[i].fromType; i++) { diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index adb1136340..1ad4eaaf48 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -16,7 +16,6 @@ #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/field_effects.h" -#include "constants/map_types.h" #include "constants/songs.h" static void Task_DoFieldMove_Init(u8 taskId); diff --git a/src/frontier_util.c b/src/frontier_util.c index cf2cbaba8d..5fd8c4b0b3 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2459,7 +2459,7 @@ u8 GetFrontierBrainTrainerPicIndex(void) return GetTrainerPicFromId(gFrontierBrainInfo[facility].trainerId); } -u8 GetFrontierBrainTrainerClass(void) +enum TrainerClassID GetFrontierBrainTrainerClass(void) { s32 facility; diff --git a/src/item_use.c b/src/item_use.c index 44858183c1..ad0fb47565 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -45,7 +45,6 @@ #include "constants/item_effects.h" #include "constants/items.h" #include "constants/songs.h" -#include "constants/map_types.h" static void SetUpItemUseCallback(u8); static void FieldCB_UseItemOnField(void); @@ -1487,7 +1486,7 @@ static bool32 IsValidLocationForVsSeeker(void) { u16 mapGroup = gSaveBlock1Ptr->location.mapGroup; u16 mapNum = gSaveBlock1Ptr->location.mapNum; - u16 mapType = gMapHeader.mapType; + enum MapType mapType = gMapHeader.mapType; typedef struct { u16 mapGroup; diff --git a/src/overworld.c b/src/overworld.c index d9a688c7b5..de80d85a03 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -72,7 +72,6 @@ #include "constants/event_object_movement.h" #include "constants/event_objects.h" #include "constants/layouts.h" -#include "constants/map_types.h" #include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/trainer_hill.h" @@ -180,8 +179,8 @@ static void SetKeyInterceptCallback(u16 (*func)(u32)); static void SetFieldVBlankCallback(void); static void FieldClearVBlankHBlankCallbacks(void); static void TransitionMapMusic(void); -static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *, u16, u8); -static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *, u8, u16, u8); +static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, enum MapType mapType); +static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, enum MapType mapType); static u16 GetCenterScreenMetatileBehavior(void); static void *sUnusedOverworldCallback; @@ -732,8 +731,8 @@ void SetLastHealLocationWarp(u8 healLocationId) void UpdateEscapeWarp(s16 x, s16 y) { - u8 currMapType = GetCurrentMapType(); - u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); + enum MapType currMapType = GetCurrentMapType(); + enum MapType destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); if (IsMapTypeOutdoors(currMapType) && IsMapTypeOutdoors(destMapType) != TRUE) SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE, x - MAP_OFFSET, y - MAP_OFFSET + 1); } @@ -977,7 +976,7 @@ void StoreInitialPlayerAvatarState(void) static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) { struct InitialPlayerAvatarState playerStruct; - u8 mapType = GetCurrentMapType(); + enum MapType mapType = GetCurrentMapType(); u16 metatileBehavior = GetCenterScreenMetatileBehavior(); u8 transitionFlags = GetAdjustedInitialTransitionFlags(&sInitialPlayerAvatarState, metatileBehavior, mapType); playerStruct.transitionFlags = transitionFlags; @@ -986,7 +985,7 @@ static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) return &sInitialPlayerAvatarState; } -static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType) +static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, enum MapType mapType) { if (mapType != MAP_TYPE_INDOOR && FlagGet(FLAG_SYS_CRUISE_MODE)) return PLAYER_AVATAR_FLAG_ON_FOOT; @@ -1004,7 +1003,7 @@ static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *pla return PLAYER_AVATAR_FLAG_ACRO_BIKE; } -static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType) +static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, enum MapType mapType) { if (FlagGet(FLAG_SYS_CRUISE_MODE) && mapType == MAP_TYPE_OCEAN_ROUTE) return DIR_EAST; @@ -1413,27 +1412,27 @@ static void ChooseAmbientCrySpecies(void) } } -u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) +enum MapType GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) { return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType; } -u8 GetMapTypeByWarpData(struct WarpData *warp) +enum MapType GetMapTypeByWarpData(struct WarpData *warp) { return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); } -u8 GetCurrentMapType(void) +enum MapType GetCurrentMapType(void) { return GetMapTypeByWarpData(&gSaveBlock1Ptr->location); } -u8 GetLastUsedWarpMapType(void) +enum MapType GetLastUsedWarpMapType(void) { return GetMapTypeByWarpData(&gLastUsedWarp); } -bool8 IsMapTypeOutdoors(u8 mapType) +bool8 IsMapTypeOutdoors(enum MapType mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN @@ -1445,7 +1444,7 @@ bool8 IsMapTypeOutdoors(u8 mapType) return FALSE; } -bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) +bool8 Overworld_MapTypeAllowsTeleportAndFly(enum MapType mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN @@ -1456,7 +1455,7 @@ bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) return FALSE; } -bool8 IsMapTypeIndoors(u8 mapType) +bool8 IsMapTypeIndoors(enum MapType mapType) { if (mapType == MAP_TYPE_INDOOR || mapType == MAP_TYPE_SECRET_BASE) @@ -1475,7 +1474,7 @@ u8 GetCurrentRegionMapSectionId(void) return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } -u8 GetCurrentMapBattleScene(void) +enum MapBattleScene GetCurrentMapBattleScene(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType; } diff --git a/src/pokemon.c b/src/pokemon.c index 6636c7c7fa..c9c14aa093 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1695,7 +1695,7 @@ u16 GetUnionRoomTrainerPic(void) return FacilityClassToPicIndex(gUnionRoomFacilityClasses[arrId]); } -u16 GetUnionRoomTrainerClass(void) +enum TrainerClassID GetUnionRoomTrainerClass(void) { u8 linkId; u32 arrId; @@ -3550,7 +3550,7 @@ u8 GetSecretBaseTrainerPicIndex(void) return gFacilityClassToPicIndex[facilityClass]; } -u8 GetSecretBaseTrainerClass(void) +enum TrainerClassID GetSecretBaseTrainerClass(void) { u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; return gFacilityClassToTrainerClass[facilityClass]; @@ -5273,7 +5273,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { u8 friendshipLevel = 0; s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - u32 opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + enum TrainerClassID opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (friendship > 99) friendshipLevel++; @@ -5837,7 +5837,7 @@ u16 GetBattleBGM(void) } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - u8 trainerClass; + enum TrainerClassID trainerClass; if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) trainerClass = GetFrontierOpponentClass(TRAINER_BATTLE_PARAM.opponentA); @@ -6686,7 +6686,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) targetSpecies = formChanges[i].targetSpecies; break; - case FORM_CHANGE_END_BATTLE_TERRAIN: + case FORM_CHANGE_END_BATTLE_ENVIRONMENT: if (gBattleEnvironment == formChanges[i].param1) targetSpecies = formChanges[i].targetSpecies; break; diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 41bc400105..56b3a2326c 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -468,7 +468,7 @@ static void SetPosForRotation(struct Sprite *sprite, u16 index, s16 amplitudeX, sprite->y2 = yAdder + amplitudeY; } -u8 GetSpeciesBackAnimSet(u16 species) +enum BackAnim GetSpeciesBackAnimSet(u16 species) { if (gSpeciesInfo[species].backAnimId != BACK_ANIM_NONE) return gSpeciesInfo[species].backAnimId - 1; @@ -527,7 +527,7 @@ static void Task_HandleMonAnimation(u8 taskId) } } -void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId) +void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId) { u8 taskId = CreateTask(Task_HandleMonAnimation, 128); gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; @@ -535,16 +535,17 @@ void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId) gTasks[taskId].tAnimId = frontAnimId; } -void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId) +void StartMonSummaryAnimation(struct Sprite *sprite, enum AnimFunctionIDs frontAnimId) { // sDontFlip is expected to still be FALSE here, not explicitly cleared sIsSummaryAnim = TRUE; sprite->callback = sMonAnimFunctions[frontAnimId]; } -void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet) +void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, enum BackAnim backAnimSet) { - u8 nature, taskId, animId, battler; + u8 nature, taskId, battler; + enum AnimFunctionIDs animId; taskId = CreateTask(Task_HandleMonAnimation, 128); gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index 0c85945cb9..3a764e9a3b 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -921,7 +921,7 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer } //Battle background functions -static void LoadBattleBg(u8 battleBgType, u8 battleEnvironment) +static void LoadBattleBg(u8 battleBgType, enum BattleEnvironment battleEnvironment) { switch (battleBgType) { diff --git a/src/pokenav_match_call_list.c b/src/pokenav_match_call_list.c index 9a51c092e9..a4f186f443 100755 --- a/src/pokenav_match_call_list.c +++ b/src/pokenav_match_call_list.c @@ -410,7 +410,7 @@ void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 { int index = GetTrainerIdxByRematchIdx(matchCallEntry->headerId); const struct Trainer *trainer = GetTrainerStructFromId(index); - int class = trainer->trainerClass; + enum TrainerClassID class = trainer->trainerClass; className = gTrainerClasses[class].name; trainerName = trainer->trainerName; } diff --git a/src/region_map.c b/src/region_map.c index 7dab708863..501623d3b3 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -25,7 +25,6 @@ #include "heal_location.h" #include "constants/field_specials.h" #include "constants/heal_locations.h" -#include "constants/map_types.h" #include "constants/rgb.h" #include "constants/weather.h" diff --git a/src/scrcmd.c b/src/scrcmd.c index 4e8a43f940..2efd183a88 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -3003,7 +3003,7 @@ static void CloseBrailleWindow(void) bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + enum TrainerClassID trainerClassId = VarGet(ScriptReadHalfword(ctx)); Script_RequestEffects(SCREFF_V1); @@ -3014,7 +3014,7 @@ bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) bool8 ScrCmd_buffertrainername(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 trainerClassId = VarGet(ScriptReadHalfword(ctx)); + enum TrainerClassID trainerClassId = VarGet(ScriptReadHalfword(ctx)); Script_RequestEffects(SCREFF_V1); diff --git a/src/secret_base.c b/src/secret_base.c index de0825b91e..03f22badca 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -39,7 +39,6 @@ #include "constants/event_objects.h" #include "constants/field_specials.h" #include "constants/items.h" -#include "constants/map_types.h" #include "constants/metatile_behaviors.h" #include "constants/metatile_labels.h" #include "constants/moves.h" diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 3b2b74e1ab..b4f2b12667 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -309,7 +309,7 @@ static u8 GetFloorId(void) return gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; } -u8 GetTrainerHillOpponentClass(u16 trainerId) +enum TrainerClassID GetTrainerHillOpponentClass(u16 trainerId) { u8 id = trainerId - 1; diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index 778b407937..e4144ebb9f 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -222,7 +222,7 @@ static void SceneSingles(u32 move, struct BattlePokemon *mon) { ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, mon); } - else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_TERRAIN_BUILDING + else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING { ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, mon); } @@ -354,7 +354,7 @@ static void DoublesScene(u32 move, struct BattlePokemon *attacker) ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, attacker); } else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) - { // Recorded battles always use BATTLE_TERRAIN_BUILDING + { // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, attacker); } else From 52b1b877ecd173e8098e21848b3b94e4443bc753 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:11:42 +0200 Subject: [PATCH 030/248] Change GetZMaxMoveAgainstProtectionModifier to prevent regressions (#7047) --- src/battle_util.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 668574af18..64e1b54481 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9022,12 +9022,7 @@ static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageCalcula return UQ_4_12(1.0); u32 protected = gProtectStructs[damageCalcData->battlerDef].protected; - if (protected != PROTECT_NONE - && protected != PROTECT_WIDE_GUARD - && protected != PROTECT_QUICK_GUARD - && protected != PROTECT_CRAFTY_SHIELD - && protected != PROTECT_MAT_BLOCK - && protected != PROTECT_MAX_GUARD) + if (GetProtectType(protected) == PROTECT_TYPE_SINGLE && protected != PROTECT_MAX_GUARD) return UQ_4_12(0.25); return UQ_4_12(1.0); } From 177fa2f096266800f1cdaa8fec4f766da8166bbc Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 3 Jun 2025 10:26:25 +0200 Subject: [PATCH 031/248] Combines Super Fang and Guardian of Alola effects (#7048) --- asm/macros/battle_script.inc | 4 ---- data/battle_scripts_1.s | 10 -------- include/battle_scripts.h | 1 - include/constants/battle_move_effects.h | 5 ++-- include/move.h | 8 ++++++- src/battle_ai_main.c | 21 ++++++++--------- src/battle_dynamax.c | 4 ++-- src/battle_script_commands.c | 10 -------- src/battle_tv.c | 4 ++-- src/battle_util.c | 8 +++---- src/data/battle_move_effects.h | 10 ++------ src/data/moves_info.h | 24 +++++++++++--------- test/battle/ability/cud_chew.c | 4 ++-- test/battle/gimmick/dynamax.c | 2 +- test/battle/gimmick/zmove.c | 4 ++-- test/battle/hold_effect/attack_up.c | 4 ++-- test/battle/hold_effect/critical_hit_up.c | 4 ++-- test/battle/hold_effect/defense_up.c | 4 ++-- test/battle/hold_effect/micle_berry.c | 4 ++-- test/battle/hold_effect/shell_bell.c | 4 ++-- test/battle/hold_effect/special_attack_up.c | 4 ++-- test/battle/hold_effect/special_defense_up.c | 4 ++-- test/battle/hold_effect/speed_up.c | 4 ++-- test/battle/move.c | 2 +- test/battle/move_effect/fixed_damage_arg.c | 4 ++-- test/battle/move_effect/magic_room.c | 4 ++-- test/battle/move_effect/shed_tail.c | 4 ++-- test/battle/trainer_slides.c | 2 +- 28 files changed, 71 insertions(+), 96 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9921af639c..8ad9aa5911 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1697,10 +1697,6 @@ callnative BS_ApplyTerastallization .endm - .macro damagetoquartertargethp - callnative BS_DamageToQuarterTargetHP - .endm - .macro jumpifsleepclause jumpInstr:req callnative BS_JumpIfSleepClause .4byte \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c244a50d08..5725a05e3d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -20,16 +20,6 @@ .section script_data, "aw", %progbits -BattleScript_DamageToQuarterTargetHP:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - damagetoquartertargethp - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectFickleBeam:: attackcanceler attackstring diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8c6d34b0f0..315c2939e1 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -863,7 +863,6 @@ extern const u8 BattleScript_EffectShedTail[]; extern const u8 BattleScript_EffectUpperHand[]; extern const u8 BattleScript_EffectTidyUp[]; extern const u8 BattleScript_EffectSpicyExtract[]; -extern const u8 BattleScript_DamageToQuarterTargetHP[]; extern const u8 BattleScript_EffectFickleBeam[]; extern const u8 BattleScript_FickleBeamDoubled[]; extern const u8 BattleScript_QuestionForfeitBattle[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index eb0756bd40..3d899469f4 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -35,8 +35,8 @@ enum BattleMoveEffects EFFECT_REST, EFFECT_OHKO, EFFECT_FUSION_COMBO, - EFFECT_SUPER_FANG, - EFFECT_FIXED_DAMAGE_ARG, + EFFECT_FIXED_PERCENT_DAMAGE, + EFFECT_FIXED_HP_DAMAGE, EFFECT_HEAL_BLOCK, EFFECT_RECOIL_IF_MISS, EFFECT_MIST, @@ -341,7 +341,6 @@ enum BattleMoveEffects EFFECT_TERA_BLAST, EFFECT_TERA_STARSTORM, EFFECT_DRAGON_DARTS, - EFFECT_GUARDIAN_OF_ALOLA, EFFECT_SHELL_SIDE_ARM, EFFECT_ORDER_UP, EFFECT_RAPID_SPIN, diff --git a/include/move.h b/include/move.h index 16ede9d809..ba51165cb6 100644 --- a/include/move.h +++ b/include/move.h @@ -147,6 +147,7 @@ struct MoveInfo u32 holdEffect; u32 type; u32 fixedDamage; + u32 damagePercentage; u32 absorbPercentage; u32 recoilPercentage; u32 nonVolatileStatus; @@ -518,7 +519,7 @@ static inline u32 GetMoveArgType(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].argument.type; } -static inline u32 GetMoveFixedDamage(u32 moveId) +static inline u32 GetMoveFixedHPDamage(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].argument.fixedDamage; } @@ -550,6 +551,11 @@ static inline u32 GetMoveNonVolatileStatus(u32 move) } } +static inline u32 GetMoveDamagePercentage(u32 move) +{ + return gMovesInfo[SanitizeMoveId(move)].argument.damagePercentage; +} + static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) { return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 539b18f1b7..cea486e581 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -399,14 +399,14 @@ void ComputeBattlerDecisions(u32 battler) } } -void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) +void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) { // After choosing a move for battlerAtk assuming that a gimmick will be used, reconsider whether the gimmick is necessary. - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !ShouldUseZMove(battlerAtk, battlerDef, move)) + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && !ShouldUseZMove(battlerAtk, battlerDef, move)) SetAIUsingGimmick(battlerAtk, NO_GIMMICK); - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_TERA && GetMoveEffect(move) == EFFECT_PROTECT) + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_TERA && GetMoveEffect(move) == EFFECT_PROTECT) SetAIUsingGimmick(battlerAtk, NO_GIMMICK); } @@ -416,18 +416,18 @@ u32 BattleAI_ChooseMoveIndex(u32 battler) SetAIUsingGimmick(battler, USE_GIMMICK); - if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) DecideTerastal(battler); - + if (!IsDoubleBattle()) chosenMoveIndex = ChooseMoveOrAction_Singles(battler); else chosenMoveIndex = ChooseMoveOrAction_Doubles(battler); - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) ReconsiderGimmick(battler, gBattlerTarget, gBattleMons[battler].moves[chosenMoveIndex]); - + // Clear protect structures, some flags may be set during AI calcs // e.g. pranksterElevated from GetBattleMovePriority @@ -1081,18 +1081,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { switch (moveEffect) { - case EFFECT_FIXED_DAMAGE_ARG: + case EFFECT_FIXED_HP_DAMAGE: case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: case EFFECT_OHKO: case EFFECT_BIDE: - case EFFECT_SUPER_FANG: + case EFFECT_FIXED_PERCENT_DAMAGE: case EFFECT_ENDEAVOR: case EFFECT_COUNTER: case EFFECT_MIRROR_COAT: case EFFECT_METAL_BURST: case EFFECT_FINAL_GAMBIT: - case EFFECT_GUARDIAN_OF_ALOLA: break; default: RETURN_SCORE_MINUS(10); @@ -1624,7 +1623,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_PRESENT: - case EFFECT_FIXED_DAMAGE_ARG: + case EFFECT_FIXED_HP_DAMAGE: case EFFECT_FOCUS_PUNCH: // AI_CBM_HighRiskForDamage if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 6f69ca7580..c9f9947785 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -387,7 +387,7 @@ static u32 GetMaxPowerTier(u32 move) switch (GetMoveEffect(move)) { case EFFECT_BIDE: - case EFFECT_SUPER_FANG: + case EFFECT_FIXED_PERCENT_DAMAGE: case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: case EFFECT_COUNTER: @@ -400,7 +400,7 @@ static u32 GetMaxPowerTier(u32 move) case EFFECT_TERRAIN_PULSE: case EFFECT_PUNISHMENT: case EFFECT_TRUMP_CARD: - case EFFECT_FIXED_DAMAGE_ARG: + case EFFECT_FIXED_HP_DAMAGE: case EFFECT_SPIT_UP: case EFFECT_NATURAL_GIFT: case EFFECT_MIRROR_COAT: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f97def54b4..d7eec1c322 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17865,16 +17865,6 @@ void BS_ApplyTerastallization(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_DamageToQuarterTargetHP(void) -{ - NATIVE_ARGS(); - gBattleStruct->moveDamage[gBattlerTarget] = (3 * GetNonDynamaxHP(gBattlerTarget)) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_JumpIfSleepClause(void) { NATIVE_ARGS(const u8 *jumpInstr); diff --git a/src/battle_tv.c b/src/battle_tv.c index 96ce633440..732216d7ec 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -760,8 +760,8 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) // Changes depending on the effect switch (effect) { - case EFFECT_FIXED_DAMAGE_ARG: - baseFromEffect *= (GetMoveFixedDamage(move) / 20); + case EFFECT_FIXED_HP_DAMAGE: + baseFromEffect *= (GetMoveFixedHPDamage(move) / 20); break; case EFFECT_TWO_TURNS_ATTACK: for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) diff --git a/src/battle_util.c b/src/battle_util.c index 64e1b54481..66b1b4e042 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9322,11 +9322,11 @@ static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalc randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); dmg = gBattleMons[damageCalcData->battlerAtk].level * (randDamage + 50) / 100; break; - case EFFECT_FIXED_DAMAGE_ARG: - dmg = GetMoveFixedDamage(damageCalcData->move); + case EFFECT_FIXED_HP_DAMAGE: + dmg = GetMoveFixedHPDamage(damageCalcData->move); break; - case EFFECT_SUPER_FANG: - dmg = GetNonDynamaxHP(damageCalcData->battlerDef) / 2; + case EFFECT_FIXED_PERCENT_DAMAGE: + dmg = GetNonDynamaxHP(damageCalcData->battlerDef) * GetMoveDamagePercentage(damageCalcData->move) / 100; break; case EFFECT_FINAL_GAMBIT: dmg = GetNonDynamaxHP(damageCalcData->battlerAtk); diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index a79eb441c1..b116b61999 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -209,14 +209,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_SUPER_FANG] = + [EFFECT_FIXED_PERCENT_DAMAGE] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 5, .encourageEncore = TRUE, }, - [EFFECT_FIXED_DAMAGE_ARG] = + [EFFECT_FIXED_HP_DAMAGE] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, @@ -2171,12 +2171,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_GUARDIAN_OF_ALOLA] = - { - .battleScript = BattleScript_DamageToQuarterTargetHP, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_SHELL_SIDE_ARM] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 0b61900109..db76c62ab8 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1364,7 +1364,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Launches shock waves that\n" "always inflict 20 HP damage."), - .effect = EFFECT_FIXED_DAMAGE_ARG, + .effect = EFFECT_FIXED_HP_DAMAGE, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, @@ -2220,7 +2220,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Launches shock waves that\n" "always inflict 40 HP damage."), - .effect = EFFECT_FIXED_DAMAGE_ARG, + .effect = EFFECT_FIXED_HP_DAMAGE, .power = 1, .type = TYPE_DRAGON, .accuracy = 100, @@ -2866,7 +2866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Minimizes the user's size to\n" #if B_MINIMIZE_EVASION >= GEN_5 "sharply raise evasiveness."), - #else + #else "raise evasiveness."), #endif .effect = EFFECT_MINIMIZE, @@ -3704,7 +3704,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( #if B_UPDATED_MOVE_DATA >= GEN_5 "Envelops the foes in a toxic\n" - #else + #else "Envelops the foe in a toxic\n" #endif "gas that may poison."), @@ -4308,7 +4308,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Attacks with sharp fangs\n" "and cuts half the foe's HP."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, @@ -4316,6 +4316,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = { .damagePercentage = 50 }, .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, @@ -6053,7 +6054,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Spins attack that removes\n" #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 "some effects and ups speed."), - #else + #else "certain effects."), #endif .effect = EFFECT_RAPID_SPIN, @@ -6280,7 +6281,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #else "The type and effectiveness\n" "vary with the user."), - #endif + #endif .power = B_HIDDEN_POWER_DMG >= GEN_6 ? 60 : 1, .effect = EFFECT_HIDDEN_POWER, .type = TYPE_NORMAL, @@ -9621,7 +9622,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Whips up a breeze, doubling\n" #if B_TAILWIND_TURNS >= GEN_5 "ally Speed for 4 turns."), - #else + #else "ally Speed for 3 turns."), #endif .effect = EFFECT_TAILWIND, @@ -17089,7 +17090,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Halves the foe's HP with\n" "the power of nature."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_FAIRY, .accuracy = 90, @@ -20174,7 +20175,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Summons a ruinous disaster\n" "and cuts half the foe's HP."), - .effect = EFFECT_SUPER_FANG, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_DARK, .accuracy = 90, @@ -21641,7 +21642,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "The Land Spirit Pokémon\n" "greatly reduces the foe's HP."), - .effect = EFFECT_GUARDIAN_OF_ALOLA, + .effect = EFFECT_FIXED_PERCENT_DAMAGE, .power = 1, .type = TYPE_FAIRY, .accuracy = 0, @@ -21649,6 +21650,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { .damagePercentage = 75 }, .battleAnimScript = gBattleAnimMove_GuardianOfAlola, }, [MOVE_SEARING_SUNRAZE_SMASH] = diff --git a/test/battle/ability/cud_chew.c b/test/battle/ability/cud_chew.c index 486e2e9dac..82e7666bdd 100644 --- a/test/battle/ability/cud_chew.c +++ b/test/battle/ability/cud_chew.c @@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t GIVEN { ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } } WHEN { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index a929c82068..bbfcccafda 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -630,7 +630,7 @@ SINGLE_BATTLE_TEST("Dynamax: Super Fang uses a Pokemon's non-Dynamax HP", s16 da PARAMETRIZE { dynamax = GIMMICK_NONE; } PARAMETRIZE { dynamax = GIMMICK_DYNAMAX; } GIVEN { - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index fd5635d3fc..0133340618 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -630,10 +630,10 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Clangorous Soulblaze boosts all the user's stats by } } -SINGLE_BATTLE_TEST("(Z-MOVE) Guardian of Alola deals 75\% of the target's current HP") +SINGLE_BATTLE_TEST("(Z-MOVE) Guardian of Alola deals 75% of the target's current HP") { GIVEN { - ASSUME(GetMoveEffect(MOVE_GUARDIAN_OF_ALOLA) == EFFECT_GUARDIAN_OF_ALOLA); + ASSUME(GetMoveEffect(MOVE_GUARDIAN_OF_ALOLA) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_TAPU_FINI) { Item(ITEM_TAPUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/attack_up.c b/test/battle/hold_effect/attack_up.c index 2030faf782..e9efef9ad5 100644 --- a/test/battle/hold_effect/attack_up.c +++ b/test/battle/hold_effect/attack_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Liechi Berry raises the holder's Attack by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_hit_up.c index e571d39247..770505115b 100644 --- a/test/battle/hold_effect/critical_hit_up.c +++ b/test/battle/hold_effect/critical_hit_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_LANSAT_BERRY].holdEffect == HOLD_EFFECT_CRITICAL_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/defense_up.c b/test/battle/hold_effect/defense_up.c index cf1ea04b40..a29f75b1e5 100644 --- a/test/battle/hold_effect/defense_up.c +++ b/test/battle/hold_effect/defense_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_GANLON_BERRY].holdEffect == HOLD_EFFECT_DEFENSE_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Ganlon Berry raises the holder's Defense by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 47e0b8e53b..24d3ef1cd6 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_MICLE_BERRY].holdEffect == HOLD_EFFECT_MICLE_BERRY); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2 when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index 33fbc0558b..82f1b0b184 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -252,8 +252,8 @@ SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP at move end, one strike") hpGainActual = min(maxHp - hp, hpGainFromDamage); GIVEN { - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(hp); Item(ITEM_SHELL_BELL); } OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHp); HP(opponentHp); } } WHEN { diff --git a/test/battle/hold_effect/special_attack_up.c b/test/battle/hold_effect/special_attack_up.c index 148b7abf1b..f4256a5335 100644 --- a/test/battle/hold_effect/special_attack_up.c +++ b/test/battle/hold_effect/special_attack_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_PETAYA_BERRY].holdEffect == HOLD_EFFECT_SP_ATTACK_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/special_defense_up.c b/test/battle/hold_effect/special_defense_up.c index 266f954503..e7d8f9a170 100644 --- a/test/battle/hold_effect/special_defense_up.c +++ b/test/battle/hold_effect/special_defense_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index 7fb24295d4..b1725597a9 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_SALAC_BERRY].holdEffect == HOLD_EFFECT_SPEED_UP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); } SINGLE_BATTLE_TEST("Salac Berry raises the holder's Speed by one stage when HP drops to 1/4 or below") diff --git a/test/battle/move.c b/test/battle/move.c index 541dc3812c..5a95c21d89 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -89,7 +89,7 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_JUNGLE_HEALING); ASSUME(GetMoveEffect(MOVE_CRUSH_GRIP) == EFFECT_POWER_BASED_ON_TARGET_HP); - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); } diff --git a/test/battle/move_effect/fixed_damage_arg.c b/test/battle/move_effect/fixed_damage_arg.c index 8cb2987072..ca39ff1c83 100644 --- a/test/battle/move_effect/fixed_damage_arg.c +++ b/test/battle/move_effect/fixed_damage_arg.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_SONIC_BOOM) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveEffect(MOVE_SONIC_BOOM) == EFFECT_FIXED_HP_DAMAGE); } SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Sonic Boom deals fixed damage", s16 damage) PARAMETRIZE { mon = SPECIES_ARON; } GIVEN { - ASSUME(GetMoveFixedDamage(MOVE_SONIC_BOOM) == 20); + ASSUME(GetMoveFixedHPDamage(MOVE_SONIC_BOOM) == 20); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { diff --git a/test/battle/move_effect/magic_room.c b/test/battle/move_effect/magic_room.c index b1be6ac5bc..3343fd6f66 100644 --- a/test/battle/move_effect/magic_room.c +++ b/test/battle/move_effect/magic_room.c @@ -10,8 +10,8 @@ DOUBLE_BATTLE_TEST("Magic Room prevents item hold effects") { GIVEN { ASSUME(gItemsInfo[ITEM_BERRY_JUICE].holdEffect == HOLD_EFFECT_RESTORE_HP); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(60); Item(ITEM_BERRY_JUICE); } PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(60); Item(ITEM_BERRY_JUICE); } diff --git a/test/battle/move_effect/shed_tail.c b/test/battle/move_effect/shed_tail.c index 4ce05c3f8c..491c7b3552 100644 --- a/test/battle/move_effect/shed_tail.c +++ b/test/battle/move_effect/shed_tail.c @@ -110,8 +110,8 @@ SINGLE_BATTLE_TEST("Shed Tail creates a Substitute with 1/4 of user maximum heal PARAMETRIZE { hp = 164; } GIVEN { - ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40); - ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); PLAYER(SPECIES_BULBASAUR) { MaxHP(hp); } PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_CHARMANDER); diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index e8a0999048..d76ef035d6 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -141,7 +141,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { - ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_SUPER_FANG); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); From 1a6ed207139193286dbaa608177de1ab84ce9db9 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Tue, 3 Jun 2025 22:05:22 +0200 Subject: [PATCH 032/248] =?UTF-8?q?Add=20dedicated=20getter=20functions=20?= =?UTF-8?q?for=20Pok=C3=A9mon=20types=20and=20abilities=20(#7043)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tutorials/how_to_testing_system.md | 2 +- include/battle.h | 10 +-- include/pokemon.h | 12 ++- include/test/battle.h | 2 +- src/battle_ai_main.c | 8 +- src/battle_ai_switch_items.c | 6 +- src/battle_ai_util.c | 36 ++++----- src/battle_controller_player.c | 2 +- src/battle_dome.c | 38 ++++----- src/battle_factory.c | 6 +- src/battle_main.c | 16 ++-- src/battle_pike.c | 14 ++-- src/battle_pyramid.c | 10 +-- src/battle_script_commands.c | 14 ++-- src/battle_util.c | 28 +++---- src/contest.c | 2 +- src/dexnav.c | 12 +-- src/event_object_movement.c | 2 +- src/field_specials.c | 2 +- src/party_menu.c | 6 +- src/pokedex.c | 8 +- src/pokedex_plus_hgss.c | 24 +++--- src/pokemon.c | 65 +++++++++++++--- src/pokemon_summary_screen.c | 6 +- src/trade.c | 4 +- src/type_icons.c | 6 +- src/union_room.c | 2 +- src/wild_encounter.c | 2 +- test/battle/ability/aerilate.c | 8 +- test/battle/ability/anticipation.c | 78 +++++++++---------- test/battle/ability/color_change.c | 4 +- test/battle/ability/dry_skin.c | 8 +- test/battle/ability/galvanize.c | 8 +- test/battle/ability/magic_bounce.c | 2 +- test/battle/ability/mimicry.c | 4 +- test/battle/ability/normalize.c | 14 ++-- test/battle/ability/parental_bond.c | 2 +- test/battle/ability/pixilate.c | 8 +- test/battle/ability/prankster.c | 2 +- test/battle/ability/quark_drive.c | 2 +- test/battle/ability/refrigerate.c | 8 +- test/battle/ability/rivalry.c | 2 +- test/battle/ability/sand_force.c | 4 +- test/battle/ability/sand_rush.c | 4 +- test/battle/ability/schooling.c | 6 +- test/battle/ability/slush_rush.c | 4 +- test/battle/ability/super_luck.c | 2 +- test/battle/ability/swarm.c | 6 +- test/battle/ability/zen_mode.c | 12 +-- test/battle/ai/ai.c | 8 +- test/battle/ai/ai_choice.c | 6 +- test/battle/ai/ai_double_ace.c | 6 +- test/battle/ai/ai_flag_risky.c | 8 +- test/battle/ai/ai_switching.c | 38 ++++----- test/battle/crit_chance.c | 2 +- test/battle/form_change/mega_evolution.c | 10 +-- test/battle/gimmick/dynamax.c | 2 +- test/battle/gimmick/zmove.c | 10 +-- test/battle/hold_effect/leek.c | 6 +- test/battle/hold_effect/luck_punch.c | 2 +- test/battle/hold_effect/scope_lens.c | 2 +- test/battle/hold_effect/seeds.c | 2 +- test/battle/move_effect/defog.c | 4 +- test/battle/move_effect/dragon_cheer.c | 2 +- test/battle/move_effect/dragon_darts.c | 10 +-- test/battle/move_effect/electrify.c | 8 +- test/battle/move_effect/explosion.c | 2 +- .../battle/move_effect/fail_if_not_arg_type.c | 20 ++--- test/battle/move_effect/flower_shield.c | 8 +- test/battle/move_effect/focus_energy.c | 2 +- test/battle/move_effect/hidden_power.c | 4 +- test/battle/move_effect/hit_switch_target.c | 2 +- test/battle/move_effect/knock_off.c | 2 +- test/battle/move_effect/leech_seed.c | 2 +- test/battle/move_effect/metronome.c | 2 +- test/battle/move_effect/mirror_move.c | 2 +- test/battle/move_effect/multi_hit.c | 2 +- test/battle/move_effect/ohko.c | 2 +- test/battle/move_effect/powder.c | 2 +- test/battle/move_effect/protect.c | 8 +- test/battle/move_effect/reflect_type.c | 36 ++++----- test/battle/move_effect/roost.c | 38 ++++----- test/battle/move_effect/rototiller.c | 16 ++-- test/battle/move_effect/sky_drop.c | 2 +- test/battle/move_effect/spikes.c | 4 +- test/battle/move_effect/tar_shot.c | 8 +- test/battle/move_effect/tera_blast.c | 28 +++---- test/battle/move_effect/tera_starstorm.c | 2 +- test/battle/move_effect/toxic.c | 2 +- test/battle/move_effect/toxic_spikes.c | 14 ++-- test/battle/move_effect_secondary/burn.c | 4 +- test/battle/move_effect_secondary/freeze.c | 4 +- .../battle/move_effect_secondary/ion_deluge.c | 2 +- test/battle/move_effect_secondary/paralysis.c | 4 +- test/battle/move_effect_secondary/poison.c | 4 +- .../battle/move_effect_secondary/smack_down.c | 4 +- test/battle/move_flags/critical_hit_stage.c | 2 +- test/battle/move_flags/powder.c | 2 +- test/battle/status1/paralysis.c | 2 +- test/battle/test_runner_features.c | 4 +- test/battle/trainer_slides.c | 10 +-- test/battle/weather/hail.c | 12 +-- test/battle/weather/sandstorm.c | 10 +-- test/battle/weather/snow.c | 4 +- test/pokemon.c | 12 +-- 105 files changed, 494 insertions(+), 455 deletions(-) diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index 2e5f83ff76..c5fbb945aa 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types") { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); // 1. OPPONENT(SPECIES_ODDISH); // 2. } WHEN { diff --git a/include/battle.h b/include/battle.h index b6cebae74a..77da1c4f0a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -853,11 +853,11 @@ static inline bool32 IsBattleMoveStatus(u32 move) gBattleMons[battler].types[2] = TYPE_MYSTERY; \ } -#define RESTORE_BATTLER_TYPE(battler) \ -{ \ - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; \ - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; \ - gBattleMons[battler].types[2] = TYPE_MYSTERY; \ +#define RESTORE_BATTLER_TYPE(battler) \ +{ \ + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); \ + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); \ + gBattleMons[battler].types[2] = TYPE_MYSTERY; \ } #define GET_STAT_BUFF_ID(n) ((n & 7)) // first three bits 0x1, 0x2, 0x4 diff --git a/include/pokemon.h b/include/pokemon.h index 7aaa708459..65202eb905 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -720,8 +720,16 @@ bool8 IsPokemonStorageFull(void); const u8 *GetSpeciesName(u16 species); const u8 *GetSpeciesCategory(u16 species); const u8 *GetSpeciesPokedexDescription(u16 species); -u16 GetSpeciesHeight(u16 species); -u16 GetSpeciesWeight(u16 species); +u32 GetSpeciesHeight(u16 species); +u32 GetSpeciesWeight(u16 species); +u32 GetSpeciesType(u16 species, u8 slot); +u32 GetSpeciesAbility(u16 species, u8 slot); +u32 GetSpeciesBaseHP(u16 species); +u32 GetSpeciesBaseAttack(u16 species); +u32 GetSpeciesBaseDefense(u16 species); +u32 GetSpeciesBaseSpAttack(u16 species); +u32 GetSpeciesBaseSpDefense(u16 species); +u32 GetSpeciesBaseSpeed(u16 species); const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species); const u16 *GetSpeciesTeachableLearnset(u16 species); const u16 *GetSpeciesEggMoves(u16 species); diff --git a/include/test/battle.h b/include/test/battle.h index 16b492ccad..5e9272c621 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -88,7 +88,7 @@ * { * GIVEN { * ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - * ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + * ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); * PLAYER(SPECIES_ODDISH); // 1. * OPPONENT(SPECIES_ODDISH); // 2. * } WHEN { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cea486e581..cc6ca2a8f0 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -649,7 +649,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon) { // Doesn't have any special handling yet u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 ability = gSpeciesInfo[species].abilities[GetMonData(mon, MON_DATA_ABILITY_NUM)]; + u32 ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM)); return ability; } @@ -5504,11 +5504,11 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (GetMoveEffect(move)) { case EFFECT_COUNTER: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10) + if (GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; case EFFECT_MIRROR_COAT: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10) + if (GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; case EFFECT_EXPLOSION: @@ -5521,7 +5521,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_REVENGE: - if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpeed >= gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed + 10) + if (GetSpeciesBaseSpeed(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species) + 10) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_BELLY_DRUM: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 342bc03537..2080a88a3b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1429,8 +1429,8 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 atkType1 = gBattleMons[opposingBattler].types[0]; u8 atkType2 = gBattleMons[opposingBattler].types[1]; - u8 defType1 = gSpeciesInfo[species].types[0]; - u8 defType2 = gSpeciesInfo[species].types[1]; + u8 defType1 = GetSpeciesType(species, 0); + u8 defType2 = GetSpeciesType(species, 1); typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); if (atkType2 != atkType1) @@ -1901,7 +1901,7 @@ static u16 GetSwitchinTypeMatchup(u32 opposingBattler, struct BattlePokemon batt // Check type matchup u16 typeEffectiveness = UQ_4_12(1.0); - u8 atkType1 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[0], atkType2 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[1], + u8 atkType1 = GetSpeciesType(gBattleMons[opposingBattler].species, 0), atkType2 = GetSpeciesType(gBattleMons[opposingBattler].species, 1), defType1 = battleMon.types[0], defType2 = battleMon.types[1]; // Multiply type effectiveness by a factor depending on type matchup diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b537211c87..34fda88378 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -289,11 +289,11 @@ void SetBattlerData(u32 battlerId) if (illusionSpecies != SPECIES_NONE && ShouldFailForIllusion(illusionSpecies, battlerId)) { // If the battler's type has not been changed, AI assumes the types of the illusion mon. - if (gBattleMons[battlerId].types[0] == gSpeciesInfo[species].types[0] - && gBattleMons[battlerId].types[1] == gSpeciesInfo[species].types[1]) + if (gBattleMons[battlerId].types[0] == GetSpeciesType(species, 0) + && gBattleMons[battlerId].types[1] == GetSpeciesType(species, 1)) { - gBattleMons[battlerId].types[0] = gSpeciesInfo[illusionSpecies].types[0]; - gBattleMons[battlerId].types[1] = gSpeciesInfo[illusionSpecies].types[1]; + gBattleMons[battlerId].types[0] = GetSpeciesType(illusionSpecies, 0); + gBattleMons[battlerId].types[1] = GetSpeciesType(illusionSpecies, 1); } species = illusionSpecies; } @@ -302,9 +302,9 @@ void SetBattlerData(u32 battlerId) if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) gBattleMons[battlerId].ability = gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability; // Check if mon can only have one ability. - else if (gSpeciesInfo[species].abilities[1] == ABILITY_NONE - || gSpeciesInfo[species].abilities[1] == gSpeciesInfo[species].abilities[0]) - gBattleMons[battlerId].ability = gSpeciesInfo[species].abilities[0]; + else if (GetSpeciesAbility(species, 1) == ABILITY_NONE + || GetSpeciesAbility(species, 1) == GetSpeciesAbility(species, 0)) + gBattleMons[battlerId].ability = GetSpeciesAbility(species, 0); // The ability is unknown. else gBattleMons[battlerId].ability = ABILITY_NONE; @@ -385,12 +385,12 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) u32 GetTotalBaseStat(u32 species) { - return gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense; + return GetSpeciesBaseHP(species) + + GetSpeciesBaseAttack(species) + + GetSpeciesBaseDefense(species) + + GetSpeciesBaseSpeed(species) + + GetSpeciesBaseSpAttack(species) + + GetSpeciesBaseSpDefense(species); } bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) @@ -1463,7 +1463,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) for (i = 0; i < NUM_ABILITY_SLOTS; i++) { - indexAbility = gSpeciesInfo[gBattleMons[battlerId].species].abilities[i]; + indexAbility = GetSpeciesAbility(gBattleMons[battlerId].species, i); if (indexAbility != ABILITY_NONE) { abilityAiRatings[numValidAbilities] = gAbilitiesInfo[indexAbility].aiRating; @@ -2999,8 +2999,8 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); s32 hazardDamage = 0; - u32 type1 = gSpeciesInfo[species].types[0]; - u32 type2 = gSpeciesInfo[species].types[1]; + u32 type1 = GetSpeciesType(species, 0); + u32 type2 = GetSpeciesType(species, 1); u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); if (flags == 0) @@ -4331,7 +4331,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker - && gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)) + && GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL) ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4415,7 +4415,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker - && gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)) + && GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL) ADJUST_SCORE_PTR(DECENT_EFFECT); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 1e9ac6cb5f..ad74cd03c9 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1742,7 +1742,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA) - type = gSpeciesInfo[speciesId].types[1]; + type = GetSpeciesType(speciesId, 1); } else if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX))) diff --git a/src/battle_dome.c b/src/battle_dome.c index c01dbbc25d..0ded9ada1e 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2030,8 +2030,8 @@ static void InitDomeTrainers(void) rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPDEF, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPEED, NULL); rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_MAX_HP, NULL); - monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[0]; - monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[1]; + monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 0); + monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 1); } // Count the number of types in the players party, to factor into the ranking @@ -2062,8 +2062,8 @@ static void InitDomeTrainers(void) rankingScores[i] += statValues[STAT_SPDEF]; rankingScores[i] += statValues[STAT_SPEED]; rankingScores[i] += statValues[STAT_HP]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0); + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1); } for (monTypesCount = 0, j = 0; j < 32; j++) @@ -2151,7 +2151,7 @@ static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, i } else { - int n = 2 * gSpeciesInfo[fmon->species].baseHP; + int n = 2 * GetSpeciesBaseHP(fmon->species); stats[STAT_HP] = (((n + ivs + evs[STAT_HP] / 4) * level) / 100) + level + 10; } @@ -2398,9 +2398,9 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode) if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move)) return 0; - defType1 = gSpeciesInfo[targetSpecies].types[0]; - defType2 = gSpeciesInfo[targetSpecies].types[1]; - defAbility = gSpeciesInfo[targetSpecies].abilities[0]; + defType1 = GetSpeciesType(targetSpecies, 0); + defType2 = GetSpeciesType(targetSpecies, 1); + defAbility = GetSpeciesAbility(targetSpecies, 0); moveType = GetMoveType(move); if (defAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) @@ -5146,9 +5146,9 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun targetSpecies = gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].species; if (personality & 1) - targetAbility = gSpeciesInfo[targetSpecies].abilities[1]; + targetAbility = GetSpeciesAbility(targetSpecies, 1); else - targetAbility = gSpeciesInfo[targetSpecies].abilities[0]; + targetAbility = GetSpeciesAbility(targetSpecies, 0); typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(moves[i * 4 + j], targetSpecies, targetAbility); if (typeMultiplier == UQ_4_12(0)) @@ -5820,8 +5820,8 @@ static void InitRandomTourneyTreeResults(void) statSums[i] += statValues[STAT_SPDEF]; statSums[i] += statValues[STAT_SPEED]; statSums[i] += statValues[STAT_HP]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0]; - monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1]; + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0); + monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1); } // Because GF hates temporary vars, trainerId acts like monTypesCount here. @@ -5947,12 +5947,7 @@ static void DecideRoundWinners(u8 roundId) } } species = gFacilityTrainerMons[DOME_MONS[tournamentId1][monId1]].species; - points1 += ( gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense) / 10; + points1 += GetTotalBaseStat(species) / 10; } // Random part of the formula. points1 += (Random() & 0x1F); @@ -5970,12 +5965,7 @@ static void DecideRoundWinners(u8 roundId) } } species = gFacilityTrainerMons[DOME_MONS[tournamentId2][monId1]].species; - points2 += ( gSpeciesInfo[species].baseHP - + gSpeciesInfo[species].baseAttack - + gSpeciesInfo[species].baseDefense - + gSpeciesInfo[species].baseSpeed - + gSpeciesInfo[species].baseSpAttack - + gSpeciesInfo[species].baseSpDefense) / 10; + points2 += GetTotalBaseStat(species) / 10; } // Random part of the formula. points2 += (Random() & 0x1F); diff --git a/src/battle_factory.c b/src/battle_factory.c index 5a9ab56127..50434bd09c 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -560,9 +560,9 @@ static void GetOpponentMostCommonMonType(void) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { u32 species = gFacilityTrainerMons[gFrontierTempParty[i]].species; - typeCounts[gSpeciesInfo[species].types[0]]++; - if (gSpeciesInfo[species].types[0] != gSpeciesInfo[species].types[1]) - typeCounts[gSpeciesInfo[species].types[1]]++; + typeCounts[GetSpeciesType(species, 0)]++; + if (GetSpeciesType(species, 0) != GetSpeciesType(species, 1)) + typeCounts[GetSpeciesType(species, 1)]++; } // Determine which are the two most-common types. diff --git a/src/battle_main.c b/src/battle_main.c index 4bd683aa29..9cf45280c1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3361,8 +3361,8 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->lastTakenMoveFrom[i][battler] = 0; } - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; Ai_UpdateFaintData(battler); @@ -3457,8 +3457,8 @@ static void DoBattleIntro(void) else { memcpy(&gBattleMons[battler], &gBattleResources->bufferB[battler][4], sizeof(struct BattlePokemon)); - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp; @@ -5825,8 +5825,8 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); holdEffect = GetItemHoldEffect(heldItem); ability = GetMonAbility(mon); - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); type3 = TYPE_MYSTERY; } @@ -5932,7 +5932,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case SPECIES_TAUROS_PALDEA_COMBAT: case SPECIES_TAUROS_PALDEA_BLAZE: case SPECIES_TAUROS_PALDEA_AQUA: - return gSpeciesInfo[species].types[1]; + return GetSpeciesType(species, 1); } break; case EFFECT_IVY_CUDGEL: @@ -5944,7 +5944,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case SPECIES_OGERPON_HEARTHFLAME_TERA: case SPECIES_OGERPON_CORNERSTONE: case SPECIES_OGERPON_CORNERSTONE_TERA: - return gSpeciesInfo[species].types[1]; + return GetSpeciesType(species, 1); } break; case EFFECT_NATURAL_GIFT: diff --git a/src/battle_pike.c b/src/battle_pike.c index f1857b5d82..60e4a3c67f 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -851,22 +851,22 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status) switch (status) { case STATUS1_TOXIC_POISON: - if (gSpeciesInfo[species].types[0] == TYPE_STEEL || gSpeciesInfo[species].types[0] == TYPE_POISON - || gSpeciesInfo[species].types[1] == TYPE_STEEL || gSpeciesInfo[species].types[1] == TYPE_POISON) + if (GetSpeciesType(species, 0) == TYPE_STEEL || GetSpeciesType(species, 0) == TYPE_POISON + || GetSpeciesType(species, 1) == TYPE_STEEL || GetSpeciesType(species, 1) == TYPE_POISON) ret = TRUE; break; case STATUS1_FREEZE: case STATUS1_FROSTBITE: - if (gSpeciesInfo[species].types[0] == TYPE_ICE || gSpeciesInfo[species].types[1] == TYPE_ICE) + if (GetSpeciesType(species, 0) == TYPE_ICE || GetSpeciesType(species, 1) == TYPE_ICE) ret = TRUE; break; case STATUS1_PARALYSIS: - if (gSpeciesInfo[species].types[0] == TYPE_GROUND || gSpeciesInfo[species].types[1] == TYPE_GROUND - || (B_PARALYZE_ELECTRIC >= GEN_6 && (gSpeciesInfo[species].types[0] == TYPE_ELECTRIC || gSpeciesInfo[species].types[1] == TYPE_ELECTRIC))) + if (GetSpeciesType(species, 0) == TYPE_GROUND || GetSpeciesType(species, 1) == TYPE_GROUND + || (B_PARALYZE_ELECTRIC >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC))) ret = TRUE; break; case STATUS1_BURN: - if (gSpeciesInfo[species].types[0] == TYPE_FIRE || gSpeciesInfo[species].types[1] == TYPE_FIRE) + if (GetSpeciesType(species, 0) == TYPE_FIRE || GetSpeciesType(species, 1) == TYPE_FIRE) ret = TRUE; break; case STATUS1_SLEEP: @@ -1141,7 +1141,7 @@ bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate) MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[wildMons[headerId][pikeMonId].species].growthRate][monLevel]); - if (gSpeciesInfo[wildMons[headerId][pikeMonId].species].abilities[1]) + if (GetSpeciesAbility(wildMons[headerId][pikeMonId].species, 1)) abilityNum = Random() % 2; else abilityNum = 0; diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 6e56f4867b..48c32d194a 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1426,7 +1426,7 @@ void GenerateBattlePyramidWildMon(void) continue; // check type - if (reqs->type != TYPE_MYSTERY && gSpeciesInfo[species].types[0] != reqs->type && gSpeciesInfo[species].types[1] != reqs->type) + if (reqs->type != TYPE_MYSTERY && GetSpeciesType(species, 0) != reqs->type && GetSpeciesType(species, 1) != reqs->type) continue; // check base stat total @@ -1459,7 +1459,7 @@ void GenerateBattlePyramidWildMon(void) { for (j = 0; j < NUM_ABILITY_SLOTS; j++) { - if (gSpeciesInfo[species].abilities[j] == reqs->abilities[i]) + if (GetSpeciesAbility(species, j) == reqs->abilities[i]) { abilities[abilityCount] = reqs->abilities[i]; abilityCount++; @@ -1520,7 +1520,7 @@ void GenerateBattlePyramidWildMon(void) } // Initialize a random ability num - if (gSpeciesInfo[species].abilities[1]) + if (GetSpeciesAbility(species, 1)) { i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2; SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i); @@ -1540,7 +1540,7 @@ void GenerateBattlePyramidWildMon(void) id = abilities[Random() % abilityCount]; for (j = 0; j < NUM_ABILITY_SLOTS; j++) { - if (id == gSpeciesInfo[species].abilities[j]) + if (id == GetSpeciesAbility(species, j)) { // Set this ability num SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &id); @@ -1606,7 +1606,7 @@ void GenerateBattlePyramidWildMon(void) break; case ABILITY_RANDOM: default: - if (gSpeciesInfo[wildMons[id].species].abilities[1]) + if (GetSpeciesAbility(wildMons[id].species, 1)) { i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2; SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d7eec1c322..33414378ae 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1984,7 +1984,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk); - u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed; + u16 baseSpeed = GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species); critChance = baseSpeed / 2; @@ -7596,8 +7596,8 @@ static void Cmd_switchindataupdate(void) } } - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); #if TESTING @@ -14465,10 +14465,10 @@ static void Cmd_trydobeatup(void) gBattlescriptCurrInstr = cmd->nextInstr; - gBattleStruct->moveDamage[gBattlerTarget] = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack; + gBattleStruct->moveDamage[gBattlerTarget] = GetSpeciesBaseAttack(GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)); gBattleStruct->moveDamage[gBattlerTarget] *= GetMovePower(gCurrentMove); gBattleStruct->moveDamage[gBattlerTarget] *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleStruct->moveDamage[gBattlerTarget] /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense; + gBattleStruct->moveDamage[gBattlerTarget] /= GetSpeciesBaseDefense(gBattleMons[gBattlerTarget].species); gBattleStruct->moveDamage[gBattlerTarget] = (gBattleStruct->moveDamage[gBattlerTarget] / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * 15 / 10; @@ -15312,7 +15312,7 @@ static void Cmd_pickup(void) if (lvlDivBy10 > 9) lvlDivBy10 = 9; - ability = gSpeciesInfo[species].abilities[GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)]; + ability = GetSpeciesAbility(species, GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)); if (ability == ABILITY_PICKUP && species != SPECIES_NONE @@ -15769,7 +15769,7 @@ static void Cmd_handleballthrow(void) } break; case BALL_FAST: - if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseSpeed >= 100) + if (GetSpeciesBaseSpeed(gBattleMons[gBattlerTarget].species) >= 100) ballMultiplier = 400; break; case BALL_HEAVY: diff --git a/src/battle_util.c b/src/battle_util.c index 66b1b4e042..7493b38363 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -255,7 +255,7 @@ static u32 CalcBeatUpPower(void) // Party slot is incremented by the battle script for Beat Up after this damage calculation species = GetMonData(&party[gBattleStruct->beatUpSlot], MON_DATA_SPECIES); - basePower = (gSpeciesInfo[species].baseAttack / 10) + 5; + basePower = (GetSpeciesBaseAttack(species) / 10) + 5; return basePower; } @@ -9397,7 +9397,7 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData } // Same type attack bonus - if (gSpeciesInfo[partyMonSpecies].types[0] == moveType || gSpeciesInfo[partyMonSpecies].types[1] == moveType) + if (GetSpeciesType(partyMonSpecies, 0) == moveType || GetSpeciesType(partyMonSpecies, 1) == moveType) DAMAGE_APPLY_MODIFIER(UQ_4_12(1.5)); else DAMAGE_APPLY_MODIFIER(UQ_4_12(1.0)); @@ -9528,9 +9528,9 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, { // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. uq4_12_t presumedModifier = UQ_4_12(1.0); - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE); - if (gSpeciesInfo[illusionSpecies].types[1] != gSpeciesInfo[illusionSpecies].types[0]) - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE); + MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 0), battlerAtk, FALSE); + if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0)) + MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 1), battlerAtk, FALSE); if (presumedModifier != resultingModifier) RecordAbilityBattle(battlerDef, ABILITY_ILLUSION); @@ -9663,9 +9663,9 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 a if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE); - if (gSpeciesInfo[speciesDef].types[1] != gSpeciesInfo[speciesDef].types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE); + MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 0), 0, FALSE); + if (GetSpeciesType(speciesDef, 1) != GetSpeciesType(speciesDef, 0)) + MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 1), 0, FALSE); if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) modifier = UQ_4_12(0.0); @@ -9696,8 +9696,8 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) uq4_12_t modifier = UQ_4_12(1.0); u16 abilityDef = GetMonAbility(mon); u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES); - u8 type1 = gSpeciesInfo[speciesDef].types[0]; - u8 type2 = gSpeciesInfo[speciesDef].types[1]; + u8 type1 = GetSpeciesType(speciesDef, 0); + u8 type2 = GetSpeciesType(speciesDef, 1); if (moveType != TYPE_MYSTERY) { @@ -10765,8 +10765,8 @@ void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon) void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon) { gBattleMons[battler].ability = GetMonAbility(mon); - gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; - gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); + gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; } @@ -10945,8 +10945,8 @@ bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) u16 species = GetMonData(mon, MON_DATA_SPECIES); u16 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); - bool8 hasLevitateAbility = gSpeciesInfo[species].abilities[monAbilityNum] == ABILITY_LEVITATE; - bool8 isFlyingType = gSpeciesInfo[species].types[0] == TYPE_FLYING || gSpeciesInfo[species].types[1] == TYPE_FLYING; + bool8 hasLevitateAbility = GetSpeciesAbility(species, monAbilityNum) == ABILITY_LEVITATE; + bool8 isFlyingType = GetSpeciesType(species, 0) == TYPE_FLYING || GetSpeciesType(species, 1) == TYPE_FLYING; bool8 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG); if (monIsValidAndNotEgg) diff --git a/src/contest.c b/src/contest.c index 08ff4765f9..18738843ef 100644 --- a/src/contest.c +++ b/src/contest.c @@ -5411,7 +5411,7 @@ static void SetMoveSpecificAnimData(u8 contestant) switch (move) { case MOVE_CURSE: - if (gSpeciesInfo[species].types[0] == TYPE_GHOST || gSpeciesInfo[species].types[1] == TYPE_GHOST) + if (GetSpeciesType(species, 0) == TYPE_GHOST || GetSpeciesType(species, 1) == TYPE_GHOST) gAnimMoveTurn = 0; else gAnimMoveTurn = 1; diff --git a/src/dexnav.c b/src/dexnav.c index 4ad2813b80..a839cc1208 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -1402,7 +1402,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) } if (genAbility - && gSpeciesInfo[species].abilities[2] != ABILITY_NONE + && GetSpeciesAbility(species, 2) != ABILITY_NONE && GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { //Only give hidden ability if Pokemon has been caught before @@ -1411,7 +1411,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel) else { //Pick a normal ability of that Pokemon - if (gSpeciesInfo[species].abilities[1] != ABILITY_NONE) + if (GetSpeciesAbility(species, 1) != ABILITY_NONE) abilityNum = Random() & 1; else abilityNum = 0; @@ -2138,8 +2138,8 @@ static void PrintCurrentSpeciesInfo(void) AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species)); //type icon(s) - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); if (species == SPECIES_NONE) type1 = type2 = TYPE_MYSTERY; @@ -2172,8 +2172,8 @@ static void PrintCurrentSpeciesInfo(void) } else if (GetSetPokedexFlag(dexNum, FLAG_GET_CAUGHT)) { - if (gSpeciesInfo[species].abilities[2] != ABILITY_NONE) - AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[gSpeciesInfo[species].abilities[2]].name); + if (GetSpeciesAbility(species, 2) != ABILITY_NONE) + AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[GetSpeciesAbility(species, 2)].name); else AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gText_None); } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f4418afab3..dd53773a2e 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2279,7 +2279,7 @@ bool32 IsFollowerVisible(void) static bool8 SpeciesHasType(u16 species, u8 type) { - return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; + return GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type; } // Display an emote above an object event diff --git a/src/field_specials.c b/src/field_specials.c index 6543461998..0ac0d9fa68 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1272,7 +1272,7 @@ void IsGrassTypeInParty(void) if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { species = GetMonData(pokemon, MON_DATA_SPECIES); - if (gSpeciesInfo[species].types[0] == TYPE_GRASS || gSpeciesInfo[species].types[1] == TYPE_GRASS) + if (GetSpeciesType(species, 0) == TYPE_GRASS || GetSpeciesType(species, 1) == TYPE_GRASS) { gSpecialVar_Result = TRUE; return; diff --git a/src/party_menu.c b/src/party_menu.c index 74f5531119..e22f4f7d9d 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4806,8 +4806,8 @@ void Task_AbilityCapsule(u8 taskId) { case 0: // Can't use. - if (gSpeciesInfo[tSpecies].abilities[0] == gSpeciesInfo[tSpecies].abilities[1] - || gSpeciesInfo[tSpecies].abilities[1] == 0 + if (GetSpeciesAbility(tSpecies, 0) == GetSpeciesAbility(tSpecies, 1) + || GetSpeciesAbility(tSpecies, 1) == 0 || tAbilityNum > 1 || !tSpecies) { @@ -4894,7 +4894,7 @@ void Task_AbilityPatch(u8 taskId) { case 0: // Can't use. - if (gSpeciesInfo[tSpecies].abilities[tAbilityNum] == 0 + if (GetSpeciesAbility(tSpecies, tAbilityNum) == 0 || !tSpecies ) { diff --git a/src/pokedex.c b/src/pokedex.c index 5078f5ca94..bc305a4b4a 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4995,8 +4995,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if (types[0] == type1 || types[1] == type1) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -5013,8 +5013,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 25d2faeced..77661a7fbd 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -4355,8 +4355,8 @@ static void PrintCurrentSpeciesTypeInfo(u8 newEntry, u16 species) type1 = GetTypeBySpecies(species, 1); type2 = GetTypeBySpecies(species, 2); #else - type1 = gSpeciesInfo[species].types[0]; - type2 = gSpeciesInfo[species].types[1]; + type1 = GetSpeciesType(species, 0); + type2 = GetSpeciesType(species, 1); #endif if (species == SPECIES_NONE) type1 = type2 = TYPE_MYSTERY; @@ -4777,12 +4777,12 @@ static void SaveMonDataInStruct(void) sPokedexView->sPokemonStats.species = species; sPokedexView->sPokemonStats.genderRatio = gSpeciesInfo[species].genderRatio; - sPokedexView->sPokemonStats.baseHP = gSpeciesInfo[species].baseHP; - sPokedexView->sPokemonStats.baseSpeed = gSpeciesInfo[species].baseSpeed; - sPokedexView->sPokemonStats.baseAttack = gSpeciesInfo[species].baseAttack; - sPokedexView->sPokemonStats.baseSpAttack = gSpeciesInfo[species].baseSpAttack; - sPokedexView->sPokemonStats.baseDefense = gSpeciesInfo[species].baseDefense; - sPokedexView->sPokemonStats.baseSpDefense = gSpeciesInfo[species].baseSpDefense; + sPokedexView->sPokemonStats.baseHP = GetSpeciesBaseHP(species); + sPokedexView->sPokemonStats.baseSpeed = GetSpeciesBaseSpeed(species); + sPokedexView->sPokemonStats.baseAttack = GetSpeciesBaseAttack(species); + sPokedexView->sPokemonStats.baseSpAttack = GetSpeciesBaseSpAttack(species); + sPokedexView->sPokemonStats.baseDefense = GetSpeciesBaseDefense(species); + sPokedexView->sPokemonStats.baseSpDefense = GetSpeciesBaseSpDefense(species); sPokedexView->sPokemonStats.differentEVs = differentEVs; sPokedexView->sPokemonStats.evYield_HP = evs[STAT_HP]; sPokedexView->sPokemonStats.evYield_Speed = evs[STAT_ATK]; @@ -7817,8 +7817,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if (types[0] == type1 || types[1] == type1) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; @@ -7835,8 +7835,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t { species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum); - types[0] = gSpeciesInfo[species].types[0]; - types[1] = gSpeciesInfo[species].types[1]; + types[0] = GetSpeciesType(species, 0); + types[1] = GetSpeciesType(species, 1); if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) { sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i]; diff --git a/src/pokemon.c b/src/pokemon.c index c9c14aa093..30e9b4302b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1201,7 +1201,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); - u32 teraType = (boxMon->personality & 0x1) == 0 ? gSpeciesInfo[species].types[0] : gSpeciesInfo[species].types[1]; + u32 teraType = (boxMon->personality & 0x1) == 0 ? GetSpeciesType(species, 0) : GetSpeciesType(species, 1); SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &teraType); if (fixedIV < USE_RANDOM_IVS) @@ -1278,7 +1278,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, } } - if (gSpeciesInfo[species].abilities[1]) + if (GetSpeciesAbility(species, 1)) { value = personality & 1; SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value); @@ -1792,7 +1792,7 @@ void CalculateMonStats(struct Pokemon *mon) } else { - s32 n = 2 * gSpeciesInfo[species].baseHP + hpIV; + s32 n = 2 * GetSpeciesBaseHP(species) + hpIV; newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; } @@ -3482,7 +3482,7 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum) int i; if (abilityNum < NUM_ABILITY_SLOTS) - gLastUsedAbility = gSpeciesInfo[species].abilities[abilityNum]; + gLastUsedAbility = GetSpeciesAbility(species, abilityNum); else gLastUsedAbility = ABILITY_NONE; @@ -3490,13 +3490,13 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum) { for (i = NUM_NORMAL_ABILITY_SLOTS; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++) { - gLastUsedAbility = gSpeciesInfo[species].abilities[i]; + gLastUsedAbility = GetSpeciesAbility(species, i); } } for (i = 0; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++) // look for any non-empty ability { - gLastUsedAbility = gSpeciesInfo[species].abilities[i]; + gLastUsedAbility = GetSpeciesAbility(species, i); } return gLastUsedAbility; @@ -3603,16 +3603,56 @@ const u8 *GetSpeciesPokedexDescription(u16 species) return gSpeciesInfo[species].description; } -u16 GetSpeciesHeight(u16 species) +u32 GetSpeciesHeight(u16 species) { return gSpeciesInfo[SanitizeSpeciesId(species)].height; } -u16 GetSpeciesWeight(u16 species) +u32 GetSpeciesWeight(u16 species) { return gSpeciesInfo[SanitizeSpeciesId(species)].weight; } +u32 GetSpeciesType(u16 species, u8 slot) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].types[slot]; +} + +u32 GetSpeciesAbility(u16 species, u8 slot) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].abilities[slot]; +} + +u32 GetSpeciesBaseHP(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseHP; +} + +u32 GetSpeciesBaseAttack(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseAttack; +} + +u32 GetSpeciesBaseDefense(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseDefense; +} + +u32 GetSpeciesBaseSpAttack(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpAttack; +} + +u32 GetSpeciesBaseSpDefense(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpDefense; +} + +u32 GetSpeciesBaseSpeed(u16 species) +{ + return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpeed; +} + const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species) { const struct LevelUpMove *learnset = gSpeciesInfo[SanitizeSpeciesId(species)].levelUpLearnset; @@ -3713,8 +3753,8 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL); dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL); dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); - dst->types[0] = gSpeciesInfo[dst->species].types[0]; - dst->types[1] = gSpeciesInfo[dst->species].types[1]; + dst->types[0] = GetSpeciesType(dst->species, 0); + dst->types[1] = GetSpeciesType(dst->species, 1); dst->types[2] = TYPE_MYSTERY; dst->isShiny = IsMonShiny(src); dst->ability = GetAbilityBySpecies(dst->species, dst->abilityNum); @@ -4641,8 +4681,8 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti for (j = 0; j < PARTY_SIZE; j++) { u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == params[i].arg1 - || gSpeciesInfo[currSpecies].types[1] == params[i].arg1) + if (GetSpeciesType(currSpecies, 0) == params[i].arg1 + || GetSpeciesType(currSpecies, 1) == params[i].arg1) { currentCondition = TRUE; break; @@ -6883,6 +6923,7 @@ u16 SanitizeSpeciesId(u16 species) bool32 IsSpeciesEnabled(u16 species) { + // This function should not use the GetSpeciesBaseHP function, as the included sanitation will result in an infinite loop return gSpeciesInfo[species].baseHP > 0 || species == SPECIES_EGG; } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 17f1f82db6..e4abb9f163 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -4276,10 +4276,10 @@ static void SetMonTypeIcons(void) } else { - SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[0], 120, 48, SPRITE_ARR_ID_TYPE); - if (gSpeciesInfo[summary->species].types[0] != gSpeciesInfo[summary->species].types[1]) + SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 0), 120, 48, SPRITE_ARR_ID_TYPE); + if (GetSpeciesType(summary->species, 0) != GetSpeciesType(summary->species, 1)) { - SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[1], 160, 48, SPRITE_ARR_ID_TYPE + 1); + SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 1), 160, 48, SPRITE_ARR_ID_TYPE + 1); SetSpriteInvisibility(SPRITE_ARR_ID_TYPE + 1, FALSE); } else diff --git a/src/trade.c b/src/trade.c index fa8e160c6d..dbb8622b80 100644 --- a/src/trade.c +++ b/src/trade.c @@ -2513,8 +2513,8 @@ int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct Rf else { // Player's Pokémon must be of the type the partner requested - if (gSpeciesInfo[playerSpecies2].types[0] != requestedType - && gSpeciesInfo[playerSpecies2].types[1] != requestedType) + if (GetSpeciesType(playerSpecies2, 0) != requestedType + && GetSpeciesType(playerSpecies2, 1) != requestedType) return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS; } diff --git a/src/type_icons.c b/src/type_icons.c index c47690fcae..ba13f86027 100644 --- a/src/type_icons.c +++ b/src/type_icons.c @@ -311,7 +311,7 @@ static u32 GetMonPublicType(u32 battlerId, u32 typeNum) return GetMonDefensiveTeraType(mon,monIllusion,battlerId,typeNum,illusionSpecies,monSpecies); if (IsIllusionActiveAndTypeUnchanged(monIllusion,monSpecies, battlerId)) - return gSpeciesInfo[illusionSpecies].types[typeNum]; + return GetSpeciesType(illusionSpecies, typeNum); return gBattleMons[battlerId].types[typeNum]; } @@ -348,7 +348,7 @@ static u32 GetMonDefensiveTeraType(struct Pokemon * mon, struct Pokemon* monIllu targetSpecies = (monIllusion != NULL) ? illusionSpecies : monSpecies; - return gSpeciesInfo[targetSpecies].types[typeNum]; + return GetSpeciesType(targetSpecies, typeNum); } static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 monSpecies, u32 battlerId) @@ -359,7 +359,7 @@ static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 mon return FALSE; for (typeNum = 0; typeNum < 2; typeNum++) - if (gSpeciesInfo[monSpecies].types[typeNum] != gBattleMons[battlerId].types[typeNum]) + if (GetSpeciesType(monSpecies, typeNum) != gBattleMons[battlerId].types[typeNum]) return FALSE; return TRUE; diff --git a/src/union_room.c b/src/union_room.c index 6042c6420a..135cf3e982 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -4193,7 +4193,7 @@ static s32 IsRequestedTradeInPlayerParty(u32 type, u32 species) for (i = 0; i < gPlayerPartyCount; i++) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); - if (gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type) + if (GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type) return UR_TRADE_MATCH; } return UR_TRADE_NOTYPE; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 37b6a43443..29f4346501 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1162,7 +1162,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u for (validMonCount = 0, i = 0; i < numMon; i++) { - if (gSpeciesInfo[wildMon[i].species].types[0] == type || gSpeciesInfo[wildMon[i].species].types[1] == type) + if (GetSpeciesType(wildMon[i].species, 0) == type || GetSpeciesType(wildMon[i].species, 1) == type) validIndexes[validMonCount++] = i; } diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index e213e177d6..c122496d51 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage) ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_HYPER_CUTTER); Item(ITEM_PINSIRITE); } } WHEN { @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type") ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_PERSIM_BERRY)].type == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SALAMENCE_MEGA, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_SALAMENCE_MEGA, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PERSIM_BERRY); } OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } } WHEN { @@ -140,7 +140,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Judgment / Techno Blast / Multi-Atta ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); } OPPONENT(SPECIES_DIGLETT); @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_AERILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c index 7a45537296..e1de10f2ff 100644 --- a/test/battle/ability/anticipation.c +++ b/test/battle/ability/anticipation.c @@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effe { GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -46,8 +46,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Normalize into their effective { GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -62,8 +62,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Scrappy into their effectivene KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_TRICK_OR_TREAT, MOVE_SKILL_SWAP, MOVE_CELEBRATE); } } WHEN { @@ -101,8 +101,8 @@ SINGLE_BATTLE_TEST("Anticipation counts Counter, Metal Burst or Mirror Coat as a PARAMETRIZE { move = MOVE_MIRROR_COAT; species = SPECIES_NIDORINO; typeAtk = TYPE_PSYCHIC; typeDef = TYPE_POISON; } GIVEN { ASSUME(GetMoveType(move) == typeAtk); - ASSUME(gSpeciesInfo[species].types[0] == typeDef); - ASSUME(gSpeciesInfo[species].types[1] == typeDef); + ASSUME(GetSpeciesType(species, 0) == typeDef); + ASSUME(GetSpeciesType(species, 1) == typeDef); PLAYER(species); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(move, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -117,10 +117,10 @@ SINGLE_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-t { GIVEN { ASSUME(GetMoveType(MOVE_SYNCHRONOISE) == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[1] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] != TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] != TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_NIDORINO, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_NIDORINO, 1) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) != TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) != TYPE_POISON); PLAYER(SPECIES_NIDORINO); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_SYNCHRONOISE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -136,8 +136,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type mo KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FREEZE_DRY, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -153,8 +153,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Flying Press as an ordinary Fighting- KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FLYING_PRESS) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[1] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 1) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FLYING_PRESS, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -169,8 +169,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Aura Wheel as an ordinary Electric-ty { GIVEN { ASSUME(GetMoveType(MOVE_AURA_WHEEL) == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_PONYTA_GALAR) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); Moves(MOVE_AURA_WHEEL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } @@ -188,8 +188,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ARCEUS) { Item(ITEM_FIST_PLATE); Moves(MOVE_JUDGMENT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -203,8 +203,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); Speed(2); } OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Moves(MOVE_WEATHER_BALL, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); Speed(4); } } WHEN { @@ -221,8 +221,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_NATURAL_GIFT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -236,8 +236,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_GENESECT) { Item(ITEM_BURN_DRIVE); Moves(MOVE_TECHNO_BLAST, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -251,9 +251,9 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); - ASSUME(gSpeciesInfo[SPECIES_ORICORIO_BAILE].types[0] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_ORICORIO_BAILE, 0) == TYPE_FIRE); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ORICORIO_BAILE) { Moves(MOVE_REVELATION_DANCE, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -267,8 +267,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N { GIVEN { ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_SILVALLY) { Item(ITEM_FIGHTING_MEMORY); Moves(MOVE_MULTI_ATTACK, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -282,8 +282,8 @@ SINGLE_BATTLE_TEST("Anticipation does not consider Strong Winds on type matchups { KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[0] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 1) == TYPE_FLYING); PLAYER(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_ROCK_SLIDE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -300,8 +300,8 @@ SINGLE_BATTLE_TEST("Anticipation does not consider ate-abilities") { GIVEN { ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[1] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 1) == TYPE_GRASS); PLAYER(SPECIES_WORMADAM_PLANT) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { @@ -315,8 +315,8 @@ SINGLE_BATTLE_TEST("Anticipation treats Hidden Power as its dynamic type (Gen6+) { KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Item(ITEM_CHOPLE_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HIDDEN_POWER, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); HPIV(30); AttackIV(2); DefenseIV(31); SpAttackIV(30); SpDefenseIV(30); SpeedIV(30); } } WHEN { @@ -335,8 +335,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Inverse Battle types") GIVEN { FLAG_SET(B_FLAG_INVERSE_BATTLE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL); PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index b6af05fdbe..e097035f62 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a move if the type of the move and the Pokemon are different") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_PSYCHIC && gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_PSYCHIC && GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_PSYCHIC); ASSUME(GetMoveType(MOVE_PSYWAVE) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a mo SINGLE_BATTLE_TEST("Color Change does not change the type when hit by a move that's the same type as itself") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] == TYPE_NORMAL || gSpeciesInfo[SPECIES_KECLEON].types[1] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) == TYPE_NORMAL || GetSpeciesType(SPECIES_KECLEON, 1) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 95a0cd8fa8..097251565f 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -41,10 +41,10 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%" GIVEN { ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMovePower(MOVE_EMBER) == 40); - ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[1] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_PARASECT, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PARASECT, 1) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET) { SpAttack(71); } OPPONENT(SPECIES_PARASECT) { Ability(ability); SpDefense(165); } } WHEN { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 981b06d580..e6569aedaf 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type") GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -129,7 +129,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Judgment / Techno Blast / Multi-Att ASSUME(gItemsInfo[ITEM_DOUSE_DRIVE].secondaryId == TYPE_WATER); ASSUME(gItemsInfo[ITEM_WATER_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_WATER_MEMORY].secondaryId == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_VAPOREON].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_VAPOREON, 0) == TYPE_WATER); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); Item(item); } OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); } } WHEN { @@ -150,7 +150,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } // HP Water OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); } } WHEN { diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index e04c018a33..56c9a32332 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass T { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { diff --git a/test/battle/ability/mimicry.c b/test/battle/ability/mimicry.c index fbdb5cf98a..849659e953 100644 --- a/test/battle/ability/mimicry.c +++ b/test/battle/ability/mimicry.c @@ -51,8 +51,8 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[1] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 1) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 4858997421..175e5b5954 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); PLAYER(SPECIES_GASTLY); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN);} } WHEN { @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Normalize affects status moves") PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DRILBUR].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DRILBUR, 0) == TYPE_GROUND); PLAYER(SPECIES_DRILBUR); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE);} } WHEN { @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t GIVEN { ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE); ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG); - ASSUME(gSpeciesInfo[SPECIES_MUDKIP].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_MUDKIP, 0) == TYPE_WATER); PLAYER(SPECIES_MUDKIP); OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY);} } WHEN { @@ -188,7 +188,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_MEGANIUM].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_MEGANIUM, 0) == TYPE_GRASS); PLAYER(SPECIES_SKITTY) { Ability(ability); } OPPONENT(SPECIES_MEGANIUM); } WHEN { @@ -214,7 +214,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type") GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_SKITTY) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -241,7 +241,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Judgment / Techno Blast / Multi-Att ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -257,7 +257,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index 2635c740df..6c516c7ffc 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -80,7 +80,7 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two GIVEN { ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } PLAYER(SPECIES_PIDGEY); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 091b48f541..7e0d98f519 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_SYLVEON) { Level(5); Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type") GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_SYLVEON) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -108,7 +108,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Judgment / Techno Blast / Multi-Atta ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index cf297214d9..fd45b94b09 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gSpeciesInfo[SPECIES_UMBREON].types[0] == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_UMBREON, 0) == TYPE_DARK); ASSUME(GetMoveCategory(MOVE_CONFUSE_RAY) == DAMAGE_CATEGORY_STATUS); } diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 61a51d3d35..a9f6e65a4b 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in") 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); + ASSUME(GetSpeciesType(SPECIES_IRON_JUGULIS, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_IRON_JUGULIS, 1) == TYPE_FLYING); PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); } OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; } WHEN { diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index 5f5092f93f..9577c6f4b7 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; } GIVEN { ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); - ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_AMAURA) { Ability(ability); } OPPONENT(SPECIES_PINSIR); } WHEN { @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type") GIVEN { ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL); PLAYER(SPECIES_AMAURA) { Ability(ability); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Judgment / Techno Blast / Multi-A ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY); ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); Item(item); } OPPONENT(SPECIES_DIGLETT); } WHEN { @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Hidden Power's type") GIVEN { ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER); ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE); - ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND); PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric OPPONENT(SPECIES_DIGLETT); } WHEN { diff --git a/test/battle/ability/rivalry.c b/test/battle/ability/rivalry.c index 85d10a5b3b..aef7361af5 100644 --- a/test/battle/ability/rivalry.c +++ b/test/battle/ability/rivalry.c @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PORYGON].abilities[0] == ABILITY_TRACE); + ASSUME(GetSpeciesAbility(SPECIES_PORYGON, 0) == ABILITY_TRACE); PLAYER(SPECIES_PORYGON) { Ability(ABILITY_TRACE); } // No genderless mon naturally gets Rivalry OPPONENT(species) { Ability(ability); }; } WHEN { diff --git a/test/battle/ability/sand_force.c b/test/battle/ability/sand_force.c index 959d437980..7592c5afec 100644 --- a/test/battle/ability/sand_force.c +++ b/test/battle/ability/sand_force.c @@ -3,8 +3,8 @@ SINGLE_BATTLE_TEST("Sand Force prevents damage from sandstorm") { - u32 type1 = gSpeciesInfo[SPECIES_SHELLOS].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_SHELLOS].types[1]; + u32 type1 = GetSpeciesType(SPECIES_SHELLOS, 0); + u32 type2 = GetSpeciesType(SPECIES_SHELLOS, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/ability/sand_rush.c b/test/battle/ability/sand_rush.c index 08dd22ef57..4d557348e5 100644 --- a/test/battle/ability/sand_rush.c +++ b/test/battle/ability/sand_rush.c @@ -3,8 +3,8 @@ SINGLE_BATTLE_TEST("Sand Rush prevents damage from sandstorm") { - u32 type1 = gSpeciesInfo[SPECIES_STOUTLAND].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_STOUTLAND].types[1]; + u32 type1 = GetSpeciesType(SPECIES_STOUTLAND, 0); + u32 type2 = GetSpeciesType(SPECIES_STOUTLAND, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/ability/schooling.c b/test/battle/ability/schooling.c index 19c2b14c8f..f4da6a2caf 100644 --- a/test/battle/ability/schooling.c +++ b/test/battle/ability/schooling.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is 25 PARAMETRIZE { level = 20; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is ov PARAMETRIZE { level = 20; overQuarterHP = TRUE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is he PARAMETRIZE { level = 20; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP); + ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL)); PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(level); diff --git a/test/battle/ability/slush_rush.c b/test/battle/ability/slush_rush.c index d7508c2cb4..8eca46f089 100644 --- a/test/battle/ability/slush_rush.c +++ b/test/battle/ability/slush_rush.c @@ -52,8 +52,8 @@ SINGLE_BATTLE_TEST("Slush Rush doesn't double speed if Cloud Nine/Air Lock is on SINGLE_BATTLE_TEST("Slush Rush doesn't prevent non-Ice types from taking damage in Hail") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CETITAN) { Ability(ABILITY_SLUSH_RUSH); } } WHEN { diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c index faaf366747..016ff3fae1 100644 --- a/test/battle/ability/super_luck.c +++ b/test/battle/ability/super_luck.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage") PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TOGEPI].baseSpeed == 20); + ASSUME(GetSpeciesBaseSpeed(SPECIES_TOGEPI) == 20); WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); }; OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/swarm.c b/test/battle/ability/swarm.c index a70c1ffb55..ce94ae22e2 100644 --- a/test/battle/ability/swarm.c +++ b/test/battle/ability/swarm.c @@ -10,9 +10,9 @@ SINGLE_BATTLE_TEST("Swarm boosts Bug-type moves in a pinch", s16 damage) ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG); ASSUME(GetMovePower(MOVE_BUG_BITE) == 60); ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(gSpeciesInfo[SPECIES_LEDYBA].types[0] == TYPE_BUG); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_LEDYBA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_LEDYBA) { Ability(ABILITY_SWARM); MaxHP(99); HP(hp); Attack(45); } OPPONENT(SPECIES_WOBBUFFET) { Defense(121); } } WHEN { diff --git a/test/battle/ability/zen_mode.c b/test/battle/ability/zen_mode.c index a3e82a2b2b..1e73961cda 100644 --- a/test/battle/ability/zen_mode.c +++ b/test/battle/ability/zen_mode.c @@ -8,8 +8,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); @@ -37,8 +37,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); @@ -65,8 +65,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is healed above PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; } GIVEN { - ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105); - ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105); + ASSUME(GetSpeciesBaseHP(standardSpecies) == 105); + ASSUME(GetSpeciesBaseHP(zenSpecies) == 105); PLAYER(standardSpecies) { Ability(ABILITY_ZEN_MODE); diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 249e686c16..0c5d8793c8 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -518,8 +518,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMovePower(MOVE_POWER_UP_PUNCH) == 40); ASSUME(GetMoveType(MOVE_POWER_UP_PUNCH) == TYPE_FIGHTING); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SQUIRTLE) { }; OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_SCRATCH, MOVE_POWER_UP_PUNCH); } @@ -544,8 +544,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") ASSUME(GetMoveType(MOVE_SUPERPOWER) == TYPE_FIGHTING); ASSUME(GetMovePower(MOVE_OUTRAGE) == 120); ASSUME(GetMoveType(MOVE_OUTRAGE) == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SQUIRTLE) { }; OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_OUTRAGE, MOVE_SUPERPOWER); } diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index fc3706ca29..d7ff7e021f 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -199,7 +199,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are trappe AI_SINGLE_BATTLE_TEST("Choiced Pokémon will switch if locked into a move the player is immune to") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); @@ -217,7 +217,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon will only see choiced moves when conside { PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); @@ -235,7 +235,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon will only see choiced moves when conside { PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSHREW].types[0] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSHREW, 0) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); diff --git a/test/battle/ai/ai_double_ace.c b/test/battle/ai/ai_double_ace.c index ce8c484b4a..3fa9ce77e0 100644 --- a/test/battle/ai/ai_double_ace.c +++ b/test/battle/ai/ai_double_ace.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); ASSUME(GetMoveType(MOVE_CRUNCH) == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); } AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn won't send out any of the Ace Mons if other options exist") @@ -76,7 +76,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn will send out an Ace M AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: Ace mons won't be switched in even if they are the best candidates") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GENGAR].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GENGAR, 0) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_SMART_SWITCHING | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_DOUBLE_ACE_POKEMON); PLAYER(SPECIES_GENGAR) { Level(10); } diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 5a2e224d48..5a076f6fe1 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -10,8 +10,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia GIVEN { ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); - ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseSpAttack == 85); - ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseAttack == 65); + ASSUME(GetSpeciesBaseSpAttack(SPECIES_GROVYLE) == 85); + ASSUME(GetSpeciesBaseAttack(SPECIES_GROVYLE) == 65); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); PLAYER(SPECIES_GROVYLE) { Level(20); Moves(MOVE_ENERGY_BALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_MIRROR_COAT); } @@ -29,8 +29,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a GIVEN { ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); - ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseAttack == 85); - ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseSpAttack == 60); + ASSUME(GetSpeciesBaseAttack(SPECIES_MARSHTOMP) == 85); + ASSUME(GetSpeciesBaseSpAttack(SPECIES_MARSHTOMP) == 60); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); PLAYER(SPECIES_MARSHTOMP) { Level(20); Moves(MOVE_WATERFALL); } OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_COUNTER); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 46c419f211..d1378812f1 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -478,8 +478,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; } PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[1] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GOLURK, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_GOLURK, 1) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchingFlag); PLAYER(SPECIES_ELECTRODE) { Speed(4); Moves(MOVE_THUNDERBOLT, MOVE_AURA_SPHERE, MOVE_PROTECT); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; @@ -500,7 +500,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will switch in trapping mon PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); } @@ -521,7 +521,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } OPPONENT(SPECIES_SNORLAX) { Speed(3); Moves(MOVE_SELF_DESTRUCT); } @@ -550,9 +550,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would { PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RHYDON, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_PELIPPER, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_PELIPPER, 1) == TYPE_FLYING); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); @@ -569,11 +569,11 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to { PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 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(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); @@ -589,11 +589,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't d { PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 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(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG); + ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE); + ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); @@ -1036,7 +1036,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities { GIVEN { ASSUME(B_PRANKSTER_DARK_TYPES >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GRENINJA].types[1] == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); Moves(MOVE_LEECH_SEED, MOVE_STUN_SPORE, MOVE_ABSORB); } @@ -1144,7 +1144,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves ASSUME(GetMoveEffect(MOVE_POLTERGEIST) == EFFECT_POLTERGEIST); ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_MANTINE].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_MANTINE, 1) == TYPE_FLYING); ASSUME(GetItemHoldEffect(ITEM_WATER_GEM) == HOLD_EFFECT_GEMS); ASSUME(GetItemSecondaryId(ITEM_WATER_GEM) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 0bc8841845..5a4dd8d653 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 3d9d9cf507..eea438229a 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -91,8 +91,8 @@ SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn orde { GIVEN { ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[0] != ABILITY_STALL - && gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[1] != ABILITY_STALL); + ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL + && GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL); PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); } OPPONENT(SPECIES_WOBBUFFET) { Speed(44); } } WHEN { @@ -158,9 +158,9 @@ SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting" { GIVEN { ASSUME(MoveMakesContact(MOVE_CRUNCH) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[0] != ABILITY_ROUGH_SKIN); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[1] != ABILITY_ROUGH_SKIN); - ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[2] != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 0) != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 1) != ABILITY_ROUGH_SKIN); + ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 2) != ABILITY_ROUGH_SKIN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GARCHOMP) { Ability(ABILITY_ROUGH_SKIN); Item(ITEM_GARCHOMPITE); HP(1); } } WHEN { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index bbfcccafda..220eaa362c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -875,7 +875,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Overgrowth sets up Grassy Terrain") s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; } WHEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 0133340618..27e45455c6 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are not affected by -ate abilities") { GIVEN { ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Item(ITEM_NORMALIUM_Z); } OPPONENT(SPECIES_SWELLOW); } WHEN { @@ -182,9 +182,9 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_CURSE activates Z_EFFECT_RECOVER_HP or Z_E PARAMETRIZE { species = SPECIES_DUSCLOPS; } GIVEN { ASSUME(GetMoveType(MOVE_CURSE) == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_DUSCLOPS].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_DUSCLOPS, 0) == TYPE_GHOST); ASSUME(GetMoveZEffect(MOVE_CURSE) == Z_EFFECT_CURSE); PLAYER(species) { Item(ITEM_GHOSTIUM_Z); HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -528,7 +528,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU_PARTNER].baseSpeed == 90); + ASSUME(GetSpeciesBaseSpeed(SPECIES_PIKACHU_PARTNER) == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c index 7ff6610279..1775681d5f 100644 --- a/test/battle/hold_effect/leek.c +++ b/test/battle/hold_effect/leek.c @@ -21,9 +21,9 @@ SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfet PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - ASSUME(gSpeciesInfo[SPECIES_FARFETCHD].baseSpeed == 60); - ASSUME(gSpeciesInfo[SPECIES_FARFETCHD_GALAR].baseSpeed == 55); - ASSUME(gSpeciesInfo[SPECIES_SIRFETCHD].baseSpeed == 65); + ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD) == 60); + ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD_GALAR) == 55); + ASSUME(GetSpeciesBaseSpeed(SPECIES_SIRFETCHD) == 65); ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Item(ITEM_LEEK); } diff --git a/test/battle/hold_effect/luck_punch.c b/test/battle/hold_effect/luck_punch.c index 02faaed6a8..0bdae8134c 100644 --- a/test/battle/hold_effect/luck_punch.c +++ b/test/battle/hold_effect/luck_punch.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Cha GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); - ASSUME(gSpeciesInfo[SPECIES_CHANSEY].baseSpeed == 50); + ASSUME(GetSpeciesBaseSpeed(SPECIES_CHANSEY) == 50); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHANSEY) { Item(ITEM_LUCKY_PUNCH); } } WHEN { diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c index f5b616ecea..06c9c4a0dc 100644 --- a/test/battle/hold_effect/scope_lens.c +++ b/test/battle/hold_effect/scope_lens.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage") GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index 35b89c0085..53cca3c211 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -146,7 +146,7 @@ SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected PARAMETRIZE { species = SPECIES_TAPU_FINI; ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } PARAMETRIZE { species = SPECIES_TAPU_LELE; ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_PIDGEY) { Item(item); } OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index d4c6650c72..ce0ab844c7 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -304,7 +304,7 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } OPPONENT(SPECIES_GLALIE) { Speed(2); } @@ -336,7 +336,7 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") { GIVEN { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } PLAYER(SPECIES_GLALIE) { Speed(12); } diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index 53125f042f..c6dfa3c4dd 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -64,7 +64,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].baseSpeed == 50); + ASSUME(GetSpeciesBaseSpeed(SPECIES_DRATINI) == 50); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DRATINI); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 1d94968a09..13a165a459 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); } SINGLE_BATTLE_TEST("Dragon Darts strikes twice") @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if the other one is F PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(speciesLeft); @@ -257,7 +257,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if one strike misses") DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me user") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -276,7 +276,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me us DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy type follow me user") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -295,7 +295,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy typ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike the second target if first target fainted and follow me was active") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index dbb6862fb6..0bbf58e01e 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (single move)") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SANDSLASH); @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (double move)") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); @@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") { KNOWN_FAILING; GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveType(MOVE_LEER) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type") SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves when hitting its target") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND); ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); ASSUME(GetMoveType(MOVE_FUTURE_SIGHT) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index 52eec1a8e2..8185171796 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Explosion causes the user to faint even if it has no effect" { GIVEN { ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTLY); } WHEN { diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 368c3410c0..3a8cb67a2d 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -6,8 +6,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type") GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type") GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints") GIVEN { ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); PLAYER(SPECIES_CYNDAQUIL); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { @@ -61,8 +61,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -98,8 +98,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints") GIVEN { ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE); ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC); PLAYER(SPECIES_PIKACHU); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index 784cce99f2..b064b0620a 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -9,10 +9,10 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_TANGROWTH); OPPONENT(SPECIES_SUNKERN); diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index 8ecb3ccb47..621000c4b9 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index 124d78c96a..a04482eb29 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -111,8 +111,8 @@ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") GIVEN { if (hidden) { ASSUME(gTypeEffectivenessTable[type][foeType] == UQ_4_12(2.0)); // Foe's Type resists - ASSUME(gSpeciesInfo[foeSpecies].types[0] == gSpeciesInfo[foeSpecies].types[1]); // Foe's pure type - ASSUME(gSpeciesInfo[foeSpecies].types[0] == foeType); // Foe is the super-effective type + ASSUME(GetSpeciesType(foeSpecies, 0) == GetSpeciesType(foeSpecies, 1)); // Foe's pure type + ASSUME(GetSpeciesType(foeSpecies, 0) == foeType); // Foe is the super-effective type ASSUME(GetItemHoldEffect(foeItem) == HOLD_EFFECT_RESIST_BERRY); // Item is resist berry ASSUME(GetItemHoldEffectParam(foeItem) == type); // Resist berry of type PLAYER(SPECIES_DUNSPARCE) { HPIV(hp); AttackIV(atk); DefenseIV(def); SpAttackIV(spAtk); SpDefenseIV(spDef); SpeedIV(speed); } diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index e0d6548ec3..251279e198 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -145,7 +145,7 @@ SINGLE_BATTLE_TEST("Dragon Tail switches target out and incoming mon has Levitat GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); - ASSUME(gSpeciesInfo[SPECIES_WEEZING].types[0] == TYPE_POISON || gSpeciesInfo[SPECIES_WEEZING].types[1] == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_WEEZING, 0) == TYPE_POISON || GetSpeciesType(SPECIES_WEEZING, 1) == TYPE_POISON); PLAYER(SPECIES_PANCHAM) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_LEVITATE); } diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 626e0cde28..748e660c8b 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items if target is immune") { GIVEN { ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); - ASSUME(gSpeciesInfo[SPECIES_DONPHAN].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_DONPHAN].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_DONPHAN, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_DONPHAN, 1) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); }; } WHEN { diff --git a/test/battle/move_effect/leech_seed.c b/test/battle/move_effect/leech_seed.c index 56da50a12b..96ecf205da 100644 --- a/test/battle/move_effect/leech_seed.c +++ b/test/battle/move_effect/leech_seed.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Leech Seed doesn't affect Grass-type Pokémon") { PASSES_RANDOMLY(90, 100, RNG_ACCURACY); GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ODDISH); } WHEN { diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 3bb178e2f2..2419ecb1e4 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") { GIVEN { ASSUME(IsPowderMove(MOVE_POISON_POWDER)); - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 905fb32d31..642998cbcf 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_STUN_SPORE) == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_ODDISH); diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index c257ddd3b2..7052a52cbf 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -177,7 +177,7 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co GIVEN { ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CLEFAIRY) { HP(1); } } WHEN { diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 415f36e752..562045afb3 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") { GIVEN { ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); } WHEN { diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index aca96693de..0cbe273ef2 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -135,7 +135,7 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") 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); + ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS); PLAYER(SPECIES_VENUSAUR); OPPONENT(SPECIES_VIVILLON); } WHEN { diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index e0c32e5267..3ec96d5d48 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -537,10 +537,10 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decora DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all battlers") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_TANGROWTH); OPPONENT(SPECIES_SUNKERN); diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index ae2b7cc3fe..7b94aee34e 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -86,10 +86,10 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms") SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -107,10 +107,10 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types") SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_POLIWRATH); } WHEN { @@ -129,10 +129,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types") SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 1) == TYPE_ROCK); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_SUDOWOODO); } WHEN { @@ -151,10 +151,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type") SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's 1st and 2nd types if the target only has a 3rd type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARCANINE); } WHEN { @@ -202,8 +202,8 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the user is Terastallized") SINGLE_BATTLE_TEST("Reflect Type succeeds against a Terastallized target and copies its Tera type") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] != TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] != TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) != TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) != TYPE_NORMAL); PLAYER(SPECIES_ARCANINE) { TeraType(TYPE_NORMAL); } OPPONENT(SPECIES_POLIWRATH); } WHEN { diff --git a/test/battle/move_effect/roost.c b/test/battle/move_effect/roost.c index 51d9499bd1..8748508c9b 100644 --- a/test/battle/move_effect/roost.c +++ b/test/battle/move_effect/roost.c @@ -4,8 +4,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FLYING); // One attack of each type to verify typelessness ASSUME(GetMoveType(MOVE_POUND) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING); @@ -85,8 +85,8 @@ SINGLE_BATTLE_TEST("Roost recovers 50% of the user's Max HP") SINGLE_BATTLE_TEST("Roost suppresses the user's Flying-typing this turn, then restores it at the end of the turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[0] == TYPE_STEEL); - ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SKARMORY, 0) == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_SKARMORY, 1) == TYPE_FLYING); PLAYER(SPECIES_SKARMORY) { HP(50); MaxHP(100); Ability(ABILITY_STURDY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -131,8 +131,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Flying/Flying type, treats the user as a PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[0] == TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 0) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 1) == TYPE_FLYING); PLAYER(SPECIES_TORNADUS) { HP(50); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -199,8 +199,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_MOLTRES, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_MOLTRES, 1) == TYPE_FLYING); PLAYER(SPECIES_MOLTRES) { HP(300); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -228,8 +228,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_FLYING); PLAYER(SPECIES_KECLEON) { Speed(40); HP(150); Ability(ABILITY_COLOR_CHANGE); } PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_PIDGEY) { Speed(30); } @@ -255,7 +255,7 @@ DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by Delta Stream") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_RAYQUAZA, 1) == TYPE_FLYING); PLAYER(SPECIES_RAYQUAZA) { HP(1); Ability(ABILITY_DELTA_STREAM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -272,8 +272,8 @@ SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by De SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end of the turn") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_SWELLOW) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -296,8 +296,8 @@ SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end o SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); PLAYER(SPECIES_SWELLOW) { HP(1); Ability(ABILITY_GRASSY_SURGE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -315,10 +315,10 @@ SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing") SINGLE_BATTLE_TEST("Roost's suppression prevents Reflect Type from copying any Flying typing") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_SWELLOW) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/rototiller.c b/test/battle/move_effect/rototiller.c index 34b62a2666..73ad6c9c85 100644 --- a/test/battle/move_effect/rototiller.c +++ b/test/battle/move_effect/rototiller.c @@ -9,8 +9,8 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass types on the field") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_SNIVY].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_SNIVY, 0) == TYPE_GRASS); PLAYER(SPECIES_TANGELA); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNIVY); @@ -38,8 +38,8 @@ DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass typ SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets") SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_TANGELA); OPPONENT(SPECIES_TANGELA); @@ -76,9 +76,9 @@ SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerable") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TANGELA); diff --git a/test/battle/move_effect/sky_drop.c b/test/battle/move_effect/sky_drop.c index c2a1e104e1..32adc67d73 100644 --- a/test/battle/move_effect/sky_drop.c +++ b/test/battle/move_effect/sky_drop.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Sky Drop does no damage to Flying type Pokémon") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_PIDGEY].weight < 2000); - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY); } WHEN { diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 187b9ce7ac..03dcec84f4 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -94,13 +94,13 @@ SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon") u32 move2 = MOVE_CELEBRATE; bool32 airborne; - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; } PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; } - ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE); + ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE); PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; } PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; } diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index f2aac4e552..01fd72018f 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -14,10 +14,10 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o PARAMETRIZE { species = SPECIES_WOBBUFFET; } PARAMETRIZE { species = SPECIES_OMASTAR; } // Dual type with double resists - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[1] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_OMASTAR, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_OMASTAR, 1) == TYPE_WATER); ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); GIVEN { diff --git a/test/battle/move_effect/tera_blast.c b/test/battle/move_effect/tera_blast.c index 63e7a776b9..060e28802d 100644 --- a/test/battle/move_effect/tera_blast.c +++ b/test/battle/move_effect/tera_blast.c @@ -46,20 +46,20 @@ SINGLE_BATTLE_TEST("Tera Blast has correct effectiveness for every Tera Type") PARAMETRIZE { species = SPECIES_ABRA; type = TYPE_DARK; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[0] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[1] == TYPE_GRASS); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST); - ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[1] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[0] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[1] == TYPE_WATER); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[0] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[1] == TYPE_DRAGON); - ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[0] == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[1] == TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_ABRA].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_ABRA].types[1] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 1) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_GASTLY, 1) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_TOTODILE, 0) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_TOTODILE, 1) == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_DRATINI, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_DRATINI, 1) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_SNEASEL, 0) == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_SNEASEL, 1) == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_ABRA, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ABRA, 1) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET) { TeraType(type); } OPPONENT(species); } WHEN { diff --git a/test/battle/move_effect/tera_starstorm.c b/test/battle/move_effect/tera_starstorm.c index c1d8794576..c3d2d7ef3a 100644 --- a/test/battle/move_effect/tera_starstorm.c +++ b/test/battle/move_effect/tera_starstorm.c @@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm remains Normal-type if used by Pokemon other { GIVEN { ASSUME(GetMoveType(MOVE_TERA_STARSTORM) == TYPE_NORMAL); - ASSUME(gSpeciesInfo[SPECIES_MISDREAVUS].types[0] == TYPE_GHOST); + ASSUME(GetSpeciesType(SPECIES_MISDREAVUS, 0) == TYPE_GHOST); PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } OPPONENT(SPECIES_MISDREAVUS); } WHEN { diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index c25b4fc640..ef7c8f011a 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type") PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; } GIVEN { ASSUME(B_TOXIC_NEVER_MISS >= GEN_6); - ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); PLAYER(species); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index 5452f66a8b..4d4dbf7c43 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -97,13 +97,13 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon") u32 move2 = MOVE_CELEBRATE; bool32 airborne; - ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; } PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; } PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; } - ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE); + ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE); PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; } PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; } PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; } @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon") SINGLE_BATTLE_TEST("Toxic Spikes do not affect Steel-types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_STEELIX].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_STEELIX, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STEELIX); @@ -163,9 +163,9 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_GRAVITY; grounded = TRUE; } PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_INGRAIN; grounded = TRUE; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_ZUBAT, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_ZUBAT, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(species) { Item(item); } @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on SINGLE_BATTLE_TEST("Toxic Spikes are not removed by Poison-type Pokémon affected by Magnet Rise on switch in") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS); diff --git a/test/battle/move_effect_secondary/burn.c b/test/battle/move_effect_secondary/burn.c index 0bc979f08e..ee25863389 100644 --- a/test/battle/move_effect_secondary/burn.c +++ b/test/battle/move_effect_secondary/burn.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Ember inflicts burn") SINGLE_BATTLE_TEST("Ember cannot burn a Fire-type Pokémon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_CHARMANDER].types[0] == TYPE_FIRE); + ASSUME(GetSpeciesType(SPECIES_CHARMANDER, 0) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHARMANDER); } WHEN { @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type Pokémon") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); + ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); ASSUME(MoveHasAdditionalEffect(MOVE_SCALD, MOVE_EFFECT_BURN) == TRUE); ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 645c134a81..01a4b31c06 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Powder Snow cannot freeze an Ice-type Pokémon") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SNORUNT].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_SNORUNT, 0) == TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORUNT); } WHEN { @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALAR].types[0] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_ARTICUNO_GALAR, 0) == TYPE_PSYCHIC); ASSUME(MoveHasAdditionalEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); ASSUME(GetMoveType(MOVE_FREEZING_GLARE) == TYPE_PSYCHIC); PLAYER(SPECIES_ARTICUNO_GALAR); diff --git a/test/battle/move_effect_secondary/ion_deluge.c b/test/battle/move_effect_secondary/ion_deluge.c index 99683d2a92..21d37de407 100644 --- a/test/battle/move_effect_secondary/ion_deluge.c +++ b/test/battle/move_effect_secondary/ion_deluge.c @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Plasma Fists turns normal moves into electric for the remain SINGLE_BATTLE_TEST("Plasma Fists does not set up Ion Deluge if it does not connect") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PHANPY].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_PHANPY].types[1] == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_PHANPY, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_PHANPY, 1) == TYPE_GROUND); PLAYER(SPECIES_KRABBY); OPPONENT(SPECIES_PHANPY); } WHEN { diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 711ca11ee8..baa2183064 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type") { GIVEN { ASSUME(B_PARALYZE_ELECTRIC >= GEN_6); - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types") #endif { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_TAUROS, 0) == TYPE_NORMAL); ASSUME(MoveHasAdditionalEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE); ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL); PLAYER(SPECIES_TAUROS); diff --git a/test/battle/move_effect_secondary/poison.c b/test/battle/move_effect_secondary/poison.c index 63b2816bfd..e201ec83b9 100644 --- a/test/battle/move_effect_secondary/poison.c +++ b/test/battle/move_effect_secondary/poison.c @@ -25,8 +25,8 @@ SINGLE_BATTLE_TEST("Poison cannot be inflicted on Poison and Steel-type Pokémon PARAMETRIZE { mon = SPECIES_REGISTEEL; } GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE); - ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON); - ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); + ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { diff --git a/test/battle/move_effect_secondary/smack_down.c b/test/battle/move_effect_secondary/smack_down.c index c0d0e55eca..f31d291dd2 100644 --- a/test/battle/move_effect_secondary/smack_down.c +++ b/test/battle/move_effect_secondary/smack_down.c @@ -47,8 +47,8 @@ SINGLE_BATTLE_TEST("Smack Down does not ground target if target is immune") { GIVEN { ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); - ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_FLYING); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLISCOR); } WHEN { diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index 02999e9a8a..d82b4334f3 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a GIVEN { WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33); + ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index 04920f79f3..bb0b1e3e4f 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon") { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ODDISH); } WHEN { diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 64ed27f361..0635e83d1d 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -66,7 +66,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); ASSUME(B_PARALYZE_ELECTRIC >= GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); diff --git a/test/battle/test_runner_features.c b/test/battle/test_runner_features.c index 6b84c4fc2d..bb4840799f 100644 --- a/test/battle/test_runner_features.c +++ b/test/battle/test_runner_features.c @@ -4,8 +4,8 @@ ASSUMPTIONS { int i; for (i = 0; i < NUM_ABILITY_SLOTS; i++) { - ASSUME(gSpeciesInfo[SPECIES_KADABRA].abilities[i] != ABILITY_QUARK_DRIVE); - ASSUME(gSpeciesInfo[SPECIES_ALAKAZAM].abilities[i] != ABILITY_ELECTRIC_SURGE); + ASSUME(GetSpeciesAbility(SPECIES_KADABRA, i) != ABILITY_QUARK_DRIVE); + ASSUME(GetSpeciesAbility(SPECIES_ALAKAZAM, i) != ABILITY_ELECTRIC_SURGE); } } diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index d76ef035d6..273885fe75 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; GIVEN { - ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); + ASSUME((GetMoveType(MOVE_VINE_WHIP)) == GetSpeciesType(SPECIES_BULBASAUR, 0)); PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -77,8 +77,8 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") GIVEN { ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -110,7 +110,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); } WHEN { @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/weather/hail.c b/test/battle/weather/hail.c index df5a34469c..3a0dd53026 100644 --- a/test/battle/weather/hail.c +++ b/test/battle/weather/hail.c @@ -5,9 +5,9 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WYNAUT].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WYNAUT].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WYNAUT, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WYNAUT, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); } SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") SINGLE_BATTLE_TEST("Hail damage does not affect Ice-type Pokémon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLALIE); } WHEN { @@ -94,8 +94,8 @@ SINGLE_BATTLE_TEST("Hail damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Hail doesn't do damage when weather is negated") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } } WHEN { diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 2ff0697597..96a440a10e 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -43,9 +43,9 @@ SINGLE_BATTLE_TEST("Sandstorm damage does not hurt Ground, Rock, and Steel-type PARAMETRIZE { mon = SPECIES_NOSEPASS; } PARAMETRIZE { mon = SPECIES_REGISTEEL; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_NOSEPASS].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_NOSEPASS, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { @@ -97,8 +97,8 @@ SINGLE_BATTLE_TEST("Sandstorm damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Sandstorm doesn't do damage when weather is negated") { - u32 type1 = gSpeciesInfo[SPECIES_STOUTLAND].types[0]; - u32 type2 = gSpeciesInfo[SPECIES_STOUTLAND].types[1]; + u32 type1 = GetSpeciesType(SPECIES_STOUTLAND, 0); + u32 type2 = GetSpeciesType(SPECIES_STOUTLAND, 1); GIVEN { ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK); ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND); diff --git a/test/battle/weather/snow.c b/test/battle/weather/snow.c index 844a6840e3..c8e0a4fbc3 100644 --- a/test/battle/weather/snow.c +++ b/test/battle/weather/snow.c @@ -5,8 +5,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); } diff --git a/test/pokemon.c b/test/pokemon.c index 4e8a1da7fa..2fbf96f816 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -29,8 +29,8 @@ TEST("Terastallization type defaults to primary or secondary type") for (i = 0; i < 128; i++) PARAMETRIZE {} CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0); teraType = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(teraType == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || teraType == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(teraType == GetSpeciesType(SPECIES_PIDGEY, 0) + || teraType == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Terastallization type can be set to any type except TYPE_NONE") @@ -61,8 +61,8 @@ TEST("Terastallization type is reset to the default types when setting Tera Type typeNone = GetTeraTypeFromPersonality(&mon); SetMonData(&mon, MON_DATA_TERA_TYPE, &typeNone); typeNone = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(typeNone == GetSpeciesType(SPECIES_PIDGEY, 0) + || typeNone == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Shininess independent from PID and OTID") @@ -302,7 +302,7 @@ TEST("givemon [all]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2); @@ -367,7 +367,7 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2); From 21f0eb15835edf162af7a753d726877d32c74ae2 Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Tue, 3 Jun 2025 17:21:17 -0400 Subject: [PATCH 033/248] Debug parties and battles (#6884) Co-authored-by: sbird --- include/data.h | 56 +++++---------- include/debug.h | 1 + src/data/debug_trainers.h | 132 ++++++++++++++++++++++++++++++++++ src/data/debug_trainers.party | 68 ++++++++++++++++++ src/debug.c | 63 ++++++++++++++-- 5 files changed, 276 insertions(+), 44 deletions(-) create mode 100644 src/data/debug_trainers.h create mode 100644 src/data/debug_trainers.party diff --git a/include/data.h b/include/data.h index 93b9e1fb1b..87b485b7d9 100644 --- a/include/data.h +++ b/include/data.h @@ -5,6 +5,7 @@ #include "constants/trainers.h" #include "constants/battle.h" #include "difficulty.h" +#include "debug.h" #define MAX_TRAINER_ITEMS 4 @@ -205,7 +206,9 @@ static inline u16 SanitizeTrainerId(u16 trainerId) static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); + u32 sanitizedTrainerId = 0; + if (gIsDebugBattle) return GetDebugAiTrainer(); + sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); return &gTrainers[difficulty][sanitizedTrainerId]; @@ -213,10 +216,9 @@ static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) static inline const enum TrainerClassID GetTrainerClassFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); + const struct Trainer *trainer = GetTrainerStructFromId(trainerId); - return gTrainers[difficulty][sanitizedTrainerId].trainerClass; + return trainer->trainerClass; } static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) @@ -230,82 +232,62 @@ static inline const u8 *GetTrainerClassNameFromId(u16 trainerId) static inline const u8 *GetTrainerNameFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); - if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + { + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName; - return gTrainers[difficulty][sanitizedTrainerId].trainerName; + } + return GetTrainerStructFromId(trainerId)->trainerName; } static inline const u8 GetTrainerPicFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; - return gTrainers[difficulty][sanitizedTrainerId].trainerPic; + return GetTrainerStructFromId(trainerId)->trainerPic; } static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].startingStatus; + return GetTrainerStructFromId(trainerId)->startingStatus; } static inline const enum TrainerBattleType GetTrainerBattleType(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].battleType; + return GetTrainerStructFromId(trainerId)->battleType; } static inline const u8 GetTrainerPartySizeFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].partySize; + return GetTrainerStructFromId(trainerId)->partySize; } static inline const bool32 DoesTrainerHaveMugshot(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; + return GetTrainerStructFromId(trainerId)->mugshotColor; } static inline const u8 GetTrainerMugshotColorFromId(u16 trainerId) { - return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].mugshotColor; + return GetTrainerStructFromId(trainerId)->mugshotColor; } static inline const u16 *GetTrainerItemsFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].items; + return GetTrainerStructFromId(trainerId)->items; } static inline const struct TrainerMon *GetTrainerPartyFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].party; + return GetTrainerStructFromId(trainerId)->party; } static inline const u64 GetTrainerAIFlagsFromId(u16 trainerId) { - u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); - enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - - return gTrainers[difficulty][sanitizedTrainerId].aiFlags; + return GetTrainerStructFromId(trainerId)->aiFlags; } #endif // GUARD_DATA_H diff --git a/include/debug.h b/include/debug.h index 1a48e9f6cd..11212ce97f 100644 --- a/include/debug.h +++ b/include/debug.h @@ -4,6 +4,7 @@ void Debug_ShowMainMenu(void); extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; const u8 *GetWeatherName(u32 weatherId); +const struct Trainer* GetDebugAiTrainer(void); extern EWRAM_DATA bool8 gIsDebugBattle; extern EWRAM_DATA u64 gDebugAIFlags; diff --git a/src/data/debug_trainers.h b/src/data/debug_trainers.h new file mode 100644 index 0000000000..0ec683e296 --- /dev/null +++ b/src/data/debug_trainers.h @@ -0,0 +1,132 @@ +// +// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/debug_trainers.party +// +// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE +// in include/config/general.h and remove this notice. +// Use sed -i '/^#line/d' 'src/data/debug_trainers.h' to remove #line markers. +// + +#line 1 "src/data/debug_trainers.party" + +#line 14 + [DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER] = + { +#line 15 + .trainerName = _("Player"), +#line 16 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 17 + .trainerPic = TRAINER_PIC_BRENDAN, + .encounterMusic_gender = +#line 19 + TRAINER_ENCOUNTER_MUSIC_MALE, + .partySize = 1, + .party = (const struct TrainerMon[]) + { + { +#line 21 + .nickname = COMPOUND_STRING("Buffie"), +#line 21 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 25 + .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), +#line 24 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 23 + .lvl = 100, +#line 22 + .nature = NATURE_BRAVE, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 26 + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER, + MOVE_CELEBRATE, + MOVE_CELEBRATE, + }, + }, + }, + }, +#line 31 + [DIFFICULTY_NORMAL][DEBUG_TRAINER_AI] = + { +#line 32 + .trainerName = _("Debugger"), +#line 33 + .trainerClass = TRAINER_CLASS_RIVAL, +#line 35 + .trainerPic = TRAINER_PIC_STEVEN, + .encounterMusic_gender = +#line 37 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 34 + .battleType = TRAINER_BATTLE_TYPE_SINGLES, + .partySize = 3, + .party = (const struct TrainerMon[]) + { + { +#line 39 + .species = SPECIES_METANG, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 43 + .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), +#line 42 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 41 + .lvl = 42, +#line 40 + .nature = NATURE_BRAVE, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 44 + MOVE_LIGHT_SCREEN, + MOVE_PSYCHIC, + MOVE_REFLECT, + MOVE_METAL_CLAW, + }, + }, + { +#line 49 + .species = SPECIES_SKARMORY, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 53 + .ev = TRAINER_PARTY_EVS(252, 0, 0, 0, 6, 252), +#line 52 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 51 + .lvl = 43, +#line 50 + .nature = NATURE_IMPISH, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 54 + MOVE_TOXIC, + MOVE_AERIAL_ACE, + MOVE_PROTECT, + MOVE_STEEL_WING, + }, + }, + { +#line 59 + .species = SPECIES_AGGRON, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 63 + .ev = TRAINER_PARTY_EVS(0, 252, 0, 0, 252, 6), +#line 62 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 61 + .lvl = 44, +#line 60 + .nature = NATURE_ADAMANT, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + .moves = { +#line 64 + MOVE_THUNDER, + MOVE_PROTECT, + MOVE_SOLAR_BEAM, + MOVE_DRAGON_CLAW, + }, + }, + }, + }, diff --git a/src/data/debug_trainers.party b/src/data/debug_trainers.party new file mode 100644 index 0000000000..4a57d2c35e --- /dev/null +++ b/src/data/debug_trainers.party @@ -0,0 +1,68 @@ +/* + +Parties for the debug menu. + +The trainer description for DEBUG_TRAINER_PLAYER is not used, +its party is given to the player whenever the Set Party action is selected, +or the Start Debug Battle action is selected. + +The debug menu will start a battle against DEBUG_TRAINER_AI when the +Start Debug Battle action is selected. + +*/ + +=== DEBUG_TRAINER_PLAYER === +Name: Player +Class: Pkmn Trainer 1 +Pic: Brendan +Gender: Male +Music: Male + +Buffie (Wobbuffet) +Brave Nature +Level: 100 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 Def / 6 SpA +- Earthquake +- Flamethrower +- Celebrate +- Celebrate + +=== DEBUG_TRAINER_AI === +Name: Debugger +AI: Basic Trainer +Class: Rival +Battle Type: Singles +Pic: Steven +Gender: Male +Music: Male + +Metang +Brave Nature +Level: 42 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 Def / 6 SpA +- Light Screen +- Psychic +- Reflect +- Metal Claw + +Skarmory +Impish Nature +Level: 43 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 HP / 6 SpA / 252 SpD +- Toxic +- Aerial Ace +- Protect +- Steel Wing + +Aggron +Adamant Nature +Level: 44 +IVs: 31 HP / 31 Atk / 31 Def / 31 SpA / 31 SpD / 31 Spe +EVs: 252 Atk / 252 SpA / 6 SpD +- Thunder +- Protect +- Solar Beam +- Dragon Claw diff --git a/src/debug.c b/src/debug.c index cbf90dc567..0b018b275f 100644 --- a/src/debug.c +++ b/src/debug.c @@ -159,6 +159,8 @@ enum PartyDebugMenu DEBUG_PARTY_MENU_ITEM_CHECK_EVS, DEBUG_PARTY_MENU_ITEM_CHECK_IVS, DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY, + DEBUG_PARTY_MENU_ITEM_SET_PARTY, + DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE, }; enum ScriptDebugMenu @@ -437,6 +439,8 @@ static void DebugAction_Party_InflictStatus1(u8 taskId); static void DebugAction_Party_CheckEVs(u8 taskId); static void DebugAction_Party_CheckIVs(u8 taskId); static void DebugAction_Party_ClearParty(u8 taskId); +static void DebugAction_Party_SetParty(u8 taskId); +static void DebugAction_Party_BattleSingle(u8 taskId); static void DebugAction_FlagsVars_Flags(u8 taskId); static void DebugAction_FlagsVars_FlagsSelect(u8 taskId); @@ -708,13 +712,15 @@ static const struct ListMenuItem sDebugMenu_Items_PCBag_Fill[] = static const struct ListMenuItem sDebugMenu_Items_Party[] = { - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {COMPOUND_STRING("Move Reminder"), DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {COMPOUND_STRING("Hatch an Egg"), DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {COMPOUND_STRING("Heal party"), DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {COMPOUND_STRING("Inflict Status1"), DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {COMPOUND_STRING("Check EVs"), DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {COMPOUND_STRING("Check IVs"), DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {COMPOUND_STRING("Clear Party"), DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, + [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {COMPOUND_STRING("Move Reminder"), DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, + [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {COMPOUND_STRING("Hatch an Egg"), DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, + [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {COMPOUND_STRING("Heal party"), DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, + [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {COMPOUND_STRING("Inflict Status1"), DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, + [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {COMPOUND_STRING("Check EVs"), DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, + [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {COMPOUND_STRING("Check IVs"), DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, + [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {COMPOUND_STRING("Clear Party"), DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, + [DEBUG_PARTY_MENU_ITEM_SET_PARTY] = {COMPOUND_STRING("Set Party"), DEBUG_PARTY_MENU_ITEM_SET_PARTY}, + [DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE] = {COMPOUND_STRING("Start Debug Battle"), DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE}, }; static const struct ListMenuItem sDebugMenu_Items_Scripts[] = @@ -897,6 +903,8 @@ static void (*const sDebugMenu_Actions_Party[])(u8) = [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = DebugAction_Party_CheckEVs, [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = DebugAction_Party_CheckIVs, [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = DebugAction_Party_ClearParty, + [DEBUG_PARTY_MENU_ITEM_SET_PARTY] = DebugAction_Party_SetParty, + [DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE] = DebugAction_Party_BattleSingle, }; static void (*const sDebugMenu_Actions_Scripts[])(u8) = @@ -4893,6 +4901,47 @@ static void DebugAction_Party_ClearParty(u8 taskId) Debug_DestroyMenu_Full(taskId); } +enum DebugTrainerIds +{ + DEBUG_TRAINER_PLAYER, + DEBUG_TRAINER_AI, + DEBUG_TRAINERS_COUNT +}; + +const struct Trainer sDebugTrainers[DIFFICULTY_COUNT][DEBUG_TRAINERS_COUNT] = +{ +#include "data/debug_trainers.h" +}; + +const struct Trainer* GetDebugAiTrainer(void) +{ + return &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_AI]; +} + +static void DebugAction_Party_SetParty(u8 taskId) +{ + ZeroPlayerPartyMons(); + CreateNPCTrainerPartyFromTrainer(gPlayerParty, &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER], TRUE, BATTLE_TYPE_TRAINER); + ScriptContext_Enable(); + Debug_DestroyMenu_Full(taskId); +} + +static void DebugAction_Party_BattleSingle(u8 taskId) +{ + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + CreateNPCTrainerPartyFromTrainer(gPlayerParty, &sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER], TRUE, BATTLE_TYPE_TRAINER); + CreateNPCTrainerPartyFromTrainer(gEnemyParty, GetDebugAiTrainer(), FALSE, BATTLE_TYPE_TRAINER); + + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gDebugAIFlags = sDebugTrainers[DIFFICULTY_NORMAL][DEBUG_TRAINER_AI].aiFlags; + gIsDebugBattle = TRUE; + gBattleEnvironment = BattleSetup_GetEnvironmentId(); + CalculateEnemyPartyCount(); + BattleSetup_StartTrainerBattle_Debug(); + Debug_DestroyMenu_Full(taskId); +} + void CheckEWRAMCounters(struct ScriptContext *ctx) { ConvertIntToDecimalStringN(gStringVar1, gFollowerSteps, STR_CONV_MODE_LEFT_ALIGN, 5); From d795de9e9d5bfb4672520f8f0a86b6529c2d7ccb Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 3 Jun 2025 17:26:48 -0400 Subject: [PATCH 034/248] Remove more instances of hard-coded Move IDs (#7056) --- include/constants/battle_move_effects.h | 2 + include/move.h | 2 +- src/battle_ai_main.c | 66 +++++++----- src/battle_ai_switch_items.c | 6 +- src/battle_ai_util.c | 128 ++++++++++++------------ src/battle_dome.c | 8 +- src/battle_dynamax.c | 1 + src/battle_main.c | 1 + src/battle_script_commands.c | 23 +++-- src/battle_tv.c | 3 +- src/battle_util.c | 20 ++-- src/battle_z_move.c | 4 +- src/data/battle_move_effects.h | 12 +++ src/data/moves_info.h | 4 +- test/battle/move_animations/all_anims.c | 1 + test/battle/move_effect/ohko.c | 38 ++----- test/battle/move_effect/sheer_cold.c | 70 +++++++++++++ 17 files changed, 251 insertions(+), 138 deletions(-) create mode 100644 test/battle/move_effect/sheer_cold.c diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 3d899469f4..4637d583e1 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -8,6 +8,7 @@ enum BattleMoveEffects EFFECT_NON_VOLATILE_STATUS, EFFECT_ABSORB, EFFECT_EXPLOSION, + EFFECT_MISTY_EXPLOSION, // Same as EFFECT_EXPLOSION but it's boosted on Misty Terrain EFFECT_DREAM_EATER, EFFECT_MIRROR_MOVE, EFFECT_ATTACK_UP, @@ -34,6 +35,7 @@ enum BattleMoveEffects EFFECT_LIGHT_SCREEN, EFFECT_REST, EFFECT_OHKO, + EFFECT_SHEER_COLD, // Same as EFFECT_OHKO but Ice-types are immune to it and has decreased accuracy for non Ice-type users. EFFECT_FUSION_COMBO, EFFECT_FIXED_PERCENT_DAMAGE, EFFECT_FIXED_HP_DAMAGE, diff --git a/include/move.h b/include/move.h index ba51165cb6..6fb342df63 100644 --- a/include/move.h +++ b/include/move.h @@ -494,7 +494,7 @@ static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; } -static inline u32 GetMoveProtectMethod(u32 moveId) +static inline enum ProtectMethod GetMoveProtectMethod(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].argument.protectMethod; } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cc6ca2a8f0..3a7cdb410d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1085,6 +1085,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: case EFFECT_OHKO: + case EFFECT_SHEER_COLD: case EFFECT_BIDE: case EFFECT_FIXED_PERCENT_DAMAGE: case EFFECT_ENDEAVOR: @@ -1293,6 +1294,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; // check move damage case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); @@ -1675,9 +1677,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || !(weather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) ADJUST_SCORE(-10); break; - case EFFECT_OHKO: - if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + case EFFECT_SHEER_COLD: + if (B_SHEER_COLD_IMMUNITY >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) RETURN_SCORE_MINUS(20); + // fallthrough + case EFFECT_OHKO: if (!ShouldTryOHKO(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move)) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) @@ -2194,24 +2198,27 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_PROTECT: { bool32 decreased = FALSE; - switch (move) + enum ProtectMethod protectMethod = GetMoveProtectMethod(move); + switch (protectMethod) { - case MOVE_QUICK_GUARD: - case MOVE_WIDE_GUARD: - case MOVE_CRAFTY_SHIELD: + case PROTECT_QUICK_GUARD: + case PROTECT_WIDE_GUARD: + case PROTECT_CRAFTY_SHIELD: if (!isDoubleBattle) { ADJUST_SCORE(-10); decreased = TRUE; } break; - case MOVE_MAT_BLOCK: + case PROTECT_MAT_BLOCK: if (!gDisableStructs[battlerAtk].isFirstTurn) { ADJUST_SCORE(-10); decreased = TRUE; } break; + default: + break; } // move check if (decreased) @@ -2222,9 +2229,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } - if (move != MOVE_QUICK_GUARD - && move != MOVE_WIDE_GUARD - && move != MOVE_CRAFTY_SHIELD) //These moves have infinite usage + if (protectMethod != PROTECT_QUICK_GUARD + && protectMethod != PROTECT_WIDE_GUARD + && protectMethod != PROTECT_CRAFTY_SHIELD) //These moves have infinite usage { if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp && !(IsMoxieTypeAbility(aiData->abilities[battlerDef]))) @@ -2704,7 +2711,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_INSTRUCT: { - u16 instructedMove; + u32 instructedMove; if (AI_IsSlower(battlerAtk, battlerDef, move)) instructedMove = predictedMove; else @@ -2729,15 +2736,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { + enum BattleMoveEffects instructedEffect = GetMoveEffect(instructedMove); if (GetBattlerMoveTargetType(battlerDef, instructedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_DEPENDS | MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD) - && instructedMove != MOVE_MIND_BLOWN && instructedMove != MOVE_STEEL_BEAM) + && instructedEffect != EFFECT_MIND_BLOWN && instructedEffect != EFFECT_MAX_HP_50_RECOIL) ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown - else if (instructedMove != MOVE_MIND_BLOWN) + else if (instructedEffect != EFFECT_MIND_BLOWN) ADJUST_SCORE(-5); //Do something better } } @@ -2932,7 +2940,9 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsBattleMoveStatus(move)) return score; // status moves aren't accounted here - if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) && GetMoveEffect(move) != EFFECT_EXPLOSION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) + && effect != EFFECT_EXPLOSION && effect != EFFECT_MISTY_EXPLOSION) { if (CanIndexMoveGuaranteeFaintTarget(battlerAtk, battlerDef, movesetIndex)) ADJUST_SCORE(1); // Bonus point if the KO is guaranteed @@ -3108,6 +3118,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) { RETURN_SCORE_PLUS(10); @@ -3860,6 +3871,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) { @@ -4109,6 +4121,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_OHKO: + case EFFECT_SHEER_COLD: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; else if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS) @@ -4234,7 +4247,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_LOCK_ON: - if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO)) + if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO) || HasMoveWithEffect(battlerAtk, EFFECT_SHEER_COLD)) ADJUST_SCORE(GOOD_EFFECT); else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) ADJUST_SCORE(GOOD_EFFECT); @@ -4270,13 +4283,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_PROTECT: if (predictedMove == 0xFFFF) predictedMove = MOVE_NONE; - switch (move) + enum ProtectMethod protectMethod = GetMoveProtectMethod(move); + switch (protectMethod) { - case MOVE_QUICK_GUARD: + case PROTECT_QUICK_GUARD: if (predictedMove != MOVE_NONE && GetMovePriority(predictedMove) > 0) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; - case MOVE_WIDE_GUARD: + case PROTECT_WIDE_GUARD: if (predictedMove != MOVE_NONE && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH)) { ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); @@ -4287,17 +4301,17 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); } break; - case MOVE_CRAFTY_SHIELD: + case PROTECT_CRAFTY_SHIELD: if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; - case MOVE_MAT_BLOCK: + case PROTECT_MAT_BLOCK: if (gDisableStructs[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE && !IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); break; - case MOVE_KINGS_SHIELD: + case PROTECT_KINGS_SHIELD: if (aiData->abilities[battlerAtk] == ABILITY_STANCE_CHANGE //Special logic for Aegislash && gBattleMons[battlerAtk].species == SPECIES_AEGISLASH_BLADE && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef])) @@ -4444,7 +4458,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); if ((AI_IsFaster(battlerAtk, battlerDef, move)) - && (predictedEffect == EFFECT_EXPLOSION || predictedEffect == EFFECT_PROTECT)) + && (predictedEffect == EFFECT_EXPLOSION + || predictedEffect == EFFECT_MISTY_EXPLOSION + || predictedEffect == EFFECT_PROTECT)) ADJUST_SCORE(GOOD_EFFECT); else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) ADJUST_SCORE(GOOD_EFFECT); @@ -5512,6 +5528,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: ADJUST_SCORE(STRONG_RISKY_EFFECT); break; @@ -5534,6 +5551,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FLATTER: case EFFECT_ATTRACT: case EFFECT_OHKO: + case EFFECT_SHEER_COLD: ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_HIT: @@ -5610,7 +5628,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_PROTECT: - if (gLastMoves[battlerAtk] == MOVE_PROTECT || gLastMoves[battlerAtk] == MOVE_DETECT) + if (GetProtectType(GetMoveProtectMethod(gLastMoves[battlerAtk])) == PROTECT_TYPE_SINGLE) ADJUST_SCORE(-2); else ADJUST_SCORE(DECENT_EFFECT); @@ -5664,6 +5682,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_RESTORE_HP: case EFFECT_REST: case EFFECT_DESTINY_BOND: @@ -5692,6 +5711,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_BIDE: case EFFECT_CONVERSION: case EFFECT_LIGHT_SCREEN: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 2080a88a3b..fdfefd7238 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -209,7 +209,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Check if mon has an "important" status move if (aiMoveEffect == EFFECT_REFLECT || aiMoveEffect == EFFECT_LIGHT_SCREEN || aiMoveEffect == EFFECT_SPIKES || aiMoveEffect == EFFECT_TOXIC_SPIKES || aiMoveEffect == EFFECT_STEALTH_ROCK || aiMoveEffect == EFFECT_STICKY_WEB || aiMoveEffect == EFFECT_LEECH_SEED - || aiMoveEffect == EFFECT_EXPLOSION + || aiMoveEffect == EFFECT_EXPLOSION || aiMoveEffect == EFFECT_MISTY_EXPLOSION || nonVolatileStatus == MOVE_EFFECT_SLEEP || nonVolatileStatus == MOVE_EFFECT_TOXIC || nonVolatileStatus == MOVE_EFFECT_PARALYSIS @@ -2118,7 +2118,9 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If a self destruction move doesn't OHKO, don't factor it into revenge killing - if (GetMoveEffect(aiMove) == EFFECT_EXPLOSION && damageDealt < playerMonHP) + enum BattleMoveEffects aiEffect = GetMoveEffect(aiMove); + if ((aiEffect == EFFECT_EXPLOSION || aiEffect == EFFECT_MISTY_EXPLOSION) + && damageDealt < playerMonHP) continue; // Check that mon isn't one shot and set best damage mon diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 34fda88378..5d263e9b56 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -561,6 +561,7 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy return TRUE; break; case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_MIND_BLOWN: if (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP) return TRUE; @@ -1022,6 +1023,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case EFFECT_MAX_HP_50_RECOIL: case EFFECT_MIND_BLOWN: case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_FINAL_GAMBIT: return TRUE; case EFFECT_RECOIL: @@ -1777,7 +1779,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil else // test the odds { u32 odds = accuracy + (gBattleMons[battlerAtk].level - gBattleMons[battlerDef].level); - if (B_SHEER_COLD_ACC >= GEN_7 && move == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) + if (B_SHEER_COLD_ACC >= GEN_7 && GetMoveEffect(move) == EFFECT_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) odds -= 10; if (Random() % 100 + 1 < odds && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) return TRUE; @@ -4478,7 +4480,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; } -void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use) +void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use) { if (use == USE_GIMMICK) gAiBattleData->aiUsingGimmick |= (1<aiUsingGimmick &= ~(1<aiUsingGimmick & (1<gimmick.usableGimmick[battler] != GIMMICK_TERA) + if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_TERA) return; - - if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) + + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) return; - + // TODO: Currently only single battles are considered. - if (IsDoubleBattle()) - return; - - // TODO: A lot of these checks are most effective for an omnicient ai. + if (IsDoubleBattle()) + return; + + // TODO: A lot of these checks are most effective for an omnicient ai. // If we don't have enough information about the opponent's moves, consider simpler checks based on type effectivness. u32 opposingBattler = GetOppositeBattler(battler); @@ -4528,20 +4530,20 @@ void DecideTerastal(u32 battler) uq4_12_t effectiveness; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (!IsMoveUnusable(i, aiMoves[i], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[i])) + if (!IsMoveUnusable(i, aiMoves[i], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[i])) altCalcs.dealtWithoutTera[i] = AI_CalcDamage(aiMoves[i], battler, opposingBattler, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); - else + else altCalcs.dealtWithoutTera[i] = noDmg; - - if (!IsMoveUnusable(i, oppMoves[i], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[i])) + + if (!IsMoveUnusable(i, oppMoves[i], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[i])) { altCalcs.takenWithTera[i] = AI_CalcDamage(oppMoves[i], opposingBattler, battler, &effectiveness, USE_GIMMICK, USE_GIMMICK, AI_GetWeather()); effectivenessTakenWithTera[i] = effectiveness; } - else + else { altCalcs.takenWithTera[i] = noDmg; effectivenessTakenWithTera[i] = Q_4_12(0.0); @@ -4552,19 +4554,19 @@ void DecideTerastal(u32 battler) enum AIConsiderGimmick res = ShouldTeraFromCalcs(battler, opposingBattler, &altCalcs); - if (res == USE_GIMMICK) + if (res == USE_GIMMICK) { // Damage calcs for damage received assumed we wouldn't tera. Adjust that so that further AI decisions are more accurate. - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { gAiLogicData->simulatedDmg[opposingBattler][battler][i] = altCalcs.takenWithTera[i]; gAiLogicData->effectiveness[opposingBattler][battler][i] = effectivenessTakenWithTera[i]; } } - else + else { - // Damage calcs for damage dealt assumed we would tera. Adjust that so that further AI decisions are more accurate. - for (int i = 0; i < MAX_MON_MOVES; i++) + // Damage calcs for damage dealt assumed we would tera. Adjust that so that further AI decisions are more accurate. + for (int i = 0; i < MAX_MON_MOVES; i++) gAiLogicData->simulatedDmg[battler][opposingBattler][i] = altCalcs.dealtWithoutTera[i]; } @@ -4582,13 +4584,13 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str struct Pokemon* party = GetBattlerParty(battler); // Check how many pokemon we have that could tera - int numPossibleTera = 0; - for (int i = 0; i < PARTY_SIZE; i++) + int numPossibleTera = 0; + for (int i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG - && GetMonData(&party[i], MON_DATA_TERA_TYPE) > 0) + && GetMonData(&party[i], MON_DATA_TERA_TYPE) > 0) numPossibleTera++; } @@ -4602,44 +4604,44 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str bool32 hasKoWithout = FALSE; u16 killingMove = MOVE_NONE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (dealtWithTera[i].median >= oppHp) + if (dealtWithTera[i].median >= oppHp) { u16 move = aiMoves[i]; if (killingMove == MOVE_NONE || GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove)) killingMove = move; - } - if (dealtWithoutTera[i].median >= oppHp) + } + if (dealtWithoutTera[i].median >= oppHp) hasKoWithout = TRUE; } bool32 enablesKo = (killingMove != MOVE_NONE) && !hasKoWithout; // Check whether tera saves us from a KO - bool32 savedFromKo = FALSE; + bool32 savedFromKo = FALSE; bool32 getsKodRegardlessBySingleMove = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum >= aiHp) + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum >= aiHp) getsKodRegardlessBySingleMove = TRUE; - if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum < aiHp) + if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum < aiHp) savedFromKo = TRUE; } if (getsKodRegardlessBySingleMove) savedFromKo = FALSE; - // Check whether opponent can punish tera by ko'ing + // Check whether opponent can punish tera by ko'ing u16 hardPunishingMove = MOVE_NONE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (takenWithTera[i].maximum >= aiHp) + if (takenWithTera[i].maximum >= aiHp) { u16 move = oppMoves[i]; - if (hardPunishingMove == MOVE_NONE || GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], move) > GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + if (hardPunishingMove == MOVE_NONE || GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], move) > GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) hardPunishingMove = move; } } @@ -4648,32 +4650,32 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str // (e.g. a weakness becomes a resistance, a 4x weakness becomes neutral, etc) bool32 takesBigHit = FALSE; bool32 savedFromAllBigHits = TRUE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (takenWithoutTera[i].median > aiHp/2) + if (takenWithoutTera[i].median > aiHp/2) { - takesBigHit = TRUE; - if (takenWithTera[i].median > aiHp/4) + takesBigHit = TRUE; + if (takenWithTera[i].median > aiHp/4) savedFromAllBigHits = FALSE; } } // Check for any benefit whatsoever. Only used for the last possible mon that could tera. bool32 anyOffensiveBenefit = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (dealtWithTera[i].median > dealtWithoutTera[i].median) + if (dealtWithTera[i].median > dealtWithoutTera[i].median) anyOffensiveBenefit = TRUE; - } + } bool32 anyDefensiveBenefit = FALSE; - bool32 anyDefensiveDrawback = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + bool32 anyDefensiveDrawback = FALSE; + for (int i = 0; i < MAX_MON_MOVES; i++) { - if (takenWithTera[i].median < takenWithoutTera[i].median) + if (takenWithTera[i].median < takenWithoutTera[i].median) anyDefensiveBenefit = TRUE; - if (takenWithTera[i].median > takenWithoutTera[i].median) + if (takenWithTera[i].median > takenWithoutTera[i].median) anyDefensiveDrawback = TRUE; } @@ -4681,55 +4683,55 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str // This is done after all loops to minimize the possibility of a timing attack in which the player could // determine whether the AI will tera based on the time taken to select a move. - if (enablesKo) + if (enablesKo) { - if (hardPunishingMove == MOVE_NONE) + if (hardPunishingMove == MOVE_NONE) { return USE_GIMMICK; } - else + else { // will we go first? - if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) return USE_GIMMICK; } } // Decide to conserve tera based on number of possible later oppotunities u16 conserveTeraChance = AI_CONSERVE_TERA_CHANCE_PER_MON * (numPossibleTera-1); - if (RandomPercentage(RNG_AI_CONSERVE_TERA, conserveTeraChance)) + if (RandomPercentage(RNG_AI_CONSERVE_TERA, conserveTeraChance)) return NO_GIMMICK; - if (savedFromKo) + if (savedFromKo) { - if (hardPunishingMove == MOVE_NONE) + if (hardPunishingMove == MOVE_NONE) { return USE_GIMMICK; } - else + else { // If tera saves us from a ko from one move, but enables a ko otherwise, randomly predict // savesFromKo being true ensures opponent doesn't have a ko if we don't tera - if (Random() % 100 < AI_TERA_PREDICT_CHANCE) + if (Random() % 100 < AI_TERA_PREDICT_CHANCE) return USE_GIMMICK; } } - if (hardPunishingMove != MOVE_NONE) + if (hardPunishingMove != MOVE_NONE) return NO_GIMMICK; - if (takesBigHit && savedFromAllBigHits) + if (takesBigHit && savedFromAllBigHits) return USE_GIMMICK; - // No strongly compelling reason to tera. Conserve it if possible. - if (numPossibleTera > 1) + // No strongly compelling reason to tera. Conserve it if possible. + if (numPossibleTera > 1) return NO_GIMMICK; - if (anyOffensiveBenefit || (anyDefensiveBenefit && !anyDefensiveDrawback)) + if (anyOffensiveBenefit || (anyDefensiveBenefit && !anyDefensiveDrawback)) return USE_GIMMICK; // TODO: Effects other than direct damage are not yet considered. For example, may want to tera poison to avoid a Toxic. - + return NO_GIMMICK; } diff --git a/src/battle_dome.c b/src/battle_dome.c index 0ded9ada1e..b53d5fdcc8 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -3938,6 +3938,7 @@ static bool32 IsDomeRiskyMoveEffect(enum BattleMoveEffects effect) switch(effect) { case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: case EFFECT_SPITE: case EFFECT_DESTINY_BOND: case EFFECT_PERISH_SONG: @@ -3954,7 +3955,8 @@ static bool32 IsDomeLuckyMove(u32 move) switch(GetMoveEffect(move)) { case EFFECT_COUNTER: - case EFFECT_OHKO: // Technically redundant because of the above accuracy check + case EFFECT_OHKO: + case EFFECT_SHEER_COLD: case EFFECT_METRONOME: case EFFECT_MIRROR_MOVE: case EFFECT_SKETCH: @@ -5125,11 +5127,13 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun moves[i * MAX_MON_MOVES + j] = gFacilityTrainerMons[DOME_MONS[winnerTournamentId][i]].moves[j]; movePower = GetMovePower(moves[i * MAX_MON_MOVES + j]); + enum BattleMoveEffects effect = GetMoveEffect(moves[i * MAX_MON_MOVES + j]); if (IsBattleMoveStatus(moves[i * MAX_MON_MOVES + j])) movePower = 40; else if (movePower == 1) movePower = 60; - else if (GetMoveEffect(moves[i * MAX_MON_MOVES + j]) == EFFECT_EXPLOSION) + else if (B_EXPLOSION_DEFENSE < GEN_5 + && (effect == EFFECT_EXPLOSION || EFFECT_MISTY_EXPLOSION)) movePower /= 2; for (k = 0; k < FRONTIER_PARTY_SIZE; k++) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index c9f9947785..a34ecc21b3 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -407,6 +407,7 @@ static u32 GetMaxPowerTier(u32 move) case EFFECT_FINAL_GAMBIT: return MAX_POWER_TIER_2; case EFFECT_OHKO: + case EFFECT_SHEER_COLD: case EFFECT_RETURN: case EFFECT_FRUSTRATION: case EFFECT_HEAT_CRASH: diff --git a/src/battle_main.c b/src/battle_main.c index 9cf45280c1..2bf62fa1ed 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6058,6 +6058,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) && GetBattleMoveType(move) == GetItemSecondaryId(heldItem) && effect != EFFECT_PLEDGE && effect != EFFECT_OHKO + && effect != EFFECT_SHEER_COLD && effect != EFFECT_STRUGGLE) { gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 33414378ae..08531ef5f2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1248,7 +1248,10 @@ static void Cmd_attackcanceler(void) enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - if (!IsBattlerAlive(gBattlerAttacker) && effect != EFFECT_EXPLOSION && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + if (!IsBattlerAlive(gBattlerAttacker) + && effect != EFFECT_EXPLOSION + && effect != EFFECT_MISTY_EXPLOSION + && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; @@ -1515,7 +1518,8 @@ static bool32 AccuracyCalcHelper(u32 move, u32 battler) // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. else if (gStatuses3[battler] & STATUS3_TELEKINESIS && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && moveEffect != EFFECT_OHKO) + && moveEffect != EFFECT_OHKO + && moveEffect != EFFECT_SHEER_COLD) { effect = TRUE; } @@ -2459,14 +2463,15 @@ static void Cmd_attackanimation(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); u32 moveResultFlags = gBattleStruct->moveResultFlags[gBattlerTarget]; + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); if (IsDoubleSpreadMove()) moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); if ((gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) - && gCurrentMove != MOVE_TRANSFORM - && gCurrentMove != MOVE_SUBSTITUTE - && gCurrentMove != MOVE_ALLY_SWITCH + && effect != EFFECT_TRANSFORM + && effect != EFFECT_SUBSTITUTE + && effect != EFFECT_ALLY_SWITCH // In a wild double battle gotta use the teleport animation if two wild pokemon are alive. && !(GetMoveEffect(gCurrentMove) == EFFECT_TELEPORT && WILD_DOUBLE_BATTLE && !IsOnPlayerSide(gBattlerAttacker) && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) { @@ -6820,7 +6825,7 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - if (moveEffect == EFFECT_EXPLOSION) + if (moveEffect == EFFECT_EXPLOSION || moveEffect == EFFECT_MISTY_EXPLOSION) BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); // Edge case for Explosion not changing targets else BattleScriptPush(GetMoveBattleScript(gCurrentMove)); @@ -6984,6 +6989,7 @@ static void Cmd_moveend(void) } break; case EFFECT_EXPLOSION: + case EFFECT_MISTY_EXPLOSION: if (!IsAbilityOnField(ABILITY_DAMP)) { gBattleStruct->moveDamage[gBattlerAttacker] = 0; @@ -9111,7 +9117,7 @@ static bool32 TrySymbiosis(u32 battler, u32 itemId) && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_BUTTON && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_PACK && (B_SYMBIOSIS_GEMS < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) - && gCurrentMove != MOVE_FLING //Fling and damage-reducing berries are handled separately. + && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. && !gSpecialStatuses[battler].berryReduced && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) { @@ -12860,6 +12866,7 @@ static void Cmd_tryKO(void) CMD_ARGS(const u8 *failInstr); bool32 lands = FALSE; + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); u16 targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; @@ -12915,7 +12922,7 @@ static void Cmd_tryKO(void) else { u16 odds = GetMoveAccuracy(gCurrentMove) + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); - if (B_SHEER_COLD_ACC >= GEN_7 && gCurrentMove == MOVE_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) + if (B_SHEER_COLD_ACC >= GEN_7 && effect == EFFECT_SHEER_COLD && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)) odds -= 10; if (RandomPercentage(RNG_ACCURACY, odds) && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) lands = TRUE; diff --git a/src/battle_tv.c b/src/battle_tv.c index 732216d7ec..e7c182e537 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -599,7 +599,8 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].wishMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].wishMoveSlot = moveSlot; } - if (GetMoveEffect(move) == EFFECT_EXPLOSION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_EXPLOSION || effect == EFFECT_MISTY_EXPLOSION) { tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot = moveSlot; diff --git a/src/battle_util.c b/src/battle_util.c index 7493b38363..d6034a1478 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2333,9 +2333,11 @@ static void CancellerPsychicTerrain(u32 *effect) static void CancellerExplodingDamp(u32 *effect) { + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && (GetMoveEffect(gCurrentMove) == EFFECT_EXPLOSION - || GetMoveEffect(gCurrentMove) == EFFECT_MIND_BLOWN)) + if (dampBattler && (moveEffect == EFFECT_EXPLOSION + || moveEffect == EFFECT_MISTY_EXPLOSION + || moveEffect == EFFECT_MIND_BLOWN)) { gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; @@ -2776,6 +2778,7 @@ static void ForewarnChooseMove(u32 battler) switch (GetMoveEffect(data[count].moveId)) { case EFFECT_OHKO: + case EFFECT_SHEER_COLD: data[count].power = 150; break; case EFFECT_COUNTER: @@ -3594,7 +3597,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { move = gBattleMons[i].moves[j]; moveType = GetBattleMoveType(move); - if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0) || GetMoveEffect(move) == EFFECT_OHKO) + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0) + || moveEffect == EFFECT_OHKO || moveEffect == EFFECT_SHEER_COLD) { effect++; break; @@ -8087,8 +8092,8 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData if (gProtectStructs[battlerAtk].lashOutAffected) basePower *= 2; break; - case EFFECT_EXPLOSION: - if (move == MOVE_MISTY_EXPLOSION && IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + case EFFECT_MISTY_EXPLOSION: + if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: @@ -8800,7 +8805,8 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, } // Self-destruct / Explosion cut defense in half - if (B_EXPLOSION_DEFENSE < GEN_5 && moveEffect == EFFECT_EXPLOSION) + if (B_EXPLOSION_DEFENSE < GEN_5 && (moveEffect == EFFECT_EXPLOSION + || moveEffect == EFFECT_MISTY_EXPLOSION)) defStat /= 2; // critical hits ignore positive stat changes @@ -9595,7 +9601,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); } } - else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && GetMoveEffect(move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) { modifier = UQ_4_12(0.0); } diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 53df466af8..4f33ff5a17 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -549,7 +549,8 @@ u32 GetZMovePower(u32 move) { if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) return 0; - if (GetMoveEffect(move) == EFFECT_OHKO) + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (moveEffect == EFFECT_OHKO || moveEffect == EFFECT_SHEER_COLD) return 180; u32 power = GetMoveZPowerOverride(move); @@ -568,4 +569,3 @@ u32 GetZMovePower(u32 move) else if (power >= 60) return 120; else return 100; } - diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index b116b61999..27fb0a55ea 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -34,6 +34,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, + [EFFECT_MISTY_EXPLOSION] = + { + .battleScript = BattleScript_EffectExplosion, + .battleTvScore = 0, // TODO: Assign points + }, + [EFFECT_DREAM_EATER] = { .battleScript = BattleScript_EffectDreamEater, @@ -203,6 +209,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 7, }, + [EFFECT_SHEER_COLD] = + { + .battleScript = BattleScript_EffectOHKO, + .battleTvScore = 7, + }, + [EFFECT_FUSION_COMBO] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index db76c62ab8..217ef20689 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -8686,7 +8686,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A chilling attack that\n" "causes fainting if it hits."), - .effect = EFFECT_OHKO, + .effect = EFFECT_SHEER_COLD, .power = 1, .type = TYPE_ICE, .accuracy = 30, @@ -18544,7 +18544,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hit everything and faint.\n" "Powers up on Misty Terrain."), - .effect = EFFECT_EXPLOSION, + .effect = EFFECT_MISTY_EXPLOSION, .power = 100, .type = TYPE_FAIRY, .accuracy = 100, diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index e4144ebb9f..cb21a1df05 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -76,6 +76,7 @@ static bool32 AttackerHasToSwitch(u32 move) // User needs to send out a differen { if (gMovesInfo[move].effect == EFFECT_TELEPORT || gMovesInfo[move].effect == EFFECT_EXPLOSION + || gMovesInfo[move].effect == EFFECT_MISTY_EXPLOSION || gMovesInfo[move].effect == EFFECT_BATON_PASS || gMovesInfo[move].effect == EFFECT_MEMENTO || gMovesInfo[move].effect == EFFECT_HEALING_WISH diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 562045afb3..580219e3db 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -3,22 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_OHKO); -} - -SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") -{ - GIVEN { - ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); - ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GLALIE); - } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); - MESSAGE("It doesn't affect the opposing Glalie…"); - } + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); } SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has No-Guard") @@ -29,9 +14,9 @@ SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_FLY); } - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); HP_BAR(opponent, hp: 0); } } @@ -42,9 +27,9 @@ SINGLE_BATTLE_TEST("OHKO moves can can be endured by Focus Sash") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); HP_BAR(opponent, hp: 1); MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); } @@ -56,15 +41,14 @@ SINGLE_BATTLE_TEST("OHKO moves can can be endured by Sturdy") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); } } WHEN { - TURN { MOVE(player, MOVE_SHEER_COLD); } + TURN { MOVE(player, MOVE_FISSURE); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, player); ABILITY_POPUP(opponent, ABILITY_STURDY); - MESSAGE("The opposing Geodude was protected by Sturdy!"); } } -TO_DO_BATTLE_TEST("Fissure faints the target, skipping regular damage calculations") -TO_DO_BATTLE_TEST("Fissure always fails if the target has a higher level than the user") -TO_DO_BATTLE_TEST("Fissure's accuracy increases by 1% for every level the user has over the target") -TO_DO_BATTLE_TEST("Fissure's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes +TO_DO_BATTLE_TEST("OHKO moves faints the target, skipping regular damage calculations") +TO_DO_BATTLE_TEST("OHKO moves always fails if the target has a higher level than the user") +TO_DO_BATTLE_TEST("OHKO moves's accuracy increases by 1% for every level the user has over the target") +TO_DO_BATTLE_TEST("OHKO moves's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes diff --git a/test/battle/move_effect/sheer_cold.c b/test/battle/move_effect/sheer_cold.c new file mode 100644 index 0000000000..2cb469e92d --- /dev/null +++ b/test/battle/move_effect/sheer_cold.c @@ -0,0 +1,70 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_SHEER_COLD); +} + +SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") +{ + GIVEN { + ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + MESSAGE("It doesn't affect the opposing Glalie…"); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can hit semi-invulnerable mons when the user has No-Guard") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FLY); } + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 0); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can be endured by Focus Sash") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 1); + MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold can be endured by Sturdy") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); } + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + ABILITY_POPUP(opponent, ABILITY_STURDY); + } +} + +TO_DO_BATTLE_TEST("Sheer Cold faints the target, skipping regular damage calculations") +TO_DO_BATTLE_TEST("Sheer Cold always fails if the target has a higher level than the user") +TO_DO_BATTLE_TEST("Sheer Cold's accuracy increases by 1% for every level the user has over the target") +TO_DO_BATTLE_TEST("Sheer Cold's accuracy decreasaes by 10% if the user is not Ice type") +TO_DO_BATTLE_TEST("Sheer Cold's ignores non-stage accuracy modifiers") // Gravity, Wide Lens, Compound Eyes From 3decd3da0a82892ca5b7e6dbf8ed0d04d3fc8747 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 4 Jun 2025 05:19:57 -0400 Subject: [PATCH 035/248] Animation documentation (#7052) --- data/battle_anim_scripts.s | 1308 ++++++++++++++++++------------------ src/battle_anim_fight.c | 2 +- src/battle_anim_new.c | 2 +- 3 files changed, 656 insertions(+), 656 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index cc1487d190..0813f6e059 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -200,7 +200,7 @@ gBattleAnimMove_NaturalGift:: createvisualtask AnimTask_DragonDanceWaver, 5 playsewithpan SE_M_TELEPORT, -64 delay 8 - createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, 19456, 14, 0, 3 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 @@ -687,7 +687,7 @@ gBattleAnimMove_MeFirst:: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_THOUGHT_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, 0x7FAF + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, RGB(15, 29, 31) setalpha 11, 5 monbg_static ANIM_DEF_PARTNER splitbgprio_all @@ -848,7 +848,7 @@ gBattleAnimMove_LastResort:: waitbgfadein loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 4, 2, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 waitforvisualfinish delay 10 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER @@ -1118,7 +1118,7 @@ gBattleAnimMove_FlareBlitz:: createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 playsewithpan SE_M_COMET_PUNCH, +63 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_BLACK playsewithpan SE_M_COMET_PUNCH, +63 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 @@ -1300,21 +1300,21 @@ gBattleAnimMove_DarkPulse:: fadetobg BG_DARK waitbgfadein delay 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 createvisualtask AnimTask_SpiteTargetShadow, 2 loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 waitforvisualfinish clearmonbg ANIM_TARGET delay 1 @@ -1381,7 +1381,7 @@ gBattleAnimMove_AquaTail:: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gAquaTailKnockOffSpriteTemplate, ANIM_ATTACKER, 2, -16, -16 delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 createsprite gAquaTailHitSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 @@ -1469,7 +1469,7 @@ gBattleAnimMove_XScissor:: playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -1482,19 +1482,19 @@ gBattleAnimMove_BugBuzz:: monbg ANIM_DEF_PARTNER call SetBugBg createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -1546,7 +1546,7 @@ gBattleAnimMove_DragonRush:: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET createsprite gDragonRushSpriteTemplate, ANIM_ATTACKER, 3, -16, -16 delay 8 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 1 waitforvisualfinish @@ -1628,7 +1628,7 @@ gBattleAnimMove_VacuumWave:: setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, 0x7FFF, 3 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, RGB_WHITE, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish @@ -1683,7 +1683,7 @@ gBattleAnimMove_BraveBird:: loadspritegfx ANIM_TAG_BIRD call SetSkyBg monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 0, 16, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE delay 4 createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 waitforvisualfinish @@ -1695,7 +1695,7 @@ gBattleAnimMove_BraveBird:: delay 20 createvisualtask AnimTask_AttackerFadeFromInvisible, 5, 1 delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 15, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER call UnsetSkyBg @@ -2028,7 +2028,7 @@ gBattleAnimMove_IceFang:: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 @@ -2049,7 +2049,7 @@ gBattleAnimMove_IceFang:: delay 15 call IceCrystalEffectShort delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish @@ -2064,7 +2064,7 @@ gBattleAnimMove_FireFang:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 0 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 64 createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 128 @@ -2080,7 +2080,7 @@ gBattleAnimMove_FireFang:: delay 4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 0, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -2094,7 +2094,7 @@ gBattleAnimMove_ShadowSneak:: loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 @@ -2116,7 +2116,7 @@ gBattleAnimMove_ShadowSneak:: call ShadowSneakMovement waitforvisualfinish visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish end ShadowSneakMovement: @@ -2184,8 +2184,8 @@ gBattleAnimMove_PsychoCut:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CROSS_IMPACT, 0, 9, 9, RGB_PURPLE createvisualtask AnimTask_SwayMon, ANIM_ATTACKER, 0, 6, 2048, 2, ANIM_ATTACKER createsprite gPsychoCutSpiralSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 0, 4, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 0, 10, RGB(20, 12, 23) + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_BG, 2, 0, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_ATTACKER, 2, 0, 10, RGB(20, 12, 23) delay 30 clearmonbg ANIM_ATK_PARTNER waitforvisualfinish @@ -2197,8 +2197,8 @@ gBattleAnimMove_PsychoCut:: waitforvisualfinish createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 - createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 4, 0, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 10, 0, RGB(20, 12, 23) + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_BG, 2, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, F_PAL_ATTACKER, 2, 10, 0, RGB(20, 12, 23) clearmonbg ANIM_TARGET blendoff waitforvisualfinish @@ -2245,22 +2245,22 @@ gBattleAnimMove_MirrorShot:: createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 10, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21) waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 3 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA @@ -2301,7 +2301,7 @@ gBattleAnimMove_FlashCannon:: waitforvisualfinish playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createvisualtask AnimTask_Flash, 2 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 16, 0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB_RED createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -2349,12 +2349,12 @@ gBattleAnimMove_Defog:: playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER createsprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 delay 20 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, -1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, -1 waitforvisualfinish waitforvisualfinish delay 16 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, -1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -2765,7 +2765,7 @@ gBattleAnimMove_CrossPoison:: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, 0, 10 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish @@ -2964,10 +2964,10 @@ gBattleAnimMove_StoneEdge:: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -3029,19 +3029,19 @@ gBattleAnimMove_Chatter:: loadspritegfx ANIM_TAG_MUSIC_NOTES monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x1d, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0xffe3, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, 0xffe3, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe3, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x18, 0xffe8, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe8, 0xffe8, 0 @@ -3070,10 +3070,10 @@ gBattleAnimMove_Judgment:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 14, 14, 0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 10, 10, 0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 14, 14, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 10, 10, RGB_BLACK monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 15, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 83, 1 createsprite gJudgmentBlackChargeTemplate, ANIM_TARGET, 1, 1, ANIM_TARGET @@ -3112,7 +3112,7 @@ gBattleAnimMove_Judgment:: delay 5 call JudgmentOutwardSpikes2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 15, 0, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_TARGET end @@ -3348,10 +3348,10 @@ gBattleAnimMove_AttackOrder:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -3487,7 +3487,7 @@ gBattleAnimMove_RoarOfTime:: loadspritegfx ANIM_TAG_ORBS loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_WATER_GUN - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK delay 32 monbg ANIM_ATK_PARTNER setalpha 0xc, 0x8 @@ -3496,9 +3496,9 @@ gBattleAnimMove_RoarOfTime:: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITEALPHA createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL delay 32 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 20, 1 @@ -3520,7 +3520,7 @@ gBattleAnimMove_RoarOfTime:: playsewithpan 170, SOUND_PAN_TARGET createsprite gRoarOfTimeBombTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, 1, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, -1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITEALPHA waitforvisualfinish end @@ -3529,7 +3529,7 @@ gBattleAnimMove_SpacialRend:: loadspritegfx ANIM_TAG_PINK_HEART_2 @ANIM_TAG_BERRY_EATEN monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK loopsewithpan 133, SOUND_PAN_ATTACKER 13 2 createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 0 delay 2 @@ -3553,7 +3553,7 @@ gBattleAnimMove_SpacialRend:: waitforvisualfinish restorebg waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATK_PARTNER blendoff end @@ -3684,7 +3684,7 @@ gBattleAnimMove_SeedFlare:: loadspritegfx ANIM_TAG_FLYING_DIRT @heat wave animation monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 12, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_WHITE waitforvisualfinish playsewithpan 133, SOUND_PAN_ATTACKER createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 16 @@ -3755,7 +3755,7 @@ gBattleAnimMove_SeedFlare:: delay 10 createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x3c, 0xa00, 0x60, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 12, 0, 32767 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -3769,7 +3769,7 @@ gBattleAnimMove_OminousWind:: monbg ANIM_DEF_PARTNER @bankBG_over_partnerBG delay 0 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 0, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 0, RGB_BLACK delay 0 createvisualtask AnimTask_GetAttackerSide, 2 jumpargeq 7, 1, OminousWindFadeToBg @@ -3784,7 +3784,7 @@ OminousWindFadeToBg: goto OminousWindHit OminousWindHit: delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK waitbgfadein createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 @@ -3815,7 +3815,7 @@ OminousWindHit: delay 0 restorebg waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK setarg 7, -1 waitbgfadein end @@ -3947,7 +3947,7 @@ gBattleAnimMove_WideGuard:: gBattleAnimMove_GuardSplit:: loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 call GuardSplitLaunch call GuardSplitLaunch @@ -3960,7 +3960,7 @@ gBattleAnimMove_GuardSplit:: call GuardSplitLaunch call GuardSplitLaunch waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end GuardSplitLaunch: @@ -3972,7 +3972,7 @@ GuardSplitLaunch: gBattleAnimMove_PowerSplit:: loadspritegfx ANIM_TAG_RED_HEART loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 call PowerSplitLaunch call PowerSplitLaunch @@ -3985,7 +3985,7 @@ gBattleAnimMove_PowerSplit:: call PowerSplitLaunch call PowerSplitLaunch waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end PowerSplitLaunch: @@ -4160,9 +4160,9 @@ RagePowderSprinkle: gBattleAnimMove_Telekinesis:: loadspritegfx ANIM_TAG_SPARKLE_4 @detect - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 9, RGB_BLACK waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x1, 0x0, 0x9, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB_WHITE delay 18 playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec @@ -4171,8 +4171,8 @@ gBattleAnimMove_Telekinesis:: createvisualtask AnimTask_SwayMon, 5, 1, 24, 208, 1, ANIM_TARGET waitforvisualfinish delay 10 - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 9, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish end @@ -4325,7 +4325,7 @@ gBattleAnimMove_Synchronoise:: loadspritegfx ANIM_TAG_AIR_WAVE_2 @aero particles monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken waitforvisualfinish panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 @@ -4350,7 +4350,7 @@ gBattleAnimMove_Synchronoise:: createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xff20, 0xffe0, 0x28 createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0x70, 0xff80, 0x28 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK @Darken waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -4519,11 +4519,11 @@ gBattleAnimMove_FoulPlay:: createsprite gFoulPlayImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, RGB_BLACK createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 delay 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0xa, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, RGB_BLACK createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitforvisualfinish clearmonbg ANIM_TARGET @@ -4537,12 +4537,12 @@ gBattleAnimMove_SimpleBeam:: loadspritegfx ANIM_TAG_THIN_RING @ring setalpha 8, 8 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER call SimpleBeamsRegular call SimpleBeamsRegular - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_WHITE createvisualtask AnimTask_SwayMon, 5, 0, 6, 2048, 4, ANIM_TARGET call SimpleBeamWithRings call SimpleBeamWithRings @@ -4555,8 +4555,8 @@ gBattleAnimMove_SimpleBeam:: delay 2 stopsound waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7FFF - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -4650,7 +4650,7 @@ MetalSoundPlayNote: gBattleAnimMove_ChipAway:: loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_WHITE waitforvisualfinish monbg ANIM_ATK_PARTNER setalpha 12, 8 @@ -4661,7 +4661,7 @@ gBattleAnimMove_ChipAway:: playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish blendoff end @@ -4731,14 +4731,14 @@ gBattleAnimMove_QuickGuard:: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 10, RGB_WHITE delay 16 monbg ANIM_ATTACKER - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 delay 1 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 delay 1 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xE, 0x0, 0x8, 0x0, 0x0 - createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 0xfff2, 0x0, 0x8, 0x0, 0x0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, 14, 0, 8, ANIM_ATTACKER, 0 + createsprite gQuickGuardArmImpactTemplate, ANIM_TARGET, 3, -14, 0, 8, ANIM_ATTACKER, 0 waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 0x0, 0xffe3 @up @@ -4824,14 +4824,14 @@ gBattleAnimMove_ShellSmash:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x18, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x5, 0x0, 0xffec, 0x18, 0xe, 0x1 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x5, 0x14, 0xffe8, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0xfffb, 0x0, 0xffec, 0xffe8, 0xe, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfffb, 0x1e, 0x12, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1e, 0xffee, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0x12, 0x8, 0x2 - createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xffe2, 0xffee, 0x8, 0x2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, -5, 0, -20, -24, 14, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 30, 18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 30, -18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, 18, 8, 2 + createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -30, -18, 8, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish end @@ -4841,22 +4841,22 @@ gBattleAnimMove_HealPulse:: loadspritegfx ANIM_TAG_BLUE_STAR loadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(13, 31, 12), 8 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 delay 3 createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1 @@ -4870,7 +4870,7 @@ gBattleAnimMove_HealPulse:: gBattleAnimMove_Hex:: loadspritegfx ANIM_TAG_PURPLE_FLAME loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x4C4A @;Deep purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB(10, 2, 19) @;Deep purple waitforvisualfinish monbg ANIM_TARGET splitbgprio_all @@ -4884,7 +4884,7 @@ gBattleAnimMove_Hex:: createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 4 waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x4C4A @;Deep purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB(10, 2, 19) @;Deep purple waitforvisualfinish end @@ -5133,17 +5133,17 @@ gBattleAnimMove_Retaliate:: monbg ANIM_DEF_PARTNER setalpha 9, 8 createvisualtask AnimTask_AttackerPunchWithTrace, 0x2, 0x7128, 0xa - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish playsewithpan SE_M_CUT, SOUND_PAN_TARGET createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gGuillotineSpriteTemplate, ANIM_ATTACKER, 2, 0x1 delay 56 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x43D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(29, 1, 1) waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(29, 1, 1) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -5153,7 +5153,7 @@ gBattleAnimMove_FinalGambit:: loadspritegfx ANIM_TAG_PINK_CLOUD @yawn animation loadspritegfx ANIM_TAG_WATER_IMPACT @blue colour loadspritegfx ANIM_TAG_EXPLOSION @explosion animation - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB_WHITE @@ -5172,7 +5172,7 @@ gBattleAnimMove_FinalGambit:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end @@ -5191,14 +5191,14 @@ gBattleAnimMove_Inferno:: call SetImpactBackground loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 40, 4 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 94, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim call InfernoAnim - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED restorebg waitbgfadein waitforvisualfinish @@ -5596,7 +5596,7 @@ gBattleAnimMove_StruggleBug:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(31, 16, 2) waitforvisualfinish createvisualtask AnimTask_FlailMovement, 2, ANIM_ATTACKER createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 @@ -5607,7 +5607,7 @@ gBattleAnimMove_StruggleBug:: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 createvisualtask AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x0a1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(31, 16, 2) delay 5 createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 delay 5 @@ -5666,13 +5666,13 @@ gBattleAnimMove_DragonTail:: loadspritegfx ANIM_TAG_SLAM_HIT loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SLAM_HIT, 0x2, 0xD, 0xD, 0x5CAE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLAM_HIT, 2, 13, 13, RGB(14, 5, 23) waitforvisualfinish setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 delay 1 - createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 + createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 @@ -5785,7 +5785,7 @@ gBattleAnimMove_WildCharge:: blendoff end ScreenFlash: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(30, 31, 1) return gBattleAnimMove_DrillRun:: @@ -5854,8 +5854,8 @@ gBattleAnimMove_DualChop:: createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 delay 6 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @left - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0x0515, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 @right + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -32, 0, 0, 0, 10, 1, 3, 0 @left + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 1301, 0, 0, 0, 10, 1, 3, 0 @right waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDualChopImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 @@ -5905,7 +5905,7 @@ gBattleAnimMove_SacredSword:: playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 delay 22 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -6050,7 +6050,7 @@ gBattleAnimMove_NightDaze:: loadspritegfx ANIM_TAG_THIN_RING @uproar loadspritegfx ANIM_TAG_PURPLE_FLAME @dark violet color loadspritegfx ANIM_TAG_RED_ORB @circles - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_ORB, SOUND_PAN_ATTACKER createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 @@ -6074,13 +6074,13 @@ gBattleAnimMove_NightDaze:: createsprite gNightDazeVioletRingsTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x8 waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 31, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x2002 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(2, 0, 8) delay 6 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x2002 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(2, 0, 8) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end @@ -6208,14 +6208,14 @@ gBattleAnimMove_SearingShot:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_WARM_ROCK @eruption - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ELECTRIC_ORBS, 0x0, 0xC, 0xC, 0x0E3E @Orange - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WARM_ROCK, 0x0, 0xB, 0xB, 0x01BE @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(30, 17, 3) @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WARM_ROCK, 0, 11, 11, RGB(30, 13, 0) @Orange monbg ANIM_ATTACKER setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 30 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -6257,7 +6257,7 @@ gBattleAnimMove_SearingShot:: createsprite gSearingShotEruptionRockTemplate, ANIM_ATTACKER, 66, 0x1, 0xe0, 0x1e, 0x19, 0x0 delay 21 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED clearmonbg ANIM_ATTACKER fadetobg BG_FIRE waitbgfadeout @@ -6265,7 +6265,7 @@ gBattleAnimMove_SearingShot:: waitbgfadein delay 30 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ADJACENT, 2, 0, 9, RGB_RED playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 27, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 27, 1 @@ -6280,10 +6280,10 @@ gBattleAnimMove_SearingShot:: delay 30 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ADJACENT, 0x2, 0x9, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ADJACENT, 2, 9, 0, RGB_RED delay 30 call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATK_PARTNER blendoff end @@ -6303,7 +6303,7 @@ TechnoBlastNormal: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gTechnoBlastWhiteCircleTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 0x10 @@ -6359,7 +6359,7 @@ TechnoBlastNormal: delay 2 createsprite gTechnoBlastWhiteSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6403,7 +6403,7 @@ TechnoBlastElectric: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @@ -6453,7 +6453,7 @@ TechnoBlastElectric: createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0x2, 0xfff8, 0x5, 0x0 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6482,7 +6482,7 @@ TechnoBlastWater: loadspritegfx ANIM_TAG_BUBBLE @bubbles monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(1, 0, 0) waitforvisualfinish createsprite gTechnoBlastBlueChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER @@ -6587,7 +6587,7 @@ TechnoBlastWater: createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xffec, 0x14, 0x19, 0x1 createsprite gTechnoBlastBlueBubbleTemplate, ANIM_ATTACKER, 2, 0xc, 0x0, 0x19, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6603,7 +6603,7 @@ TechnoBlastFire: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gTechnoBlastRedChargeTemplate, ANIM_ATTACKER, 2, 0x0 delay 5 @@ -6639,7 +6639,7 @@ TechnoBlastFire: delay 2 createsprite gTechnoBlastRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6676,7 +6676,7 @@ TechnoBlastIce: loadspritegfx ANIM_TAG_SPARK_2 @blast particles loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gTechnoBlastIceChargeTemplate, ANIM_ATTACKER, 2, 0x0 delay 5 @@ -6723,7 +6723,7 @@ TechnoBlastIce: createsprite gIceCrystalHitSmallSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x0 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -6761,7 +6761,7 @@ gBattleAnimMove_RelicSong:: waitforvisualfinish createvisualtask SoundTask_PlayCryWithEcho, 2, FALSE createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x7, 0x0, 0xc @@ -6769,7 +6769,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x1, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc @@ -6777,7 +6777,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x3, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x3, 0x0, 0xc @@ -6785,7 +6785,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x2, 0xc @@ -6793,7 +6793,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x6, 0x3, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x0, 0xc @@ -6801,7 +6801,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x2, 0x1, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x2, 0xc @@ -6809,7 +6809,7 @@ gBattleAnimMove_RelicSong:: createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x3, 0xc delay 5 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 waitforvisualfinish @@ -6818,10 +6818,10 @@ gBattleAnimMove_RelicSong:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 5 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 5 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -6840,10 +6840,10 @@ gBattleAnimMove_SecretSword:: monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 delay 22 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -6854,7 +6854,7 @@ gBattleAnimMove_SecretSword:: delay 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -6883,9 +6883,9 @@ gBattleAnimMove_Glaciate:: createsprite gGlaciateSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x50, 0x0, 0x4b createsprite gGlaciateSmokeTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 0x2, 0x0, 0xA, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 0, 10, RGB_WHITE call IceCrystalEffectLong - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 0x2, 0xA, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 10, 0, RGB_WHITE waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER @@ -6899,8 +6899,8 @@ gBattleAnimMove_BoltStrike:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(30, 31, 1) createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 64, 0, 2 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 12 @@ -6918,19 +6918,19 @@ gBattleAnimMove_BoltStrike:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(30, 31, 1) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 32, 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET call ElectricityEffect createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(30, 31, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(30, 31, 1) call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK blendoff waitforvisualfinish end @@ -6938,13 +6938,13 @@ gBattleAnimMove_BoltStrike:: gBattleAnimMove_BlueFlare:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire loadspritegfx ANIM_TAG_METAL_BITS @Blue Flare Colour - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x7, 0x9 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x0, 0xffe0, 0x10 delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x16, 0xffea, 0x10 delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x1, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x1e, 0x0, 0x10 delay 2 createsprite gBlueFlareFlameJabTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x14, 0x14, 0x10 @@ -6976,8 +6976,8 @@ gBattleAnimMove_BlueFlare:: playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER call BlueFlareFlameSpreadEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x1, 0x9, 0x0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED call UnsetPsychicBg waitforvisualfinish end @@ -7007,11 +7007,11 @@ BlueFlareFlameSpreadEffect: gBattleAnimMove_FieryDance:: loadspritegfx ANIM_TAG_SMALL_EMBER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xc, 0x14be + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(30, 5, 5) waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 64, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call FireSpinEffect call FireSpinEffect call FireSpinEffect @@ -7020,8 +7020,8 @@ gBattleAnimMove_FieryDance:: call FireSpinEffect call FireSpinEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x9, 0x0, 0x1f - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xc, 0x0, 0x14be + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(30, 5, 5) waitforvisualfinish end @@ -7034,15 +7034,15 @@ gBattleAnimMove_FreezeShock:: FreezeShockCharge: createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE createsprite gFreezeShockCircleTemplate, ANIM_ATTACKER, 2 @electric circle delay 20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish end FreezeShockAttack: loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x5, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK monbg ANIM_TARGET waitforvisualfinish playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER @@ -7062,7 +7062,7 @@ FreezeShockAttack: call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish end @@ -7075,23 +7075,23 @@ gBattleAnimMove_IceBurn:: waitforvisualfinish end IceBurnCharge: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x4, 0x3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xf, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 15, RGB_WHITE delay 20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish end IceBurnUnleash: monbg ANIM_TARGET fadetobg BG_ICE waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_WHITE createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff6, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createsprite gIceBurnSmokeTemplate, ANIM_TARGET, 4, 0x0, 0xfff4, 0x68, 0x0, 0x4b @@ -7126,7 +7126,7 @@ IceBurnUnleash: delay 4 createsprite gIceCrystalHitLargeSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x2, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_WHITE waitforvisualfinish restorebg clearmonbg ANIM_TARGET @@ -7140,19 +7140,19 @@ gBattleAnimMove_Snarl:: fadetobg BG_DARK waitbgfadeout createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xc, 0xffe3, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe3, 0xfff4, 0x0 delay 16 createvisualtask AnimTask_UproarDistortion, 0x2, 0x0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 @@ -7162,10 +7162,10 @@ gBattleAnimMove_Snarl:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -7234,13 +7234,13 @@ gBattleAnimMove_VCreate:: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color loadspritegfx ANIM_TAG_ECLIPSING_ORB @defense curl animation monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK @Darken createsprite gVCreateRedOrbTemplate, ANIM_ATTACKER, 2, 0x0, 0x11, 0x0, 0x1 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER delay 2 createsprite gVCreateRedRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET call VCreateFlames call VCreateFlames @@ -7268,7 +7268,7 @@ gBattleAnimMove_VCreate:: createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 delay 35 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB_RED playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 delay 6 @@ -7290,14 +7290,14 @@ gBattleAnimMove_VCreate:: waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1f - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB_RED delay 2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_WHITEALPHA waitforvisualfinish end VCreateFlames: @@ -7313,10 +7313,10 @@ gBattleAnimMove_FusionFlare:: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @flame palette loadspritegfx ANIM_TAG_SMALL_BUBBLES @particles loadspritegfx ANIM_TAG_THIN_RING @ring - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0x0, 0xD, 0xD, 0x015B @Reddish Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0, 13, 13, RGB(27, 10, 0) @Reddish Orange monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER call FusionFlareBuff @@ -7347,7 +7347,7 @@ gBattleAnimMove_FusionFlare:: delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -7368,10 +7368,10 @@ gBattleAnimMove_FusionBolt:: loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0x0, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(0, 11, 30) @Blue Electricity + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB_BLACK waitforvisualfinish createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -7406,7 +7406,7 @@ gBattleAnimMove_FusionBolt:: createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10, 0x10 delay 2 createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 14, 0, RGB_BLACK waitforvisualfinish end @@ -7510,7 +7510,7 @@ gBattleAnimMove_Rototiller:: loadspritegfx ANIM_TAG_MUD_SAND loadspritegfx ANIM_TAG_DIRT_MOUND loadspritegfx ANIM_TAG_GREEN_SPARKLE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x112C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(12, 9, 4) waitforvisualfinish createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x0, 0xb4 createsprite gDirtMoundSpriteTemplate, ANIM_ATTACKER, 1, 0x0, 0x1, 0xb4 @@ -7521,7 +7521,7 @@ gBattleAnimMove_Rototiller:: call DigThrowDirt call DigThrowDirt waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x112C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(12, 9, 4) waitforvisualfinish end @@ -7738,9 +7738,9 @@ gBattleAnimMove_ParabolicCharge:: playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 16, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 16, 16, RGB_BLACK delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_TARGET, 0, 0, 0, RGB_BLACK ParabolicChargeHeal: waitforvisualfinish unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @@ -7769,19 +7769,19 @@ ParabolicChargeDouble: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 6, 18, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 6, 18, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 16, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_ADJACENT, 0, 16, 16, RGB_BLACK delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 0, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 5, F_PAL_ADJACENT, 0, 0, 0, RGB_BLACK goto ParabolicChargeHeal; gBattleAnimMove_ForestsCurse:: loadspritegfx ANIM_TAG_ROOTS @frenzy plant loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT @curse monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x02E3 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 8, RGB(3, 23, 0) createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0x64, 0x64, 0x8, 0x1, 0x14, 0x28, 0x0 createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0x14, 0x64, 0x10, 0x2, 0xa, 0x23, 0x1 createsprite gForestsCurseIngrainTemplate, ANIM_ATTACKER, 66, 0xc8, 0x50, 0x8, 0x1, 0x28, 0x14, 0x0 @@ -7805,9 +7805,9 @@ gBattleAnimMove_ForestsCurse:: createsprite gCurseGhostSpriteTemplate, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 14, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x02E3 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 8, 0, RGB(3, 23, 0) delay 3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -7846,10 +7846,10 @@ gBattleAnimMove_PetalBlizzard:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATK_PARTNER, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 @@ -7865,7 +7865,7 @@ gBattleAnimMove_FreezeDry:: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_IMPACT createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 @@ -7887,7 +7887,7 @@ gBattleAnimMove_FreezeDry:: createvisualtask AnimTask_FrozenIceCube, 2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish @@ -7897,7 +7897,7 @@ gBattleAnimMove_FreezeDry:: gBattleAnimMove_DisarmingVoice:: loadspritegfx ANIM_TAG_NOISE_LINE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect @@ -7907,7 +7907,7 @@ gBattleAnimMove_DisarmingVoice:: waitforvisualfinish createvisualtask SoundTask_WaitForCry, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -7980,7 +7980,7 @@ gBattleAnimMove_CraftyShield:: loadspritegfx ANIM_TAG_CRAFTY_SHIELD monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x4DBF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(31, 13, 19) setalpha 16, 0 delay 0 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER @@ -8020,11 +8020,11 @@ gBattleAnimMove_CraftyShield:: createsprite gCraftyShieldPinkConversionTemplate, ANIM_ATTACKER, 2, 0x18, 0x18 delay 20 playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2722, 0x1, 0x1, 0x37ff, 0xc, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_CONVERSION, 1, 1, RGB(31, 31, 13), 12, 0, 0 delay 6 createvisualtask AnimTask_ConversionAlphaBlend, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x4DBF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(31, 13, 19) waitforvisualfinish delay 1 clearmonbg ANIM_ATK_PARTNER @@ -8035,7 +8035,7 @@ gBattleAnimMove_FlowerShield:: loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_IMPACT setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createsprite gPetalDanceBigFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c @@ -8056,7 +8056,7 @@ gBattleAnimMove_FlowerShield:: createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0x14, 0xfff0, 0xe, 0x50 createsprite gPetalDanceSmallFlowerSpriteTemplate, ANIM_ATTACKER, 2, 0xffec, 0xfff2, 0x10, 0x50 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish blendoff end @@ -8166,8 +8166,8 @@ gBattleAnimMove_Electrify:: createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xa0, 0x28, 0x0 createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x8, 0x1e, 0xe0, 0x28, 0x2 delay 10 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xB, 0x039B - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(27, 28, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 3, RGB(27, 28, 0) delay 4 clearmonbg ANIM_ATTACKER delay 1 @@ -8193,8 +8193,8 @@ gBattleAnimMove_Electrify:: delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xB, 0x0, 0x039B - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x3, 0x0, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(27, 28, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 3, 0, RGB(27, 28, 0) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -8259,7 +8259,7 @@ gBattleAnimMove_FairyWind:: loadspritegfx ANIM_TAG_PINK_CLOUD monbg ANIM_DEF_PARTNER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish playsewithpan SE_M_GUST, SOUND_PAN_TARGET createsprite gFairyWindCloudTemplate, ANIM_TARGET, 3, 0x14, 0xfff6, 0x14, 0x0, 0x16, 0x14, 0x1 @@ -8276,7 +8276,7 @@ gBattleAnimMove_FairyWind:: waitforvisualfinish stopsound playsewithpan SE_M_GUST2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -8360,7 +8360,7 @@ gBattleAnimMove_FairyLock:: loadspritegfx ANIM_TAG_FAIRY_LOCK_CHAINS setalpha 8, 8 monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(31, 24, 26) waitforvisualfinish loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x9 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x7 @@ -8371,7 +8371,7 @@ gBattleAnimMove_FairyLock:: createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x6 createvisualtask AnimTask_VoltTackleBolt, 0x5, 0x35 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(31, 24, 26) waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -8379,7 +8379,7 @@ gBattleAnimMove_FairyLock:: gBattleAnimMove_KingsShield:: loadspritegfx ANIM_TAG_PROTECT @protect - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0x0, 0xC, 0xC, 0x318C @Gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 12, 12, RGB(12, 12, 12) @Gray goto gBattleAnimMove_Protect gBattleAnimMove_PlayNice:: @@ -8403,8 +8403,8 @@ gBattleAnimMove_DiamondStorm:: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x1888 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 0xD, 0xD, 0x7DDE @Pink + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(8, 4, 6) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 13, 13, RGB(30, 14, 31) @Pink waitforvisualfinish panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSwirlingSnowballSpriteTemplate, ANIM_ATTACKER, 40, 0x0, 0xfff6, 0x0, 0xfff6, 0x48, 0x1 @@ -8456,16 +8456,16 @@ gBattleAnimMove_DiamondStorm:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x1888 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB(8, 4, 6) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -8473,14 +8473,14 @@ gBattleAnimMove_DiamondStorm:: gBattleAnimMove_SteamEruption:: loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB(29, 1, 1) delay 32 monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call SteamEruptionBreath call SteamEruptionBreath - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x9, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 9, RGB_RED call SteamEruptionBreath delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 21, 1 @@ -8500,10 +8500,10 @@ gBattleAnimMove_SteamEruption:: call SteamEruptionBreath call SteamEruptionBreath call SteamEruptionBreath - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x9, 0x0, 0x1f + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB(29, 1, 1) waitforvisualfinish end SteamEruptionBreath: @@ -8516,7 +8516,7 @@ gBattleAnimMove_HyperspaceHole:: loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison Colour - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITE waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER @@ -8555,7 +8555,7 @@ gBattleAnimMove_HyperspaceHole:: invisible ANIM_ATTACKER delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish end HyperspaceHoleMovement: @@ -8655,7 +8655,7 @@ gBattleAnimMove_SpikyShield:: gBattleAnimMove_AromaticMist:: loadspritegfx ANIM_TAG_PINK_PETAL playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6E7D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x64, 0x0, 0x64 delay 25 setpan 0x0 @@ -8665,7 +8665,7 @@ gBattleAnimMove_AromaticMist:: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_DEF_SIDE, 1, 5, 5, 13, RGB(31, 21, 21) call SweetScentEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6E7D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -8794,19 +8794,19 @@ gBattleAnimMove_Geomancy:: choosetwoturnanim GeomancyChargeUp GeomancyUnleash GeomancyChargeUp: loadspritegfx ANIM_TAG_FOCUS_ENERGY @endure buff effect - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_COSMIC_POWER, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 95, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB_RED call GeomancyRingBuff - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x2C0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB(0, 22, 0) call GeomancyRingBuff - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x7C60 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB(0, 3, 31) call GeomancyRingBuff waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x5, 0x0, 0x7C60 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 5, 0, RGB(0, 3, 31) waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER @@ -8860,7 +8860,7 @@ GeomancyRingBuff: return GeomancyUnleash: loadspritegfx ANIM_TAG_FIRE_PLUME @dragon rage - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x24CF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(15, 6, 9) playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 delay 1 @@ -8875,9 +8875,9 @@ GeomancyUnleash: createsprite gGeomancyRingTemplate, ANIM_ATTACKER, 2 waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x10, 0x4D01 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(1, 8, 19) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 37, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x5, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 5, RGB_RED createsprite gGeomancyRedCellRaiseTemplate, ANIM_ATTACKER, 2, 0x14, 0x20, 0xffd0, 0x32, 0x1 createsprite gGeomancyGreenCellRaiseTemplate, ANIM_ATTACKER, 2, 0x0, 0x20, 0xffda, 0x19, 0x1 createsprite gGeomancyBlueCellRaiseTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0xffe4, 0x28, 0x1 @@ -8887,8 +8887,8 @@ GeomancyUnleash: call GeomancyRageBuff call GeomancyRageBuff waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x4D01 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x5, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(1, 8, 19) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 5, 0, RGB_RED waitforvisualfinish blendoff clearmonbg ANIM_ATK_PARTNER @@ -8916,7 +8916,7 @@ gBattleAnimMove_MagneticFlux:: loadspritegfx ANIM_TAG_THIN_RING @uproar loadspritegfx ANIM_TAG_SPARK_2 @ElectricityEffect loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 0, 9, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 0, 9, RGB(27, 1, 9) loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 0x12, 0x3 createvisualtask AnimTask_DefenseCurlDeformMon, 0x5 call MagneticFluxSparks1 @@ -8928,7 +8928,7 @@ gBattleAnimMove_MagneticFlux:: createsprite gMagneticFluxUproarTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 call MagneticFluxSparks2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 9, 0, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_TARGET | F_PAL_ATK_SIDE), 2, 9, 0, RGB(27, 1, 9) waitforvisualfinish end MagneticFluxSparks1: @@ -9092,7 +9092,7 @@ gBattleAnimMove_BabyDollEyes:: loadspritegfx ANIM_TAG_OPENING_EYE @eye setalpha 8, 8 monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xA, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 10, RGB_WHITE waitforvisualfinish createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 delay 32 @@ -9102,7 +9102,7 @@ gBattleAnimMove_BabyDollEyes:: delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 10, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9161,7 +9161,7 @@ gBattleAnimMove_Infestation:: loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(0, 25, 28) createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 79, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 0x4F call InfestationVortex @@ -9170,7 +9170,7 @@ gBattleAnimMove_Infestation:: call InfestationVortex call InfestationVortex waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -9210,12 +9210,12 @@ gBattleAnimMove_OblivionWing:: loadspritegfx ANIM_TAG_HYDRO_PUMP loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_BLUE_STAR - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x289F @Pinkish Red - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0x0, 0xD, 0xD, 0x289F @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(31, 4, 10) @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(31, 4, 10) @Pinkish Red playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 @Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK @Black waitforvisualfinish createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 call OblivionWingBeam @@ -9236,7 +9236,7 @@ gBattleAnimMove_OblivionWing:: visible ANIM_ATTACKER call HealingEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 @From black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK @From black waitforvisualfinish end OblivionWingBeam: @@ -9256,7 +9256,7 @@ gBattleAnimMove_ThousandArrows:: loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gThousandArrowsGreenChargeTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -9283,7 +9283,7 @@ gBattleAnimMove_ThousandArrows:: call ThousandArrowsDown call ThousandArrowsDown waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITEALPHA waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -9341,7 +9341,7 @@ gBattleAnimMove_ThousandWaves:: loadspritegfx ANIM_TAG_IMPACT @pound hits monbg ANIM_ATK_PARTNER setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gThousandWavesGreenWheelTemplate, ANIM_ATTACKER, 2, 0x0 @@ -9395,7 +9395,7 @@ gBattleAnimMove_ThousandWaves:: waitforvisualfinish createvisualtask AnimTask_ExtremeSpeedMonReappear, 0x2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0xffff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_WHITEALPHA waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER @@ -9467,7 +9467,7 @@ gBattleAnimMove_LandsWrath:: loadspritegfx ANIM_TAG_WATER_ORB @whirl motion loadspritegfx ANIM_TAG_SPARK_2 @yellow color monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK waitforvisualfinish call LandsWrathVortex call LandsWrathVortex @@ -9483,7 +9483,7 @@ gBattleAnimMove_LandsWrath:: waitbgfadein waitforvisualfinish call UnsetPsychicBg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK clearmonbg ANIM_ATTACKER end LandsWrathVortex: @@ -9509,11 +9509,11 @@ gBattleAnimMove_LightOfRuin:: loadspritegfx ANIM_TAG_ELECTRICITY @discharge loadspritegfx ANIM_TAG_PINK_PETAL @pink color loadspritegfx ANIM_TAG_EXPLOSION @explosion - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 0xC, 0xC, 0x6DDE @Pink + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(30, 14, 27) @Pink waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 20, 0, 2 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x6B1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(31, 24, 26) createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call LightOfRuinBeam @@ -9552,9 +9552,9 @@ gBattleAnimMove_LightOfRuin:: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 createsprite gLightOfRuinPinkExplosionTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 delay 16 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 1, 0, 0, RGB_BLACK waitforvisualfinish end LightOfRuinBeam: @@ -9638,7 +9638,7 @@ gBattleAnimMove_OriginPulse:: gBattleAnimMove_PrecipiceBlades:: loadspritegfx ANIM_TAG_LARGE_SPIKE loadspritegfx ANIM_TAG_FIRE_PLUME - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LARGE_SPIKE, 0, 10, 10, 0x159F @Blood orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LARGE_SPIKE, 0, 10, 10, RGB(31, 12, 5) @Blood orange monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET setalpha 12, 8 @@ -9703,13 +9703,13 @@ gBattleAnimMove_DragonAscent:: invisible ANIM_ATTACKER createsprite gDragonAscentFlyUpTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x400, 0x24, 0x15, 0x1, ANIM_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 4, 0, 14, RGB(21, 31, 27) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 4, 0, 14, RGB(21, 31, 27) playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createvisualtask AnimTask_StartSlidingBg, 0x5, -7304, -784, 1, -1 delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 0, 14, 0, RGB(21, 31, 27) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 0, 14, 0, RGB(21, 31, 27) waitforvisualfinish delay 1 monbg ANIM_DEF_PARTNER @@ -9721,7 +9721,7 @@ gBattleAnimMove_DragonAscent:: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) waitforvisualfinish delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 @@ -9736,7 +9736,7 @@ gBattleAnimMove_HyperspaceFury:: loadspritegfx ANIM_TAG_HOOPA_RING @Hoopa Ring loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xA, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 10, RGB_BLACK waitforvisualfinish playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gHyperspaceFuryRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x0 @@ -9811,7 +9811,7 @@ gBattleAnimMove_HyperspaceFury:: invisible ANIM_ATTACKER delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB_BLACK end HyperspaceFuryRandomImpact: createsprite gHyperspaceFuryImpactTemplate, ANIM_TARGET, 3, 0x1, 0x1 @@ -9965,7 +9965,7 @@ gBattleAnimMove_SparklingAria:: loadspritegfx ANIM_TAG_HYDRO_PUMP @hydro pump monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK waitforvisualfinish createsprite gSparklingAriaBlueChargeTemplate, ANIM_ATTACKER, 2, 0x0 call SparklingAriaCharge @@ -9977,7 +9977,7 @@ gBattleAnimMove_SparklingAria:: call SparklingAriaRain call SparklingAriaRain waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -10057,7 +10057,7 @@ gBattleAnimMove_IceHammer:: loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf @@ -10077,7 +10077,7 @@ gBattleAnimMove_IceHammer:: createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x50, 0x0, 0x4b createsprite gIceHammerSmokesTemplate, ANIM_TARGET, 4, 0x0, 0x12, 0x48, 0x1, 0x4b call IceCrystalEffectShort - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff end @@ -10192,18 +10192,18 @@ gBattleAnimMove_HighHorsepower:: loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @horseshoe monbg ANIM_TARGET delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 16, RGB_BLACK setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gHighHorsepowerHorseshoeTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x7, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE delay 50 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x0, 0x7fff - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 0, RGB_WHITE + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10247,7 +10247,7 @@ gBattleAnimMove_StrengthSap:: delay 2 createsprite gStrengthSapRedSmokeTemplate, ANIM_TARGET, 2, 0xfff8, 0x8, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x3, 0x07FD + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 3, RGB(29, 31, 1) delay 5 playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x0, 0x5, 0x8, 0x1a @@ -10273,7 +10273,7 @@ gBattleAnimMove_StrengthSap:: playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET createsprite gStrengthSapAbsorbTemplate, ANIM_ATTACKER, 3, 0x5, 0xffee, 0xffec, 0x23 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x3, 0x0, 0x07FD + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 3, 0, RGB(29, 31, 1) loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 call GrantingStarsEffect waitforvisualfinish @@ -10290,7 +10290,7 @@ SolarBladeUnleash: loadspritegfx ANIM_TAG_SUNLIGHT @sun rays monbg ANIM_ATTACKER setalpha 13, 3 - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 6, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 6, RGB_WHITE waitforvisualfinish playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 16, 6, 1, 4 @@ -10299,7 +10299,7 @@ SolarBladeUnleash: call SolarBladeSunRays call SolarBladeSunRays call SolarBladeSunRays - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, 0x2715, 0x2, 0x2, 0x7ff2, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish call SetSolarBeamBg playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET @@ -10307,7 +10307,7 @@ SolarBladeUnleash: delay 2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 12, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 6, 0, RGB_WHITE waitforvisualfinish call UnsetPsychicBg clearmonbg ANIM_ATTACKER @@ -10350,11 +10350,11 @@ gBattleAnimMove_Spotlight:: gBattleAnimMove_ToxicThread:: loadspritegfx ANIM_TAG_STRING loadspritegfx ANIM_TAG_WEB_THREAD - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 0xA, 0xA, 0x6038 @Purple - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0x0, 0xA, 0xA, 0x6038 @Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 10, 10, RGB(24, 1, 24) @Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0, 10, 10, RGB(24, 1, 24) @Purple monbg ANIM_DEF_PARTNER delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x9, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 9, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 0x9, 0x6 call SpiderWebThread @@ -10386,7 +10386,7 @@ gBattleAnimMove_ToxicThread:: clearmonbg ANIM_DEF_PARTNER delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x9, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 9, 0, RGB_BLACK end gBattleAnimMove_LaserFocus:: @@ -10394,14 +10394,14 @@ gBattleAnimMove_LaserFocus:: loadspritegfx ANIM_TAG_OPENING_EYE @eyes loadspritegfx ANIM_TAG_LEER @leer monbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish createsprite gLaserFocusRedEyesTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -10409,7 +10409,7 @@ gBattleAnimMove_LaserFocus:: gBattleAnimMove_GearUp:: loadspritegfx ANIM_TAG_GEAR loadspritegfx ANIM_TAG_SPARK_2 @sparks - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB(27, 28, 0) createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 @@ -10441,7 +10441,7 @@ gBattleAnimMove_GearUp:: createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x039B + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB(27, 28, 0) waitforvisualfinish end GearUpSparks: @@ -10467,9 +10467,9 @@ gBattleAnimMove_ThroatChop:: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, 0xfff0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 delay 3 createsprite gThroatChopRedImpactTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 @@ -10488,7 +10488,7 @@ gBattleAnimMove_ThroatChop:: playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -10507,7 +10507,7 @@ PollenPuffOpponent: loadspritegfx ANIM_TAG_ORBS @hit monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 @@ -10550,7 +10550,7 @@ PollenPuffOpponent: createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x1E, 0x0, 0x10 @right createsprite gPollenPuffImpactTemplates, ANIM_TARGET, 2, 0x1, 0x1, 0x16, 0xFFEA, 0x10 @upperright waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10563,7 +10563,7 @@ PollenPuffAlly: loadspritegfx ANIM_TAG_SPORE @ball monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 createsprite gPollenPuffPinkStarTemplate, ANIM_ATTACKER, 2, 0xa, 0xa, 0x19, 0x0 @@ -10604,7 +10604,7 @@ PollenPuffAlly: delay 7 createsprite gPollenPuffHealTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffb, 0x1, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x1, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 1, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10817,7 +10817,7 @@ gBattleAnimMove_BurnUp:: waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0xA00, 0x0, 0x1, 0xffff waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x1c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(28, 0, 0) waitforvisualfinish createvisualtask AnimTask_AllocBackupPalBuffer, 0x5 waitforvisualfinish @@ -10828,25 +10828,25 @@ gBattleAnimMove_BurnUp:: loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 createvisualtask AnimTask_CopyPalUnfadedToBackup, 0x5, 0x1, 0x0 delay 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xd, 0x1c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 13, RGB(28, 0, 0) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish delay 30 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 waitforvisualfinish playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER createsprite gBurnUpRedYawnTemplate, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0 delay 1 createvisualtask AnimTask_CopyPalFadedToUnfaded, 0x5, 0x1 delay 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xd, 0x4a52 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 13, RGB(18, 18, 18) createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 3, 0, 15, 1 delay 15 - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x0, 0xC, 0x1C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 12, RGB(28, 0, 0) delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x0, 0x1 delay 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x1c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(28, 0, 0) delay 1 createvisualtask AnimTask_CopyPalUnfadedFromBackup, 0x5, 0x1, 0x0 delay 1 @@ -10854,12 +10854,12 @@ gBattleAnimMove_BurnUp:: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 2, 0, 15, 1 call FireSpreadEffect waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xd, 0x0, 0x4a52 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 13, 0, RGB(18, 18, 18) delay 1 createvisualtask AnimTask_FreeBackupPalBuffer, 0x5 delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0xC, 0x0, 0x1C + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 12, 0, RGB(28, 0, 0) waitforvisualfinish call UnsetPsychicBg clearmonbg ANIM_DEF_PARTNER @@ -10974,7 +10974,7 @@ gBattleAnimMove_RevelationDance:: loadspritegfx ANIM_TAG_AIR_WAVE @sonicboom loadspritegfx ANIM_TAG_THIN_RING @ring monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_BLACK waitforvisualfinish playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_RockMonBackAndForth, 5, ANIM_ATTACKER, 2, 0 @@ -11017,7 +11017,7 @@ gBattleAnimMove_RevelationDance:: createsprite gRevelationDanceYellowDispersalTemplate, ANIM_TARGET, 1, 0x0, 0xa, 0x70, 0xff80, 0x28 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end @@ -11148,9 +11148,9 @@ gBattleAnimMove_CoreEnforcer:: loadspritegfx ANIM_TAG_SNORE_Z loadspritegfx ANIM_TAG_EXPLOSION clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 0xD, 0xD, 0x079F @Yellow - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 0xA, 0xA, 0x7501 @Royal Blue - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 0xA, 0xA, 0x0688 @Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 13, 13, RGB(31, 28, 1) @Yellow + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 10, 10, RGB(1, 8, 29) @Royal Blue + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 10, 10, RGB(8, 20, 1) @Green delay 16 monbg ANIM_TARGET createvisualtask AnimTask_CreateSmallSolarBeamOrbs, 0x5 @@ -11272,7 +11272,7 @@ gBattleAnimMove_Instruct:: createvisualtask AnimTask_HardwarePaletteFade, 0x2, 0xf8, 0x3, 0x0, 0xa, 0x0 waitforvisualfinish createsprite gSpotlightSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x8, 0x7DB9 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 8, RGB(25, 13, 31) delay 4 monbg ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 @@ -11285,7 +11285,7 @@ gBattleAnimMove_Instruct:: createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 1, 1 playsewithpan SE_M_BIND, SOUND_PAN_TARGET delay 29 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x8, 0x0, 0x7DB9 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 8, 0, RGB(25, 13, 31) waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11301,7 +11301,7 @@ gBattleAnimGeneral_BeakBlastSetUp:: end gBattleAnimMove_BeakBlast:: loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_RED waitforvisualfinish createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0x0 playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER @@ -11317,7 +11317,7 @@ gBattleAnimMove_BeakBlast:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x6 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_RED waitforvisualfinish end @@ -11326,8 +11326,8 @@ gBattleAnimMove_ClangingScales:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x2002 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, 0x642D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB(2, 0, 8) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, RGB(13, 1, 25) waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 2, 0, 8, 1 call ClangingScalesMetalSound @@ -11340,7 +11340,7 @@ gBattleAnimMove_ClangingScales:: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x2002 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB(2, 0, 8) waitforvisualfinish end ClangingScalesMetalSound: @@ -11353,7 +11353,7 @@ ClangingScalesMetalSound: gBattleAnimMove_DragonHammer:: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_GRAY_SMOKE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 12, 12, 0x7D7F @Pinkish purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 12, 12, RGB(31, 11, 31) @Pinkish purple fadetobg BG_COSMIC waitbgfadeout createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, -500, 0x0, 0xffff @@ -11648,7 +11648,7 @@ gBattleAnimMove_FleurCannon:: loadspritegfx ANIM_TAG_PINK_HEART @pink color setalpha 12, 8 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x7440 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB(0, 2, 29) waitforvisualfinish panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 @@ -11682,7 +11682,7 @@ gBattleAnimMove_FleurCannon:: delay 5 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 11, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7440 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(0, 2, 29) waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11783,7 +11783,7 @@ gBattleAnimMove_StompingTantrum:: clearmonbg ANIM_TARGET end StompingTantrumImpact: - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 return gBattleAnimMove_ShadowBone:: @@ -11799,7 +11799,7 @@ gBattleAnimMove_ShadowBone:: delay 12 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 0x5, 0x1, 0x0, 10, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 @@ -11866,7 +11866,7 @@ gBattleAnimMove_PrismaticLaser:: loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER createsprite gPrismaticLaserChargeTemplate, ANIM_ATTACKER, 2, 0x0 call PrismaticLaserInwardSpikes @@ -11901,7 +11901,7 @@ gBattleAnimMove_PrismaticLaser:: call PrismaticLaserRain call PrismaticLaserRain waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -12011,9 +12011,9 @@ SpectralThiefUnleash: createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x30 delay 48 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 24, 1 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0x0, 0xc, 0x77bd + createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 0, 12, RGB(29, 29, 29) delay 24 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x2, 0x6, 0x1, 0xc, 0x0, 0x77bd + createvisualtask AnimTask_BlendBattleAnimPalExclude, 2, 6, 1, 12, 0, RGB(29, 29, 29) waitforvisualfinish setalpha 0, 16 delay 1 @@ -12108,10 +12108,10 @@ gBattleAnimMove_SunsteelStrike:: createsprite gSunsteelStrikeBlackFlyBallTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 1, 20 delay 24 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 @The rock particles mess up the fly animation - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x1 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x2 - createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0x0, 0x3 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 0 @The rock particles mess up the fly animation + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 1 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 2 + createsprite gSunsteelStrikeRocksTemplate, ANIM_ATTACKER, 2, 0, 3 waitforvisualfinish unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color @@ -12169,9 +12169,9 @@ gBattleAnimMove_MoongeistBeam:: loadspritegfx ANIM_TAG_WATER_GUN @water gun colour loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour setalpha 8, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, 0x7FFF @White - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, 0x7FFC @Light Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, RGB_WHITE @White + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB(28, 31, 31) @Light Blue waitforvisualfinish playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMoonSpriteTemplate, ANIM_TARGET, 0, 0x20, 0x15 @@ -12192,7 +12192,7 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamOrbs call MoongeistBeamOrbs createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x6739 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25) call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs @@ -12222,7 +12222,7 @@ gBattleAnimMove_MoongeistBeam:: call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0xb, 0x0, 0x6739 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) delay 26 stopsound createvisualtask AnimTask_MoonlightEndFade, 0x2 @@ -12246,7 +12246,7 @@ gBattleAnimMove_TearfulLook:: loadspritegfx ANIM_TAG_SMALL_BUBBLES @tears loadspritegfx ANIM_TAG_OPENING_EYE @eye monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x5, 0x7DE0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 5, RGB(0, 15, 31) waitforvisualfinish playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0x0, 0x0, 0x1, 0x0 @@ -12263,7 +12263,7 @@ gBattleAnimMove_TearfulLook:: createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2 createsprite gTearDropSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x5, 0x0, 0x7DE0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 5, 0, RGB(0, 15, 31) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -12406,7 +12406,7 @@ gBattleAnimMove_MultiAttack:: loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy loadspritegfx ANIM_TAG_CUT @cut monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MultiAttackBuff @@ -12423,7 +12423,7 @@ gBattleAnimMove_MultiAttack:: createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 0x28, 0xffd0, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET end @@ -12447,7 +12447,7 @@ gBattleAnimMove_MindBlown:: loadspritegfx ANIM_TAG_IMPACT @hit monbg ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_FALL, SOUND_PAN_TARGET createsprite gMindBlownHeadTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x25 @@ -12470,7 +12470,7 @@ gBattleAnimMove_MindBlown:: call MindBlownBlueOrbs delay 1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -12505,7 +12505,7 @@ gBattleAnimMove_PlasmaFists:: loadspritegfx ANIM_TAG_LIGHTNING @thunder punch monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK waitforvisualfinish createsprite gPlasmaFistsChargeTemplate, ANIM_ATTACKER, 2, 0x0 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 3, 92, 1 @@ -12541,7 +12541,7 @@ gBattleAnimMove_PlasmaFists:: waitforvisualfinish call PlasmaFistsImpact waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12566,16 +12566,16 @@ PlasmaFistsImpact: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffd0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 - createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 @@ -12621,7 +12621,7 @@ gBattleAnimMove_PhotonGeyser:: delay 10 call PhotonGeyserSparks2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 15, RGB_BLACK clearmonbg ANIM_ATTACKER playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_ORBS @recover @@ -12649,13 +12649,13 @@ gBattleAnimMove_PhotonGeyser:: unloadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color @Shoot beam to the sky loadspritegfx ANIM_TAG_STRAIGHT_BEAM - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0x10, 0x43FF @Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 16, RGB(31, 31, 16) @Light yellow createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 96, 1 panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call PhotonGeyserBeam waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x10, 0x0, 0x43FF @Light yellow - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB(31, 31, 16) @Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 15, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12863,7 +12863,7 @@ gBattleAnimMove_GlitzyGlow:: loadspritegfx ANIM_TAG_POISON_BUBBLE @violet color loadspritegfx ANIM_TAG_SMALL_EMBER @flame wheel particle loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, 0x289F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 12, 12, RGB(31, 4, 10) monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 @Darken @@ -13005,8 +13005,8 @@ gBattleAnimMove_FreezyFrost:: loadspritegfx ANIM_TAG_ICICLE_SPEAR loadspritegfx ANIM_TAG_ICE_SPIKES loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICICLE_SPEAR, 0, 0, 12, RGB_BLACK - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICE_SPIKES, 0, 0, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICICLE_SPEAR, 0, 0, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_SPIKES, 0, 0, 12, RGB_BLACK waitforvisualfinish call FreezyFrostHitEffect call FreezyFrostHitEffect @@ -13189,9 +13189,9 @@ gBattleAnimMove_SnipeShot:: gBattleAnimMove_JawLock:: loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x0B1D @Light orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(29, 24, 2) @Light orange monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x7, 0x0 @Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK @Black waitforvisualfinish playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa, 15 @@ -13200,7 +13200,7 @@ gBattleAnimMove_JawLock:: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 10, 2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0 @;Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB_BLACK @;Black waitforvisualfinish clearmonbg ANIM_TARGET delay 1 @@ -13228,7 +13228,7 @@ BERRYEAT_ON_PLAYER: delay 10 POST_BERRY_EAT: playsewithpan SE_SHINY, 0xc0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x2, 0x3, 0x7, 0x0, 0x67f1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 3, 7, 0, RGB(17, 31, 25) createsprite gThinRingExpandingSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish end @@ -13254,7 +13254,7 @@ gBattleAnimMove_NoRetreat:: gBattleAnimMove_TarShot:: loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 15, 15, 0 @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 15, 15, RGB_BLACK @Black monbg ANIM_TARGET createsprite gAppleAcidLaunchTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x28, 0x1, 0x0, 0x0 playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER @@ -13334,7 +13334,7 @@ gBattleAnimMove_Teatime:: gBattleAnimMove_Octolock:: loadspritegfx ANIM_TAG_TENDRILS - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, 0x3D98 @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, RGB(24, 12, 15) @Pinkish Red loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET 0x6 0x4 createsprite gConstrictBindingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x10, 0x0, 0x2 delay 7 @@ -13356,8 +13356,8 @@ gBattleAnimMove_BoltBeak:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, 0x079D @Yellow + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, RGB(29, 28, 1) @Yellow call BoltBeakSparks waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) @@ -13407,7 +13407,7 @@ BoltBeakSparks: gBattleAnimMove_FishiousRend:: loadspritegfx ANIM_TAG_SHARP_TEETH @Teeth loadspritegfx ANIM_TAG_SMALL_BUBBLES - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x726A @Blue Teeth + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(10, 19, 28) @Blue Teeth playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET createsprite gFishiousRendTeethTemplate, ANIM_TARGET, 0, 50, 4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 4, 0, 12, 2 @@ -13503,7 +13503,7 @@ ClangorousSoulStarBuffEffect: gBattleAnimMove_BodyPress:: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly and bounce animation loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 0xD, 0xD, 0x1E5D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 13, 13, RGB(29, 18, 7) @Orange playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 delay 7 @@ -13525,7 +13525,7 @@ gBattleAnimMove_DrumBeating:: loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE loadspritegfx ANIM_TAG_ROOTS loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MUSIC_NOTES, 0, 0xD, 0xD, 0x03AC @Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MUSIC_NOTES, 0, 13, 13, RGB(12, 29, 0) @Green monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 @@ -13586,7 +13586,7 @@ gBattleAnimMove_SnapTrap:: loadspritegfx ANIM_TAG_FLOWER @flowers loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x0688 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, RGB(8, 20, 1) monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_BITE, SOUND_PAN_TARGET @@ -13616,7 +13616,7 @@ gBattleAnimMove_PyroBall:: playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x3, 0x0, 0x7, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 7, RGB(29, 1, 1) createsprite gPyroBallBurningRockTemplate, ANIM_ATTACKER, 2, 0, 0, 0 delay 25 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET @@ -13631,7 +13631,7 @@ gBattleAnimMove_PyroBall:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x043D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 7, 0, RGB(29, 1, 1) waitforvisualfinish end @@ -13647,7 +13647,7 @@ gBattleAnimMove_BehemothBlade:: playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 22 - createvisualtask AnimTask_FlashAnimTagWithColor, 2, 0x2715, 2, 2, RGB(18, 31, 31), 16, 0, 0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -13837,9 +13837,9 @@ gBattleAnimMove_AuraWheel:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_SPARK_2 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x303B @Pinkish-Red Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0x0, 0xC, 0xC, 0x76E1 @Blue Electricity - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0x0, 0xA, 0xA, 0x303B @Pinkish-Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0, 12, 12, RGB(27, 1, 12) @Pinkish-Red Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 10, 10, RGB(27, 1, 12) @Pinkish-Red setalpha 12, 8 monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET @@ -13869,7 +13869,7 @@ gBattleAnimMove_AuraWheel:: playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, 0x76E1 @Revert blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, RGB(1, 23, 29) @Revert blue Electricity createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -13884,8 +13884,8 @@ gBattleAnimMove_AuraWheel:: gBattleAnimMove_BreakingSwipe:: loadspritegfx ANIM_TAG_IMPACT @hits loadspritegfx ANIM_TAG_SPARK_2 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, 0x001F @Red - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, 0x001F @Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB_RED @Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, RGB_RED @Red monbg ANIM_TARGET setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 1 @@ -13894,11 +13894,11 @@ gBattleAnimMove_BreakingSwipe:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff1, 0xfff6, 0x5, 0x0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 @@ -13927,15 +13927,15 @@ gBattleAnimMove_Overdrive:: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_SPARK_2 loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(1, 23, 29) @Blue Electricity call BoltBeakSparks waitforvisualfinish - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, 0x17BF @Yellow Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, RGB(31, 29, 5) @Yellow Electricity call OverdriveRings delay 8 call OverdriveRings delay 16 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, 0x76E1 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, RGB(1, 23, 29) @Blue Electricity waitforvisualfinish end OverdriveRings: @@ -13952,7 +13952,7 @@ OverdriveRings: gBattleAnimMove_AppleAcid:: loadspritegfx ANIM_TAG_APPLE loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB(29, 16, 1) @Orange playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER createsprite gAppleAcidFloatingAppleTemplate, ANIM_ATTACKER, 12, 0x0 delay 48 @@ -14040,9 +14040,9 @@ gBattleAnimMove_SpiritBreak:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_TEAL_ALERT loadspritegfx ANIM_TAG_EXPLOSION_2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0x10, 0x10, 0x7FFF - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_TEAL_ALERT, 0x0, 0xA, 0xA, 0x7DDE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 16, 16, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TEAL_ALERT, 0, 10, 10, RGB(30, 14, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_DEF_PARTNER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET @@ -14066,7 +14066,7 @@ gBattleAnimMove_StrangeSteam:: loadspritegfx ANIM_TAG_PINK_CLOUD loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_WATER_GUN @blue colour - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, 0x4798 @Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, RGB(24, 28, 17) @Green monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x4, 0xA @@ -14125,8 +14125,8 @@ gBattleAnimMove_Obstruct:: loadspritegfx ANIM_TAG_NOISE_LINE @growl loadspritegfx ANIM_TAG_PROTECT loadspritegfx ANIM_TAG_OBSTRUCT_CROSS - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, 0 @Black - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, 0 @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, RGB_BLACK @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, RGB_BLACK @Black createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, DOUBLE_CRY_GROWL call RoarEffect waitforvisualfinish @@ -14162,7 +14162,7 @@ gBattleAnimMove_FalseSurrender:: setalpha 12, 8 delay 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x7fff, 0xa, 0x0, 0xa + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10 createsprite gSpriteTemplate_LargeCrossImpact, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x14 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 waitforvisualfinish @@ -14185,8 +14185,8 @@ gBattleAnimMove_MeteorAssault:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_METEOR loadspritegfx ANIM_TAG_EXPLOSION - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, 0x0B1D @Light orange - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, 0x0B1D @Light orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, RGB(29, 24, 2) @Light orange + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 9, RGB(29, 24, 2) @Light orange createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 48, 0, 4 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish @@ -14194,13 +14194,13 @@ gBattleAnimMove_MeteorAssault:: createsprite gGrowingSuperpowerTemplate, ANIM_TARGET, 3, 0x0 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 15 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0x10, 0x7FFF @Screen flash white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 16, 16, RGB_WHITE @Screen flash white createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 32, 1 call BasicExplosion call BasicExplosion waitforvisualfinish visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 0x10, 0, 0x7FFF @Screen revert from white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 1, 16, 0, RGB_WHITE @Screen revert from white waitforvisualfinish end BasicExplosion: @@ -14322,7 +14322,7 @@ gBattleAnimMove_SteelBeam:: delay 4 createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 1 delay 4 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 10, RGB(24, 24, 48) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 10, RGB(24, 24, 48) createsprite gSteelBeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 2 delay 4 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 65, 1 @@ -14337,7 +14337,7 @@ gBattleAnimMove_SteelBeam:: call SteelBeam_Continuity call SteelBeam_Continuity waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 10, 0, RGB(24, 24, 48) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 10, 0, RGB(24, 24, 48) call UnsetHighSpeedBg end SteelBeam_Continuity: @@ -14368,8 +14368,8 @@ SetSteelBeamBgPlayer: gBattleAnimMove_ExpandingForce:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_EXPLOSION_2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xA, 0xA, 0x7DDE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB(30, 14, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_DEF_PARTNER call SetPsychicBackground createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 @@ -14624,7 +14624,7 @@ gBattleAnimMove_ShellSideArmSpecial:: @ Modified Snipe Shot, placeholder @Credits to Skeli gBattleAnimMove_MistyExplosion:: loadspritegfx ANIM_TAG_EXPLOSION - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x8, 0x9, 0x7A5B, 0x8, 0x0, 0x8 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 8, 9, RGB(27, 18, 30), 8, RGB_BLACK, 8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_LEFT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_PLAYER_RIGHT, 8, 0, 40, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_OPPONENT_LEFT, 8, 0, 40, 1 @@ -14633,9 +14633,9 @@ gBattleAnimMove_MistyExplosion:: call Explosion1 call Explosion1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x1, 0x10, 0x10, 0x7F7F @;White Pink + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 16, RGB(31, 27, 31) @;White Pink delay 50 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x1, 0x3, 0x10, 0x0, 0x7F7F @;White Pink + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 16, 0, RGB(31, 27, 31) @;White Pink end @Credits to Skeli @@ -14643,7 +14643,7 @@ gBattleAnimMove_GrassyGlide:: loadspritegfx ANIM_TAG_LEAF @leaves loadspritegfx ANIM_TAG_IMPACT @hits loadspritegfx ANIM_TAG_WHIP_HIT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_IMPACT, 0x0, 0xD, 0xD, 0x0266 @;Leaf Green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 13, 13, RGB(6, 19, 0) @;Leaf Green createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(12, 29, 0) delay 2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER @@ -14665,7 +14665,7 @@ gBattleAnimMove_RisingVoltage:: createvisualtask AnimTask_GetBattleEnvironment, 0x5, jumpargeq 0x0, BG_ELECTRIC_TERRAIN, ANIM_RISING_VOLTAGE_STRONGER ANIM_RISING_VOLTAGE_NORMAL: - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 @;To black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 0, 4, RGB_BLACK @;To black waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 30, 0, 3 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -14675,21 +14675,21 @@ ANIM_RISING_VOLTAGE_NORMAL: createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x34, 0x1, 0x0 createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 1, 4, 0, 12, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 call StokedSparksurferSparkGeyser call StokedSparksurferSparkGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 @;From black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 4, 0, RGB_BLACK @;From black waitforvisualfinish clearmonbg ANIM_ATTACKER end ANIM_RISING_VOLTAGE_STRONGER: - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 @;To black + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 0, 12, RGB_BLACK @;To black waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 55, 0, 0 @;Amount, Slowness, Slowness, Compaction playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -14697,31 +14697,31 @@ ANIM_RISING_VOLTAGE_STRONGER: createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2, waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x54, 0x1, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x079D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(29, 28, 1) playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, 16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x10, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -32 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, 16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, -16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -0x18, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -24, -32 call StokedSparksurferSparkGeyser playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xffe0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 call StokedSparksurferSparkGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x10, 0x0, 0x079D @;From Yellow - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 @;From black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 16, 0, RGB(29, 28, 1) @;From Yellow + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_BG, 1, 12, 0, RGB_BLACK @;From black waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -14815,7 +14815,7 @@ gBattleAnimMove_SkitterSmack:: loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour loadspritegfx ANIM_TAG_RAZOR_LEAF - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_WHITE waitforvisualfinish playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER @@ -14854,7 +14854,7 @@ gBattleAnimMove_SkitterSmack:: invisible ANIM_ATTACKER delay 1 visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_WHITE waitforvisualfinish end @@ -14917,7 +14917,7 @@ gBattleAnimMove_LashOut:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color loadspritegfx ANIM_TAG_SLAM_HIT_2 loadspritegfx ANIM_TAG_IMPACT @hit - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SLAM_HIT_2, 0x0, 0xA, 0xA, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLAM_HIT_2, 0, 10, 10, RGB_RED monbg ANIM_DEF_PARTNER playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call PowerTripBuffUp @@ -14978,7 +14978,7 @@ gBattleAnimMove_Poltergeist:: setalpha 12, 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_ATTACKER | F_PAL_TARGET, 5, 1, 0, 10, RGB_BLACK, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_NightmareClone, 0x2 @@ -14994,7 +14994,7 @@ gBattleAnimMove_Poltergeist:: @Credits to Skeli gBattleAnimMove_CorrosiveGas:: loadspritegfx ANIM_TAG_PINK_CLOUD @Fumes - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PINK_CLOUD, 0x0, 0xE, 0xE, 0x19EF @;Garbage green + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINK_CLOUD, 0, 14, 14, RGB(15, 15, 6) @;Garbage green monbg ANIM_ATTACKER loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER, 0x8, 0x3 delay 0 @@ -15257,8 +15257,8 @@ gBattleAnimMove_WickedBlow:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_PAIN_SPLIT loadspritegfx ANIM_TAG_SPARKLE_4 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PAIN_SPLIT, 0x0, 0x9, 0x9, 0x1F - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FOCUS_ENERGY, 0x0, 0x8, 0x8, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PAIN_SPLIT, 0, 9, 9, RGB_RED + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FOCUS_ENERGY, 0, 8, 8, RGB_RED playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call WickedBlowBuffEffect delay 8 @@ -15402,13 +15402,13 @@ ThunderCageBolts: @Credits to Skeli gBattleAnimMove_DragonEnergy:: loadspritegfx ANIM_TAG_HYDRO_PUMP - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x2C5E @;Regidrago Reddish Reddish, Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple monbg ANIM_TARGET playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 4, 0, 11, RGB(31, 28, 31) @;Pinkish White waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x10, 0x0, 0x2C5E @;Regidrago Reddish Reddish, Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 16, 0, RGB(30, 2, 11) @;Regidrago Reddish Reddish, Purple createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 1 @;Slide off off, screen waitforvisualfinish playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_TARGET @@ -15483,14 +15483,14 @@ gBattleAnimMove_FieryWrath:: loadspritegfx ANIM_TAG_PURPLE_RING monbg ANIM_DEF_PARTNER playsewithpan SE_M_SACRED_FIRE2, 0xc0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x2, 0x0, 0xE, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x4, 0x0, 0x8, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 14, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 4, 0, 8, RGB_RED createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 32, 1 call DragonClawFireSpiral call DragonClawFireSpiral waitforvisualfinish loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_DEF_SIDE, 0x4, 0x0, 0xF, 0x3006 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 4, 0, 15, RGB(6, 0, 12) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 4, 0, 60, 1 call FieryWrathGeyser @@ -15498,9 +15498,9 @@ gBattleAnimMove_FieryWrath:: call FieryWrathGeyser call FieryWrathGeyser waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x8, 0x0, 0x1F - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_DEF_SIDE, 0x2, 0x9, 0x0, 0x3006 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xE, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 8, 0, RGB_RED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_DEF_SIDE, 2, 9, 0, RGB(6, 0, 12) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 14, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -15569,7 +15569,7 @@ gBattleAnimMove_ThunderousKick:: setalpha 12, 8 playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET createsprite gMegaPunchKickSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_WHITE createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 2, 0, 22, 1 call ZingZapSparks1 delay 10 @@ -15584,8 +15584,8 @@ gBattleAnimMove_ThunderousKick:: playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x7fff - createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 0, RGB_WHITE + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG | F_PAL_BATTLERS, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 clearmonbg ANIM_TARGET @@ -15599,13 +15599,13 @@ gBattleAnimMove_GlacialLance:: loadspritegfx ANIM_TAG_ICICLE_SPEAR loadspritegfx ANIM_TAG_ICE_CUBE loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xA, 0x3C00 @;Royal Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 10, RGB(0, 0, 15) @;Royal Blue monbg ANIM_TARGET playsewithpan SE_M_HAIL, SOUND_PAN_TARGET createvisualtask AnimTask_CentredFrozenIceCube, ANIM_TARGET, 0 createsprite gSpriteTemplate_GlacialLance, ANIM_TARGET, 2, 0, 40, 0, 0, 40, 50, 10 delay 60 - createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ICICLE_SPEAR, 0x4, 0x1, 0x7FFF, 0x10, 0x0, 0x0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ICICLE_SPEAR, 4, 1, RGB_WHITE, 16, 0, 0 playsewithpan SE_M_DETECT, SOUND_PAN_TARGET delay 38 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET @@ -15614,7 +15614,7 @@ gBattleAnimMove_GlacialLance:: delay 4 call IceCrystalEffectLong waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0xA, 0x0, 0x3C00 @;Royal Blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 10, 0, RGB(0, 0, 15) @;Royal Blue waitforvisualfinish clearmonbg ANIM_TARGET end @@ -15624,8 +15624,8 @@ gBattleAnimMove_AstralBarrage:: loadspritegfx ANIM_TAG_FLAT_ROCK loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FLAT_ROCK, 0x0, 0xA, 0xA, RGB(2, 1, 4) - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ICE_CRYSTALS, 0x0, 0xA, 0xA, RGB(2, 1, 4) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLAT_ROCK, 0, 10, 10, RGB(2, 1, 4) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 10, 10, RGB(2, 1, 4) monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER setalpha 12, 8 @@ -15708,7 +15708,7 @@ EerieSpellConvergingFlames: gBattleAnimMove_DireClaw:: loadspritegfx ANIM_TAG_SLASH loadspritegfx ANIM_TAG_POISON_BUBBLE - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLASH, 0x0, 0xC, 0xC, 0x6038 @;Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SLASH, 0, 12, 12, RGB(24, 1, 24) @;Purple createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET @@ -15733,7 +15733,7 @@ gBattleAnimMove_PsyshieldBash:: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x0, 0xB, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 0, 11, RGB(15, 29, 31) @;Light blue createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 56, 10 delay 35 createsprite gSpriteTemplate_PsyshieldBashHit, ANIM_ATTACKER, 4, -10, 0x0, 0x1, 0x0 @@ -15744,7 +15744,7 @@ gBattleAnimMove_PsyshieldBash:: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 11, 0, RGB(15, 29, 31) @;Light blue createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x5 delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0x7 @@ -15807,7 +15807,7 @@ gBattleAnimMove_SpringtideStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 2, 6, 0, 11, 0x7ADF + createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 2, 6, 0, 11, RGB(31, 22, 30) call HurricaneGustCentered call SpringtideStormHeartSwirl call HurricaneGustCentered @@ -15855,7 +15855,7 @@ gBattleAnimMove_MysticalPower:: call PsystrikeInwardRing delay 10 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0xB, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 11, RGB(15, 29, 31) @;Light blue createvisualtask AnimTask_ExtrasensoryDistortion, 0x5, 0x0 call MysticalPowerFoeRings createvisualtask AnimTask_ExtrasensoryDistortion, 0x5, 0x1 @@ -15864,7 +15864,7 @@ gBattleAnimMove_MysticalPower:: call MysticalPowerFoeTwoRingsOnly waitforvisualfinish clearmonbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x7FAF @;Light blue + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 11, 0, RGB(15, 29, 31) @;Light blue call UnsetPsychicBg blendoff end @@ -15917,7 +15917,7 @@ gBattleAnimMove_WaveCrash:: loadspritegfx ANIM_TAG_SMALL_BUBBLES loadspritegfx ANIM_TAG_ICE_CRYSTALS @Bubbles on attacker monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xB, 0x726A + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB(10, 19, 28) createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -20, 8, 48, 8, 56, 6 call WaterfallBubblesOnAttacker waitforvisualfinish @@ -15926,7 +15926,7 @@ gBattleAnimMove_WaveCrash:: waitforvisualfinish delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xB, 0x0, 0x726A + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 11, 0, RGB(10, 19, 28) clearmonbg ANIM_DEF_PARTNER waitforvisualfinish end @@ -15936,11 +15936,11 @@ gBattleAnimMove_WaveCrash:: gBattleAnimMove_Chloroblast:: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_HYDRO_PUMP - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_THIN_RING, 0x0, 0xA, 0xA, 0x03AC - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x03AC - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x2, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0x10, 0x03AC - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 10, 10, RGB(12, 29, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(12, 29, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 2, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 16, RGB(12, 29, 0) + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 2, 0, 16, RGB_BLACK playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER createsprite gThinRingShrinkingSpriteTemplate ANIM_ATTACKER, 0x28, 0, 0, 0, 0 delay 14 @@ -15951,7 +15951,7 @@ gBattleAnimMove_Chloroblast:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA, fadetobg BG_CHLOROBLAST waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 16, 0, RGB_BLACK delay 16 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 74, 1 createsoundtask SoundTask_LoopSEAdjustPanning, 0xf0, 0xFF00 | SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x17, 0x0, 0x5 @@ -15977,14 +15977,14 @@ gBattleAnimMove_Chloroblast:: call ChloroblastShot waitforvisualfinish delay 5 - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x2, 0x0, 0x0, 0x0 @;From Black - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x03AC + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 2, 0, 0, RGB_BLACK @;From Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 16, 0, RGB(12, 29, 0) restorebg waitbgfadeout createvisualtask AnimTask_AllBattlersVisible, 0xA, clearmonbg ANIM_DEF_PARTNER waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x0, 0x0 @;From Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 0, RGB_BLACK @;From Black end ChloroblastShot: createsprite gSpriteTemplate_ChloroblastShot, ANIM_TARGET, 2, 0, 0, 0x19 @@ -16032,7 +16032,7 @@ gBattleAnimMove_VictoryDance:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 40, 6, 3, 3 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 8 - createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x0B1D, 0xe, 0x0, 0x3 @;Light orange + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(29, 24, 2), 14, 0, 3 @;Light orange createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x55 @@ -16170,7 +16170,7 @@ BarbBarrageSpikeShoot: gBattleAnimMove_EsperWing:: loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade loadspritegfx ANIM_TAG_WHITE_FEATHER - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WHITE_FEATHER, 0x0, 0xA, 0xA, 0x7DDE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_FEATHER, 0, 10, 10, RGB(30, 14, 31) monbg ANIM_TARGET call SetPsychicBackground playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER @@ -16211,15 +16211,15 @@ gBattleAnimMove_BitterMalice:: playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createvisualtask AnimTask_ScaryFace, 0x5 @ internally checks side createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 76, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xF, 0x3006 @;Dark Purple - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_PURPLE_RING, 0x4, 0x0, 0xE, 0x3006 @;Dark Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 15, RGB(6, 0, 12) @;Dark Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PURPLE_RING, 4, 0, 14, RGB(6, 0, 12) @;Dark Purple call BitterMaliceSwirl call BitterMaliceSwirl call BitterMaliceSwirl delay 4 @;Wait until the blends are reset after the scary face fades out call IceCrystalEffectShort waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xF, 0x0, 0x3006 @;Dark Purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 15, 0, RGB(6, 0, 12) @;Dark Purple end BitterMaliceSwirl: @@ -16243,8 +16243,8 @@ gBattleAnimMove_Shelter:: loadspritegfx ANIM_TAG_SHELL_RIGHT playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShellSmashShrinkAttacker, 0x2 - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SHELL_LEFT, 0x1, 0x0, 0xE, 0x6B5A @ light light, gray - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SHELL_RIGHT, 0x1, 0x0, 0xE, 0x6B5A @ light light, gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHELL_LEFT, 1, 0, 14, RGB(26, 26, 26) @ light light, gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHELL_RIGHT, 1, 0, 14, RGB(26, 26, 26) @ light light, gray createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 10, 30 createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 10, 30 createvisualtask AnimTask_FadeOutParticles, 0x2, 0 @@ -16339,8 +16339,8 @@ gBattleAnimMove_CeaselessEdge:: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 44, 0, 0, 5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x10, 0x1F @;Fully to to, Red - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_TARGET), 0x0, 0x10, 0x10, 0x0 @;Fully to to, Black + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 16, 16, RGB_RED @;Fully to to, Red + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_TARGET), 0, 16, 16, RGB_BLACK @;Fully to to, Black createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xa, delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 48, 1 @@ -16352,7 +16352,7 @@ gBattleAnimMove_CeaselessEdge:: createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA, - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x10, 0x0, 0x7FFF @;From White + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 16, 0, RGB_WHITE @;From White waitforvisualfinish end @@ -16378,7 +16378,7 @@ gBattleAnimMove_BleakwindStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB_WHITE call HurricaneGustCentered call BleakwindStormIceSwirl call HurricaneGustCentered @@ -16393,7 +16393,7 @@ gBattleAnimMove_BleakwindStorm:: call BleakwindStormIceSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB_WHITE waitforvisualfinish end BleakwindStormIceSwirl: @@ -16422,7 +16422,7 @@ gBattleAnimMove_WildboltStorm:: playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB(30, 31, 1) call HurricaneGustCentered call WildboltStormSparkSwirl call HurricaneGustCentered @@ -16437,7 +16437,7 @@ gBattleAnimMove_WildboltStorm:: call WildboltStormSparkSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB(30, 31, 1) call UnsetPsychicBg waitforvisualfinish end @@ -16461,11 +16461,11 @@ WildboltStormSparkSwirl: gBattleAnimMove_SandsearStorm:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_SMALL_EMBER - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_GUST, 0x0, 0xA, 0xA, 0x190B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 10, 10, RGB(11, 8, 6) playsewithpan SE_M_GUST, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 88, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 4, 0, 11, RGB_RED call HurricaneGustCentered call SandsearStormFireSpin call HurricaneGustCentered @@ -16480,7 +16480,7 @@ gBattleAnimMove_SandsearStorm:: call SandsearStormFireSpin waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_DEF_PARTNER), 1, 11, 0, RGB_RED waitforvisualfinish end @@ -16507,12 +16507,12 @@ gBattleAnimMove_LunarBlessing:: loadspritegfx ANIM_TAG_SMALL_EMBER @Yellow colour for ring monbg ANIM_ATK_PARTNER setalpha 16, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x0 - createvisualtask AnimTask_BlendNonAttackerPalettes, 0x2, 0x1, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK + createvisualtask AnimTask_BlendNonAttackerPalettes, 2, 1, 0, 16, RGB_BLACK waitforvisualfinish createsprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 0x78, 0x38 createvisualtask AnimTask_AlphaFadeIn, 0x3, 0x0, 0x10, 0x10, 0x0, 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x7, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 7, 0, 16, RGB_BLACK loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 call HealingEffect2 createsprite gSpriteTemplate_LunarDanceRing, ANIM_ATTACKER, 2, @@ -16815,7 +16815,7 @@ gBattleAnimMove_BurningBulwark:: monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER 16 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 13, 13, 0x015B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 13, 13, RGB(27, 10, 0) createsprite gProtectSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 90 createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 delay 2 @@ -16837,7 +16837,7 @@ gBattleAnimMove_BurningBulwark:: gBattleAnimMove_AlluringVoice:: loadspritegfx ANIM_TAG_THIN_RING - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x8, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 8, RGB(29, 19, 27) waitforvisualfinish createvisualtask SoundTask_PlayCryWithEcho, 5, FALSE createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 @@ -16851,7 +16851,7 @@ gBattleAnimMove_AlluringVoice:: waitforvisualfinish createvisualtask SoundTask_WaitForCry, 0x5 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x8, 0x0, 0x6e7d + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 8, 0, RGB(29, 19, 27) waitforvisualfinish end @@ -17062,7 +17062,7 @@ gBattleAnimMove_UpperHand:: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gKarateChopSpriteTemplate, 2, 8, -16, 0, 0, 0, 10, 1, 3, 0 + createsprite gKarateChopSpriteTemplate, ANIM_ATK_PARTNER, 8, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gForcePalmSpriteTemplate 3, 4, 0, 0, 1, 2 @@ -17129,19 +17129,19 @@ gBattleAnimMove_PsychicNoise:: monbg ANIM_DEF_PARTNER call SetPsychicBackground createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -17627,7 +17627,7 @@ ElectroShotSetUp: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setalpha 14, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @@ -17652,7 +17652,7 @@ ElectroShotSetUp: call TechnoBlastCharging2 delay 15 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -17663,7 +17663,7 @@ ElectroShotUnleash: loadspritegfx ANIM_TAG_ELECTRICITY loadspritegfx ANIM_TAG_SPARK_2 setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER delay 12 @@ -17695,7 +17695,7 @@ ElectroShotUnleash: call SparkBeam call SparkBeam delay 20 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(31, 31, 22) waitforvisualfinish @@ -17759,7 +17759,7 @@ gBattleAnimMove_SpicyExtract:: loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_POISON_BUBBLE loadspritegfx ANIM_TAG_SMALL_BUBBLES - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB(29, 16, 1) @Orange call SludgeBombProjectile call SludgeBombProjectile call SludgeBombProjectile @@ -17877,11 +17877,11 @@ gBattleAnimMove_FilletAway:: createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 60, -37, 0 playsewithpan SE_M_CUT, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 9, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 2, 4, 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 9, 0, RGB_WHITE waitforvisualfinish blendoff end @@ -18606,14 +18606,14 @@ gBattleAnimMove_GlaiveRush:: playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER createsprite gSwordsDanceBladeSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 22 - createvisualtask AnimTask_FlashAnimTagWithColor, 2, 0x2715, 2, 2, RGB(18, 31, 31), 16, 0, 0 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_SWORD, 2, 2, RGB(18, 31, 31), 16, 0, 0 waitforvisualfinish delay 1 loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_DRAGON_ASCENT monbg ANIM_ATTACKER createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_DRAGON_ASCENT, 0, 10, 10, RGB(0, 0, 31) @Blue - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 0, 16, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 16, RGB_WHITE delay 4 createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 waitforvisualfinish @@ -18624,11 +18624,11 @@ gBattleAnimMove_GlaiveRush:: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) waitforvisualfinish delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 15, 0, RGB_WHITE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 15, 0, RGB_WHITE waitforvisualfinish clearmonbg ANIM_ATTACKER call UnsetHighSpeedBg @@ -22312,19 +22312,19 @@ gBattleAnimMove_Uproar:: loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_DEF_PARTNER createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 delay 16 createvisualtask AnimTask_UproarDistortion, 2, 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB_RED, 8 playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 @@ -28023,7 +28023,7 @@ gBattleAnimMove_RockTomb:: end SetBugBg: - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 0, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 4, RGB_BLACK createvisualtask AnimTask_GetAttackerSide, 2 jumprettrue SetBugBgPlayer fadetobg BG_BUG_OPPONENT @@ -28036,14 +28036,14 @@ SetBugBgPlayer: createvisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1 SetBugBgFade: delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 4, 4, RGB_BLACK waitbgfadein return UnsetBugBg: restorebg waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK setarg 7, -1 waitbgfadein return @@ -29387,13 +29387,13 @@ Status_Infestation: loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(0, 25, 28) createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 30, 1 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 30 call InfestationVortex call InfestationVortex waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_TARGET, 0x2, 0x9, 0x0, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 9, 0, RGB(0, 25, 28) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -30021,7 +30021,7 @@ gBattleAnimGeneral_UltraBurst:: monbg ANIM_ATTACKER setalpha 12, 8 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB2GBA(250, 240, 230) - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ADJACENT), 2, 0, 15, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker delay 30 @@ -30340,7 +30340,7 @@ gBattleAnimMove_BreakneckBlitz:: monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER delay 1 - createvisualtask AnimTask_BlendPalInAndOutByTag, 0x5, ANIM_TAG_HOLLOW_ORB, 0x4c00, 0xe, 0x0, 0x3 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x0 createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x2b createsprite gBreakneckBlitzDanceSpriteTemplate, ANIM_ATTACKER, 2, 0x55 @@ -30507,10 +30507,10 @@ gBattleAnimMove_SupersonicSkystrike:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0x8, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 8, 0, RGB_BLACK createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATTACKER, 2, 16 playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x1, 0xf, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 1, 15, 0, RGB_WHITE clearmonbg ANIM_DEF_PARTNER call EndureEffect delay 8 @@ -30609,14 +30609,14 @@ FinishAcidDownpour: delay 32 panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 50, 1 call AcidDownpourFlare call AcidDownpourFlare delay 21 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 42 delay 44 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 7, 0, (RGB(28, 3, 22) | RGB_ALPHA) invisible ANIM_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -30857,7 +30857,7 @@ FinishContinentalCrush: loadspritegfx ANIM_TAG_REALLY_BIG_ROCK delay 48 createsprite gContinentalCrushBigRockStompSpriteTemplate, ANIM_TARGET, 2, 0, 0x3c, 3, ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 7, RGB_BLACK delay 5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 @@ -30870,7 +30870,7 @@ FinishContinentalCrush: createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0x0000 @undo pal change on tgt + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 7, 0, RGB_BLACK @undo pal change on tgt delay 16 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -30932,7 +30932,7 @@ gBattleAnimMove_SavageSpinOut:: waitforvisualfinish monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK createsprite gSavageSpinOutGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 delay 25 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER @@ -30941,7 +30941,7 @@ gBattleAnimMove_SavageSpinOut:: delay 15 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 4, 0, RGB_BLACK clearmonbg ANIM_ATTACKER createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish @@ -31114,11 +31114,11 @@ gBattleAnimMove_NeverEndingNightmare:: call NeverendingNightmareHands call NeverendingNightmareHands delay 10 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 6, 16) @ fade to purple playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET loadspritegfx ANIM_TAG_EXPLOSION_2 unloadspritegfx ANIM_TAG_THIN_RING - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_VERTICAL_HEX, 0x2, 0xA, 0xA, 0x580A @;Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_VERTICAL_HEX, 2, 10, 10, RGB(10, 0, 22) @;Purple call NeverendingNightmareGeyser playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_TARGET createsprite gNeverEndingNightmareBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x0, 0x18, 0x0, 0x0, 0x0 @@ -31153,7 +31153,7 @@ gBattleAnimMove_NeverEndingNightmare:: createsprite gNeverEndingNightmareBlastBurnSpriteTemplate, ANIM_ATTACKER, 2, 0xffc4, 0x1e, 0x18, 0x0, 0x0, 0x0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET call NeverendingNightmareGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x10, 0x0, 0x40c0 @ fade to normal + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 6, 16) @ fade to normal waitforvisualfinish restorebg waitbgfadeout @@ -31269,8 +31269,8 @@ gBattleAnimMove_CorkscrewCrash:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0x6318 @fade atker to gray - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SPIKES, 0x0, 0xC, 0xC, 0x6318 @;Gray + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, RGB(24, 24, 24) @fade atker to gray + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPIKES, 0, 12, 12, RGB(24, 24, 24) @;Gray playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 79, 1 createsprite gCorkscrewCrashChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @@ -31281,7 +31281,7 @@ gBattleAnimMove_CorkscrewCrash:: call CorkscrewCrashMetalFlare waitforvisualfinish clearmonbg ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0x6318 @fade atker back + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, RGB(24, 24, 24) @fade atker back waitforvisualfinish stopsound invisible ANIM_ATTACKER @@ -31349,7 +31349,7 @@ FinishCorkscrewCrash: call CorkscrewCrashSprayRocks delay 6 call CorkscrewCrashSprayRocks - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE waitforvisualfinish delay 16 call ResetFromWhiteScreen @@ -31389,7 +31389,7 @@ CorkscrewCrashSprayRocks: gBattleAnimMove_InfernoOverdrive:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge loadspritegfx ANIM_TAG_SMALL_EMBER @fire - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xA, 0xA, 0x1F + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 10, 10, RGB_RED createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish fadetobg BG_INFERNO_OVERDRIVE @@ -31432,7 +31432,7 @@ FinishInfernoOverdrive: call InfernoOverdriveExplosion delay 6 call InfernoOverdriveExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ red bg pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB(27, 0, 0) @ red bg pal delay 6 call InfernoOverdriveExplosion waitforvisualfinish @@ -31547,7 +31547,7 @@ gBattleAnimMove_HydroVortex:: delay 16 createsprite gHydroVortexImpactSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x10, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 13, 23) loadspritegfx ANIM_TAG_GUST createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 60 call HydroVortexWhirlpoolHurricane @@ -31555,7 +31555,7 @@ gBattleAnimMove_HydroVortex:: call HydroVortexWhirlpoolHurricane call HydroVortexWhirlpoolHurricane waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x10, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 13, 23) waitforvisualfinish restorebg waitbgfadeout @@ -31620,7 +31620,7 @@ gBattleAnimMove_BloomDoom:: createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 0x9, 0x3 createsprite gBloomDoomGreenChargeSpriteTemplate, ANIM_ATTACKER, 2, 0x0 delay 60 @@ -31643,7 +31643,7 @@ gBattleAnimMove_BloomDoom:: createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x4, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 4, 0, RGB_BLACK waitforvisualfinish unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT call BloomDoomHurricane @@ -31686,7 +31686,7 @@ gBattleAnimMove_BloomDoom:: call BloomDoomHyperBeam call BloomDoomHyperBeam createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 114, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0xb, 0x33ed + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(13, 31, 12) call BloomDoomHyperBeam call BloomDoomHyperBeam call BloomDoomHyperBeam @@ -31715,14 +31715,14 @@ gBattleAnimMove_BloomDoom:: createsprite gAromatherapySmallFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x80, 0xc, 0x0, 0x3, 0x3, 0x0, 0x0 createsprite gAromatherapyBigFlowerSpriteTemplate, ANIM_ATTACKER, 0, 0x5a, 0x10, 0x0, 0x2, 0x1, 0x0, 0x0 delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0xb, 0x0, 0x33ed + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(13, 31, 12) loadspritegfx ANIM_TAG_EXPLOSION @explosion call BloomDoomPetalBlast - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x10, 0x33ed + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 16, RGB(13, 31, 12) call BloomDoomPetalBlast createvisualtask AnimTask_IsTargetPartner, 0x5 jumpargeq 0x0 0x1 BloomDoomFadeScreenTargetPartner - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x1, 0x0, 0x10, 0x33ed @ green bg pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 1, 0, 16, RGB(13, 31, 12) @ green bg pal BloomDoomEnding: call BloomDoomPetalBlast waitforvisualfinish @@ -31730,7 +31730,7 @@ BloomDoomEnding: call ResetFromGreenScreen end BloomDoomFadeScreenTargetPartner: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x1, 0x0, 0x10, 0x33ed @ green bg pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 1, 0, 16, RGB(13, 31, 12) @ green bg pal goto BloomDoomEnding BloomDoomHurricane: createsprite gBloomDoomHurricaneSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0 @@ -31791,7 +31791,7 @@ BloomDoomPetalBlast: ResetFromGreenScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x33ED @Everything from green + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB(13, 31, 12) @Everything from green restorebg waitbgfadeout setarg 0x7 0xffff @@ -31799,7 +31799,7 @@ ResetFromGreenScreen: waitbgfadein waitforvisualfinish delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x0, 0x33ED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 0, RGB(13, 31, 12) waitforvisualfinish return @@ -31814,7 +31814,7 @@ gBattleAnimMove_GigavoltHavoc:: loadspritegfx ANIM_TAG_THIN_RING createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x6, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 6, 0, 16, RGB_BLACK playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gGigavoltHavocChargingSpearSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 @@ -31915,7 +31915,7 @@ gBattleAnimMove_GigavoltHavoc:: unloadspritegfx ANIM_TAG_HAVOC_SPEAR loadspritegfx ANIM_TAG_SHOCK_3 @thunderbolt createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 0x2c, 0x0, 0x0, 0x3 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0xc, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 12, RGB(31, 31, 22) @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x0, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x20, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -31949,9 +31949,9 @@ gBattleAnimMove_GigavoltHavoc:: @ call HavocSpearSparkTarget call HavocSpearGeyser playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0xc, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 12, 0, RGB(31, 31, 22) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x0, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xa waitforvisualfinish @@ -31987,7 +31987,7 @@ gBattleAnimMove_ShatteredPsyche:: loadspritegfx ANIM_TAG_TORN_METAL @brick break shatter createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x0, 0x10, 0x0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_SetAllNonAttackersInvisiblity, 0x5, 0x1 waitforvisualfinish @@ -32017,7 +32017,7 @@ gBattleAnimMove_ShatteredPsyche:: delay 4 fadetobg BG_SHATTERED_PSYCHE delay 4 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, ANIM_ATTACKER, 0, 16, 0, RGB_BLACK delay 7 playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 15, 1 @@ -32143,7 +32143,7 @@ gBattleAnimMove_SubzeroSlammer:: loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice loadspritegfx ANIM_TAG_ICE_CUBE @glacier loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xC, 0xC, 0x6A23 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB(3, 17, 26) createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish fadetobg BG_ICE @@ -32158,7 +32158,7 @@ SubzeroSlammerOnPlayer: SubzeroSlammerFinish: waitbgfadein monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x0, 0xb, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 0, 11, RGB(0, 20, 31) createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x0 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER delay 2 @@ -32180,7 +32180,7 @@ SubzeroSlammerFinish: createsprite gSubzeroSlammerIceSpinSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER delay 32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, RGB(0, 20, 31) delay 32 createvisualtask AnimTask_FrozenIceCubeAttacker, 0x2 waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 0x11 @@ -32199,7 +32199,7 @@ SubzeroSlammerFinish: call IceBeamCreateCrystals call IceBeamCreateCrystals call IceBeamCreateCrystals - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x7, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 7, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 call IceBeamCreateCrystals call IceBeamCreateCrystals @@ -32230,7 +32230,7 @@ SubzeroSlammerFinish: call SubzeroSlammerExplosion call SubzeroSlammerExplosion clearmonbg ANIM_DEF_PARTNER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x5, 0x7, 0x0, 0x7e80 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish restorebg waitbgfadeout @@ -32355,26 +32355,26 @@ DevastatingDrakeFinish: delay 16 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER loadspritegfx ANIM_TAG_EXPLOSION - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION, 0x0, 0xC, 0xC, 0x502B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(11, 1, 20) createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 53 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x40c0 @ fade to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB(0, 6, 16) @ fade to purple call DevastatingDrakeExplosion delay 6 createvisualtask AnimTask_IsTargetPartner, 0x5 jumpargeq 0x0 0x1 DevastatingDrakeFadeTargetPartner - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x6, 0x0, 0x10, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 6, 0, 16, RGB(0, 6, 16) call DevastatingDrakeExplosion waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x0, 0x10, 0x0, 0x40c0 @ fade all but target back + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0, 16, 0, RGB(0, 6, 16) @ fade all but target back DevastatingDrakeUniversalEnding: loadspritegfx ANIM_TAG_FIRE_PLUME loadspritegfx ANIM_TAG_VERTICAL_HEX loadspritegfx ANIM_TAG_EXPLOSION_2 @explosion unloadspritegfx ANIM_TAG_PURPLE_DRAKE - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_FIRE_PLUME, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_VERTICAL_HEX, 0x0, 0xC, 0xC, 0x502B - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_EXPLOSION_2, 0x0, 0xC, 0xC, 0x502B + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB(11, 1, 20) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_VERTICAL_HEX, 0, 12, 12, RGB(11, 1, 20) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB(11, 1, 20) createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 32 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER call DevastatingDrakeGeyser @@ -32413,19 +32413,19 @@ DevastatingDrakeUniversalEnding: call DevastatingDrakeGeyser delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x10, 0x0, 0x40c0 @ fade from purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 16, 0, RGB(0, 6, 16) @ fade from purple waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x0 @ reset all colours + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, 0 @ reset all colours waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish end DevastatingDrakeFadeTargetPartner: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x6, 0x0, 0x10, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 6, 0, 16, RGB(0, 6, 16) call DevastatingDrakeExplosion waitforvisualfinish playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0x0, 0x10, 0x0, 0x40c0 @ fade all but target back + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_ATK_PARTNER), 0, 16, 0, RGB(0, 6, 16) @ fade all but target back goto DevastatingDrakeUniversalEnding DevastatingDrakeBuffEffect: createsprite gDevastatingDrakePurpleEnergySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x1a, 0x2 @@ -32547,7 +32547,7 @@ gBattleAnimMove_BlackHoleEclipse:: delay 8 waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x07, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 7, RGB_BLACK loadspritegfx ANIM_TAG_WISP_ORB @will o wisp invisible ANIM_ATTACKER loopsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x10, 0x5 @@ -32610,7 +32610,7 @@ gBattleAnimMove_BlackHoleEclipse:: unloadspritegfx ANIM_TAG_FOCUS_ENERGY loadspritegfx ANIM_TAG_EXPLOSION_2 call BlackHoleEclipseExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x7fff @ bg to white pal + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB_WHITE @ bg to white pal call BlackHoleEclipseExplosion waitforvisualfinish delay 24 @@ -32641,7 +32641,7 @@ BlackHoleEclipseExplosion: ResetFromWhiteScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x7FFF @everything from white + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB_WHITE @everything from white restorebg waitbgfadeout setarg 0x7 0xffff @@ -32649,7 +32649,7 @@ ResetFromWhiteScreen: waitbgfadein waitforvisualfinish delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB_WHITE waitforvisualfinish return @@ -32960,10 +32960,10 @@ CatastropikaFinish: call CatastropikaThundering call CatastropikaThundering call CatastropikaThundering - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff @ bg to white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE @ bg to white call CatastropikaThundering waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x10, 0x0, 0x7fff @ bg to white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 16, 0, RGB_WHITE @ bg to white createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @fix tgt position waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -32971,17 +32971,17 @@ CatastropikaFinish: end CatastropikaThundering: playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xfff0 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -16 delay 2 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x10 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 2 return @@ -33039,13 +33039,13 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x14, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER @ charge - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffdc + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -36 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xffec + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, -20 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0x40, 0xc + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 64, 12 delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -33054,12 +33054,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x18, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffdc + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -36 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xffec + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, -20 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffc0, 0xc + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -64, 12 delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -33068,12 +33068,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1c, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 20 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffdc + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -36 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xffec + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, -20 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xff90, 0xc + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -112, 12 delay 20 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, 0x0, 0x28, 0x0, 0x3 @@ -33082,12 +33082,12 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x20, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x3 delay 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 @thunder flash - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffdc + createvisualtask AnimTask_InvertScreenColor, 2, 0x101, 0x101, 0x101 @thunder flash + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -36 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xffec + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, -20 delay 1 - createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0xffd0, 0xc + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, -48, 12 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2a, 0x2c, 0x0, 0x28, 0x0, 0x3 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2a, 0x2c, 0x40, 0x28, 0x1, 0x3 @@ -33104,11 +33104,11 @@ gBattleAnimMove_10000000VoltThunderbolt:: loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER, 0x5, 0xA createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 -@ createvisualtask AnimTask_FlashAnimTagWithColor, 0x2, ANIM_TAG_ORBS, 0x1, 0xc, 0x1f, 0x10, 0x0, 0x0 +@ createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call TenMillionVoltThunderboltBeamRed call TenMillionVoltThunderboltBeamBlue createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 9, RGB(30, 31, 1) call TenMillionVoltThunderboltBeamPink call TenMillionVoltThunderboltBeamYellow call TenMillionVoltThunderboltBeamGreen @@ -33167,11 +33167,11 @@ gBattleAnimMove_10000000VoltThunderbolt:: @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x40, 0x28, 0x1, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x80, 0x28, 0x0, 0x8003 @ createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x00, 0x37, 0x2c, SOUND_PAN_ATTACKER, 0x28, 0x2, 0x8003 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE call TenMillionVoltThunderboltSparkGeyser waitforvisualfinish delay 16 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x10, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -33295,14 +33295,14 @@ StokedSparksurferFinish: createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 60, 1 call EndureEffect delay 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x5, 0x0, 0x10, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 5, 0, 16, RGB(31, 31, 22) call EndureEffect delay 8 call EndureEffect delay 2 loadspritegfx ANIM_TAG_SPARK loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0x10, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 16, 0, RGB(31, 31, 22) createsprite gVoltTackleOrbSlideSpriteTemplate, ANIM_ATTACKER, 1 playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER waitforvisualfinish @@ -33334,7 +33334,7 @@ StokedSparksurferFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x80, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x00, 0x30, 0x2c, 0xc0, 0x28, 0x2, 0x8003 call StokedSparksurferSparkGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_TARGET | F_PAL_ATTACKER), 0x2, 0x0, 0x10, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_ATTACKER), 2, 0, 16, RGB(31, 31, 22) createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x40, 0x28, 0x1, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x37, 0x2c, 0x80, 0x28, 0x0, 0x8003 @@ -33348,7 +33348,7 @@ StokedSparksurferFinish: createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff0, 0xfff0 delay 4 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_TARGET | F_PAL_ATTACKER), 0x2, 0x10, 0x0, 0x5bff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_TARGET | F_PAL_ATTACKER), 2, 16, 0, RGB(31, 31, 22) restorebg delay 24 createvisualtask AnimTask_AllBattlersVisible, 0xA @@ -33387,10 +33387,10 @@ StokedSparksurferSparkGeyser: gBattleAnimMove_ExtremeEvoboost:: loadspritegfx ANIM_TAG_LEER @leer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersInvisible, 0xA - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 3, 0, 0, 0 @Remove fading on everyone + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 3, 0, 0, 0 @Remove fading on everyone waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gLeerSpriteTemplate, ANIM_ATTACKER, 2, 0x18, 0xfff4 @@ -33435,7 +33435,7 @@ gBattleAnimMove_ExtremeEvoboost:: loadspritegfx ANIM_TAG_WATER_ORB @blue loadspritegfx ANIM_TAG_POISON_BUBBLE @purple loadspritegfx ANIM_TAG_LEAF @green - createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0x10, 0x10, 0x5bff + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 16, 16, RGB(31, 31, 22) waitforvisualfinish playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER createsprite gExtremeEvoboostRedChargeUpSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x510, 0x1e, 0xd, 0x32, ANIM_ATTACKER @@ -33465,7 +33465,7 @@ gBattleAnimMove_ExtremeEvoboost:: waitforvisualfinish playsewithpan SE_SHINY, SOUND_PAN_ATTACKER delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x0, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 0, 0, 16, RGB_WHITE delay 24 call ResetFromWhiteScreen end @@ -33576,7 +33576,7 @@ PulverizingPancakeFinish: call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0xb, 0x0000 @ target darkens + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB_BLACK @ target darkens call PulverizingPancakeSlowBackground @0 call PulverizingPancakeSlowBackground call PulverizingPancakeSlowBackground @@ -33599,7 +33599,7 @@ PulverizingPancakeFinish: delay 5 loadspritegfx ANIM_TAG_EXPLOSION @explosion call PulverizingPancakeExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff @ everything goes white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE @ everything goes white call PulverizingPancakeExplosion waitforvisualfinish call ResetFromWhiteScreen @@ -33650,14 +33650,14 @@ gBattleAnimMove_GenesisSupernova:: jumpargeq 0x7 ANIM_TARGET GenesisSupernovaOnPlayer GenesisSupernovaOnOpponent: call GenesisSupernovaBuffEffectPlayer_1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffEffectPlayer_2 call GenesisSupernovaBuffEffectPlayer_1 goto GenesisSupernovaFinish GenesisSupernovaOnPlayer: call GenesisSupernovaBuffOpponent_1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0x0, 0xb, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 0, 11, (RGB(28, 3, 22) | RGB_ALPHA) createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 112, 1 call GenesisSupernovaBuffOpponent_2 call GenesisSupernovaBuffOpponent_1 @@ -33683,20 +33683,20 @@ GenesisSupernovaFinish: loadspritegfx ANIM_TAG_METEOR @superpower loadspritegfx ANIM_TAG_SPARKLE_2 @sparkles createsprite gGenesisSupernovaSuperpowerSpriteTemplate, ANIM_TARGET, 3, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x0, 0xb, 0x0, 0xd87c + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 0, 11, 0, (RGB(28, 3, 22) | RGB_ALPHA) playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0x0, 0xc, 0x7fff + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_SPARKLE_2, 0, 0, 12, RGB_WHITE delay 8 invisible ANIM_TARGET loadspritegfx ANIM_TAG_EXPLOSION @explosion unloadspritegfx ANIM_TAG_METEOR @superpower call GenesisSupernovaBubbleExplosion call GenesisSupernovaBubbleExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_WHITE call GenesisSupernovaBubbleExplosion waitforvisualfinish delay 16 - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_SPARKLE_2, 0x0, 0xc, 0x0, 0x7fff + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_SPARKLE_2, 0, 12, 0, RGB_WHITE clearmonbg ANIM_ATTACKER blendoff delay 0 @@ -33835,7 +33835,7 @@ gBattleAnimMove_SinisterArrowRaid:: createsprite gArrowRaidFlyUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 waitforvisualfinish unloadspritegfx ANIM_TAG_ROUND_SHADOW - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x10, 0x388C @ bg to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB(12, 4, 14) @ bg to purple waitforvisualfinish visible ANIM_ATTACKER playsewithpan SE_M_WHIRLPOOL, SOUND_PAN_TARGET @@ -33902,7 +33902,7 @@ SinisterArrowRaidOnOpponent: waitforvisualfinish call SinisterArrowRaidFlyStrike createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(0, 6, 16) @ defender to purple call SinisterArrowRaidStrikeOpponent call SinisterArrowRaidOpponentExplosion playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -33954,7 +33954,7 @@ SinisterArrowRaidOnPlayer: waitforvisualfinish call SinisterArrowRaidFlyStrike createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 3, 75 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0x10, 0x40c0 @ defender to purple + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 0, 16, RGB(0, 6, 16) @ defender to purple call SinisterArrowRaidArrowsStrikePlayer call SinisterArrowRaidPlayerExplosion playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER @@ -33962,9 +33962,9 @@ SinisterArrowRaidOnPlayer: call SinisterArrowRaidFinalExplosion @ finish SinisterArrowRaidFinish: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x10, 0x0, 0x40c0 @ return tgt to normal + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 4, 16, 0, RGB(0, 6, 16) @ return tgt to normal waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x10, 0x00, 0x388C @ bg to nrml + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 16, 0, RGB(12, 4, 14) @ bg to nrml delay 5 createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -34165,7 +34165,7 @@ gBattleAnimMove_MaliciousMoonsault:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gMaliciousMoonsaultRedFlySpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0xd, 0x150 call MaliciousMoonsaultFireSpin - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x5, 0x0, 0xa, 0x0000 @ target darkens + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 5, 0, 10, RGB_BLACK @ target darkens delay 26 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gMaliciousMoonsaultRedBounceSpriteTemplate, ANIM_TARGET, 3 @@ -34175,7 +34175,7 @@ gBattleAnimMove_MaliciousMoonsault:: call MaliciousMoonsaultExplosion delay 6 call MaliciousMoonsaultExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x0, 0x10, 0x001b @ fade all to red + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB(27, 0, 0) @ fade all to red delay 6 call MaliciousMoonsaultExplosion createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -34277,7 +34277,7 @@ gBattleAnimMove_OceanicOperetta:: waitforvisualfinish createvisualtask AnimTask_RemoveSpotlight, 0x2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x6, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 6, RGB(0, 13, 23) loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_THIN_RING invisible ANIM_ATTACKER @@ -34392,16 +34392,16 @@ gBattleAnimMove_OceanicOperetta:: loadspritegfx ANIM_TAG_RAIN_DROPS @rain createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 64 call OceanicOperettaExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x2, 0x0, 0xb, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 2, 0, 11, RGB(0, 13, 23) createvisualtask AnimTask_CreateRaindrops, 0x2, 0x0, 0x3, 0x78 call OceanicOperettaExplosion call OceanicOperettaExplosion playsewithpan SE_M_RAIN_DANCE, SOUND_PAN_ATTACKER createvisualtask AnimTask_CreateRaindrops, 0x2, 0x0, 0x3, 0x78 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x2, 0xb, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 2, 11, 0, RGB(0, 13, 23) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x6, 0x0, 0x5da0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 6, 0, RGB(0, 13, 23) waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -34499,10 +34499,10 @@ SplinteredStormshardsByPlayer: call SplinteredStormshardsExplosionOpponent call SplinteredStormshardsExplosionOpponent SplinteredStormshardsEnd: - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE call SplinteredStormshardsBrownExplode waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x10, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish @@ -34735,14 +34735,14 @@ gBattleAnimMove_LetsSnuggleForever:: delay 8 call LetsSnuggleForeverTears waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_BLACK waitforvisualfinish loadspritegfx ANIM_TAG_SPARKLE_4 @detect playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xa, 0xfff2 createsprite gSnuggleForeverEyesSpriteTemplate, ANIM_ATTACKER, 13, 0xfff6, 0xfff2 delay 32 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0x0, 0x10, 0x579D + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 1, 0, 16, RGB(29, 28, 21) createvisualtask AnimTask_GrowTarget, 0x5 delay 5 loadspritegfx ANIM_TAG_IMPACT @hit @@ -34769,7 +34769,7 @@ gBattleAnimMove_LetsSnuggleForever:: call LetsSnuggleForeverImpacts call LetsSnuggleForeverStars_1 delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 2, 0, 16, RGB_WHITE playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET call LetsSnuggleForeverStars_2 delay 0 @@ -34852,7 +34852,7 @@ gBattleAnimMove_ClangorousSoulblaze:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x20, 0x1, 0xffff delay 12 setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x0, 0x4, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 4, RGB_BLACK loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge visible ANIM_ATTACKER monbg ANIM_ATTACKER @@ -34940,7 +34940,7 @@ ClangorousSoulblazeOnPlayer: createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x60, 0xffe0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0x65, 0xfff0, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 @@ -35011,7 +35011,7 @@ ClangorousSoulblazeOnOpponent: createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x60, 0x45, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_2 delay 5 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB_WHITE playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_TARGET, 3, 0x65, 0x35, ANIM_ATTACKER, 0x1 call ClangorousSoulblazePulse_3 @@ -35128,7 +35128,7 @@ gBattleAnimMove_GuardianOfAlola:: delay 10 delay 16 call GuardianOfAlolaRocksPlayer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_ATTACKER, 0x2, 0xC, 0xC, 0x277f @;Yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_ATTACKER, 2, 12, 12, RGB(31, 27, 9) @;Yellow createvisualtask AnimTask_NightShadeClone, 0x5, 0x75 delay 16 call GuardianOfAlolaRocksPlayer @@ -35137,9 +35137,9 @@ gBattleAnimMove_GuardianOfAlola:: delay 16 loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST call GuardianOfAlolaRocksPlayer - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x3, 0x0, 0xb, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 3, 0, 11, RGB_BLACK delay 1 - createvisualtask AnimTask_BlendParticle, 0x2, ANIM_TAG_HORSESHOE_SIDE_FIST, 0x0, 0xC, 0xc, 0x277f + createvisualtask AnimTask_BlendParticle, 2, ANIM_TAG_HORSESHOE_SIDE_FIST, 0, 12, 12, RGB(31, 27, 9) fadetobg BG_FISSURE waitbgfadeout call GuardianOfAlolaRocksPlayer @@ -35148,7 +35148,7 @@ gBattleAnimMove_GuardianOfAlola:: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gGuardianOfAlolaFistSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffd0, 0x1f delay 36 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0xb, 0x0, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 11, 0, RGB_BLACK playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 0x25 loopsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET 0x10 0x9 @@ -35165,7 +35165,7 @@ gBattleAnimMove_GuardianOfAlola:: call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser call GuardianOfAlolaRocksTarget - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x3, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 0, 16, RGB_WHITE call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser call GuardianOfAlolaRockGeyser @@ -35204,7 +35204,7 @@ gBattleAnimMove_SearingSunrazeSmash:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x001b + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB(27, 0, 0) playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call SearingSunrazeSmashFlare delay 8 @@ -35269,7 +35269,7 @@ gBattleAnimMove_SearingSunrazeSmash:: loadspritegfx ANIM_TAG_ROUND_SHADOW @fly playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET createsprite gSearingSunrazeSmashRedFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x3, 0x0, 0xF, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 0, 15, RGB_BLACK waitforvisualfinish playsewithpan SE_ORB, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly @@ -35323,10 +35323,10 @@ SearingSunrazeSmashImpact: createsprite gSearingSunrazeSmashCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 playsewithpan SE_M_LEER, SOUND_PAN_TARGET visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ATTACKER), 0x3, 0xF, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ATTACKER), 3, 15, 0, RGB_BLACK visible ANIM_ATTACKER playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 16, RGB_BLACK createsprite gSearingSunrazeSmashShockwaveSpriteTemplate, ANIM_TARGET, 2 @ charge out and in delay 28 invisible ANIM_TARGET @@ -35336,7 +35336,7 @@ SearingSunrazeSmashImpact: call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x4, 0x0, 0x10, 0x001b @full red + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 4, 0, 16, RGB(27, 0, 0) @full red call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno call SearingSunrazeSmashInferno @@ -35416,13 +35416,13 @@ SearingSunrazeSmashCharge: ResetFromRedScreen: createvisualtask AnimTask_AllBattlersInvisible, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x1B @Everything from red + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB(27, 0, 0) @Everything from red restorebg waitbgfadeout setarg 0x7 0xffff createvisualtask AnimTask_AllBattlersVisible, 0xA waitbgfadein - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0x0, 0x33ED + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 0, RGB(13, 31, 12) waitforvisualfinish return @@ -35436,7 +35436,7 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: invisible ANIM_TARGET createvisualtask AnimTask_AllBattlersInvisibleExceptAttackerAndTarget, 0xA waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x0, 0xe, 0x40c0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 0, 14, RGB(0, 6, 16) playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER call MenacingMoonrazeMaelstromFlare delay 8 @@ -35511,7 +35511,7 @@ MenacingMoonrazeMaelstromFinish: call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 60, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, F_PAL_TARGET, 0x4, 0x0, 0xc, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 2, F_PAL_TARGET, 4, 0, 12, RGB_BLACK call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam call MenacingMoonrazeMaelstromBeam @@ -35546,7 +35546,7 @@ MenacingMoonrazeMaelstromFinish: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 76, 1 call MenacingMoonrazeMaelstromExplosion call MenacingMoonrazeMaelstromExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x0, 0x10, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 0, 16, RGB_WHITE call MenacingMoonrazeMaelstromExplosion waitforvisualfinish call ResetFromWhiteScreen @@ -35638,7 +35638,7 @@ gBattleAnimMove_LightThatBurnsTheSky:: unloadspritegfx ANIM_TAG_FOCUS_ENERGY monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ADJACENT), 2, 0, 15, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker delay 30 @@ -35654,7 +35654,7 @@ gBattleAnimMove_LightThatBurnsTheSky:: call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks delay 14 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x4, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 4, RGB_BLACK clearmonbg ANIM_ATTACKER blendoff playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER @@ -35681,19 +35681,19 @@ gBattleAnimMove_LightThatBurnsTheSky:: loadspritegfx ANIM_TAG_STRAIGHT_BEAM panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 monbg ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x6, 0x0, 0x10, 0x43FF @;Light yellow + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 6, 0, 16, RGB(31, 31, 16) @;Light yellow call PhotonGeyserBeam call LightThatBurnsTheSkyGeyser call LightThatBurnsTheSkyBlast_1 call LightThatBurnsTheSkyGeyser call LightThatBurnsTheSkyBlast_2 call LightThatBurnsTheSkyGeyser - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x4, 0x0, 0x10, 0x43FF + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 4, 0, 16, RGB(31, 31, 16) call LightThatBurnsTheSkyBlast_3 clearmonbg ANIM_TARGET waitforvisualfinish delay 16 - createvisualtask AnimTask_BlendBattleAnimPal, 0x2, (F_PAL_BG | F_PAL_BATTLERS_2), 0x0, 0x10, 0x0, 0x43FF + createvisualtask AnimTask_BlendBattleAnimPal, 2, (F_PAL_BG | F_PAL_BATTLERS_2), 0, 16, 0, RGB(31, 31, 16) restorebg waitbgfadeout end @@ -35866,7 +35866,7 @@ gBattleAnimMove_SoulStealing7StarStrike:: setarg 0x7 0x0 @;Clear arg 7 so task works properly in Link battles createvisualtask AnimTask_SnatchOpposingMonMove, 0x2 delay 28 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x0, 0x0, 0x10, 0x0000 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0, 0, 16, RGB_BLACK delay 1 createsprite gSoulStealZStarSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -35890,14 +35890,14 @@ gBattleAnimMove_SoulStealing7StarStrike:: createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 8, 32 call SoulStealingSevenStarStrikeExplosion call SoulStealingSevenStarStrikeExplosion - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 0x2, 0x0, 0x10, 0x0 @everything to black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_ALL_BUT_DEF), 2, 0, 16, RGB_BLACK @everything to black call SoulStealingSevenStarStrikeExplosion waitforvisualfinish blendoff restorebg - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x2, 0x10, 0x0, 0x0 @everything from black + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 2, 16, 0, RGB_BLACK @everything from black waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BATTLERS_2, 0x2, 0x0, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BATTLERS_2, 2, 0, 0, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_AllBattlersVisible, 0xA waitforvisualfinish diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index 63500ab701..49386f0334 100644 --- a/src/battle_anim_fight.c +++ b/src/battle_anim_fight.c @@ -525,7 +525,7 @@ void AnimBasicFistOrFoot(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); - if (gBattleAnimArgs[3] == 0) + if (gBattleAnimArgs[3] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, TRUE); else InitSpritePosToAnimTarget(sprite, TRUE); diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 8df4c3a566..7a7d847d09 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -7976,7 +7976,7 @@ void SpriteCB_RandomCentredHits(struct Sprite *sprite) StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { if (IsDoubleBattle()) InitSpritePosToAnimAttackersCentre(sprite, FALSE); From 020be9d5b08a93ce191c691e3331ba1b7ef8458c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:32:28 +0200 Subject: [PATCH 036/248] Deprecate sStatusFlagsForMoveEffects (#7063) --- asm/macros/battle_script.inc | 6 +- data/battle_scripts_1.s | 12 +- src/battle_script_commands.c | 2327 +++++++++++++++++----------------- 3 files changed, 1163 insertions(+), 1182 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8ad9aa5911..258f8a331e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -116,12 +116,10 @@ .byte 0x17 .endm - .macro clearstatusfromeffect battler:req, moveEffect=0 - .if \moveEffect != 0 - setmoveeffect \moveEffect - .endif + .macro clearstatus2 battler:req, status2:req .byte 0x18 .byte \battler + .4byte \status2 .endm .macro tryfaintmon battler:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5725a05e3d..bd920dbc29 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -736,7 +736,7 @@ BattleScript_SkyDropChangedTarget: BattleScript_SkyDropFlyingConfuseLock: seteffectprimary MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: - clearstatusfromeffect BS_TARGET, MOVE_EFFECT_THRASH + clearstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd setbyte BS_ATTACKER, BS_TARGET goto BattleScript_ThrashConfuses @@ -3569,7 +3569,7 @@ BattleScript_EffectGeomancy:: BattleScript_GeomancySecondTurn: attackcanceler setbyte sB_ANIM_TURN, 1 - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS orword gHitMarker, HITMARKER_NO_PPDEDUCT attackstring jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim @@ -3641,7 +3641,7 @@ BattleScript_TwoTurnMovesSecondTurn:: BattleScript_TwoTurnMovesSecondTurnRet: setbyte sB_ANIM_TURN, 1 setbyte sB_ANIM_TARGETS_HIT, 0 - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS clearsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP return @@ -3681,7 +3681,7 @@ BattleScript_EffectRage:: seteffectprimary MOVE_EFFECT_RAGE goto BattleScript_HitFromAtkString BattleScript_RageMiss:: - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_RAGE + clearstatus2 BS_ATTACKER, STATUS2_RAGE goto BattleScript_PrintMoveMissed BattleScript_EffectMimic:: @@ -5827,7 +5827,7 @@ BattleScript_BideStoringEnergy:: BattleScript_BideAttack:: attackcanceler - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE @@ -5850,7 +5850,7 @@ BattleScript_BideAttack:: BattleScript_BideNoEnergyToAttack:: attackcanceler - clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING + clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_ButItFailed diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 08531ef5f2..5614a9e3e9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -369,7 +369,7 @@ static void Cmd_printselectionstringfromtable(void); static void Cmd_setadditionaleffects(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); -static void Cmd_clearstatusfromeffect(void); +static void Cmd_clearstatus2(void); static void Cmd_tryfaintmon(void); static void Cmd_dofaintanimation(void); static void Cmd_cleareffectsonfaint(void); @@ -628,7 +628,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setadditionaleffects, //0x15 Cmd_seteffectprimary, //0x16 Cmd_seteffectsecondary, //0x17 - Cmd_clearstatusfromeffect, //0x18 + Cmd_clearstatus2, //0x18 Cmd_tryfaintmon, //0x19 Cmd_dofaintanimation, //0x1A Cmd_cleareffectsonfaint, //0x1B @@ -879,41 +879,6 @@ const struct StatFractions gAccuracyStageRatios[] = { 3, 1}, // +6 }; -static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] = -{ - [MOVE_EFFECT_SLEEP] = STATUS1_SLEEP, - [MOVE_EFFECT_POISON] = STATUS1_POISON, - [MOVE_EFFECT_BURN] = STATUS1_BURN, - [MOVE_EFFECT_FREEZE] = STATUS1_FREEZE, - [MOVE_EFFECT_PARALYSIS] = STATUS1_PARALYSIS, - [MOVE_EFFECT_TOXIC] = STATUS1_TOXIC_POISON, - [MOVE_EFFECT_FROSTBITE] = STATUS1_FROSTBITE, - [MOVE_EFFECT_CONFUSION] = STATUS2_CONFUSION, - [MOVE_EFFECT_FLINCH] = STATUS2_FLINCHED, - [MOVE_EFFECT_UPROAR] = STATUS2_UPROAR, - [MOVE_EFFECT_CHARGING] = STATUS2_MULTIPLETURNS, - [MOVE_EFFECT_WRAP] = STATUS2_WRAPPED, - [MOVE_EFFECT_RECHARGE] = STATUS2_RECHARGE, - [MOVE_EFFECT_PREVENT_ESCAPE] = STATUS2_ESCAPE_PREVENTION, - [MOVE_EFFECT_NIGHTMARE] = STATUS2_NIGHTMARE, - [MOVE_EFFECT_THRASH] = STATUS2_LOCK_CONFUSE, -}; - -static const u8 *const sMoveEffectBS_Ptrs[] = -{ - [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison, - [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn, - [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze, - [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis, - [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic, - [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion, - [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, - [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, - [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, - [MOVE_EFFECT_FROSTBITE] = BattleScript_MoveEffectFrostbite, -}; - static const struct WindowTemplate sUnusedWinTemplate = { .bg = 0, @@ -3194,21 +3159,43 @@ void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) BattleScriptPush(gBattlescriptCurrInstr + 1); - if (sStatusFlagsForMoveEffects[effect] == STATUS1_SLEEP) + switch (effect) { + case MOVE_EFFECT_SLEEP: if (B_SLEEP_TURNS >= GEN_5) gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 1, 3)); else gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 2, 5)); - TryActivateSleepClause(effectBattler, gBattlerPartyIndexes[effectBattler]); + gBattlescriptCurrInstr = BattleScript_MoveEffectSleep; + break; + case MOVE_EFFECT_POISON: + gBattleMons[effectBattler].status1 |= STATUS1_POISON; + gBattlescriptCurrInstr = BattleScript_MoveEffectPoison; + break; + case MOVE_EFFECT_BURN: + gBattleMons[effectBattler].status1 |= STATUS1_BURN; + gBattlescriptCurrInstr = BattleScript_MoveEffectBurn; + break; + case MOVE_EFFECT_FREEZE: + gBattleMons[effectBattler].status1 |= STATUS1_FREEZE; + gBattlescriptCurrInstr = BattleScript_MoveEffectFreeze; + break; + case MOVE_EFFECT_PARALYSIS: + gBattleMons[effectBattler].status1 |= STATUS1_PARALYSIS; + gBattlescriptCurrInstr = BattleScript_MoveEffectParalysis; + break; + case MOVE_EFFECT_TOXIC: + gBattleMons[effectBattler].status1 |= STATUS1_TOXIC_POISON; + gBattlescriptCurrInstr = BattleScript_MoveEffectToxic; + break; + case MOVE_EFFECT_FROSTBITE: + gBattleMons[effectBattler].status1 |= STATUS1_FROSTBITE; + gBattlescriptCurrInstr = BattleScript_MoveEffectFrostbite; + break; + default: + break; } - else - { - gBattleMons[effectBattler].status1 |= sStatusFlagsForMoveEffects[effect]; - } - - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[effect]; BtlController_EmitSetMonData(effectBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[effectBattler].status1), &gBattleMons[effectBattler].status1); MarkBattlerForControllerExec(effectBattler); @@ -3341,1134 +3328,1135 @@ void SetMoveEffect(bool32 primary, bool32 certain) } return; } - else + + switch (gBattleScripting.moveEffect) { - if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]) + case MOVE_EFFECT_CONFUSION: + if (!CanBeConfused(gEffectBattler) || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION) { gBattlescriptCurrInstr++; } else { - switch (gBattleScripting.moveEffect) + gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns + + // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. + // Otherwise, do normal confusion script. + if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) { - case MOVE_EFFECT_CONFUSION: - if (!CanBeConfused(gEffectBattler)) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns - - // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. - // Otherwise, do normal confusion script. - if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) - { - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); - gBattlerAttacker = gEffectBattler; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - } - else - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - } - } - break; - case MOVE_EFFECT_FLINCH: - if (battlerAbility == ABILITY_INNER_FOCUS) - { - // Inner Focus ALWAYS prevents flinching but only activates - // on a move that's supposed to flinch, like Fake Out - if (primary == TRUE || certain == TRUE) - { - gLastUsedAbility = ABILITY_INNER_FOCUS; - gBattlerAbility = gEffectBattler; - RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; - } - else - { - gBattlescriptCurrInstr++; - } - } - else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber - && !(GetActiveGimmick(gEffectBattler) == GIMMICK_DYNAMAX)) - { - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_UPROAR: - if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) - { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN(B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_PAYDAY: - // Don't scatter coins on the second hit of Parental Bond - if (IsOnPlayerSide(gBattlerAttacker) && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT) - { - u16 payday = gPaydayMoney; - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - - // For a move that hits multiple targets (i.e. Make it Rain) - // we only want to print the message on the final hit - if (!(NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; - } - else - gBattlescriptCurrInstr++; - } - else - { - gBattlescriptCurrInstr++; - } - break; - case MOVE_EFFECT_HAPPY_HOUR: - if (IsOnPlayerSide(gBattlerAttacker) && !gBattleStruct->moneyMultiplierMove) - { - gBattleStruct->moneyMultiplier *= 2; - gBattleStruct->moneyMultiplierMove = 1; - } - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_TRI_ATTACK: - if (gBattleMons[gEffectBattler].status1) - { - gBattlescriptCurrInstr++; - } - else - { - static const u8 sTriAttackEffects[] = - { - MOVE_EFFECT_BURN, - MOVE_EFFECT_FREEZE_OR_FROSTBITE, - MOVE_EFFECT_PARALYSIS - }; - gBattleScripting.moveEffect = RandomElement(RNG_TRI_ATTACK, sTriAttackEffects); - SetMoveEffect(primary, certain); - } - break; - case MOVE_EFFECT_CHARGING: - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gProtectStructs[gEffectBattler].chargingTurn = TRUE; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_WRAP: - if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; - else - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? (Random() % 2) + 4 : (Random() % 4) + 2; - - gBattleStruct->wrappedMove[gEffectBattler] = gCurrentMove; - gBattleStruct->wrappedBy[gEffectBattler] = gBattlerAttacker; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - - for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] < NUM_TRAPPING_MOVES; gBattleCommunication[MULTISTRING_CHOOSER]++) - { - if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) - break; - } - } - break; - case MOVE_EFFECT_ATK_PLUS_1: - case MOVE_EFFECT_DEF_PLUS_1: - case MOVE_EFFECT_SPD_PLUS_1: - case MOVE_EFFECT_SP_ATK_PLUS_1: - case MOVE_EFFECT_SP_DEF_PLUS_1: - case MOVE_EFFECT_ACC_PLUS_1: - case MOVE_EFFECT_EVS_PLUS_1: - if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case MOVE_EFFECT_ATK_MINUS_1: - case MOVE_EFFECT_DEF_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SP_ATK_MINUS_1: - case MOVE_EFFECT_SP_DEF_MINUS_1: - case MOVE_EFFECT_ACC_MINUS_1: - case MOVE_EFFECT_EVS_MINUS_1: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; - if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; - else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; - - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) - { - if (!mirrorArmorReflected) - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case MOVE_EFFECT_ATK_PLUS_2: - case MOVE_EFFECT_DEF_PLUS_2: - case MOVE_EFFECT_SPD_PLUS_2: - case MOVE_EFFECT_SP_ATK_PLUS_2: - case MOVE_EFFECT_SP_DEF_PLUS_2: - case MOVE_EFFECT_ACC_PLUS_2: - case MOVE_EFFECT_EVS_PLUS_2: - if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - break; - case MOVE_EFFECT_ATK_MINUS_2: - case MOVE_EFFECT_DEF_MINUS_2: - case MOVE_EFFECT_SPD_MINUS_2: - case MOVE_EFFECT_SP_ATK_MINUS_2: - case MOVE_EFFECT_SP_DEF_MINUS_2: - case MOVE_EFFECT_ACC_MINUS_2: - case MOVE_EFFECT_EVS_MINUS_2: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; - if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; - else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; - - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) - { - if (!mirrorArmorReflected) - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatDown; - } - break; - case MOVE_EFFECT_RECHARGE: - if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd - break; - - gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBattler].rechargeTimer = 2; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_RAGE: - gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_STEAL_ITEM: - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - || gBattleMons[gBattlerAttacker].item != ITEM_NONE - || gBattleMons[gBattlerTarget].item == ITEM_NONE) - { - gBattlescriptCurrInstr++; - } - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; - - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - - if (!(B_STEAL_WILD_ITEMS >= GEN_9 - && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) - { - gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; - } - break; - case MOVE_EFFECT_PREVENT_ESCAPE: - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_NIGHTMARE: - gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_ALL_STATS_UP: - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AllStatsUp; - } - break; - case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; - } - break; - case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefSpDefDown; - } - break; - case MOVE_EFFECT_RECOIL_HP_25: // Struggle - gBattleStruct->moveDamage[gEffectBattler] = (gBattleMons[gEffectBattler].maxHP) / 4; - if (gBattleStruct->moveDamage[gEffectBattler] == 0) - gBattleStruct->moveDamage[gEffectBattler] = 1; - if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) - gBattleStruct->moveDamage[gEffectBattler] *= 2; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; - break; - case MOVE_EFFECT_THRASH: - // Petal Dance doesn't lock mons that copy the move with Dancer - if (gSpecialStatuses[gEffectBattler].dancerUsedMove) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN(RandomUniform(RNG_RAMPAGE_TURNS, 2, 3)); - } - break; - case MOVE_EFFECT_CLEAR_SMOG: - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[gEffectBattler].statStages[i] != DEFAULT_STAT_STAGE) - break; - } - if ((gSpecialStatuses[gEffectBattler].physicalDmg || gSpecialStatuses[gEffectBattler].specialDmg) && i != NUM_BATTLE_STATS) - { - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[gEffectBattler].statStages[i] = DEFAULT_STAT_STAGE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; - } - break; - case MOVE_EFFECT_FLAME_BURST: - if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) - && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) - { - i = BATTLE_PARTNER(gBattlerTarget); - gBattleScripting.savedBattler = i; - gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; - if (gBattleStruct->moveDamage[i] == 0) - gBattleStruct->moveDamage[i] = 1; - gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; - } - break; - case MOVE_EFFECT_FEINT: - i = FALSE; // Remove Protect if any - if (gProtectStructs[gBattlerTarget].protected != PROTECT_NONE - && gProtectStructs[gBattlerTarget].protected != PROTECT_MAX_GUARD) - { - gProtectStructs[gBattlerTarget].protected = PROTECT_NONE; - i = TRUE; - } - if (GetProtectType(gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected) == PROTECT_TYPE_SIDE) - { - gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected = PROTECT_NONE; - i = TRUE; - } - if (i) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (gCurrentMove == MOVE_HYPERSPACE_FURY) - gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; - else - gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; - } - break; - case MOVE_EFFECT_V_CREATE: - if (!NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; - } - break; - case MOVE_EFFECT_CORE_ENFORCER: - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) - && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; - } - break; - case MOVE_EFFECT_THROAT_CHOP: - gDisableStructs[gEffectBattler].throatChopTimer = gBattleTurnCounter + 2; - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_INCINERATE: - if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) - || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS)) - { - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); - - BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; - } - break; - case MOVE_EFFECT_BUG_BITE: - if (GetItemPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES - && battlerAbility != ABILITY_STICKY_HOLD) - { - // target loses their berry - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); - - BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; - } - break; - case MOVE_EFFECT_TRAP_BOTH: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; - } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) - gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; - - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; - break; - case MOVE_EFFECT_REMOVE_ARG_TYPE: - { - u32 type = GetMoveArgType(gCurrentMove); - // This seems unnecessary but is done to make it work properly with Parental Bond - BattleScriptPush(gBattlescriptCurrInstr + 1); - switch (type) - { - case TYPE_FIRE: // Burn Up - gBattlescriptCurrInstr = BattleScript_RemoveFireType; - break; - case TYPE_ELECTRIC: // Double Shot - gBattlescriptCurrInstr = BattleScript_RemoveElectricType; - break; - default: - gBattlescriptCurrInstr = BattleScript_RemoveGenericType; - break; - } - RemoveBattlerType(gEffectBattler, type); - break; + gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattlerAttacker = gEffectBattler; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; } - case MOVE_EFFECT_ROUND: - TryUpdateRoundTurnOrder(); // If another Pokémon uses Round before the user this turn, the user will use Round directly after it - gBattlescriptCurrInstr++; - break; - case MOVE_EFFECT_DIRE_CLAW: - if (!gBattleMons[gEffectBattler].status1) - { - static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; - gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects); - SetMoveEffect(primary, certain); - } - break; - case MOVE_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StealthRockActivates; - } - break; - case MOVE_EFFECT_SPIKES: - if (gSideTimers[GetBattlerSide(gEffectBattler)].spikesAmount < 3) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; - BattleScriptPush(gBattlescriptCurrInstr + 1); - - if (gBattleStruct->isSkyBattle) - gBattlescriptCurrInstr++; - else - gBattlescriptCurrInstr = BattleScript_SpikesActivates; - } - break; - case MOVE_EFFECT_SYRUP_BOMB: - if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB)) - { - struct Pokemon *mon = GetBattlerMon(gBattlerAttacker); - - gStatuses4[gEffectBattler] |= STATUS4_SYRUP_BOMB; - gDisableStructs[gEffectBattler].syrupBombTimer = 3; - gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); - gBattleStruct->stickySyrupdBy[gEffectBattler] = gBattlerAttacker; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; - } - break; - case MOVE_EFFECT_SECRET_POWER: - if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - case STATUS_FIELD_MISTY_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; - break; - case STATUS_FIELD_GRASSY_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS_FIELD_ELECTRIC_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS_FIELD_PSYCHIC_TERRAIN: - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - default: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } - else - { - switch (gBattleEnvironment) - { - case BATTLE_ENVIRONMENT_GRASS: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); - break; - case BATTLE_ENVIRONMENT_UNDERWATER: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); - break; - case BATTLE_ENVIRONMENT_POND: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); - break; - case BATTLE_ENVIRONMENT_MOUNTAIN: - if (B_SECRET_POWER_EFFECT >= GEN_5) - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - else if (B_SECRET_POWER_EFFECT >= GEN_4) - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - else - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; - break; - case BATTLE_ENVIRONMENT_PUDDLE: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); - break; - case BATTLE_ENVIRONMENT_LONG_GRASS: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case BATTLE_ENVIRONMENT_SAND: - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - break; - case BATTLE_ENVIRONMENT_WATER: - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; - break; - case BATTLE_ENVIRONMENT_CAVE: - case BATTLE_ENVIRONMENT_BURIAL_GROUND: - case BATTLE_ENVIRONMENT_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - break; - case BATTLE_ENVIRONMENT_SOARING: - case BATTLE_ENVIRONMENT_SKY_PILLAR: - case BATTLE_ENVIRONMENT_MARSH: - case BATTLE_ENVIRONMENT_SWAMP: - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - case BATTLE_ENVIRONMENT_SNOW: - case BATTLE_ENVIRONMENT_ICE: - gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE; - break; - case BATTLE_ENVIRONMENT_VOLCANO: - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - break; - case BATTLE_ENVIRONMENT_ULTRA_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; - break; - default: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } - SetMoveEffect(primary, certain); - break; - case MOVE_EFFECT_PSYCHIC_NOISE: - battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); - - if (battlerAbility) - { - gBattlerAbility = battlerAbility - 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; - } - else if (!(gStatuses3[gEffectBattler] & STATUS3_HEAL_BLOCK)) - { - gStatuses3[gEffectBattler] |= STATUS3_HEAL_BLOCK; - gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; - } - break; - case MOVE_EFFECT_TERA_BLAST: - if (GetActiveGimmick(gEffectBattler) == GIMMICK_TERA - && GetBattlerTeraType(gEffectBattler) == TYPE_STELLAR - && !NoAliveMonsForEitherParty()) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_LowerAtkSpAtk; - } - break; - case MOVE_EFFECT_ORDER_UP: - { - u32 stat = 0; - bool32 commanderAffected = TRUE; - switch (gBattleStruct->commanderActive[gEffectBattler]) - { - case SPECIES_TATSUGIRI_CURLY: - stat = STAT_ATK; - break; - case SPECIES_TATSUGIRI_DROOPY: - stat = STAT_DEF; - break; - case SPECIES_TATSUGIRI_STRETCHY: - stat = STAT_SPEED; - break; - default: - commanderAffected = FALSE; - break; - } - if (!commanderAffected - || NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - stat, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, - 0) == STAT_CHANGE_DIDNT_WORK) - { - gBattlescriptCurrInstr++; - } - else - { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - gBattleScripting.animArg2 = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_StatUp; - } - } - break; - case MOVE_EFFECT_ION_DELUGE: - if (!(gFieldStatuses & STATUS_FIELD_ION_DELUGE)) - { - gFieldStatuses |= STATUS_FIELD_ION_DELUGE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; - } - break; - case MOVE_EFFECT_HAZE: - for (i = 0; i < gBattlersCount; i++) - TryResetBattlerStatChanges(i); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectHaze; - break; - case MOVE_EFFECT_LEECH_SEED: - if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !(gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)) - { - gStatuses3[gBattlerTarget] |= gBattlerAttacker; - gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectLeechSeed; - } - break; - case MOVE_EFFECT_REFLECT: - if (TrySetReflect(gBattlerAttacker)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; - } - break; - case MOVE_EFFECT_LIGHT_SCREEN: - if (TrySetLightScreen(gBattlerAttacker)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; - } - break; - case MOVE_EFFECT_SALT_CURE: - if (!(gStatuses4[gBattlerTarget] & STATUS4_SALT_CURE)) - { - gStatuses4[gBattlerTarget] |= STATUS4_SALT_CURE; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectSaltCure; - } - break; - case MOVE_EFFECT_EERIE_SPELL: - if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != 0xFFFF) - { - u32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) - break; - } - - if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) - { - u32 ppToDeduct = 3; - - if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) - ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) - gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) - && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) - { - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); - MarkBattlerForControllerExec(gBattlerTarget); - } - - if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) - CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectEerieSpell; - } - } - break; - case MOVE_EFFECT_RAISE_TEAM_ATTACK: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_DEFENSE: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SPEED: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SP_ATK: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_RAISE_TEAM_SP_DEF: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - } - break; - case MOVE_EFFECT_LOWER_ATTACK_SIDE: - case MOVE_EFFECT_LOWER_DEFENSE_SIDE: - case MOVE_EFFECT_LOWER_SPEED_SIDE: - case MOVE_EFFECT_LOWER_SP_ATK_SIDE: - case MOVE_EFFECT_LOWER_SP_DEF_SIDE: - case MOVE_EFFECT_LOWER_SPEED_2_SIDE: - case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: - if (!NoAliveMonsForEitherParty()) - { - u32 statId = 0; - u32 stage = 1; - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_LOWER_SPEED_2_SIDE: - statId = STAT_SPEED; - stage = 2; - break; - case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: - statId = STAT_EVASION; - break; - default: - // Max Effects are ordered by stat ID. - statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; - break; - } - SET_STATCHANGER(statId, stage, TRUE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; - } - break; - case MOVE_EFFECT_SUN: - case MOVE_EFFECT_RAIN: - case MOVE_EFFECT_SANDSTORM: - case MOVE_EFFECT_HAIL: + else { - u8 weather = 0, msg = 0; - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_SUN: - weather = BATTLE_WEATHER_SUN; - msg = B_MSG_STARTED_SUNLIGHT; - break; - case MOVE_EFFECT_RAIN: - weather = BATTLE_WEATHER_RAIN; - msg = B_MSG_STARTED_RAIN; - break; - case MOVE_EFFECT_SANDSTORM: - weather = BATTLE_WEATHER_SANDSTORM; - msg = B_MSG_STARTED_SANDSTORM; - break; - case MOVE_EFFECT_HAIL: - if (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW) - { - weather = BATTLE_WEATHER_SNOW; - msg = B_MSG_STARTED_SNOW; - } - else - { - weather = BATTLE_WEATHER_HAIL; - msg = B_MSG_STARTED_HAIL; - } - break; - } - if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = msg; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetWeather; - } - break; - } - case MOVE_EFFECT_MISTY_TERRAIN: - case MOVE_EFFECT_GRASSY_TERRAIN: - case MOVE_EFFECT_ELECTRIC_TERRAIN: - case MOVE_EFFECT_PSYCHIC_TERRAIN: - { - u32 statusFlag = 0; - switch (gBattleScripting.moveEffect) - { - case MOVE_EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - break; - case MOVE_EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - break; - case MOVE_EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - break; - case MOVE_EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) - { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = gBattleTurnCounter + 8; - else - gFieldTimers.terrainTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; - } - break; - } - case MOVE_EFFECT_VINE_LASH: - case MOVE_EFFECT_CANNONADE: - case MOVE_EFFECT_WILDFIRE: - case MOVE_EFFECT_VOLCALITH: - { - u8 side = GetBattlerSide(gBattlerTarget); - if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) - { - u32 moveType = GetMoveType(gCurrentMove); - gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th - gSideTimers[side].damageNonTypesType = moveType; - BattleScriptPush(gBattlescriptCurrInstr + 1); - ChooseDamageNonTypesString(moveType); - gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; - } - break; - } - case MOVE_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; - } - break; - case MOVE_EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY - || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefogTryHazards; - } - break; - case MOVE_EFFECT_AURORA_VEIL: - if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; - } - break; - case MOVE_EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; - } - break; - case MOVE_EFFECT_SANDBLAST_SIDE: - case MOVE_EFFECT_FIRE_SPIN_SIDE: - { - // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) - { - if (!IsBattlerAlly(battler, gBattlerTarget)) - continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) - { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; - // The Wrap effect does not expire when the user switches, so here's some cheese. - gBattleStruct->wrappedBy[battler] = gBattlerTarget; - if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) - gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; - else - gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; - } - } - break; - } - case MOVE_EFFECT_YAWN_FOE: - { - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) - && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) - && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) - { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; - } - break; - } - case MOVE_EFFECT_SPITE: - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; - } - break; - case MOVE_EFFECT_PARALYZE_SIDE: BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; - break; - case MOVE_EFFECT_POISON_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; - break; - case MOVE_EFFECT_POISON_PARALYZE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; - break; - case MOVE_EFFECT_EFFECT_SPORE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; - break; - case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u32 payday = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message - } - // fall through - case MOVE_EFFECT_CONFUSE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; - break; - case MOVE_EFFECT_INFATUATE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; - break; - case MOVE_EFFECT_TORMENT_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTormentSide; - break; - case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; - break; - case MOVE_EFFECT_CRIT_PLUS_SIDE: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; - break; - case MOVE_EFFECT_HEAL_TEAM: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; - break; - case MOVE_EFFECT_AROMATHERAPY: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealBell_FromHeal; - break; - case MOVE_EFFECT_RECYCLE_BERRIES: - { - if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; - } - break; - } - case MOVE_EFFECT_REMOVE_STATUS: - { - u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); - if ((gBattleMons[gEffectBattler].status1 & argStatus) - && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) - { - gBattleMons[gEffectBattler].status1 &= ~(argStatus); - BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); - MarkBattlerForControllerExec(gEffectBattler); - BattleScriptPush(gBattlescriptCurrInstr + 1); - - switch (argStatus) - { - case STATUS1_PARALYSIS: - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - break; - case STATUS1_SLEEP: - TryDeactivateSleepClause(GetBattlerSide(gEffectBattler), gBattlerPartyIndexes[gBattlerTarget]); - gBattlescriptCurrInstr = BattleScript_TargetWokeUp; - break; - case STATUS1_BURN: - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - break; - case STATUS1_FREEZE: - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - break; - case STATUS1_FROSTBITE: - gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; - break; - case STATUS1_POISON: - case STATUS1_TOXIC_POISON: - case STATUS1_PSN_ANY: - gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; - break; - } - } - break; - } + gBattlescriptCurrInstr = BattleScript_MoveEffectConfusion; } } + break; + case MOVE_EFFECT_FLINCH: + if (battlerAbility == ABILITY_INNER_FOCUS) + { + // Inner Focus ALWAYS prevents flinching but only activates + // on a move that's supposed to flinch, like Fake Out + if (primary || certain) + { + gLastUsedAbility = ABILITY_INNER_FOCUS; + gBattlerAbility = gEffectBattler; + RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; + } + else + { + gBattlescriptCurrInstr++; + } + } + else if (gBattleMons[gEffectBattler].status2 & STATUS2_FLINCHED) + { + gBattlescriptCurrInstr++; + } + else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber + && !(GetActiveGimmick(gEffectBattler) == GIMMICK_DYNAMAX)) + { + gBattleMons[gEffectBattler].status2 |= STATUS2_FLINCHED; + gBattlescriptCurrInstr++; + } + else + { + gBattlescriptCurrInstr++; + } + break; + case MOVE_EFFECT_UPROAR: + if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) + { + gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN(B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2); + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectUproar; + } + else + { + gBattlescriptCurrInstr++; + } + break; + case MOVE_EFFECT_PAYDAY: + // Don't scatter coins on the second hit of Parental Bond + if (IsOnPlayerSide(gBattlerAttacker) && gSpecialStatuses[gBattlerAttacker].parentalBondState!= PARENTAL_BOND_2ND_HIT) + { + u16 payday = gPaydayMoney; + u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + + // For a move that hits multiple targets (i.e. Make it Rain) + // we only want to print the message on the final hit + if (!(NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(moveTarget, TRUE) != MAX_BATTLERS_COUNT)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; + } + else + gBattlescriptCurrInstr++; + } + else + { + gBattlescriptCurrInstr++; + } + break; + case MOVE_EFFECT_HAPPY_HOUR: + if (IsOnPlayerSide(gBattlerAttacker) && !gBattleStruct->moneyMultiplierMove) + { + gBattleStruct->moneyMultiplier *= 2; + gBattleStruct->moneyMultiplierMove = 1; + } + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_TRI_ATTACK: + if (gBattleMons[gEffectBattler].status1) + { + gBattlescriptCurrInstr++; + } + else + { + static const u8 sTriAttackEffects[] = + { + MOVE_EFFECT_BURN, + MOVE_EFFECT_FREEZE_OR_FROSTBITE, + MOVE_EFFECT_PARALYSIS + }; + gBattleScripting.moveEffect = RandomElement(RNG_TRI_ATTACK, sTriAttackEffects); + SetMoveEffect(primary, certain); + } + break; + case MOVE_EFFECT_CHARGING: + if (!(gBattleMons[gEffectBattler].status2 & STATUS2_MULTIPLETURNS)) + { + gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; + gLockedMoves[gEffectBattler] = gCurrentMove; + gProtectStructs[gEffectBattler].chargingTurn = TRUE; + } + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_WRAP: + if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; + else + gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? (Random() % 2) + 4 : (Random() % 4) + 2; + + gBattleStruct->wrappedMove[gEffectBattler] = gCurrentMove; + gBattleStruct->wrappedBy[gEffectBattler] = gBattlerAttacker; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectWrap; + + for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] < NUM_TRAPPING_MOVES; gBattleCommunication[MULTISTRING_CHOOSER]++) + { + if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) + break; + } + } + break; + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + if (NoAliveMonsForEitherParty() + || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + break; + case MOVE_EFFECT_ATK_MINUS_1: + case MOVE_EFFECT_DEF_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SP_ATK_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_EVS_MINUS_1: + if (affectsUser == MOVE_EFFECT_AFFECTS_USER) + flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; + else + flags = 0; + if (mirrorArmorReflected && !affectsUser) + flags |= STAT_CHANGE_ALLOW_PTR; + else + flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + + if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, + flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + { + if (!mirrorArmorReflected) + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatDown; + } + break; + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + if (NoAliveMonsForEitherParty() + || ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + break; + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SPD_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_ACC_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + if (affectsUser == MOVE_EFFECT_AFFECTS_USER) + flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; + else + flags = 0; + if (mirrorArmorReflected && !affectsUser) + flags |= STAT_CHANGE_ALLOW_PTR; + else + flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + + if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, + flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + { + if (!mirrorArmorReflected) + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatDown; + } + break; + case MOVE_EFFECT_RECHARGE: + if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd + break; + + gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; + gDisableStructs[gEffectBattler].rechargeTimer = 2; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_RAGE: + gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_STEAL_ITEM: + if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + || gBattleMons[gBattlerAttacker].item != ITEM_NONE + || gBattleMons[gBattlerTarget].item == ITEM_NONE) + { + gBattlescriptCurrInstr++; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } + else + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item + + if (!(B_STEAL_WILD_ITEMS >= GEN_9 + && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) + { + gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) + gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later + } + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ItemSteal; + } + break; + case MOVE_EFFECT_PREVENT_ESCAPE: + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + } + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_NIGHTMARE: + gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE; + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_ALL_STATS_UP: + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_AllStatsUp; + } + break; + case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_AtkDefDown; + } + break; + case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + } + break; + case MOVE_EFFECT_RECOIL_HP_25: // Struggle + gBattleStruct->moveDamage[gEffectBattler] = (gBattleMons[gEffectBattler].maxHP) / 4; + if (gBattleStruct->moveDamage[gEffectBattler] == 0) + gBattleStruct->moveDamage[gEffectBattler] = 1; + if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) + gBattleStruct->moveDamage[gEffectBattler] *= 2; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + break; + case MOVE_EFFECT_THRASH: + // Petal Dance doesn't lock mons that copy the move with Dancer + if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; + gLockedMoves[gEffectBattler] = gCurrentMove; + gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN(RandomUniform(RNG_RAMPAGE_TURNS, 2, 3)); + } + break; + case MOVE_EFFECT_CLEAR_SMOG: + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gEffectBattler].statStages[i] != DEFAULT_STAT_STAGE) + break; + } + if ((gSpecialStatuses[gEffectBattler].physicalDmg || gSpecialStatuses[gEffectBattler].specialDmg) && i != NUM_BATTLE_STATS) + { + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gEffectBattler].statStages[i] = DEFAULT_STAT_STAGE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; + } + break; + case MOVE_EFFECT_FLAME_BURST: + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) + && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) + && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) + { + i = BATTLE_PARTNER(gBattlerTarget); + gBattleScripting.savedBattler = i; + gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; + if (gBattleStruct->moveDamage[i] == 0) + gBattleStruct->moveDamage[i] = 1; + gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; + } + break; + case MOVE_EFFECT_FEINT: + i = FALSE; // Remove Protect if any + if (gProtectStructs[gBattlerTarget].protected != PROTECT_NONE + && gProtectStructs[gBattlerTarget].protected != PROTECT_MAX_GUARD) + { + gProtectStructs[gBattlerTarget].protected = PROTECT_NONE; + i = TRUE; + } + if (GetProtectType(gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected) == PROTECT_TYPE_SIDE) + { + gProtectStructs[BATTLE_PARTNER(gBattlerTarget)].protected = PROTECT_NONE; + i = TRUE; + } + if (i) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + if (gCurrentMove == MOVE_HYPERSPACE_FURY) + gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; + else + gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + } + break; + case MOVE_EFFECT_V_CREATE: + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + } + break; + case MOVE_EFFECT_CORE_ENFORCER: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) + && !NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; + } + break; + case MOVE_EFFECT_THROAT_CHOP: + gDisableStructs[gEffectBattler].throatChopTimer = gBattleTurnCounter + 2; + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_INCINERATE: + if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) + || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS)) + { + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); + + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; + } + break; + case MOVE_EFFECT_BUG_BITE: + if (GetItemPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES + && battlerAbility != ABILITY_STICKY_HOLD) + { + // target loses their berry + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); + + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].item), &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; + } + break; + case MOVE_EFFECT_TRAP_BOTH: + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; + } + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) + gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; + + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; + break; + case MOVE_EFFECT_REMOVE_ARG_TYPE: + { + u32 type = GetMoveArgType(gCurrentMove); + // This seems unnecessary but is done to make it work properly with Parental Bond + BattleScriptPush(gBattlescriptCurrInstr + 1); + switch (type) + { + case TYPE_FIRE: // Burn Up + gBattlescriptCurrInstr = BattleScript_RemoveFireType; + break; + case TYPE_ELECTRIC: // Double Shot + gBattlescriptCurrInstr = BattleScript_RemoveElectricType; + break; + default: + gBattlescriptCurrInstr = BattleScript_RemoveGenericType; + break; + } + RemoveBattlerType(gEffectBattler, type); + break; + } + case MOVE_EFFECT_ROUND: + TryUpdateRoundTurnOrder(); // If another Pokémon uses Round before the user this turn, the user will use Round directly after it + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_DIRE_CLAW: + if (!gBattleMons[gEffectBattler].status1) + { + static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; + gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects); + SetMoveEffect(primary, certain); + } + break; + case MOVE_EFFECT_STEALTH_ROCK: + if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StealthRockActivates; + } + break; + case MOVE_EFFECT_SPIKES: + if (gSideTimers[GetBattlerSide(gEffectBattler)].spikesAmount < 3) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; + BattleScriptPush(gBattlescriptCurrInstr + 1); + + if (gBattleStruct->isSkyBattle) + gBattlescriptCurrInstr++; + else + gBattlescriptCurrInstr = BattleScript_SpikesActivates; + } + break; + case MOVE_EFFECT_SYRUP_BOMB: + if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB)) + { + struct Pokemon *mon = GetBattlerMon(gBattlerAttacker); + + gStatuses4[gEffectBattler] |= STATUS4_SYRUP_BOMB; + gDisableStructs[gEffectBattler].syrupBombTimer = 3; + gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); + gBattleStruct->stickySyrupdBy[gEffectBattler] = gBattlerAttacker; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; + } + break; + case MOVE_EFFECT_SECRET_POWER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + case STATUS_FIELD_MISTY_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; + break; + case STATUS_FIELD_ELECTRIC_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + break; + default: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + } + } + else + { + switch (gBattleEnvironment) + { + case BATTLE_ENVIRONMENT_GRASS: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); + break; + case BATTLE_ENVIRONMENT_UNDERWATER: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); + break; + case BATTLE_ENVIRONMENT_POND: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); + break; + case BATTLE_ENVIRONMENT_MOUNTAIN: + if (B_SECRET_POWER_EFFECT >= GEN_5) + gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; + else if (B_SECRET_POWER_EFFECT >= GEN_4) + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + else + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; + break; + case BATTLE_ENVIRONMENT_PUDDLE: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); + break; + case BATTLE_ENVIRONMENT_LONG_GRASS: + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; + break; + case BATTLE_ENVIRONMENT_SAND: + gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; + break; + case BATTLE_ENVIRONMENT_WATER: + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; + break; + case BATTLE_ENVIRONMENT_CAVE: + case BATTLE_ENVIRONMENT_BURIAL_GROUND: + case BATTLE_ENVIRONMENT_SPACE: + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + break; + case BATTLE_ENVIRONMENT_SOARING: + case BATTLE_ENVIRONMENT_SKY_PILLAR: + case BATTLE_ENVIRONMENT_MARSH: + case BATTLE_ENVIRONMENT_SWAMP: + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + break; + case BATTLE_ENVIRONMENT_SNOW: + case BATTLE_ENVIRONMENT_ICE: + gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE; + break; + case BATTLE_ENVIRONMENT_VOLCANO: + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + break; + case BATTLE_ENVIRONMENT_ULTRA_SPACE: + gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; + break; + default: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + } + } + SetMoveEffect(primary, certain); + break; + case MOVE_EFFECT_PSYCHIC_NOISE: + battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); + + if (battlerAbility) + { + gBattlerAbility = battlerAbility - 1; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; + } + else if (!(gStatuses3[gEffectBattler] & STATUS3_HEAL_BLOCK)) + { + gStatuses3[gEffectBattler] |= STATUS3_HEAL_BLOCK; + gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; + } + break; + case MOVE_EFFECT_TERA_BLAST: + if (GetActiveGimmick(gEffectBattler) == GIMMICK_TERA + && GetBattlerTeraType(gEffectBattler) == TYPE_STELLAR + && !NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_LowerAtkSpAtk; + } + break; + case MOVE_EFFECT_ORDER_UP: + { + u32 stat = 0; + bool32 commanderAffected = TRUE; + switch (gBattleStruct->commanderActive[gEffectBattler]) + { + case SPECIES_TATSUGIRI_CURLY: + stat = STAT_ATK; + break; + case SPECIES_TATSUGIRI_DROOPY: + stat = STAT_DEF; + break; + case SPECIES_TATSUGIRI_STRETCHY: + stat = STAT_SPEED; + break; + default: + commanderAffected = FALSE; + break; + } + if (!commanderAffected + || NoAliveMonsForEitherParty() + || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), + stat, + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0) == STAT_CHANGE_DIDNT_WORK) + { + gBattlescriptCurrInstr++; + } + else + { + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg2 = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StatUp; + } + } + break; + case MOVE_EFFECT_ION_DELUGE: + if (!(gFieldStatuses & STATUS_FIELD_ION_DELUGE)) + { + gFieldStatuses |= STATUS_FIELD_ION_DELUGE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; + } + break; + case MOVE_EFFECT_HAZE: + for (i = 0; i < gBattlersCount; i++) + TryResetBattlerStatChanges(i); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectHaze; + break; + case MOVE_EFFECT_LEECH_SEED: + if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !(gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)) + { + gStatuses3[gBattlerTarget] |= gBattlerAttacker; + gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectLeechSeed; + } + break; + case MOVE_EFFECT_REFLECT: + if (TrySetReflect(gBattlerAttacker)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectReflect; + } + break; + case MOVE_EFFECT_LIGHT_SCREEN: + if (TrySetLightScreen(gBattlerAttacker)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectLightScreen; + } + break; + case MOVE_EFFECT_SALT_CURE: + if (!(gStatuses4[gBattlerTarget] & STATUS4_SALT_CURE)) + { + gStatuses4[gBattlerTarget] |= STATUS4_SALT_CURE; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectSaltCure; + } + break; + case MOVE_EFFECT_EERIE_SPELL: + if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != 0xFFFF) + { + u32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) + break; + } + + if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) + { + u32 ppToDeduct = 3; + + if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) + ppToDeduct = gBattleMons[gBattlerTarget].pp[i]; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) + ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) + gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; + if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) + && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) + { + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); + MarkBattlerForControllerExec(gBattlerTarget); + } + + if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == SKY_DROP_NO_TARGET) + CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_IGNORE); + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectEerieSpell; + } + } + break; + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SPEED: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + if (!NoAliveMonsForEitherParty()) + { + u32 statId = 0; + u32 stage = 1; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + statId = STAT_SPEED; + stage = 2; + break; + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + statId = STAT_EVASION; + break; + default: + // Max Effects are ordered by stat ID. + statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + } + break; + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + { + u8 weather = 0, msg = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_SUN: + weather = BATTLE_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; + case MOVE_EFFECT_RAIN: + weather = BATTLE_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; + case MOVE_EFFECT_SANDSTORM: + weather = BATTLE_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; + case MOVE_EFFECT_HAIL: + if (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW) + { + weather = BATTLE_WEATHER_SNOW; + msg = B_MSG_STARTED_SNOW; + } + else + { + weather = BATTLE_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; + } + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + } + break; + } + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + break; + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = gBattleTurnCounter + 8; + else + gFieldTimers.terrainTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + } + break; + } + case MOVE_EFFECT_VINE_LASH: + case MOVE_EFFECT_CANNONADE: + case MOVE_EFFECT_WILDFIRE: + case MOVE_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + u32 moveType = GetMoveType(gCurrentMove); + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesType = moveType; + BattleScriptPush(gBattlescriptCurrInstr + 1); + ChooseDamageNonTypesString(moveType); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + } + break; + } + case MOVE_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + } + break; + case MOVE_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY + || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefogTryHazards; + } + break; + case MOVE_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; + } + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + } + break; + case MOVE_EFFECT_SANDBLAST_SIDE: + case MOVE_EFFECT_FIRE_SPIN_SIDE: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (!IsBattlerAlly(battler, gBattlerTarget)) + continue; + if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + { + gBattleMons[battler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleStruct->wrappedBy[battler] = gBattlerTarget; + if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) + gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; + else + gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; + } + } + break; + } + case MOVE_EFFECT_YAWN_FOE: + { + if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) + { + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; + } + break; + } + case MOVE_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + } + break; + case MOVE_EFFECT_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; + break; + case MOVE_EFFECT_POISON_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; + break; + case MOVE_EFFECT_POISON_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + break; + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + break; + case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MOVE_EFFECT_CONFUSE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; + break; + case MOVE_EFFECT_INFATUATE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; + break; + case MOVE_EFFECT_TORMENT_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + break; + case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; + break; + case MOVE_EFFECT_CRIT_PLUS_SIDE: + gBattleStruct->bonusCritStages[gBattlerAttacker]++; + gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + break; + case MOVE_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + break; + case MOVE_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealBell_FromHeal; + break; + case MOVE_EFFECT_RECYCLE_BERRIES: + { + if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + } + break; + } + case MOVE_EFFECT_REMOVE_STATUS: + { + u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); + if ((gBattleMons[gEffectBattler].status1 & argStatus) + && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) + { + gBattleMons[gEffectBattler].status1 &= ~(argStatus); + BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + + switch (argStatus) + { + case STATUS1_PARALYSIS: + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; + break; + case STATUS1_SLEEP: + TryDeactivateSleepClause(GetBattlerSide(gEffectBattler), gBattlerPartyIndexes[gBattlerTarget]); + gBattlescriptCurrInstr = BattleScript_TargetWokeUp; + break; + case STATUS1_BURN: + gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; + break; + case STATUS1_FREEZE: + gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + break; + case STATUS1_FROSTBITE: + gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; + break; + case STATUS1_POISON: + case STATUS1_TOXIC_POISON: + case STATUS1_PSN_ANY: + gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; + break; + } + } + break; + } } gBattleScripting.moveEffect = 0; @@ -4562,22 +4550,17 @@ static void Cmd_seteffectsecondary(void) SetMoveEffect(FALSE, FALSE); } -static void Cmd_clearstatusfromeffect(void) +static void Cmd_clearstatus2(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u32 status2); + u32 status2 = cmd->status2; u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) - gBattleMons[battler].status1 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); - else - { - gBattleMons[battler].status2 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); - if (gBattleScripting.moveEffect == MOVE_EFFECT_CHARGING) - gProtectStructs[battler].chargingTurn = FALSE; - } + gBattleMons[battler].status2 &= ~status2; + if (status2 & STATUS2_MULTIPLETURNS) + gProtectStructs[battler].chargingTurn = FALSE; - gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; gBattleScripting.multihitMoveEffect = 0; } From 8489b7a622c2e980030415a965f294784a7088a7 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 7 Jun 2025 05:13:07 +0200 Subject: [PATCH 037/248] Added naive line break (#7076) Co-authored-by: Hedara --- include/line_break.h | 3 + src/line_break.c | 133 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 135 insertions(+), 1 deletion(-) diff --git a/include/line_break.h b/include/line_break.h index af0d27ff21..12c4603528 100644 --- a/include/line_break.h +++ b/include/line_break.h @@ -32,6 +32,9 @@ u32 CountLineBreaks(u8 *src); void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); +void BreakStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); +void BreakSubStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt); + bool32 IsWordSplittingChar(const u8 *src, u32 index); u32 GetStringBadness(struct StringLine *stringLines, u32 numLines, u32 maxWidth); void BuildNewString(struct StringLine *stringLines, u32 numLines, u32 maxLines, u8 *str, enum ToggleScrollPrompt toggleScrollPrompt); diff --git a/src/line_break.c b/src/line_break.c index 6684b32375..169d68332b 100644 --- a/src/line_break.c +++ b/src/line_break.c @@ -47,6 +47,137 @@ void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enu BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); } +void BreakStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) +{ + u32 currIndex = 0; + u8 *currSrc = src; + while (src[currIndex] != EOS) + { + if (src[currIndex] == CHAR_PROMPT_CLEAR) + { + u8 replacedChar = src[currIndex + 1]; + src[currIndex + 1] = EOS; + BreakSubStringNaive(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); + src[currIndex + 1] = replacedChar; + currSrc = &src[currIndex + 1]; + } + currIndex++; + } + BreakSubStringNaive(currSrc, maxWidth, screenLines, fontId, toggleScrollPrompt); +} + +#define SCROLL_PROMPT_WIDTH 8 +void BreakSubStringNaive(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) +{ + // If the string already has line breaks, don't interfere with them + if (StringHasManualBreaks(src)) + return; + // Sanity check + if (src[0] == EOS) + return; + u32 numChars = 1; + u32 numWords = 1; + u32 currWordIndex = 0; + u32 currWordLength = 1; + bool32 isPrevCharSplitting = FALSE; + bool32 isCurrCharSplitting; + // Get numbers of chars in string and count words + while (src[numChars] != EOS) + { + isCurrCharSplitting = IsWordSplittingChar(src, numChars); + if (isCurrCharSplitting && !isPrevCharSplitting) + numWords++; + isPrevCharSplitting = isCurrCharSplitting; + numChars++; + } + // Allocate enough space for word data + struct StringWord *allWords = Alloc(numWords*sizeof(struct StringWord)); + + allWords[currWordIndex].startIndex = 0; + allWords[currWordIndex].width = 0; + isPrevCharSplitting = FALSE; + // Fill in word begin index and lengths + for (u32 i = 1; i < numChars; i++) + { + isCurrCharSplitting = IsWordSplittingChar(src, i); + if (isCurrCharSplitting && !isPrevCharSplitting) + { + allWords[currWordIndex].length = currWordLength; + currWordIndex++; + currWordLength = 0; + } + else if (!isCurrCharSplitting && isPrevCharSplitting) + { + allWords[currWordIndex].startIndex = i; + allWords[currWordIndex].width = 0; + currWordLength++; + } + else + { + currWordLength++; + } + isPrevCharSplitting = isCurrCharSplitting; + } + allWords[currWordIndex].length = currWordLength; + + // Fill in individual word widths + for (u32 i = 0; i < numWords; i++) + { + for (u32 j = 0; j < allWords[i].length; j++) + allWords[i].width += GetGlyphWidth(src[allWords[i].startIndex + j], FALSE, fontId); + } + + // Step 1: Does it all fit one one line? Then no break + // Step 2: Try to split across minimum number of lines + u32 spaceWidth = GetGlyphWidth(CHAR_SPACE, FALSE, fontId); + u32 totalWidth = allWords[0].width; + // Calculate total widths without any line breaks + for (u32 i = 1; i < numWords; i++) + totalWidth += allWords[i].width + spaceWidth; + + // If it doesn't fit on 1 line, do line breaks + if (totalWidth > maxWidth) + { + u32 currWidth = 0; + u32 numBreaks = 0; + u32 currWords = 1; + for (u32 wordIndex = 0; wordIndex < numWords; wordIndex++) + { + currWidth += allWords[wordIndex].width; + if (numBreaks == screenLines - 1) + { + if (SCROLL_PROMPT_WIDTH + currWidth + (currWords - 1) * spaceWidth > maxWidth) + { + src[allWords[wordIndex].startIndex - 1] = CHAR_PROMPT_SCROLL; + currWidth = allWords[wordIndex].length; + currWords = 1; + } + else + { + currWords++; + } + } + else + { + if (currWidth + (currWords - 1) * spaceWidth > maxWidth) + { + src[allWords[wordIndex].startIndex - 1] = CHAR_NEWLINE; + currWidth = allWords[wordIndex].width; + currWords = 1; + numBreaks++; + } + else + { + currWords++; + } + } + } + } + + Free(allWords); +} +#undef SCROLL_PROMPT_WIDTH + void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, enum ToggleScrollPrompt toggleScrollPrompt) { // If the string already has line breaks, don't interfere with them @@ -109,7 +240,7 @@ void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId, // Step 1: Does it all fit one one line? Then no break // Step 2: Try to split across minimum number of lines - u32 spaceWidth = GetGlyphWidth(0, FALSE, fontId); + u32 spaceWidth = GetGlyphWidth(CHAR_SPACE, FALSE, fontId); u32 totalWidth = allWords[0].width; // Calculate total widths without any line breaks for (u32 i = 1; i < numWords; i++) From e63ac48de2568fa235e5645928d06ed6d7fef220 Mon Sep 17 00:00:00 2001 From: wiz1989 <80073265+wiz1989@users.noreply.github.com> Date: Sat, 7 Jun 2025 09:57:43 +0200 Subject: [PATCH 038/248] added Ash Greninja overworld sprites (#6976) --- graphics/pokemon/greninja/ash/overworld.png | Bin 0 -> 1092 bytes .../pokemon/greninja/ash/overworld_normal.pal | 19 ++++++++++++++++++ .../pokemon/greninja/ash/overworld_shiny.pal | 19 ++++++++++++++++++ spritesheet_rules.mk | 3 +++ src/data/graphics/pokemon.h | 10 ++++----- .../object_event_pic_tables_followers.h | 6 ++++-- .../pokemon/species_info/gen_6_families.h | 11 ++++++++++ 7 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 graphics/pokemon/greninja/ash/overworld.png create mode 100644 graphics/pokemon/greninja/ash/overworld_normal.pal create mode 100644 graphics/pokemon/greninja/ash/overworld_shiny.pal diff --git a/graphics/pokemon/greninja/ash/overworld.png b/graphics/pokemon/greninja/ash/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..9313520a5eee723fb4c2c46608a714b8f5cb2d26 GIT binary patch literal 1092 zcmV-K1iSl*P)D zi;S3SFo+8FltVCvoP6-1&^;KIEbJxt5<>D7+9e@%umf9Z^>0=yL7}J8&SAB`S2NEu z^J?B1g#K^;kw&5)sb0zdxUEH64Xu*@MkAzN#j+6zYLTE-#t7kgUnLt{s2iK zXswGh>An{JE8(zv7hxos`S1cGy!GzYQ&h!rV6557`O1CG_RBaDtYbt(gGEMLZ;k<= zlI;<-56^=x8ylsJ@ZQrc`io#t;M(PLv(>s$$-RKybkF%}dtj6@!gjFL4g`Y&&nA3r zRnaP0J|uHN#V_Yju<_#AiaA9Ud`WIZdR7(7hf3q}_`Q-FEHb*Fty`_tjZCn>n7?f) zS3}vaV1&#sHa{JG{#r3Ac!Rb`Log^XzC(_`{B3Ca6&%(qefaw5{6|*K60uGwA@C^m zLq(p^##hdt;~%Dr{9u+aX>K@8@0vq1gP2)djF{W|Cjh5*_En4gjpGbI*nJtoa`mlO;j`DA>;Fnpmuux?k-;yO0tVgz~OhZ7!M#N#pd68xv6;Z})mL zWGx?H2bLWe7Y|XKGB@U$ljVqa`&2yabWc@8mioNojx|UP+h@Gf@8|F3APD^a$JhXL z>P3ud_p)ML=V!br2;$B}7g_b-TPoBx5PF*l=Wj2Z@xc7}UGf&s*{JQLIhS;onSqfD zDjYy$bz;G;c>L~~toJfM(1VfQ9Q(Ct&MF)GDBb5sf=$cp359hAE*BW-V-taRfq{nY zms!9b?YX*@o~?5RE-;eR%~4mjvw$=qlz2HK%$Bc5mVIJ5*z+_DS?S9`xV;z`jsle{ zO`^&9U;+~F3yduxKg%HtTy1`prW~!&W%+~&LC_Q=!aXi6+|l~oPH_oh2z#De^e==k z=Vm#?j-A^@gM|?DmQq*<;dKwnA(31D24V;o`!9zUxTOETxBUh8>Th+*<0W+f0000< KMNUMnLSTZ|RQ8Sl literal 0 HcmV?d00001 diff --git a/graphics/pokemon/greninja/ash/overworld_normal.pal b/graphics/pokemon/greninja/ash/overworld_normal.pal new file mode 100644 index 0000000000..04bbf21ddf --- /dev/null +++ b/graphics/pokemon/greninja/ash/overworld_normal.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +46 56 55 +68 84 82 +20 20 20 +220 212 133 +234 152 208 +72 95 157 +245 103 190 +62 141 206 +136 186 226 +184 62 48 +176 97 134 +186 214 237 +233 85 88 +241 174 219 +100 33 26 diff --git a/graphics/pokemon/greninja/ash/overworld_shiny.pal b/graphics/pokemon/greninja/ash/overworld_shiny.pal new file mode 100644 index 0000000000..6ce04a9319 --- /dev/null +++ b/graphics/pokemon/greninja/ash/overworld_shiny.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +152 208 160 +46 56 55 +68 84 82 +20 20 20 +184 152 83 +234 152 208 +46 56 55 +245 103 190 +68 84 82 +136 186 226 +184 62 48 +176 97 134 +186 214 237 +233 85 88 +241 174 219 +100 33 26 diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 37074cb048..aaa346ccf1 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -3237,6 +3237,9 @@ $(POKEMONGFXDIR)/frogadier/overworld.4bpp: %.4bpp: %.png $(POKEMONGFXDIR)/greninja/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(POKEMONGFXDIR)/greninja/ash/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(POKEMONGFXDIR)/bunnelby/overworld.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 74b3a98229..1b70cf3aa4 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -19202,13 +19202,13 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_GreninjaAsh[] = INCBIN_U32("graphics/pokemon/greninja/ash/back.4bpp.smol"); const u16 gMonShinyPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/shiny.gbapal"); const u8 gMonIcon_GreninjaAsh[] = INCBIN_U8("graphics/pokemon/greninja/ash/icon.4bpp"); -#if OW_POKEMON_OBJECT_EVENTS - // const u32 gObjectEventPic_GreninjaAsh[] = INCBIN_COMP("graphics/pokemon/greninja/ash/overworld.4bpp"); +#if OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS + const u32 gObjectEventPic_GreninjaAsh[] = INCBIN_COMP("graphics/pokemon/greninja/ash/overworld.4bpp"); #if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE - // const u16 gOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_normal.gbapal"); - // const u16 gShinyOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_shiny.gbapal"); + const u16 gOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_normal.gbapal"); + const u16 gShinyOverworldPalette_GreninjaAsh[] = INCBIN_U16("graphics/pokemon/greninja/ash/overworld_shiny.gbapal"); #endif //OW_PKMN_OBJECTS_SHARE_PALETTES -#endif //OW_POKEMON_OBJECT_EVENTS +#endif //OW_POKEMON_OBJECT_EVENTS && OW_BATTLE_ONLY_FORMS #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY 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 305fd6b74e..13f9d17316 100644 --- a/src/data/object_events/object_event_pic_tables_followers.h +++ b/src/data/object_events/object_event_pic_tables_followers.h @@ -4590,9 +4590,11 @@ static const struct SpriteFrameImage sPicTable_Frogadier[] = { static const struct SpriteFrameImage sPicTable_Greninja[] = { overworld_ascending_frames(gObjectEventPic_Greninja, 4, 4), }; -/*static const struct SpriteFrameImage sPicTable_GreninjaAsh[] = { +#if OW_BATTLE_ONLY_FORMS +static const struct SpriteFrameImage sPicTable_GreninjaAsh[] = { overworld_ascending_frames(gObjectEventPic_GreninjaAsh, 4, 4), -};*/ +}; +#endif //OW_BATTLE_ONLY_FORMS #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 9dfac96c80..411ef400f6 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -744,6 +744,17 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 10, SHADOW_SIZE_L) FOOTPRINT(Greninja) + #if OW_BATTLE_ONLY_FORMS + OVERWORLD( + sPicTable_GreninjaAsh, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_FOOT, + sAnimTable_Following, + gOverworldPalette_GreninjaAsh, + gShinyOverworldPalette_GreninjaAsh + ) + #endif //OW_BATTLE_ONLY_FORMS .levelUpLearnset = sGreninjaLevelUpLearnset, .teachableLearnset = sGreninjaTeachableLearnset, .formSpeciesIdTable = sGreninjaFormSpeciesIdTable, From 05023b82eac0b815df0eb4e9a1c0274dbac4f258 Mon Sep 17 00:00:00 2001 From: Emilia Daelman <48217459+Emiliasky@users.noreply.github.com> Date: Sun, 8 Jun 2025 04:02:03 +0200 Subject: [PATCH 039/248] chore: remove unused section from credits (#7085) --- CREDITS.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 6045f2301a..753cf2b09e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -84,15 +84,3 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! -## Contributors ✨ - -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From b372c272f4c69a69cd0458d1156c6ac892cc46f1 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 8 Jun 2025 14:45:14 +0200 Subject: [PATCH 040/248] Update FRLG whiteouts to new pret system (#7040) Co-authored-by: cawtds <38510667+cawtds@users.noreply.github.com> --- src/data/heal_locations.json | 99 +++++++++++---- src/data/heal_locations.json.txt | 10 +- src/data/heal_locations_pkm_center.h | 175 --------------------------- src/heal_location.c | 14 +-- 4 files changed, 91 insertions(+), 207 deletions(-) delete mode 100644 src/data/heal_locations_pkm_center.h diff --git a/src/data/heal_locations.json b/src/data/heal_locations.json index c465ff65c3..3bfa468729 100644 --- a/src/data/heal_locations.json +++ b/src/data/heal_locations.json @@ -4,133 +4,188 @@ "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", "map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", "x": 4, - "y": 2 + "y": 2, + "respawn_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", + "respawn_x": 2, + "respawn_y": 7, + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM" }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F", "map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F", "x": 4, - "y": 2 + "y": 2, + "respawn_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F", + "respawn_x": 8, + "respawn_y": 7, + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM" }, { "id": "HEAL_LOCATION_PETALBURG_CITY", "map": "MAP_PETALBURG_CITY", "x": 20, - "y": 17 + "y": 17, + "respawn_map": "MAP_PETALBURG_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_PETALBURG_NURSE" }, { "id": "HEAL_LOCATION_SLATEPORT_CITY", "map": "MAP_SLATEPORT_CITY", "x": 19, - "y": 20 + "y": 20, + "respawn_map": "MAP_SLATEPORT_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_SLATEPORT_NURSE" }, { "id": "HEAL_LOCATION_MAUVILLE_CITY", "map": "MAP_MAUVILLE_CITY", "x": 22, - "y": 6 + "y": 6, + "respawn_map": "MAP_MAUVILLE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_MAUVILLE_NURSE" }, { "id": "HEAL_LOCATION_RUSTBORO_CITY", "map": "MAP_RUSTBORO_CITY", "x": 16, - "y": 39 + "y": 39, + "respawn_map": "MAP_RUSTBORO_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_RUSTBORO_NURSE" }, { "id": "HEAL_LOCATION_FORTREE_CITY", "map": "MAP_FORTREE_CITY", "x": 5, - "y": 7 + "y": 7, + "respawn_map": "MAP_FORTREE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FORTREE_NURSE" }, { "id": "HEAL_LOCATION_LILYCOVE_CITY", "map": "MAP_LILYCOVE_CITY", "x": 24, - "y": 15 + "y": 15, + "respawn_map": "MAP_LILYCOVE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_LILYCOVE_NURSE" }, { "id": "HEAL_LOCATION_MOSSDEEP_CITY", "map": "MAP_MOSSDEEP_CITY", "x": 28, - "y": 17 + "y": 17, + "respawn_map": "MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_MOSSDEEP_NURSE" }, { "id": "HEAL_LOCATION_SOOTOPOLIS_CITY", "map": "MAP_SOOTOPOLIS_CITY", "x": 43, - "y": 32 + "y": 32, + "respawn_map": "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_SOOTOPOLIS_NURSE" }, { "id": "HEAL_LOCATION_EVER_GRANDE_CITY", "map": "MAP_EVER_GRANDE_CITY", "x": 27, - "y": 49 + "y": 49, + "respawn_map": "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_EVER_GRANDE_NURSE" }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE", "map": "MAP_LITTLEROOT_TOWN", "x": 5, - "y": 9 + "y": 9, + "respawn_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", + "respawn_x": 2, + "respawn_y": 7, + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM" }, { "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE", "map": "MAP_LITTLEROOT_TOWN", "x": 14, - "y": 9 + "y": 9, + "respawn_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F", + "respawn_x": 8, + "respawn_y": 7, + "respawn_npc": "LOCALID_PLAYERS_HOUSE_1F_MOM" }, { "id": "HEAL_LOCATION_OLDALE_TOWN", "map": "MAP_OLDALE_TOWN", "x": 6, - "y": 17 + "y": 17, + "respawn_map": "MAP_OLDALE_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_OLDALE_NURSE" }, { "id": "HEAL_LOCATION_DEWFORD_TOWN", "map": "MAP_DEWFORD_TOWN", "x": 2, - "y": 11 + "y": 11, + "respawn_map": "MAP_DEWFORD_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_DEWFORD_NURSE" }, { "id": "HEAL_LOCATION_LAVARIDGE_TOWN", "map": "MAP_LAVARIDGE_TOWN", "x": 9, - "y": 7 + "y": 7, + "respawn_map": "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_LAVARIDGE_NURSE" }, { "id": "HEAL_LOCATION_FALLARBOR_TOWN", "map": "MAP_FALLARBOR_TOWN", "x": 14, - "y": 8 + "y": 8, + "respawn_map": "MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FALLARBOR_NURSE" }, { "id": "HEAL_LOCATION_VERDANTURF_TOWN", "map": "MAP_VERDANTURF_TOWN", "x": 16, - "y": 4 + "y": 4, + "respawn_map": "MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_VERDANTURF_NURSE" }, { "id": "HEAL_LOCATION_PACIFIDLOG_TOWN", "map": "MAP_PACIFIDLOG_TOWN", "x": 8, - "y": 16 + "y": 16, + "respawn_map": "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_PACIFIDLOG_NURSE" }, { "id": "HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE", "map": "MAP_EVER_GRANDE_CITY", "x": 18, - "y": 6 + "y": 6, + "respawn_map": "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F", + "respawn_x": 3, + "respawn_y": 4, + "respawn_npc": "LOCALID_LEAGUE_NURSE" }, { "id": "HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR", "map": "MAP_SOUTHERN_ISLAND_EXTERIOR", "x": 15, - "y": 20 + "y": 20, + "respawn_map": "MAP_SOUTHERN_ISLAND_EXTERIOR", + "respawn_x": 15, + "respawn_y": 20 }, { "id": "HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST", "map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", "x": 3, - "y": 52 + "y": 52, + "respawn_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", + "respawn_npc": "LOCALID_FRONTIER_NURSE" } ] } diff --git a/src/data/heal_locations.json.txt b/src/data/heal_locations.json.txt index fd63228e33..ca04a98885 100644 --- a/src/data/heal_locations.json.txt +++ b/src/data/heal_locations.json.txt @@ -11,14 +11,20 @@ static const struct HealLocation sHealLocations[NUM_HEAL_LOCATIONS - 1] = { ## endfor }; -static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] = { +#define DEFAULT_POKEMON_CENTER_X 7 +#define DEFAULT_POKEMON_CENTER_Y 4 + +static const u16 sWhiteoutRespawnHealCenterMapIdxs[][4] = { ## for heal_location in heal_locations {% if existsIn(heal_location, "respawn_map") %} - [{{ heal_location.id }} - 1] = { MAP_GROUP({{ heal_location.respawn_map }}), MAP_NUM({{ heal_location.respawn_map }})}, + [{{ heal_location.id }} - 1] = { MAP_GROUP({{ heal_location.respawn_map }}), MAP_NUM({{ heal_location.respawn_map }}), {% if existsIn(heal_location, "respawn_x") %}{{ heal_location.respawn_x }}{% else %}DEFAULT_POKEMON_CENTER_X{% endif %}, {% if existsIn(heal_location, "respawn_y") %}{{ heal_location.respawn_y }}{% else %}DEFAULT_POKEMON_CENTER_Y{% endif %}}, {% endif %} ## endfor }; +#undef DEFAULT_POKEMON_CENTER_X +#undef DEFAULT_POKEMON_CENTER_Y + static const u8 sWhiteoutRespawnHealerNpcIds[] = { ## for heal_location in heal_locations {% if existsIn(heal_location, "respawn_npc") %} diff --git a/src/data/heal_locations_pkm_center.h b/src/data/heal_locations_pkm_center.h deleted file mode 100644 index 388f77d5ec..0000000000 --- a/src/data/heal_locations_pkm_center.h +++ /dev/null @@ -1,175 +0,0 @@ -#define DEFAULT_POKEMON_CENTER_COORDS .x = 7, .y = 4 - -static const struct HealLocation sHealLocationsPokemonCenter[NUM_HEAL_LOCATIONS - 1] = -{ - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .x = 2, - .y = 7, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .x = 8, - .y = 7, - }, - [HEAL_LOCATION_PETALBURG_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_PETALBURG_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_PETALBURG_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_SLATEPORT_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_SLATEPORT_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_MAUVILLE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_MAUVILLE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_RUSTBORO_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_RUSTBORO_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_FORTREE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_FORTREE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_FORTREE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_LILYCOVE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_LILYCOVE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = - { - .mapGroup = MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F), - .x = 2, - .y = 7, - }, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = - { - .mapGroup = MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .mapNum = MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F), - .x = 8, - .y = 7, - }, - [HEAL_LOCATION_OLDALE_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_OLDALE_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_OLDALE_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_DEWFORD_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_DEWFORD_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = - { - .mapGroup = MAP_GROUP(MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = - { - .mapGroup = MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), - .mapNum = MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), - .x = 3, - .y = 4, - }, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = - { - .mapGroup = MAP_GROUP(MAP_SOUTHERN_ISLAND_EXTERIOR), - .mapNum = MAP_NUM(MAP_SOUTHERN_ISLAND_EXTERIOR), - .x = 15, - .y = 20, - }, - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = - { - .mapGroup = MAP_GROUP(MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F), - .mapNum = MAP_NUM(MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F), - DEFAULT_POKEMON_CENTER_COORDS, - }, -}; - -#undef DEFAULT_POKEMON_CENTER_COORDS - -// localIds can be found in the generated events.inc file for the specific heal location map -// e.g. for OldaleTown_PokemonCenter1F/events.inc the following entry gets generated: -// object_event 1, OBJ_EVENT_GFX_NURSE, 7, 2, 3, MOVEMENT_TYPE_FACE_DOWN, 0, 0, TRAINER_TYPE_NONE, 0, OldaleTown_PokemonCenter_1F_EventScript_Nurse, 0 -// In this case the localId is 1. -static const u8 sHealNpcLocalId[NUM_HEAL_LOCATIONS - 1] = -{ - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = 1, - [HEAL_LOCATION_PETALBURG_CITY - 1] = 1, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = 1, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = 1, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = 1, - [HEAL_LOCATION_FORTREE_CITY - 1] = 1, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = 1, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = 1, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = 1, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = 1, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = 1, - [HEAL_LOCATION_OLDALE_TOWN - 1] = 1, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = 1, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = 1, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = 1, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = 1, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = 1, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = 1, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = 0, // no heal npc - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = 1, -}; diff --git a/src/heal_location.c b/src/heal_location.c index b261fce17d..fd376e71e0 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -1,11 +1,11 @@ #include "global.h" #include "event_data.h" #include "heal_location.h" +#include "constants/event_objects.h" #include "constants/heal_locations.h" #include "constants/maps.h" #include "data/heal_locations.h" -#include "data/heal_locations_pkm_center.h" u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) { @@ -81,14 +81,13 @@ u32 GetHealNpcLocalId(u32 healLocationId) if (healLocationId == HEAL_LOCATION_NONE || healLocationId >= NUM_HEAL_LOCATIONS) return 0; - return sHealNpcLocalId[healLocationId - 1]; + return sWhiteoutRespawnHealerNpcIds[healLocationId - 1]; } void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) { u32 healLocationId = GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation); u32 healNpcLocalId = GetHealNpcLocalId(healLocationId); - struct HealLocation pkmCenterHealLocation; if (!healNpcLocalId) { @@ -96,11 +95,10 @@ void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp) return; } - pkmCenterHealLocation = sHealLocationsPokemonCenter[healLocationId - 1]; - warp->mapGroup = pkmCenterHealLocation.mapGroup; - warp->mapNum = pkmCenterHealLocation.mapNum; + warp->mapGroup = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][0]; + warp->mapNum = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][1]; warp->warpId = WARP_ID_NONE; - warp->x = pkmCenterHealLocation.x; - warp->y = pkmCenterHealLocation.y; + warp->x = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][2]; + warp->y = sWhiteoutRespawnHealCenterMapIdxs[healLocationId - 1][3]; gSpecialVar_LastTalked = healNpcLocalId; } From 872bb8785b88adf883f8d4f2bbeb6b6b74f82448 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sun, 8 Jun 2025 10:52:37 -0500 Subject: [PATCH 041/248] Simplify white out messages (#6961) --- data/battle_scripts_1.s | 20 ++++++++++---------- include/constants/battle_string_ids.h | 7 +++---- src/battle_message.c | 11 +++-------- test/text.c | 4 ++-- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bd920dbc29..aab7bff6b3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5428,23 +5428,23 @@ BattleScript_LocalBattleLost:: jumpifnowhiteout BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintWhiteOut:: getmoneyreward -.if B_WHITEOUT_MONEY >= GEN_4 - jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd printstring STRINGID_PLAYERWHITEOUT waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERWHITEOUT2 +.if B_WHITEOUT_MONEY >= GEN_4 + jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd + printstring STRINGID_PLAYERWHITEOUT2_WILD + waitmessage B_WAIT_TIME_LONG + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG end2 BattleScript_LocalBattleLostEnd:: - printstring STRINGID_PLAYERLOSTTOENEMYTRAINER + printstring STRINGID_PLAYERWHITEOUT2_TRAINER waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERPAIDPRIZEMONEY + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG end2 .else - printstring STRINGID_PLAYERWHITEOUT - waitmessage B_WAIT_TIME_LONG - printstring STRINGID_PLAYERWHITEOUT2 + printstring STRINGID_PLAYERWHITEOUT3 waitmessage B_WAIT_TIME_LONG BattleScript_LocalBattleLostEnd:: end2 @@ -10063,9 +10063,9 @@ BattleScript_QuestionForfeitBattle:: BattleScript_ForfeitBattleGaveMoney:: getmoneyreward .if B_WHITEOUT_MONEY >= GEN_4 - printstring STRINGID_FORFEITBATTLEGAVEMONEY + printstring STRINGID_PLAYERWHITEOUT2_TRAINER .else - printstring STRINGID_PLAYERWHITEOUT2 + printstring STRINGID_PLAYERWHITEOUT3 .endif waitmessage B_WAIT_TIME_LONG end2 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 8e8503458d..680ea413d8 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -32,7 +32,9 @@ enum StringID STRINGID_TARGETFAINTED, STRINGID_PLAYERGOTMONEY, STRINGID_PLAYERWHITEOUT, - STRINGID_PLAYERWHITEOUT2, + STRINGID_PLAYERWHITEOUT2_WILD, + STRINGID_PLAYERWHITEOUT2_TRAINER, + STRINGID_PLAYERWHITEOUT3, STRINGID_PREVENTSESCAPE, STRINGID_HITXTIMES, STRINGID_PKMNFELLASLEEP, @@ -611,8 +613,6 @@ enum StringID STRINGID_METEORBEAMCHARGING, STRINGID_HEATUPBEAK, STRINGID_COURTCHANGE, - STRINGID_PLAYERLOSTTOENEMYTRAINER, - STRINGID_PLAYERPAIDPRIZEMONEY, STRINGID_ZPOWERSURROUNDS, STRINGID_ZMOVEUNLEASHED, STRINGID_ZMOVERESETSSTATS, @@ -734,7 +734,6 @@ enum StringID STRINGID_TIMETODYNAMAX, STRINGID_TIMETOGIGANTAMAX, STRINGID_QUESTIONFORFEITBATTLE, - STRINGID_FORFEITBATTLEGAVEMONEY, STRINGID_TOXICSPIKESBADLYPOISONED, STRINGID_POWERCONSTRUCTPRESENCEOFMANY, STRINGID_POWERCONSTRUCTTRANSFORM, diff --git a/src/battle_message.c b/src/battle_message.c index d46ead7669..98a44a1ef7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -191,11 +191,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TARGETFAINTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fainted!\p"), [STRINGID_PLAYERGOTMONEY] = COMPOUND_STRING("You got ¥{B_BUFF1} for winning!\p"), [STRINGID_PLAYERWHITEOUT] = COMPOUND_STRING("You have no more Pokémon that can fight!\p"), -#if B_WHITEOUT_MONEY >= GEN_4 - [STRINGID_PLAYERWHITEOUT2] = COMPOUND_STRING("You panicked and dropped ¥{B_BUFF1}…\pYou were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), -#else - [STRINGID_PLAYERWHITEOUT2] = COMPOUND_STRING("You were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), -#endif + [STRINGID_PLAYERWHITEOUT2_WILD] = COMPOUND_STRING("You panicked and dropped ¥{B_BUFF1}…"), + [STRINGID_PLAYERWHITEOUT2_TRAINER] = COMPOUND_STRING("You gave ¥{B_BUFF1} to the winner…"), + [STRINGID_PLAYERWHITEOUT3] = COMPOUND_STRING("You were overwhelmed by your defeat!"), [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p"), [STRINGID_HITXTIMES] = COMPOUND_STRING("The Pokémon was hit {B_BUFF1} time(s)!"), //SV has dynamic plural here [STRINGID_PKMNFELLASLEEP] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} fell asleep!"), @@ -775,8 +773,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_METEORBEAMCHARGING] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is overflowing with space power!"), [STRINGID_HEATUPBEAK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} started heating up its beak!"), [STRINGID_COURTCHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} swapped the battle effects affecting each side of the field!"), - [STRINGID_PLAYERLOSTTOENEMYTRAINER] = COMPOUND_STRING("You have no more Pokémon that can fight!\pYou lost to {B_TRAINER1_NAME_WITH_CLASS}!{PAUSE_UNTIL_PRESS}"), - [STRINGID_PLAYERPAIDPRIZEMONEY] = COMPOUND_STRING("You gave ¥{B_BUFF1} to the winner…\pYou were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), [STRINGID_ZPOWERSURROUNDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} surrounded itself with its Z-Power!"), [STRINGID_ZMOVEUNLEASHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} unleashes its full-force Z-Move!"), [STRINGID_ZMOVERESETSSTATS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!"), @@ -898,7 +894,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TIMETODYNAMAX] = COMPOUND_STRING("Time to Dynamax!"), [STRINGID_TIMETOGIGANTAMAX] = COMPOUND_STRING("Time to Gigantamax!"), [STRINGID_QUESTIONFORFEITBATTLE] = COMPOUND_STRING("Would you like to give up on this battle and quit now? Quitting the battle is the same as losing the battle."), - [STRINGID_FORFEITBATTLEGAVEMONEY] = COMPOUND_STRING("You gave ¥{B_BUFF1} to the winner…{PAUSE_UNTIL_PRESS}"), [STRINGID_POWERCONSTRUCTPRESENCEOFMANY] = COMPOUND_STRING("You sense the presence of many!"), [STRINGID_POWERCONSTRUCTTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into its Complete Forme!"), }; diff --git a/test/text.c b/test/text.c index e2eed3af93..0a5a4dd2a2 100644 --- a/test/text.c +++ b/test/text.c @@ -682,9 +682,9 @@ TEST("Battle strings fit on the battle message window") break; // Buffer "999999" to B_BUFF1 case STRINGID_PLAYERGOTMONEY: - case STRINGID_PLAYERWHITEOUT2: + case STRINGID_PLAYERWHITEOUT2_TRAINER: case STRINGID_PLAYERPICKEDUPMONEY: - case STRINGID_PLAYERPAIDPRIZEMONEY: + case STRINGID_PLAYERWHITEOUT2_WILD: PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff1, 6, sixDigitNines); break; // Buffer "99" to B_BUFF1 From f4ff5e6d267b2e1a07b218fca6b31688da034d98 Mon Sep 17 00:00:00 2001 From: Emilia Daelman <48217459+Emiliasky@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:50:34 +0200 Subject: [PATCH 042/248] Feature/ai/wide guard quick guard singles (#7086) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_ai_util.h | 3 ++- src/battle_ai_main.c | 24 ++++++++++++++----- src/battle_ai_util.c | 37 +++++++++++++++++++---------- test/battle/ai/ai_check_viability.c | 25 +++++++++++++++++++ 4 files changed, 69 insertions(+), 20 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 345212ec47..75a08f5b4a 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -167,7 +167,8 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); -void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score); +bool32 IsBattlerDamagedByStatus(u32 battler); +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove); bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 3a7cdb410d..9924dc74c4 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2202,7 +2202,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (protectMethod) { case PROTECT_QUICK_GUARD: + if (GetMovePriority(predictedMove) <= 0) + { + ADJUST_SCORE(-10); + decreased = TRUE; + } case PROTECT_WIDE_GUARD: + if(!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) + { + ADJUST_SCORE(-10); + decreased = TRUE; + } case PROTECT_CRAFTY_SHIELD: if (!isDoubleBattle) { @@ -4288,28 +4298,30 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { case PROTECT_QUICK_GUARD: if (predictedMove != MOVE_NONE && GetMovePriority(predictedMove) > 0) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + { + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); + } break; case PROTECT_WIDE_GUARD: if (predictedMove != MOVE_NONE && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH)) { - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } else if (isDoubleBattle && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) { if (aiData->abilities[battlerAtk] != ABILITY_TELEPATHY) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } break; case PROTECT_CRAFTY_SHIELD: if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; case PROTECT_MAT_BLOCK: if (gDisableStructs[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE && !IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; case PROTECT_KINGS_SHIELD: if (aiData->abilities[battlerAtk] == ABILITY_STANCE_CHANGE //Special logic for Aegislash @@ -4321,7 +4333,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } //fallthrough default: // protect - ProtectChecks(battlerAtk, battlerDef, move, predictedMove, &score); + ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; } break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5d263e9b56..c9363e344a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1893,8 +1893,19 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) return FALSE; } -void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score) +bool32 IsBattlerDamagedByStatus(u32 battler) { + return gBattleMons[battler].status1 & (STATUS1_BURN | STATUS1_FROSTBITE | STATUS1_POISON | STATUS1_TOXIC_POISON) + || gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_NIGHTMARE | STATUS2_CURSED) + || gStatuses3[battler] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED) + || gStatuses4[battler] & (STATUS4_SALT_CURE) + || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); +} + +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) +{ + s32 score = 0; + // TODO more sophisticated logic u32 uses = gDisableStructs[battlerAtk].protectUses; @@ -1907,29 +1918,29 @@ void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, if (uses == 0) { if (predictedMove != MOVE_NONE && predictedMove != 0xFFFF && !IsBattleMoveStatus(predictedMove)) - ADJUST_SCORE_PTR(DECENT_EFFECT); + score += DECENT_EFFECT; else if (Random() % 256 < 100) - ADJUST_SCORE_PTR(WEAK_EFFECT); + score += WEAK_EFFECT; } else { if (IsDoubleBattle()) - ADJUST_SCORE_PTR(-(2 * min(uses, 3))); + score -= (2 * min(uses, 3)); else - ADJUST_SCORE_PTR(-(min(uses, 3))); + score -= (min(uses, 3)); } - if (gBattleMons[battlerAtk].status1 & (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_FROSTBITE) - || gBattleMons[battlerAtk].status2 & (STATUS2_CURSED | STATUS2_INFATUATION) - || gStatuses3[battlerAtk] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN)) + if (IsBattlerDamagedByStatus(battlerAtk)) { - ADJUST_SCORE_PTR(-1); + score -= 1; } - if (gBattleMons[battlerDef].status1 & STATUS1_TOXIC_POISON - || gBattleMons[battlerDef].status2 & (STATUS2_CURSED | STATUS2_INFATUATION) - || gStatuses3[battlerDef] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN)) - ADJUST_SCORE_PTR(DECENT_EFFECT); + if (IsBattlerDamagedByStatus(battlerDef)) + { + score += DECENT_EFFECT; + } + + return score; } // stat stages diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index f80597f476..0a5a9ff3df 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -1,6 +1,9 @@ +#include "constants/battle_ai.h" +#include "constants/moves.h" #include "global.h" #include "test/battle.h" #include "battle_ai_util.h" +#include "test/test.h" ASSUMPTIONS { @@ -253,3 +256,25 @@ AI_SINGLE_BATTLE_TEST("AI prioritizes Pursuit if it would KO opponent") TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_PURSUIT); SEND_OUT(player, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Quick Guard against Quick Attack when opponent would die of poison") +{ + GIVEN { + PLAYER(SPECIES_ZUBAT) { Moves(MOVE_QUICK_ATTACK); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_QUICK_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_QUICK_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would die of poison") +{ + GIVEN { + PLAYER(SPECIES_ZUBAT) { Moves(MOVE_EARTHQUAKE); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_WIDE_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } + } +} From fd856e50683364fdbbff3f9dbf84b8e1e54a8036 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:30:16 +0200 Subject: [PATCH 043/248] Removes duplicate AI ability func (#7045) Co-authored-by: Bassoonian --- include/battle.h | 13 +++++-------- include/battle_ai_util.h | 5 ++--- include/battle_util.h | 2 ++ src/battle_ai_switch_items.c | 6 +++--- src/battle_ai_util.c | 18 +----------------- src/battle_util.c | 22 +++++++++++++++------- test/battle/ai/ai_switching.c | 2 +- 7 files changed, 29 insertions(+), 39 deletions(-) diff --git a/include/battle.h b/include/battle.h index 77da1c4f0a..086c9b25be 100644 --- a/include/battle.h +++ b/include/battle.h @@ -760,10 +760,9 @@ struct BattleStruct u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party - u8 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects - s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg - u8 cheekPouchActivated:1; - u8 padding2:3; + u16 opponentMonCanTera:6; + u16 opponentMonCanDynamax:6; + u16 additionalEffectsCounter:4; // A counter for the additionalEffects applied by the current move in Cmd_setadditionaleffects u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch s32 battlerExpReward; u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn @@ -777,13 +776,11 @@ struct BattleStruct u8 calculatedSpreadMoveAccuracy:1; u8 printedStrongWindsWeakenedAttack:1; u8 numSpreadTargets:2; - u8 bypassMoldBreakerChecks:1; // for ABILITYEFFECT_IMMUNITY u8 noTargetPresent:1; + u8 cheekPouchActivated:1; + s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; - u16 opponentMonCanTera:6; - u16 opponentMonCanDynamax:6; - u16 padding:4; }; struct AiBattleData diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 75a08f5b4a..0a70acce1f 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -38,7 +38,7 @@ enum WeatherState WEATHER_INACTIVE_AND_BLOCKED, }; -enum AIConsiderGimmick +enum AIConsiderGimmick { NO_GIMMICK, USE_GIMMICK, @@ -115,9 +115,8 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); -bool32 IsAIUsingGimmick(u32 battler); +bool32 IsAIUsingGimmick(u32 battler); void DecideTerastal(u32 battler); -u32 AI_GetBattlerAbility(u32 battler); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); diff --git a/include/battle_util.h b/include/battle_util.h index 4870330361..53de080665 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -243,6 +243,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability); +u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler); +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker); u32 GetBattlerAbility(u32 battler); u32 IsAbilityOnSide(u32 battler, u32 ability); u32 IsAbilityOnOpposingSide(u32 battler, u32 ability); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index fdfefd7238..6aa5bf16b6 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -628,7 +628,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) monAbility = GetMonAbility(&party[i]); - if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && monAbility == ABILITY_TRACE)) + if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) @@ -1990,7 +1990,7 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi return TRUE; if (gAiLogicData->ejectPackSwitch) { - u32 opposingAbility = AI_GetBattlerAbility(opposingBattler); + u32 opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler); // If faster, not a free switch; likely lowered own stats if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts return FALSE; @@ -2160,7 +2160,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // If mon can trap if ((CanAbilityTrapOpponent(gAiLogicData->switchinCandidate.battleMon.ability, opposingBattler) - || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) + || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) && CountUsablePartyMons(opposingBattler) > 0 && canSwitchinWin1v1) trapperId = i; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c9363e344a..dbbd30c68a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1419,28 +1419,12 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) return FALSE; } -u32 AI_GetBattlerAbility(u32 battler) -{ - if (gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed) - return gBattleMons[battler].ability; - - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) - return ABILITY_NONE; - - if (IsNeutralizingGasOnField() - && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS - && GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) - return ABILITY_NONE; - - return gBattleMons[battler].ability; -} - // does NOT include ability suppression checks s32 AI_DecideKnownAbilityForTurn(u32 battlerId) { u32 validAbilities[NUM_ABILITY_SLOTS]; u8 i, numValidAbilities = 0; - u32 knownAbility = AI_GetBattlerAbility(battlerId); + u32 knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); // during ai checking for mold breaker could lead to inaccuracies u32 indexAbility; u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; diff --git a/src/battle_util.c b/src/battle_util.c index d6034a1478..7efebde7c2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5000,10 +5000,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_IMMUNITY: - gBattleStruct->bypassMoldBreakerChecks = TRUE; for (battler = 0; battler < gBattlersCount; battler++) { - switch (GetBattlerAbility(battler)) + switch (GetBattlerAbilityIgnoreMoldBreaker(battler)) { case ABILITY_IMMUNITY: case ABILITY_PASTEL_VEIL: @@ -5089,7 +5088,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 return effect; } } - gBattleStruct->bypassMoldBreakerChecks = FALSE; break; case ABILITYEFFECT_SYNCHRONIZE: if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONIZE_EFFECT)) @@ -5330,9 +5328,9 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))); } -static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield) +static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield, u32 ignoreMoldBreaker) { - if (hasAbilityShield || gBattleStruct->bypassMoldBreakerChecks) + if (hasAbilityShield || ignoreMoldBreaker) return FALSE; return ((IsMoldBreakerTypeAbility(battlerAtk, ability) || MoveIgnoresTargetAbility(gCurrentMove)) @@ -5343,7 +5341,17 @@ static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 && gCurrentTurnActionNumber < gBattlersCount); } +u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler) +{ + return GetBattlerAbilityInternal(battler, TRUE); +} + u32 GetBattlerAbility(u32 battler) +{ + return GetBattlerAbilityInternal(battler, FALSE); +} + +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker) { bool32 hasAbilityShield = GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; @@ -5356,7 +5364,7 @@ u32 GetBattlerAbility(u32 battler) && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; @@ -5370,7 +5378,7 @@ u32 GetBattlerAbility(u32 battler) && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index d1378812f1..7a7fd64864 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -388,7 +388,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_STARAPTOR) { Level(30); Ability(ABILITY_INTIMIDATE); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } From bc864c2519aefb0a49fce6a52c618bfb75baaaf7 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 9 Jun 2025 13:17:05 +0200 Subject: [PATCH 044/248] Fix .smol compression in debug builds (#7090) Co-authored-by: sbird Co-authored-by: Hedara Co-authored-by: DizzyEggg --- src/decompress.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/decompress.c b/src/decompress.c index 2490059cd0..d0868536ea 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -327,7 +327,7 @@ void DecompressDataWithHeaderWram(const u32 *src, void *dest) REP##ONES(X) // Unpack packed tANS encoded data symbol frequences into their individual parts -static inline void UnpackFrequenciesLoop(const u32 *packedFreqs, u16 *freqs, u32 i) +static __attribute__((always_inline)) inline void UnpackFrequenciesLoop(const u32 *packedFreqs, u16 *freqs, u32 i) { // Loop unpack freqs[i*5 + 0] = (packedFreqs[i] >> (6*0)) & PACKED_FREQ_MASK; @@ -339,7 +339,7 @@ static inline void UnpackFrequenciesLoop(const u32 *packedFreqs, u16 *freqs, u32 freqs[15] += (packedFreqs[i] & PARTIAL_FREQ_MASK) >> (30 - 2*i); } -static inline void UnpackFrequencies(const u32 *packedFreqs, u16 *freqs) +static __attribute__((always_inline)) inline void UnpackFrequencies(const u32 *packedFreqs, u16 *freqs) { freqs[15] = 0; @@ -397,6 +397,9 @@ static IWRAM_DATA u8 sBitIndex = 0; static IWRAM_DATA const u32 *sDataPtr = 0; static IWRAM_DATA u32 sCurrState = 0; +// 33 because of FastUnsafeCopy32, we divide by 4 because the buffer is an array of u32 +#define FUNC_BUFFER_SIZE(funcStart, funcEnd)(((u32)(funcEnd) - (u32)(funcStart) + 33) / 4) + extern void FastUnsafeCopy32(void *, const void *, u32 size); // Dark Egg magic @@ -432,7 +435,7 @@ static inline void CopyFuncToIwram(void *funcBuffer, const void *funcStartAddres // Inner loop of tANS decoding for Lengths and Offset data for decompression instructions, uses u8 data sizes // Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state // from the y and k values for the current state and add the value read from the next k bits in the bitstream -ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeLOtANSLoop(const u32 *data, u32 *ykTable, u8 *resultVec, u8 *resultVecEnd) +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeLOtANSLoop(const u32 *data, u32 *ykTable, u8 *resultVec, u8 *resultVecEnd) { u32 currBits = *data++; u32 bitIndex = sBitIndex; @@ -520,7 +523,7 @@ static void DecodeLOtANS(const u32 *data, const u32 *pFreqs, u8 *resultVec, u32 // We want to store in packs of 2, so count needs to be divisible by 2 u32 remainingCount = count % 2; - u32 funcBuffer[400]; + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeLOtANSLoop, SwitchToArmCallLOtANS)]; CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); SwitchToArmCallLOtANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); @@ -554,7 +557,7 @@ static void DecodeLOtANS(const u32 *data, const u32 *pFreqs, u8 *resultVec, u32 // The reason this function is UNUSED, because it's currently exactly the same as `DecodeLOtANSLoop`(as it was optimized out for halfwords and not bytes as it's technically designed). // If ever DecodeLOtANSLoop or DecodeSymtANSLoop were to change make sure to uncomment the 'CopyFuncToIwram' call. -ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) UNUSED static void DecodeSymtANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) UNUSED static void DecodeSymtANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) { u32 currBits = *data++; u32 bitIndex = sBitIndex; @@ -596,7 +599,7 @@ static void DecodeSymtANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u3 { BuildDecompressionTable(pFreqs, sWorkingYkTable); - u32 funcBuffer[300]; + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeLOtANSLoop, SwitchToArmCallLOtANS)]; // CopyFuncToIwram(funcBuffer, DecodeSymtANSLoop, SwitchToArmCallDecodeSymtANS); CopyFuncToIwram(funcBuffer, DecodeLOtANSLoop, SwitchToArmCallLOtANS); SwitchToArmCallDecodeSymtANS(data, sWorkingYkTable, resultVec, &resultVec[count], (void *) funcBuffer); @@ -616,7 +619,7 @@ static void DecodeSymtANS(const u32 *data, const u32 *pFreqs, u16 *resultVec, u3 // Inner loop of tANS decoding for delta encoded symbol data, uses u16 data size // Basic process for decoding a tANS encoded value is to read the current symbol from the decoding table, then calculate the next state // from the y and k values for the current state and add the value read from the next k bits in the bitstream -ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) u32 DecodeSymDeltatANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) u32 DecodeSymDeltatANSLoop(const u32 *data, u32 *ykTable, u16 *resultVec, u16 *resultVecEnd) { u32 currBits = *data++; u32 currSymbol = 0; @@ -775,7 +778,7 @@ static void DecodeSymDeltatANS(const u32 *data, const u32 *pFreqs, u16 *resultVe // We want to store in packs of 2, so count needs to be divisible by 2 u32 remainingCount = count % 2; - u32 funcBuffer[450]; + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeSymDeltatANSLoop, SwitchToArmCallSymDeltaANS)]; CopyFuncToIwram(funcBuffer, DecodeSymDeltatANSLoop, SwitchToArmCallSymDeltaANS); u32 currSymbol = SwitchToArmCallSymDeltaANS(data, sWorkingYkTable, resultVec, &resultVec[count - remainingCount], (void *) funcBuffer); @@ -829,7 +832,7 @@ static void DecodeSymDeltatANS(const u32 *data, const u32 *pFreqs, u16 *resultVe } } -static inline void Fill16(u16 value, void *_dst, u32 size) +static __attribute__((always_inline)) inline void Fill16(u16 value, void *_dst, u32 size) { u16 *dst = _dst; for (u32 i = 0; i < size; i++) { @@ -837,7 +840,7 @@ static inline void Fill16(u16 value, void *_dst, u32 size) } } -static inline void Copy16(const void *_src, void *_dst, u32 size) +static __attribute__((always_inline)) inline void Copy16(const void *_src, void *_dst, u32 size) { const u16 *src = _src; u16 *dst = _dst; @@ -857,7 +860,7 @@ static inline void Copy16(const void *_src, void *_dst, u32 size) // Insert the current value from the Symbol vector into current result position times, then advance symbol vector by 1 // If length is 0: // Insert number of symbols from the symbol vector into the result vector and advance the symbol vector position by -ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, u16 *dest) +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DecodeInstructions(u32 headerLoSize, const u8 *loVec, const u16 *symVec, u16 *dest) { const u8 *loVecEnd = loVec + headerLoSize; do @@ -931,7 +934,7 @@ ARM_FUNC __attribute__((no_reorder)) static void SwitchToArmCallDecodeInstructio // Dark Egg magic static void DecodeInstructionsIwram(u32 headerLoSize, const u8 *loVec, const u16 *symVec, void *dest) { - u32 funcBuffer[350]; + u32 funcBuffer[FUNC_BUFFER_SIZE(DecodeInstructions, SwitchToArmCallDecodeInstructions)]; CopyFuncToIwram(funcBuffer, DecodeInstructions, SwitchToArmCallDecodeInstructions); SwitchToArmCallDecodeInstructions(headerLoSize, loVec, symVec, dest, (void *) funcBuffer); @@ -1032,7 +1035,7 @@ static void SmolDecompressData(const struct SmolHeader *header, const u32 *data, Free(memoryAlloced); } -ARM_FUNC __attribute__((noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DeltaDecodeTileNumbers(u16 *tileNumbers, u32 arraySize) +ARM_FUNC __attribute__((flatten, noinline, no_reorder)) __attribute__((optimize("-O3"))) static void DeltaDecodeTileNumbers(u16 *tileNumbers, u32 arraySize) { u32 prevVal = 0; u32 reminder = arraySize % 8; @@ -1087,7 +1090,7 @@ static void SmolDecompressTilemap(const struct SmolTilemapHeader *header, const DecodeInstructionsIwram(header->tileNumberSize, loVec, symVec, dest); u32 arraySize = header->tilemapSize/2; - u32 funcBuffer[100]; + u32 funcBuffer[FUNC_BUFFER_SIZE(DeltaDecodeTileNumbers, SwitchToArmCallDecodeTileNumbers)]; CopyFuncToIwram(funcBuffer, DeltaDecodeTileNumbers, SwitchToArmCallDecodeTileNumbers); SwitchToArmCallDecodeTileNumbers(deltaDest, arraySize, (void *) funcBuffer); From 260813fc3f10d8bbeaf6afaa7eeb1ab885f50b6e Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Mon, 9 Jun 2025 18:28:00 +0200 Subject: [PATCH 045/248] Improve smol compressor (#7073) Co-authored-by: Hedara --- Makefile | 2 +- tools/compresSmol/Makefile | 10 +- tools/compresSmol/compresSmol.cpp | 114 +- tools/compresSmol/compressAlgo.cpp | 1964 +++++++++++------------ tools/compresSmol/compressAlgo.h | 65 +- tools/compresSmol/compressSmolTiles.cpp | 12 +- tools/compresSmol/mainTiles.cpp | 2 + tools/compresSmol/tANS.cpp | 2 + 8 files changed, 961 insertions(+), 1210 deletions(-) diff --git a/Makefile b/Makefile index b01624ac81..8d3c5ad9a2 100644 --- a/Makefile +++ b/Makefile @@ -319,7 +319,7 @@ clean-assets: rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc $(DATA_SRC_SUBDIR)/map_group_count.h find sound -iname '*.bin' -exec rm {} + - find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.smol' -o -iname '*.fastSmol' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.smol' -o -iname '*.fastSmol' -o -iname '*.smolTM' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + tidy: tidymodern tidycheck tidydebug diff --git a/tools/compresSmol/Makefile b/tools/compresSmol/Makefile index 768de9d4a7..e4799483f7 100644 --- a/tools/compresSmol/Makefile +++ b/tools/compresSmol/Makefile @@ -1,14 +1,14 @@ CXX ?= g++ -CXXFLAGS := -Werror -std=c++17 -pthread -O2 -Wunused +CXXFLAGS := -Werror -std=c++17 -O2 INCLUDES := -I . -SRCS := compresSmol.cpp compressAlgo.cpp tANS.cpp fileDispatcher.cpp -TILEMAP_SRCS := mainTiles.cpp compressAlgo.cpp compressSmolTiles.cpp tANS.cpp fileDispatcher.cpp +SRCS := compresSmol.cpp compressAlgo.cpp tANS.cpp +TILEMAP_SRCS := mainTiles.cpp compressSmolTiles.cpp tANS.cpp compressAlgo.cpp -HEADERS := compressAlgo.h tANS.h fileDispatcher.h -TILEMAP_HEADERS := compressAlgo.h compressSmolTiles.h tANS.h fileDispatcher.h +HEADERS := compressAlgo.h tANS.h +TILEMAP_HEADERS := compressSmolTiles.h tANS.h compressAlgo.h ifeq ($(OS),Windows_NT) EXE := .exe diff --git a/tools/compresSmol/compresSmol.cpp b/tools/compresSmol/compresSmol.cpp index 80d7ae9f88..1f7d2b1cb3 100644 --- a/tools/compresSmol/compresSmol.cpp +++ b/tools/compresSmol/compresSmol.cpp @@ -18,7 +18,6 @@ bool isNumber(std::string input) } enum Option { - ANALYZE, WRITE, FRAME_WRITE, DECODE, @@ -31,15 +30,12 @@ int main(int argc, char *argv[]) bool printUsage = false; std::string input; std::string output; - int numThreads = 1; InputSettings settings(true, true, true); if (argc > 1) { std::string argument = argv[1]; - if (argument.compare("-a") == 0) - option = ANALYZE; - else if (argument.compare("-w") == 0) + if (argument.compare("-w") == 0) option = WRITE; else if (argument.compare("-fw") == 0) option = FRAME_WRITE; @@ -48,46 +44,12 @@ int main(int argc, char *argv[]) } switch (option) { - case ANALYZE: - if (argc > 2) - input = argv[2]; - else - printUsage = true; - if (argc > 4) - { - std::string arg2 = argv[3]; - std::string arg2arg = argv[4]; - if (arg2.compare("-t") == 0 && isNumber(arg2arg)) - numThreads = std::stoi(arg2arg.c_str()); - } - if (argc > 7) - { - std::string setting1 = argv[5]; - std::string setting2 = argv[6]; - std::string setting3 = argv[7]; - if (setting1.compare("true") == 0) - settings.canEncodeLO = true; - else if (setting1.compare("false") == 0) - settings.canEncodeLO = false; - else - fprintf(stderr, "Unrecognized setting1 \"%s\", defaulting to \"true\"\n", setting1.c_str()); - if (setting2.compare("true") == 0) - settings.canEncodeSyms = true; - else if (setting2.compare("false") == 0) - settings.canEncodeSyms = false; - else - fprintf(stderr, "Unrecognized setting2 \"%s\", defaulting to \"true\"\n", setting2.c_str()); - if (setting3.compare("true") == 0) - settings.canDeltaSyms = true; - else if (setting3.compare("false") == 0) - settings.canDeltaSyms = false; - else - fprintf(stderr, "Unrecognized setting3 \"%s\", defaulting to \"true\"\n", setting3.c_str()); - } - break; case FRAME_WRITE: + // Not implemented yet + fprintf(stderr, "Frame writing isn't implemented yet\n"); settings.useFrames = true; option = WRITE; + return 1; case WRITE: if (argc > 3) { @@ -141,10 +103,6 @@ int main(int argc, char *argv[]) if (printUsage) { printf("Usage:\n\ - %s -a \"path/to/some/directory\"\n\ - Analyses all images currently in .4bpp.lz format and compares with this compression.\n\ - -t can be appended to this mode to specify how many threads to use.\n\ - \n\ %s -w \"path/to/some/file.4bpp\" \"path/to/some/file.4bpp.smol\"\ Compresses the first argument and writes the result to the second argument.\n\ These modes can also be appended with 4 true/false statements that control the following settings of the compression:\n\ @@ -153,64 +111,11 @@ int main(int argc, char *argv[]) - If the compression instructions can be delta encoded.\n\ - If the raw symbols in the compression ca be delta encoded.\n\ %s -d \"path/to/some/file.4bpp.smol\" \"path/to/some/file.4bpp\"\n\ - Decompresses the first argument and writes it to the second argument.", argv[0], argv[0], argv[0]); + Decompresses the first argument and writes it to the second argument.", argv[0], argv[0]); return 0; } - if (option == ANALYZE) - { - std::filesystem::path dirPath = input; - FileDispatcher dispatcher(dirPath); - if (!dispatcher.initFileList()) - { - fprintf(stderr, "Failed to init file list\n"); - return 1; - } - std::mutex dispatchMutex; - std::vector allImages; - std::mutex imageMutex; - - settings.shouldCompare = true; - - std::vector threads; - for (int i = 0; i < numThreads; i++) - { - threads.emplace_back(analyzeImages, &allImages, &imageMutex, - &dispatcher, &dispatchMutex, - settings); - } - - for (int i = 0; i < numThreads; i++) - threads[i].join(); - - size_t lzSizes = 0; - size_t newSizes = 0; - size_t rawSizes = 0; - size_t totalImages = 0; - size_t invalidImages = 0; - for (CompressedImage currImage : allImages) - { - totalImages++; - if (currImage.isValid) - { - lzSizes += currImage.lzSize; - newSizes += currImage.compressedSize; - rawSizes += currImage.rawNumBytes; - } - else - { - fprintf(stderr, "Failed to solve %s\n", currImage.fileName.c_str()); - invalidImages++; - } - } - - fprintf(stderr, "RawSize: %zu\n", rawSizes); - fprintf(stderr, "LZsize: %zu\n", lzSizes); - fprintf(stderr, "SmolSize: %zu\n", newSizes); - fprintf(stderr, "Total Images: %zu\n", totalImages); - fprintf(stderr, "Invalid Images: %zu\n", invalidImages); - } if (option == WRITE) { if (std::filesystem::exists(input)) @@ -240,8 +145,13 @@ int main(int argc, char *argv[]) { if (std::filesystem::exists(input)) { - std::vector inData = readFileAsUInt(input); - std::vector image4bpp = readRawDataVecs(&inData); + std::vector inData; + if (!readFileAsUInt(input, &inData)) + { + return 0; + } + std::vector image4bpp; + readRawDataVecs(&inData, &image4bpp); std::vector charVec(image4bpp.size()*2); for (size_t i = 0; i < image4bpp.size(); i++) { diff --git a/tools/compresSmol/compressAlgo.cpp b/tools/compresSmol/compressAlgo.cpp index 07ac59da81..261abcf24a 100644 --- a/tools/compresSmol/compressAlgo.cpp +++ b/tools/compresSmol/compressAlgo.cpp @@ -1,18 +1,30 @@ #include "compressAlgo.h" -std::vector getShortCopies(std::vector input, size_t minLength) +ShortCopy::ShortCopy(size_t index, size_t length, size_t offset, unsigned short firstSymbol) { - std::vector copies; - for (size_t startIndex = 1; startIndex < input.size(); startIndex++) + this->index = index; + this->length = length; + this->offset = offset; + this->firstSymbol = firstSymbol; +} + +bool getShortCopies(std::vector *pInput, size_t minLength, std::vector *pShortCopies) +{ + size_t iteration = 0; + std::vector checkVec(pInput->size()); + for (size_t i = 0; i < checkVec.size(); i++) + checkVec[i] = ' '; + for (size_t startIndex = 1; startIndex < pInput->size(); startIndex++) { size_t longestLength = 0; size_t longestOffset; for (size_t searchOffset = 1; searchOffset <= startIndex && searchOffset < 32767; searchOffset++) { size_t currLength = 0; - while (input[startIndex + currLength] == input[startIndex + currLength - searchOffset] - && startIndex + currLength < input.size()) + while (startIndex + currLength < pInput->size() + && (*pInput)[startIndex + currLength] == (*pInput)[startIndex + currLength - searchOffset]) currLength++; + if (currLength > longestLength) { longestLength = currLength; @@ -24,118 +36,118 @@ std::vector getShortCopies(std::vector input, size_t longestLength = 32767; if (longestLength >= minLength) { - std::vector::const_iterator start = input.begin() + startIndex; - std::vector::const_iterator end = input.begin() + startIndex + longestLength; - copies.push_back(ShortCopy(startIndex, longestLength, longestOffset, std::vector(start, end))); - copies[copies.size() - 1].firstSymbol = input[startIndex - 1]; + // Handle non-copies + if (startIndex > 0) + checkVec[startIndex - 1] = 'X'; + + for (size_t i = 0; i < longestLength; i++) + { + checkVec[startIndex + i] = 'X'; + } + for (size_t i = 0; i < startIndex - 1; i++) + { + if (checkVec[i] == ' ') + { + size_t extraIndex = i; + checkVec[extraIndex] = 'O'; + size_t extraLength = 1; + while (checkVec[extraIndex + extraLength] == ' ') + { + checkVec[extraIndex + extraLength] = 'O'; + extraLength++; + } + pShortCopies->push_back(ShortCopy(extraIndex, extraLength, 0, 0)); + break; + } + } + + pShortCopies->push_back(ShortCopy(startIndex, longestLength, longestOffset, (*pInput)[startIndex - 1])); startIndex += longestLength; } } - std::vector checkVec(input.size()); - for (ShortCopy copy : copies) - for (size_t i = 0; i <= copy.length; i++) - checkVec[copy.index + i - 1]++; - size_t currStart = 0; - size_t currLength = 1; - unsigned short prevSym = checkVec[0]; - for (size_t i = 1; i < checkVec.size(); i++) - { - unsigned short currSym = checkVec[i]; - if (currSym == 0 && prevSym == 0) - currLength++; - else if (currSym == 0 && prevSym == 1) - { - currStart = i; - currLength = 1; - } - else if (currSym == 1 && prevSym == 0) - { - std::vector::const_iterator start = input.begin() + currStart; - std::vector::const_iterator end = input.begin() + currStart + currLength; - copies.push_back(ShortCopy(currStart, currLength, 0, std::vector(start, end))); - } - prevSym = currSym; - } - if (prevSym == 0) - { - std::vector::const_iterator start = input.begin() + currStart; - std::vector::const_iterator end = input.begin() + currStart + currLength; - copies.push_back(ShortCopy(currStart, currLength, 0, std::vector(start, end))); - } - return copies; -} - - -bool verifyShortCopies(std::vector *pCopies, std::vector *pImage) -{ - std::vector decodedImage(pImage->size()); - for (ShortCopy copy : (*pCopies)) + // Handle trailing characters + if (checkVec.back() == ' ') { - if (copy.offset == 0) + size_t index = 0; + if (pShortCopies->size() > 0) { - for (size_t i = 0; i < copy.length; i++) - decodedImage[copy.index + i] = copy.usSequence[i]; + index = pShortCopies->back().index + pShortCopies->back().length; + size_t length = checkVec.size() - index; + pShortCopies->push_back(ShortCopy(index, length, 0, 0)); } else { - decodedImage[copy.index - 1] = copy.firstSymbol; - for (size_t i = 0; i < copy.length; i++) - decodedImage[copy.index + i] = (*pImage)[copy.index + i - copy.offset]; + pShortCopies->push_back(ShortCopy(0, checkVec.size(), 0, 0)); } } - for (size_t i = 0; i < decodedImage.size(); i++) - if (decodedImage[i] != (*pImage)[i]) - return false; + + return verifyShortCopies(pShortCopies, pInput); +} + +bool verifyShortCopies(std::vector *pCopies, std::vector *pImage) +{ + size_t totalLength = 0; + for (ShortCopy copy : (*pCopies)) + { + totalLength += copy.length; + if (copy.offset != 0) + { + totalLength++; + } + + if (copy.offset != 0) + { + if (copy.firstSymbol != (*pImage)[copy.index - 1]) + return false; + + for (size_t i = 0; i < copy.length; i++) + { + if ((*pImage)[copy.index + i] != (*pImage)[copy.index + i - copy.offset]) + return false; + } + } + } + if (totalLength != pImage->size()) + return false; + return true; } -SortedShortElement::SortedShortElement() {} - -SortedShortElement::SortedShortElement(size_t index, ShortCopy copy) +bool getShortInstructions(std::vector *pCopies, std::vector *pInstructions, std::vector *pInput) { - this->index = index; - this->copy = copy; - isCopy = true; -} - -std::vector getShortInstructions(std::vector copies, size_t lengthMod) -{ - std::vector instructions; - std::vector unsortedElements; - std::vector sortedElements; - - for (ShortCopy copy : copies) - unsortedElements.push_back(SortedShortElement(copy.index, copy)); - - while (unsortedElements.size() != 0) - { - size_t smallestIndex = 0; - for (size_t i = 0; i < unsortedElements.size(); i++) - { - if (unsortedElements[i].index < unsortedElements[smallestIndex].index) - { - smallestIndex = i; - } - } - sortedElements.push_back(unsortedElements[smallestIndex]); - unsortedElements.erase(unsortedElements.begin() + smallestIndex); - } - for (size_t i = 0; i < sortedElements.size(); i++) + for (ShortCopy copy : (*pCopies)) { ShortCompressionInstruction currInstruction; - currInstruction.index = sortedElements[i].index; - currInstruction.offset = sortedElements[i].copy.offset; - currInstruction.length = sortedElements[i].copy.length; - currInstruction.symbols = sortedElements[i].copy.usSequence; - currInstruction.firstSymbol = sortedElements[i].copy.firstSymbol; - currInstruction.buildBytes(); - instructions.push_back(currInstruction); + currInstruction.index = copy.index; + currInstruction.offset = copy.offset; + currInstruction.length = copy.length; + currInstruction.firstSymbol = copy.firstSymbol; + currInstruction.buildBytes(pInput); + pInstructions->push_back(currInstruction); } - return instructions; + return true; } -void ShortCompressionInstruction::buildBytes() +void getLosFromInstructions(std::vector *pInstructions, std::vector *pOutput) +{ + for (ShortCompressionInstruction instruction : (*pInstructions)) + { + for (unsigned char uc : instruction.loBytes) + pOutput->push_back(uc); + } +} + +void getSymsFromInstructions(std::vector *pInstructions, std::vector *pOutput) +{ + for (ShortCompressionInstruction instruction : (*pInstructions)) + { + for (unsigned short us : instruction.symShorts) + pOutput->push_back(us); + } +} + +void ShortCompressionInstruction::buildBytes(std::vector *pInput) { if (offset != 0) { @@ -173,74 +185,14 @@ void ShortCompressionInstruction::buildBytes() loBytes[loBytes.size() - 1] += LO_CONTINUE_BIT; loBytes.push_back(currLength & BYTE_MASK); } - for (unsigned short currSymbol : symbols) - symShorts.push_back(currSymbol); - } -} - -void CompressionInstruction::buildBytes() -{ - std::vector currBytes; - if (offset != 0) - { - size_t currLength = length; - currBytes.push_back(currLength & 0x7f); - currLength = currLength >> 7; - if (currLength != 0) + for (size_t i = 0; i < length; i++) { - currBytes[currBytes.size() - 1] += 128; - currBytes.push_back(currLength & 0xff); + symShorts.push_back((*pInput)[index + i]); } - size_t currOffset = offset; - currBytes.push_back(currOffset & 0x7f); - currOffset = currOffset >> 7; - if (currOffset != 0) - { - currBytes[currBytes.size() - 1] += 128; - currBytes.push_back(currOffset & 0xff); - } - currBytes.push_back(firstSymbol); } - else - { - currBytes.push_back(0); - size_t currLength = length; - currBytes.push_back(currLength & 0x7f); - currLength = currLength >> 7; - if (currLength != 0) - { - currBytes[currBytes.size() - 1] += 128; - currBytes.push_back(currLength & 0xff); - } - for (unsigned char currSymbol : symbols) - currBytes.push_back(currSymbol); - } - bytes = currBytes; } -std::vector getLosFromInstructions(std::vector instructions) -{ - std::vector loVec; - for (ShortCompressionInstruction instruction : instructions) - { - for (unsigned char uc : instruction.loBytes) - loVec.push_back(uc); - } - return loVec; -} - -std::vector getSymsFromInstructions(std::vector instructions) -{ - std::vector symvec; - for (ShortCompressionInstruction instruction : instructions) - { - for (unsigned short uc : instruction.symShorts) - symvec.push_back(uc); - } - return symvec; -} - -std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec) +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage) { std::vector decodedImage; size_t loIndex = 0; @@ -279,13 +231,7 @@ std::vector decodeBytesShort(std::vector *pLoVec, } } } - return decodedImage; -} - -bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage) -{ - std::vector shorts = decodeBytesShort(pLoVec, pSymVec); - return compareVectorsShort(&shorts, pImage); + return true; } bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2) @@ -298,407 +244,38 @@ bool compareVectorsShort(std::vector *pVec1, std::vector readFileAsUC(std::string filePath) +bool isModeLoEncoded(CompressionMode mode) { - std::ifstream iStream; - iStream.open(filePath.c_str(), std::ios::binary); - if (!iStream.is_open()) - { - fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); - return std::vector(0); - } - iStream.ignore( std::numeric_limits::max() ); - std::streamsize size = iStream.gcount(); - iStream.clear(); - iStream.seekg( 0, std::ios_base::beg ); - std::vector ucVec(size); - iStream.read((char*)(&ucVec[0]), size); - iStream.close(); - return ucVec; + if (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; } -CompressedImage processImage(std::string fileName, InputSettings settings) +bool isModeSymEncoded(CompressionMode mode) { - CompressedImage image; - std::vector input = readFileAsUC(fileName); - if (settings.useFrames) - { - /* - // Determine number of frames - size_t totalPixels = input.size()*2; - // Split input and append - size_t smallFrames = totalPixels/OVERWORLD_16X16; - size_t largeFrames = totalPixels/OVERWORLD_32X32; - */ - } - else - { - image = processImageData(input, settings, fileName); - } - return image; + if (mode == ENCODE_SYMS + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; } -CompressedImage processImageFrames(std::string fileName, InputSettings settings) +bool isModeSymDelta(CompressionMode mode) { - CompressedImage image; - std::vector input = readFileAsUC(fileName); - std::vector> allInputs(4); - size_t totalSize = input.size(); - size_t partialSize = totalSize/4; - size_t subIndex = 0; - size_t inputIndex = 0; - std::vector frameOffsets; - for (unsigned char currChar : input) - { - frameOffsets.push_back(image.otherBits.size()); - if (subIndex == partialSize) - { - subIndex = 0; - inputIndex++; - } - allInputs[inputIndex].push_back(currChar); - subIndex++; - } - for (size_t i = 0; i < 4; i++) - { - CompressedImage tempImage = processImageData(allInputs[i], settings, fileName); - for (unsigned int currVal : tempImage.writeVec) - image.otherBits.push_back(currVal); - } - unsigned int header = IS_FRAME_CONTAINER; - image.writeVec.push_back(header); - for (size_t i = 0; i < 4; i++) - image.writeVec.push_back((unsigned int)frameOffsets[i]); - for (unsigned int currVal : image.otherBits) - image.writeVec.push_back(currVal); - image.isValid = true; - - return image; + if (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS) + return true; + return false; } -CompressedImage processImageData(std::vector input, InputSettings settings, std::string fileName) -{ - CompressedImage bestImage; - CompressionMode someMode; - bool hasImage = false; - std::vector rawBase = input; - std::vector usBase(rawBase.size()/2); - memcpy(usBase.data(), rawBase.data(), rawBase.size()); - size_t baseLZsize = 0; - bool byteFail = false; - bool copyFail = false; - bool compressionFail = false; - bool uIntConversionFail = false; - if (settings.shouldCompare) - { - std::string lzName = fileName + ".lz"; - baseLZsize = getFileSize(lzName); - } - std::vector bestLO; - std::vector bestSym; - std::vector bestInstructions; - for (size_t minCodeLength = 2; minCodeLength <= 15; minCodeLength++) - { - std::vector shortCopies = getShortCopies(usBase, minCodeLength); - if (!verifyShortCopies(&shortCopies, &usBase)) - { - copyFail = true; - continue; - } - std::vector shortInstructions = getShortInstructions(shortCopies, minCodeLength-1); - std::vector loVec = getLosFromInstructions(shortInstructions); - std::vector symVec = getSymsFromInstructions(shortInstructions); - if (!verifyBytesShort(&loVec, &symVec, &usBase)) - { - byteFail = true; - continue; - } - CompressionMode mode = BASE_ONLY; - //std::vector modesToUse = {ENCODE_SYMS}; - std::vector modesToUse = {BASE_ONLY, ENCODE_SYMS, ENCODE_DELTA_SYMS, ENCODE_LO, ENCODE_BOTH, ENCODE_BOTH_DELTA_SYMS}; - if (fileName.find("test/compression/") != std::string::npos) - { - if (fileName.find("mode_0.4bpp") != std::string::npos) - modesToUse = {BASE_ONLY}; - else if (fileName.find("mode_1.4bpp") != std::string::npos) - modesToUse = {ENCODE_SYMS}; - else if (fileName.find("mode_2.4bpp") != std::string::npos) - modesToUse = {ENCODE_DELTA_SYMS}; - else if (fileName.find("mode_3.4bpp") != std::string::npos) - modesToUse = {ENCODE_LO}; - else if (fileName.find("mode_4.4bpp") != std::string::npos) - modesToUse = {ENCODE_BOTH}; - else if (fileName.find("mode_5.4bpp") != std::string::npos) - modesToUse = {ENCODE_BOTH_DELTA_SYMS}; - else if (fileName.find("test/compression/table_") != std::string::npos) - modesToUse = {ENCODE_SYMS}; - - if (modesToUse.size() == 1) - { - settings.canDeltaSyms = true; - settings.canEncodeLO = true; - settings.canEncodeSyms = true; - } - } - - for (CompressionMode currMode : modesToUse) - { - mode = currMode; - if (!settings.canDeltaSyms - && (mode == ENCODE_DELTA_SYMS - || mode == ENCODE_BOTH_DELTA_SYMS)) - continue; - if (!settings.canEncodeLO - && (mode == ENCODE_LO - || mode == ENCODE_BOTH - || mode == ENCODE_BOTH_DELTA_SYMS)) - continue; - if (!settings.canEncodeSyms - && (mode == ENCODE_SYMS - || mode == ENCODE_BOTH - || mode == ENCODE_DELTA_SYMS - || mode == ENCODE_BOTH_DELTA_SYMS)) - continue; - CompressedImage image = fillCompressVecNew(loVec, symVec, mode,rawBase.size(), fileName); - if (!verifyCompressionShort(&image, &usBase)) - { - compressionFail = true; - continue; - } - std::vector uiVec = getUIntVecFromData(&image); - std::vector decodedImage = readRawDataVecs(&uiVec); - if (!compareVectorsShort(&decodedImage, &usBase)) - { - uIntConversionFail = true; - continue; - } - image.compressedSize = uiVec.size() * 4; - if (!hasImage) - { - bestLO = loVec; - bestSym = symVec; - bestInstructions = shortInstructions; - bestImage = image; - hasImage = true; - bestImage.writeVec = uiVec; - someMode = mode; - } - else if (image.compressedSize < bestImage.compressedSize) - { - bestLO = loVec; - bestSym = symVec; - bestInstructions = shortInstructions; - bestImage = image; - hasImage = true; - bestImage.writeVec = uiVec; - someMode = mode; - } - } - } - bestImage.mode = someMode; - bestImage.fileName = fileName; - bestImage.lzSize = baseLZsize; - bestImage.rawNumBytes = rawBase.size(); - if (hasImage) - bestImage.isValid = true; - else - { - fprintf(stderr, "Failed to compress image %s\nErrors: ", fileName.c_str()); - if (copyFail) - fprintf(stderr, "CopyProcessing "); - if (byteFail) - fprintf(stderr, "ByteConversion "); - if (compressionFail) - fprintf(stderr, "Compression "); - if (uIntConversionFail) - fprintf(stderr, "uIntConversion "); - printf("\n"); - } - return bestImage; -} - -CompressedImage getDataFromUIntVec(std::vector *pInput) -{ - CompressedImage image = readNewHeader(pInput); - - size_t readIndex = 2; - - bool loEncoded = isModeLoEncoded(image.mode); - bool symEncoded = isModeSymEncoded(image.mode); - - if (loEncoded) - { - image.loFreqs[0] = (*pInput)[readIndex]; - image.loFreqs[1] = (*pInput)[readIndex + 1]; - image.loFreqs[2] = (*pInput)[readIndex + 2]; - readIndex += 3; - } - if (symEncoded) - { - image.symFreqs[0] = (*pInput)[readIndex]; - image.symFreqs[1] = (*pInput)[readIndex + 1]; - image.symFreqs[2] = (*pInput)[readIndex + 2]; - readIndex += 3; - } - if (loEncoded || symEncoded) - { - for (size_t i = 0; i < image.bitreamSize; i++) - { - image.tANSbits.push_back((*pInput)[readIndex]); - readIndex++; - } - } - std::vector remainders; - while (readIndex < pInput->size()) - { - unsigned int currInt = (*pInput)[readIndex]; - for (size_t i = 0; i < 4; i++) - remainders.push_back((currInt >> (8*i)) & 0xff); - readIndex++; - } - size_t remIndex = 0; - if (!symEncoded) - { - for (size_t i = 0; i < image.symSize; i++) - { - unsigned short currSym = remainders[remIndex]; - remIndex++; - currSym += remainders[remIndex] << 8; - remIndex++; - image.symVec.push_back(currSym); - } - } - if (!loEncoded) - { - for (size_t i = 0; i < image.loSize; i++) - { - unsigned char currChar = remainders[remIndex]; - remIndex++; - image.loVec.push_back(currChar); - } - } - - return image; -} - -bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage) -{ - std::vector decodedImage = decodeImageShort(pInput); - return compareVectorsShort(&decodedImage, pImage); -} - -std::vector decodeImageShort(CompressedImage *pInput) -{ - DataVecs dataVecs = decodeDataVectorsNew(pInput); - return decodeBytesShort(&dataVecs.loVec, &dataVecs.symVec); -} - -DataVecs decodeDataVectorsNew(CompressedImage *pInput) -{ - CompressedImage headerValues = readNewHeader(&pInput->headers); - size_t loSize = headerValues.loSize; - size_t symSize = headerValues.symSize; - CompressionMode mode = headerValues.mode; - bool loEncoded = isModeLoEncoded(mode); - bool symEncoded = isModeSymEncoded(mode); - bool symDelta = isModeSymDelta(mode); - std::vector loFreqs = unpackFrequencies(&pInput->loFreqs[0]); - std::vector symFreqs = unpackFrequencies(&pInput->symFreqs[0]); - std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - std::vector loDecode; - std::vector symDecode; - - std::vector loVec(loSize); - std::vector symVec(symSize); - std::vector loNibbles(loSize*2); - std::vector symNibbles(symSize*4); - - if (loEncoded) - { - loDecode = createDecodingTable(symbols, loFreqs); - } - if (symEncoded) - { - symDecode = createDecodingTable(symbols, symFreqs); - } - - std::vector allBits(pInput->tANSbits.size()*32); - size_t currIndex = 0; - for (unsigned int ui : pInput->tANSbits) - for (size_t i = 0; i < 32; i++) - { - unsigned int currVal = (ui >> i) & 0x1; - allBits[currIndex] = currVal; - currIndex++; - } - - if (!symEncoded) - for (size_t i = 0; i < symSize; i++) - symVec[i] = pInput->symVec[i]; - if (!loEncoded) - for (size_t i = 0; i < loSize; i++) - loVec[i] = pInput->loVec[i]; - - size_t bitIndex = 0; - int currState = pInput->initialState; - if (loEncoded) - { - bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, loSize*2); - } - if (loEncoded) - for (size_t i = 0; i < loVec.size(); i++) - loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); - - if (symEncoded) - { - bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, symSize*4); - if (symDelta) - deltaDecode(&symNibbles, symNibbles.size()); - } - if (symEncoded) - for (size_t i = 0; i < symVec.size(); i++) - for (size_t j = 0; j < 4; j++) - symVec[i] += (unsigned short)symNibbles[i*4 + j] << (j*4); - - DataVecs returnData; - returnData.loVec = loVec; - returnData.symVec = symVec; - return returnData; -} - -void analyzeImages(std::vector *allImages, std::mutex *imageMutex, FileDispatcher *dispatcher, std::mutex *dispatchMutex, InputSettings settings) -{ - std::string fileName = "Initial Value"; - while (fileName != "") - { - dispatchMutex->lock(); - fileName = dispatcher->requestFileName(); - dispatchMutex->unlock(); - if (fileName == "") - break; - std::string uncompressedFileName = fileName.substr(0, fileName.size()-3); - CompressedImage currImage = processImage(uncompressedFileName, settings); - - imageMutex->lock(); - allImages->push_back(currImage); - imageMutex->unlock(); - } -} - -ShortCopy::ShortCopy() {} -ShortCopy::ShortCopy(size_t index, size_t length, size_t offset, std::vector usSequence) -{ - this->index = index; - this->length = length; - this->offset = offset; - this->usSequence = usSequence; -} - -std::vector getNormalizedCounts(std::vector input) +std::vector getNormalizedCounts(std::vector *input) { std::vector tempVec(16); - for (size_t i = 0; i < input.size(); i++) - tempVec[i] = input[i]; + for (size_t i = 0; i < input->size(); i++) + tempVec[i] = (*input)[i]; tempVec = normalizeCounts(tempVec, TANS_TABLE_SIZE); bool shouldAdjust = false; for (int i = 0; i < 16; i++) @@ -742,499 +319,6 @@ std::vector getFreqWriteInts(std::vector input) return returnVec; } -std::vector unpackFrequencies(unsigned int pInts[3]) -{ - std::vector returnVec; - int freq15 = 0; - for (size_t i = 0; i < 3; i++) - { - for (size_t j = 0; j < 5; j++) - { - int currVal = (pInts[i] >> (6*j)) & 0x3f; - returnVec.push_back(currVal); - } - freq15 += ((pInts[i] >> 30) & 0x3) << (2*i); - } - returnVec.push_back(freq15); - return returnVec; -} - -int findInitialState(EncodeCol encodeCol, unsigned char firstSymbol) -{ - for (size_t i = 0; i < encodeCol.symbols.size(); i++) - { - if (encodeCol.symbols[i].symbol == firstSymbol) - return encodeCol.symbols[i].nextState; - } - return -1; -} -/* - mode 5 - - state 6 11 - bitstream 12 23 8628 max so far, divide by 4 - loLength 12 23 2922 max so far - symLength 14 37 14k max so far - imageSize 10 47 16384 max so far, divide by 16 - - u32:5 mode+lz - u32:10 image size, divided by 32 - u32:14 symlength, divided by 2 - - u32:6 state - u32:12 bitstream, in ints - u32:12 loLength, in bytes -*/ -std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength) -{ - if (initialState == -1) - initialState = 0; - std::vector returnVec(2); - - returnVec[0] += (unsigned int)mode; // 4 bits - returnVec[0] += (imageSize/IMAGE_SIZE_MODIFIER) << IMAGE_SIZE_OFFSET; // 14 bits - returnVec[0] += (symLength) << SYM_SIZE_OFFSET; // 14 bits - // 32 total - - returnVec[1] += initialState; // 6 bits - returnVec[1] += bitstreamSize << BITSTREAM_SIZE_OFFSET; // 13 bits - returnVec[1] += loLength << LO_SIZE_OFFSET; // 13 bits - - return returnVec; -} - -CompressedImage readNewHeader(std::vector *pInput) -{ - CompressedImage image; - std::vector headers(2); - headers[0] = (*pInput)[0]; - headers[1] = (*pInput)[1]; - image.mode = (CompressionMode)(headers[0] & MODE_MASK); - image.rawNumBytes = ((headers[0] >> IMAGE_SIZE_OFFSET) & IMAGE_SIZE_MASK) * IMAGE_SIZE_MODIFIER; - image.symSize = ((headers[0] >> SYM_SIZE_OFFSET) & SYM_SIZE_MASK); - - image.initialState = headers[1] & INITIAL_STATE_MASK; - image.bitreamSize = (headers[1] >> BITSTREAM_SIZE_OFFSET) & BITSTREAM_SIZE_MASK; - image.loSize = (headers[1] >> LO_SIZE_OFFSET) & LO_SIZE_MASK; - image.headers = headers; - return image; -} - -InputSettings::InputSettings() {} - -InputSettings::InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms) -{ - this->canEncodeLO = canEncodeLO; - this->canEncodeSyms = canEncodeSyms; - this->canDeltaSyms = canDeltaSyms; -} - -std::vector getUIntVecFromData(CompressedImage *pImage) -{ - CompressedImage otherImage = readNewHeader(&pImage->headers); - std::vector returnVec; - returnVec.push_back(pImage->headers[0]); - returnVec.push_back(pImage->headers[1]); - if (isModeLoEncoded(otherImage.mode)) - for (size_t i = 0; i < 3; i++) - returnVec.push_back(pImage->loFreqs[i]); - if (isModeSymEncoded(otherImage.mode)) - for (size_t i = 0; i < 3; i++) - returnVec.push_back(pImage->symFreqs[i]); - if (isModeLoEncoded(otherImage.mode) || isModeSymEncoded(otherImage.mode)) - for (unsigned int ui : pImage->tANSbits) - returnVec.push_back(ui); - unsigned int currInt = 0; - unsigned int currOffset = 0; - if (!isModeSymEncoded(otherImage.mode)) - { - for (size_t i = 0; i < pImage->symVec.size(); i++) - { - currInt += pImage->symVec[i] << (8*(currOffset % 4)); - currOffset += 2; - if (currOffset % 4 == 0) - { - returnVec.push_back(currInt); - currInt = 0; - } - } - } - if (!isModeLoEncoded(otherImage.mode)) - { - for (size_t i = 0; i < pImage->loVec.size(); i++) - { - currInt += 0; - currInt += pImage->loVec[i] << (8*(currOffset % 4)); - currOffset++; - if (currOffset % 4 == 0) - { - returnVec.push_back(currInt); - currInt = 0; - } - } - } - if (currOffset != 0) - returnVec.push_back(currInt); - return returnVec; -} - -bool verifyUIntVecShort(std::vector *pInput, std::vector *pImage) -{ - CompressedImage image = getDataFromUIntVec(pInput); - return verifyCompressionShort(&image, pImage); -} - -std::vector readFileAsUInt(std::string filePath) -{ - std::vector returnVec; - std::vector ucVec; - std::ifstream iStream; - iStream.open(filePath.c_str(), std::ios::binary); - if (!iStream.is_open()) - { - fprintf(stderr, "Error: Couldn't open file %s for reading\n", filePath.c_str()); - return returnVec; - } - iStream.ignore( std::numeric_limits::max() ); - std::streamsize size = iStream.gcount(); - ucVec.resize(size); - iStream.clear(); - iStream.seekg( 0, std::ios_base::beg ); - iStream.read((char*)(&ucVec[0]), size); - iStream.close(); - unsigned int *pUInt = reinterpret_cast(ucVec.data()); - for (size_t i = 0; i < ucVec.size()/4; i++) - returnVec.push_back(pUInt[i]); - return returnVec; -} - -bool isModeLoEncoded(CompressionMode mode) -{ - if (mode == ENCODE_LO - || mode == ENCODE_BOTH - || mode == ENCODE_BOTH_DELTA_SYMS) - return true; - return false; -} - -bool isModeSymEncoded(CompressionMode mode) -{ - if (mode == ENCODE_SYMS - || mode == ENCODE_DELTA_SYMS - || mode == ENCODE_BOTH - || mode == ENCODE_BOTH_DELTA_SYMS) - return true; - return false; -} - -bool isModeSymDelta(CompressionMode mode) -{ - if (mode == ENCODE_DELTA_SYMS - || mode == ENCODE_BOTH_DELTA_SYMS) - return true; - return false; -} - -CompressedImage fillCompressVecNew(std::vector loVec, std::vector symVec, CompressionMode mode, size_t imageBytes, std::string name) -{ - CompressedImage image; - bool loEncoded = isModeLoEncoded(mode); - bool symEncoded = isModeSymEncoded(mode); - bool symDelta = isModeSymDelta(mode); - - std::vector loNibbles(2*loVec.size()); - std::vector symNibbles(4*symVec.size()); - std::vector loDecode; - std::vector symDecode; - std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - if (loEncoded) - { - for (size_t i = 0; i < loVec.size(); i++) - { - loNibbles[2*i] = (loVec)[i] & 0xf; - loNibbles[2*i + 1] = ((loVec)[i] >> 4) & 0xf; - } - std::vector loCounts(16); - for (unsigned char uc : loNibbles) - loCounts[uc]++; - std::vector loFreqs = getNormalizedCounts(loCounts); - std::vector freqs = getFreqWriteInts(loFreqs); - image.loFreqs[0] = freqs[0]; - image.loFreqs[1] = freqs[1]; - image.loFreqs[2] = freqs[2]; - loDecode = createDecodingTable(symbols, loFreqs); - } - if (symEncoded) - { - for (size_t i = 0; i < symVec.size(); i++) - { - for (size_t j = 0; j < 4; j++) - symNibbles[4*i + j] = (symVec[i] >> (4*j)) & 0xf; - } - std::vector symCounts(16); - if (symDelta) - deltaEncode(&symNibbles, symNibbles.size()); - for (unsigned char uc : symNibbles) - symCounts[uc]++; - std::vector symFreqs = getNormalizedCounts(symCounts); - symFreqs = getTestFreqs(symFreqs, name); - std::vector freqs = getFreqWriteInts(symFreqs); - image.symFreqs[0] = freqs[0]; - image.symFreqs[1] = freqs[1]; - image.symFreqs[2] = freqs[2]; - symDecode = createDecodingTable(symbols, symFreqs); - } - int currState = -1; - std::vector bitstream; - if (symEncoded) - { - std::vector reversedVec; - for (size_t i = 0; i < symNibbles.size(); i++) - reversedVec.push_back(symNibbles[symNibbles.size() - i - 1]); - std::vector symEncode = createEncodingTable(symDecode, symbols); - size_t startIndex = 0; - if (currState == -1) - { - currState = findInitialState(symEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; - startIndex = 1; - } - for (size_t i = startIndex; i < reversedVec.size(); i++) - currState = encodeSingleSymbol(symEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; - } - if (loEncoded) - { - std::vector reversedVec; - for (size_t i = 0; i < loNibbles.size(); i++) - reversedVec.push_back(loNibbles[loNibbles.size() - i - 1]); - std::vector loEncode = createEncodingTable(loDecode, symbols); - size_t startIndex = 0; - if (currState == -1) - { - currState = findInitialState(loEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; - startIndex = 1; - } - for (size_t i = startIndex; i < reversedVec.size(); i++) - currState = encodeSingleSymbol(loEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; - } - std::vector reversedBitstream(bitstream.size()); - for (size_t i = 0; i < bitstream.size(); i++) - reversedBitstream[reversedBitstream.size() - 1 - i] = bitstream[i]; - bitstream = reversedBitstream; - std::vector checkBits = bitstream; - int checkState = currState; - - size_t currBitIndex = 0; - if (loEncoded) - { - std::vector checkLoNibbles(loNibbles.size()); - currBitIndex = decodeNibbles(loDecode, &checkBits, &checkState, &checkLoNibbles, currBitIndex, loNibbles.size()); - for (size_t i = 0; i < loNibbles.size(); i++) - if (loNibbles[i] != checkLoNibbles[i]) - { - fprintf(stderr, "LO Mismatch\n"); - break; - } - } - if (symEncoded) - { - std::vector checkSymNibbles(symNibbles.size()); - currBitIndex = decodeNibbles(symDecode, &checkBits, &checkState, &checkSymNibbles, currBitIndex, symNibbles.size()); - for (size_t i = 0; i < symNibbles.size(); i++) - if (symNibbles[i] != checkSymNibbles[i]) - { - fprintf(stderr, "Symbol Mismatch\n"); - break; - } - } - - std::vector tANSbits; - unsigned int currInt = 0; - for (size_t i = 0; i < bitstream.size(); i++) - { - currInt += bitstream[i] << (i%32); - if ((i+1) % 32 == 0) - { - tANSbits.push_back(currInt); - currInt = 0; - } - } - if (bitstream.size() % 32 != 0) - tANSbits.push_back(currInt); - image.headers = getNewHeaders(mode, imageBytes, symVec.size(), currState, tANSbits.size(), loVec.size()); - image.tANSbits = tANSbits; - image.symVec = symVec; - image.loVec = loVec; - image.initialState = currState; - return image; -} - -size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles) -{ - for (size_t i = 0; i < numNibbles; i++) - { - (*nibbleVec)[i] = decodeTable[*currState].symbol; - int currK = decodeTable[*currState].k; - int nextState = decodeTable[*currState].y << currK; - for (size_t j = 0; j < currK; j++) - { - nextState += (*bits)[currBitIndex] << j; - currBitIndex++; - } - *currState = nextState - TANS_TABLE_SIZE; - } - return currBitIndex; -} - -std::vector readRawDataVecs(std::vector *pInput) -{ - std::vector imageVec; - CompressedImage readImage = readNewHeader(pInput); - bool loEncoded = isModeLoEncoded(readImage.mode); - bool symEncoded = isModeSymEncoded(readImage.mode); - bool symDelta = isModeSymDelta(readImage.mode); - size_t readIndex = 2; - std::vector tANSbits; - std::vector allBits; - std::vector symVec(readImage.symSize); - std::vector loVec(readImage.loSize); - std::vector symDecode(TANS_TABLE_SIZE); - std::vector loDecode(TANS_TABLE_SIZE); - int currState = readImage.initialState; - if (loEncoded) - { - for (size_t i = 0; i < 3; i++) - readImage.loFreqs[i] = (*pInput)[readIndex + i]; - readIndex += 3; - std::vector loFreqs = unpackFrequencies(&readImage.loFreqs[0]); - size_t currCol = 0; - for (size_t i = 0; i < 16; i++) - { - for (size_t j = 0; j < loFreqs[i]; j++) - { - loDecode[currCol].state = TANS_TABLE_SIZE + currCol; - loDecode[currCol].symbol = i; - loDecode[currCol].y = loFreqs[i] + j; - int currK = 0; - while ((loDecode[currCol].y << currK) < TANS_TABLE_SIZE) - currK++; - loDecode[currCol].k = currK; - currCol++; - } - } - } - if (symEncoded) - { - for (size_t i = 0; i < 3; i++) - readImage.symFreqs[i] = (*pInput)[readIndex + i]; - readIndex += 3; - std::vector symFreqs = unpackFrequencies(&readImage.symFreqs[0]); - size_t currCol = 0; - for (size_t i = 0; i < 16; i++) - { - for (size_t j = 0; j < symFreqs[i]; j++) - { - symDecode[currCol].state = TANS_TABLE_SIZE + currCol; - symDecode[currCol].symbol = i; - symDecode[currCol].y = symFreqs[i] + j; - int currK = 0; - while ((symDecode[currCol].y << currK) < TANS_TABLE_SIZE) - currK++; - symDecode[currCol].k = currK; - currCol++; - } - } - } - if (loEncoded || symEncoded) - { - tANSbits.resize(readImage.bitreamSize); - for (size_t i = 0; i < readImage.bitreamSize; i++) - tANSbits[i] = (*pInput)[readIndex + i]; - readIndex += readImage.bitreamSize; - allBits.resize(tANSbits.size()*32); - size_t currIndex = 0; - for (unsigned int ui : tANSbits) - { - for (size_t i = 0; i < 32; i++) - { - unsigned int currVal = (ui >> i) & 0x1; - allBits[currIndex] = currVal; - currIndex++; - } - } - } - bool leftOverValues = false; - if (!symEncoded) - { - for (size_t i = 0; i < readImage.symSize; i++) - { - symVec[i] = ((*pInput)[readIndex] >> (16*(i%2))) & 0xffff; - if ((i+1) % 2 == 0) - { - readIndex++; - leftOverValues = false; - } - else - { - leftOverValues = true; - } - } - } - if (!loEncoded) - { - size_t offsetMod = 0; - if (leftOverValues) - offsetMod = 2; - for (size_t i = 0; i < readImage.loSize; i++) - { - loVec[i] = ((*pInput)[readIndex] >> (8*((i%4) + offsetMod))) & 0xff; - if ((i+offsetMod+1) % 4 == 0) - readIndex++; - } - } - size_t bitIndex = 0; - if (loEncoded) - { - std::vector loNibbles(readImage.loSize*2); - bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, readImage.loSize*2); - for (size_t i = 0; i < readImage.loSize; i++) - loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); - } - if (symEncoded) - { - std::vector symNibbles(readImage.symSize*4); - bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, readImage.symSize*4); - if (symDelta) - deltaDecode(&symNibbles, symNibbles.size()); - for (size_t i = 0; i < readImage.symSize; i++) - for (size_t j = 0; j < 4; j++) - symVec[i] += (unsigned short)symNibbles[i*4 + j] << (4*j); - } - imageVec = decodeBytesShort(&loVec, &symVec); - return imageVec; -} - -void deltaEncode(std::vector *buffer, int length) -{ - unsigned char last = 0; - for (int i = 0; i < length; i++) - { - unsigned char current =(*buffer)[i]; - (*buffer)[i] = (current-last) & 0xf; - last = current; - } -} - -void deltaDecode(std::vector *buffer, int length) -{ - unsigned char last = 0; - for (int i = 0; i < length; i++) - { - unsigned char delta =(*buffer)[i]; - (*buffer)[i] = (delta+last) & 0xf; - last = (*buffer)[i]; - } -} - std::vector getTestFreqs(std::vector freqs, std::string name) { if (name.find("test/compression/table_") == std::string::npos) @@ -1465,3 +549,783 @@ std::vector getTestFreqs(std::vector freqs, std::string name) } return freqs; } + +void deltaEncode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char current =(*buffer)[i]; + (*buffer)[i] = (current-last) & 0xf; + last = current; + } +} + +void deltaDecode(std::vector *buffer, int length) +{ + unsigned char last = 0; + for (int i = 0; i < length; i++) + { + unsigned char delta =(*buffer)[i]; + (*buffer)[i] = (delta+last) & 0xf; + last = (*buffer)[i]; + } +} + +int findInitialState(EncodeCol *encodeCol, unsigned char firstSymbol) +{ + for (size_t i = 0; i < encodeCol->symbols.size(); i++) + { + if (encodeCol->symbols[i].symbol == firstSymbol) + return encodeCol->symbols[i].nextState; + } + return -1; +} + +size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles, bool lastThing) +{ + for (size_t i = 0; i < numNibbles; i++) + { + (*nibbleVec)[i] = decodeTable[*currState].symbol; + + if (i + 1 == nibbleVec->size() && lastThing) + return currBitIndex; + + int currK = decodeTable[*currState].k; + int nextState = decodeTable[*currState].y << currK; + for (size_t j = 0; j < currK; j++) + { + nextState += (*bits)[currBitIndex] << j; + currBitIndex++; + } + *currState = nextState - TANS_TABLE_SIZE; + } + return currBitIndex; +} + +std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength) +{ + if (initialState == -1) + initialState = 0; + std::vector returnVec(2); + + returnVec[0] += (unsigned int)mode; // 4 bits + returnVec[0] += (imageSize/IMAGE_SIZE_MODIFIER) << IMAGE_SIZE_OFFSET; // 14 bits + returnVec[0] += (symLength) << SYM_SIZE_OFFSET; // 14 bits + // 32 total + + returnVec[1] += initialState; // 6 bits + returnVec[1] += bitstreamSize << BITSTREAM_SIZE_OFFSET; // 13 bits + returnVec[1] += loLength << LO_SIZE_OFFSET; // 13 bits + // 32 total + + return returnVec; +} + +bool fillCompressVec(std::vector *pLoVec, std::vector *pSymVec, CompressionMode mode, size_t imageBytes, std::string name, CompressedImage *pOutput) +{ + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + + std::vector loNibbles(2 * pLoVec->size()); + std::vector symNibbles(4 * pSymVec->size()); + std::vector loDecode; + std::vector symDecode; + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + + if (loEncoded) + { + for (size_t i = 0; i < pLoVec->size(); i++) + { + loNibbles[2*i] = (*pLoVec)[i] & 0xf; + loNibbles[2*i + 1] = ((*pLoVec)[i] >> 4) & 0xf; + } + std::vector loCounts(16); + for (unsigned char uc : loNibbles) + loCounts[uc]++; + std::vector loFreqs = getNormalizedCounts(&loCounts); + std::vector freqs = getFreqWriteInts(loFreqs); + pOutput->loFreqs[0] = freqs[0]; + pOutput->loFreqs[1] = freqs[1]; + pOutput->loFreqs[2] = freqs[2]; + loDecode = createDecodingTable(symbols, loFreqs); + } + + if (symEncoded) + { + for (size_t i = 0; i < pSymVec->size(); i++) + { + for (size_t j = 0; j < 4; j++) + symNibbles[4*i + j] = ((*pSymVec)[i] >> (4*j)) & 0xf; + } + std::vector symCounts(16); + if (symDelta) + deltaEncode(&symNibbles, symNibbles.size()); + for (unsigned char uc : symNibbles) + symCounts[uc]++; + std::vector symFreqs = getNormalizedCounts(&symCounts); + symFreqs = getTestFreqs(symFreqs, name); + std::vector freqs = getFreqWriteInts(symFreqs); + pOutput->symFreqs[0] = freqs[0]; + pOutput->symFreqs[1] = freqs[1]; + pOutput->symFreqs[2] = freqs[2]; + symDecode = createDecodingTable(symbols, symFreqs); + } + + int currState = -1; + std::vector bitstream; + if (symEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < symNibbles.size(); i++) + reversedVec.push_back(symNibbles[symNibbles.size() - i - 1]); + std::vector symEncode = createEncodingTable(symDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(&symEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(symEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + + if (loEncoded) + { + std::vector reversedVec; + for (size_t i = 0; i < loNibbles.size(); i++) + reversedVec.push_back(loNibbles[loNibbles.size() - i - 1]); + std::vector loEncode = createEncodingTable(loDecode, symbols); + size_t startIndex = 0; + if (currState == -1) + { + currState = findInitialState(&loEncode[0], reversedVec[0]) - TANS_TABLE_SIZE; + startIndex = 1; + } + for (size_t i = startIndex; i < reversedVec.size(); i++) + currState = encodeSingleSymbol(loEncode[currState], reversedVec[i], &bitstream) - TANS_TABLE_SIZE; + } + + std::vector reversedBitstream(bitstream.size()); + for (size_t i = 0; i < bitstream.size(); i++) + reversedBitstream[reversedBitstream.size() - 1 - i] = bitstream[i]; + bitstream = reversedBitstream; + std::vector checkBits = bitstream; + int checkState = currState; + size_t currBitIndex = 0; + + if (loEncoded) + { + bool lastThing = !symEncoded; + std::vector checkLoNibbles(loNibbles.size()); + currBitIndex = decodeNibbles(loDecode, &checkBits, &checkState, &checkLoNibbles, currBitIndex, loNibbles.size(), lastThing); + for (size_t i = 0; i < loNibbles.size(); i++) + { + if (loNibbles[i] != checkLoNibbles[i]) + { + fprintf(stderr, "LO Mismatch\n"); + break; + } + } + } + + if (symEncoded) + { + std::vector checkSymNibbles(symNibbles.size()); + currBitIndex = decodeNibbles(symDecode, &checkBits, &checkState, &checkSymNibbles, currBitIndex, symNibbles.size(), true); + for (size_t i = 0; i < symNibbles.size(); i++) + { + if (symNibbles[i] != checkSymNibbles[i]) + { + fprintf(stderr, "Symbol Mismatch\n"); + break; + } + } + } + + std::vector tANSbits; + unsigned int currInt = 0; + for (size_t i = 0; i < bitstream.size(); i++) + { + currInt += bitstream[i] << (i%32); + if ((i+1) % 32 == 0) + { + tANSbits.push_back(currInt); + currInt = 0; + } + } + if (bitstream.size() % 32 != 0) + tANSbits.push_back(currInt); + + pOutput->headers = getNewHeaders(mode, imageBytes, pSymVec->size(), currState, tANSbits.size(), pLoVec->size()); + pOutput->tANSbits = tANSbits; + pOutput->symVec = *pSymVec; + pOutput->loVec = *pLoVec; + pOutput->initialState = currState; + return true; +} + +bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage) +{ + std::vector decodedImage = decodeImageShort(pInput); + return compareVectorsShort(&decodedImage, pImage); +} + +std::vector decodeImageShort(CompressedImage *pInput) +{ + DataVecs dataVecs = decodeDataVectorsNew(pInput); + return decodeBytesShort(&dataVecs.loVec, &dataVecs.symVec); +} + +std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec) +{ + std::vector decodedImage; + size_t loIndex = 0; + size_t symIndex = 0; + while (loIndex < pLoVec->size()) + { + size_t currLength = 0; + size_t currOffset = 0; + currLength += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currLength += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + currOffset += (*pLoVec)[loIndex] & LO_LOW_BITS_MASK; + loIndex++; + if (((*pLoVec)[loIndex-1] & LO_CONTINUE_BIT) == LO_CONTINUE_BIT) + { + currOffset += (*pLoVec)[loIndex] << LO_NUM_LOW_BITS; + loIndex++; + } + if (currLength != 0) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + for (size_t i = 0; i < currLength; i++) + decodedImage.push_back(decodedImage[decodedImage.size() - currOffset]); + } + else + { + for (size_t i = 0; i < currOffset; i++) + { + decodedImage.push_back((*pSymVec)[symIndex]); + symIndex++; + } + } + } + return decodedImage; +} + +DataVecs decodeDataVectorsNew(CompressedImage *pInput) +{ + CompressedImage headerValues; + readNewHeader(&pInput->headers, &headerValues); + size_t loSize = headerValues.loSize; + size_t symSize = headerValues.symSize; + CompressionMode mode = headerValues.mode; + bool loEncoded = isModeLoEncoded(mode); + bool symEncoded = isModeSymEncoded(mode); + bool symDelta = isModeSymDelta(mode); + std::vector symbols = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + std::vector loDecode; + std::vector symDecode; + + std::vector loVec(loSize); + std::vector symVec(symSize); + std::vector loNibbles(loSize*2); + std::vector symNibbles(symSize*4); + + if (loEncoded) + { + std::vector loFreqs = unpackFrequencies(&pInput->loFreqs[0]); + loDecode = createDecodingTable(symbols, loFreqs); + } + if (symEncoded) + { + std::vector symFreqs = unpackFrequencies(&pInput->symFreqs[0]); + symDecode = createDecodingTable(symbols, symFreqs); + } + + std::vector allBits(pInput->tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : pInput->tANSbits) + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + + if (!symEncoded) + for (size_t i = 0; i < symSize; i++) + symVec[i] = pInput->symVec[i]; + if (!loEncoded) + for (size_t i = 0; i < loSize; i++) + loVec[i] = pInput->loVec[i]; + + size_t bitIndex = 0; + int currState = pInput->initialState; + if (loEncoded) + { + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, loSize*2, !symEncoded); + } + if (loEncoded) + for (size_t i = 0; i < loVec.size(); i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + + if (symEncoded) + { + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, symSize*4, true); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + } + if (symEncoded) + for (size_t i = 0; i < symVec.size(); i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (j*4); + + DataVecs returnData; + returnData.loVec = loVec; + returnData.symVec = symVec; + return returnData; +} + +void readNewHeader(std::vector *pInput, CompressedImage *pOutput) +{ + std::vector headers(2); + headers[0] = (*pInput)[0]; + headers[1] = (*pInput)[1]; + pOutput->mode = (CompressionMode)(headers[0] & MODE_MASK); + pOutput->rawNumBytes = ((headers[0] >> IMAGE_SIZE_OFFSET) & IMAGE_SIZE_MASK) * IMAGE_SIZE_MODIFIER; + pOutput->symSize = ((headers[0] >> SYM_SIZE_OFFSET) & SYM_SIZE_MASK); + + pOutput->initialState = headers[1] & INITIAL_STATE_MASK; + pOutput->bitreamSize = (headers[1] >> BITSTREAM_SIZE_OFFSET) & BITSTREAM_SIZE_MASK; + pOutput->loSize = (headers[1] >> LO_SIZE_OFFSET) & LO_SIZE_MASK; + pOutput->headers = headers; +} + +std::vector unpackFrequencies(unsigned int pInts[3]) +{ + std::vector returnVec; + int freq15 = 0; + for (size_t i = 0; i < 3; i++) + { + for (size_t j = 0; j < 5; j++) + { + int currVal = (pInts[i] >> (6*j)) & 0x3f; + returnVec.push_back(currVal); + } + freq15 += ((pInts[i] >> 30) & 0x3) << (2*i); + } + returnVec.push_back(freq15); + return returnVec; +} + +void getUIntVecFromData(CompressedImage *pImage, std::vector *pOutput) +{ + CompressedImage otherImage; + readNewHeader(&pImage->headers, &otherImage); + pOutput->push_back(pImage->headers[0]); + pOutput->push_back(pImage->headers[1]); + if (isModeLoEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + pOutput->push_back(pImage->loFreqs[i]); + if (isModeSymEncoded(otherImage.mode)) + for (size_t i = 0; i < 3; i++) + pOutput->push_back(pImage->symFreqs[i]); + if (isModeLoEncoded(otherImage.mode) || isModeSymEncoded(otherImage.mode)) + for (unsigned int ui : pImage->tANSbits) + pOutput->push_back(ui); + unsigned int currInt = 0; + unsigned int currOffset = 0; + if (!isModeSymEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->symVec.size(); i++) + { + currInt += pImage->symVec[i] << (8*(currOffset % 4)); + currOffset += 2; + if (currOffset % 4 == 0) + { + pOutput->push_back(currInt); + currInt = 0; + } + } + } + if (!isModeLoEncoded(otherImage.mode)) + { + for (size_t i = 0; i < pImage->loVec.size(); i++) + { + currInt += 0; + currInt += pImage->loVec[i] << (8*(currOffset % 4)); + currOffset++; + if (currOffset % 4 == 0) + { + pOutput->push_back(currInt); + currInt = 0; + } + } + } + if (currOffset != 0) + pOutput->push_back(currInt); +} + +void readRawDataVecs(std::vector *pInput, std::vector *pOutput) +{ + CompressedImage readImage; + readNewHeader(pInput, &readImage); + bool loEncoded = isModeLoEncoded(readImage.mode); + bool symEncoded = isModeSymEncoded(readImage.mode); + bool symDelta = isModeSymDelta(readImage.mode); + size_t readIndex = 2; + std::vector tANSbits; + std::vector allBits; + std::vector symVec(readImage.symSize); + std::vector loVec(readImage.loSize); + std::vector symDecode(TANS_TABLE_SIZE); + std::vector loDecode(TANS_TABLE_SIZE); + int currState = readImage.initialState; + if (loEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.loFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector loFreqs = unpackFrequencies(&readImage.loFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < loFreqs[i]; j++) + { + loDecode[currCol].state = TANS_TABLE_SIZE + currCol; + loDecode[currCol].symbol = i; + loDecode[currCol].y = loFreqs[i] + j; + int currK = 0; + while ((loDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + loDecode[currCol].k = currK; + currCol++; + } + } + } + if (symEncoded) + { + for (size_t i = 0; i < 3; i++) + readImage.symFreqs[i] = (*pInput)[readIndex + i]; + readIndex += 3; + std::vector symFreqs = unpackFrequencies(&readImage.symFreqs[0]); + size_t currCol = 0; + for (size_t i = 0; i < 16; i++) + { + for (size_t j = 0; j < symFreqs[i]; j++) + { + symDecode[currCol].state = TANS_TABLE_SIZE + currCol; + symDecode[currCol].symbol = i; + symDecode[currCol].y = symFreqs[i] + j; + int currK = 0; + while ((symDecode[currCol].y << currK) < TANS_TABLE_SIZE) + currK++; + symDecode[currCol].k = currK; + currCol++; + } + } + } + if (loEncoded || symEncoded) + { + tANSbits.resize(readImage.bitreamSize); + for (size_t i = 0; i < readImage.bitreamSize; i++) + tANSbits[i] = (*pInput)[readIndex + i]; + readIndex += readImage.bitreamSize; + allBits.resize(tANSbits.size()*32); + size_t currIndex = 0; + for (unsigned int ui : tANSbits) + { + for (size_t i = 0; i < 32; i++) + { + unsigned int currVal = (ui >> i) & 0x1; + allBits[currIndex] = currVal; + currIndex++; + } + } + } + bool leftOverValues = false; + if (!symEncoded) + { + for (size_t i = 0; i < readImage.symSize; i++) + { + symVec[i] = ((*pInput)[readIndex] >> (16*(i%2))) & 0xffff; + if ((i+1) % 2 == 0) + { + readIndex++; + leftOverValues = false; + } + else + { + leftOverValues = true; + } + } + } + if (!loEncoded) + { + size_t offsetMod = 0; + if (leftOverValues) + offsetMod = 2; + for (size_t i = 0; i < readImage.loSize; i++) + { + loVec[i] = ((*pInput)[readIndex] >> (8*((i%4) + offsetMod))) & 0xff; + if ((i+offsetMod+1) % 4 == 0) + readIndex++; + } + } + size_t bitIndex = 0; + if (loEncoded) + { + std::vector loNibbles(readImage.loSize*2); + bitIndex = decodeNibbles(loDecode, &allBits, &currState, &loNibbles, bitIndex, readImage.loSize*2, !symEncoded); + for (size_t i = 0; i < readImage.loSize; i++) + loVec[i] = loNibbles[2*i] + (loNibbles[2*i + 1] << 4); + } + if (symEncoded) + { + std::vector symNibbles(readImage.symSize*4); + bitIndex = decodeNibbles(symDecode, &allBits, &currState, &symNibbles, bitIndex, readImage.symSize*4, true); + if (symDelta) + deltaDecode(&symNibbles, symNibbles.size()); + for (size_t i = 0; i < readImage.symSize; i++) + for (size_t j = 0; j < 4; j++) + symVec[i] += (unsigned short)symNibbles[i*4 + j] << (4*j); + } + *pOutput = decodeBytesShort(&loVec, &symVec); +} + +InputSettings::InputSettings() {} + +InputSettings::InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms) +{ + this->canEncodeLO = canEncodeLO; + this->canEncodeSyms = canEncodeSyms; + this->canDeltaSyms = canDeltaSyms; +} + +bool readFileAsUC(std::string filePath, std::vector *pFileData) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return false; + } + + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + pFileData->resize(size); + iStream.read((char *)(pFileData->data()), size); + iStream.close(); + return true; +} + +bool readFileAsUInt(std::string filePath, std::vector *pFileData) +{ + std::ifstream iStream; + iStream.open(filePath.c_str(), std::ios::binary); + if (!iStream.is_open()) + { + fprintf(stderr, "Error: Couldn't open %s for reading bytes\n", filePath.c_str()); + return false; + } + + iStream.ignore( std::numeric_limits::max() ); + std::streamsize size = iStream.gcount(); + iStream.clear(); + iStream.seekg( 0, std::ios_base::beg ); + pFileData->resize(size/4); + iStream.read((char *)(pFileData->data()), size); + iStream.close(); + return true; +} + +CompressedImage processImage(std::string fileName, InputSettings settings) +{ + CompressedImage image; + std::vector input; + if (!readFileAsUC(fileName, &input)) + { + fprintf(stderr, "Compression failure\n"); + return image; + } + if (!processImageData(&input, &image, settings, fileName)) + { + fprintf(stderr, "Fail\n"); + } + return image; +} + +// Not implemented yet +CompressedImage processImageFrames(std::string fileName, InputSettings settings) +{ + CompressedImage image; + return image; +} + +bool processImageData(std::vector *pInput, CompressedImage *pImage, InputSettings settings, std::string fileName) +{ + CompressionMode someMode; + bool hasImage = false; + bool byteFail = false; + bool copyFail = false; + bool compressionFail = false; + bool uIntConversionFail = false; + + std::vector usBase(pInput->size() / 2); + memcpy(usBase.data(), pInput->data(), pInput->size()); + + std::vector bestLO; + std::vector bestSym; + std::vector bestInstructions; + + for (size_t minCodeLength = 2; minCodeLength <= 15; minCodeLength++) + { + std::vector shortCopies; + if (!getShortCopies(&usBase, minCodeLength, &shortCopies)) + { + copyFail = true; + printf("ERROR: %zu\n", minCodeLength); + continue; + } + + std::vector shortInstructions; + if (!getShortInstructions(&shortCopies, &shortInstructions, &usBase)) + { + printf("ERROR\n"); + return false; + } + + std::vector loVec; + std::vector symVec; + getLosFromInstructions(&shortInstructions, &loVec); + getSymsFromInstructions(&shortInstructions, &symVec); + if (!verifyBytesShort(&loVec, &symVec, &usBase)) + { + byteFail = true; + printf("Byte veri\n"); + continue; + } + + CompressionMode mode = BASE_ONLY; + std::vector modesToUse = {BASE_ONLY, ENCODE_SYMS, ENCODE_DELTA_SYMS, ENCODE_LO, ENCODE_BOTH, ENCODE_BOTH_DELTA_SYMS}; + if (fileName.find("test/compression/") != std::string::npos) + { + if (fileName.find("mode_0.4bpp") != std::string::npos) + modesToUse = {BASE_ONLY}; + else if (fileName.find("mode_1.4bpp") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + else if (fileName.find("mode_2.4bpp") != std::string::npos) + modesToUse = {ENCODE_DELTA_SYMS}; + else if (fileName.find("mode_3.4bpp") != std::string::npos) + modesToUse = {ENCODE_LO}; + else if (fileName.find("mode_4.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH}; + else if (fileName.find("mode_5.4bpp") != std::string::npos) + modesToUse = {ENCODE_BOTH_DELTA_SYMS}; + else if (fileName.find("test/compression/table_") != std::string::npos) + modesToUse = {ENCODE_SYMS}; + + if (modesToUse.size() == 1) + { + settings.canDeltaSyms = true; + settings.canEncodeLO = true; + settings.canEncodeSyms = true; + } + } + for (CompressionMode currMode : modesToUse) + { + CompressedImage currImg; + mode = currMode; + if (!settings.canDeltaSyms + && (mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeLO + && (mode == ENCODE_LO + || mode == ENCODE_BOTH + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!settings.canEncodeSyms + && (mode == ENCODE_SYMS + || mode == ENCODE_BOTH + || mode == ENCODE_DELTA_SYMS + || mode == ENCODE_BOTH_DELTA_SYMS)) + continue; + if (!fillCompressVec(&loVec, &symVec, mode, pInput->size(), fileName, &currImg)) + { + printf("ERROR\n"); + } + + if (!verifyCompressionShort(&currImg, &usBase)) + { + compressionFail = true; + printf("ERROR\n"); + continue; + } + std::vector uiVec; + getUIntVecFromData(&currImg, &uiVec); + std::vector decodedImage; + readRawDataVecs(&uiVec, &decodedImage); + if (!compareVectorsShort(&decodedImage, &usBase)) + { + uIntConversionFail = true; + printf("ERROR\n"); + continue; + } + currImg.compressedSize = uiVec.size() * 4; + if (!hasImage) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + *pImage = currImg; + hasImage = true; + pImage->writeVec = uiVec; + someMode = mode; + } + else if (currImg.compressedSize < pImage->compressedSize) + { + bestLO = loVec; + bestSym = symVec; + bestInstructions = shortInstructions; + *pImage = currImg; + hasImage = true; + pImage->writeVec = uiVec; + someMode = mode; + } + } + } + pImage->mode = someMode; + pImage->fileName = fileName; + pImage->rawNumBytes = pInput->size(); + if (hasImage) + { + pImage->isValid = true; + } + else + { + fprintf(stderr, "Failed to compress image %s\nErrors: ", fileName.c_str()); + if (copyFail) + fprintf(stderr, "CopyProcessing "); + if (byteFail) + fprintf(stderr, "ByteConversion "); + if (compressionFail) + fprintf(stderr, "Compression "); + if (uIntConversionFail) + fprintf(stderr, "uIntConversion "); + printf("\n"); + } + + return true; +} diff --git a/tools/compresSmol/compressAlgo.h b/tools/compresSmol/compressAlgo.h index e27c599cef..6c2ff9373e 100644 --- a/tools/compresSmol/compressAlgo.h +++ b/tools/compresSmol/compressAlgo.h @@ -54,20 +54,7 @@ struct ShortCopy { size_t length; size_t offset; unsigned short firstSymbol; - std::vector usSequence; - ShortCopy(); - ShortCopy(size_t index, size_t length, size_t offset, std::vector usSequence); -}; - -struct CompressionInstruction { - size_t length; - size_t offset; - size_t index; - unsigned char firstSymbol; - std::vector symbols; - std::vector bytes; - void buildBytes(); - bool verifyInstruction(); + ShortCopy(size_t index, size_t length, size_t offset, unsigned short firstSymbol); }; struct ShortCompressionInstruction { @@ -75,20 +62,9 @@ struct ShortCompressionInstruction { size_t offset; size_t index; unsigned short firstSymbol; - std::vector symbols; std::vector loBytes; std::vector symShorts; - void buildBytes(); - bool verifyInstruction(); -}; - -struct SortedShortElement { - size_t index; - ShortCopy copy; - bool isRun = false; - bool isCopy = false; - SortedShortElement(); - SortedShortElement(size_t index, ShortCopy copy); + void buildBytes(std::vector *pInput); }; struct CompressedImage { @@ -116,7 +92,6 @@ struct InputSettings { bool canEncodeLO = true; bool canEncodeSyms = true; bool canDeltaSyms = true; - bool shouldCompare = false; bool useFrames = false; InputSettings(); InputSettings(bool canEncodeLO, bool canEncodeSyms, bool canDeltaSyms); @@ -127,45 +102,38 @@ struct DataVecs { std::vector symVec; }; -void analyzeImages(std::vector *allImages, std::mutex *imageMutex, FileDispatcher *dispatcher, std::mutex *dispatchMutex, InputSettings settings); - CompressedImage processImage(std::string fileName, InputSettings settings); CompressedImage processImageFrames(std::string fileName, InputSettings settings); -CompressedImage processImageData(std::vector input, InputSettings settings, std::string fileName); +bool processImageData(std::vector *pInput, CompressedImage *pImage, InputSettings settings, std::string fileName); -std::vector readFileAsUInt(std::string filePath); +bool readFileAsUInt(std::string filePath, std::vector *pFileData); -size_t getCompressedSize(CompressedImage *pImage); - -std::vector getShortCopies(std::vector input, size_t minLength); +bool getShortCopies(std::vector *pInput, size_t minLength, std::vector *pShortCopies); bool verifyShortCopies(std::vector *pCopies, std::vector *pImage); std::vector getNormalizedCounts(std::vector input); std::vector getFreqWriteInts(std::vector input); std::vector getNewHeaders(CompressionMode mode, size_t imageSize, size_t symLength, int initialState, size_t bitstreamSize, size_t loLength); -int findInitialState(EncodeCol encodeCol, unsigned char firstSymbol); -CompressedImage fillCompressVecNew(std::vector loVec, std::vector symVec, CompressionMode mode, size_t imageBytes, std::string name); -std::vector getShortInstructions(std::vector copies, size_t lengthMod); -std::vector getLosFromInstructions(std::vector instructions); -std::vector getSymsFromInstructions(std::vector instructions); +int findInitialState(EncodeCol *encodeCol, unsigned char firstSymbol); + +bool fillCompressVec(std::vector *pLoVec, std::vector *pSymVec, CompressionMode mode, size_t imageBytes, std::string name, CompressedImage *pOutput); + +bool getShortInstructions(std::vector *pCopies, std::vector *pInstructions, std::vector *pInput); +void getLosFromInstructions(std::vector *pInstructions, std::vector *pOutput); +void getSymsFromInstructions(std::vector *pInstructions, std::vector *pOutput); std::vector unpackFrequencies(unsigned int pInts[3]); -CompressedImage getDataFromUIntVec(std::vector *pInput); -CompressedImage readNewHeader(std::vector *pInput); -std::vector getUIntVecFromData(CompressedImage *pImage); +void readNewHeader(std::vector *pInput, CompressedImage *pOutput); +void getUIntVecFromData(CompressedImage *pImage, std::vector *pOutput); std::vector decodeBytesShort(std::vector *pLoVec, std::vector *pSymVec); std::vector decodeImageShort(CompressedImage *pInput); DataVecs decodeDataVectorsNew(CompressedImage *pInput); - -size_t decodeNibbles(std::vector decodeTable, std::vector *bits, int *currState, std::vector *nibbleVec, size_t currBitIndex, size_t numNibbles); - bool compareVectorsShort(std::vector *pVec1, std::vector *pVec2); bool verifyCompressionShort(CompressedImage *pInput, std::vector *pImage); -bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage); -bool verifyUIntVecShort(std::vector *pInput, std::vector *pImage); -std::vector readRawDataVecs(std::vector *pInput); +bool verifyBytesShort(std::vector *pLoVec, std::vector *pSymVec, std::vector *pImage); +void readRawDataVecs(std::vector *pInput, std::vector *pOutput); bool isModeLoEncoded(CompressionMode mode); bool isModeSymEncoded(CompressionMode mode); @@ -175,4 +143,5 @@ void deltaEncode(std::vector *buffer, int length); void deltaDecode(std::vector *buffer, int length); std::vector getTestFreqs(std::vector freqs, std::string name); + #endif diff --git a/tools/compresSmol/compressSmolTiles.cpp b/tools/compresSmol/compressSmolTiles.cpp index f8c14e7b38..b4a7ff0fcf 100644 --- a/tools/compresSmol/compressSmolTiles.cpp +++ b/tools/compresSmol/compressSmolTiles.cpp @@ -91,15 +91,19 @@ std::vector decompressVector(std::vector *pVec) CompressVectors compressVector(std::vector *pVec) { CompressVectors vecs; - std::vector shortCopies = getShortCopies(*pVec, 2); + std::vector shortCopies; + getShortCopies(pVec, 2, &shortCopies); if (!verifyShortCopies(&shortCopies, pVec)) { fprintf(stderr, "Error getting tile-number compression\n"); return vecs; } - std::vector shortInstructions = getShortInstructions(shortCopies, 0); - std::vector loVec = getLosFromInstructions(shortInstructions); - std::vector symVec = getSymsFromInstructions(shortInstructions); + std::vector shortInstructions; + getShortInstructions(&shortCopies, &shortInstructions, pVec); + std::vector loVec; + getLosFromInstructions(&shortInstructions, &loVec); + std::vector symVec; + getSymsFromInstructions(&shortInstructions, &symVec); if (!verifyBytesShort(&loVec, &symVec, pVec)) { diff --git a/tools/compresSmol/mainTiles.cpp b/tools/compresSmol/mainTiles.cpp index 1fa083446a..29626ceae3 100644 --- a/tools/compresSmol/mainTiles.cpp +++ b/tools/compresSmol/mainTiles.cpp @@ -19,6 +19,7 @@ int main(int argc, char *argv[]) fileOut.close(); return 0; } + /* else if (argc == 2) { std::filesystem::path filePath = argv[1]; @@ -66,6 +67,7 @@ int main(int argc, char *argv[]) printf("New size: %zu\n", totalSize); return 0; } + */ else { return 0; diff --git a/tools/compresSmol/tANS.cpp b/tools/compresSmol/tANS.cpp index 40abd8a658..36d84cabab 100644 --- a/tools/compresSmol/tANS.cpp +++ b/tools/compresSmol/tANS.cpp @@ -1,4 +1,5 @@ #include "tANS.h" +#include std::vector createDecodingTable(std::vector symbols, std::vector frequencies) { @@ -8,6 +9,7 @@ std::vector createDecodingTable(std::vector symbols, s { for (size_t j = 0; j < frequencies[i]; j++) { + //printf("%zu %zu\n", table.size(), currCol); table[currCol].state = TANS_TABLE_SIZE + currCol; table[currCol].symbol = symbols[i]; table[currCol].y = frequencies[i] + j; From cb4ef705f7f6a3804467484b4f2b95e6e4a6100f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 10 Jun 2025 03:47:16 +0200 Subject: [PATCH 046/248] Remove redundancy for ShouldLowerStat functions (#6577) --- include/battle_ai_util.h | 11 +-- src/battle_ai_main.c | 116 ++++++----------------- src/battle_ai_util.c | 196 ++++++++++++++------------------------- 3 files changed, 100 insertions(+), 223 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 0a70acce1f..ff9ea73d3b 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -120,18 +120,11 @@ void DecideTerastal(u32 battler); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat); +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat); bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); -bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility); -bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); // move checks bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); @@ -152,6 +145,7 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); @@ -245,6 +239,7 @@ bool32 SideHasMoveCategory(u32 battlerId, u32 category); // score increases u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId); +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat); void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9924dc74c4..e2d5e52b6f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1543,40 +1543,40 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // stat lowering effects case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) ADJUST_SCORE(-10); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPDEF)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ACC)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ACC)) ADJUST_SCORE(-10); break; case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: case EFFECT_TICKLE: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) ADJUST_SCORE(-8); break; case EFFECT_VENOM_DRENCH: @@ -1586,18 +1586,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) ADJUST_SCORE(-8); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) ADJUST_SCORE(-6); } break; case EFFECT_NOBLE_ROAR: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) ADJUST_SCORE(-8); break; case EFFECT_CAPTIVATE: @@ -1658,7 +1658,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOXIC_THREAD: - if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison //fallthrough case EFFECT_LIGHT_SCREEN: @@ -2066,7 +2066,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (!ShouldLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_COPYCAT: @@ -3940,89 +3940,31 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!ShouldLowerAttack(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].statStages[STAT_ATK] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(-1); - else if (aiData->hpPercents[battlerAtk] <= 90) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_ATK] > 3 && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - else if (aiData->hpPercents[battlerDef] < 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ATK)); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!ShouldLowerDefense(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 && !AI_RandLessThan(50)) || (gBattleMons[battlerDef].statStages[STAT_DEF] <= 3 && !AI_RandLessThan(50))) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_DEF)); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (AI_IsFaster(battlerAtk, battlerDef, move)) - ADJUST_SCORE(-3); - else if (!AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!ShouldLowerSpAtk(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].statStages[STAT_SPATK] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(-1); - else if (aiData->hpPercents[battlerAtk] <= 90) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_SPATK] > 3 && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - else if (aiData->hpPercents[battlerDef] < 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPATK)); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!ShouldLowerSpDef(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 && !AI_RandLessThan(50)) - || (gBattleMons[battlerDef].statStages[STAT_SPDEF] <= 3 && !AI_RandLessThan(50))) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPDEF)); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (ShouldLowerAccuracy(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 || aiData->hpPercents[battlerDef] < 70) && AI_RandLessThan(100)) - ADJUST_SCORE(-1); - if (gBattleMons[battlerDef].statStages[STAT_ACC] <= 4 && !AI_RandLessThan(80)) - ADJUST_SCORE(-2); - if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_ROOTED && AI_RandLessThan(128)) - ADJUST_SCORE(WEAK_EFFECT); - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED && !AI_RandLessThan(70)) - ADJUST_SCORE(DECENT_EFFECT); - if (aiData->hpPercents[battlerAtk] > 70 || gBattleMons[battlerDef].statStages[STAT_ACC] < DEFAULT_STAT_STAGE) - break; - else if (aiData->hpPercents[battlerAtk] < 40 || aiData->hpPercents[battlerDef] < 40 || !AI_RandLessThan(70)) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ACC)); break; case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: - if (!ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-2); - if ((aiData->hpPercents[battlerAtk] < 70 || gBattleMons[battlerDef].statStages[STAT_EVASION] <= 3) && !AI_RandLessThan(50)) - ADJUST_SCORE(-2); - if (aiData->hpPercents[battlerDef] <= 70) - ADJUST_SCORE(-2); - if (gBattleMons[battlerAtk].statStages[STAT_ACC] < DEFAULT_STAT_STAGE) - ADJUST_SCORE(WEAK_EFFECT); - if (gBattleMons[battlerDef].statStages[STAT_EVASION] < 7 || aiData->abilities[battlerAtk] == ABILITY_NO_GUARD) - ADJUST_SCORE(-2); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); break; case EFFECT_SPICY_EXTRACT: // TODO: Make IncreaseStatDownScore function, just like IncreaseStatUpScore @@ -4543,8 +4485,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move)) // Partner going first break; // Don't use Defog if partner is going to set up hazards } - if (ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); } break; case EFFECT_TORMENT: @@ -4789,11 +4730,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_TICKLE: - if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) - && aiData->abilities[battlerDef] != ABILITY_CONTRARY && ShouldLowerDefense(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); - else if (ShouldLowerAttack(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ATK)); + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_DEF)); break; case EFFECT_COSMIC_POWER: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); @@ -5231,8 +5169,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SPD_MINUS_2: - if (!ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - break; + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); + break; case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: case MOVE_EFFECT_SP_ATK_MINUS_1: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dbbd30c68a..4e01cfb296 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -992,7 +992,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -1002,7 +1002,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(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; } @@ -1928,7 +1928,7 @@ s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) } // stat stages -bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) { if (gBattleMons[battlerDef].statStages[stat] == MIN_STAT_STAGE) return FALSE; @@ -1965,7 +1965,6 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) return FALSE; } - // This should be a viability check if (stat == STAT_SPEED) { // If AI is faster and doesn't have any mons left, lowering speed doesn't give any @@ -1977,6 +1976,73 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) return TRUE; } +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) +{ + u32 tempScore = NO_INCREASE; + + // Don't increase score if target is already -3 stat stage + if (stat != STAT_SPEED && gBattleMons[battlerDef].statStages[stat] <= DEFAULT_STAT_STAGE - 3) + return NO_INCREASE; + + // Don't decrease stat if target will die to residual damage + if (GetBattlerSecondaryDamage(battlerDef) >= gBattleMons[battlerDef].hp) + return NO_INCREASE; + + // Don't decrese stat if opposing battler has Encore + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) + return NO_INCREASE; + + // TODO: Avoid decreasing stat if + // player can kill ai in 2 hits with decreased attack / sp atk stages + // ai can kill target in 2 hits without decreasing defense / sp def stages + + switch (stat) + { + case STAT_ATK: + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_DEF: + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_SPEED: + if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered)) + tempScore += DECENT_EFFECT; + break; + case STAT_SPATK: + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_SPDEF: + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)) + tempScore += DECENT_EFFECT; + break; + case STAT_ACC: + if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) + tempScore += WEAK_EFFECT; + if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + tempScore += WEAK_EFFECT; + if (gStatuses3[battlerDef] & STATUS3_ROOTED) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].status2 & STATUS2_CURSED) + tempScore += WEAK_EFFECT; + break; + case STAT_EVASION: + if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) + tempScore += WEAK_EFFECT; + if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + tempScore += WEAK_EFFECT; + if (gStatuses3[battlerDef] & STATUS3_ROOTED) + tempScore += WEAK_EFFECT; + if (gBattleMons[battlerDef].status2 & STATUS2_CURSED) + tempScore += WEAK_EFFECT; + break; + } + + return (tempScore > BEST_EFFECT) ? BEST_EFFECT : tempScore; // don't inflate score so only max +4 +} + bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat) { if ((gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) @@ -2032,128 +2098,6 @@ u32 CountNegativeStatStages(u32 battlerId) return count; } -bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_ATK] > 4 - && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_HYPER_CUTTER - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_BIG_PECKS - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (defAbility == ABILITY_CONTRARY - || defAbility == ABILITY_CLEAR_BODY - || defAbility == ABILITY_FULL_METAL_BODY - || defAbility == ABILITY_WHITE_SMOKE - || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) - return FALSE; - - return (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered)); -} - -bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_SPATK] > 4 - && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_SPDEF] > 4 - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_WHITE_SMOKE - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_KEEN_EYE - && defAbility != ABILITY_MINDS_EYE - && (B_ILLUMINATE_EFFECT >= GEN_9 && defAbility != ABILITY_ILLUMINATE) - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - -bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility) -{ - if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) - && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - return FALSE; // Don't bother lowering stats if can kill enemy. - - if (gBattleMons[battlerDef].statStages[STAT_EVASION] > DEFAULT_STAT_STAGE - && defAbility != ABILITY_CONTRARY - && defAbility != ABILITY_CLEAR_BODY - && defAbility != ABILITY_FULL_METAL_BODY - && defAbility != ABILITY_WHITE_SMOKE - && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) - return TRUE; - return FALSE; -} - bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext) { s32 dmg; From c9a49e696e1da293d924d1c5825477d76b778fe5 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 11 Jun 2025 17:55:32 +0200 Subject: [PATCH 047/248] Increased heap by 768 bytes (#7097) Co-authored-by: Hedara --- include/malloc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/malloc.h b/include/malloc.h index ca4ff8af7e..b3f176e330 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -41,7 +41,7 @@ struct MemBlock u8 data[0]; }; -#define HEAP_SIZE 0x1C000 +#define HEAP_SIZE 0x1C300 extern u8 gHeap[HEAP_SIZE]; #if TESTING || !defined(NDEBUG) From 3db12a0ae67d564927e301b8bdc8fd0c1057a10a Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:30:22 -0400 Subject: [PATCH 048/248] Haze Boosting AI Followup (#6966) --- include/config/ai.h | 1 + include/random.h | 1 + src/battle_ai_util.c | 5 +++-- test/battle/ai/ai.c | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index 987e1fff5e..91ee3525ae 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -55,6 +55,7 @@ // AI move scoring #define STATUS_MOVE_FOCUS_PUNCH_CHANCE 50 // Chance the AI will use a status move if the player's best move is Focus Punch +#define BOOST_INTO_HAZE_CHANCE 0 // Chance the AI will use a stat boosting move if the player has used Haze // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit diff --git a/include/random.h b/include/random.h index dc3c73cc3a..f23ff2f184 100644 --- a/include/random.h +++ b/include/random.h @@ -199,6 +199,7 @@ enum RandomTag RNG_AI_PREDICT_SWITCH, RNG_AI_PREDICT_MOVE, RNG_AI_STATUS_FOCUS_PUNCH, + RNG_AI_BOOST_INTO_HAZE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, }; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a8b34da119..d84a7b6343 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4124,9 +4124,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has used Haze effect - if (HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE) + if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) && + (HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE) || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) - || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE)) + || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) return NO_INCREASE; // Don't increase if AI is at +1 and opponent has Haze effect diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 0c5d8793c8..fcef7ac4f7 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -865,3 +865,18 @@ AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_RAIN_DANCE); } } } + +AI_SINGLE_BATTLE_TEST("AI won't use stat boosting moves if the player has used Haze") +{ + PASSES_RANDOMLY(BOOST_INTO_HAZE_CHANCE, 100, RNG_AI_BOOST_INTO_HAZE); + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAZE) == EFFECT_HAZE); + ASSUME(GetMoveEffect(MOVE_DRAGON_DANCE) == EFFECT_DRAGON_DANCE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_HAZE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_DRAGON_DANCE); } + } WHEN { + TURN { MOVE(player, MOVE_HAZE); EXPECT_MOVE(opponent, MOVE_DRAGON_DANCE); } + TURN { MOVE(player, MOVE_HAZE); EXPECT_MOVE(opponent, MOVE_DRAGON_DANCE); } + } +} From aa78420b9e616d61801cc3fa174a6347c4c18f47 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 12 Jun 2025 10:41:46 +0200 Subject: [PATCH 049/248] Deprecate absent member from battlerState (#7091) --- include/battle.h | 3 +-- src/battle_main.c | 8 +++----- src/battle_script_commands.c | 2 -- src/battle_util.c | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/include/battle.h b/include/battle.h index 086c9b25be..10021aebd3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -575,7 +575,6 @@ struct BattlerState u8 targetsDone[MAX_BATTLERS_COUNT]; u32 commandingDondozo:1; - u32 absent:1; u32 focusPunchBattlers:1; u32 multipleSwitchInBattlers:1; u32 alreadyStatusedMoveAttempt:1; // For example when using Thunder Wave on an already paralyzed Pokémon. @@ -589,7 +588,7 @@ struct BattlerState u32 pursuitTarget:1; u32 stompingTantrumTimer:2; u32 canPickupItem:1; - u32 padding:16; + u32 padding:17; // End of Word }; diff --git a/src/battle_main.c b/src/battle_main.c index ba41faf697..8b7ac3386b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3873,7 +3873,6 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; - gBattleStruct->battlerState[i].absent = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); } TurnValuesCleanUp(FALSE); SpecialStatusesClear(); @@ -3983,7 +3982,6 @@ void BattleTurnPassed(void) { gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; - gBattleStruct->battlerState[i].absent = (gAbsentBattlerFlags & (1u << i) ? TRUE : FALSE); gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gStatuses4[i] &= ~STATUS4_ELECTRIFIED; gBattleMons[i].status2 &= ~STATUS2_FLINCHED; @@ -4162,10 +4160,10 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI || (position & BIT_FLANK) == B_FLANK_LEFT - || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absent + || gAbsentBattlerFlags & 1u << GetBattlerAtPosition(BATTLE_PARTNER(position)) || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { - if (gBattleStruct->battlerState[battler].absent || gBattleStruct->battlerState[battler].commandingDondozo) + if (gAbsentBattlerFlags & 1u << battler || gBattleStruct->battlerState[battler].commandingDondozo) { gChosenActionByBattler[battler] = B_ACTION_NOTHING_FAINTED; if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -4553,7 +4551,7 @@ static void HandleTurnActionSelectionState(void) if (((gBattleTypeFlags & BATTLE_TYPE_MULTI) || !IsDoubleBattle()) || (position & BIT_FLANK) != B_FLANK_LEFT - || gBattleStruct->battlerState[GetBattlerAtPosition(BATTLE_PARTNER(position))].absent) + || gAbsentBattlerFlags & 1u << GetBattlerAtPosition(BATTLE_PARTNER(position))) { BtlController_EmitLinkStandbyMsg(battler, B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 75d15d6449..a371a076ea 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6730,7 +6730,6 @@ static void Cmd_moveend(void) } enum BattleMoveEffects originalEffect = GetMoveEffect(originallyUsedMove); if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !gBattleStruct->battlerState[gBattlerAttacker].absent && originalEffect != EFFECT_BATON_PASS && originalEffect != EFFECT_HEALING_WISH) { if (gHitMarker & HITMARKER_OBEYS) @@ -6774,7 +6773,6 @@ static void Cmd_moveend(void) break; case MOVEEND_MIRROR_MOVE: // mirror move if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !gBattleStruct->battlerState[gBattlerAttacker].absent && !IsMoveMirrorMoveBanned(originallyUsedMove) && gHitMarker & HITMARKER_OBEYS && gBattlerAttacker != gBattlerTarget diff --git a/src/battle_util.c b/src/battle_util.c index c197ed2b14..9bd2e80017 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -370,7 +370,7 @@ void HandleAction_UseMove(void) u32 i, moveTarget; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleStruct->battlerState[gBattlerAttacker].absent + if (gAbsentBattlerFlags & 1u << gBattlerAttacker || gBattleStruct->battlerState[gBattlerAttacker].commandingDondozo || !IsBattlerAlive(gBattlerAttacker)) { From 75982721cd2526fc7fc749f8fe58a788ca8da106 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 12 Jun 2025 10:42:42 +0200 Subject: [PATCH 050/248] Fixed changed effect for Sheer Cold (#7099) Co-authored-by: Hedara --- test/battle/move_animations/all_anims.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index cb21a1df05..2ab420e5c2 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -169,7 +169,7 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move); MOVE(defender, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO) + else if (gMovesInfo[move].effect == EFFECT_OHKO || gMovesInfo[move].effect == EFFECT_SHEER_COLD) { // defender needs to send out a different team member MOVE(attacker, move); SEND_OUT(defender, 1); @@ -298,7 +298,7 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move, target: target); MOVE(target, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO) + else if (gMovesInfo[move].effect == EFFECT_OHKO || gMovesInfo[move].effect == EFFECT_SHEER_COLD) { // Opponent needs to send out a different team member MOVE(attacker, move, target: target); SEND_OUT(target, 2); From e1b542944fb29fca947c975f363d36190026abfc Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 13 Jun 2025 14:16:40 +0200 Subject: [PATCH 051/248] Refactor damage calculations aruguments by using a struct context (#7108) --- include/battle_util.h | 20 +- src/battle_ai_util.c | 92 +++----- src/battle_script_commands.c | 34 +-- src/battle_tv.c | 19 +- src/battle_util.c | 440 ++++++++++++++++------------------- 5 files changed, 285 insertions(+), 320 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 53de080665..71f468996d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -159,7 +159,7 @@ enum { extern const struct TypePower gNaturalGiftTable[]; -struct DamageCalculationData +struct DamageContext { u32 battlerAtk:3; u32 battlerDef:3; @@ -168,9 +168,16 @@ struct DamageCalculationData u32 isCrit:1; u32 randomFactor:1; u32 updateFlags:1; - u32 padding:2; + u32 padding1:2; + u32 weather:16; + u32 fixedBasePower:8; + u32 padding2:8; + uq4_12_t typeEffectivenessModifier; + u32 abilityAtk:16; + u32 abilityDef:16; + enum ItemHoldEffect holdEffectAtk:16; + enum ItemHoldEffect holdEffectDef:16; }; -STATIC_ASSERT(sizeof(struct DamageCalculationData) <= 4, StructExceedsFourBytes); enum SleepClauseBlock { @@ -272,10 +279,9 @@ u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); -s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedBasePower); -s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef); -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef); +s32 CalculateMoveDamage(struct DamageContext *ctx); +s32 CalculateMoveDamageVars(struct DamageContext *ctx); +s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities); uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d84a7b6343..31807e74ab 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -616,10 +616,9 @@ static inline void AI_RestoreBattlerTypes(u32 battlerAtk, u32 *types) gBattleMons[battlerAtk].types[2] = types[2]; } -static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage, enum ItemHoldEffect holdEffectAtk, u32 abilityAtk) +static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage) { - u32 move = damageCalcData->move; - enum BattleMoveEffects effect = GetMoveEffect(move); + enum BattleMoveEffects effect = GetMoveEffect(ctx->move); u16 median = *medianDamage; u16 minimum = *minimumDamage; u16 maximum = *maximumDamage; @@ -627,19 +626,19 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal switch (effect) { case EFFECT_MULTI_HIT: - if (move == MOVE_WATER_SHURIKEN && gBattleMons[damageCalcData->battlerAtk].species == SPECIES_GRENINJA_ASH) + if (ctx->move == MOVE_WATER_SHURIKEN && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) { median *= 3; minimum *= 3; maximum *= 3; } - else if (abilityAtk == ABILITY_SKILL_LINK) + else if (ctx->abilityAtk == ABILITY_SKILL_LINK) { median *= 5; minimum *= 5; maximum *= 5; } - else if (holdEffectAtk == HOLD_EFFECT_LOADED_DICE) + else if (ctx->holdEffectAtk == HOLD_EFFECT_LOADED_DICE) { median *= 9; median /= 2; @@ -655,18 +654,19 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal break; case EFFECT_ENDEAVOR: // If target has less HP than user, Endeavor does no damage - median = maximum = minimum = max(0, gBattleMons[damageCalcData->battlerDef].hp - gBattleMons[damageCalcData->battlerAtk].hp); + median = maximum = minimum = max(0, gBattleMons[ctx->battlerDef].hp - gBattleMons[ctx->battlerAtk].hp); break; case EFFECT_BEAT_UP: if (B_BEAT_UP >= GEN_5) { - u32 partyCount = CalculatePartyCount(GetBattlerParty(damageCalcData->battlerAtk)); + u32 partyCount = CalculatePartyCount(GetBattlerParty(ctx->battlerAtk)); u32 i; gBattleStruct->beatUpSlot = 0; - damageCalcData->isCrit = FALSE; + ctx->isCrit = FALSE; + ctx->fixedBasePower = 0; median = 0; for (i = 0; i < partyCount; i++) - median += CalculateMoveDamage(damageCalcData, 0); + median += CalculateMoveDamage(ctx); maximum = minimum = median; gBattleStruct->beatUpSlot = 0; } @@ -676,7 +676,7 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal } // Handle other multi-strike moves - u32 strikeCount = GetMoveStrikeCount(move); + u32 strikeCount = GetMoveStrikeCount(ctx->move); if (strikeCount > 1 && effect != EFFECT_TRIPLE_KICK) { median *= strikeCount; @@ -684,11 +684,11 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal maximum *= strikeCount; } - if (abilityAtk == ABILITY_PARENTAL_BOND + if (ctx->abilityAtk == ABILITY_PARENTAL_BOND && !strikeCount && effect != EFFECT_TRIPLE_KICK && effect != EFFECT_MULTI_HIT - && !AI_IsDoubleSpreadMove(damageCalcData->battlerAtk, move)) + && !AI_IsDoubleSpreadMove(ctx->battlerAtk, ctx->move)) { median += median / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); minimum += minimum / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); @@ -781,14 +781,21 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, moveType); s32 fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = battlerAtk; - damageCalcData.battlerDef = battlerDef; - damageCalcData.move = move; - damageCalcData.moveType = moveType; - damageCalcData.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = FALSE; + struct DamageContext ctx; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = moveType; + ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); + ctx.randomFactor = FALSE; + ctx.updateFlags = FALSE; + ctx.weather = weather; + ctx.fixedBasePower = fixedBasePower; + ctx.typeEffectivenessModifier = effectivenessMultiplier; + ctx.abilityAtk = aiData->abilities[battlerAtk]; + ctx.abilityDef = aiData->abilities[battlerDef]; + ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; + ctx.holdEffectDef = aiData->holdEffects[battlerDef]; if (moveEffect == EFFECT_TRIPLE_KICK) { @@ -796,59 +803,34 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u { s32 damageByRollType = 0; - s32 oneTripleKickHit = CalculateMoveDamageVars(&damageCalcData, fixedBasePower, - effectivenessMultiplier, weather, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + s32 oneTripleKickHit = CalculateMoveDamageVars(&ctx); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_LOWEST); - simDamage.minimum += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.minimum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_DEFAULT); - simDamage.median += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.median += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_HIGHEST); - simDamage.maximum += ApplyModifiersAfterDmgRoll(damageByRollType, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.maximum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); } } else { - u32 damage = CalculateMoveDamageVars(&damageCalcData, fixedBasePower, - effectivenessMultiplier, weather, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + u32 damage = CalculateMoveDamageVars(&ctx); simDamage.minimum = GetDamageByRollType(damage, DMG_ROLL_LOWEST); - simDamage.minimum = ApplyModifiersAfterDmgRoll(simDamage.minimum, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.minimum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.minimum); simDamage.median = GetDamageByRollType(damage, DMG_ROLL_DEFAULT); - simDamage.median = ApplyModifiersAfterDmgRoll(simDamage.median, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.median = ApplyModifiersAfterDmgRoll(&ctx, simDamage.median); simDamage.maximum = GetDamageByRollType(damage, DMG_ROLL_HIGHEST); - simDamage.maximum = ApplyModifiersAfterDmgRoll(simDamage.maximum, &damageCalcData, effectivenessMultiplier, - aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef], - aiData->abilities[battlerAtk], aiData->abilities[battlerDef]); + simDamage.maximum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.maximum); } if (GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE) - { - CalcDynamicMoveDamage(&damageCalcData, - &simDamage.median, - &simDamage.minimum, - &simDamage.maximum, - aiData->holdEffects[battlerAtk], - aiData->abilities[battlerAtk]); - } + CalcDynamicMoveDamage(&ctx, &simDamage.median, &simDamage.minimum, &simDamage.maximum); AI_RestoreBattlerTypes(battlerAtk, types); } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a371a076ea..048c4d13de 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2063,18 +2063,18 @@ static void Cmd_critcalc(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static inline void CalculateAndSetMoveDamage(struct DamageCalculationData *damageCalcData, u32 battlerDef) +static inline void CalculateAndSetMoveDamage(struct DamageContext *ctx) { - SetDynamicMoveCategory(gBattlerAttacker, battlerDef, gCurrentMove); - damageCalcData->battlerDef = battlerDef; - damageCalcData->isCrit = gSpecialStatuses[battlerDef].criticalHit; - gBattleStruct->moveDamage[battlerDef] = CalculateMoveDamage(damageCalcData, 0); + SetDynamicMoveCategory(gBattlerAttacker, ctx->battlerDef, gCurrentMove); + ctx->isCrit = gSpecialStatuses[ctx->battlerDef].criticalHit; + ctx->fixedBasePower = 0; + gBattleStruct->moveDamage[ctx->battlerDef] = CalculateMoveDamage(ctx); // Slighly hacky but we need to check move result flags for distortion match-up as well but it can only be done after damage calcs - if (gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[ctx->battlerDef] & MOVE_RESULT_NO_EFFECT) { - gSpecialStatuses[battlerDef].distortedTypeMatchups = FALSE; - gSpecialStatuses[battlerDef].teraShellAbilityDone = FALSE; + gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups = FALSE; + gSpecialStatuses[ctx->battlerDef].teraShellAbilityDone = FALSE; } } @@ -2090,12 +2090,12 @@ static void Cmd_damagecalc(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = gBattlerAttacker; - damageCalcData.move = gCurrentMove; - damageCalcData.moveType = GetBattleMoveType(gCurrentMove); - damageCalcData.randomFactor = TRUE; - damageCalcData.updateFlags = TRUE; + struct DamageContext ctx; + ctx.battlerAtk = gBattlerAttacker; + ctx.move = gCurrentMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.randomFactor = TRUE; + ctx.updateFlags = TRUE; if (IsSpreadMove(moveTarget)) { @@ -2107,12 +2107,14 @@ static void Cmd_damagecalc(void) || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; - CalculateAndSetMoveDamage(&damageCalcData, battlerDef); + ctx.battlerDef = battlerDef; + CalculateAndSetMoveDamage(&ctx); } } else { - CalculateAndSetMoveDamage(&damageCalcData, gBattlerTarget); + ctx.battlerDef = gBattlerTarget; + CalculateAndSetMoveDamage(&ctx); } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_tv.c b/src/battle_tv.c index e7c182e537..4215d3ead3 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1261,15 +1261,16 @@ static void TrySetBattleSeminarShow(void) powerOverride = 0; if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride)) { - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = gBattlerAttacker; - damageCalcData.battlerDef = gBattlerTarget; - damageCalcData.move = gCurrentMove; - damageCalcData.moveType = GetMoveType(gCurrentMove); - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = FALSE; - gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&damageCalcData, powerOverride); + struct DamageContext ctx; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = gCurrentMove; + ctx.moveType = GetMoveType(gCurrentMove); + ctx.isCrit = FALSE; + ctx.randomFactor = FALSE; + ctx.updateFlags = FALSE; + ctx.fixedBasePower = powerOverride; + gBattleStruct->moveDamage[gBattlerTarget] = CalculateMoveDamage(&ctx); dmgByMove[i] = gBattleStruct->moveDamage[gBattlerTarget]; if (dmgByMove[i] == 0 && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; diff --git a/src/battle_util.c b/src/battle_util.c index 9bd2e80017..b18288763f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1969,14 +1969,15 @@ static void CancellerObedience(u32 *effect) break; case DISOBEYS_HITS_SELF: gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); + struct DamageContext ctx; + ctx.battlerAtk = ctx.battlerDef = gBattlerAttacker; + ctx.move = MOVE_NONE; + ctx.moveType = TYPE_MYSTERY; + ctx.isCrit = FALSE; + ctx.randomFactor = FALSE; + ctx.updateFlags = TRUE; + ctx.fixedBasePower = 40; + gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&ctx); gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_OBEYS; @@ -2145,14 +2146,15 @@ static void CancellerConfused(u32 *effect) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; - struct DamageCalculationData damageCalcData; - damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; - damageCalcData.move = MOVE_NONE; - damageCalcData.moveType = TYPE_MYSTERY; - damageCalcData.isCrit = FALSE; - damageCalcData.randomFactor = FALSE; - damageCalcData.updateFlags = TRUE; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&damageCalcData, 40); + struct DamageContext ctx; + ctx.battlerAtk = ctx.battlerDef = gBattlerAttacker; + ctx.move = MOVE_NONE; + ctx.moveType = TYPE_MYSTERY; + ctx.isCrit = FALSE; + ctx.randomFactor = FALSE; + ctx.updateFlags = TRUE; + ctx.fixedBasePower = 40; + gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&ctx); gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; @@ -7776,11 +7778,11 @@ u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) return count; } -u32 GetMoveTargetCount(struct DamageCalculationData *damageCalcData) +u32 GetMoveTargetCount(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; switch (GetBattlerMoveTargetType(battlerAtk, move)) { @@ -7919,11 +7921,11 @@ u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter) return basePower; } -static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData, u32 abilityDef, u32 weather) +static inline u32 CalcMoveBasePower(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; u32 i; u32 basePower = GetMovePower(move); @@ -7988,7 +7990,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData basePower *= 2; break; case EFFECT_WEATHER_BALL: - if (weather & B_WEATHER_ANY) + if (ctx->weather & B_WEATHER_ANY) basePower *= 2; break; case EFFECT_PURSUIT: @@ -8000,7 +8002,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData break; case EFFECT_DOUBLE_POWER_ON_ARG_STATUS: // Comatose targets treated as if asleep - if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) + if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (ctx->abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) && !((GetMoveAdditionalEffectById(move, 0)->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) basePower *= 2; break; @@ -8185,14 +8187,14 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData return basePower; } -static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) +static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) { u32 holdEffectParamAtk; - u32 basePower = CalcMoveBasePower(damageCalcData, defAbility, weather); - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; + u32 basePower = CalcMoveBasePower(ctx); + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + u32 moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); uq4_12_t holdEffectModifier; @@ -8263,7 +8265,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); // attacker's abilities - switch (atkAbility) + switch (ctx->abilityAtk) { case ABILITY_TECHNICIAN: if (basePower <= 60) @@ -8291,7 +8293,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * break; case ABILITY_SAND_FORCE: if ((moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND) - && weather & B_WEATHER_SANDSTORM) + && ctx->weather & B_WEATHER_SANDSTORM) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_RIVALRY: @@ -8391,15 +8393,15 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * } // target's abilities - switch (defAbility) + switch (ctx->abilityDef) { case ABILITY_HEATPROOF: case ABILITY_WATER_BUBBLE: if (moveType == TYPE_FIRE) { modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); - if (damageCalcData->updateFlags) - RecordAbilityBattle(battlerDef, defAbility); + if (ctx->updateFlags) + RecordAbilityBattle(battlerDef, ctx->abilityDef); } break; case ABILITY_DRY_SKIN: @@ -8409,7 +8411,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if (((weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivates) + if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivates) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); @@ -8433,7 +8435,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * holdEffectModifier = uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(holdEffectParamAtk)); // attacker's hold effect - switch (holdEffectAtk) + switch (ctx->holdEffectAtk) { case HOLD_EFFECT_MUSCLE_BAND: if (IsBattleMovePhysical(move)) @@ -8496,16 +8498,16 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * return uq4_12_multiply_by_int_half_down(modifier, basePower); } -static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) +static inline u32 CalcAttackStat(struct DamageContext *ctx) { u8 atkStage; u32 atkStat; uq4_12_t modifier; u16 atkBaseSpeciesId; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + u32 moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species); @@ -8555,10 +8557,10 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } // critical hits ignore attack stat's stage drops - if (damageCalcData->isCrit && atkStage < DEFAULT_STAT_STAGE) + if (ctx->isCrit && atkStage < DEFAULT_STAT_STAGE) atkStage = DEFAULT_STAT_STAGE; // pokemon with unaware ignore attack stat changes while taking damage - if (defAbility == ABILITY_UNAWARE) + if (ctx->abilityDef == ABILITY_UNAWARE) atkStage = DEFAULT_STAT_STAGE; atkStat *= gStatStageRatios[atkStage][0]; @@ -8568,7 +8570,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u modifier = UQ_4_12(1.0); // attacker's abilities - switch (atkAbility) + switch (ctx->abilityAtk) { case ABILITY_HUGE_POWER: case ABILITY_PURE_POWER: @@ -8666,7 +8668,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (((weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivates) + if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivates) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); @@ -8685,7 +8687,7 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } break; case ABILITY_ORICHALCUM_PULSE: - if ((weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) + if ((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; case ABILITY_HADRON_ENGINE: @@ -8695,13 +8697,13 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } // target's abilities - switch (defAbility) + switch (ctx->abilityDef) { case ABILITY_THICK_FAT: if (moveType == TYPE_FIRE || moveType == TYPE_ICE) { modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); - if (damageCalcData->updateFlags) + if (ctx->updateFlags) RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); } break; @@ -8720,14 +8722,14 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u } // field abilities - if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && atkAbility != ABILITY_VESSEL_OF_RUIN && IsBattleMoveSpecial(move)) + if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && ctx->abilityAtk != ABILITY_VESSEL_OF_RUIN && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && atkAbility != ABILITY_TABLETS_OF_RUIN && IsBattleMovePhysical(move)) + if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && ctx->abilityAtk != ABILITY_TABLETS_OF_RUIN && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); // attacker's hold effect - switch (holdEffectAtk) + switch (ctx->holdEffectAtk) { case HOLD_EFFECT_THICK_CLUB: if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IsBattleMovePhysical(move)) @@ -8779,15 +8781,15 @@ static bool32 CanEvolve(u32 species) return FALSE; } -static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectDef, u32 weather) +static inline u32 CalcDefenseStat(struct DamageContext *ctx) { bool32 usesDefStat; u8 defStage; u32 defStat, def, spDef; uq4_12_t modifier; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + u32 moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped @@ -8820,10 +8822,10 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, defStat /= 2; // critical hits ignore positive stat changes - if (damageCalcData->isCrit && defStage > DEFAULT_STAT_STAGE) + if (ctx->isCrit && defStage > DEFAULT_STAT_STAGE) defStage = DEFAULT_STAT_STAGE; // pokemon with unaware ignore defense stat changes while dealing damage - if (atkAbility == ABILITY_UNAWARE) + if (ctx->abilityAtk == ABILITY_UNAWARE) defStage = DEFAULT_STAT_STAGE; // certain moves also ignore stat changes if (MoveIgnoresDefenseEvasionStages(move)) @@ -8836,13 +8838,13 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, modifier = UQ_4_12(1.0); // target's abilities - switch (defAbility) + switch (ctx->abilityDef) { case ABILITY_MARVEL_SCALE: if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) { modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - if (damageCalcData->updateFlags) + if (ctx->updateFlags) RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE); } break; @@ -8850,7 +8852,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, if (usesDefStat) { modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - if (damageCalcData->updateFlags) + if (ctx->updateFlags) RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT); } break; @@ -8858,7 +8860,7 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) { modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - if (damageCalcData->updateFlags) + if (ctx->updateFlags) RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT); } break; @@ -8885,14 +8887,14 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, } // field abilities - if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && defAbility != ABILITY_SWORD_OF_RUIN && usesDefStat) + if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && ctx->abilityDef != ABILITY_SWORD_OF_RUIN && usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && defAbility != ABILITY_BEADS_OF_RUIN && !usesDefStat) + if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && ctx->abilityDef != ABILITY_BEADS_OF_RUIN && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); // target's hold effects - switch (holdEffectDef) + switch (ctx->holdEffectDef) { case HOLD_EFFECT_DEEP_SEA_SCALE: if (gBattleMons[battlerDef].species == SPECIES_CLAMPERL && !usesDefStat) @@ -8943,9 +8945,9 @@ static inline s32 CalculateBaseDamage(u32 power, u32 userFinalAttack, u32 level, return power * userFinalAttack * (2 * level / 5 + 2) / targetFinalDefense / 50 + 2; } -static inline uq4_12_t GetTargetDamageModifier(struct DamageCalculationData *damageCalcData) +static inline uq4_12_t GetTargetDamageModifier(struct DamageContext *ctx) { - if (IsDoubleBattle() && GetMoveTargetCount(damageCalcData) >= 2) + if (IsDoubleBattle() && GetMoveTargetCount(ctx) >= 2) return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(0.5); return UQ_4_12(1.0); } @@ -8957,62 +8959,53 @@ static inline uq4_12_t GetParentalBondModifier(u32 battlerAtk) return B_PARENTAL_BOND_DMG >= GEN_7 ? UQ_4_12(0.25) : UQ_4_12(0.5); } -static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageCalculationData *damageCalcData, u32 abilityAtk) +static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - - if (moveType == TYPE_MYSTERY) + if (ctx->moveType == TYPE_MYSTERY) return UQ_4_12(1.0); - else if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), moveType)) - return (abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); - else if (!IS_BATTLER_OF_TYPE(battlerAtk, moveType) || move == MOVE_STRUGGLE || move == MOVE_NONE) + else if (gBattleStruct->pledgeMove && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(ctx->battlerAtk), ctx->moveType)) + return (ctx->abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); + else if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, ctx->moveType) || ctx->move == MOVE_STRUGGLE || ctx->move == MOVE_NONE) return UQ_4_12(1.0); - return (abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); + return (ctx->abilityAtk == ABILITY_ADAPTABILITY) ? UQ_4_12(2.0) : UQ_4_12(1.5); } // Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. -static uq4_12_t GetWeatherDamageModifier(struct DamageCalculationData *damageCalcData, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 weather) +static uq4_12_t GetWeatherDamageModifier(struct DamageContext *ctx) { - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - - if (weather == B_WEATHER_NONE) + if (ctx->weather == B_WEATHER_NONE) return UQ_4_12(1.0); - if (GetMoveEffect(move) == EFFECT_HYDRO_STEAM && (weather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) + if (GetMoveEffect(ctx->move) == EFFECT_HYDRO_STEAM && (ctx->weather & B_WEATHER_SUN) && ctx->holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) return UQ_4_12(1.5); - if (holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA) + if (ctx->holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA) return UQ_4_12(1.0); - if (weather & B_WEATHER_RAIN) + if (ctx->weather & B_WEATHER_RAIN) { - if (moveType != TYPE_FIRE && moveType != TYPE_WATER) + if (ctx->moveType != TYPE_FIRE && ctx->moveType != TYPE_WATER) return UQ_4_12(1.0); - return (moveType == TYPE_FIRE) ? UQ_4_12(0.5) : UQ_4_12(1.5); + return (ctx->moveType == TYPE_FIRE) ? UQ_4_12(0.5) : UQ_4_12(1.5); } - if (weather & B_WEATHER_SUN) + if (ctx->weather & B_WEATHER_SUN) { - if (moveType != TYPE_FIRE && moveType != TYPE_WATER) + if (ctx->moveType != TYPE_FIRE && ctx->moveType != TYPE_WATER) return UQ_4_12(1.0); - return (moveType == TYPE_WATER) ? UQ_4_12(0.5) : UQ_4_12(1.5); + return (ctx->moveType == TYPE_WATER) ? UQ_4_12(0.5) : UQ_4_12(1.5); } return UQ_4_12(1.0); } -static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageCalculationData *damageCalcData, u32 abilityAtk) +static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 move = damageCalcData->move; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->move); - if (gBattleMons[battlerAtk].status1 & STATUS1_BURN - && IsBattleMovePhysical(move) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_BURN + && IsBattleMovePhysical(ctx->move) && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE) - && abilityAtk != ABILITY_GUTS) + && ctx->abilityAtk != ABILITY_GUTS) return UQ_4_12(0.5); - if (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE - && IsBattleMoveSpecial(move) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE + && IsBattleMoveSpecial(ctx->move) && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE)) return UQ_4_12(0.5); return UQ_4_12(1.0); @@ -9032,12 +9025,12 @@ static inline uq4_12_t GetGlaiveRushModifier(u32 battlerDef) return UQ_4_12(1.0); } -static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageCalculationData *damageCalcData) +static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageContext *ctx) { - if (!IsZMove(damageCalcData->move) && !IsMaxMove(damageCalcData->move)) + if (!IsZMove(ctx->move) && !IsMaxMove(ctx->move)) return UQ_4_12(1.0); - u32 protected = gProtectStructs[damageCalcData->battlerDef].protected; + u32 protected = gProtectStructs[ctx->battlerDef].protected; if (GetProtectType(protected) == PROTECT_TYPE_SINGLE && protected != PROTECT_MAX_GUARD) return UQ_4_12(0.25); return UQ_4_12(1.0); @@ -9071,14 +9064,14 @@ static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) return UQ_4_12(1.0); } -static inline uq4_12_t GetScreensModifier(u32 move, u32 battlerAtk, u32 battlerDef, bool32 isCrit, u32 abilityAtk) +static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) { - u32 sideStatus = gSideStatuses[GetBattlerSide(battlerDef)]; - bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(move); - bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(move); + u32 sideStatus = gSideStatuses[GetBattlerSide(ctx->battlerDef)]; + bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(ctx->move); + bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(ctx->move); bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; - if (isCrit || abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[battlerAtk].confusionSelfDmg) + if (ctx->isCrit || ctx->abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[ctx->battlerAtk].confusionSelfDmg) return UQ_4_12(1.0); if (reflect || lightScreen || auroraVeil) return (IsDoubleBattle()) ? UQ_4_12(0.667) : UQ_4_12(0.5); @@ -9112,33 +9105,33 @@ static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typ return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderAbilitiesModifier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t typeEffectivenessModifier, u32 abilityDef) +static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx) { - switch (abilityDef) + switch (ctx->abilityDef) { case ABILITY_MULTISCALE: case ABILITY_SHADOW_SHIELD: - if (IsBattlerAtMaxHp(battlerDef)) + if (IsBattlerAtMaxHp(ctx->battlerDef)) return UQ_4_12(0.5); break; case ABILITY_FILTER: case ABILITY_SOLID_ROCK: case ABILITY_PRISM_ARMOR: - if (typeEffectivenessModifier >= UQ_4_12(2.0)) + if (ctx->typeEffectivenessModifier >= UQ_4_12(2.0)) return UQ_4_12(0.75); break; case ABILITY_FLUFFY: - if (!IsMoveMakingContact(move, battlerAtk) && moveType == TYPE_FIRE) + if (!IsMoveMakingContact(ctx->move, ctx->battlerAtk) && ctx->moveType == TYPE_FIRE) return UQ_4_12(2.0); - if (IsMoveMakingContact(move, battlerAtk) && moveType != TYPE_FIRE) + if (IsMoveMakingContact(ctx->move, ctx->battlerAtk) && ctx->moveType != TYPE_FIRE) return UQ_4_12(0.5); break; case ABILITY_PUNK_ROCK: - if (IsSoundMove(move)) + if (IsSoundMove(ctx->move)) return UQ_4_12(0.5); break; case ABILITY_ICE_SCALES: - if (IsBattleMoveSpecial(move)) + if (IsBattleMoveSpecial(ctx->move)) return UQ_4_12(0.5); break; } @@ -9185,24 +9178,18 @@ static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEff return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityDef, enum ItemHoldEffect holdEffectDef) +static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) { - u32 battlerDef = damageCalcData->battlerDef; - u32 moveType = damageCalcData->moveType; - - u32 holdEffectDefParam = GetBattlerHoldEffectParam(battlerDef); - u32 itemDef = gBattleMons[battlerDef].item; - - switch (holdEffectDef) + switch (ctx->holdEffectDef) { case HOLD_EFFECT_RESIST_BERRY: - if (UnnerveOn(battlerDef, itemDef)) + if (UnnerveOn(ctx->battlerDef, gBattleMons[ctx->battlerDef].item)) return UQ_4_12(1.0); - if (moveType == holdEffectDefParam && (moveType == TYPE_NORMAL || typeEffectivenessModifier >= UQ_4_12(2.0))) + if (ctx->moveType == GetBattlerHoldEffectParam(ctx->battlerDef) && (ctx->moveType == TYPE_NORMAL || ctx->typeEffectivenessModifier >= UQ_4_12(2.0))) { - if (damageCalcData->updateFlags) - gSpecialStatuses[battlerDef].berryReduced = TRUE; - return (abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); + if (ctx->updateFlags) + gSpecialStatuses[ctx->battlerDef].berryReduced = TRUE; + return (ctx->abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); } break; default: @@ -9221,42 +9208,36 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *da // https://bulbapedia.bulbagarden.net/wiki/Damage#Generation_V_onward // Please Note: Fixed Point Multiplication is not associative. // The order of operations is relevant. -static inline uq4_12_t GetOtherModifiers(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) +static inline uq4_12_t GetOtherModifiers(struct DamageContext *ctx) { - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; - u32 isCrit = damageCalcData->isCrit; - uq4_12_t finalModifier = UQ_4_12(1.0); - u32 battlerDefPartner = BATTLE_PARTNER(battlerDef); - u32 unmodifiedAttackerSpeed = gBattleMons[battlerAtk].speed; - u32 unmodifiedDefenderSpeed = gBattleMons[battlerDef].speed; + u32 battlerDefPartner = BATTLE_PARTNER(ctx->battlerDef); + u32 unmodifiedAttackerSpeed = gBattleMons[ctx->battlerAtk].speed; + u32 unmodifiedDefenderSpeed = gBattleMons[ctx->battlerDef].speed; + //TODO: Behemoth Blade, Behemoth Bash, Dynamax Cannon (Dynamax) - DAMAGE_MULTIPLY_MODIFIER(GetMinimizeModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetUndergroundModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetDiveModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetAirborneModifier(move, battlerDef)); - DAMAGE_MULTIPLY_MODIFIER(GetScreensModifier(move, battlerAtk, battlerDef, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetCollisionCourseElectroDriftModifier(move, typeEffectivenessModifier)); + DAMAGE_MULTIPLY_MODIFIER(GetMinimizeModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetUndergroundModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetDiveModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetAirborneModifier(ctx->move, ctx->battlerDef)); + DAMAGE_MULTIPLY_MODIFIER(GetScreensModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetCollisionCourseElectroDriftModifier(ctx->move, ctx->typeEffectivenessModifier)); if (unmodifiedAttackerSpeed >= unmodifiedDefenderSpeed) { - DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(battlerAtk, typeEffectivenessModifier, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(move, moveType, battlerAtk, battlerDef, typeEffectivenessModifier, abilityDef)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->isCrit, ctx->abilityAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(ctx)); DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(battlerAtk, typeEffectivenessModifier, holdEffectAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(damageCalcData, typeEffectivenessModifier, abilityDef, holdEffectDef)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->holdEffectAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(ctx)); } else { - DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(move, moveType, battlerAtk, battlerDef, typeEffectivenessModifier, abilityDef)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderAbilitiesModifier(ctx)); DAMAGE_MULTIPLY_MODIFIER(GetDefenderPartnerAbilitiesModifier(battlerDefPartner)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(battlerAtk, typeEffectivenessModifier, isCrit, abilityAtk)); - DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(damageCalcData, typeEffectivenessModifier, abilityDef, holdEffectDef)); - DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(battlerAtk, typeEffectivenessModifier, holdEffectAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerAbilitiesModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->isCrit, ctx->abilityAtk)); + DAMAGE_MULTIPLY_MODIFIER(GetDefenderItemsModifier(ctx)); + DAMAGE_MULTIPLY_MODIFIER(GetAttackerItemsModifier(ctx->battlerAtk, ctx->typeEffectivenessModifier, ctx->holdEffectAtk)); } return finalModifier; } @@ -9267,31 +9248,28 @@ static inline uq4_12_t GetOtherModifiers(struct DamageCalculationData *damageCal dmg = uq4_12_multiply_by_int_half_down(modifier, dmg); \ } while (0) -static inline s32 DoMoveDamageCalcVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather, - enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) +static inline s32 DoMoveDamageCalcVars(struct DamageContext *ctx) { s32 dmg; u32 userFinalAttack; u32 targetFinalDefense; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - if (fixedBasePower) - gBattleMovePower = fixedBasePower; + if (ctx->fixedBasePower) + gBattleMovePower = ctx->fixedBasePower; else - gBattleMovePower = CalcMoveBasePowerAfterModifiers(damageCalcData, abilityAtk, abilityDef, holdEffectAtk, weather); + gBattleMovePower = CalcMoveBasePowerAfterModifiers(ctx); - userFinalAttack = CalcAttackStat(damageCalcData, abilityAtk, abilityDef, holdEffectAtk, weather); - targetFinalDefense = CalcDefenseStat(damageCalcData, abilityAtk, abilityDef, holdEffectDef, weather); + userFinalAttack = CalcAttackStat(ctx); + targetFinalDefense = CalcDefenseStat(ctx); - dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, gBattleMons[battlerAtk].level, targetFinalDefense); - DAMAGE_APPLY_MODIFIER(GetTargetDamageModifier(damageCalcData)); - DAMAGE_APPLY_MODIFIER(GetParentalBondModifier(battlerAtk)); - DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(damageCalcData, holdEffectAtk, holdEffectDef, weather)); - DAMAGE_APPLY_MODIFIER(GetCriticalModifier(damageCalcData->isCrit)); - DAMAGE_APPLY_MODIFIER(GetGlaiveRushModifier(battlerDef)); + dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, gBattleMons[ctx->battlerAtk].level, targetFinalDefense); + DAMAGE_APPLY_MODIFIER(GetTargetDamageModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetParentalBondModifier(ctx->battlerAtk)); + DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetCriticalModifier(ctx->isCrit)); + DAMAGE_APPLY_MODIFIER(GetGlaiveRushModifier(ctx->battlerDef)); - if (damageCalcData->randomFactor) + if (ctx->randomFactor) { dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); dmg /= 100; @@ -9303,55 +9281,55 @@ static inline s32 DoMoveDamageCalcVars(struct DamageCalculationData *damageCalcD return dmg; } - dmg = ApplyModifiersAfterDmgRoll(dmg, damageCalcData, typeEffectivenessModifier, abilityAtk, abilityDef, holdEffectAtk, holdEffectDef); + dmg = ApplyModifiersAfterDmgRoll(ctx, dmg); if (dmg == 0) dmg = 1; return dmg; } -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) +s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) { - if (GetActiveGimmick(damageCalcData->battlerAtk) == GIMMICK_TERA) - DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(damageCalcData->battlerAtk, damageCalcData->moveType)); + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_TERA) + DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(ctx->battlerAtk, ctx->moveType)); else - DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(damageCalcData, abilityAtk)); - DAMAGE_APPLY_MODIFIER(typeEffectivenessModifier); - DAMAGE_APPLY_MODIFIER(GetBurnOrFrostBiteModifier(damageCalcData, abilityAtk)); - DAMAGE_APPLY_MODIFIER(GetZMaxMoveAgainstProtectionModifier(damageCalcData)); - DAMAGE_APPLY_MODIFIER(GetOtherModifiers(damageCalcData, typeEffectivenessModifier, abilityAtk, abilityDef, holdEffectAtk, holdEffectDef)); + DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(ctx)); + DAMAGE_APPLY_MODIFIER(ctx->typeEffectivenessModifier); + DAMAGE_APPLY_MODIFIER(GetBurnOrFrostBiteModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetZMaxMoveAgainstProtectionModifier(ctx)); + DAMAGE_APPLY_MODIFIER(GetOtherModifiers(ctx)); return dmg; } -static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalcData) +static inline s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) { s32 dmg = 0; s32 randDamage; - switch (GetMoveEffect(damageCalcData->move)) + switch (GetMoveEffect(ctx->move)) { case EFFECT_LEVEL_DAMAGE: - dmg = gBattleMons[damageCalcData->battlerAtk].level; + dmg = gBattleMons[ctx->battlerAtk].level; break; case EFFECT_PSYWAVE: randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); - dmg = gBattleMons[damageCalcData->battlerAtk].level * (randDamage + 50) / 100; + dmg = gBattleMons[ctx->battlerAtk].level * (randDamage + 50) / 100; break; case EFFECT_FIXED_HP_DAMAGE: - dmg = GetMoveFixedHPDamage(damageCalcData->move); + dmg = GetMoveFixedHPDamage(ctx->move); break; case EFFECT_FIXED_PERCENT_DAMAGE: - dmg = GetNonDynamaxHP(damageCalcData->battlerDef) * GetMoveDamagePercentage(damageCalcData->move) / 100; + dmg = GetNonDynamaxHP(ctx->battlerDef) * GetMoveDamagePercentage(ctx->move) / 100; break; case EFFECT_FINAL_GAMBIT: - dmg = GetNonDynamaxHP(damageCalcData->battlerAtk); + dmg = GetNonDynamaxHP(ctx->battlerAtk); break; default: return INT32_MAX; } - gBattleStruct->moveResultFlags[damageCalcData->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + gBattleStruct->moveResultFlags[ctx->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); if (dmg == 0) dmg = 1; @@ -9359,36 +9337,32 @@ static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalc return dmg; } -static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather) +static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) { - enum ItemHoldEffect holdEffectAtk, holdEffectDef; - u32 abilityAtk, abilityDef; - - if (typeEffectivenessModifier == UQ_4_12(0.0)) + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return 0; - s32 dmg = DoFixedDamageMoveCalc(damageCalcData); + s32 dmg = DoFixedDamageMoveCalc(ctx); if (dmg != INT32_MAX) return dmg; - holdEffectAtk = GetBattlerHoldEffect(damageCalcData->battlerAtk, TRUE); - holdEffectDef = GetBattlerHoldEffect(damageCalcData->battlerDef, TRUE); - abilityAtk = GetBattlerAbility(damageCalcData->battlerAtk); - abilityDef = GetBattlerAbility(damageCalcData->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); + ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); + ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - return DoMoveDamageCalcVars(damageCalcData, fixedBasePower, typeEffectivenessModifier, weather, holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); + return DoMoveDamageCalcVars(ctx); } -static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectDef, u32 abilityDef) +static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageContext *ctx) { s32 dmg; u32 userFinalAttack; u32 targetFinalDefense; - u32 battlerAtk = damageCalcData->battlerAtk; - u32 battlerDef = damageCalcData->battlerDef; - u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; + u32 battlerAtk = ctx->battlerAtk; + u32 battlerDef = ctx->battlerDef; + u32 move = ctx->move; + u32 moveType = ctx->moveType; struct Pokemon *party = GetBattlerParty(battlerAtk); struct Pokemon *partyMon = &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]]; @@ -9401,12 +9375,12 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData else userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK, NULL); - targetFinalDefense = CalcDefenseStat(damageCalcData, ABILITY_NONE, abilityDef, holdEffectDef, weather); + targetFinalDefense = CalcDefenseStat(ctx); dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, partyMonLevel, targetFinalDefense); - DAMAGE_APPLY_MODIFIER(GetCriticalModifier(damageCalcData->isCrit)); + DAMAGE_APPLY_MODIFIER(GetCriticalModifier(ctx->isCrit)); - if (damageCalcData->randomFactor) + if (ctx->randomFactor) { dmg *= DMG_ROLL_PERCENT_HI - RandomUniform(RNG_DAMAGE_MODIFIER, 0, DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO); dmg /= 100; @@ -9417,7 +9391,7 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData DAMAGE_APPLY_MODIFIER(UQ_4_12(1.5)); else DAMAGE_APPLY_MODIFIER(UQ_4_12(1.0)); - DAMAGE_APPLY_MODIFIER(typeEffectivenessModifier); + DAMAGE_APPLY_MODIFIER(ctx->typeEffectivenessModifier); if (dmg == 0) dmg = 1; @@ -9425,18 +9399,12 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData return dmg; } -static inline s32 DoFutureSightAttackDamageCalc(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 weather) +static inline s32 DoFutureSightAttackDamageCalc(struct DamageContext *ctx) { - enum ItemHoldEffect holdEffectDef; - u32 abilityDef; - - if (typeEffectivenessModifier == UQ_4_12(0.0)) + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return 0; - holdEffectDef = GetBattlerHoldEffect(damageCalcData->battlerDef, TRUE); - abilityDef = GetBattlerAbility(damageCalcData->battlerDef); - - return DoFutureSightAttackDamageCalcVars(damageCalcData, typeEffectivenessModifier, weather, holdEffectDef, abilityDef); + return DoFutureSightAttackDamageCalcVars(ctx); } #undef DAMAGE_APPLY_MODIFIER @@ -9459,31 +9427,36 @@ bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move) && &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[BATTLE_PARTNER(gBattlerPartyIndexes[battlerAtk])]; } -s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedBasePower) +s32 CalculateMoveDamage(struct DamageContext *ctx) { - u32 typeEffectivenessMultiplier = CalcTypeEffectivenessMultiplier(damageCalcData->move, - damageCalcData->moveType, - damageCalcData->battlerAtk, - damageCalcData->battlerDef, - GetBattlerAbility(damageCalcData->battlerDef), - damageCalcData->updateFlags); + ctx->weather = GetWeather(); + ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); + ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); + ctx->holdEffectAtk = GetItemHoldEffect(ctx->battlerAtk); + ctx->holdEffectDef = GetItemHoldEffect(ctx->battlerDef); - if (IsFutureSightAttackerInParty(damageCalcData->battlerAtk, damageCalcData->battlerDef, damageCalcData->move)) - return DoFutureSightAttackDamageCalc(damageCalcData, typeEffectivenessMultiplier, GetWeather()); + ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier( + ctx->move, + ctx->moveType, + ctx->battlerAtk, + ctx->battlerDef, + ctx->abilityDef, + ctx->updateFlags); - return DoMoveDamageCalc(damageCalcData, fixedBasePower, typeEffectivenessMultiplier, GetWeather()); + if (IsFutureSightAttackerInParty(ctx->battlerAtk, ctx->battlerDef, ctx->move)) + return DoFutureSightAttackDamageCalc(ctx); + + return DoMoveDamageCalc(ctx); } // for AI so that typeEffectivenessModifier, weather, abilities and holdEffects are calculated only once -s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) +s32 CalculateMoveDamageVars(struct DamageContext *ctx) { - s32 dmg = DoFixedDamageMoveCalc(damageCalcData); + s32 dmg = DoFixedDamageMoveCalc(ctx); if (dmg != INT32_MAX) return dmg; - return DoMoveDamageCalcVars(damageCalcData, fixedBasePower, typeEffectivenessModifier, weather, - holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); + return DoMoveDamageCalcVars(ctx); } static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defAbility, u32 defType, u32 battlerAtk, bool32 recordAbilities) @@ -10715,6 +10688,7 @@ bool32 PickupHasValidTarget(u32 battler) return FALSE; } +// TODO: Pass down weather as an arg bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) { if (gBattleWeather & weatherFlags && HasWeatherEffect()) From d4146afcae73894e8318ebbb3f72822d0c5bac21 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 14 Jun 2025 11:05:14 +0200 Subject: [PATCH 052/248] Add damage context to effectiveness multiplier (#7111) --- include/battle_util.h | 2 +- src/battle_ai_util.c | 116 +++++++++------- src/battle_controller_player.c | 34 +++-- src/battle_script_commands.c | 35 ++++- src/battle_util.c | 215 +++++++++++++++++------------ test/battle/ability/anticipation.c | 3 - 6 files changed, 245 insertions(+), 160 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 71f468996d..963f2288e4 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -282,7 +282,7 @@ u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); s32 CalculateMoveDamage(struct DamageContext *ctx); s32 CalculateMoveDamageVars(struct DamageContext *ctx); s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); -uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities); +uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx); uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 31807e74ab..091bd6ecf1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -423,12 +423,20 @@ bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffe // Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) { - s32 i, moveType; u32 usable = 0; u16 *moves = GetMovesArray(attacker); u32 moveLimitations = gAiLogicData->moveLimitations[attacker]; - for (i = 0; i < MAX_MON_MOVES; i++) + struct DamageContext ctx = {0}; + ctx.battlerAtk = attacker; + ctx.battlerDef = target; + ctx.updateFlags = FALSE; + ctx.abilityAtk = gAiLogicData->abilities[attacker]; + ctx.abilityDef = gAiLogicData->abilities[target]; + ctx.holdEffectAtk = gAiLogicData->items[attacker]; + ctx.holdEffectDef = gAiLogicData->items[target]; + + for (u32 i = 0; i < MAX_MON_MOVES; i++) { if (IsMoveUnusable(i, moves[i], moveLimitations)) continue; @@ -436,8 +444,10 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) if (GetBattleMoveCategory(moves[i]) == category) { SetTypeBeforeUsingMove(moves[i], attacker); - moveType = GetBattleMoveType(moves[i]); - if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, gAiLogicData->abilities[target], FALSE) != 0) + ctx.move = moves[i]; + ctx.moveType = GetBattleMoveType(moves[i]); + + if (CalcTypeEffectivenessMultiplier(&ctx)) usable |= 1u << i; } } @@ -481,83 +491,83 @@ static inline s32 DmgRoll(s32 dmg) return dmg; } -bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType, uq4_12_t effectiveness, u32 weather) +bool32 IsDamageMoveUnusable(struct DamageContext *ctx) { u32 battlerDefAbility; u32 partnerDefAbility; struct AiLogicData *aiData = gAiLogicData; - if (effectiveness == UQ_4_12(0.0)) + if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return TRUE; - if (gBattleStruct->battlerState[battlerDef].commandingDondozo) + if (gBattleStruct->battlerState[ctx->battlerDef].commandingDondozo) return TRUE; // aiData->abilities does not check for Mold Breaker since it happens during combat so it needs to be done manually - if (IsMoldBreakerTypeAbility(battlerAtk, aiData->abilities[battlerAtk]) || MoveIgnoresTargetAbility(move)) + if (IsMoldBreakerTypeAbility(ctx->battlerAtk, ctx->abilityAtk) || MoveIgnoresTargetAbility(ctx->move)) { battlerDefAbility = ABILITY_NONE; partnerDefAbility = ABILITY_NONE; } else { - battlerDefAbility = aiData->abilities[battlerDef]; - partnerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; + battlerDefAbility = ctx->abilityDef; + partnerDefAbility = aiData->abilities[BATTLE_PARTNER(ctx->battlerDef)]; } - if (CanAbilityBlockMove(battlerAtk, battlerDef, aiData->abilities[battlerAtk], battlerDefAbility, move, ABILITY_CHECK_TRIGGER)) + if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, ABILITY_CHECK_TRIGGER)) return TRUE; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, battlerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, ctx->battlerDef, battlerDefAbility, ctx->move, ctx->moveType, ABILITY_CHECK_TRIGGER)) return TRUE; // Limited to Lighning Rod and Storm Drain because otherwise the AI would consider Water Absorb, etc... if (partnerDefAbility == ABILITY_LIGHTNING_ROD || partnerDefAbility == ABILITY_STORM_DRAIN) { - if (CanAbilityAbsorbMove(battlerAtk, BATTLE_PARTNER(battlerDef), partnerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, BATTLE_PARTNER(ctx->battlerDef), partnerDefAbility, ctx->move, ctx->moveType, ABILITY_CHECK_TRIGGER)) return TRUE; } if (HasWeatherEffect()) { - if (weather & B_WEATHER_SUN_PRIMAL && moveType == TYPE_WATER) + if (ctx->weather & B_WEATHER_SUN_PRIMAL && ctx->moveType == TYPE_WATER) return TRUE; - if (weather & B_WEATHER_RAIN_PRIMAL && moveType == TYPE_FIRE) + if (ctx->weather & B_WEATHER_RAIN_PRIMAL && ctx->moveType == TYPE_FIRE) return TRUE; } - switch (GetMoveEffect(move)) + switch (GetMoveEffect(ctx->move)) { case EFFECT_DREAM_EATER: - if (!AI_IsBattlerAsleepOrComatose(battlerDef)) + if (!AI_IsBattlerAsleepOrComatose(ctx->battlerDef)) return TRUE; break; case EFFECT_BELCH: - if (IsBelchPreventingMove(battlerAtk, move)) + if (IsBelchPreventingMove(ctx->battlerAtk, ctx->move)) return TRUE; break; case EFFECT_LAST_RESORT: - if (!CanUseLastResort(battlerAtk)) + if (!CanUseLastResort(ctx->battlerAtk)) return TRUE; break; case EFFECT_LOW_KICK: case EFFECT_HEAT_CRASH: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + if (GetActiveGimmick(ctx->battlerDef) == GIMMICK_DYNAMAX) return TRUE; break; case EFFECT_FAIL_IF_NOT_ARG_TYPE: - if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveArgType(move))) + if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->move))) return TRUE; break; case EFFECT_HIT_SET_REMOVE_TERRAIN: - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) && GetMoveEffectArg_MoveProperty(move) == ARG_TRY_REMOVE_TERRAIN_FAIL) + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) && GetMoveEffectArg_MoveProperty(ctx->move) == ARG_TRY_REMOVE_TERRAIN_FAIL) return TRUE; break; case EFFECT_POLTERGEIST: - if (gAiLogicData->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef)) + if (gAiLogicData->items[ctx->battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(ctx->battlerDef)) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: - if (!gDisableStructs[battlerAtk].isFirstTurn) + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn) return TRUE; break; case EFFECT_EXPLOSION: @@ -733,9 +743,7 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather) { struct SimulatedDamage simDamage; - s32 moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - uq4_12_t effectivenessMultiplier; bool32 isDamageMoveUnusable = FALSE; bool32 toggledGimmickAtk = FALSE; bool32 toggledGimmickDef = FALSE; @@ -766,36 +774,32 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u SetDynamicMoveCategory(battlerAtk, battlerDef, move); SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetBattleMoveType(move); - effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); + + struct DamageContext ctx; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = GetBattleMoveType(move); + ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); + ctx.randomFactor = FALSE; + ctx.updateFlags = FALSE; + ctx.weather = weather; + ctx.fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); + ctx.abilityAtk = aiData->abilities[battlerAtk]; + ctx.abilityDef = aiData->abilities[battlerDef]; + ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; + ctx.holdEffectDef = aiData->holdEffects[battlerDef]; + ctx.typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(&ctx); u32 movePower = GetMovePower(move); if (movePower) - isDamageMoveUnusable = IsDamageMoveUnusable(battlerAtk, battlerDef, move, moveType, effectivenessMultiplier, weather); + isDamageMoveUnusable = IsDamageMoveUnusable(&ctx); if (movePower && !isDamageMoveUnusable) { u32 types[3]; AI_StoreBattlerTypes(battlerAtk, types); - - ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, moveType); - s32 fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); - - struct DamageContext ctx; - ctx.battlerAtk = battlerAtk; - ctx.battlerDef = battlerDef; - ctx.move = move; - ctx.moveType = moveType; - ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); - ctx.randomFactor = FALSE; - ctx.updateFlags = FALSE; - ctx.weather = weather; - ctx.fixedBasePower = fixedBasePower; - ctx.typeEffectivenessModifier = effectivenessMultiplier; - ctx.abilityAtk = aiData->abilities[battlerAtk]; - ctx.abilityDef = aiData->abilities[battlerDef]; - ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; - ctx.holdEffectDef = aiData->holdEffects[battlerDef]; + ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, ctx.moveType); if (moveEffect == EFFECT_TRIPLE_KICK) { @@ -842,7 +846,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u } // convert multiper to AI_EFFECTIVENESS_xX - *typeEffectiveness = effectivenessMultiplier; + *typeEffectiveness = ctx.typeEffectivenessModifier; // Undo temporary settings gBattleStruct->dynamicMoveType = 0; @@ -1137,7 +1141,6 @@ u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContex uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) { uq4_12_t typeEffectiveness; - u32 moveType; SaveBattlerData(battlerAtk); SaveBattlerData(battlerDef); @@ -1147,8 +1150,17 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - moveType = GetBattleMoveType(move); - typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], FALSE); + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = GetBattleMoveType(move); + ctx.updateFlags = FALSE; + ctx.abilityAtk = gAiLogicData->abilities[battlerAtk]; + ctx.abilityDef = gAiLogicData->abilities[battlerDef]; + ctx.holdEffectAtk = gAiLogicData->items[battlerAtk]; + ctx.holdEffectDef = gAiLogicData->items[battlerDef]; + typeEffectiveness = CalcTypeEffectivenessMultiplier(&ctx); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 768be59c4a..dfd254e77a 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -100,7 +100,7 @@ static void Task_UpdateLvlInHealthbox(u8); static void PrintLinkStandbyMsg(void); static void ReloadMoveNames(u32 battler); -static u32 CheckTypeEffectiveness(u32 targetId, u32 battler); +static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef); static u32 CheckTargetTypeEffectiveness(u32 battler); static void MoveSelectionDisplayMoveEffectiveness(u32 foeEffectiveness, u32 battler); @@ -507,7 +507,7 @@ void HandleInputChooseTarget(u32 battler) break; } if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -558,7 +558,7 @@ void HandleInputChooseTarget(u32 battler) break; } if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -758,7 +758,7 @@ void HandleInputChooseMove(u32 battler) else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (B_SHOW_EFFECTIVENESS) - MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; break; @@ -2435,15 +2435,23 @@ static bool32 ShouldShowTypeEffectiveness(u32 targetId) return TRUE; } -static u32 CheckTypeEffectiveness(u32 targetId, u32 battler) +static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) { - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); - struct Pokemon *mon = GetBattlerMon(battler); - u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; - u32 moveType = CheckDynamicMoveType(mon, move, battler, MON_IN_BATTLE); - uq4_12_t modifier = CalcTypeEffectivenessMultiplier(move, moveType, battler, targetId, GetBattlerAbility(targetId), FALSE); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battlerAtk][4]); + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = moveInfo->moves[gMoveSelectionCursor[battlerAtk]]; + ctx.moveType = CheckDynamicMoveType(GetBattlerMon(battlerAtk), ctx.move, battlerAtk, MON_IN_BATTLE); + ctx.updateFlags = FALSE; + ctx.abilityAtk = GetBattlerAbility(battlerAtk); + ctx.abilityDef = GetBattlerAbility(battlerDef); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); - if (!ShouldShowTypeEffectiveness(targetId)) + uq4_12_t modifier = CalcTypeEffectivenessMultiplier(&ctx); + + if (!ShouldShowTypeEffectiveness(battlerDef)) return EFFECTIVENESS_CANNOT_VIEW; if (modifier == UQ_4_12(0.0)) @@ -2458,12 +2466,12 @@ static u32 CheckTypeEffectiveness(u32 targetId, u32 battler) static u32 CheckTargetTypeEffectiveness(u32 battler) { u32 battlerFoe = BATTLE_OPPOSITE(GetBattlerPosition(battler)); - u32 foeEffectiveness = CheckTypeEffectiveness(battlerFoe, battler); + u32 foeEffectiveness = CheckTypeEffectiveness(battler, battlerFoe); if (IsDoubleBattle()) { u32 partnerFoe = BATTLE_PARTNER(battlerFoe); - u32 partnerFoeEffectiveness = CheckTypeEffectiveness(partnerFoe, battler); + u32 partnerFoeEffectiveness = CheckTypeEffectiveness(battler, partnerFoe); if (!IsBattlerAlive(battlerFoe)) return partnerFoeEffectiveness; if (IsBattlerAlive(battlerFoe) && IsBattlerAlive(partnerFoe) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 048c4d13de..a97c6ee7a5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1715,13 +1715,15 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) || AccuracyCalcHelper(move, battlerDef)) continue; + u32 abilityDef = GetBattlerAbility(battlerDef); + u32 holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); u32 accuracy = GetTotalAccuracy(gBattlerAttacker, battlerDef, move, abilityAtk, - GetBattlerAbility(battlerDef), + abilityDef, holdEffectAtk, - GetBattlerHoldEffect(battlerDef, TRUE)); + holdEffectDef); if (!RandomPercentage(RNG_ACCURACY, accuracy)) { @@ -1746,7 +1748,20 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u } if (GetMovePower(move) != 0) - CalcTypeEffectivenessMultiplier(move, moveType, gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + { + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = moveType; + ctx.updateFlags = TRUE; + ctx.abilityAtk = abilityAtk; + ctx.abilityDef = abilityDef; + ctx.holdEffectAtk = holdEffectAtk; + ctx.holdEffectDef = holdEffectDef; + + CalcTypeEffectivenessMultiplier(&ctx); + } } } @@ -2126,8 +2141,18 @@ static void Cmd_typecalc(void) if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELLER_MULTI_TARGET_MOVES for Spread Moves { - u32 moveType = GetBattleMoveType(gCurrentMove); - CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget), TRUE); + struct DamageContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = gCurrentMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.updateFlags = TRUE; + ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); + ctx.abilityDef = GetBattlerAbility(gBattlerTarget); + ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget, TRUE); + + CalcTypeEffectivenessMultiplier(&ctx); } gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index b18288763f..750e059612 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -204,6 +204,24 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = }, }; +// Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly +// This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI +static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities) +{ + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.updateFlags = recordAbilities; + ctx.abilityAtk = GetBattlerAbility(battlerAtk); + ctx.abilityDef = defAbility; + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + + return CalcTypeEffectivenessMultiplier(&ctx); +} + u32 GetCurrentBattleWeather(void) { u32 currBattleWeather = 0xFF; @@ -2479,7 +2497,7 @@ static void CancellerMultiTargetMoves(u32 *effect) } else { - CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); } } if (moveTarget == MOVE_TARGET_BOTH) @@ -3591,6 +3609,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_ANTICIPATION: if (!gSpecialStatuses[battler].switchInAbilityDone) { + u32 types[3]; + GetBattlerTypes(battler, FALSE, types); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (IsBattlerAlive(i) && !IsBattlerAlly(i, battler)) @@ -3598,10 +3618,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 for (j = 0; j < MAX_MON_MOVES; j++) { move = gBattleMons[i].moves[j]; - moveType = GetBattleMoveType(move); enum BattleMoveEffects moveEffect = GetMoveEffect(move); - if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, ABILITY_ANTICIPATION, FALSE) >= UQ_4_12(2.0) - || moveEffect == EFFECT_OHKO || moveEffect == EFFECT_SHEER_COLD) + moveType = GetBattleMoveType(move); + + if (GetTypeModifier(moveType, types[0]) >= UQ_4_12(2.0) + || (types[0] != types[1] && GetTypeModifier(moveType, types[1]) >= UQ_4_12(2.0)) + || (types[2] != TYPE_MYSTERY && GetTypeModifier(moveType, types[2]) >= UQ_4_12(2.0)) + || moveEffect == EFFECT_OHKO + || moveEffect == EFFECT_SHEER_COLD) { effect++; break; @@ -5620,7 +5644,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u battleScript = BattleScript_NotAffected; } else if (option == STATUS_RUN_SCRIPT // Check only important during battle execution for moves - && CalcTypeEffectivenessMultiplier(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityDef, TRUE) + && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityDef, TRUE) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) { battleScript = BattleScript_ButItFailed; @@ -9346,10 +9370,10 @@ static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) if (dmg != INT32_MAX) return dmg; - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); return DoMoveDamageCalcVars(ctx); } @@ -9435,13 +9459,7 @@ s32 CalculateMoveDamage(struct DamageContext *ctx) ctx->holdEffectAtk = GetItemHoldEffect(ctx->battlerAtk); ctx->holdEffectDef = GetItemHoldEffect(ctx->battlerDef); - ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier( - ctx->move, - ctx->moveType, - ctx->battlerAtk, - ctx->battlerDef, - ctx->abilityDef, - ctx->updateFlags); + ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); if (IsFutureSightAttackerInParty(ctx->battlerAtk, ctx->battlerDef, ctx->move)) return DoFutureSightAttackDamageCalc(ctx); @@ -9459,37 +9477,36 @@ s32 CalculateMoveDamageVars(struct DamageContext *ctx) return DoMoveDamageCalcVars(ctx); } -static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 moveType, u32 battlerDef, u32 defAbility, u32 defType, u32 battlerAtk, bool32 recordAbilities) +static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *modifier, u32 defType) { - uq4_12_t mod = GetTypeModifier(moveType, defType); - u32 abilityAtk = GetBattlerAbility(battlerAtk); + uq4_12_t mod = GetTypeModifier(ctx->moveType, defType); - if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) + if (mod == UQ_4_12(0.0) && ctx->holdEffectDef == HOLD_EFFECT_RING_TARGET) { mod = UQ_4_12(1.0); - if (recordAbilities) - RecordItemEffectBattle(battlerDef, HOLD_EFFECT_RING_TARGET); + if (ctx->updateFlags) + RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_RING_TARGET); } - else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT && mod == UQ_4_12(0.0)) + else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[ctx->battlerDef].status2 & STATUS2_FORESIGHT && mod == UQ_4_12(0.0)) { mod = UQ_4_12(1.0); } - else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST - && (abilityAtk == ABILITY_SCRAPPY || abilityAtk == ABILITY_MINDS_EYE) + else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST + && (ctx->abilityAtk == ABILITY_SCRAPPY || ctx->abilityAtk == ABILITY_MINDS_EYE) && mod == UQ_4_12(0.0)) { mod = UQ_4_12(1.0); - if (recordAbilities) - RecordAbilityBattle(battlerAtk, abilityAtk); + if (ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityAtk); } - if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) + if (ctx->moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[ctx->battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); - if (GetMoveEffect(move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(move)) + if (GetMoveEffect(ctx->move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(ctx->move)) mod = UQ_4_12(2.0); - if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef) && mod == UQ_4_12(0.0)) + if (ctx->moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(ctx->battlerDef) && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); - if (moveType == TYPE_STELLAR && GetActiveGimmick(battlerDef) == GIMMICK_TERA) + if (ctx->moveType == TYPE_STELLAR && GetActiveGimmick(ctx->battlerDef) == GIMMICK_TERA) mod = UQ_4_12(2.0); // B_WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon @@ -9499,14 +9516,14 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move mod = UQ_4_12(1.0); } - if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(move, battlerDef, defAbility))) + if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups || (mod > UQ_4_12(0.0) && ShouldTeraShellDistortTypeMatchups(ctx->move, ctx->battlerDef, ctx->abilityDef))) { mod = UQ_4_12(0.5); - if (recordAbilities) + if (ctx->updateFlags) { - RecordAbilityBattle(battlerDef, defAbility); - gSpecialStatuses[battlerDef].distortedTypeMatchups = TRUE; - gSpecialStatuses[battlerDef].teraShellAbilityDone = TRUE; + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups = TRUE; + gSpecialStatuses[ctx->battlerDef].teraShellAbilityDone = TRUE; } } @@ -9517,12 +9534,24 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, { // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. uq4_12_t presumedModifier = UQ_4_12(1.0); - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 0), battlerAtk, FALSE); + + struct DamageContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = move; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + ctx.abilityAtk = GetBattlerAbility(battlerAtk); + ctx.abilityDef = ABILITY_ILLUSION; + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + + MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 0)); if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0)) - MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 1), battlerAtk, FALSE); + MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 1)); if (presumedModifier != resultingModifier) - RecordAbilityBattle(battlerDef, ABILITY_ILLUSION); + RecordAbilityBattle(ctx.battlerDef, ABILITY_ILLUSION); } void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) @@ -9549,99 +9578,102 @@ void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) } } -static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, bool32 recordAbilities, uq4_12_t modifier, u32 defAbility) +static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageContext *ctx, uq4_12_t modifier) { u32 illusionSpecies; u32 types[3]; - GetBattlerTypes(battlerDef, FALSE, types); + GetBattlerTypes(ctx->battlerDef, FALSE, types); - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[0], battlerAtk, recordAbilities); + MulByTypeEffectiveness(ctx, &modifier, types[0]); if (types[1] != types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[1], battlerAtk, recordAbilities); + MulByTypeEffectiveness(ctx, &modifier, types[1]); if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0]) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, defAbility, types[2], battlerAtk, recordAbilities); - if (moveType == TYPE_FIRE && gDisableStructs[battlerDef].tarShot) + MulByTypeEffectiveness(ctx, &modifier, types[2]); + if (ctx->moveType == TYPE_FIRE && gDisableStructs[ctx->battlerDef].tarShot) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); - if (recordAbilities && (illusionSpecies = GetIllusionMonSpecies(battlerDef))) - TryNoticeIllusionInTypeEffectiveness(move, moveType, battlerAtk, battlerDef, modifier, illusionSpecies); + if (ctx->updateFlags && (illusionSpecies = GetIllusionMonSpecies(ctx->battlerDef))) + TryNoticeIllusionInTypeEffectiveness(ctx->move, ctx->moveType, ctx->battlerAtk, ctx->battlerDef, modifier, illusionSpecies); - if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && move != MOVE_THUNDER_WAVE) + if (GetMoveCategory(ctx->move) == DAMAGE_CATEGORY_STATUS && ctx->move != MOVE_THUNDER_WAVE) { modifier = UQ_4_12(1.0); - if (B_GLARE_GHOST < GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) + if (B_GLARE_GHOST < GEN_4 && ctx->move == MOVE_GLARE && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GHOST)) modifier = UQ_4_12(0.0); } - else if (moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(battlerDef, INVERSE_BATTLE, CHECK_IRON_BALL) && !(MoveIgnoresTypeIfFlyingAndUngrounded(move))) + else if (ctx->moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(ctx->battlerDef, INVERSE_BATTLE, CHECK_IRON_BALL) && !(MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move))) { modifier = UQ_4_12(0.0); - if (recordAbilities && defAbility == ABILITY_LEVITATE) + if (ctx->updateFlags && ctx->abilityDef == ABILITY_LEVITATE) { - gBattleStruct->moveResultFlags[battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); + gBattleStruct->moveResultFlags[ctx->battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastUsedAbility = ABILITY_LEVITATE; - gLastLandedMoves[battlerDef] = 0; - gBattleStruct->missStringId[battlerDef] = B_MSG_GROUND_MISS; - RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); + gLastLandedMoves[ctx->battlerDef] = 0; + gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_GROUND_MISS; + RecordAbilityBattle(ctx->battlerDef, ABILITY_LEVITATE); } } - else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && GetMoveEffect(move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) { modifier = UQ_4_12(0.0); } // Thousand Arrows ignores type modifiers for flying mons - if (!IsBattlerGrounded(battlerDef) - && MoveIgnoresTypeIfFlyingAndUngrounded(move) - && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING)) + if (!IsBattlerGrounded(ctx->battlerDef) + && MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move) + && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING)) { modifier = UQ_4_12(1.0); } // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding if (B_IRON_BALL >= GEN_5 - && moveType == TYPE_GROUND - && IS_BATTLER_OF_TYPE(battlerDef, TYPE_FLYING) - && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_IRON_BALL - && !IsBattlerGroundedInverseCheck(battlerDef, NOT_INVERSE_BATTLE, IGNORE_IRON_BALL) + && ctx->moveType == TYPE_GROUND + && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING) + && GetBattlerHoldEffect(ctx->battlerDef, TRUE) == HOLD_EFFECT_IRON_BALL + && !IsBattlerGroundedInverseCheck(ctx->battlerDef, NOT_INVERSE_BATTLE, IGNORE_IRON_BALL) && !FlagGet(B_FLAG_INVERSE_BATTLE)) { modifier = UQ_4_12(1.0); } - if (((defAbility == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) - || (defAbility == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk))) - && GetMovePower(move) != 0) + if (((ctx->abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0)) + || (ctx->abilityDef == ABILITY_TELEPATHY && ctx->battlerDef == BATTLE_PARTNER(ctx->battlerAtk))) + && GetMovePower(ctx->move) != 0) { modifier = UQ_4_12(0.0); - if (recordAbilities) + if (ctx->updateFlags) { - gLastUsedAbility = gBattleMons[battlerDef].ability; - gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; - gLastLandedMoves[battlerDef] = 0; - gBattleStruct->missStringId[battlerDef] = B_MSG_AVOIDED_DMG; - RecordAbilityBattle(battlerDef, gBattleMons[battlerDef].ability); + gLastUsedAbility = gBattleMons[ctx->battlerDef].ability; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + gLastLandedMoves[ctx->battlerDef] = 0; + gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_AVOIDED_DMG; + RecordAbilityBattle(ctx->battlerDef, gBattleMons[ctx->battlerDef].ability); } } - if (recordAbilities) - TryInitializeFirstSTABMoveTrainerSlide(battlerDef, battlerAtk, moveType); + if (ctx->updateFlags) + TryInitializeFirstSTABMoveTrainerSlide(ctx->battlerDef, ctx->battlerAtk, ctx->moveType); return modifier; } -uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities) +uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx) { uq4_12_t modifier = UQ_4_12(1.0); - if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) + if (ctx->move != MOVE_STRUGGLE && ctx->moveType != TYPE_MYSTERY) { - modifier = CalcTypeEffectivenessMultiplierInternal(move, moveType, battlerAtk, battlerDef, recordAbilities, modifier, defAbility); - if (GetMoveEffect(move) == EFFECT_TWO_TYPED_MOVE) - modifier = CalcTypeEffectivenessMultiplierInternal(move, GetMoveArgType(move), battlerAtk, battlerDef, recordAbilities, modifier, defAbility); + modifier = CalcTypeEffectivenessMultiplierInternal(ctx, modifier); + if (GetMoveEffect(ctx->move) == EFFECT_TWO_TYPED_MOVE) + { + ctx->moveType = GetMoveArgType(ctx->move); + modifier = CalcTypeEffectivenessMultiplierInternal(ctx, modifier); + } } - if (recordAbilities) - UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[battlerDef]); + if (ctx->updateFlags) + UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[ctx->battlerDef]); return modifier; } @@ -9652,11 +9684,17 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 a if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 0), 0, FALSE); - if (GetSpeciesType(speciesDef, 1) != GetSpeciesType(speciesDef, 0)) - MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 1), 0, FALSE); + struct DamageContext ctx = {0}; + ctx.move = move; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + ctx.abilityDef = abilityDef; - if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) + MulByTypeEffectiveness(&ctx, &modifier, GetSpeciesType(speciesDef, 0)); + if (GetSpeciesType(speciesDef, 1) != GetSpeciesType(speciesDef, 0)) + MulByTypeEffectiveness(&ctx, &modifier, GetSpeciesType(speciesDef, 1)); + + if (ctx.moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) modifier = UQ_4_12(0.0); if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && GetMovePower(move) != 0) modifier = UQ_4_12(0.0); @@ -9690,9 +9728,14 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) if (moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type1, 0, FALSE); + struct DamageContext ctx = {0}; + ctx.move = MOVE_POUND; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + + MulByTypeEffectiveness(&ctx, &modifier, type1); if (type2 != type1) - MulByTypeEffectiveness(&modifier, MOVE_POUND, moveType, 0, 0, type2, 0, FALSE); + MulByTypeEffectiveness(&ctx, &modifier, type2); if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) || (moveType == TYPE_FIRE && abilityDef == ABILITY_FLASH_FIRE) @@ -11103,7 +11146,7 @@ static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerD bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) { u32 moveType = GetBattleMoveType(gCurrentMove); - return ((CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c index e1de10f2ff..223512710f 100644 --- a/test/battle/ability/anticipation.c +++ b/test/battle/ability/anticipation.c @@ -133,7 +133,6 @@ SINGLE_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-t SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type move") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE); ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER); @@ -150,7 +149,6 @@ SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type mo SINGLE_BATTLE_TEST("Anticipation considers Flying Press as an ordinary Fighting-type move") { - KNOWN_FAILING; GIVEN { ASSUME(GetMoveType(MOVE_FLYING_PRESS) == TYPE_FIGHTING); ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); @@ -280,7 +278,6 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N SINGLE_BATTLE_TEST("Anticipation does not consider Strong Winds on type matchups") { - KNOWN_FAILING; GIVEN { ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 0) == TYPE_DRAGON); ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 1) == TYPE_FLYING); From 522ccf06da34c22a51ae1d49b7d22ed3edfb8e8b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 14 Jun 2025 11:56:04 +0200 Subject: [PATCH 053/248] Use CanAbilityAbsorbMove in GetOverworldTypeEffectiveness (#7115) --- src/battle_util.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 750e059612..dd1603e6b5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9726,32 +9726,22 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) u8 type1 = GetSpeciesType(speciesDef, 0); u8 type2 = GetSpeciesType(speciesDef, 1); - if (moveType != TYPE_MYSTERY) - { - struct DamageContext ctx = {0}; - ctx.move = MOVE_POUND; - ctx.moveType = moveType; - ctx.updateFlags = FALSE; + if (moveType == TYPE_MYSTERY) + return modifier; - MulByTypeEffectiveness(&ctx, &modifier, type1); - if (type2 != type1) - MulByTypeEffectiveness(&ctx, &modifier, type2); + struct DamageContext ctx = {0}; + ctx.move = MOVE_POUND; + ctx.moveType = moveType; + ctx.updateFlags = FALSE; + + MulByTypeEffectiveness(&ctx, &modifier, type1); + if (type2 != type1) + MulByTypeEffectiveness(&ctx, &modifier, type2); + + if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) + || CanAbilityAbsorbMove(0, 0, abilityDef, MOVE_NONE, moveType, ABILITY_CHECK_TRIGGER)) + modifier = UQ_4_12(0.0); - if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) - || (moveType == TYPE_FIRE && abilityDef == ABILITY_FLASH_FIRE) - || (moveType == TYPE_GRASS && abilityDef == ABILITY_SAP_SIPPER) - || (moveType == TYPE_GROUND && (abilityDef == ABILITY_LEVITATE - || abilityDef == ABILITY_EARTH_EATER)) - || (moveType == TYPE_WATER && (abilityDef == ABILITY_WATER_ABSORB - || abilityDef == ABILITY_DRY_SKIN - || abilityDef == ABILITY_STORM_DRAIN)) - || (moveType == TYPE_ELECTRIC && (abilityDef == ABILITY_LIGHTNING_ROD // TODO: Add Gen 3/4 config check - || abilityDef == ABILITY_VOLT_ABSORB - || abilityDef == ABILITY_MOTOR_DRIVE))) - { - modifier = UQ_4_12(0.0); - } - } return modifier; } From e2f0767be5dc60e44e5013dc10a3765f009f1613 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 16 Jun 2025 15:45:21 +0200 Subject: [PATCH 054/248] Decouple Status set by ability from SetMoveEffect (#7125) --- asm/macros/battle_script.inc | 5 +- data/battle_scripts_1.s | 12 +- include/battle_script_commands.h | 1 - include/constants/battle.h | 16 ++- include/constants/battle_script_commands.h | 7 ++ src/battle_script_commands.c | 133 ++++++++++----------- src/battle_util.c | 122 +++++++++---------- 7 files changed, 147 insertions(+), 149 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 258f8a331e..91b9ae523c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -832,7 +832,7 @@ .4byte \failInstr .endm - .macro unused_0x94 + .macro setstatuswithability .byte 0x94 .endm @@ -1338,8 +1338,9 @@ .4byte \jumpInstr .endm - .macro setnonvolatilestatus + .macro setnonvolatilestatus trigger:req .byte 0xfd + .byte \trigger .endm .macro tryworryseed failInstr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2d6a0c7d7a..2d1999464b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3239,7 +3239,6 @@ BattleScript_EffectBide:: ppreduce attackanimation waitanimation - orword gHitMarker, HITMARKER_CHARGING setbide goto BattleScript_MoveEnd @@ -3614,7 +3613,6 @@ BattleScript_FirstChargingTurn:: ppreduce BattleScript_FirstChargingTurnAfterAttackString: setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP - orword gHitMarker, HITMARKER_CHARGING seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER twoturnmoveschargestringandanimation setadditionaleffects @ only onChargeTurnOnly effects will work here @@ -4714,7 +4712,7 @@ BattleScript_EffectNonVolatileStatus:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - setnonvolatilestatus + setnonvolatilestatus TRIGGER_ON_MOVE resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -8497,9 +8495,9 @@ BattleScript_KingsShieldEffect:: return BattleScript_BanefulBunkerEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - seteffectsecondary + setnonvolatilestatus TRIGGER_ON_ATTACKER setmoveresultflags MOVE_RESULT_MISSED return @@ -8522,7 +8520,7 @@ BattleScript_GooeyActivates:: BattleScript_AbilityStatusEffect:: waitstate call BattleScript_AbilityPopUp - seteffectsecondary + setnonvolatilestatus TRIGGER_ON_ABILITY return BattleScript_BattleBondActivatesOnMoveEndAttacker:: @@ -8570,7 +8568,7 @@ BattleScript_DancerActivates:: BattleScript_SynchronizeActivates:: waitstate call BattleScript_AbilityPopUp - seteffectprimary + setnonvolatilestatus TRIGGER_ON_ABILITY return BattleScript_NoItemSteal:: diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index c0d47436fd..b28988bf55 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -58,7 +58,6 @@ bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler); void SaveBattlerTarget(u32 battler); void SaveBattlerAttacker(u32 battler); bool32 CanBurnHitThaw(u16 move); -void SetNonVolatileStatusCondition(u32 target, enum MoveEffects effect); extern void (*const gBattleScriptingCommandsTable[])(void); extern const struct StatFractions gAccuracyStageRatios[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index d8ade2adec..68a1c25e6f 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -207,7 +207,7 @@ enum BattlerId #define STATUS4_SYRUP_BOMB (1 << 5) #define STATUS4_GLAIVE_RUSH (1 << 6) -#define HITMARKER_UNUSED_1 (1 << 4) +#define HITMARKER_STRING_PRINTED (1 << 4) #define HITMARKER_IGNORE_BIDE (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle @@ -215,25 +215,24 @@ enum BattlerId #define HITMARKER_NO_ATTACKSTRING (1 << 9) #define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) #define HITMARKER_NO_PPDEDUCT (1 << 11) -#define HITMARKER_UNUSED_2 (1 << 12) +#define HITMARKER_UNUSED_12 (1 << 12) #define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) -#define HITMARKER_SYNCHRONIZE_EFFECT (1 << 14) +#define HITMARKER_UNUSED_14 (1 << 14) #define HITMARKER_RUN (1 << 15) #define HITMARKER_IGNORE_DISGUISE (1 << 16) #define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite -#define HITMARKER_UNUSED_3 (1 << 18) +#define HITMARKER_UNUSED_18 (1 << 18) #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) #define HITMARKER_PASSIVE_DAMAGE (1 << 20) -#define HITMARKER_UNUSED_4 (1 << 21) +#define HITMARKER_UNUSED_21 (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) #define HITMARKER_ALLOW_NO_PP (1 << 23) #define HITMARKER_GRUDGE (1 << 24) #define HITMARKER_OBEYS (1 << 25) -#define HITMARKER_UNUSED_5 (1 << 26) -#define HITMARKER_CHARGING (1 << 27) +#define HITMARKER_UNUSED_26 (1 << 26) +#define HITMARKER_UNUSED_27 (1 << 27) #define HITMARKER_FAINTED(battler) (1u << (battler + 28)) #define HITMARKER_FAINTED2(battler) HITMARKER_FAINTED(battler) -#define HITMARKER_STRING_PRINTED (1 << 29) // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) @@ -463,7 +462,6 @@ enum MoveEffects NUM_MOVE_EFFECTS }; -#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status #if B_USE_FROSTBITE == TRUE #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FROSTBITE #else diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e09ff706ec..2fcc0d4d58 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -301,4 +301,11 @@ enum MoveEndEffects #define ARG_TRY_REMOVE_TERRAIN_HIT 1 #define ARG_TRY_REMOVE_TERRAIN_FAIL 2 +enum StatusTrigger +{ + TRIGGER_ON_MOVE, + TRIGGER_ON_ABILITY, + TRIGGER_ON_ATTACKER, +}; + #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a97c6ee7a5..9091796fce 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3173,8 +3173,10 @@ static inline bool32 TrySetLightScreen(u32 battler) return FALSE; } -void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) +static void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect, enum StatusTrigger trigger) { + gEffectBattler = effectBattler; + if (effect == MOVE_EFFECT_SLEEP || effect == MOVE_EFFECT_FREEZE) { @@ -3227,15 +3229,10 @@ void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) BtlController_EmitSetMonData(effectBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[effectBattler].status1), &gBattleMons[effectBattler].status1); MarkBattlerForControllerExec(effectBattler); - if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - { + if (trigger == TRIGGER_ON_ABILITY) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; - gHitMarker &= ~HITMARKER_STATUS_ABILITY_EFFECT; - } else - { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED; - } gBattleScripting.moveEffect = MOVE_EFFECT_NONE; @@ -3244,33 +3241,22 @@ void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect) || effect == MOVE_EFFECT_TOXIC || effect == MOVE_EFFECT_PARALYSIS || effect == MOVE_EFFECT_BURN) - { gBattleStruct->synchronizeMoveEffect = effect; - gHitMarker |= HITMARKER_SYNCHRONIZE_EFFECT; - } if (effect == MOVE_EFFECT_POISON || effect == MOVE_EFFECT_TOXIC) gBattleStruct->poisonPuppeteerConfusion = TRUE; } -#define INCREMENT_RESET_RETURN \ -{ \ - gBattlescriptCurrInstr++; \ - gBattleScripting.moveEffect = 0; \ - return; \ -} - void SetMoveEffect(bool32 primary, bool32 certain) { s32 i, affectsUser = 0; - bool32 statusChanged = FALSE; bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; u32 battlerAbility; bool32 activateAfterFaint = FALSE; // NULL move effect - if (gBattleScripting.moveEffect == 0) + if (gBattleScripting.moveEffect == MOVE_EFFECT_NONE) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT @@ -3313,53 +3299,45 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (!primary && affectsUser != MOVE_EFFECT_AFFECTS_USER && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && IsMoveEffectBlockedByTarget(battlerAbility)) - INCREMENT_RESET_RETURN - - if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION) - INCREMENT_RESET_RETURN - - if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) - && !primary - && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) - INCREMENT_RESET_RETURN - - if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) - INCREMENT_RESET_RETURN - - if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) - INCREMENT_RESET_RETURN - - if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) // status change - { - if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)) // Calcs already done - { - statusChanged = CanSetNonVolatileStatus(gBattlerAttacker, - gEffectBattler, - GetBattlerAbility(gBattlerAttacker), - battlerAbility, - gBattleScripting.moveEffect, - STATUS_CHECK_TRIGGER); - } - - if (statusChanged || gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - { - SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect); - } - else - { - gBattleScripting.moveEffect = 0; - gBattlescriptCurrInstr++; - } - return; - } + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + else if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) + && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) + && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) + && !primary + && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + else if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; switch (gBattleScripting.moveEffect) { + case MOVE_EFFECT_NONE: + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_SLEEP: + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_BURN: + case MOVE_EFFECT_FREEZE: + case MOVE_EFFECT_PARALYSIS: + case MOVE_EFFECT_TOXIC: + case MOVE_EFFECT_FROSTBITE: + if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary) + gBattlescriptCurrInstr++; + else if (CanSetNonVolatileStatus( + gBattlerAttacker, + gEffectBattler, + GetBattlerAbility(gBattlerAttacker), + battlerAbility, + gBattleScripting.moveEffect, + STATUS_CHECK_TRIGGER)) + SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect, TRIGGER_ON_MOVE); + break; case MOVE_EFFECT_CONFUSION: - if (!CanBeConfused(gEffectBattler) || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION) + if (!CanBeConfused(gEffectBattler) + || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION + || (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary)) { gBattlescriptCurrInstr++; } @@ -5387,11 +5365,11 @@ static void Cmd_checkteamslost(void) static void MoveValuesCleanUp(void) { - gBattleScripting.moveEffect = 0; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gBattleCommunication[MISS_TYPE] = 0; if (!gMultiHitCounter) gHitMarker &= ~HITMARKER_DESTINYBOND; - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; } static void Cmd_movevaluescleanup(void) @@ -6385,7 +6363,7 @@ static void Cmd_moveend(void) if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; @@ -6394,8 +6372,9 @@ static void Cmd_moveend(void) case PROTECT_BURNING_BULWARK: if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) { + gEffectBattler = gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_BURN | MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK); BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; @@ -7412,7 +7391,7 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; - gBattleScripting.moveEffect = 0; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gBattleStruct->isAtkCancelerForCalledMove = FALSE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; @@ -16484,9 +16463,23 @@ static void Cmd_jumpifcaptivateaffected(void) static void Cmd_setnonvolatilestatus(void) { - CMD_ARGS(); - gEffectBattler = gBattlerTarget; - SetNonVolatileStatusCondition(gBattlerTarget, GetMoveNonVolatileStatus(gCurrentMove)); + CMD_ARGS(u8 trigger); + + switch (cmd->trigger) + { + case TRIGGER_ON_ABILITY: + if (gBattleScripting.moveEffect == MOVE_EFFECT_CONFUSION) + SetMoveEffect(FALSE, FALSE); + else + SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect, TRIGGER_ON_ABILITY); + break; + case TRIGGER_ON_MOVE: + SetNonVolatileStatusCondition(gBattlerTarget, GetMoveNonVolatileStatus(gCurrentMove), TRIGGER_ON_MOVE); + break; + case TRIGGER_ON_ATTACKER: + SetNonVolatileStatusCondition(gBattlerAttacker, gBattleScripting.moveEffect, TRIGGER_ON_ATTACKER); + break; + } } static void Cmd_tryworryseed(void) diff --git a/src/battle_util.c b/src/battle_util.c index dd1603e6b5..a3367e27b5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -872,9 +872,10 @@ void HandleAction_NothingIsFainted(void) { gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_SYNCHRONIZE_EFFECT | HITMARKER_CHARGING); + | HITMARKER_OBEYS); } void HandleAction_ActionFinished(void) @@ -887,8 +888,7 @@ void HandleAction_ActionFinished(void) SpecialStatusesClear(); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE - | HITMARKER_OBEYS | HITMARKER_SYNCHRONIZE_EFFECT - | HITMARKER_CHARGING | HITMARKER_IGNORE_DISGUISE); + | HITMARKER_OBEYS | HITMARKER_IGNORE_DISGUISE); ClearDamageCalcResults(); gCurrentMove = 0; @@ -902,6 +902,7 @@ void HandleAction_ActionFinished(void) gBattleCommunication[4] = 0; gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) { @@ -2284,7 +2285,7 @@ static void CancellerWeatherPrimal(u32 *effect) } if (*effect == 1) { - gBattleScripting.moveEffect = 0; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -4650,10 +4651,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { if (IsSleepClauseEnabled()) gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } } @@ -4671,10 +4673,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } } @@ -4691,10 +4694,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker)) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } } @@ -4709,10 +4713,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) { - gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -4914,10 +4919,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomPercentage(RNG_POISON_TOUCH, 30)) { + gEffectBattler = gBattlerTarget; + gBattleScripting.battler = gBattlerAttacker; gBattleScripting.moveEffect = MOVE_EFFECT_POISON; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -4929,10 +4935,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) { + gEffectBattler = gBattlerTarget; + gBattleScripting.battler = gBattlerAttacker; gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -4969,6 +4976,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_AbilityStatusEffect); + gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } break; @@ -5118,69 +5126,63 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_SYNCHRONIZE: - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONIZE_EFFECT)) + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && gBattleStruct->synchronizeMoveEffect != MOVE_EFFECT_NONE) { - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; - - bool32 statusChanged = CanSetNonVolatileStatus(gBattlerTarget, - gBattlerAttacker, - gLastUsedAbility, - GetBattlerAbility(gBattlerAttacker), - gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER); - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); - if (statusChanged) + if (CanSetNonVolatileStatus( + gBattlerTarget, + gBattlerAttacker, + gLastUsedAbility, + GetBattlerAbility(gBattlerAttacker), + gBattleStruct->synchronizeMoveEffect, + STATUS_CHECK_TRIGGER)) { - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; - PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); - BattleScriptCall(BattleScript_SynchronizeActivates); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; - effect++; - } - else // Synchronize ability pop up still shows up even if status fails - { - BattleScriptCall(BattleScript_AbilityPopUp); - } - } - break; - case ABILITYEFFECT_ATK_SYNCHRONIZE: - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONIZE_EFFECT)) - { - gHitMarker &= ~HITMARKER_SYNCHRONIZE_EFFECT; - - bool32 statusChanged = CanSetNonVolatileStatus(gBattlerAttacker, - gBattlerTarget, - gLastUsedAbility, - GetBattlerAbility(gBattlerAttacker), - gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER); - - gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; - RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); - - if (statusChanged) - { - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - + gEffectBattler = gBattlerAttacker; gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); BattleScriptCall(BattleScript_SynchronizeActivates); - gHitMarker |= HITMARKER_STATUS_ABILITY_EFFECT; effect++; } else // Synchronize ability pop up still shows up even if status fails { BattleScriptCall(BattleScript_AbilityPopUp); } + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; + } + break; + case ABILITYEFFECT_ATK_SYNCHRONIZE: + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && gBattleStruct->synchronizeMoveEffect != MOVE_EFFECT_NONE) + { + gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; + RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); + + if (CanSetNonVolatileStatus( + gBattlerAttacker, + gBattlerTarget, + gLastUsedAbility, + GetBattlerAbility(gBattlerAttacker), + gBattleStruct->synchronizeMoveEffect, + STATUS_CHECK_TRIGGER)) + { + if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + + gEffectBattler = gBattlerTarget; + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); + BattleScriptCall(BattleScript_SynchronizeActivates); + effect++; + } + else // Synchronize ability pop up still shows up even if status fails + { + BattleScriptCall(BattleScript_AbilityPopUp); + } + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; } break; From 221ff8ed47480ecdd4828d3b1f3c193d35d1cdbf Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 16 Jun 2025 16:11:00 -0400 Subject: [PATCH 055/248] Removed redundant Damp check (#7134) --- src/battle_script_commands.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9091796fce..a1a0814253 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6977,12 +6977,9 @@ static void Cmd_moveend(void) break; case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: - if (!IsAbilityOnField(ABILITY_DAMP)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = 0; - BattleScriptCall(BattleScript_FaintAttackerForExplosion); - effect = TRUE; - } + gBattleStruct->moveDamage[gBattlerAttacker] = 0; + BattleScriptCall(BattleScript_FaintAttackerForExplosion); + effect = TRUE; break; case EFFECT_MAX_HP_50_RECOIL: case EFFECT_MIND_BLOWN: From 651e87af5f1ea5b1642ef443be03c9b5a70efb0e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 16 Jun 2025 18:02:25 -0400 Subject: [PATCH 056/248] Converted Relic Song into a proper form change (#7139) --- asm/macros/battle_script.inc | 4 -- data/battle_scripts_1.s | 7 -- include/battle_scripts.h | 1 - include/constants/battle_move_effects.h | 1 - include/constants/battle_script_commands.h | 1 + include/constants/form_change_types.h | 3 + src/battle_script_commands.c | 30 +++----- src/battle_util.c | 1 + src/data/battle_move_effects.h | 6 -- src/data/moves_info.h | 2 +- src/data/pokemon/form_change_tables.h | 8 ++- .../battle_after_move.c} | 68 ------------------ .../battle/move_effects_combined/relic_song.c | 69 +++++++++++++++++++ 13 files changed, 88 insertions(+), 113 deletions(-) rename test/battle/{move_effect/relic_song.c => form_change/battle_after_move.c} (66%) create mode 100644 test/battle/move_effects_combined/relic_song.c diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 91b9ae523c..df4e00fb19 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1447,10 +1447,6 @@ callnative BS_SetGlaiveRush .endm - .macro tryrelicsong - callnative BS_TryRelicSong - .endm - .macro setpledge jumpInstr:req callnative BS_SetPledge .4byte \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2d1999464b..51ba648943 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1094,13 +1094,6 @@ BattleScript_JungleHealingTryRestoreAlly: setallytonexttarget JungleHealing_RestoreTargetHealth goto BattleScript_MoveEnd -BattleScript_EffectRelicSong:: - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - moveendall - tryrelicsong - end - BattleScript_EffectAllySwitch:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 315c2939e1..d4cb6dfb8a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -819,7 +819,6 @@ extern const u8 BattleScript_EffectShoreUp[]; extern const u8 BattleScript_EffectGeomancy[]; extern const u8 BattleScript_EffectFairyLock[]; extern const u8 BattleScript_EffectAllySwitch[]; -extern const u8 BattleScript_EffectRelicSong[]; extern const u8 BattleScript_MoveEffectEerieSpell[]; extern const u8 BattleScript_EffectJungleHealing[]; extern const u8 BattleScript_EffectCoaching[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index fdd256740e..f9063c5717 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -281,7 +281,6 @@ enum BattleMoveEffects EFFECT_GEOMANCY, EFFECT_FAIRY_LOCK, EFFECT_ALLY_SWITCH, - EFFECT_RELIC_SONG, EFFECT_BODY_PRESS, EFFECT_JUNGLE_HEALING, EFFECT_COACHING, diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 2fcc0d4d58..e08a6dc239 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -277,6 +277,7 @@ enum MoveEndEffects MOVEEND_RED_CARD, // Red Card triggers before Eject Pack MOVEEND_EJECT_BUTTON, MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc + MOVEEND_FORM_CHANGE, MOVEEND_EMERGENCY_EXIT, MOVEEND_EJECT_PACK, MOVEEND_HIT_ESCAPE, diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 85aa27c75b..aef60b593d 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -126,6 +126,9 @@ enum FormChanges // param1: move to check // param2: ability to check, optional FORM_CHANGE_BATTLE_BEFORE_MOVE, + // Form change that activates after using a move. + // param1: move to check + FORM_CHANGE_BATTLE_AFTER_MOVE, // Form change that activates before using a specific move category. // param1: move category to check // param2: ability to check, optional diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a1a0814253..a6b76ac213 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7247,6 +7247,14 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_FORM_CHANGE: + if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_AFTER_MOVE)) + { + effect = TRUE; + BattleScriptCall(BattleScript_AttackerFormChangeMoveEffect); + } + gBattleScripting.moveendState++; + break; case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out { // Because sorting the battlers by speed takes lots of cycles, @@ -17358,28 +17366,6 @@ void BS_SetGlaiveRush(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// TODO: Convert this to a proper FORM_CHANGE type. -void BS_TryRelicSong(void) -{ - NATIVE_ARGS(); - - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_SHEER_FORCE && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - && (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_ARIA || gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_PIROUETTE)) - { - if (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_ARIA) - gBattleMons[gBattlerAttacker].species = SPECIES_MELOETTA_PIROUETTE; - else if (gBattleMons[gBattlerAttacker].species == SPECIES_MELOETTA_PIROUETTE) - gBattleMons[gBattlerAttacker].species = SPECIES_MELOETTA_ARIA; - - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_AttackerFormChangeMoveEffect; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - void BS_SetPledge(void) { NATIVE_ARGS(const u8 *jumpInstr); diff --git a/src/battle_util.c b/src/battle_util.c index a3367e27b5..09c021cebb 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10052,6 +10052,7 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) targetSpecies = formChanges[i].targetSpecies; break; case FORM_CHANGE_BATTLE_BEFORE_MOVE: + case FORM_CHANGE_BATTLE_AFTER_MOVE: if (formChanges[i].param1 == gCurrentMove && (formChanges[i].param2 == ABILITY_NONE || formChanges[i].param2 == GetBattlerAbility(battler))) targetSpecies = formChanges[i].targetSpecies; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index bd757914e5..578444a380 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1798,12 +1798,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_RELIC_SONG] = - { - .battleScript = BattleScript_EffectRelicSong, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_BODY_PRESS] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 0a34c5672f..836b9e5466 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -13993,7 +13993,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Attacks with an ancient\n" "song. May induce sleep."), - .effect = EFFECT_RELIC_SONG, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_NORMAL, .accuracy = 100, diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index a17a432834..ed80ae2178 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -771,15 +771,17 @@ static const struct FormChange sKeldeoFormChangeTable[] = { #if P_FAMILY_MELOETTA static const struct FormChange sMeloettaFormChangeTable[] = { - {FORM_CHANGE_FAINT, SPECIES_MELOETTA_ARIA}, - {FORM_CHANGE_END_BATTLE, SPECIES_MELOETTA_ARIA}, + {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_PIROUETTE, MOVE_RELIC_SONG}, + {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_ARIA, MOVE_RELIC_SONG}, + {FORM_CHANGE_FAINT, SPECIES_MELOETTA_ARIA}, + {FORM_CHANGE_END_BATTLE, SPECIES_MELOETTA_ARIA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT static const struct FormChange sGenesectFormChangeTable[] = { - {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, + {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_DOUSE, ITEM_DOUSE_DRIVE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_SHOCK, ITEM_SHOCK_DRIVE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_BURN, ITEM_BURN_DRIVE}, diff --git a/test/battle/move_effect/relic_song.c b/test/battle/form_change/battle_after_move.c similarity index 66% rename from test/battle/move_effect/relic_song.c rename to test/battle/form_change/battle_after_move.c index f1e7fae92f..2dc9d95a15 100644 --- a/test/battle/move_effect/relic_song.c +++ b/test/battle/form_change/battle_after_move.c @@ -1,74 +1,6 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_RELIC_SONG) == EFFECT_RELIC_SONG); - ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); -} - -SINGLE_BATTLE_TEST("Relic Song has a 10% chance to put the target to sleep") -{ - PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); - STATUS_ICON(opponent, sleep: TRUE); - } -} - -SINGLE_BATTLE_TEST("Relic Song is prevented by Soundproof") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } - } WHEN { - TURN { MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_SOUNDPROOF); - MESSAGE("The opposing Voltorb's Soundproof blocks Relic Song!"); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - HP_BAR(opponent); - } - } -} - -SINGLE_BATTLE_TEST("Relic Song will become a Water-type move when used by a Pokémon with the Ability Liquid Voice") -{ - GIVEN { - PLAYER(SPECIES_VULPIX); - OPPONENT(SPECIES_POPPLIO) { Ability(ABILITY_LIQUID_VOICE); } - } WHEN { - TURN { MOVE(opponent, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, opponent); - HP_BAR(player); - MESSAGE("It's super effective!"); - } -} - -SINGLE_BATTLE_TEST("Relic Song is blocked by Throat Chop") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_RELIC_SONG); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, opponent); - HP_BAR(player); - MESSAGE("The effects of Throat Chop prevent Wobbuffet from using certain moves!"); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); - } -} - SINGLE_BATTLE_TEST("Relic Song transforms Meloetta if used successfully") { GIVEN { diff --git a/test/battle/move_effects_combined/relic_song.c b/test/battle/move_effects_combined/relic_song.c new file mode 100644 index 0000000000..dec92f069e --- /dev/null +++ b/test/battle/move_effects_combined/relic_song.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); +} + +SINGLE_BATTLE_TEST("Relic Song has a 10% chance to put the target to sleep") +{ + PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Relic Song is prevented by Soundproof") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_SOUNDPROOF); + MESSAGE("The opposing Voltorb's Soundproof blocks Relic Song!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + } + } +} + +SINGLE_BATTLE_TEST("Relic Song will become a Water-type move when used by a Pokémon with the Ability Liquid Voice") +{ + GIVEN { + PLAYER(SPECIES_VULPIX); + OPPONENT(SPECIES_POPPLIO) { Ability(ABILITY_LIQUID_VOICE); } + } WHEN { + TURN { MOVE(opponent, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, opponent); + HP_BAR(player); + MESSAGE("It's super effective!"); + } +} + +SINGLE_BATTLE_TEST("Relic Song is blocked by Throat Chop") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, opponent); + HP_BAR(player); + MESSAGE("The effects of Throat Chop prevent Wobbuffet from using certain moves!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + } +} From 5966852f8daf5268190f71e3621261d8054b4c8c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 16 Jun 2025 18:02:46 -0400 Subject: [PATCH 057/248] Removed Mind Blown effect in favor of move flag (#7138) --- include/constants/battle_move_effects.h | 1 - include/move.h | 8 +++++++- src/battle_ai_main.c | 6 +----- src/battle_ai_util.c | 10 +++------- src/battle_script_commands.c | 1 - src/battle_util.c | 5 +---- src/data/battle_move_effects.h | 6 ------ src/data/moves_info.h | 6 +++++- .../mind_blown.c | 3 ++- 9 files changed, 19 insertions(+), 27 deletions(-) rename test/battle/{move_effect => move_effects_combined}/mind_blown.c (98%) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index f9063c5717..f77a0d9799 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -308,7 +308,6 @@ enum BattleMoveEffects EFFECT_BEAK_BLAST, EFFECT_COURT_CHANGE, EFFECT_MAX_HP_50_RECOIL, - EFFECT_MIND_BLOWN, // Same as EFFECT_MAX_HP_50_RECOIL but is cancelled by Damp EFFECT_CHLOROBLAST, // Same effect as EFFECT_MAX_HP_50_RECOIL but follows the same rules as EFFECT_RECOIL EFFECT_EXTREME_EVOBOOST, EFFECT_HIT_SET_REMOVE_TERRAIN, diff --git a/include/move.h b/include/move.h index 6fb342df63..b8c99257b2 100644 --- a/include/move.h +++ b/include/move.h @@ -131,9 +131,10 @@ struct MoveInfo bool32 parentalBondBanned:1; bool32 skyBattleBanned:1; bool32 sketchBanned:1; + bool32 dampBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:7; + u32 padding:6; // end of word union { @@ -474,6 +475,11 @@ static inline bool32 IsMoveSketchBanned(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].sketchBanned; } +static inline bool32 IsMoveDampBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].dampBanned; +} + static inline bool32 IsValidApprenticeMove(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].validApprenticeMove; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7e3f3bfa6d..92292c1bcb 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2746,17 +2746,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - enum BattleMoveEffects instructedEffect = GetMoveEffect(instructedMove); if (GetBattlerMoveTargetType(battlerDef, instructedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_DEPENDS | MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD) - && instructedEffect != EFFECT_MIND_BLOWN && instructedEffect != EFFECT_MAX_HP_50_RECOIL) + && GetMoveEffect(instructedMove) != EFFECT_MAX_HP_50_RECOIL) ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown - else if (instructedEffect != EFFECT_MIND_BLOWN) - ADJUST_SCORE(-5); //Do something better } } break; @@ -5496,7 +5493,6 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_SWAGGER: case EFFECT_FLATTER: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 091bd6ecf1..01dab74882 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -535,6 +535,9 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return TRUE; } + if (IsMoveDampBanned(ctx->move) && (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP)) + return TRUE; + switch (GetMoveEffect(ctx->move)) { case EFFECT_DREAM_EATER: @@ -570,12 +573,6 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) if (!gDisableStructs[ctx->battlerAtk].isFirstTurn) return TRUE; break; - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: - case EFFECT_MIND_BLOWN: - if (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP) - return TRUE; - break; default: break; } @@ -1007,7 +1004,6 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s switch (GetMoveEffect(move)) { case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a6b76ac213..b00f6801bd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6982,7 +6982,6 @@ static void Cmd_moveend(void) effect = TRUE; break; case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: if (IsBattlerAlive(gBattlerAttacker) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) diff --git a/src/battle_util.c b/src/battle_util.c index 09c021cebb..029d1d4361 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2354,11 +2354,8 @@ static void CancellerPsychicTerrain(u32 *effect) static void CancellerExplodingDamp(u32 *effect) { - enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && (moveEffect == EFFECT_EXPLOSION - || moveEffect == EFFECT_MISTY_EXPLOSION - || moveEffect == EFFECT_MIND_BLOWN)) + if (dampBattler && IsMoveDampBanned(gCurrentMove)) { gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 578444a380..685ea8447d 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1966,12 +1966,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_MIND_BLOWN] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_CHLOROBLAST] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 836b9e5466..532d4eb6bb 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -3221,6 +3221,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -4082,6 +4083,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -17135,7 +17137,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "It explodes the user's head\n" "to damage everything around."), - .effect = EFFECT_MIND_BLOWN, + .effect = EFFECT_MAX_HP_50_RECOIL, .power = 150, .type = TYPE_FIRE, .accuracy = 100, @@ -17144,6 +17146,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -18552,6 +18555,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effects_combined/mind_blown.c similarity index 98% rename from test/battle/move_effect/mind_blown.c rename to test/battle/move_effects_combined/mind_blown.c index 0a34198777..79ce35d126 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effects_combined/mind_blown.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MIND_BLOWN); + ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MAX_HP_50_RECOIL); + ASSUME(IsMoveDampBanned(MOVE_MIND_BLOWN)); } SINGLE_BATTLE_TEST("Mind Blown makes the user lose 1/2 of its Max HP") From a765b8b45d023af3a9fe500cee821a2c6a2dc9eb Mon Sep 17 00:00:00 2001 From: Zatsu <118256341+fakuzatsu@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:29:52 +0100 Subject: [PATCH 058/248] fixes #7129: 'add to full party' feature in the safari zone (#7147) --- src/battle_controller_safari.c | 66 +++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 4a1fc3888c..9311c2f7a1 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -11,6 +11,7 @@ #include "main.h" #include "m4a.h" #include "palette.h" +#include "party_menu.h" #include "pokeball.h" #include "pokeblock.h" #include "pokemon.h" @@ -22,6 +23,7 @@ #include "window.h" #include "line_break.h" #include "constants/battle_anim.h" +#include "constants/party_menu.h" #include "constants/songs.h" #include "constants/trainers.h" #include "constants/rgb.h" @@ -33,6 +35,7 @@ static void SafariHandlePrintString(u32 battler); static void SafariHandlePrintSelectionString(u32 battler); static void SafariHandleChooseAction(u32 battler); static void SafariHandleChooseItem(u32 battler); +static void SafariHandleChoosePokemon(u32 battler); static void SafariHandleStatusIconUpdate(u32 battler); static void SafariHandleFaintingCry(u32 battler); static void SafariHandleIntroTrainerBallThrow(u32 battler); @@ -42,6 +45,7 @@ static void SafariHandleEndLinkBattle(u32 battler); static void SafariBufferRunCommand(u32 battler); static void SafariBufferExecCompleted(u32 battler); static void CompleteWhenChosePokeblock(u32 battler); +static void WaitForMonSelection(u32 battler); static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -67,7 +71,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_YESNOBOX] = BtlController_Empty, [CONTROLLER_CHOOSEMOVE] = BtlController_Empty, [CONTROLLER_OPENBAG] = SafariHandleChooseItem, - [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, + [CONTROLLER_CHOOSEPOKEMON] = SafariHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, [CONTROLLER_HEALTHBARUPDATE] = BtlController_Empty, [CONTROLLER_EXPUPDATE] = BtlController_Empty, @@ -225,6 +229,41 @@ static void CompleteWhenChosePokeblock(u32 battler) } } +static void OpenPartyMenuToChooseMon(u32 battler) +{ + if (!gPaletteFade.active) + { + gBattlerControllerFuncs[battler] = WaitForMonSelection; + u8 caseId = gTasks[gBattleControllerData[battler]].data[0]; + DestroyTask(gBattleControllerData[battler]); + FreeAllWindowBuffers(); + OpenPartyMenuInBattle(caseId); + } +} + +static void WaitForMonSelection(u32 battler) +{ + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) + { + if (gPartyMenuUseExitCallback == TRUE) + BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); + else + BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, PARTY_SIZE, NULL); + + if ((gBattleResources->bufferA[battler][1] & 0xF) == 1) + { + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + BattlePutTextOnWindow(gText_LinkStandby, B_WIN_MSG); + } + } + + SafariBufferExecCompleted(battler); + } +} + static void SafariBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = SafariBufferRunCommand; @@ -305,6 +344,31 @@ static void SafariHandleChooseItem(u32 battler) gBattlerInMenuId = battler; } +static void SafariHandleChoosePokemon(u32 battler) +{ + for (s32 i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) + gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; + + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON + && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) + { + BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); + SafariBufferExecCompleted(battler); + } + else + { + gBattleControllerData[battler] = CreateTask(TaskDummy, 0xFF); + gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1] & 0xF; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][1] >> 4; + *(&gBattleStruct->prevSelectedPartySlot) = gBattleResources->bufferA[battler][2]; + *(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[battler][3] & 0xFF) | (gBattleResources->bufferA[battler][7] << 8); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + gBattlerControllerFuncs[battler] = OpenPartyMenuToChooseMon; + gBattlerInMenuId = battler; + } +} + static void SafariHandleStatusIconUpdate(u32 battler) { UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_SAFARI_BALLS_TEXT); From 06cd3af3ea9af463ba9d6e9ac83e7d282134d432 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Wed, 18 Jun 2025 08:22:41 +0300 Subject: [PATCH 059/248] Volatile status refactoring (#6983) --- asm/macros/battle_script.inc | 8 +-- data/battle_scripts_1.s | 55 +++++++-------- data/battle_scripts_2.s | 3 +- include/battle_util.h | 2 + include/constants/battle.h | 49 +++++++++++++- include/metaprogram.h | 32 ++++++++- include/pokemon.h | 45 +++++++++++-- src/battle_ai_main.c | 3 +- src/battle_debug.c | 125 ++++++++++++++--------------------- src/battle_main.c | 13 +++- src/battle_script_commands.c | 26 ++++---- src/battle_util.c | 37 +++++++++++ 12 files changed, 267 insertions(+), 131 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index df4e00fb19..c899901eae 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -116,10 +116,10 @@ .byte 0x17 .endm - .macro clearstatus2 battler:req, status2:req + .macro clearvolatile battler:req, volatile:req .byte 0x18 .byte \battler - .4byte \status2 + .byte \volatile .endm .macro tryfaintmon battler:req @@ -153,10 +153,10 @@ .4byte \jumpInstr .endm - .macro jumpifstatus2 battler:req, flags:req, jumpInstr:req + .macro jumpifvolatile battler:req, volatile:req, jumpInstr:req .byte 0x1d .byte \battler - .4byte \flags + .byte \volatile .4byte \jumpInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 51ba648943..576f53217e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -152,7 +152,7 @@ BattleScript_EffectShedTail:: attackstring ppreduce waitstate - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed setsubstitute @@ -695,7 +695,7 @@ BattleScript_BeakBlastBurn:: BattleScript_EffectSkyDrop:: attackcanceler - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SkyDropTurn2 + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_SkyDropTurn2 ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring @@ -722,8 +722,8 @@ BattleScript_SkyDropFlyingType: printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG makevisible BS_ATTACKER - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused - jumpifstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused + jumpifvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock goto BattleScript_MoveEnd BattleScript_SkyDropChangedTarget: pause B_WAIT_TIME_SHORT @@ -736,8 +736,8 @@ BattleScript_SkyDropChangedTarget: BattleScript_SkyDropFlyingConfuseLock: seteffectprimary MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: - clearstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd + clearvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_MoveEnd setbyte BS_ATTACKER, BS_TARGET goto BattleScript_ThrashConfuses @@ -926,7 +926,7 @@ BattleScript_EffectNoRetreat:: attackanimation waitanimation call BattleScript_AllStatsUp - jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd + jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_MoveEnd seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER printstring STRINGID_CANTESCAPEDUETOUSEDMOVE waitmessage B_WAIT_TIME_LONG @@ -1352,7 +1352,7 @@ BattleScript_EffectPowder:: accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_POWDER, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_POWDER, BattleScript_ButItFailed setpowder BS_TARGET attackanimation waitanimation @@ -1470,7 +1470,7 @@ BattleScript_EffectGearUpEnd: BattleScript_EffectAcupressure:: attackcanceler jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectAcupressureTry - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_PrintMoveMissed + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_PrintMoveMissed BattleScript_EffectAcupressureTry: attackstring ppreduce @@ -3176,7 +3176,7 @@ BattleScript_StatDownEnd:: BattleScript_MirrorArmorReflect:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect BattleScript_MirrorArmorReflectStatLoss: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectAnim @@ -3402,7 +3402,8 @@ BattleScript_EffectFocusEnergy:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_TARGET attackanimation waitanimation @@ -3416,7 +3417,7 @@ BattleScript_EffectConfuse:: ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsubstituteblocks BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused + jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_AlreadyConfused jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsafeguard BattleScript_SafeguardProtected @@ -3544,7 +3545,7 @@ BattleScript_PowerHerbActivation: return BattleScript_EffectTwoTurnsAttack:: - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn tryfiretwoturnmovewithoutcharging BS_ATTACKER, BattleScript_EffectHit @ e.g. Solar Beam call BattleScript_FirstChargingTurn @@ -3553,7 +3554,7 @@ BattleScript_EffectTwoTurnsAttack:: goto BattleScript_MoveEnd BattleScript_EffectGeomancy:: - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_GeomancySecondTurn + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_GeomancySecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_GeomancySecondTurn call BattleScript_FirstChargingTurn jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd @@ -3561,7 +3562,7 @@ BattleScript_EffectGeomancy:: BattleScript_GeomancySecondTurn: attackcanceler setbyte sB_ANIM_TURN, 1 - clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS orword gHitMarker, HITMARKER_NO_PPDEDUCT attackstring jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim @@ -3632,7 +3633,7 @@ BattleScript_TwoTurnMovesSecondTurn:: BattleScript_TwoTurnMovesSecondTurnRet: setbyte sB_ANIM_TURN, 1 setbyte sB_ANIM_TARGETS_HIT, 0 - clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS clearsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP return @@ -3641,7 +3642,7 @@ BattleScript_EffectSubstitute:: ppreduce attackstring waitstate - jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute + jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString orword gHitMarker, HITMARKER_PASSIVE_DAMAGE @@ -3672,7 +3673,7 @@ BattleScript_EffectRage:: seteffectprimary MOVE_EFFECT_RAGE goto BattleScript_HitFromAtkString BattleScript_RageMiss:: - clearstatus2 BS_ATTACKER, STATUS2_RAGE + clearvolatile BS_ATTACKER, VOLATILE_RAGE goto BattleScript_PrintMoveMissed BattleScript_EffectMimic:: @@ -3939,7 +3940,7 @@ BattleScript_EffectMeanLook:: attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed .if B_GHOSTS_ESCAPE >= GEN_6 jumpiftype BS_TARGET, TYPE_GHOST, BattleScript_ButItFailed @@ -3956,7 +3957,7 @@ BattleScript_EffectNightmare:: attackstring ppreduce jumpifsubstituteblocks BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_NightmareWorked goto BattleScript_ButItFailed @@ -4068,7 +4069,7 @@ BattleScript_EffectForesight:: attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - jumpifstatus2 BS_TARGET, STATUS2_FORESIGHT, BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed setforesight BattleScript_IdentifiedFoe: attackanimation @@ -4119,7 +4120,7 @@ BattleScript_EffectSandstorm:: BattleScript_EffectRollout:: attackcanceler attackstring - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy ppreduce BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE @@ -4545,7 +4546,7 @@ BattleScript_EffectUproar:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit + jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_UproarHit ppreduce BattleScript_UproarHit:: goto BattleScript_HitFromCritCalc @@ -5818,7 +5819,7 @@ BattleScript_BideStoringEnergy:: BattleScript_BideAttack:: attackcanceler - clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE @@ -5841,7 +5842,7 @@ BattleScript_BideAttack:: BattleScript_BideNoEnergyToAttack:: attackcanceler - clearstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS + clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_ButItFailed @@ -7669,7 +7670,7 @@ BattleScript_IntimidateLoop: jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_IntimidateLoopIncrement jumpiftargetally BattleScript_IntimidateLoopIncrement jumpifabsent BS_TARGET, BattleScript_IntimidateLoopIncrement - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateLoopIncrement + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_IntimidateLoopIncrement jumpifintimidateabilityprevented BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker @@ -7740,7 +7741,7 @@ BattleScript_SupersweetSyrupLoop: jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_SupersweetSyrupLoopIncrement jumpiftargetally BattleScript_SupersweetSyrupLoopIncrement jumpifabsent BS_TARGET, BattleScript_SupersweetSyrupLoopIncrement - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_SupersweetSyrupLoopIncrement + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_SupersweetSyrupLoopIncrement BattleScript_SupersweetSyrupEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_EVASION, 1, TRUE diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 27e3706e3f..8cb16379da 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -141,7 +141,8 @@ BattleScript_ItemSetMist:: BattleScript_ItemSetFocusEnergy:: call BattleScript_UseItemMessage - jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_ATTACKER playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY waitanimation diff --git a/include/battle_util.h b/include/battle_util.h index 963f2288e4..24519ce022 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -393,5 +393,7 @@ bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); +u32 GetMonVolatile(u32 battler, enum Volatile volatile); +void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 68a1c25e6f..35bc9b4c58 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -134,8 +134,54 @@ enum BattlerId #define STATUS1_REFRESH (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) +enum VolatileFlags +{ + V_BATON_PASSABLE = (1 << 0), +}; + // Volatile status ailments -// These are removed after exiting the battle or switching out +// These are removed after exiting the battle or switching +/* Definitions with names e.g. "Confusion" are accessible in the debug menu + * Enum, Type, (Field name, (optional)bitSize), Flags, (optional)(Debug menu header, (optional)max. value) + */ +#define VOLATILE_DEFINITIONS(F) \ + F(VOLATILE_CONFUSION, confusionTurns, (u32, 3), V_BATON_PASSABLE) \ + F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ + F(VOLATILE_UPROAR, uproarTurns, (u32, 3)) \ + F(VOLATILE_TORMENT, torment, (u32, 1)) \ + F(VOLATILE_BIDE, bideTurns, (u32, 2)) \ + F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 2)) \ + F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ + F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ + F(VOLATILE_POWDER, powder, (u32, 1)) \ + F(VOLATILE_UNUSED, padding, (u32, 1)) \ + F(VOLATILE_INFATUATION, infatuation, (u32, 4)) \ + F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ + F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ + F(VOLATILE_RECHARGE, recharge, (u32, 1)) \ + F(VOLATILE_RAGE, rage, (u32, 1)) \ + F(VOLATILE_SUBSTITUTE, substitute, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 1)) \ + F(VOLATILE_ESCAPE_PREVENTION, escapePrevention, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_NIGHTMARE, nightmare, (u32, 1)) \ + F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ + F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) + +/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeBitSize and debug parameters as input. */ +#define GET_VOLATILE_MAXIMUM(_typeBitSize, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeBitSize) +#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(MAX_BITS(FIRST(__VA_ARGS__)),) MAX_BITS((sizeof(_type) * 8))) + +#define UNPACK_VOLATILE_ENUMS(_enum, ...) _enum, + +enum Volatile +{ + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_ENUMS) + /* Expands to VOLATILE_CONFUSION, VOLATILE_FLINCHED, etc. */ +}; + +// Old flags #define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) #define STATUS2_CONFUSION_TURN(num) ((num) << 0) #define STATUS2_FLINCHED (1 << 3) @@ -149,6 +195,7 @@ enum BattlerId #define STATUS2_MULTIPLETURNS (1 << 12) #define STATUS2_WRAPPED (1 << 13) #define STATUS2_POWDER (1 << 14) +//#define STATUS2_UNUSED (1 << 15) #define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (1u << (battler + 16)) #define STATUS2_DEFENSE_CURL (1 << 20) diff --git a/include/metaprogram.h b/include/metaprogram.h index be62b2f9e5..e12822946a 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -48,9 +48,26 @@ * Useful for passing arguments which may contain commas into a macro. */ #define UNPACK(...) __VA_ARGS__ +/* Updated version that can extract arguments from brackets as well. + * Examples: + * + * UNPACK_B(a, b) => a, b + * UNPACK_B((a, b)) => a, b + * UNPACK_B((a)) => a + * + * The simple UNPACK is used for extracting non-bracketed arguments. + * */ +#define UNPACK_EXTRA(...) IF_YOU_SEE_ME_SOMETHING_IS_WRONG, __VA_ARGS__ +#define UNPACK_B(a) INVOKE(UNPACK_B_, a, UNPACK_EXTRA a) +#define UNPACK_B_(a, b, ...) __VA_OPT__(UNPACK)a + /* Expands to 'macro(...args, ...)'. */ -#define INVOKE_WITH(macro, args, ...) INVOKE_WITH_(macro, UNPACK args __VA_OPT__(, __VA_ARGS__)) -#define INVOKE_WITH_(macro, ...) macro(__VA_ARGS__) +#define INVOKE_WITH(macro, args, ...) INVOKE(macro, UNPACK args __VA_OPT__(, __VA_ARGS__)) +#define INVOKE(macro, ...) macro(__VA_ARGS__) + +/* Same as INVOKE_WITH but uses UNPACK_B to unpack arguments and only applies macro to args if there are any. */ +#define INVOKE_WITH_B(macro, args, ...) INVOKE_B(macro, UNPACK_B(args) __VA_OPT__(, __VA_ARGS__)) +#define INVOKE_B(macro, ...) __VA_OPT__(macro(__VA_ARGS__)) /* Recursive macros. * Based on https://www.scs.stanford.edu/~dm/blog/va-opt.html @@ -143,4 +160,15 @@ Input must be of the form (upper << lower) where upper can be up to 3, lower up /* Will read a compressed bit stored by COMPRESS_BIT into a single byte */ #define UNCOMPRESS_BITS(compressed) ((compressed >> 5) << (compressed & 0x1F)) +/* Bit maxima */ +#define MAX_u8 0xFF +#define MAX_u16 0xFFFF +#define MAX_u32 0xFFFFFFFF + +/* Finds the maximum value of the given number of bits (up to 32 - obviously)*/ +#define MAX_BITS(_bit) (MAX_u32 >> (32 - _bit)) + +/* Finds the required digits to display the number (maximum 4) */ +#define MAX_DIGITS(_num) 1 + !!(_num / 10) + !!(_num / 100) + !!(_num / 1000) + #endif diff --git a/include/pokemon.h b/include/pokemon.h index 65202eb905..3219eac07f 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -309,6 +309,38 @@ enum { MON_SPR_GFX_MANAGERS_COUNT }; +#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeBitSize, ...) INVOKE(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeBitSize)); +#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:FIRST(__VA_ARGS__),) _fieldName) + +struct Volatiles +{ + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_STRUCT) + // Expands to: + // u32 confusionTurns:3; + // u32 flinched:1; + // u32 uproarTurns:3; + // u32 torment:1; + // u32 bideTurns:2; + // u32 lockConfusionTurns:2; + // u32 multipleTurns:1; + // u32 wrapped:1; + // u32 powder:1; + // u32 padding:1; + // u32 infatuation:4; // one bit for each battler + // u32 defenseCurl:1; + // u32 transformed:1; + // u32 recharge:1; + // u32 rage:1; + // u32 substitute:1; + // u32 destinyBond:1; + // u32 escapePrevention:1; + // u32 nightmare:1; + // u32 cursed:1; + // u32 foresight:1; + // u32 dragonCheer:1; + // u32 focusEnergy:1; +}; + struct BattlePokemon { /*0x00*/ u16 species; @@ -340,10 +372,15 @@ struct BattlePokemon /*0x45*/ u32 experience; /*0x49*/ u32 personality; /*0x4D*/ u32 status1; - /*0x51*/ u32 status2; - /*0x55*/ u32 otId; - /*0x59*/ u8 metLevel; - /*0x5A*/ bool8 isShiny; + /*0x51*/ union { + struct { + u32 status2; // To be expanded to include Status3/4 + }; + struct Volatiles volatiles; + }; + /*0x5D*/ u32 otId; + /*0x61*/ u8 metLevel; + /*0x62*/ bool8 isShiny; }; struct EvolutionParam diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 92292c1bcb..4f1b251092 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1632,7 +1632,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) || IsBattlerIncapacitated(battlerDef, abilityDef) - || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns)) ADJUST_SCORE(-10); if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) ADJUST_SCORE(-10); diff --git a/src/battle_debug.c b/src/battle_debug.c index ffe1b76cea..bf48d0e36b 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -104,7 +104,7 @@ enum LIST_ITEM_STATS, LIST_ITEM_STAT_STAGES, LIST_ITEM_STATUS1, - LIST_ITEM_STATUS2, + LIST_ITEM_VOLATILE, LIST_ITEM_STATUS3, LIST_ITEM_STATUS4, LIST_ITEM_SIDE_STATUS, @@ -139,23 +139,6 @@ enum LIST_STATUS1_FROSTBITE, }; -enum -{ - LIST_STATUS2_CONFUSION, - LIST_STATUS2_FLINCHED, - LIST_STATUS2_TORMENT, - LIST_STATUS2_POWDER, - LIST_STATUS2_DEFENSE_CURL, - LIST_STATUS2_RECHARGE, - LIST_STATUS2_RAGE, - LIST_STATUS2_DESTINY_BOND, - LIST_STATUS2_ESCAPE_PREVENTION, - LIST_STATUS2_CURSED, - LIST_STATUS2_FORESIGHT, - LIST_STATUS2_DRAGON_CHEER, - LIST_STATUS2_FOCUS_ENERGY -}; - enum { LIST_STATUS3_LEECH_SEED_HEALER, @@ -268,6 +251,7 @@ enum VAL_BITFIELD_8, VAL_BITFIELD_16, VAL_BITFIELD_32, + VAL_VOLATILE, VAR_SIDE_STATUS, VAR_SHOW_HP, VAR_SUBSTITUTE, @@ -290,7 +274,7 @@ static const u8 sText_Types[] = _("Types"); static const u8 sText_Stats[] = _("Stats"); static const u8 sText_StatStages[] = _("Stat Stages"); static const u8 sText_Status1[] = _("Status1"); -static const u8 sText_Status2[] = _("Status2"); +static const u8 sText_VolatileStatus[] = _("Volatiles"); static const u8 sText_Status3[] = _("Status3"); static const u8 sText_Status4[] = _("Status4"); static const u8 sText_SideStatus[] = _("Side Status"); @@ -435,23 +419,6 @@ static const struct BitfieldInfo sStatus1Bitfield[] = {/*Frostbite*/ 1, 12}, }; -static const struct BitfieldInfo sStatus2Bitfield[] = -{ - {/*Confusion*/ 3, 0}, - {/*Flinched*/ 1, 3}, - {/*Torment*/ 1, 7}, - {/*Powder*/ 1, 14}, - {/*Defense Curl*/ 1, 20}, - {/*Recharge*/ 1, 22}, - {/*Rage*/ 1, 23}, - {/*Destiny Bond*/ 1, 25}, - {/*Escape Prevention*/ 1, 26}, - {/*Cursed*/ 1, 28}, - {/*Foresight*/ 1, 29}, - {/*Dragon Cheer*/ 1, 30}, - {/*Focus Energy*/ 1, 31}, -}; - static const struct BitfieldInfo sStatus3Bitfield[] = { {/*Leech Seed Battler*/ 2, 0}, @@ -532,7 +499,7 @@ static const struct ListMenuItem sMainListItems[] = {sText_Stats, LIST_ITEM_STATS}, {sText_StatStages, LIST_ITEM_STAT_STAGES}, {sText_Status1, LIST_ITEM_STATUS1}, - {sText_Status2, LIST_ITEM_STATUS2}, + {sText_VolatileStatus, LIST_ITEM_VOLATILE}, {sText_Status3, LIST_ITEM_STATUS3}, {sText_Status4, LIST_ITEM_STATUS4}, {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, @@ -566,21 +533,21 @@ static const struct ListMenuItem sStatus1ListItems[] = {sText_Frostbite, LIST_STATUS1_FROSTBITE}, }; -static const struct ListMenuItem sStatus2ListItems[] = +static const struct ListMenuItem sVolatileStatusListItems[] = { - {sText_Confusion, LIST_STATUS2_CONFUSION}, - {sText_Flinched, LIST_STATUS2_FLINCHED}, - {sText_Torment, LIST_STATUS2_TORMENT}, - {sText_Powder, LIST_STATUS2_POWDER}, - {sText_DefenseCurl, LIST_STATUS2_DEFENSE_CURL}, - {sText_Recharge, LIST_STATUS2_RECHARGE}, - {sText_Rage, LIST_STATUS2_RAGE}, - {sText_DestinyBond, LIST_STATUS2_DESTINY_BOND}, - {sText_EscapePrevention, LIST_STATUS2_ESCAPE_PREVENTION}, - {sText_Cursed, LIST_STATUS2_CURSED}, - {sText_Foresight, LIST_STATUS2_FORESIGHT}, - {sText_DragonCheer, LIST_STATUS2_DRAGON_CHEER}, - {sText_FocusEnergy, LIST_STATUS2_FOCUS_ENERGY}, + {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, + {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, + {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, + {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, + {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, + {COMPOUND_STRING("Recharge"), VOLATILE_RECHARGE}, + {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, + {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, + {COMPOUND_STRING("EscapePrevention"), VOLATILE_ESCAPE_PREVENTION}, + {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, + {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, + {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, + {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, }; static const struct ListMenuItem sStatus3ListItems[] = @@ -805,19 +772,6 @@ static const struct BgTemplate sBgTemplates[] = } }; -static const u8 sBitsToMaxDigit[] = -{ - [0] = 0, - [1] = 1, // max 1 - [2] = 1, // max 3 - [3] = 1, // max 7 - [4] = 2, // max 15 - [5] = 2, // max 31 - [6] = 2, // max 63 - [7] = 3, // max 127 - [8] = 3, // max 255 -}; - static const bool8 sHasChangeableEntries[LIST_ITEM_COUNT] = { [LIST_ITEM_MOVES] = TRUE, @@ -1586,10 +1540,9 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sStatus1ListItems); data->bitfield = sStatus1Bitfield; break; - case LIST_ITEM_STATUS2: - listTemplate.items = sStatus2ListItems; - itemsCount = ARRAY_COUNT(sStatus2ListItems); - data->bitfield = sStatus2Bitfield; + case LIST_ITEM_VOLATILE: + listTemplate.items = sVolatileStatusListItems; + itemsCount = ARRAY_COUNT(sVolatileStatusListItems); break; case LIST_ITEM_STATUS3: listTemplate.items = sStatus3ListItems; @@ -1808,6 +1761,9 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~(GetBitfieldToAndValue(data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount)); *(u32 *)(data->modifyArrows.modifiedValPtr) |= (data->modifyArrows.currValue << data->bitfield[data->currentSecondaryListItemId].currBit); break; + case VAL_VOLATILE: + SetMonVolatile(data->battlerId, data->currentSecondaryListItemId, data->modifyArrows.currValue); + break; case VAR_SIDE_STATUS: *GetSideStatusValue(data, TRUE, data->modifyArrows.currValue != 0) = data->modifyArrows.currValue; break; @@ -1818,12 +1774,12 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) *(u8 *)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; if (*(u8 *)(data->modifyArrows.modifiedValPtr) == 0) { - gBattleMons[data->battlerId].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[data->battlerId].volatiles.substitute = FALSE; gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 0; } else { - gBattleMons[data->battlerId].status2 |= STATUS2_SUBSTITUTE; + gBattleMons[data->battlerId].volatiles.substitute = TRUE; gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 1; } break; @@ -2175,11 +2131,28 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status1, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; - case LIST_ITEM_STATUS2: - data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].status2; - data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status2, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; + case LIST_ITEM_VOLATILE: + data->modifyArrows.currValue = GetMonVolatile(data->battlerId, data->currentSecondaryListItemId); + data->modifyArrows.typeOfVal = VAL_VOLATILE; + data->modifyArrows.minValue = 0; +#define UNPACK_VOLATILE_MAX_SIZE(_enum, _fieldName, _typeBitSize, ...) case _enum: data->modifyArrows.maxValue = min(MAX_u16, GET_VOLATILE_MAXIMUM(_typeBitSize)); break; + switch (data->currentSecondaryListItemId) + { + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_MAX_SIZE) + /* Expands to the following: + * case VOLATILE_CONFUSION: + data->modifyArrows.maxValue = MAX_BITS(3); // Max value 7 + break; + * case VOLATILE_FLINCHED: + data->modifyArrows.maxValue = MAX_BITS(1); // Max value 1 + break; + * ...etc. + */ + default: + data->modifyArrows.maxValue = 0; + } + data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); + break; case LIST_ITEM_STATUS3: data->modifyArrows.modifiedValPtr = &gStatuses3[data->battlerId]; data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); @@ -2198,7 +2171,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) CASE_ITEM_STATUS: data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = (1 << data->bitfield[data->currentSecondaryListItemId].bitsCount) - 1; - data->modifyArrows.maxDigits = sBitsToMaxDigit[data->bitfield[data->currentSecondaryListItemId].bitsCount]; + data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); break; case LIST_ITEM_SIDE_STATUS: data->modifyArrows.minValue = 0; diff --git a/src/battle_main.c b/src/battle_main.c index 8b7ac3386b..ebf1ce36c6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3115,11 +3115,14 @@ static void BattleStartClearSetData(void) } } +#define UNPACK_VOLATILE_BATON_PASSABLES(_enum, _fieldName, _typeBitSize, ...) __VA_OPT__(if ((FIRST(__VA_ARGS__)) & V_BATON_PASSABLE) gBattleMons[battler].volatiles._fieldName = volatilesCopy._fieldName;) + void SwitchInClearSetData(u32 battler) { s32 i; enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); struct DisableStruct disableStructCopy = gDisableStructs[battler]; + struct Volatiles volatilesCopy = gBattleMons[battler].volatiles; ClearIllusionMon(battler); if (effect != EFFECT_BATON_PASS) @@ -3139,7 +3142,15 @@ void SwitchInClearSetData(u32 battler) } if (effect == EFFECT_BATON_PASS) { - gBattleMons[battler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY_ANY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); + // Transfer Baton Passable volatile statuses + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_BATON_PASSABLES) + /* Expands to the following (compiler removes `if` statements): + * gBattleMons[battler].volatiles.confusionTurns = volatilesCopy.confusionTurns; + * gBattleMons[battler].volatiles.substitute = volatilesCopy.substitute; + * gBattleMons[battler].volatiles.escapePrevention = volatilesCopy.escapePrevention; + * ...etc + */ gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b00f6801bd..1cbc0caaa2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -369,12 +369,12 @@ static void Cmd_printselectionstringfromtable(void); static void Cmd_setadditionaleffects(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); -static void Cmd_clearstatus2(void); +static void Cmd_clearvolatile(void); static void Cmd_tryfaintmon(void); static void Cmd_dofaintanimation(void); static void Cmd_cleareffectsonfaint(void); static void Cmd_jumpifstatus(void); -static void Cmd_jumpifstatus2(void); +static void Cmd_jumpifvolatile(void); static void Cmd_jumpifability(void); static void Cmd_jumpifsideaffecting(void); static void Cmd_jumpifstat(void); @@ -628,12 +628,12 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setadditionaleffects, //0x15 Cmd_seteffectprimary, //0x16 Cmd_seteffectsecondary, //0x17 - Cmd_clearstatus2, //0x18 + Cmd_clearvolatile, //0x18 Cmd_tryfaintmon, //0x19 Cmd_dofaintanimation, //0x1A Cmd_cleareffectsonfaint, //0x1B Cmd_jumpifstatus, //0x1C - Cmd_jumpifstatus2, //0x1D + Cmd_jumpifvolatile, //0x1D Cmd_jumpifability, //0x1E Cmd_jumpifsideaffecting, //0x1F Cmd_jumpifstat, //0x20 @@ -1601,7 +1601,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u calc = (calc * 80) / 100; // 1.2 snow cloak loss break; case ABILITY_TANGLED_FEET: - if (gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + if (gBattleMons[battlerDef].volatiles.confusionTurns) calc = (calc * 50) / 100; // 1.5 tangled feet loss break; } @@ -4555,15 +4555,14 @@ static void Cmd_seteffectsecondary(void) SetMoveEffect(FALSE, FALSE); } -static void Cmd_clearstatus2(void) +static void Cmd_clearvolatile(void) { - CMD_ARGS(u8 battler, u32 status2); + CMD_ARGS(u8 battler, u8 _volatile); - u32 status2 = cmd->status2; u32 battler = GetBattlerForBattleScript(cmd->battler); - gBattleMons[battler].status2 &= ~status2; - if (status2 & STATUS2_MULTIPLETURNS) + SetMonVolatile(battler, cmd->_volatile, 0); + if (cmd->_volatile == VOLATILE_MULTIPLETURNS) gProtectStructs[battler].chargingTurn = FALSE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -4724,15 +4723,14 @@ static void Cmd_jumpifstatus(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifstatus2(void) +static void Cmd_jumpifvolatile(void) { - CMD_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); + CMD_ARGS(u8 battler, u8 volatileStatus, const u8 *jumpInstr); u8 battler = GetBattlerForBattleScript(cmd->battler); - u32 flags = cmd->flags; const u8 *jumpInstr = cmd->jumpInstr; - if (gBattleMons[battler].status2 & flags && IsBattlerAlive(battler)) + if (GetMonVolatile(battler, cmd->volatileStatus) && IsBattlerAlive(battler)) gBattlescriptCurrInstr = jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 029d1d4361..8d6504d186 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11326,3 +11326,40 @@ bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) } return FALSE; } + +#define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeBitSize, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; + +// Gets the value of a volatile status flag for a certain battler +// Primarily used for the debug menu and scripts. Outside of it explicit references are preferred +u32 GetMonVolatile(u32 battler, enum Volatile _volatile) +{ + switch (_volatile) + { + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_GETTERS) + /* Expands to: + case VOLATILE_CONFUSION: + return gBattleMons[battler].volatiles.confusionTurns; + */ + default: // Invalid volatile status + return 0; + } +} + +#define UNPACK_VOLATILE_SETTERS(_enum, _fieldName, _typeBitSize, ...) case _enum: gBattleMons[battler].volatiles._fieldName = min(GET_VOLATILE_MAXIMUM(_typeBitSize), newValue); break; + +// Sets the value of a volatile status flag for a certain battler +// Primarily used for the debug menu and scripts. Outside of it explicit references are preferred +void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue) +{ + switch (_volatile) + { + VOLATILE_DEFINITIONS(UNPACK_VOLATILE_SETTERS) + /* Expands to: + case VOLATILE_CONFUSION: + gBattleMons[battler].volatiles.confusionTurns = min(MAX_BITS(3), newValue); + break; + */ + default: // Invalid volatile status + return; + } +} From 97137aed2d5923aa41b6ca1696fc9df1269f9769 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:58:37 +0200 Subject: [PATCH 060/248] Improve music/se macros and fix names (#7030) --- src/debug.c | 1035 ++++++++++++++++++++++++--------------------------- 1 file changed, 496 insertions(+), 539 deletions(-) diff --git a/src/debug.c b/src/debug.c index 0b018b275f..bdef2b6d98 100644 --- a/src/debug.c +++ b/src/debug.c @@ -4061,8 +4061,8 @@ static void DebugAction_PCBag_ClearBoxes(u8 taskId) // ******************************* // Actions Sound -static const u8 *const sBGMNames[]; -static const u8 *const sSENames[]; +static const u8 *const sBGMNames[END_MUS - START_MUS + 1]; +static const u8 *const sSENames[END_SE + 1]; #define tCurrentSong data[5] @@ -4100,10 +4100,14 @@ static void DebugAction_Sound_SE_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { + const u8 *seName; Debug_HandleInput_Numeric(taskId, 1, END_SE, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sSENames[gTasks[taskId].tInput - 1], CHAR_SPACE, 35); + seName = sSENames[gTasks[taskId].tInput - 1]; + if (seName == NULL) + seName = sDebugText_Dashes; + StringCopyPadded(gStringVar1, seName, CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_SFX_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -4161,10 +4165,14 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { + const u8 *bgmName; Debug_HandleInput_Numeric(taskId, START_MUS, END_MUS, DEBUG_NUMBER_DIGITS_ITEMS); StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - StringCopyPadded(gStringVar1, sBGMNames[gTasks[taskId].tInput - START_MUS], CHAR_SPACE, 35); + bgmName = sBGMNames[gTasks[taskId].tInput - START_MUS]; + if (bgmName == NULL) + bgmName = sDebugText_Dashes; + StringCopyPadded(gStringVar1, bgmName, CHAR_SPACE, 35); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); StringExpandPlaceholders(gStringVar4, sDebugText_Sound_Music_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -4196,546 +4204,495 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) #undef tInput #undef tDigit -#define SOUND_LIST_BGM \ - X(MUS_LITTLEROOT_TEST) \ - X(MUS_GSC_ROUTE38) \ - X(MUS_CAUGHT) \ - X(MUS_VICTORY_WILD) \ - X(MUS_VICTORY_GYM_LEADER) \ - X(MUS_VICTORY_LEAGUE) \ - X(MUS_C_COMM_CENTER) \ - X(MUS_GSC_PEWTER) \ - X(MUS_C_VS_LEGEND_BEAST) \ - X(MUS_ROUTE101) \ - X(MUS_ROUTE110) \ - X(MUS_ROUTE120) \ - X(MUS_PETALBURG) \ - X(MUS_OLDALE) \ - X(MUS_GYM) \ - X(MUS_SURF) \ - X(MUS_PETALBURG_WOODS) \ - X(MUS_LEVEL_UP) \ - X(MUS_HEAL) \ - X(MUS_OBTAIN_BADGE) \ - X(MUS_OBTAIN_ITEM) \ - X(MUS_EVOLVED) \ - X(MUS_OBTAIN_TMHM) \ - X(MUS_LILYCOVE_MUSEUM) \ - X(MUS_ROUTE122) \ - X(MUS_OCEANIC_MUSEUM) \ - X(MUS_EVOLUTION_INTRO) \ - X(MUS_EVOLUTION) \ - X(MUS_MOVE_DELETED) \ - X(MUS_ENCOUNTER_GIRL) \ - X(MUS_ENCOUNTER_MALE) \ - X(MUS_ABANDONED_SHIP) \ - X(MUS_FORTREE) \ - X(MUS_BIRCH_LAB) \ - X(MUS_B_TOWER_RS) \ - X(MUS_ENCOUNTER_SWIMMER) \ - X(MUS_CAVE_OF_ORIGIN) \ - X(MUS_OBTAIN_BERRY) \ - X(MUS_AWAKEN_LEGEND) \ - X(MUS_SLOTS_JACKPOT) \ - X(MUS_SLOTS_WIN) \ - X(MUS_TOO_BAD) \ - X(MUS_ROULETTE) \ - X(MUS_LINK_CONTEST_P1) \ - X(MUS_LINK_CONTEST_P2) \ - X(MUS_LINK_CONTEST_P3) \ - X(MUS_LINK_CONTEST_P4) \ - X(MUS_ENCOUNTER_RICH) \ - X(MUS_VERDANTURF) \ - X(MUS_RUSTBORO) \ - X(MUS_POKE_CENTER) \ - X(MUS_ROUTE104) \ - X(MUS_ROUTE119) \ - X(MUS_CYCLING) \ - X(MUS_POKE_MART) \ - X(MUS_LITTLEROOT) \ - X(MUS_MT_CHIMNEY) \ - X(MUS_ENCOUNTER_FEMALE) \ - X(MUS_LILYCOVE) \ - X(MUS_ROUTE111) \ - X(MUS_HELP) \ - X(MUS_UNDERWATER) \ - X(MUS_VICTORY_TRAINER) \ - X(MUS_TITLE) \ - X(MUS_INTRO) \ - X(MUS_ENCOUNTER_MAY) \ - X(MUS_ENCOUNTER_INTENSE) \ - X(MUS_ENCOUNTER_COOL) \ - X(MUS_ROUTE113) \ - X(MUS_ENCOUNTER_AQUA) \ - X(MUS_FOLLOW_ME) \ - X(MUS_ENCOUNTER_BRENDAN) \ - X(MUS_EVER_GRANDE) \ - X(MUS_ENCOUNTER_SUSPICIOUS) \ - X(MUS_VICTORY_AQUA_MAGMA) \ - X(MUS_CABLE_CAR) \ - X(MUS_GAME_CORNER) \ - X(MUS_DEWFORD) \ - X(MUS_SAFARI_ZONE) \ - X(MUS_VICTORY_ROAD) \ - X(MUS_AQUA_MAGMA_HIDEOUT) \ - X(MUS_SAILING) \ - X(MUS_MT_PYRE) \ - X(MUS_SLATEPORT) \ - X(MUS_MT_PYRE_EXTERIOR) \ - X(MUS_SCHOOL) \ - X(MUS_HALL_OF_FAME) \ - X(MUS_FALLARBOR) \ - X(MUS_SEALED_CHAMBER) \ - X(MUS_CONTEST_WINNER) \ - X(MUS_CONTEST) \ - X(MUS_ENCOUNTER_MAGMA) \ - X(MUS_INTRO_BATTLE) \ - X(MUS_WEATHER_KYOGRE) \ - X(MUS_WEATHER_GROUDON) \ - X(MUS_SOOTOPOLIS) \ - X(MUS_CONTEST_RESULTS) \ - X(MUS_HALL_OF_FAME_ROOM) \ - X(MUS_TRICK_HOUSE) \ - X(MUS_ENCOUNTER_TWINS) \ - X(MUS_ENCOUNTER_ELITE_FOUR) \ - X(MUS_ENCOUNTER_HIKER) \ - X(MUS_CONTEST_LOBBY) \ - X(MUS_ENCOUNTER_INTERVIEWER) \ - X(MUS_ENCOUNTER_CHAMPION) \ - X(MUS_CREDITS) \ - X(MUS_END) \ - X(MUS_B_FRONTIER) \ - X(MUS_B_ARENA) \ - X(MUS_OBTAIN_B_POINTS) \ - X(MUS_REGISTER_MATCH_CALL) \ - X(MUS_B_PYRAMID) \ - X(MUS_B_PYRAMID_TOP) \ - X(MUS_B_PALACE) \ - X(MUS_RAYQUAZA_APPEARS) \ - X(MUS_B_TOWER) \ - X(MUS_OBTAIN_SYMBOL) \ - X(MUS_B_DOME) \ - X(MUS_B_PIKE) \ - X(MUS_B_FACTORY) \ - X(MUS_VS_RAYQUAZA) \ - X(MUS_VS_FRONTIER_BRAIN) \ - X(MUS_VS_MEW) \ - X(MUS_B_DOME_LOBBY) \ - X(MUS_VS_WILD) \ - X(MUS_VS_AQUA_MAGMA) \ - X(MUS_VS_TRAINER) \ - X(MUS_VS_GYM_LEADER) \ - X(MUS_VS_CHAMPION) \ - X(MUS_VS_REGI) \ - X(MUS_VS_KYOGRE_GROUDON) \ - X(MUS_VS_RIVAL) \ - X(MUS_VS_ELITE_FOUR) \ - X(MUS_VS_AQUA_MAGMA_LEADER) \ - X(MUS_RG_FOLLOW_ME) \ - X(MUS_RG_GAME_CORNER) \ - X(MUS_RG_ROCKET_HIDEOUT) \ - X(MUS_RG_GYM) \ - X(MUS_RG_JIGGLYPUFF) \ - X(MUS_RG_INTRO_FIGHT) \ - X(MUS_RG_TITLE) \ - X(MUS_RG_CINNABAR) \ - X(MUS_RG_LAVENDER) \ - X(MUS_RG_HEAL) \ - X(MUS_RG_CYCLING) \ - X(MUS_RG_ENCOUNTER_ROCKET) \ - X(MUS_RG_ENCOUNTER_GIRL) \ - X(MUS_RG_ENCOUNTER_BOY) \ - X(MUS_RG_HALL_OF_FAME) \ - X(MUS_RG_VIRIDIAN_FOREST) \ - X(MUS_RG_MT_MOON) \ - X(MUS_RG_POKE_MANSION) \ - X(MUS_RG_CREDITS) \ - X(MUS_RG_ROUTE1) \ - X(MUS_RG_ROUTE24) \ - X(MUS_RG_ROUTE3) \ - X(MUS_RG_ROUTE11) \ - X(MUS_RG_VICTORY_ROAD) \ - X(MUS_RG_VS_GYM_LEADER) \ - X(MUS_RG_VS_TRAINER) \ - X(MUS_RG_VS_WILD) \ - X(MUS_RG_VS_CHAMPION) \ - X(MUS_RG_PALLET) \ - X(MUS_RG_OAK_LAB) \ - X(MUS_RG_OAK) \ - X(MUS_RG_POKE_CENTER) \ - X(MUS_RG_SS_ANNE) \ - X(MUS_RG_SURF) \ - X(MUS_RG_POKE_TOWER) \ - X(MUS_RG_SILPH) \ - X(MUS_RG_FUCHSIA) \ - X(MUS_RG_CELADON) \ - X(MUS_RG_VICTORY_TRAINER) \ - X(MUS_RG_VICTORY_WILD) \ - X(MUS_RG_VICTORY_GYM_LEADER) \ - X(MUS_RG_VERMILLION) \ - X(MUS_RG_PEWTER) \ - X(MUS_RG_ENCOUNTER_RIVAL) \ - X(MUS_RG_RIVAL_EXIT) \ - X(MUS_RG_DEX_RATING) \ - X(MUS_RG_OBTAIN_KEY_ITEM) \ - X(MUS_RG_CAUGHT_INTRO) \ - X(MUS_RG_PHOTO) \ - X(MUS_RG_GAME_FREAK) \ - X(MUS_RG_CAUGHT) \ - X(MUS_RG_NEW_GAME_INSTRUCT) \ - X(MUS_RG_NEW_GAME_INTRO) \ - X(MUS_RG_NEW_GAME_EXIT) \ - X(MUS_RG_POKE_JUMP) \ - X(MUS_RG_UNION_ROOM) \ - X(MUS_RG_NET_CENTER) \ - X(MUS_RG_MYSTERY_GIFT) \ - X(MUS_RG_BERRY_PICK) \ - X(MUS_RG_SEVII_CAVE) \ - X(MUS_RG_TEACHY_TV_SHOW) \ - X(MUS_RG_SEVII_ROUTE) \ - X(MUS_RG_SEVII_DUNGEON) \ - X(MUS_RG_SEVII_123) \ - X(MUS_RG_SEVII_45) \ - X(MUS_RG_SEVII_67) \ - X(MUS_RG_POKE_FLUTE) \ - X(MUS_RG_VS_DEOXYS) \ - X(MUS_RG_VS_MEWTWO) \ - X(MUS_RG_VS_LEGEND) \ - X(MUS_RG_ENCOUNTER_GYM_LEADER) \ - X(MUS_RG_ENCOUNTER_DEOXYS) \ - X(MUS_RG_TRAINER_TOWER) \ - X(MUS_RG_SLOW_PALLET) \ - X(MUS_RG_TEACHY_TV_MENU) \ - X(PH_TRAP_BLEND) \ - X(PH_TRAP_HELD) \ - X(PH_TRAP_SOLO) \ - X(PH_FACE_BLEND) \ - X(PH_FACE_HELD) \ - X(PH_FACE_SOLO) \ - X(PH_CLOTH_BLEND) \ - X(PH_CLOTH_HELD) \ - X(PH_CLOTH_SOLO) \ - X(PH_DRESS_BLEND) \ - X(PH_DRESS_HELD) \ - X(PH_DRESS_SOLO) \ - X(PH_FLEECE_BLEND) \ - X(PH_FLEECE_HELD) \ - X(PH_FLEECE_SOLO) \ - X(PH_KIT_BLEND) \ - X(PH_KIT_HELD) \ - X(PH_KIT_SOLO) \ - X(PH_PRICE_BLEND) \ - X(PH_PRICE_HELD) \ - X(PH_PRICE_SOLO) \ - X(PH_LOT_BLEND) \ - X(PH_LOT_HELD) \ - X(PH_LOT_SOLO) \ - X(PH_GOAT_BLEND) \ - X(PH_GOAT_HELD) \ - X(PH_GOAT_SOLO) \ - X(PH_THOUGHT_BLEND) \ - X(PH_THOUGHT_HELD) \ - X(PH_THOUGHT_SOLO) \ - X(PH_CHOICE_BLEND) \ - X(PH_CHOICE_HELD) \ - X(PH_CHOICE_SOLO) \ - X(PH_MOUTH_BLEND) \ - X(PH_MOUTH_HELD) \ - X(PH_MOUTH_SOLO) \ - X(PH_FOOT_BLEND) \ - X(PH_FOOT_HELD) \ - X(PH_FOOT_SOLO) \ - X(PH_GOOSE_BLEND) \ - X(PH_GOOSE_HELD) \ - X(PH_GOOSE_SOLO) \ - X(PH_STRUT_BLEND) \ - X(PH_STRUT_HELD) \ - X(PH_STRUT_SOLO) \ - X(PH_CURE_BLEND) \ - X(PH_CURE_HELD) \ - X(PH_CURE_SOLO) \ - X(PH_NURSE_BLEND) \ - X(PH_NURSE_HELD) \ - X(PH_NURSE_SOLO) \ +#define SOUND_LIST_BGM \ + X(MUS_LITTLEROOT_TEST) \ + X(MUS_GSC_ROUTE38) \ + X(MUS_CAUGHT) \ + X(MUS_VICTORY_WILD) \ + X(MUS_VICTORY_GYM_LEADER) \ + X(MUS_VICTORY_LEAGUE) \ + X(MUS_C_COMM_CENTER) \ + X(MUS_GSC_PEWTER) \ + X(MUS_C_VS_LEGEND_BEAST) \ + X(MUS_ROUTE101) \ + X(MUS_ROUTE110) \ + X(MUS_ROUTE120) \ + X(MUS_PETALBURG) \ + X(MUS_OLDALE) \ + X(MUS_GYM) \ + X(MUS_SURF) \ + X(MUS_PETALBURG_WOODS) \ + X(MUS_LEVEL_UP) \ + X(MUS_HEAL) \ + X(MUS_OBTAIN_BADGE) \ + X(MUS_OBTAIN_ITEM) \ + X(MUS_EVOLVED) \ + X(MUS_OBTAIN_TMHM) \ + X(MUS_LILYCOVE_MUSEUM) \ + X(MUS_ROUTE122) \ + X(MUS_OCEANIC_MUSEUM) \ + X(MUS_EVOLUTION_INTRO) \ + X(MUS_EVOLUTION) \ + X(MUS_MOVE_DELETED) \ + X(MUS_ENCOUNTER_GIRL) \ + X(MUS_ENCOUNTER_MALE) \ + X(MUS_ABANDONED_SHIP) \ + X(MUS_FORTREE) \ + X(MUS_BIRCH_LAB) \ + X(MUS_B_TOWER_RS) \ + X(MUS_ENCOUNTER_SWIMMER) \ + X(MUS_CAVE_OF_ORIGIN) \ + X(MUS_OBTAIN_BERRY) \ + X(MUS_AWAKEN_LEGEND) \ + X(MUS_SLOTS_JACKPOT) \ + X(MUS_SLOTS_WIN) \ + X(MUS_TOO_BAD) \ + X(MUS_ROULETTE) \ + X(MUS_LINK_CONTEST_P1) \ + X(MUS_LINK_CONTEST_P2) \ + X(MUS_LINK_CONTEST_P3) \ + X(MUS_LINK_CONTEST_P4) \ + X(MUS_ENCOUNTER_RICH) \ + X(MUS_VERDANTURF) \ + X(MUS_RUSTBORO) \ + X(MUS_POKE_CENTER) \ + X(MUS_ROUTE104) \ + X(MUS_ROUTE119) \ + X(MUS_CYCLING) \ + X(MUS_POKE_MART) \ + X(MUS_LITTLEROOT) \ + X(MUS_MT_CHIMNEY) \ + X(MUS_ENCOUNTER_FEMALE) \ + X(MUS_LILYCOVE) \ + X(MUS_DESERT) \ + X(MUS_HELP) \ + X(MUS_UNDERWATER) \ + X(MUS_VICTORY_TRAINER) \ + X(MUS_TITLE) \ + X(MUS_INTRO) \ + X(MUS_ENCOUNTER_MAY) \ + X(MUS_ENCOUNTER_INTENSE) \ + X(MUS_ENCOUNTER_COOL) \ + X(MUS_ROUTE113) \ + X(MUS_ENCOUNTER_AQUA) \ + X(MUS_FOLLOW_ME) \ + X(MUS_ENCOUNTER_BRENDAN) \ + X(MUS_EVER_GRANDE) \ + X(MUS_ENCOUNTER_SUSPICIOUS) \ + X(MUS_VICTORY_AQUA_MAGMA) \ + X(MUS_CABLE_CAR) \ + X(MUS_GAME_CORNER) \ + X(MUS_DEWFORD) \ + X(MUS_SAFARI_ZONE) \ + X(MUS_VICTORY_ROAD) \ + X(MUS_AQUA_MAGMA_HIDEOUT) \ + X(MUS_SAILING) \ + X(MUS_MT_PYRE) \ + X(MUS_SLATEPORT) \ + X(MUS_MT_PYRE_EXTERIOR) \ + X(MUS_SCHOOL) \ + X(MUS_HALL_OF_FAME) \ + X(MUS_FALLARBOR) \ + X(MUS_SEALED_CHAMBER) \ + X(MUS_CONTEST_WINNER) \ + X(MUS_CONTEST) \ + X(MUS_ENCOUNTER_MAGMA) \ + X(MUS_INTRO_BATTLE) \ + X(MUS_ABNORMAL_WEATHER) \ + X(MUS_WEATHER_GROUDON) \ + X(MUS_SOOTOPOLIS) \ + X(MUS_CONTEST_RESULTS) \ + X(MUS_HALL_OF_FAME_ROOM) \ + X(MUS_TRICK_HOUSE) \ + X(MUS_ENCOUNTER_TWINS) \ + X(MUS_ENCOUNTER_ELITE_FOUR) \ + X(MUS_ENCOUNTER_HIKER) \ + X(MUS_CONTEST_LOBBY) \ + X(MUS_ENCOUNTER_INTERVIEWER) \ + X(MUS_ENCOUNTER_CHAMPION) \ + X(MUS_CREDITS) \ + X(MUS_END) \ + X(MUS_B_FRONTIER) \ + X(MUS_B_ARENA) \ + X(MUS_OBTAIN_B_POINTS) \ + X(MUS_REGISTER_MATCH_CALL) \ + X(MUS_B_PYRAMID) \ + X(MUS_B_PYRAMID_TOP) \ + X(MUS_B_PALACE) \ + X(MUS_RAYQUAZA_APPEARS) \ + X(MUS_B_TOWER) \ + X(MUS_OBTAIN_SYMBOL) \ + X(MUS_B_DOME) \ + X(MUS_B_PIKE) \ + X(MUS_B_FACTORY) \ + X(MUS_VS_RAYQUAZA) \ + X(MUS_VS_FRONTIER_BRAIN) \ + X(MUS_VS_MEW) \ + X(MUS_B_DOME_LOBBY) \ + X(MUS_VS_WILD) \ + X(MUS_VS_AQUA_MAGMA) \ + X(MUS_VS_TRAINER) \ + X(MUS_VS_GYM_LEADER) \ + X(MUS_VS_CHAMPION) \ + X(MUS_VS_REGI) \ + X(MUS_VS_KYOGRE_GROUDON) \ + X(MUS_VS_RIVAL) \ + X(MUS_VS_ELITE_FOUR) \ + X(MUS_VS_AQUA_MAGMA_LEADER) \ + X(MUS_RG_FOLLOW_ME) \ + X(MUS_RG_GAME_CORNER) \ + X(MUS_RG_ROCKET_HIDEOUT) \ + X(MUS_RG_GYM) \ + X(MUS_RG_JIGGLYPUFF) \ + X(MUS_RG_INTRO_FIGHT) \ + X(MUS_RG_TITLE) \ + X(MUS_RG_CINNABAR) \ + X(MUS_RG_LAVENDER) \ + X(MUS_RG_HEAL) \ + X(MUS_RG_CYCLING) \ + X(MUS_RG_ENCOUNTER_ROCKET) \ + X(MUS_RG_ENCOUNTER_GIRL) \ + X(MUS_RG_ENCOUNTER_BOY) \ + X(MUS_RG_HALL_OF_FAME) \ + X(MUS_RG_VIRIDIAN_FOREST) \ + X(MUS_RG_MT_MOON) \ + X(MUS_RG_POKE_MANSION) \ + X(MUS_RG_CREDITS) \ + X(MUS_RG_ROUTE1) \ + X(MUS_RG_ROUTE24) \ + X(MUS_RG_ROUTE3) \ + X(MUS_RG_ROUTE11) \ + X(MUS_RG_VICTORY_ROAD) \ + X(MUS_RG_VS_GYM_LEADER) \ + X(MUS_RG_VS_TRAINER) \ + X(MUS_RG_VS_WILD) \ + X(MUS_RG_VS_CHAMPION) \ + X(MUS_RG_PALLET) \ + X(MUS_RG_OAK_LAB) \ + X(MUS_RG_OAK) \ + X(MUS_RG_POKE_CENTER) \ + X(MUS_RG_SS_ANNE) \ + X(MUS_RG_SURF) \ + X(MUS_RG_POKE_TOWER) \ + X(MUS_RG_SILPH) \ + X(MUS_RG_FUCHSIA) \ + X(MUS_RG_CELADON) \ + X(MUS_RG_VICTORY_TRAINER) \ + X(MUS_RG_VICTORY_WILD) \ + X(MUS_RG_VICTORY_GYM_LEADER) \ + X(MUS_RG_VERMILLION) \ + X(MUS_RG_PEWTER) \ + X(MUS_RG_ENCOUNTER_RIVAL) \ + X(MUS_RG_RIVAL_EXIT) \ + X(MUS_RG_DEX_RATING) \ + X(MUS_RG_OBTAIN_KEY_ITEM) \ + X(MUS_RG_CAUGHT_INTRO) \ + X(MUS_RG_PHOTO) \ + X(MUS_RG_GAME_FREAK) \ + X(MUS_RG_CAUGHT) \ + X(MUS_RG_NEW_GAME_INSTRUCT) \ + X(MUS_RG_NEW_GAME_INTRO) \ + X(MUS_RG_NEW_GAME_EXIT) \ + X(MUS_RG_POKE_JUMP) \ + X(MUS_RG_UNION_ROOM) \ + X(MUS_RG_NET_CENTER) \ + X(MUS_RG_MYSTERY_GIFT) \ + X(MUS_RG_BERRY_PICK) \ + X(MUS_RG_SEVII_CAVE) \ + X(MUS_RG_TEACHY_TV_SHOW) \ + X(MUS_RG_SEVII_ROUTE) \ + X(MUS_RG_SEVII_DUNGEON) \ + X(MUS_RG_SEVII_123) \ + X(MUS_RG_SEVII_45) \ + X(MUS_RG_SEVII_67) \ + X(MUS_RG_POKE_FLUTE) \ + X(MUS_RG_VS_DEOXYS) \ + X(MUS_RG_VS_MEWTWO) \ + X(MUS_RG_VS_LEGEND) \ + X(MUS_RG_ENCOUNTER_GYM_LEADER) \ + X(MUS_RG_ENCOUNTER_DEOXYS) \ + X(MUS_RG_TRAINER_TOWER) \ + X(MUS_RG_SLOW_PALLET) \ + X(MUS_RG_TEACHY_TV_MENU) -#define SOUND_LIST_SE \ - X(SE_USE_ITEM) \ - X(SE_PC_LOGIN) \ - X(SE_PC_OFF) \ - X(SE_PC_ON) \ - X(SE_SELECT) \ - X(SE_WIN_OPEN) \ - X(SE_WALL_HIT) \ - X(SE_DOOR) \ - X(SE_EXIT) \ - X(SE_LEDGE) \ - X(SE_BIKE_BELL) \ - X(SE_NOT_EFFECTIVE) \ - X(SE_EFFECTIVE) \ - X(SE_SUPER_EFFECTIVE) \ - X(SE_BALL_OPEN) \ - X(SE_FAINT) \ - X(SE_FLEE) \ - X(SE_SLIDING_DOOR) \ - X(SE_SHIP) \ - X(SE_BANG) \ - X(SE_PIN) \ - X(SE_BOO) \ - X(SE_BALL) \ - X(SE_CONTEST_PLACE) \ - X(SE_A) \ - X(SE_I) \ - X(SE_U) \ - X(SE_E) \ - X(SE_O) \ - X(SE_N) \ - X(SE_SUCCESS) \ - X(SE_FAILURE) \ - X(SE_EXP) \ - X(SE_BIKE_HOP) \ - X(SE_SWITCH) \ - X(SE_CLICK) \ - X(SE_FU_ZAKU) \ - X(SE_CONTEST_CONDITION_LOSE) \ - X(SE_LAVARIDGE_FALL_WARP) \ - X(SE_ICE_STAIRS) \ - X(SE_ICE_BREAK) \ - X(SE_ICE_CRACK) \ - X(SE_FALL) \ - X(SE_UNLOCK) \ - X(SE_WARP_IN) \ - X(SE_WARP_OUT) \ - X(SE_REPEL) \ - X(SE_ROTATING_GATE) \ - X(SE_TRUCK_MOVE) \ - X(SE_TRUCK_STOP) \ - X(SE_TRUCK_UNLOAD) \ - X(SE_TRUCK_DOOR) \ - X(SE_BERRY_BLENDER) \ - X(SE_CARD) \ - X(SE_SAVE) \ - X(SE_BALL_BOUNCE_1) \ - X(SE_BALL_BOUNCE_2) \ - X(SE_BALL_BOUNCE_3) \ - X(SE_BALL_BOUNCE_4) \ - X(SE_BALL_TRADE) \ - X(SE_BALL_THROW) \ - X(SE_NOTE_C) \ - X(SE_NOTE_D) \ - X(SE_NOTE_E) \ - X(SE_NOTE_F) \ - X(SE_NOTE_G) \ - X(SE_NOTE_A) \ - X(SE_NOTE_B) \ - X(SE_NOTE_C_HIGH) \ - X(SE_PUDDLE) \ - X(SE_BRIDGE_WALK) \ - X(SE_ITEMFINDER) \ - X(SE_DING_DONG) \ - X(SE_BALLOON_RED) \ - X(SE_BALLOON_BLUE) \ - X(SE_BALLOON_YELLOW) \ - X(SE_BREAKABLE_DOOR) \ - X(SE_MUD_BALL) \ - X(SE_FIELD_POISON) \ - X(SE_ESCALATOR) \ - X(SE_THUNDERSTORM) \ - X(SE_THUNDERSTORM_STOP) \ - X(SE_DOWNPOUR) \ - X(SE_DOWNPOUR_STOP) \ - X(SE_RAIN) \ - X(SE_RAIN_STOP) \ - X(SE_THUNDER) \ - X(SE_THUNDER2) \ - X(SE_ELEVATOR) \ - X(SE_LOW_HEALTH) \ - X(SE_EXP_MAX) \ - X(SE_ROULETTE_BALL) \ - X(SE_ROULETTE_BALL2) \ - X(SE_TAILLOW_WING_FLAP) \ - X(SE_SHOP) \ - X(SE_CONTEST_HEART) \ - X(SE_CONTEST_CURTAIN_RISE) \ - X(SE_CONTEST_CURTAIN_FALL) \ - X(SE_CONTEST_ICON_CHANGE) \ - X(SE_CONTEST_ICON_CLEAR) \ - X(SE_CONTEST_MONS_TURN) \ - X(SE_SHINY) \ - X(SE_INTRO_BLAST) \ - X(SE_MUGSHOT) \ - X(SE_APPLAUSE) \ - X(SE_VEND) \ - X(SE_ORB) \ - X(SE_DEX_SCROLL) \ - X(SE_DEX_PAGE) \ - X(SE_POKENAV_ON) \ - X(SE_POKENAV_OFF) \ - X(SE_DEX_SEARCH) \ - X(SE_EGG_HATCH) \ - X(SE_BALL_TRAY_ENTER) \ - X(SE_BALL_TRAY_BALL) \ - X(SE_BALL_TRAY_EXIT) \ - X(SE_GLASS_FLUTE) \ - X(SE_M_THUNDERBOLT) \ - X(SE_M_THUNDERBOLT2) \ - X(SE_M_HARDEN) \ - X(SE_M_NIGHTMARE) \ - X(SE_M_VITAL_THROW) \ - X(SE_M_VITAL_THROW2) \ - X(SE_M_BUBBLE) \ - X(SE_M_BUBBLE2) \ - X(SE_M_BUBBLE3) \ - X(SE_M_RAIN_DANCE) \ - X(SE_M_CUT) \ - X(SE_M_STRING_SHOT) \ - X(SE_M_STRING_SHOT2) \ - X(SE_M_ROCK_THROW) \ - X(SE_M_GUST) \ - X(SE_M_GUST2) \ - X(SE_M_DOUBLE_SLAP) \ - X(SE_M_DOUBLE_TEAM) \ - X(SE_M_RAZOR_WIND) \ - X(SE_M_ICY_WIND) \ - X(SE_M_THUNDER_WAVE) \ - X(SE_M_COMET_PUNCH) \ - X(SE_M_MEGA_KICK) \ - X(SE_M_MEGA_KICK2) \ - X(SE_M_CRABHAMMER) \ - X(SE_M_JUMP_KICK) \ - X(SE_M_FLAME_WHEEL) \ - X(SE_M_FLAME_WHEEL2) \ - X(SE_M_FLAMETHROWER) \ - X(SE_M_FIRE_PUNCH) \ - X(SE_M_TOXIC) \ - X(SE_M_SACRED_FIRE) \ - X(SE_M_SACRED_FIRE2) \ - X(SE_M_EMBER) \ - X(SE_M_TAKE_DOWN) \ - X(SE_M_BLIZZARD) \ - X(SE_M_BLIZZARD2) \ - X(SE_M_SCRATCH) \ - X(SE_M_VICEGRIP) \ - X(SE_M_WING_ATTACK) \ - X(SE_M_FLY) \ - X(SE_M_SAND_ATTACK) \ - X(SE_M_RAZOR_WIND2) \ - X(SE_M_BITE) \ - X(SE_M_HEADBUTT) \ - X(SE_M_SURF) \ - X(SE_M_HYDRO_PUMP) \ - X(SE_M_WHIRLPOOL) \ - X(SE_M_HORN_ATTACK) \ - X(SE_M_TAIL_WHIP) \ - X(SE_M_MIST) \ - X(SE_M_POISON_POWDER) \ - X(SE_M_BIND) \ - X(SE_M_DRAGON_RAGE) \ - X(SE_M_SING) \ - X(SE_M_PERISH_SONG) \ - X(SE_M_PAY_DAY) \ - X(SE_M_DIG) \ - X(SE_M_DIZZY_PUNCH) \ - X(SE_M_SELF_DESTRUCT) \ - X(SE_M_EXPLOSION) \ - X(SE_M_ABSORB_2) \ - X(SE_M_ABSORB) \ - X(SE_M_SCREECH) \ - X(SE_M_BUBBLE_BEAM) \ - X(SE_M_BUBBLE_BEAM2) \ - X(SE_M_SUPERSONIC) \ - X(SE_M_BELLY_DRUM) \ - X(SE_M_METRONOME) \ - X(SE_M_BONEMERANG) \ - X(SE_M_LICK) \ - X(SE_M_PSYBEAM) \ - X(SE_M_FAINT_ATTACK) \ - X(SE_M_SWORDS_DANCE) \ - X(SE_M_LEER) \ - X(SE_M_SWAGGER) \ - X(SE_M_SWAGGER2) \ - X(SE_M_HEAL_BELL) \ - X(SE_M_CONFUSE_RAY) \ - X(SE_M_SNORE) \ - X(SE_M_BRICK_BREAK) \ - X(SE_M_GIGA_DRAIN) \ - X(SE_M_PSYBEAM2) \ - X(SE_M_SOLAR_BEAM) \ - X(SE_M_PETAL_DANCE) \ - X(SE_M_TELEPORT) \ - X(SE_M_MINIMIZE) \ - X(SE_M_SKETCH) \ - X(SE_M_SWIFT) \ - X(SE_M_REFLECT) \ - X(SE_M_BARRIER) \ - X(SE_M_DETECT) \ - X(SE_M_LOCK_ON) \ - X(SE_M_MOONLIGHT) \ - X(SE_M_CHARM) \ - X(SE_M_CHARGE) \ - X(SE_M_STRENGTH) \ - X(SE_M_HYPER_BEAM) \ - X(SE_M_WATERFALL) \ - X(SE_M_REVERSAL) \ - X(SE_M_ACID_ARMOR) \ - X(SE_M_SANDSTORM) \ - X(SE_M_TRI_ATTACK) \ - X(SE_M_TRI_ATTACK2) \ - X(SE_M_ENCORE) \ - X(SE_M_ENCORE2) \ - X(SE_M_BATON_PASS) \ - X(SE_M_MILK_DRINK) \ - X(SE_M_ATTRACT) \ - X(SE_M_ATTRACT2) \ - X(SE_M_MORNING_SUN) \ - X(SE_M_FLATTER) \ - X(SE_M_SAND_TOMB) \ - X(SE_M_GRASSWHISTLE) \ - X(SE_M_SPIT_UP) \ - X(SE_M_DIVE) \ - X(SE_M_EARTHQUAKE) \ - X(SE_M_TWISTER) \ - X(SE_M_SWEET_SCENT) \ - X(SE_M_YAWN) \ - X(SE_M_SKY_UPPERCUT) \ - X(SE_M_STAT_INCREASE) \ - X(SE_M_HEAT_WAVE) \ - X(SE_M_UPROAR) \ - X(SE_M_HAIL) \ - X(SE_M_COSMIC_POWER) \ - X(SE_M_TEETER_DANCE) \ - X(SE_M_STAT_DECREASE) \ - X(SE_M_HAZE) \ - X(SE_M_HYPER_BEAM2) \ - X(SE_RG_DOOR) \ - X(SE_RG_CARD_FLIP) \ - X(SE_RG_CARD_FLIPPING) \ - X(SE_RG_CARD_OPEN) \ - X(SE_RG_BAG_CURSOR) \ - X(SE_RG_BAG_POCKET) \ - X(SE_RG_BALL_CLICK) \ - X(SE_RG_SHOP) \ - X(SE_RG_SS_ANNE_HORN) \ - X(SE_RG_HELP_OPEN) \ - X(SE_RG_HELP_CLOSE) \ - X(SE_RG_HELP_ERROR) \ - X(SE_RG_DEOXYS_MOVE) \ - X(SE_RG_POKE_JUMP_SUCCESS) \ - X(SE_RG_POKE_JUMP_FAILURE) \ - X(SE_PHONE_CALL) \ - X(SE_PHONE_CLICK) \ - X(SE_ARENA_TIMEUP1) \ - X(SE_ARENA_TIMEUP2) \ - X(SE_PIKE_CURTAIN_CLOSE) \ - X(SE_PIKE_CURTAIN_OPEN) \ - X(SE_SUDOWOODO_SHAKE) \ +#define SOUND_LIST_SE \ + X(SE_USE_ITEM) \ + X(SE_PC_LOGIN) \ + X(SE_PC_OFF) \ + X(SE_PC_ON) \ + X(SE_SELECT) \ + X(SE_WIN_OPEN) \ + X(SE_WALL_HIT) \ + X(SE_DOOR) \ + X(SE_EXIT) \ + X(SE_LEDGE) \ + X(SE_BIKE_BELL) \ + X(SE_NOT_EFFECTIVE) \ + X(SE_EFFECTIVE) \ + X(SE_SUPER_EFFECTIVE) \ + X(SE_BALL_OPEN) \ + X(SE_FAINT) \ + X(SE_FLEE) \ + X(SE_SLIDING_DOOR) \ + X(SE_SHIP) \ + X(SE_BANG) \ + X(SE_PIN) \ + X(SE_BOO) \ + X(SE_BALL) \ + X(SE_CONTEST_PLACE) \ + X(SE_A) \ + X(SE_I) \ + X(SE_U) \ + X(SE_E) \ + X(SE_O) \ + X(SE_N) \ + X(SE_SUCCESS) \ + X(SE_FAILURE) \ + X(SE_EXP) \ + X(SE_BIKE_HOP) \ + X(SE_SWITCH) \ + X(SE_CLICK) \ + X(SE_FU_ZAKU) \ + X(SE_CONTEST_CONDITION_LOSE) \ + X(SE_LAVARIDGE_FALL_WARP) \ + X(SE_ICE_STAIRS) \ + X(SE_ICE_BREAK) \ + X(SE_ICE_CRACK) \ + X(SE_FALL) \ + X(SE_UNLOCK) \ + X(SE_WARP_IN) \ + X(SE_WARP_OUT) \ + X(SE_REPEL) \ + X(SE_ROTATING_GATE) \ + X(SE_TRUCK_MOVE) \ + X(SE_TRUCK_STOP) \ + X(SE_TRUCK_UNLOAD) \ + X(SE_TRUCK_DOOR) \ + X(SE_BERRY_BLENDER) \ + X(SE_CARD) \ + X(SE_SAVE) \ + X(SE_BALL_BOUNCE_1) \ + X(SE_BALL_BOUNCE_2) \ + X(SE_BALL_BOUNCE_3) \ + X(SE_BALL_BOUNCE_4) \ + X(SE_BALL_TRADE) \ + X(SE_BALL_THROW) \ + X(SE_NOTE_C) \ + X(SE_NOTE_D) \ + X(SE_NOTE_E) \ + X(SE_NOTE_F) \ + X(SE_NOTE_G) \ + X(SE_NOTE_A) \ + X(SE_NOTE_B) \ + X(SE_NOTE_C_HIGH) \ + X(SE_PUDDLE) \ + X(SE_BRIDGE_WALK) \ + X(SE_ITEMFINDER) \ + X(SE_DING_DONG) \ + X(SE_BALLOON_RED) \ + X(SE_BALLOON_BLUE) \ + X(SE_BALLOON_YELLOW) \ + X(SE_BREAKABLE_DOOR) \ + X(SE_MUD_BALL) \ + X(SE_FIELD_POISON) \ + X(SE_ESCALATOR) \ + X(SE_THUNDERSTORM) \ + X(SE_THUNDERSTORM_STOP) \ + X(SE_DOWNPOUR) \ + X(SE_DOWNPOUR_STOP) \ + X(SE_RAIN) \ + X(SE_RAIN_STOP) \ + X(SE_THUNDER) \ + X(SE_THUNDER2) \ + X(SE_ELEVATOR) \ + X(SE_LOW_HEALTH) \ + X(SE_EXP_MAX) \ + X(SE_ROULETTE_BALL) \ + X(SE_ROULETTE_BALL2) \ + X(SE_TAILLOW_WING_FLAP) \ + X(SE_SHOP) \ + X(SE_CONTEST_HEART) \ + X(SE_CONTEST_CURTAIN_RISE) \ + X(SE_CONTEST_CURTAIN_FALL) \ + X(SE_CONTEST_ICON_CHANGE) \ + X(SE_CONTEST_ICON_CLEAR) \ + X(SE_CONTEST_MONS_TURN) \ + X(SE_SHINY) \ + X(SE_INTRO_BLAST) \ + X(SE_MUGSHOT) \ + X(SE_APPLAUSE) \ + X(SE_VEND) \ + X(SE_ORB) \ + X(SE_DEX_SCROLL) \ + X(SE_DEX_PAGE) \ + X(SE_POKENAV_ON) \ + X(SE_POKENAV_OFF) \ + X(SE_DEX_SEARCH) \ + X(SE_EGG_HATCH) \ + X(SE_BALL_TRAY_ENTER) \ + X(SE_BALL_TRAY_BALL) \ + X(SE_BALL_TRAY_EXIT) \ + X(SE_GLASS_FLUTE) \ + X(SE_M_THUNDERBOLT) \ + X(SE_M_THUNDERBOLT2) \ + X(SE_M_HARDEN) \ + X(SE_M_NIGHTMARE) \ + X(SE_M_VITAL_THROW) \ + X(SE_M_VITAL_THROW2) \ + X(SE_M_BUBBLE) \ + X(SE_M_BUBBLE2) \ + X(SE_M_BUBBLE3) \ + X(SE_M_RAIN_DANCE) \ + X(SE_M_CUT) \ + X(SE_M_STRING_SHOT) \ + X(SE_M_STRING_SHOT2) \ + X(SE_M_ROCK_THROW) \ + X(SE_M_GUST) \ + X(SE_M_GUST2) \ + X(SE_M_DOUBLE_SLAP) \ + X(SE_M_DOUBLE_TEAM) \ + X(SE_M_RAZOR_WIND) \ + X(SE_M_ICY_WIND) \ + X(SE_M_THUNDER_WAVE) \ + X(SE_M_COMET_PUNCH) \ + X(SE_M_MEGA_KICK) \ + X(SE_M_MEGA_KICK2) \ + X(SE_M_CRABHAMMER) \ + X(SE_M_JUMP_KICK) \ + X(SE_M_FLAME_WHEEL) \ + X(SE_M_FLAME_WHEEL2) \ + X(SE_M_FLAMETHROWER) \ + X(SE_M_FIRE_PUNCH) \ + X(SE_M_TOXIC) \ + X(SE_M_SACRED_FIRE) \ + X(SE_M_SACRED_FIRE2) \ + X(SE_M_EMBER) \ + X(SE_M_TAKE_DOWN) \ + X(SE_M_BLIZZARD) \ + X(SE_M_BLIZZARD2) \ + X(SE_M_SCRATCH) \ + X(SE_M_VICEGRIP) \ + X(SE_M_WING_ATTACK) \ + X(SE_M_FLY) \ + X(SE_M_SAND_ATTACK) \ + X(SE_M_RAZOR_WIND2) \ + X(SE_M_BITE) \ + X(SE_M_HEADBUTT) \ + X(SE_M_SURF) \ + X(SE_M_HYDRO_PUMP) \ + X(SE_M_WHIRLPOOL) \ + X(SE_M_HORN_ATTACK) \ + X(SE_M_TAIL_WHIP) \ + X(SE_M_MIST) \ + X(SE_M_POISON_POWDER) \ + X(SE_M_BIND) \ + X(SE_M_DRAGON_RAGE) \ + X(SE_M_SING) \ + X(SE_M_PERISH_SONG) \ + X(SE_M_PAY_DAY) \ + X(SE_M_DIG) \ + X(SE_M_DIZZY_PUNCH) \ + X(SE_M_SELF_DESTRUCT) \ + X(SE_M_EXPLOSION) \ + X(SE_M_ABSORB_2) \ + X(SE_M_ABSORB) \ + X(SE_M_SCREECH) \ + X(SE_M_BUBBLE_BEAM) \ + X(SE_M_BUBBLE_BEAM2) \ + X(SE_M_SUPERSONIC) \ + X(SE_M_BELLY_DRUM) \ + X(SE_M_METRONOME) \ + X(SE_M_BONEMERANG) \ + X(SE_M_LICK) \ + X(SE_M_PSYBEAM) \ + X(SE_M_FAINT_ATTACK) \ + X(SE_M_SWORDS_DANCE) \ + X(SE_M_LEER) \ + X(SE_M_SWAGGER) \ + X(SE_M_SWAGGER2) \ + X(SE_M_HEAL_BELL) \ + X(SE_M_CONFUSE_RAY) \ + X(SE_M_SNORE) \ + X(SE_M_BRICK_BREAK) \ + X(SE_M_GIGA_DRAIN) \ + X(SE_M_PSYBEAM2) \ + X(SE_M_SOLAR_BEAM) \ + X(SE_M_PETAL_DANCE) \ + X(SE_M_TELEPORT) \ + X(SE_M_MINIMIZE) \ + X(SE_M_SKETCH) \ + X(SE_M_SWIFT) \ + X(SE_M_REFLECT) \ + X(SE_M_BARRIER) \ + X(SE_M_DETECT) \ + X(SE_M_LOCK_ON) \ + X(SE_M_MOONLIGHT) \ + X(SE_M_CHARM) \ + X(SE_M_CHARGE) \ + X(SE_M_STRENGTH) \ + X(SE_M_HYPER_BEAM) \ + X(SE_M_WATERFALL) \ + X(SE_M_REVERSAL) \ + X(SE_M_ACID_ARMOR) \ + X(SE_M_SANDSTORM) \ + X(SE_M_TRI_ATTACK) \ + X(SE_M_TRI_ATTACK2) \ + X(SE_M_ENCORE) \ + X(SE_M_ENCORE2) \ + X(SE_M_BATON_PASS) \ + X(SE_M_MILK_DRINK) \ + X(SE_M_ATTRACT) \ + X(SE_M_ATTRACT2) \ + X(SE_M_MORNING_SUN) \ + X(SE_M_FLATTER) \ + X(SE_M_SAND_TOMB) \ + X(SE_M_GRASSWHISTLE) \ + X(SE_M_SPIT_UP) \ + X(SE_M_DIVE) \ + X(SE_M_EARTHQUAKE) \ + X(SE_M_TWISTER) \ + X(SE_M_SWEET_SCENT) \ + X(SE_M_YAWN) \ + X(SE_M_SKY_UPPERCUT) \ + X(SE_M_STAT_INCREASE) \ + X(SE_M_HEAT_WAVE) \ + X(SE_M_UPROAR) \ + X(SE_M_HAIL) \ + X(SE_M_COSMIC_POWER) \ + X(SE_M_TEETER_DANCE) \ + X(SE_M_STAT_DECREASE) \ + X(SE_M_HAZE) \ + X(SE_M_HYPER_BEAM2) \ + X(SE_RG_DOOR) \ + X(SE_RG_CARD_FLIP) \ + X(SE_RG_CARD_FLIPPING) \ + X(SE_RG_CARD_OPEN) \ + X(SE_RG_BAG_CURSOR) \ + X(SE_RG_BAG_POCKET) \ + X(SE_RG_BALL_CLICK) \ + X(SE_RG_SHOP) \ + X(SE_RG_SS_ANNE_HORN) \ + X(SE_RG_HELP_OPEN) \ + X(SE_RG_HELP_CLOSE) \ + X(SE_RG_HELP_ERROR) \ + X(SE_RG_DEOXYS_MOVE) \ + X(SE_RG_POKE_JUMP_SUCCESS) \ + X(SE_RG_POKE_JUMP_FAILURE) \ + X(SE_POKENAV_CALL) \ + X(SE_POKENAV_HANG_UP) \ + X(SE_ARENA_TIMEUP1) \ + X(SE_ARENA_TIMEUP2) \ + X(SE_PIKE_CURTAIN_CLOSE) \ + X(SE_PIKE_CURTAIN_OPEN) \ + X(SE_SUDOWOODO_SHAKE) // Create BGM list #define X(songId) static const u8 sBGMName_##songId[] = _(#songId); SOUND_LIST_BGM #undef X -#define X(songId) sBGMName_##songId, -static const u8 *const sBGMNames[] = +#define X(songId) [songId - START_MUS] = sBGMName_##songId, +static const u8 *const sBGMNames[END_MUS - START_MUS + 1] = { SOUND_LIST_BGM }; @@ -4746,8 +4703,8 @@ SOUND_LIST_BGM SOUND_LIST_SE #undef X -#define X(songId) sSEName_##songId, -static const u8 *const sSENames[] = +#define X(songId) [songId - 1] = sSEName_##songId, +static const u8 *const sSENames[END_SE + 1] = { SOUND_LIST_SE }; From a18709fb47f2f959b30ca0902f601daaf3672ed5 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Wed, 18 Jun 2025 11:59:24 +0300 Subject: [PATCH 061/248] Bag refactor (groundwork for expansion) (#7018) --- include/constants/global.h | 12 +- include/constants/item.h | 23 +-- include/global.h | 16 +- include/item.h | 25 ++- include/pokemon.h | 3 + src/battle_ai_main.c | 2 +- src/battle_ai_switch_items.c | 2 +- src/battle_controller_player.c | 22 +-- src/battle_dome.c | 6 +- src/battle_interface.c | 4 +- src/battle_pike.c | 2 +- src/battle_pyramid.c | 6 +- src/battle_script_commands.c | 6 +- src/battle_setup.c | 2 +- src/battle_tower.c | 14 +- src/berry_tag_screen.c | 12 +- src/frontier_util.c | 8 +- src/item.c | 343 +++++++++++++++++---------------- src/item_menu.c | 84 ++++---- src/item_menu_icons.c | 6 +- src/load_save.c | 59 +----- src/party_menu.c | 2 +- src/player_pc.c | 4 +- src/pokemon.c | 17 +- src/record_mixing.c | 2 +- src/scrcmd.c | 2 +- src/strings.c | 10 +- src/tv.c | 4 +- 28 files changed, 348 insertions(+), 350 deletions(-) diff --git a/include/constants/global.h b/include/constants/global.h index 4698dbc3b4..b2d892014c 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -63,11 +63,6 @@ #define SECRET_BASES_COUNT 20 #define POKE_NEWS_COUNT 16 #define PC_ITEMS_COUNT 50 -#define BAG_ITEMS_COUNT 30 -#define BAG_KEYITEMS_COUNT 30 -#define BAG_POKEBALLS_COUNT 16 -#define BAG_TMHM_COUNT 64 -#define BAG_BERRIES_COUNT 46 #define OBJECT_EVENT_TEMPLATES_COUNT 64 #define DECOR_MAX_SECRET_BASE 16 #define DECOR_MAX_PLAYERS_HOUSE 12 @@ -81,6 +76,13 @@ #define PYRAMID_BAG_ITEMS_COUNT 10 #define ROAMER_COUNT 1 // Number of maximum concurrent active roamers +// Bag constants +#define BAG_ITEMS_COUNT 30 +#define BAG_KEYITEMS_COUNT 30 +#define BAG_POKEBALLS_COUNT 16 +#define BAG_TMHM_COUNT 64 +#define BAG_BERRIES_COUNT 46 + // Number of facilities for Ranking Hall. // 7 facilities for single mode + tower double mode + tower multi mode. // Excludes link modes. See RANKING_HALL_* in include/constants/battle_frontier.h diff --git a/include/constants/item.h b/include/constants/item.h index f06e8682da..e928f3cdb5 100644 --- a/include/constants/item.h +++ b/include/constants/item.h @@ -1,20 +1,17 @@ #ifndef GUARD_ITEM_CONSTANTS_H #define GUARD_ITEM_CONSTANTS_H -// These constants are used in gItemsInfo -#define POCKET_NONE 0 -#define POCKET_ITEMS 1 -#define POCKET_POKE_BALLS 2 -#define POCKET_TM_HM 3 -#define POCKET_BERRIES 4 -#define POCKET_KEY_ITEMS 5 +enum Pocket +{ + POCKET_ITEMS, + POCKET_POKE_BALLS, + POCKET_TM_HM, + POCKET_BERRIES, + POCKET_KEY_ITEMS, + POCKETS_COUNT, +}; -#define ITEMS_POCKET 0 -#define BALLS_POCKET 1 -#define TMHM_POCKET 2 -#define BERRIES_POCKET 3 -#define KEYITEMS_POCKET 4 -#define POCKETS_COUNT 5 +#define POCKET_NONE POCKETS_COUNT #define REPEL_LURE_MASK (1 << 15) #define IS_LAST_USED_LURE(var) (var & REPEL_LURE_MASK) diff --git a/include/global.h b/include/global.h index 057a53b498..8aaca8e495 100644 --- a/include/global.h +++ b/include/global.h @@ -1043,6 +1043,15 @@ struct ExternalEventFlags } __attribute__((packed));/*size = 0x15*/ +struct Bag +{ + struct ItemSlot items[BAG_ITEMS_COUNT]; + struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; + struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; + struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; + struct ItemSlot berries[BAG_BERRIES_COUNT]; +}; + struct SaveBlock1 { /*0x00*/ struct Coords16 pos; @@ -1065,11 +1074,8 @@ struct SaveBlock1 /*0x494*/ u16 coins; /*0x496*/ u16 registeredItem; // registered for use with SELECT button /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT]; - /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; - /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; - /*0x650*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; - /*0x690*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT]; - /*0x790*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT]; + /*0x560 -> 0x848 is bag storage*/ + /*0x560*/ struct Bag bag; /*0x848*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT]; #if FREE_EXTRA_SEEN_FLAGS_SAVEBLOCK1 == FALSE /*0x988*/ u8 filler1[0x34]; // Previously Dex Flags, feel free to remove. diff --git a/include/item.h b/include/item.h index 519c3842c0..6c8410db8f 100644 --- a/include/item.h +++ b/include/item.h @@ -21,7 +21,7 @@ struct Item u8 importance:2; u8 notConsumed:1; u8 padding:5; - u8 pocket; + enum Pocket pocket:8; u8 type; u8 battleUsage; u8 flingPower; @@ -29,21 +29,23 @@ struct Item const u16 *iconPalette; }; -struct BagPocket +struct __attribute__((packed, aligned(2))) BagPocket { struct ItemSlot *itemSlots; - u8 capacity; + u16 capacity; }; extern const struct Item gItemsInfo[]; extern struct BagPocket gBagPockets[]; +u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos); +u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos); +void SetBagItemQuantity(enum Pocket pocketId, u32 pocketPos, u16 newValue); void ApplyNewEncryptionKeyToBagItems(u32 newKey); -void ApplyNewEncryptionKeyToBagItems_(u32 newKey); void SetBagItemsPointers(void); u8 *CopyItemName(u16 itemId, u8 *dst); u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity); -bool8 IsBagPocketNonEmpty(u8 pocket); +bool8 IsBagPocketNonEmpty(enum Pocket pocketId); bool8 CheckBagHasItem(u16 itemId, u16 count); bool8 HasAtLeastOneBerry(void); bool8 HasAtLeastOnePokeBall(void); @@ -51,19 +53,16 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count); u32 GetFreeSpaceForItemInBag(u16 itemId); bool8 AddBagItem(u16 itemId, u16 count); bool8 RemoveBagItem(u16 itemId, u16 count); -u8 GetPocketByItemId(u16 itemId); -void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount); u8 CountUsedPCItemSlots(void); bool8 CheckPCHasItem(u16 itemId, u16 count); bool8 AddPCItem(u16 itemId, u16 count); void RemovePCItem(u8 index, u16 count); void CompactPCItems(void); void SwapRegisteredBike(void); -u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos); -u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos); -void CompactItemsInBagPocket(struct BagPocket *bagPocket); -void SortBerriesOrTMHMs(struct BagPocket *bagPocket); -void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_); +void CompactItemsInBagPocket(enum Pocket pocketId); +void SortBerriesOrTMHMs(enum Pocket pocketId); +void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to); +void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to); void ClearBag(void); u16 CountTotalItemQuantityInBag(u16 itemId); bool8 AddPyramidBagItem(u16 itemId, u16 count); @@ -76,7 +75,7 @@ u32 GetItemHoldEffectParam(u32 itemId); const u8 *GetItemDescription(u16 itemId); u8 GetItemImportance(u16 itemId); u8 GetItemConsumability(u16 itemId); -u8 GetItemPocket(u16 itemId); +enum Pocket GetItemPocket(u16 itemId); u8 GetItemType(u16 itemId); ItemUseFunc GetItemFieldFunc(u16 itemId); u8 GetItemBattleUsage(u16 itemId); diff --git a/include/pokemon.h b/include/pokemon.h index 3219eac07f..966d5f6a35 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -876,5 +876,8 @@ uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier) u32 GetRegionalFormByRegion(u32 species, u32 region); bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); u32 GetTeraTypeFromPersonality(struct Pokemon *mon); +struct Pokemon *GetSavedPlayerPartyMon(u32 index); +u8 *GetSavedPlayerPartyCount(void); +void SavePlayerPartyMon(u32 index, struct Pokemon *mon); #endif // GUARD_POKEMON_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 4f1b251092..9cc0b5c149 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2539,7 +2539,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_NATURAL_GIFT: - if (!IsBattlerItemEnabled(battlerAtk) || GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES) + if (!IsBattlerItemEnabled(battlerAtk) || GetItemPocket(gBattleMons[battlerAtk].item) != POCKET_BERRIES) ADJUST_SCORE(-10); break; case EFFECT_GRASSY_TERRAIN: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 6aa5bf16b6..d258c28500 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1827,7 +1827,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) // Check if we're at a single use healing item threshold if (gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE - && !(opposingAbility == ABILITY_UNNERVE && GetPocketByItemId(item) == POCKET_BERRIES)) + && !(opposingAbility == ABILITY_UNNERVE && GetItemPocket(item) == POCKET_BERRIES)) { switch (heldItemEffect) { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index dfd254e77a..d2c24d19c4 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -207,16 +207,16 @@ static u16 GetPrevBall(u16 ballId) { u16 ballPrev; s32 i, j; - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); - for (i = 0; i < gBagPockets[BALLS_POCKET].capacity; i++) + CompactItemsInBagPocket(POCKET_POKE_BALLS); + for (i = 0; i < gBagPockets[POCKET_POKE_BALLS].capacity; i++) { - if (ballId == gBagPockets[BALLS_POCKET].itemSlots[i].itemId) + if (ballId == GetBagItemId(POCKET_POKE_BALLS, i)) { if (i <= 0) { - for (j = gBagPockets[BALLS_POCKET].capacity - 1; j >= 0; j--) + for (j = gBagPockets[POCKET_POKE_BALLS].capacity - 1; j >= 0; j--) { - ballPrev = gBagPockets[BALLS_POCKET].itemSlots[j].itemId; + ballPrev = GetBagItemId(POCKET_POKE_BALLS, j); if (ballPrev != ITEM_NONE) return ballPrev; } @@ -225,24 +225,24 @@ static u16 GetPrevBall(u16 ballId) break; } } - return gBagPockets[BALLS_POCKET].itemSlots[i].itemId; + return GetBagItemId(POCKET_POKE_BALLS, i); } static u32 GetNextBall(u32 ballId) { u32 ballNext = ITEM_NONE; s32 i; - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); - for (i = 1; i < gBagPockets[BALLS_POCKET].capacity; i++) + CompactItemsInBagPocket(POCKET_POKE_BALLS); + for (i = 1; i < gBagPockets[POCKET_POKE_BALLS].capacity; i++) { - if (ballId == gBagPockets[BALLS_POCKET].itemSlots[i-1].itemId) + if (ballId == GetBagItemId(POCKET_POKE_BALLS, i-1)) { - ballNext = gBagPockets[BALLS_POCKET].itemSlots[i].itemId; + ballNext = GetBagItemId(POCKET_POKE_BALLS, i); break; } } if (ballNext == ITEM_NONE) - return gBagPockets[BALLS_POCKET].itemSlots[0].itemId; // Zeroth slot + return GetBagItemId(POCKET_POKE_BALLS, 0); // Zeroth slot else return ballNext; } diff --git a/src/battle_dome.c b/src/battle_dome.c index b53d5fdcc8..ff7fe4b8b0 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -5680,7 +5680,7 @@ static void ResetSketchedMoves(void) count = 0; while (count < MAX_MON_MOVES) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(playerMonId), MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL)) break; count++; } @@ -5688,7 +5688,7 @@ static void ResetSketchedMoves(void) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, moveSlot); } - gSaveBlock1Ptr->playerParty[playerMonId] = gPlayerParty[i]; + SavePlayerPartyMon(playerMonId, &gPlayerParty[i]); } } @@ -5699,7 +5699,7 @@ static void RestoreDomePlayerPartyHeldItems(void) for (i = 0; i < DOME_BATTLE_PARTY_SIZE; i++) { int playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1; - u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_HELD_ITEM, NULL); + u16 item = GetMonData(GetSavedPlayerPartyMon(playerMonId), MON_DATA_HELD_ITEM, NULL); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item); } } diff --git a/src/battle_interface.c b/src/battle_interface.c index 92592d9fcb..f26a7af98f 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2997,9 +2997,9 @@ void TryAddLastUsedBallItemSprites(void) u16 firstBall; // we have to compact the bag first bc it is typically only compacted when you open it - CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]); + CompactItemsInBagPocket(POCKET_POKE_BALLS); - firstBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId; + firstBall = GetBagItemId(POCKET_POKE_BALLS, 0); if (firstBall > ITEM_NONE) gBallToDisplay = firstBall; } diff --git a/src/battle_pike.c b/src/battle_pike.c index 60e4a3c67f..bdc2d1fd1c 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -1587,7 +1587,7 @@ static void SaveMonHeldItems(void) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { - int heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], + int heldItem = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_HELD_ITEM); gSaveBlock2Ptr->frontier.pikeHeldItemsBackup[i] = heldItem; } diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 48c32d194a..2b50e189fa 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1221,19 +1221,19 @@ static void RestorePyramidPlayerParty(void) int partyIndex = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; for (j = 0; j < FRONTIER_PARTY_SIZE; j++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(partyIndex), MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)) { for (k = 0; k < MAX_MON_MOVES; k++) { for (l = 0; l < MAX_MON_MOVES; l++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL)) + if (GetMonData(GetSavedPlayerPartyMon(partyIndex), MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL)) break; } if (l == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k); } - gSaveBlock1Ptr->playerParty[partyIndex] = gPlayerParty[j]; + SavePlayerPartyMon(partyIndex, &gPlayerParty[j]); gSelectedOrderFromParty[j] = partyIndex + 1; break; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1cbc0caaa2..23c0aeaa0d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5260,9 +5260,9 @@ bool32 NoAliveMonsForPlayer(void) { for (i = 0; i < PARTY_SIZE; i++) { - if (!GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_SPECIES) - || !GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HP) - || GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_IS_EGG)) + if (!GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_SPECIES) + || !GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HP) + || GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_IS_EGG)) ineligibleMonsCount++; } diff --git a/src/battle_setup.c b/src/battle_setup.c index da12b5fd18..0074eebf38 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1269,7 +1269,7 @@ static void SaveChangesToPlayerParty(void) { if ((participatedPokemon >> i & 1) == 1) { - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[j]; + SavePlayerPartyMon(i, &gPlayerParty[j]); j++; } } diff --git a/src/battle_tower.c b/src/battle_tower.c index e0d3a192b7..6eeac96d4a 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1932,7 +1932,7 @@ static void HandleSpecialTrainerBattleEnd(void) case SPECIAL_BATTLE_SECRET_BASE: for (i = 0; i < PARTY_SIZE; i++) { - u16 itemBefore = GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM); + u16 itemBefore = GetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HELD_ITEM); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &itemBefore); } break; @@ -1943,7 +1943,7 @@ static void HandleSpecialTrainerBattleEnd(void) for (i = 0; i < 3; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; + SavePlayerPartyMon(i, &gPlayerParty[i]); } break; } @@ -1998,7 +1998,7 @@ void DoSpecialTrainerBattle(void) for (i = 0; i < PARTY_SIZE; i++) { u16 itemBefore = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &itemBefore); + SetMonData(GetSavedPlayerPartyMon(i), MON_DATA_HELD_ITEM, &itemBefore); } CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); @@ -2769,11 +2769,11 @@ static void AwardBattleTowerRibbons(void) partyIndex = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; ribbons[i].partyIndex = partyIndex; ribbons[i].count = 0; - if (!GetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType)) + if (!GetMonData(GetSavedPlayerPartyMon(partyIndex), ribbonType)) { gSpecialVar_Result = TRUE; - SetMonData(&gSaveBlock1Ptr->playerParty[partyIndex], ribbonType, &gSpecialVar_Result); - ribbons[i].count = GetRibbonCount(&gSaveBlock1Ptr->playerParty[partyIndex]); + SetMonData(GetSavedPlayerPartyMon(partyIndex), ribbonType, &gSpecialVar_Result); + ribbons[i].count = GetRibbonCount(GetSavedPlayerPartyMon(partyIndex)); } } } @@ -2792,7 +2792,7 @@ static void AwardBattleTowerRibbons(void) } if (ribbons[0].count > NUM_CUTIES_RIBBONS) { - TryPutSpotTheCutiesOnAir(&gSaveBlock1Ptr->playerParty[ribbons[0].partyIndex], ribbonType); + TryPutSpotTheCutiesOnAir(GetSavedPlayerPartyMon(ribbons[0].partyIndex), ribbonType); } } } diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 84db1ad844..6f0467f332 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -563,9 +563,9 @@ static void Task_HandleInput(u8 taskId) static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) { s16 *data = gTasks[taskId].data; - s16 currPocketPosition = gBagPosition.scrollPosition[BERRIES_POCKET] + gBagPosition.cursorPosition[BERRIES_POCKET]; + s16 currPocketPosition = gBagPosition.scrollPosition[POCKET_BERRIES] + gBagPosition.cursorPosition[POCKET_BERRIES]; u32 newPocketPosition = currPocketPosition + toMove; - if (newPocketPosition < ITEM_TO_BERRY(LAST_BERRY_INDEX) && BagGetItemIdByPocketPosition(POCKET_BERRIES, newPocketPosition) != ITEM_NONE) + if (newPocketPosition < ITEM_TO_BERRY(LAST_BERRY_INDEX) && GetBagItemId(POCKET_BERRIES, newPocketPosition) != ITEM_NONE) { if (toMove < 0) tBgOp = BG_COORD_SUB; @@ -581,11 +581,11 @@ static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) static void HandleBagCursorPositionChange(s8 toMove) { - u16 *scrollPos = &gBagPosition.scrollPosition[BERRIES_POCKET]; - u16 *cursorPos = &gBagPosition.cursorPosition[BERRIES_POCKET]; + u16 *scrollPos = &gBagPosition.scrollPosition[POCKET_BERRIES]; + u16 *cursorPos = &gBagPosition.cursorPosition[POCKET_BERRIES]; if (toMove > 0) { - if (*cursorPos < 4 || BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + 8) == 0) + if (*cursorPos < 4 || GetBagItemId(POCKET_BERRIES, *scrollPos + 8) == 0) *cursorPos += toMove; else *scrollPos += toMove; @@ -598,7 +598,7 @@ static void HandleBagCursorPositionChange(s8 toMove) *scrollPos += toMove; } - sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + *cursorPos)); + sBerryTag->berryId = ItemIdToBerryType(GetBagItemId(POCKET_BERRIES, *scrollPos + *cursorPos)); } #define DISPLAY_SPEED 16 diff --git a/src/frontier_util.c b/src/frontier_util.c index 5fd8c4b0b3..8fcf1221f3 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -913,7 +913,7 @@ static void SaveSelectedParty(void) { u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; if (monId < PARTY_SIZE) - gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + SavePlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1, &gPlayerParty[i]); } } @@ -2165,7 +2165,7 @@ static void RestoreHeldItems(void) { if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0) { - u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_HELD_ITEM, NULL); + u16 item = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_HELD_ITEM, NULL); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item); } } @@ -2203,14 +2203,14 @@ static void ResetSketchedMoves(void) { for (k = 0; k < MAX_MON_MOVES; k++) { - if (GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + k, NULL) + if (GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1), MON_DATA_MOVE1 + k, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, NULL)) break; } if (k == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, j); } - gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + SavePlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1, &gPlayerParty[i]); } } } diff --git a/src/item.c b/src/item.c index d93531e4db..5696b38111 100644 --- a/src/item.c +++ b/src/item.c @@ -31,14 +31,44 @@ EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; #include "data/pokemon/item_effects.h" #include "data/items.h" -static u16 GetBagItemQuantity(u16 *quantity) +static inline u16 GetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos) { - return gSaveBlock2Ptr->encryptionKey ^ *quantity; + return pocket->itemSlots[pocketPos].itemId; } -static void SetBagItemQuantity(u16 *quantity, u16 newValue) +static inline u16 GetBagItemQuantityPocket(struct BagPocket *pocket, u32 pocketPos) { - *quantity = newValue ^ gSaveBlock2Ptr->encryptionKey; + return gSaveBlock2Ptr->encryptionKey ^ pocket->itemSlots[pocketPos].quantity; +} + +static inline void SetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos, u16 itemId) +{ + pocket->itemSlots[pocketPos].itemId = itemId; +} + +static inline void SetBagItemQuantityPocket(struct BagPocket *pocket, u32 pocketPos, u16 newValue) +{ + pocket->itemSlots[pocketPos].quantity = newValue ^ gSaveBlock2Ptr->encryptionKey; +} + +u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos) +{ + return GetBagItemIdPocket(&gBagPockets[pocketId], pocketPos); +} + +u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos) +{ + return GetBagItemQuantityPocket(&gBagPockets[pocketId], pocketPos); +} + +static void SetBagItemId(enum Pocket pocketId, u32 pocketPos, u16 itemId) +{ + SetBagItemIdPocket(&gBagPockets[pocketId], pocketPos, itemId); +} + +void SetBagItemQuantity(enum Pocket pocketId, u32 pocketPos, u16 newValue) +{ + SetBagItemQuantityPocket(&gBagPockets[pocketId], pocketPos, newValue); } static u16 GetPCItemQuantity(u16 *quantity) @@ -53,35 +83,31 @@ static void SetPCItemQuantity(u16 *quantity, u16 newValue) void ApplyNewEncryptionKeyToBagItems(u32 newKey) { - u32 pocket, item; - for (pocket = 0; pocket < POCKETS_COUNT; pocket++) + enum Pocket pocketId; + u32 item; + for (pocketId = 0; pocketId < POCKETS_COUNT; pocketId++) { - for (item = 0; item < gBagPockets[pocket].capacity; item++) - ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey); + for (item = 0; item < gBagPockets[pocketId].capacity; item++) + ApplyNewEncryptionKeyToHword(&(gBagPockets[pocketId].itemSlots[item].quantity), newKey); } } -void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF? -{ - ApplyNewEncryptionKeyToBagItems(newKey); -} - void SetBagItemsPointers(void) { - gBagPockets[ITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Items; - gBagPockets[ITEMS_POCKET].capacity = BAG_ITEMS_COUNT; + gBagPockets[POCKET_ITEMS].itemSlots = gSaveBlock1Ptr->bag.items; + gBagPockets[POCKET_ITEMS].capacity = BAG_ITEMS_COUNT; - gBagPockets[KEYITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems; - gBagPockets[KEYITEMS_POCKET].capacity = BAG_KEYITEMS_COUNT; + gBagPockets[POCKET_KEY_ITEMS].itemSlots = gSaveBlock1Ptr->bag.keyItems; + gBagPockets[POCKET_KEY_ITEMS].capacity = BAG_KEYITEMS_COUNT; - gBagPockets[BALLS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls; - gBagPockets[BALLS_POCKET].capacity = BAG_POKEBALLS_COUNT; + gBagPockets[POCKET_POKE_BALLS].itemSlots = gSaveBlock1Ptr->bag.pokeBalls; + gBagPockets[POCKET_POKE_BALLS].capacity = BAG_POKEBALLS_COUNT; - gBagPockets[TMHM_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM; - gBagPockets[TMHM_POCKET].capacity = BAG_TMHM_COUNT; + gBagPockets[POCKET_TM_HM].itemSlots = gSaveBlock1Ptr->bag.TMsHMs; + gBagPockets[POCKET_TM_HM].capacity = BAG_TMHM_COUNT; - gBagPockets[BERRIES_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Berries; - gBagPockets[BERRIES_POCKET].capacity = BAG_BERRIES_COUNT; + gBagPockets[POCKET_BERRIES].itemSlots = gSaveBlock1Ptr->bag.berries; + gBagPockets[POCKET_BERRIES].capacity = BAG_BERRIES_COUNT; } u8 *CopyItemName(u16 itemId, u8 *dst) @@ -108,13 +134,13 @@ u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) } } -bool8 IsBagPocketNonEmpty(u8 pocket) +bool8 IsBagPocketNonEmpty(enum Pocket pocketId) { u8 i; - for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) + if (GetBagItemId(pocketId, i) != 0) return TRUE; } return FALSE; @@ -123,21 +149,21 @@ bool8 IsBagPocketNonEmpty(u8 pocket) bool8 CheckBagHasItem(u16 itemId, u16 count) { u8 i; - u8 pocket; + enum Pocket pocketId; - if (GetItemPocket(itemId) == 0) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) return CheckPyramidBagHasItem(itemId, count); - pocket = GetItemPocket(itemId) - 1; + pocketId = GetItemPocket(itemId); // Check for item slots that contain the item - for (i = 0; i < gBagPockets[pocket].capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + if (GetBagItemId(pocketId, i) == itemId) { u16 quantity; // Does this item slot contain enough of the item? - quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); + quantity = GetBagItemQuantity(pocketId, i); if (quantity >= count) return TRUE; count -= quantity; @@ -179,7 +205,7 @@ bool8 HasAtLeastOnePokeBall(void) bool8 CheckBagHasSpace(u16 itemId, u16 count) { - if (GetItemPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) @@ -191,22 +217,23 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) u32 GetFreeSpaceForItemInBag(u16 itemId) { u8 i; - u8 pocket = GetItemPocket(itemId) - 1; + enum Pocket pocketId = GetItemPocket(itemId); u16 ownedCount; u32 spaceForItem = 0; - if (GetItemPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return 0; // Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + + if (GetBagItemId(pocketId, i) == itemId) { - ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); + ownedCount = GetBagItemQuantity(pocketId, i); spaceForItem += max(0, MAX_BAG_ITEM_CAPACITY - ownedCount); } - else if (gBagPockets[pocket].itemSlots[i].itemId == ITEM_NONE) + else if (GetBagItemId(pocketId, i) == ITEM_NONE) { spaceForItem += MAX_BAG_ITEM_CAPACITY; } @@ -214,11 +241,33 @@ u32 GetFreeSpaceForItemInBag(u16 itemId) return spaceForItem; } +static inline u32 PrepareTempPocket(struct BagPocket *tempPocket, enum Pocket pocketId) +{ + u32 size = gBagPockets[pocketId].capacity * sizeof(struct ItemSlot); + tempPocket->itemSlots = AllocZeroed(size); + tempPocket->capacity = gBagPockets[pocketId].capacity; + memcpy(tempPocket->itemSlots, gBagPockets[pocketId].itemSlots, size); + + return size; +} + +static inline void ClearTempPocket(struct BagPocket *pocket) +{ + Free(pocket->itemSlots); + Free(pocket); +} + +static inline void RestorePocketAndClearTempPocket(struct BagPocket *tempPocket, enum Pocket pocketId, u32 pocketSize) +{ + memcpy(gBagPockets[pocketId].itemSlots, tempPocket->itemSlots, pocketSize); + ClearTempPocket(tempPocket); +} + bool8 AddBagItem(u16 itemId, u16 count) { u8 i; - if (GetItemPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; // check Battle Pyramid Bag @@ -228,41 +277,36 @@ bool8 AddBagItem(u16 itemId, u16 count) } else { - struct BagPocket *itemPocket; - struct ItemSlot *newItems; u16 ownedCount; - u8 pocket = GetItemPocket(itemId) - 1; + enum Pocket pocketId = GetItemPocket(itemId); + struct BagPocket *tempPocket = AllocZeroed(sizeof(struct BagPocket)); + u32 pocketSize = PrepareTempPocket(tempPocket, pocketId); - itemPocket = &gBagPockets[pocket]; - newItems = AllocZeroed(itemPocket->capacity * sizeof(struct ItemSlot)); - memcpy(newItems, itemPocket->itemSlots, itemPocket->capacity * sizeof(struct ItemSlot)); - - for (i = 0; i < itemPocket->capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (newItems[i].itemId == itemId) + if (GetBagItemIdPocket(tempPocket, i) == itemId) { - ownedCount = GetBagItemQuantity(&newItems[i].quantity); + ownedCount = GetBagItemQuantityPocket(tempPocket, i); // check if won't exceed max slot capacity if (ownedCount + count <= MAX_BAG_ITEM_CAPACITY) { // successfully added to already existing item's count - SetBagItemQuantity(&newItems[i].quantity, ownedCount + count); - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); - Free(newItems); + SetBagItemQuantityPocket(tempPocket, i, ownedCount + count); + RestorePocketAndClearTempPocket(tempPocket, pocketId, pocketSize); return TRUE; } else { // try creating another instance of the item if possible - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + if (pocketId == POCKET_TM_HM || pocketId == POCKET_BERRIES) { - Free(newItems); + ClearTempPocket(tempPocket); return FALSE; } else { count -= MAX_BAG_ITEM_CAPACITY - ownedCount; - SetBagItemQuantity(&newItems[i].quantity, MAX_BAG_ITEM_CAPACITY); + SetBagItemQuantityPocket(tempPocket, i, MAX_BAG_ITEM_CAPACITY); // don't create another instance of the item if it's at max slot capacity and count is equal to 0 if (count == 0) { @@ -277,26 +321,26 @@ bool8 AddBagItem(u16 itemId, u16 count) if (count > 0) { // either no existing item was found or we have to create another instance, because the capacity was exceeded - for (i = 0; i < itemPocket->capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (newItems[i].itemId == ITEM_NONE) + if (GetBagItemIdPocket(tempPocket, i) == ITEM_NONE) { - newItems[i].itemId = itemId; + SetBagItemIdPocket(tempPocket, i, itemId); if (count > MAX_BAG_ITEM_CAPACITY) { // try creating a new slot with max capacity if duplicates are possible - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + if (pocketId == POCKET_TM_HM || pocketId == POCKET_BERRIES) { - Free(newItems); + ClearTempPocket(tempPocket); return FALSE; } count -= MAX_BAG_ITEM_CAPACITY; - SetBagItemQuantity(&newItems[i].quantity, MAX_BAG_ITEM_CAPACITY); + SetBagItemQuantityPocket(tempPocket, i, MAX_BAG_ITEM_CAPACITY); } else { // created a new slot and added quantity - SetBagItemQuantity(&newItems[i].quantity, count); + SetBagItemQuantityPocket(tempPocket, i, count); count = 0; break; } @@ -305,12 +349,11 @@ bool8 AddBagItem(u16 itemId, u16 count) if (count > 0) { - Free(newItems); + ClearTempPocket(tempPocket); return FALSE; } } - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); - Free(newItems); + RestorePocketAndClearTempPocket(tempPocket, pocketId, pocketSize); return TRUE; } } @@ -320,7 +363,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count) u8 i; u16 totalQuantity = 0; - if (GetItemPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE) + if (GetItemPocket(itemId) >= POCKETS_COUNT || itemId == ITEM_NONE) return FALSE; // check Battle Pyramid Bag @@ -330,18 +373,17 @@ bool8 RemoveBagItem(u16 itemId, u16 count) } else { - u8 pocket; - u8 var; - u16 ownedCount; - struct BagPocket *itemPocket; + u16 ownedCount, firstStackIndex = 0; + enum Pocket pocketId = GetItemPocket(itemId); - pocket = GetItemPocket(itemId) - 1; - itemPocket = &gBagPockets[pocket]; - - for (i = 0; i < itemPocket->capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (itemPocket->itemSlots[i].itemId == itemId) - totalQuantity += GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); + if (GetBagItemId(pocketId, i) == itemId) + { + if (totalQuantity == 0) + firstStackIndex = i; + totalQuantity += GetBagItemQuantity(pocketId, i); + } } if (totalQuantity < count) @@ -353,47 +395,24 @@ bool8 RemoveBagItem(u16 itemId, u16 count) VarSet(VAR_SECRET_BASE_LAST_ITEM_USED, itemId); } - var = GetItemListPosition(pocket); - if (itemPocket->capacity > var - && itemPocket->itemSlots[var].itemId == itemId) + for (i = firstStackIndex; i < gBagPockets[pocketId].capacity; i++) { - ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[var].quantity); - if (ownedCount >= count) + if (GetBagItemId(pocketId, i) == itemId) { - SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, ownedCount - count); - count = 0; - } - else - { - count -= ownedCount; - SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, 0); - } - - if (GetBagItemQuantity(&itemPocket->itemSlots[var].quantity) == 0) - itemPocket->itemSlots[var].itemId = ITEM_NONE; - - if (count == 0) - return TRUE; - } - - for (i = 0; i < itemPocket->capacity; i++) - { - if (itemPocket->itemSlots[i].itemId == itemId) - { - ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); + ownedCount = GetBagItemQuantity(pocketId, i); if (ownedCount >= count) { - SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, ownedCount - count); + SetBagItemQuantity(pocketId, i, ownedCount - count); count = 0; } else { count -= ownedCount; - SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, 0); + SetBagItemQuantity(pocketId, i, 0); } - if (GetBagItemQuantity(&itemPocket->itemSlots[i].quantity) == 0) - itemPocket->itemSlots[i].itemId = ITEM_NONE; + if (GetBagItemQuantity(pocketId, i) == 0) + SetBagItemId(pocketId, i, ITEM_NONE); if (count == 0) return TRUE; @@ -403,22 +422,6 @@ bool8 RemoveBagItem(u16 itemId, u16 count) } } -u8 GetPocketByItemId(u16 itemId) -{ - return GetItemPocket(itemId); -} - -void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount) -{ - u16 i; - - for (i = 0; i < itemCount; i++) - { - itemSlots[i].itemId = ITEM_NONE; - SetBagItemQuantity(&itemSlots[i].quantity, 0); - } -} - static s32 FindFreePCItemSlot(void) { s8 i; @@ -555,62 +558,81 @@ void SwapRegisteredBike(void) } } -u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos) +static void SwapItemSlots(enum Pocket pocketId, u32 pocketPosA, u16 pocketPosB) { - return gBagPockets[pocketId - 1].itemSlots[pocketPos].itemId; + struct ItemSlot *itemA = &gBagPockets[pocketId].itemSlots[pocketPosA], + *itemB = &gBagPockets[pocketId].itemSlots[pocketPosB], + temp; + SWAP(*itemA, *itemB, temp); } -u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos) -{ - return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[pocketPos].quantity); -} - -static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) -{ - struct ItemSlot temp; - SWAP(*a, *b, temp); -} - -void CompactItemsInBagPocket(struct BagPocket *bagPocket) +void CompactItemsInBagPocket(enum Pocket pocketId) { u16 i, j; - for (i = 0; i < bagPocket->capacity - 1; i++) + for (i = 0; i < gBagPockets[pocketId].capacity - 1; i++) { - for (j = i + 1; j < bagPocket->capacity; j++) + for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) { - if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) == 0) - SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); + if (GetBagItemQuantity(pocketId, i) == 0) + SwapItemSlots(pocketId, i, j); } } } -void SortBerriesOrTMHMs(struct BagPocket *bagPocket) +void SortBerriesOrTMHMs(enum Pocket pocketId) { u16 i, j; - for (i = 0; i < bagPocket->capacity - 1; i++) + for (i = 0; i < gBagPockets[pocketId].capacity - 1; i++) { - for (j = i + 1; j < bagPocket->capacity; j++) + for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) { - if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) != 0) + if (GetBagItemQuantity(pocketId, i) != 0) { - if (GetBagItemQuantity(&bagPocket->itemSlots[j].quantity) == 0) + if (GetBagItemQuantity(pocketId, j) == 0) continue; - if (bagPocket->itemSlots[i].itemId <= bagPocket->itemSlots[j].itemId) + if (GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) continue; } - SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); + SwapItemSlots(pocketId, i, j); } } } -void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_) +void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to) { - // dumb assignments needed to match - struct ItemSlot *itemSlots = itemSlots_; - u32 to = to_; + if (from != to) + { + u32 i; + s8 shift = -1; + struct BagPocket *pocket = &gBagPockets[pocketId]; + // Record the values at "from" + u16 fromItemId = GetBagItemIdPocket(pocket, from), + fromQuantity = GetBagItemQuantityPocket(pocket, from); + + // Shuffle items between "to" and "from" + if (to > from) + { + to--; + shift = 1; + } + + for (i = from; i == to - shift; i += shift) + { + SetBagItemIdPocket(pocket, i, GetBagItemIdPocket(pocket, i + shift)); + SetBagItemQuantityPocket(pocket, i, GetBagItemQuantityPocket(pocket, i + shift)); + } + + // Move the saved "from" to "to" + SetBagItemIdPocket(pocket, to, fromItemId); + SetBagItemQuantityPocket(pocket, to, fromQuantity); + } +} + +void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to) +{ if (from != to) { s16 i, count; @@ -633,24 +655,19 @@ void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_) void ClearBag(void) { - u16 i; - - for (i = 0; i < POCKETS_COUNT; i++) - { - ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); - } + CpuFastFill(0, &gSaveBlock1Ptr->bag, sizeof(struct Bag)); } u16 CountTotalItemQuantityInBag(u16 itemId) { u16 i; u16 ownedCount = 0; - struct BagPocket *bagPocket = &gBagPockets[GetItemPocket(itemId) - 1]; + enum Pocket pocketId = GetItemPocket(itemId); - for (i = 0; i < bagPocket->capacity; i++) + for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (bagPocket->itemSlots[i].itemId == itemId) - ownedCount += GetBagItemQuantity(&bagPocket->itemSlots[i].quantity); + if (GetBagItemId(pocketId, i) == itemId) + ownedCount += GetBagItemQuantity(pocketId, i); } return ownedCount; @@ -922,7 +939,7 @@ u8 GetItemConsumability(u16 itemId) return !gItemsInfo[SanitizeItemId(itemId)].notConsumed; } -u8 GetItemPocket(u16 itemId) +enum Pocket GetItemPocket(u16 itemId) { return gItemsInfo[SanitizeItemId(itemId)].pocket; } diff --git a/src/item_menu.c b/src/item_menu.c index 1c3cee77e5..77ad2c6155 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -561,7 +561,7 @@ static EWRAM_DATA struct TempWallyBag *sTempWallyBag = 0; void ResetBagScrollPositions(void) { - gBagPosition.pocket = ITEMS_POCKET; + gBagPosition.pocket = POCKET_ITEMS; memset(gBagPosition.cursorPosition, 0, sizeof(gBagPosition.cursorPosition)); memset(gBagPosition.scrollPosition, 0, sizeof(gBagPosition.scrollPosition)); } @@ -582,19 +582,19 @@ void CB2_BagMenuFromBattle(void) // Choosing berry to plant void CB2_ChooseBerry(void) { - GoToBagMenu(ITEMMENULOCATION_BERRY_TREE, BERRIES_POCKET, CB2_ReturnToFieldContinueScript); + GoToBagMenu(ITEMMENULOCATION_BERRY_TREE, POCKET_BERRIES, CB2_ReturnToFieldContinueScript); } // Choosing mulch to use void CB2_ChooseMulch(void) { - GoToBagMenu(ITEMMENULOCATION_BERRY_TREE_MULCH, ITEMS_POCKET, CB2_ReturnToFieldContinueScript); + GoToBagMenu(ITEMMENULOCATION_BERRY_TREE_MULCH, POCKET_ITEMS, CB2_ReturnToFieldContinueScript); } // Choosing berry for Berry Blender or Berry Crush void ChooseBerryForMachine(void (*exitCallback)(void)) { - GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, BERRIES_POCKET, exitCallback); + GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, POCKET_BERRIES, exitCallback); } void CB2_GoToSellMenu(void) @@ -876,14 +876,13 @@ static void AllocateBagItemListBuffers(void) static void LoadBagItemListBuffers(u8 pocketId) { u16 i; - struct BagPocket *pocket = &gBagPockets[pocketId]; struct ListMenuItem *subBuffer; if (!gBagMenu->hideCloseBagText) { for (i = 0; i < gBagMenu->numItemStacks[pocketId] - 1; i++) { - GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], GetBagItemId(pocketId, i)); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -897,7 +896,7 @@ static void LoadBagItemListBuffers(u8 pocketId) { for (i = 0; i < gBagMenu->numItemStacks[pocketId]; i++) { - GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], GetBagItemId(pocketId, i)); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -914,7 +913,7 @@ static void GetItemNameFromPocket(u8 *dest, u16 itemId) u8 *end; switch (gBagPosition.pocket) { - case TMHM_POCKET: + case POCKET_TM_HM: end = StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(itemId))); PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); if (itemId >= ITEM_HM01) @@ -930,7 +929,7 @@ static void GetItemNameFromPocket(u8 *dest, u16 itemId) StringExpandPlaceholders(dest, gText_NumberItem_TMBerry); } break; - case BERRIES_POCKET: + case POCKET_BERRIES: ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2); end = CopyItemName(itemId, gStringVar2); PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); @@ -954,7 +953,7 @@ static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListM { RemoveBagItemIconSprite(gBagMenu->itemIconSlot ^ 1); if (itemIndex != LIST_CANCEL) - AddBagItemIconSprite(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex), gBagMenu->itemIconSlot); + AddBagItemIconSprite(GetBagItemId(gBagPosition.pocket, itemIndex), gBagMenu->itemIconSlot); else AddBagItemIconSprite(ITEM_LIST_END, gBagMenu->itemIconSlot); gBagMenu->itemIconSlot ^= 1; @@ -980,14 +979,14 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) BagMenu_PrintCursorAtPos(y, COLORID_NONE); } - itemId = BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex); - itemQuantity = BagGetQuantityByPocketPosition(gBagPosition.pocket + 1, itemIndex); + itemId = GetBagItemId(gBagPosition.pocket, itemIndex); + itemQuantity = GetBagItemQuantity(gBagPosition.pocket, itemIndex); // Draw HM icon if (itemId >= ITEM_HM01 && itemId <= ITEM_HM08) BlitBitmapToWindow(windowId, gBagMenuHMIcon_Gfx, 8, y - 1, 16, 16); - if (gBagPosition.pocket != KEYITEMS_POCKET && GetItemImportance(itemId) == FALSE) + if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemId) == FALSE) { // Print item quantity ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, MAX_ITEM_DIGITS); @@ -1009,7 +1008,7 @@ static void PrintItemDescription(int itemIndex) const u8 *str; if (itemIndex != LIST_CANCEL) { - str = GetItemDescription(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex)); + str = GetItemDescription(GetBagItemId(gBagPosition.pocket, itemIndex)); } else { @@ -1131,21 +1130,20 @@ static void Task_CloseBagMenu(u8 taskId) void UpdatePocketItemList(u8 pocketId) { u16 i; - struct BagPocket *pocket = &gBagPockets[pocketId]; switch (pocketId) { - case TMHM_POCKET: - case BERRIES_POCKET: - SortBerriesOrTMHMs(pocket); + case POCKET_TM_HM: + case POCKET_BERRIES: + SortBerriesOrTMHMs(pocketId); break; default: - CompactItemsInBagPocket(pocket); + CompactItemsInBagPocket(pocketId); break; } gBagMenu->numItemStacks[pocketId] = 0; - for (i = 0; i < pocket->capacity && pocket->itemSlots[i].itemId; i++) + for (i = 0; i < gBagPockets[pocketId].capacity && GetBagItemId(pocketId, i); i++) gBagMenu->numItemStacks[pocketId]++; if (!gBagMenu->hideCloseBagText) @@ -1289,8 +1287,8 @@ static void Task_BagMenu_HandleInput(u8 taskId) BagDestroyPocketScrollArrowPair(); BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); tListPosition = listPosition; - tQuantity = BagGetQuantityByPocketPosition(gBagPosition.pocket + 1, listPosition); - gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, listPosition); + tQuantity = GetBagItemQuantity(gBagPosition.pocket, listPosition); + gSpecialVar_ItemId = GetBagItemId(gBagPosition.pocket, listPosition); sContextMenuFuncs[gBagPosition.location](taskId); break; } @@ -1447,8 +1445,8 @@ static bool8 CanSwapItems(void) || gBagPosition.location == ITEMMENULOCATION_BATTLE) { // TMHMs and berries are numbered, and so may not be swapped - if (gBagPosition.pocket != TMHM_POCKET - && gBagPosition.pocket != BERRIES_POCKET) + if (gBagPosition.pocket != POCKET_TM_HM + && gBagPosition.pocket != POCKET_BERRIES) return TRUE; } return FALSE; @@ -1461,7 +1459,7 @@ static void StartItemSwap(u8 taskId) ListMenuSetUnkIndicatorsStructField(tListTaskId, 16, 1); tListPosition = gBagPosition.scrollPosition[gBagPosition.pocket] + gBagPosition.cursorPosition[gBagPosition.pocket]; gBagMenu->toSwapPos = tListPosition; - CopyItemName(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, tListPosition), gStringVar1); + CopyItemName(GetBagItemId(gBagPosition.pocket, tListPosition), gStringVar1); StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where); FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); @@ -1523,7 +1521,7 @@ static void DoItemSwap(u8 taskId) } else { - MoveItemSlotInList(gBagPockets[gBagPosition.pocket].itemSlots, tListPosition, realPos); + MoveItemSlotInPocket(gBagPosition.pocket, tListPosition, realPos); gBagMenu->toSwapPos = NOT_SWAPPING; DestroyListMenuTask(tListTaskId, scrollPos, cursorPos); if (tListPosition < realPos) @@ -1618,7 +1616,7 @@ static void OpenContextMenu(u8 taskId) default: if (MenuHelpers_IsLinkActive() == TRUE || InUnionRoom() == TRUE) { - if (gBagPosition.pocket == KEYITEMS_POCKET || !IsHoldingItemAllowed(gSpecialVar_ItemId)) + if (gBagPosition.pocket == POCKET_KEY_ITEMS || !IsHoldingItemAllowed(gSpecialVar_ItemId)) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_Cancel; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_Cancel); @@ -1633,14 +1631,14 @@ static void OpenContextMenu(u8 taskId) { switch (gBagPosition.pocket) { - case ITEMS_POCKET: + case POCKET_ITEMS: gBagMenu->contextMenuItemsPtr = gBagMenu->contextMenuItemsBuffer; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_ItemsPocket); memcpy(&gBagMenu->contextMenuItemsBuffer, &sContextMenuItems_ItemsPocket, sizeof(sContextMenuItems_ItemsPocket)); if (ItemIsMail(gSpecialVar_ItemId) == TRUE) gBagMenu->contextMenuItemsBuffer[0] = ACTION_CHECK; break; - case KEYITEMS_POCKET: + case POCKET_KEY_ITEMS: gBagMenu->contextMenuItemsPtr = gBagMenu->contextMenuItemsBuffer; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_KeyItemsPocket); memcpy(&gBagMenu->contextMenuItemsBuffer, &sContextMenuItems_KeyItemsPocket, sizeof(sContextMenuItems_KeyItemsPocket)); @@ -1652,22 +1650,22 @@ static void OpenContextMenu(u8 taskId) gBagMenu->contextMenuItemsBuffer[0] = ACTION_WALK; } break; - case BALLS_POCKET: + case POCKET_POKE_BALLS: gBagMenu->contextMenuItemsPtr = sContextMenuItems_BallsPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BallsPocket); break; - case TMHM_POCKET: + case POCKET_TM_HM: gBagMenu->contextMenuItemsPtr = sContextMenuItems_TmHmPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_TmHmPocket); break; - case BERRIES_POCKET: + case POCKET_BERRIES: gBagMenu->contextMenuItemsPtr = sContextMenuItems_BerriesPocket; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BerriesPocket); break; } } } - if (gBagPosition.pocket == TMHM_POCKET) + if (gBagPosition.pocket == POCKET_TM_HM) { ClearWindowTilemap(WIN_DESCRIPTION); PrintTMHMMoveData(gSpecialVar_ItemId); @@ -1824,7 +1822,7 @@ static void ItemMenu_UseOutOfBattle(u8 taskId) { FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); ScheduleBgCopyTilemapToVram(0); - if (gBagPosition.pocket != BERRIES_POCKET) + if (gBagPosition.pocket != POCKET_BERRIES) GetItemFieldFunc(gSpecialVar_ItemId)(taskId); else ItemUseOutOfBattle_Berry(taskId); @@ -2047,7 +2045,7 @@ static void Task_ItemContext_GiveToParty(u8 taskId) StringExpandPlaceholders(gStringVar4, sText_Var1CantBeHeldHere); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, HandleErrorMessage); } - else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != POCKET_KEY_ITEMS && !GetItemImportance(gSpecialVar_ItemId)) { Task_FadeAndCloseBagMenu(taskId); } @@ -2062,7 +2060,7 @@ static void Task_ItemContext_GiveToPC(u8 taskId) { if (ItemIsMail(gSpecialVar_ItemId) == TRUE) DisplayItemMessage(taskId, FONT_NORMAL, gText_CantWriteMail, HandleErrorMessage); - else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != POCKET_KEY_ITEMS && !GetItemImportance(gSpecialVar_ItemId)) gTasks[taskId].func = Task_FadeAndCloseBagMenu; else PrintItemCantBeHeld(taskId); @@ -2328,16 +2326,16 @@ static void PrepareBagForWallyTutorial(void) u32 i; sTempWallyBag = AllocZeroed(sizeof(*sTempWallyBag)); - memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items)); - memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls)); + memcpy(sTempWallyBag->bagPocket_Items, gSaveBlock1Ptr->bag.items, sizeof(gSaveBlock1Ptr->bag.items)); + memcpy(sTempWallyBag->bagPocket_PokeBalls, gSaveBlock1Ptr->bag.pokeBalls, sizeof(gSaveBlock1Ptr->bag.pokeBalls)); sTempWallyBag->pocket = gBagPosition.pocket; for (i = 0; i < POCKETS_COUNT; i++) { sTempWallyBag->cursorPosition[i] = gBagPosition.cursorPosition[i]; sTempWallyBag->scrollPosition[i] = gBagPosition.scrollPosition[i]; } - ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, BAG_ITEMS_COUNT); - ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, BAG_POKEBALLS_COUNT); + memset(gSaveBlock1Ptr->bag.items, 0, sizeof(gSaveBlock1Ptr->bag.items)); + memset(gSaveBlock1Ptr->bag.pokeBalls, 0, sizeof(gSaveBlock1Ptr->bag.pokeBalls)); ResetBagScrollPositions(); } @@ -2345,8 +2343,8 @@ static void RestoreBagAfterWallyTutorial(void) { u32 i; - memcpy(gSaveBlock1Ptr->bagPocket_Items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items)); - memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls)); + memcpy(gSaveBlock1Ptr->bag.items, sTempWallyBag->bagPocket_Items, sizeof(sTempWallyBag->bagPocket_Items)); + memcpy(gSaveBlock1Ptr->bag.pokeBalls, sTempWallyBag->bagPocket_PokeBalls, sizeof(sTempWallyBag->bagPocket_PokeBalls)); gBagPosition.pocket = sTempWallyBag->pocket; for (i = 0; i < POCKETS_COUNT; i++) { @@ -2361,7 +2359,7 @@ void DoWallyTutorialBagMenu(void) PrepareBagForWallyTutorial(); AddBagItem(ITEM_POTION, 1); AddBagItem(ITEM_POKE_BALL, 1); - GoToBagMenu(ITEMMENULOCATION_WALLY, ITEMS_POCKET, CB2_SetUpReshowBattleScreenAfterMenu2); + GoToBagMenu(ITEMMENULOCATION_WALLY, POCKET_ITEMS, CB2_SetUpReshowBattleScreenAfterMenu2); } #define tTimer data[8] diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index a56e6189ef..61413ebeca 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -96,12 +96,12 @@ static const union AnimCmd sSpriteAnim_Bag_Berries[] = static const union AnimCmd *const sBagSpriteAnimTable[] = { - [POCKET_NONE] = sSpriteAnim_Bag_Closed, [POCKET_ITEMS] = sSpriteAnim_Bag_Items, [POCKET_POKE_BALLS] = sSpriteAnim_Bag_Pokeballs, [POCKET_TM_HM] = sSpriteAnim_Bag_TMsHMs, [POCKET_BERRIES] = sSpriteAnim_Bag_Berries, [POCKET_KEY_ITEMS] = sSpriteAnim_Bag_KeyItems, + [POCKET_NONE] = sSpriteAnim_Bag_Closed, }; static const union AffineAnimCmd sSpriteAffineAnim_BagNormal[] = @@ -473,12 +473,12 @@ void SetBagVisualPocketId(u8 bagPocketId, bool8 isSwitchingPockets) { sprite->y2 = -5; sprite->callback = SpriteCB_BagVisualSwitchingPockets; - sprite->sPocketId = bagPocketId + 1; + sprite->sPocketId = bagPocketId; StartSpriteAnim(sprite, POCKET_NONE); } else { - StartSpriteAnim(sprite, bagPocketId + 1); + StartSpriteAnim(sprite, bagPocketId); } } diff --git a/src/load_save.c b/src/load_save.c index ed9a9852e7..ea0fcbdb8d 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -25,11 +25,7 @@ static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); struct LoadedSaveData { - /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT]; - /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; - /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; - /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; - /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT]; + /*0x0000*/ struct Bag bag; /*0x02E8*/ struct Mail mail[MAIL_COUNT]; }; @@ -173,23 +169,22 @@ void ClearContinueGameWarpStatus2(void) void SavePlayerParty(void) { int i; - - gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount; + *GetSavedPlayerPartyCount() = gPlayerPartyCount; for (i = 0; i < PARTY_SIZE; i++) - gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; + SavePlayerPartyMon(i, &gPlayerParty[i]); } void LoadPlayerParty(void) { int i; - gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount; + gPlayerPartyCount = *GetSavedPlayerPartyCount(); for (i = 0; i < PARTY_SIZE; i++) { u32 data; - gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i]; + gPlayerParty[i] = *GetSavedPlayerPartyMon(i); // TODO: Turn this into a save migration once those are available. // At which point we can remove hp and status from Pokemon entirely. @@ -260,25 +255,8 @@ void LoadPlayerBag(void) { int i; - // load player items. - for (i = 0; i < BAG_ITEMS_COUNT; i++) - gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i]; - - // load player key items. - for (i = 0; i < BAG_KEYITEMS_COUNT; i++) - gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i]; - - // load player pokeballs. - for (i = 0; i < BAG_POKEBALLS_COUNT; i++) - gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i]; - - // load player TMs and HMs. - for (i = 0; i < BAG_TMHM_COUNT; i++) - gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i]; - - // load player berries. - for (i = 0; i < BAG_BERRIES_COUNT; i++) - gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i]; + // load player bag. + memcpy(&gLoadedSaveData.bag, &gSaveBlock1Ptr->bag, sizeof(struct Bag)); // load mail. for (i = 0; i < MAIL_COUNT; i++) @@ -292,25 +270,8 @@ void SavePlayerBag(void) int i; u32 encryptionKeyBackup; - // save player items. - for (i = 0; i < BAG_ITEMS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i]; - - // save player key items. - for (i = 0; i < BAG_KEYITEMS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; - - // save player pokeballs. - for (i = 0; i < BAG_POKEBALLS_COUNT; i++) - gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; - - // save player TMs and HMs. - for (i = 0; i < BAG_TMHM_COUNT; i++) - gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; - - // save player berries. - for (i = 0; i < BAG_BERRIES_COUNT; i++) - gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i]; + // save player bag. + memcpy(&gSaveBlock1Ptr->bag, &gLoadedSaveData.bag, sizeof(struct Bag)); // save mail. for (i = 0; i < MAIL_COUNT; i++) @@ -337,7 +298,7 @@ void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey) static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey) { ApplyNewEncryptionKeyToGameStats(encryptionKey); - ApplyNewEncryptionKeyToBagItems_(encryptionKey); + ApplyNewEncryptionKeyToBagItems(encryptionKey); ApplyNewEncryptionKeyToBerryPowder(encryptionKey); ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey); ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey); diff --git a/src/party_menu.c b/src/party_menu.c index e22f4f7d9d..404157c497 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4561,7 +4561,7 @@ void CB2_ShowPartyMenuForItemUse(void) } else { - if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) + if (GetItemPocket(gSpecialVar_ItemId) == POCKET_TM_HM) msgId = PARTY_MSG_TEACH_WHICH_MON; else msgId = PARTY_MSG_USE_ON_WHICH_MON; diff --git a/src/player_pc.c b/src/player_pc.c index 02f4fc4cd5..ccd7d36b26 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -369,7 +369,7 @@ static const u8 sSwapArrowTextColors[] = {TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRA void NewGameInitPCItems(void) { u8 i = 0; - ClearItemSlots(gSaveBlock1Ptr->pcItems, PC_ITEMS_COUNT); + CpuFastFill(0, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems)); while (TRUE) { @@ -1334,7 +1334,7 @@ static void ItemStorage_FinishItemSwap(u8 taskId, bool8 canceled) if (!canceled && sItemStorageMenu->toSwapPos != newPos && sItemStorageMenu->toSwapPos != newPos - 1) { - MoveItemSlotInList(gSaveBlock1Ptr->pcItems, sItemStorageMenu->toSwapPos, newPos); + MoveItemSlotInPC(gSaveBlock1Ptr->pcItems, sItemStorageMenu->toSwapPos, newPos); ItemStorage_RefreshListMenu(); } if (sItemStorageMenu->toSwapPos < newPos) diff --git a/src/pokemon.c b/src/pokemon.c index 30e9b4302b..35f727e59e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6673,7 +6673,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges // This is to prevent reverting to base form when giving the item to the corresponding form. // Eg. Giving a Zap Plate to an Electric Arceus without an item (most likely to happen when using givemon) bool32 currentItemForm = FALSE; - for (int j = 0; formChanges[j].method != FORM_CHANGE_TERMINATOR; j++) + for (u32 j = 0; formChanges[j].method != FORM_CHANGE_TERMINATOR; j++) { if (species == formChanges[j].targetSpecies && formChanges[j].param1 == heldItem @@ -7209,3 +7209,18 @@ u32 GetTeraTypeFromPersonality(struct Pokemon *mon) const u8 *types = gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES)].types; return (GetMonData(mon, MON_DATA_PERSONALITY) & 0x1) == 0 ? types[0] : types[1]; } + +struct Pokemon *GetSavedPlayerPartyMon(u32 index) +{ + return &gSaveBlock1Ptr->playerParty[index]; +} + +u8 *GetSavedPlayerPartyCount(void) +{ + return &gSaveBlock1Ptr->playerPartyCount; +} + +void SavePlayerPartyMon(u32 index, struct Pokemon *mon) +{ + gSaveBlock1Ptr->playerParty[index] = *mon; +} diff --git a/src/record_mixing.c b/src/record_mixing.c index 1ff36d1fe8..087ca2e70e 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -961,7 +961,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *records, size static void ReceiveGiftItem(u16 *item, u8 multiplayerId) { - if (multiplayerId != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS) + if (multiplayerId != 0 && *item != ITEM_NONE && GetItemPocket(*item) == POCKET_KEY_ITEMS) { if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1)) { diff --git a/src/scrcmd.c b/src/scrcmd.c index 2efd183a88..3f71fb6798 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -667,7 +667,7 @@ bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) Script_RequestEffects(SCREFF_V1); - gSpecialVar_Result = GetPocketByItemId(itemId); + gSpecialVar_Result = GetItemPocket(itemId); return FALSE; } diff --git a/src/strings.c b/src/strings.c index 3d1e1ebf32..314d7536dc 100644 --- a/src/strings.c +++ b/src/strings.c @@ -199,11 +199,11 @@ const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}."); const u8 *const gPocketNamesStringsTable[] = { - [ITEMS_POCKET] = COMPOUND_STRING("ITEMS"), - [BALLS_POCKET] = COMPOUND_STRING("POKé BALLS"), - [TMHM_POCKET] = COMPOUND_STRING("TMs & HMs"), - [BERRIES_POCKET] = COMPOUND_STRING("BERRIES"), - [KEYITEMS_POCKET] = COMPOUND_STRING("KEY ITEMS") + [POCKET_ITEMS] = COMPOUND_STRING("ITEMS"), + [POCKET_POKE_BALLS] = COMPOUND_STRING("POKé BALLS"), + [POCKET_TM_HM] = COMPOUND_STRING("TMs & HMs"), + [POCKET_BERRIES] = COMPOUND_STRING("BERRIES"), + [POCKET_KEY_ITEMS] = COMPOUND_STRING("KEY ITEMS") }; const u8 gText_NumberItem_TMBerry[] = _("{NO}{STR_VAR_1}{CLEAR 0x07}{STR_VAR_2}"); diff --git a/src/tv.c b/src/tv.c index 4faf848f42..114c7ff102 100644 --- a/src/tv.c +++ b/src/tv.c @@ -2394,8 +2394,8 @@ void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode) show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); break; case FRONTIER_SHOW_TOWER_LINK_MULTIS: - show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL); + show->frontier.species1 = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1), MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(GetSavedPlayerPartyMon(gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1), MON_DATA_SPECIES, NULL); break; } StorePlayerIdInRecordMixShow(show); From 800829538cdafcf6ee101921f1483ec7cb03c19b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 18 Jun 2025 05:38:42 -0400 Subject: [PATCH 062/248] Compound strings for hold effect names (#7140) --- include/constants/hold_effects.h | 1 + src/battle_debug.c | 400 +++++++++++-------------------- 2 files changed, 135 insertions(+), 266 deletions(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index c7ed811601..e5ec842f1a 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -142,6 +142,7 @@ enum ItemHoldEffect HOLD_EFFECT_OGERPON_MASK, // Gen2 hold effect HOLD_EFFECT_BERSERK_GENE, + HOLD_EFFECT_COUNT }; #define HOLD_EFFECT_CHOICE(holdEffect) ((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) diff --git a/src/battle_debug.c b/src/battle_debug.c index bf48d0e36b..dc65b14d13 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2281,276 +2281,144 @@ static void UpdateMonData(struct BattleDebugMenu *data) } } -static const u8 sText_HoldEffectNone[] = _("????????"); -static const u8 sText_HoldEffectRestoreHp[] = _("Restore Hp"); -static const u8 sText_HoldEffectCurePar[] = _("Cure Par"); -static const u8 sText_HoldEffectCureSlp[] = _("Cure Slp"); -static const u8 sText_HoldEffectCurePsn[] = _("Cure Psn"); -static const u8 sText_HoldEffectCureBrn[] = _("Cure Brn"); -static const u8 sText_HoldEffectCureFrz[] = _("Cure Frz"); -static const u8 sText_HoldEffectRestorePp[] = _("Restore Pp"); -static const u8 sText_HoldEffectCureConfusion[] = _("Cure Confusion"); -static const u8 sText_HoldEffectCureStatus[] = _("Cure Status"); -static const u8 sText_HoldEffectConfuseSpicy[] = _("Confuse Spicy"); -static const u8 sText_HoldEffectConfuseDry[] = _("Confuse Dry"); -static const u8 sText_HoldEffectConfuseSweet[] = _("Confuse Sweet"); -static const u8 sText_HoldEffectConfuseBitter[] = _("Confuse Bitter"); -static const u8 sText_HoldEffectConfuseSour[] = _("Confuse Sour"); -static const u8 sText_HoldEffectAttackUp[] = _("Attack Up"); -static const u8 sText_HoldEffectDefenseUp[] = _("Defense Up"); -static const u8 sText_HoldEffectSpeedUp[] = _("Speed Up"); -static const u8 sText_HoldEffectSpAttackUp[] = _("Sp Attack Up"); -static const u8 sText_HoldEffectSpDefenseUp[] = _("Sp Defense Up"); -static const u8 sText_HoldEffectCriticalUp[] = _("Critical Up"); -static const u8 sText_HoldEffectRandomStatUp[] = _("Random Stat Up"); -static const u8 sText_HoldEffectEvasionUp[] = _("Evasion Up"); -static const u8 sText_HoldEffectRestoreStats[] = _("Restore Stats"); -static const u8 sText_HoldEffectMachoBrace[] = _("Macho Brace"); -static const u8 sText_HoldEffectExpShare[] = _("Exp Share"); -static const u8 sText_HoldEffectQuickClaw[] = _("Quick Claw"); -static const u8 sText_HoldEffectFriendshipUp[] = _("Friendship Up"); -static const u8 sText_HoldEffectMentalHerb[] = _("Mental Herb"); -static const u8 sText_HoldEffectChoiceBand[] = _("Choice Band"); -static const u8 sText_HoldEffectFlinch[] = _("Flinch"); -static const u8 sText_HoldEffectDoublePrize[] = _("Double Prize"); -static const u8 sText_HoldEffectRepel[] = _("Repel"); -static const u8 sText_HoldEffectSoulDew[] = _("Soul Dew"); -static const u8 sText_HoldEffectDeepSeaTooth[] = _("Deep Sea Tooth"); -static const u8 sText_HoldEffectDeepSeaScale[] = _("Deep Sea Scale"); -static const u8 sText_HoldEffectCanAlwaysRun[] = _("Can Always Run"); -static const u8 sText_HoldEffectPreventEvolve[] = _("Prevent Evolve"); -static const u8 sText_HoldEffectFocusBand[] = _("Focus Band"); -static const u8 sText_HoldEffectLuckyEgg[] = _("Lucky Egg"); -static const u8 sText_HoldEffectScopeLens[] = _("Scope Lens"); -static const u8 sText_HoldEffectLeftovers[] = _("Leftovers"); -static const u8 sText_HoldEffectDragonScale[] = _("Dragon Scale"); -static const u8 sText_HoldEffectLightBall[] = _("Light Ball"); -static const u8 sText_HoldEffectTypePower[] = _("Type Power"); -static const u8 sText_HoldEffectUpgrade[] = _("Upgrade"); -static const u8 sText_HoldEffectShellBell[] = _("Shell Bell"); -static const u8 sText_HoldEffectLuckyPunch[] = _("Lucky Punch"); -static const u8 sText_HoldEffectMetalPowder[] = _("Metal Powder"); -static const u8 sText_HoldEffectThickClub[] = _("Thick Club"); -static const u8 sText_HoldEffectLeek[] = _("Leek"); -static const u8 sText_HoldEffectChoiceScarf[] = _("Choice Scarf"); -static const u8 sText_HoldEffectChoiceSpecs[] = _("Choice Specs"); -static const u8 sText_HoldEffectDampRock[] = _("Damp Rock"); -static const u8 sText_HoldEffectGripClaw[] = _("Grip Claw"); -static const u8 sText_HoldEffectHeatRock[] = _("Heat Rock"); -static const u8 sText_HoldEffectIcyRock[] = _("Icy Rock"); -static const u8 sText_HoldEffectLightClay[] = _("Light Clay"); -static const u8 sText_HoldEffectSmoothRock[] = _("Smooth Rock"); -static const u8 sText_HoldEffectPowerHerb[] = _("Power Herb"); -static const u8 sText_HoldEffectBigRoot[] = _("Big Root"); -static const u8 sText_HoldEffectExpertBelt[] = _("Expert Belt"); -static const u8 sText_HoldEffectLifeOrb[] = _("Life Orb"); -static const u8 sText_HoldEffectMetronome[] = _("Metronome"); -static const u8 sText_HoldEffectMuscleBand[] = _("Muscle Band"); -static const u8 sText_HoldEffectWideLens[] = _("Wide Lens"); -static const u8 sText_HoldEffectWiseGlasses[] = _("Wise Glasses"); -static const u8 sText_HoldEffectZoomLens[] = _("Zoom Lens"); -static const u8 sText_HoldEffectLaggingTail[] = _("Lagging Tail"); -static const u8 sText_HoldEffectFocusSash[] = _("Focus Sash"); -static const u8 sText_HoldEffectFlameOrb[] = _("Flame Orb"); -static const u8 sText_HoldEffectToxicOrb[] = _("Toxic Orb"); -static const u8 sText_HoldEffectStickyBarb[] = _("Sticky Barb"); -static const u8 sText_HoldEffectIronBall[] = _("Iron Ball"); -static const u8 sText_HoldEffectBlackSludge[] = _("Black Sludge"); -static const u8 sText_HoldEffectDestinyKnot[] = _("Destiny Knot"); -static const u8 sText_HoldEffectShedShell[] = _("Shed Shell"); -static const u8 sText_HoldEffectQuickPowder[] = _("Quick Powder"); -static const u8 sText_HoldEffectAdamantOrb[] = _("Adamant Orb"); -static const u8 sText_HoldEffectLustrousOrb[] = _("Lustrous Orb"); -static const u8 sText_HoldEffectGriseousOrb[] = _("Griseous Orb"); -static const u8 sText_HoldEffectEnigmaBerry[] = _("Enigma Berry"); -static const u8 sText_HoldEffectResistBerry[] = _("Resist Berry"); -static const u8 sText_HoldEffectPowerItem[] = _("Power Item"); -static const u8 sText_HoldEffectRestorePctHp[] = _("Restore Pct Hp"); -static const u8 sText_HoldEffectMicleBerry[] = _("Micle Berry"); -static const u8 sText_HoldEffectCustapBerry[] = _("Custap Berry"); -static const u8 sText_HoldEffectJabocaBerry[] = _("Jaboca Berry"); -static const u8 sText_HoldEffectRowapBerry[] = _("Rowap Berry"); -static const u8 sText_HoldEffectKeeBerry[] = _("Kee Berry"); -static const u8 sText_HoldEffectMarangaBerry[] = _("Maranga Berry"); -static const u8 sText_HoldEffectFloatStone[] = _("Float Stone"); -static const u8 sText_HoldEffectEviolite[] = _("Eviolite"); -static const u8 sText_HoldEffectAssaultVest[] = _("Assault Vest"); -static const u8 sText_HoldEffectDrive[] = _("Drive"); -static const u8 sText_HoldEffectGems[] = _("Gems"); -static const u8 sText_HoldEffectRockyHelmet[] = _("Rocky Helmet"); -static const u8 sText_HoldEffectAirBalloon[] = _("Air Balloon"); -static const u8 sText_HoldEffectRedCard[] = _("Red Card"); -static const u8 sText_HoldEffectRingTarget[] = _("Ring Target"); -static const u8 sText_HoldEffectBindingBand[] = _("Binding Band"); -static const u8 sText_HoldEffectEjectButton[] = _("Eject Button"); -static const u8 sText_HoldEffectAbsorbBulb[] = _("Absorb Bulb"); -static const u8 sText_HoldEffectCellBattery[] = _("Cell Battery"); -static const u8 sText_HoldEffectMegaStone[] = _("Mega Stone"); -static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); -static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); -static const u8 sText_HoldEffectSnowball[] = _("Snowball"); -static const u8 sText_HoldEffectWeaknessPolicy[] = _("Weakness Policy"); -static const u8 sText_HoldEffectPrimalOrb[] = _("Primal Orb"); -static const u8 sText_HoldEffectProtectivePads[] = _("Protective Pads"); -static const u8 sText_HoldEffectTerrainExtender[] = _("Terrain Extender"); -static const u8 sText_HoldEffectSeeds[] = _("Seeds"); -static const u8 sText_HoldEffectAdrenalineOrb[] = _("Adrenaline Orb"); -static const u8 sText_HoldEffectMemory[] = _("Memory"); -static const u8 sText_HoldEffectZCrystal[] = _("Z-Crystal"); -static const u8 sText_HoldEffectPlate[] = _("Plate"); -static const u8 sText_HoldEffectUtilityUmbrella[] = _("Utility Umbrella"); -static const u8 sText_HoldEffectEjectPack[] = _("Eject Pack"); -static const u8 sText_HoldEffectRoomService[] = _("Room Service"); -static const u8 sText_HoldEffectBlunderPolicy[] = _("Blunder Policy"); -static const u8 sText_HoldEffectHeavyDutyBoots[] = _("Heavy Duty Boots"); -static const u8 sText_HoldEffectThroatSpray[] = _("Throat Spray"); -static const u8 sText_HoldEffectAbilityShield[] = _("Ability Shield"); -static const u8 sText_HoldEffectClearAmulet[] = _("Clear Amulet"); -static const u8 sText_HoldEffectMirrorHerb[] = _("Mirror Herb"); -static const u8 sText_HoldEffectPunchingGlove[] = _("Punching Glove"); -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[] = +static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = { - [HOLD_EFFECT_NONE] = sText_HoldEffectNone, - [HOLD_EFFECT_RESTORE_HP] = sText_HoldEffectRestoreHp, - [HOLD_EFFECT_CURE_PAR] = sText_HoldEffectCurePar, - [HOLD_EFFECT_CURE_SLP] = sText_HoldEffectCureSlp, - [HOLD_EFFECT_CURE_PSN] = sText_HoldEffectCurePsn, - [HOLD_EFFECT_CURE_BRN] = sText_HoldEffectCureBrn, - [HOLD_EFFECT_CURE_FRZ] = sText_HoldEffectCureFrz, - [HOLD_EFFECT_RESTORE_PP] = sText_HoldEffectRestorePp, - [HOLD_EFFECT_CURE_CONFUSION] = sText_HoldEffectCureConfusion, - [HOLD_EFFECT_CURE_STATUS] = sText_HoldEffectCureStatus, - [HOLD_EFFECT_CONFUSE_SPICY] = sText_HoldEffectConfuseSpicy, - [HOLD_EFFECT_CONFUSE_DRY] = sText_HoldEffectConfuseDry, - [HOLD_EFFECT_CONFUSE_SWEET] = sText_HoldEffectConfuseSweet, - [HOLD_EFFECT_CONFUSE_BITTER] = sText_HoldEffectConfuseBitter, - [HOLD_EFFECT_CONFUSE_SOUR] = sText_HoldEffectConfuseSour, - [HOLD_EFFECT_ATTACK_UP] = sText_HoldEffectAttackUp, - [HOLD_EFFECT_DEFENSE_UP] = sText_HoldEffectDefenseUp, - [HOLD_EFFECT_SPEED_UP] = sText_HoldEffectSpeedUp, - [HOLD_EFFECT_SP_ATTACK_UP] = sText_HoldEffectSpAttackUp, - [HOLD_EFFECT_SP_DEFENSE_UP] = sText_HoldEffectSpDefenseUp, - [HOLD_EFFECT_CRITICAL_UP] = sText_HoldEffectCriticalUp, - [HOLD_EFFECT_RANDOM_STAT_UP] = sText_HoldEffectRandomStatUp, - [HOLD_EFFECT_EVASION_UP] = sText_HoldEffectEvasionUp, - [HOLD_EFFECT_WHITE_HERB] = sText_HoldEffectRestoreStats, - [HOLD_EFFECT_MACHO_BRACE] = sText_HoldEffectMachoBrace, - [HOLD_EFFECT_EXP_SHARE] = sText_HoldEffectExpShare, - [HOLD_EFFECT_QUICK_CLAW] = sText_HoldEffectQuickClaw, - [HOLD_EFFECT_FRIENDSHIP_UP] = sText_HoldEffectFriendshipUp, - [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, - [HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand, - [HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch, - [HOLD_EFFECT_DOUBLE_PRIZE] = sText_HoldEffectDoublePrize, - [HOLD_EFFECT_REPEL] = sText_HoldEffectRepel, - [HOLD_EFFECT_SOUL_DEW] = sText_HoldEffectSoulDew, - [HOLD_EFFECT_DEEP_SEA_TOOTH] = sText_HoldEffectDeepSeaTooth, - [HOLD_EFFECT_DEEP_SEA_SCALE] = sText_HoldEffectDeepSeaScale, - [HOLD_EFFECT_CAN_ALWAYS_RUN] = sText_HoldEffectCanAlwaysRun, - [HOLD_EFFECT_PREVENT_EVOLVE] = sText_HoldEffectPreventEvolve, - [HOLD_EFFECT_FOCUS_BAND] = sText_HoldEffectFocusBand, - [HOLD_EFFECT_LUCKY_EGG] = sText_HoldEffectLuckyEgg, - [HOLD_EFFECT_SCOPE_LENS] = sText_HoldEffectScopeLens, - [HOLD_EFFECT_LEFTOVERS] = sText_HoldEffectLeftovers, - [HOLD_EFFECT_DRAGON_SCALE] = sText_HoldEffectDragonScale, - [HOLD_EFFECT_LIGHT_BALL] = sText_HoldEffectLightBall, - [HOLD_EFFECT_TYPE_POWER] = sText_HoldEffectTypePower, - [HOLD_EFFECT_UPGRADE] = sText_HoldEffectUpgrade, - [HOLD_EFFECT_SHELL_BELL] = sText_HoldEffectShellBell, - [HOLD_EFFECT_LUCKY_PUNCH] = sText_HoldEffectLuckyPunch, - [HOLD_EFFECT_METAL_POWDER] = sText_HoldEffectMetalPowder, - [HOLD_EFFECT_THICK_CLUB] = sText_HoldEffectThickClub, - [HOLD_EFFECT_LEEK] = sText_HoldEffectLeek, - [HOLD_EFFECT_CHOICE_SCARF] = sText_HoldEffectChoiceScarf, - [HOLD_EFFECT_CHOICE_SPECS] = sText_HoldEffectChoiceSpecs, - [HOLD_EFFECT_DAMP_ROCK] = sText_HoldEffectDampRock, - [HOLD_EFFECT_GRIP_CLAW] = sText_HoldEffectGripClaw, - [HOLD_EFFECT_HEAT_ROCK] = sText_HoldEffectHeatRock, - [HOLD_EFFECT_ICY_ROCK] = sText_HoldEffectIcyRock, - [HOLD_EFFECT_LIGHT_CLAY] = sText_HoldEffectLightClay, - [HOLD_EFFECT_SMOOTH_ROCK] = sText_HoldEffectSmoothRock, - [HOLD_EFFECT_POWER_HERB] = sText_HoldEffectPowerHerb, - [HOLD_EFFECT_BIG_ROOT] = sText_HoldEffectBigRoot, - [HOLD_EFFECT_EXPERT_BELT] = sText_HoldEffectExpertBelt, - [HOLD_EFFECT_LIFE_ORB] = sText_HoldEffectLifeOrb, - [HOLD_EFFECT_METRONOME] = sText_HoldEffectMetronome, - [HOLD_EFFECT_MUSCLE_BAND] = sText_HoldEffectMuscleBand, - [HOLD_EFFECT_WIDE_LENS] = sText_HoldEffectWideLens, - [HOLD_EFFECT_WISE_GLASSES] = sText_HoldEffectWiseGlasses, - [HOLD_EFFECT_ZOOM_LENS] = sText_HoldEffectZoomLens, - [HOLD_EFFECT_LAGGING_TAIL] = sText_HoldEffectLaggingTail, - [HOLD_EFFECT_FOCUS_SASH] = sText_HoldEffectFocusSash, - [HOLD_EFFECT_FLAME_ORB] = sText_HoldEffectFlameOrb, - [HOLD_EFFECT_TOXIC_ORB] = sText_HoldEffectToxicOrb, - [HOLD_EFFECT_STICKY_BARB] = sText_HoldEffectStickyBarb, - [HOLD_EFFECT_IRON_BALL] = sText_HoldEffectIronBall, - [HOLD_EFFECT_BLACK_SLUDGE] = sText_HoldEffectBlackSludge, - [HOLD_EFFECT_DESTINY_KNOT] = sText_HoldEffectDestinyKnot, - [HOLD_EFFECT_SHED_SHELL] = sText_HoldEffectShedShell, - [HOLD_EFFECT_QUICK_POWDER] = sText_HoldEffectQuickPowder, - [HOLD_EFFECT_ADAMANT_ORB] = sText_HoldEffectAdamantOrb, - [HOLD_EFFECT_LUSTROUS_ORB] = sText_HoldEffectLustrousOrb, - [HOLD_EFFECT_GRISEOUS_ORB] = sText_HoldEffectGriseousOrb, - [HOLD_EFFECT_ENIGMA_BERRY] = sText_HoldEffectEnigmaBerry, - [HOLD_EFFECT_RESIST_BERRY] = sText_HoldEffectResistBerry, - [HOLD_EFFECT_POWER_ITEM] = sText_HoldEffectPowerItem, - [HOLD_EFFECT_RESTORE_PCT_HP] = sText_HoldEffectRestorePctHp, - [HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry, - [HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry, - [HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry, - [HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry, - [HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry, - [HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry, - [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate, - [HOLD_EFFECT_FLOAT_STONE] = sText_HoldEffectFloatStone, - [HOLD_EFFECT_EVIOLITE] = sText_HoldEffectEviolite, - [HOLD_EFFECT_ASSAULT_VEST] = sText_HoldEffectAssaultVest, - [HOLD_EFFECT_DRIVE] = sText_HoldEffectDrive, - [HOLD_EFFECT_GEMS] = sText_HoldEffectGems, - [HOLD_EFFECT_ROCKY_HELMET] = sText_HoldEffectRockyHelmet, - [HOLD_EFFECT_AIR_BALLOON] = sText_HoldEffectAirBalloon, - [HOLD_EFFECT_RED_CARD] = sText_HoldEffectRedCard, - [HOLD_EFFECT_RING_TARGET] = sText_HoldEffectRingTarget, - [HOLD_EFFECT_BINDING_BAND] = sText_HoldEffectBindingBand, - [HOLD_EFFECT_EJECT_BUTTON] = sText_HoldEffectEjectButton, - [HOLD_EFFECT_ABSORB_BULB] = sText_HoldEffectAbsorbBulb, - [HOLD_EFFECT_CELL_BATTERY] = sText_HoldEffectCellBattery, - [HOLD_EFFECT_MEGA_STONE] = sText_HoldEffectMegaStone, - [HOLD_EFFECT_SAFETY_GOGGLES] = sText_HoldEffectSafetyGoggles, - [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, - [HOLD_EFFECT_SNOWBALL] = sText_HoldEffectSnowball, - [HOLD_EFFECT_WEAKNESS_POLICY] = sText_HoldEffectWeaknessPolicy, - [HOLD_EFFECT_PRIMAL_ORB] = sText_HoldEffectPrimalOrb, - [HOLD_EFFECT_PROTECTIVE_PADS] = sText_HoldEffectProtectivePads, - [HOLD_EFFECT_TERRAIN_EXTENDER] = sText_HoldEffectTerrainExtender, - [HOLD_EFFECT_SEEDS] = sText_HoldEffectSeeds, - [HOLD_EFFECT_ADRENALINE_ORB] = sText_HoldEffectAdrenalineOrb, - [HOLD_EFFECT_MEMORY] = sText_HoldEffectMemory, - [HOLD_EFFECT_Z_CRYSTAL] = sText_HoldEffectZCrystal, - [HOLD_EFFECT_UTILITY_UMBRELLA] = sText_HoldEffectUtilityUmbrella, - [HOLD_EFFECT_EJECT_PACK] = sText_HoldEffectEjectPack, - [HOLD_EFFECT_ROOM_SERVICE] = sText_HoldEffectRoomService, - [HOLD_EFFECT_BLUNDER_POLICY] = sText_HoldEffectBlunderPolicy, - [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = sText_HoldEffectHeavyDutyBoots, - [HOLD_EFFECT_THROAT_SPRAY] = sText_HoldEffectThroatSpray, - [HOLD_EFFECT_ABILITY_SHIELD] = sText_HoldEffectAbilityShield, - [HOLD_EFFECT_CLEAR_AMULET] = sText_HoldEffectClearAmulet, - [HOLD_EFFECT_MIRROR_HERB] = sText_HoldEffectMirrorHerb, - [HOLD_EFFECT_PUNCHING_GLOVE] = sText_HoldEffectPunchingGlove, - [HOLD_EFFECT_COVERT_CLOAK] = sText_HoldEffectCovertCloak, - [HOLD_EFFECT_LOADED_DICE] = sText_HoldEffectLoadedDice, - [HOLD_EFFECT_BOOSTER_ENERGY] = sText_HoldEffectBoosterEnergy, - [HOLD_EFFECT_OGERPON_MASK] = sText_HoldEffectOgerponMask, - [HOLD_EFFECT_BERSERK_GENE] = sText_HoldEffectBerserkGene, + [HOLD_EFFECT_NONE] = COMPOUND_STRING("????????"), + [HOLD_EFFECT_RESTORE_HP] = COMPOUND_STRING("Restore Hp"), + [HOLD_EFFECT_CURE_PAR] = COMPOUND_STRING("Cure Par"), + [HOLD_EFFECT_CURE_SLP] = COMPOUND_STRING("Cure Slp"), + [HOLD_EFFECT_CURE_PSN] = COMPOUND_STRING("Cure Psn"), + [HOLD_EFFECT_CURE_BRN] = COMPOUND_STRING("Cure Brn"), + [HOLD_EFFECT_CURE_FRZ] = COMPOUND_STRING("Cure Frz"), + [HOLD_EFFECT_RESTORE_PP] = COMPOUND_STRING("Restore Pp"), + [HOLD_EFFECT_CURE_CONFUSION] = COMPOUND_STRING("Cure Confusion"), + [HOLD_EFFECT_CURE_STATUS] = COMPOUND_STRING("Cure Status"), + [HOLD_EFFECT_CONFUSE_SPICY] = COMPOUND_STRING("Confuse Spicy"), + [HOLD_EFFECT_CONFUSE_DRY] = COMPOUND_STRING("Confuse Dry"), + [HOLD_EFFECT_CONFUSE_SWEET] = COMPOUND_STRING("Confuse Sweet"), + [HOLD_EFFECT_CONFUSE_BITTER] = COMPOUND_STRING("Confuse Bitter"), + [HOLD_EFFECT_CONFUSE_SOUR] = COMPOUND_STRING("Confuse Sour"), + [HOLD_EFFECT_ATTACK_UP] = COMPOUND_STRING("Attack Up"), + [HOLD_EFFECT_DEFENSE_UP] = COMPOUND_STRING("Defense Up"), + [HOLD_EFFECT_SPEED_UP] = COMPOUND_STRING("Speed Up"), + [HOLD_EFFECT_SP_ATTACK_UP] = COMPOUND_STRING("Sp Attack Up"), + [HOLD_EFFECT_SP_DEFENSE_UP] = COMPOUND_STRING("Sp Defense Up"), + [HOLD_EFFECT_CRITICAL_UP] = COMPOUND_STRING("Critical Up"), + [HOLD_EFFECT_RANDOM_STAT_UP] = COMPOUND_STRING("Random Stat Up"), + [HOLD_EFFECT_EVASION_UP] = COMPOUND_STRING("Evasion Up"), + [HOLD_EFFECT_WHITE_HERB] = COMPOUND_STRING("Restore Stats"), + [HOLD_EFFECT_MACHO_BRACE] = COMPOUND_STRING("Macho Brace"), + [HOLD_EFFECT_EXP_SHARE] = COMPOUND_STRING("Exp Share"), + [HOLD_EFFECT_QUICK_CLAW] = COMPOUND_STRING("Quick Claw"), + [HOLD_EFFECT_FRIENDSHIP_UP] = COMPOUND_STRING("Friendship Up"), + [HOLD_EFFECT_MENTAL_HERB] = COMPOUND_STRING("Mental Herb"), + [HOLD_EFFECT_CHOICE_BAND] = COMPOUND_STRING("Choice Band"), + [HOLD_EFFECT_FLINCH] = COMPOUND_STRING("Flinch"), + [HOLD_EFFECT_DOUBLE_PRIZE] = COMPOUND_STRING("Double Prize"), + [HOLD_EFFECT_REPEL] = COMPOUND_STRING("Repel"), + [HOLD_EFFECT_SOUL_DEW] = COMPOUND_STRING("Soul Dew"), + [HOLD_EFFECT_DEEP_SEA_TOOTH] = COMPOUND_STRING("Deep Sea Tooth"), + [HOLD_EFFECT_DEEP_SEA_SCALE] = COMPOUND_STRING("Deep Sea Scale"), + [HOLD_EFFECT_CAN_ALWAYS_RUN] = COMPOUND_STRING("Can Always Run"), + [HOLD_EFFECT_PREVENT_EVOLVE] = COMPOUND_STRING("Prevent Evolve"), + [HOLD_EFFECT_FOCUS_BAND] = COMPOUND_STRING("Focus Band"), + [HOLD_EFFECT_LUCKY_EGG] = COMPOUND_STRING("Lucky Egg"), + [HOLD_EFFECT_SCOPE_LENS] = COMPOUND_STRING("Scope Lens"), + [HOLD_EFFECT_LEFTOVERS] = COMPOUND_STRING("Leftovers"), + [HOLD_EFFECT_DRAGON_SCALE] = COMPOUND_STRING("Dragon Scale"), + [HOLD_EFFECT_LIGHT_BALL] = COMPOUND_STRING("Light Ball"), + [HOLD_EFFECT_TYPE_POWER] = COMPOUND_STRING("Type Power"), + [HOLD_EFFECT_UPGRADE] = COMPOUND_STRING("Upgrade"), + [HOLD_EFFECT_SHELL_BELL] = COMPOUND_STRING("Shell Bell"), + [HOLD_EFFECT_LUCKY_PUNCH] = COMPOUND_STRING("Lucky Punch"), + [HOLD_EFFECT_METAL_POWDER] = COMPOUND_STRING("Metal Powder"), + [HOLD_EFFECT_THICK_CLUB] = COMPOUND_STRING("Thick Club"), + [HOLD_EFFECT_LEEK] = COMPOUND_STRING("Leek"), + [HOLD_EFFECT_CHOICE_SCARF] = COMPOUND_STRING("Choice Scarf"), + [HOLD_EFFECT_CHOICE_SPECS] = COMPOUND_STRING("Choice Specs"), + [HOLD_EFFECT_DAMP_ROCK] = COMPOUND_STRING("Damp Rock"), + [HOLD_EFFECT_GRIP_CLAW] = COMPOUND_STRING("Grip Claw"), + [HOLD_EFFECT_HEAT_ROCK] = COMPOUND_STRING("Heat Rock"), + [HOLD_EFFECT_ICY_ROCK] = COMPOUND_STRING("Icy Rock"), + [HOLD_EFFECT_LIGHT_CLAY] = COMPOUND_STRING("Light Clay"), + [HOLD_EFFECT_SMOOTH_ROCK] = COMPOUND_STRING("Smooth Rock"), + [HOLD_EFFECT_POWER_HERB] = COMPOUND_STRING("Power Herb"), + [HOLD_EFFECT_BIG_ROOT] = COMPOUND_STRING("Big Root"), + [HOLD_EFFECT_EXPERT_BELT] = COMPOUND_STRING("Expert Belt"), + [HOLD_EFFECT_LIFE_ORB] = COMPOUND_STRING("Life Orb"), + [HOLD_EFFECT_METRONOME] = COMPOUND_STRING("Metronome"), + [HOLD_EFFECT_MUSCLE_BAND] = COMPOUND_STRING("Muscle Band"), + [HOLD_EFFECT_WIDE_LENS] = COMPOUND_STRING("Wide Lens"), + [HOLD_EFFECT_WISE_GLASSES] = COMPOUND_STRING("Wise Glasses"), + [HOLD_EFFECT_ZOOM_LENS] = COMPOUND_STRING("Zoom Lens"), + [HOLD_EFFECT_LAGGING_TAIL] = COMPOUND_STRING("Lagging Tail"), + [HOLD_EFFECT_FOCUS_SASH] = COMPOUND_STRING("Focus Sash"), + [HOLD_EFFECT_FLAME_ORB] = COMPOUND_STRING("Flame Orb"), + [HOLD_EFFECT_TOXIC_ORB] = COMPOUND_STRING("Toxic Orb"), + [HOLD_EFFECT_STICKY_BARB] = COMPOUND_STRING("Sticky Barb"), + [HOLD_EFFECT_IRON_BALL] = COMPOUND_STRING("Iron Ball"), + [HOLD_EFFECT_BLACK_SLUDGE] = COMPOUND_STRING("Black Sludge"), + [HOLD_EFFECT_DESTINY_KNOT] = COMPOUND_STRING("Destiny Knot"), + [HOLD_EFFECT_SHED_SHELL] = COMPOUND_STRING("Shed Shell"), + [HOLD_EFFECT_QUICK_POWDER] = COMPOUND_STRING("Quick Powder"), + [HOLD_EFFECT_ADAMANT_ORB] = COMPOUND_STRING("Adamant Orb"), + [HOLD_EFFECT_LUSTROUS_ORB] = COMPOUND_STRING("Lustrous Orb"), + [HOLD_EFFECT_GRISEOUS_ORB] = COMPOUND_STRING("Griseous Orb"), + [HOLD_EFFECT_ENIGMA_BERRY] = COMPOUND_STRING("Enigma Berry"), + [HOLD_EFFECT_RESIST_BERRY] = COMPOUND_STRING("Resist Berry"), + [HOLD_EFFECT_POWER_ITEM] = COMPOUND_STRING("Power Item"), + [HOLD_EFFECT_RESTORE_PCT_HP] = COMPOUND_STRING("Restore Pct Hp"), + [HOLD_EFFECT_MICLE_BERRY] = COMPOUND_STRING("Micle Berry"), + [HOLD_EFFECT_CUSTAP_BERRY] = COMPOUND_STRING("Custap Berry"), + [HOLD_EFFECT_JABOCA_BERRY] = COMPOUND_STRING("Jaboca Berry"), + [HOLD_EFFECT_ROWAP_BERRY] = COMPOUND_STRING("Rowap Berry"), + [HOLD_EFFECT_KEE_BERRY] = COMPOUND_STRING("Kee Berry"), + [HOLD_EFFECT_MARANGA_BERRY] = COMPOUND_STRING("Maranga Berry"), + [HOLD_EFFECT_PLATE] = COMPOUND_STRING("Plate"), + [HOLD_EFFECT_FLOAT_STONE] = COMPOUND_STRING("Float Stone"), + [HOLD_EFFECT_EVIOLITE] = COMPOUND_STRING("Eviolite"), + [HOLD_EFFECT_ASSAULT_VEST] = COMPOUND_STRING("Assault Vest"), + [HOLD_EFFECT_DRIVE] = COMPOUND_STRING("Drive"), + [HOLD_EFFECT_GEMS] = COMPOUND_STRING("Gems"), + [HOLD_EFFECT_ROCKY_HELMET] = COMPOUND_STRING("Rocky Helmet"), + [HOLD_EFFECT_AIR_BALLOON] = COMPOUND_STRING("Air Balloon"), + [HOLD_EFFECT_RED_CARD] = COMPOUND_STRING("Red Card"), + [HOLD_EFFECT_RING_TARGET] = COMPOUND_STRING("Ring Target"), + [HOLD_EFFECT_BINDING_BAND] = COMPOUND_STRING("Binding Band"), + [HOLD_EFFECT_EJECT_BUTTON] = COMPOUND_STRING("Eject Button"), + [HOLD_EFFECT_ABSORB_BULB] = COMPOUND_STRING("Absorb Bulb"), + [HOLD_EFFECT_CELL_BATTERY] = COMPOUND_STRING("Cell Battery"), + [HOLD_EFFECT_MEGA_STONE] = COMPOUND_STRING("Mega Stone"), + [HOLD_EFFECT_SAFETY_GOGGLES] = COMPOUND_STRING("Safety Goggles"), + [HOLD_EFFECT_LUMINOUS_MOSS] = COMPOUND_STRING("Luminous Moss"), + [HOLD_EFFECT_SNOWBALL] = COMPOUND_STRING("Snowball"), + [HOLD_EFFECT_WEAKNESS_POLICY] = COMPOUND_STRING("Weakness Policy"), + [HOLD_EFFECT_PRIMAL_ORB] = COMPOUND_STRING("Primal Orb"), + [HOLD_EFFECT_PROTECTIVE_PADS] = COMPOUND_STRING("Protective Pads"), + [HOLD_EFFECT_TERRAIN_EXTENDER] = COMPOUND_STRING("Terrain Extender"), + [HOLD_EFFECT_SEEDS] = COMPOUND_STRING("Seeds"), + [HOLD_EFFECT_ADRENALINE_ORB] = COMPOUND_STRING("Adrenaline Orb"), + [HOLD_EFFECT_MEMORY] = COMPOUND_STRING("Memory"), + [HOLD_EFFECT_Z_CRYSTAL] = COMPOUND_STRING("Z-Crystal"), + [HOLD_EFFECT_UTILITY_UMBRELLA] = COMPOUND_STRING("Utility Umbrella"), + [HOLD_EFFECT_EJECT_PACK] = COMPOUND_STRING("Eject Pack"), + [HOLD_EFFECT_ROOM_SERVICE] = COMPOUND_STRING("Room Service"), + [HOLD_EFFECT_BLUNDER_POLICY] = COMPOUND_STRING("Blunder Policy"), + [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = COMPOUND_STRING("Heavy Duty Boots"), + [HOLD_EFFECT_THROAT_SPRAY] = COMPOUND_STRING("Throat Spray"), + [HOLD_EFFECT_ABILITY_SHIELD] = COMPOUND_STRING("Ability Shield"), + [HOLD_EFFECT_CLEAR_AMULET] = COMPOUND_STRING("Clear Amulet"), + [HOLD_EFFECT_MIRROR_HERB] = COMPOUND_STRING("Mirror Herb"), + [HOLD_EFFECT_PUNCHING_GLOVE] = COMPOUND_STRING("Punching Glove"), + [HOLD_EFFECT_COVERT_CLOAK] = COMPOUND_STRING("Covert Cloak"), + [HOLD_EFFECT_LOADED_DICE] = COMPOUND_STRING("Loaded Dice"), + [HOLD_EFFECT_BOOSTER_ENERGY] = COMPOUND_STRING("Booster Energy"), + [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Ogerpon Mask"), + [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Berserk Gene"), }; static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect) { - if (holdEffect > ARRAY_COUNT(sHoldEffectNames)) + if (sHoldEffectNames[holdEffect] == NULL) return sHoldEffectNames[0]; return sHoldEffectNames[holdEffect]; } From ab1838ffd88c5d26f0d2fa1402f121eff1ff0194 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:56:03 +0200 Subject: [PATCH 063/248] Repurposes IsMagicGuardProtected into a general function (#7114) --- include/battle_util.h | 2 +- src/battle_end_turn.c | 31 +++------ src/battle_main.c | 2 +- src/battle_script_commands.c | 21 +++--- src/battle_util.c | 126 +++++++++++++++++++++++------------ 5 files changed, 105 insertions(+), 77 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 24519ce022..8201d19432 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -236,7 +236,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); u8 GetImprisonedMovesCount(u32 battler, u16 move); s32 GetDrainedBigRootHp(u32 battler, s32 hp); -bool32 IsMagicGuardProtected(u32 battler, u32 ability); +bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck); u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 6cf45ded4d..11ccfdf745 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -108,15 +108,6 @@ enum FourthEventBlock FOURTH_EVENT_BLOCK_EJECT_PACK, }; -static inline bool32 IsBattlerProtectedByMagicGuard(u32 battler, u32 ability) -{ - if (ability != ABILITY_MAGIC_GUARD) - return FALSE; - - RecordAbilityBattle(battler, ability); - return TRUE; -} - static u32 GetBattlerSideForMessage(u32 side) { u32 battler = 0; @@ -244,7 +235,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; if (gBattleStruct->moveDamage[battler] == 0) @@ -268,7 +259,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; if (gBattleStruct->moveDamage[battler] == 0) @@ -443,7 +434,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) { if (IsBattlerAlive(battler) && !IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattlerAttacker = battler; gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; @@ -583,7 +574,7 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) if (gStatuses3[battler] & STATUS3_LEECHSEED && IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER) && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. gBattleScripting.animArg1 = gBattlerTarget; @@ -622,7 +613,7 @@ static bool32 HandleEndTurnPoison(u32 battler) if ((gBattleMons[battler].status1 & STATUS1_POISON || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { if (ability == ABILITY_POISON_HEAL) { @@ -670,7 +661,7 @@ static bool32 HandleEndTurnBurn(u32 battler) if (gBattleMons[battler].status1 & STATUS1_BURN && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, ability)) + && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) @@ -696,7 +687,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler) if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (gBattleStruct->moveDamage[battler] == 0) @@ -716,7 +707,7 @@ static bool32 HandleEndTurnNightmare(u32 battler) if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { if (gBattleMons[battler].status1 & STATUS1_SLEEP) { @@ -743,7 +734,7 @@ static bool32 HandleEndTurnCurse(u32 battler) if (gBattleMons[battler].status2 & STATUS2_CURSED && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; if (gBattleStruct->moveDamage[battler] == 0) @@ -765,7 +756,7 @@ static bool32 HandleEndTurnWrap(u32 battler) { if (--gDisableStructs[battler].wrapTurns != 0) { - if (IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) return effect; gBattleScripting.animArg1 = gBattleStruct->wrappedMove[battler]; @@ -800,7 +791,7 @@ static bool32 HandleEndTurnSaltCure(u32 battler) if (gStatuses4[battler] & STATUS4_SALT_CURE && IsBattlerAlive(battler) - && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; diff --git a/src/battle_main.c b/src/battle_main.c index ebf1ce36c6..98697e4f97 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4810,7 +4810,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) { priority++; } - else if (ability == ABILITY_PRANKSTER && IsBattleMoveStatus(move)) + else if (IsBattleMoveStatus(move) && IsAbilityAndRecord(battler, ability, ABILITY_PRANKSTER)) { gProtectStructs[battler].pranksterElevated = 1; priority++; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 23c0aeaa0d..6ad315d144 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3090,11 +3090,8 @@ u8 GetBattlerTurnOrderNum(u8 battler) static void CheckSetUnburden(u8 battler) { - if (GetBattlerAbility(battler) == ABILITY_UNBURDEN) - { + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_UNBURDEN)) gDisableStructs[battler].unburdenActive = TRUE; - RecordAbilityBattle(battler, ABILITY_UNBURDEN); - } } // battlerStealer steals the item of battlerItem @@ -6331,7 +6328,7 @@ static void Cmd_moveend(void) case PROTECT_SPIKY_SHIELD: if (moveEffect != EFFECT_COUNTER && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) - && !IsMagicGuardProtected(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; @@ -12924,11 +12921,11 @@ static void Cmd_tryKO(void) } else { - if ((((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS) + if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level + && ((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) - || GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - || targetAbility == ABILITY_NO_GUARD) - && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + || IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_NO_GUARD) + || IsAbilityAndRecord(gBattlerTarget, targetAbility, ABILITY_NO_GUARD))) { lands = TRUE; } @@ -15458,7 +15455,7 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; else if (MoveIgnoresSubstitute(move)) return FALSE; - else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) + else if (IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_INFILTRATOR)) return FALSE; else return TRUE; @@ -15470,7 +15467,7 @@ bool32 DoesDisguiseBlockMove(u32 battler, u32 move) || gBattleMons[battler].status2 & STATUS2_TRANSFORMED || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_DAMAGE)) || gHitMarker & HITMARKER_IGNORE_DISGUISE - || GetBattlerAbility(battler) != ABILITY_DISGUISE) + || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) return FALSE; else return TRUE; @@ -17758,7 +17755,7 @@ void BS_TryGulpMissile(void) if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) && (gCurrentMove == MOVE_DIVE) - && (GetBattlerAbility(gBattlerAttacker) == ABILITY_GULP_MISSILE) + && GetBattlerAbility(gBattlerAttacker) == ABILITY_GULP_MISSILE && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) gBattlescriptCurrInstr = BattleScript_GulpMissileFormChange; else diff --git a/src/battle_util.c b/src/battle_util.c index 8d6504d186..52aa01c535 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -310,8 +310,8 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) || (!IsBattlerAlive(gSideTimers[defSide].followmeTarget) && !IsDragonDartsSecondHit(effect)) || effect == EFFECT_SNIPE_SHOT || effect == EFFECT_SKY_DROP - || ability == ABILITY_PROPELLER_TAIL - || ability == ABILITY_STALWART) + || IsAbilityAndRecord(battlerAtk, ability, ABILITY_PROPELLER_TAIL) + || IsAbilityAndRecord(battlerAtk, ability, ABILITY_STALWART)) return FALSE; if (effect == EFFECT_PURSUIT && IsPursuitTargetSet()) @@ -346,6 +346,7 @@ bool32 HandleMoveTargetRedirection(void) || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) { // Find first battler that redirects the move (in turn order) + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); u32 battler; for (battler = 0; battler < gBattlersCount; battler++) { @@ -358,8 +359,8 @@ bool32 HandleMoveTargetRedirection(void) && GetBattlerTurnOrderNum(battler) < redirectorOrderNum && moveEffect != EFFECT_SNIPE_SHOT && moveEffect != EFFECT_PLEDGE - && GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL - && GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART) + && !IsAbilityAndRecord(gBattlerAttacker, abilityAtk, ABILITY_PROPELLER_TAIL) + && !IsAbilityAndRecord(gBattlerAttacker, abilityAtk, ABILITY_STALWART)) { redirectorOrderNum = GetBattlerTurnOrderNum(battler); } @@ -1062,8 +1063,8 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. - if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO - || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + || IsAbilityAndRecord(otherSkyDropper, GetBattlerAbility(otherSkyDropper), ABILITY_OWN_TEMPO) || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status @@ -1675,13 +1676,11 @@ bool32 MoodyCantLowerStat(u32 stat) void TryToRevertMimicryAndFlags(void) { - u32 i; - - for (i = 0; i < gBattlersCount; i++) + for (u32 battler = 0; battler < gBattlersCount; battler++) { - gDisableStructs[i].terrainAbilityDone = FALSE; - if (GetBattlerAbility(i) == ABILITY_MIMICRY) - RESTORE_BATTLER_TYPE(i); + gDisableStructs[battler].terrainAbilityDone = FALSE; + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MIMICRY)) + RESTORE_BATTLER_TYPE(battler); } } @@ -1717,13 +1716,13 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp) return hp * -1; } -// This should always be the last check. Otherwise the ability might be recorded when it is not supposed to be -bool32 IsMagicGuardProtected(u32 battler, u32 ability) +// Should always be the last check. Otherwise the ability might be wrongly recorded. +bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck) { - if (ability != ABILITY_MAGIC_GUARD) + if (battlerAbility != abilityToCheck) return FALSE; - RecordAbilityBattle(battler, ability); + RecordAbilityBattle(battler, abilityToCheck); return TRUE; } @@ -1919,7 +1918,7 @@ static void CancellerAsleep(u32 *effect) else { u8 toSub; - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_EARLY_BIRD) + if (IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_EARLY_BIRD)) toSub = 2; else toSub = 1; @@ -2196,7 +2195,7 @@ static void CancellerParalysed(u32 *effect) { if (!gBattleStruct->isAtkCancelerForCalledMove && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) - && !(B_MAGIC_GUARD == GEN_4 && GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD) + && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; @@ -2309,7 +2308,7 @@ static void CancellerPowderStatus(u32 *effect) if (TryActivatePowderStatus(gCurrentMove)) { gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE @@ -4727,9 +4726,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_OBLIVIOUS && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); @@ -5351,8 +5350,16 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) if (gStatuses3[battler] & STATUS3_GASTRO_ACID) return FALSE; - return (ability == ABILITY_MOLD_BREAKER || ability == ABILITY_TERAVOLT || ability == ABILITY_TURBOBLAZE - || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))); + if (ability == ABILITY_MOLD_BREAKER + || ability == ABILITY_TERAVOLT + || ability == ABILITY_TURBOBLAZE + || (ability == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gCurrentMove))) + { + RecordAbilityBattle(battler, ability); + return TRUE; + } + + return FALSE; } static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield, u32 ignoreMoldBreaker) @@ -5815,9 +5822,9 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonV bool32 CanBeConfused(u32 battler) { - if (GetBattlerAbility(battler) == ABILITY_OWN_TEMPO - || gBattleMons[battler].status2 & STATUS2_CONFUSION - || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) + if (gBattleMons[battler].status2 & STATUS2_CONFUSION + || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + || IsAbilityAndRecord(battler, GetBattlerAbility(battler),ABILITY_OWN_TEMPO)) return FALSE; return TRUE; } @@ -5837,12 +5844,10 @@ bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId) if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / hpFraction) return TRUE; - if (hpFraction <= 4 && GetBattlerAbility(battler) == ABILITY_GLUTTONY && isBerry - && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2) - { - RecordAbilityBattle(battler, ABILITY_GLUTTONY); + if (hpFraction <= 4 && isBerry + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2 + && IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_GLUTTONY)) return TRUE; - } return FALSE; } @@ -7057,9 +7062,9 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && !IsBattleMoveStatus(gCurrentMove) && (IsBattlerTurnDamaged(gBattlerTarget) || !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Needs the second check in case of Substitute - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && !IsFutureSightAttackerInParty(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + && !IsFutureSightAttackerInParty(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) @@ -7628,7 +7633,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) { if (IsZMove(move) || IsMaxMove(move)) return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). - if (IsMoveMakingContact(move, battlerAtk) && GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST) + if (IsMoveMakingContact(move, battlerAtk) && IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_UNSEEN_FIST)) return FALSE; } @@ -7727,7 +7732,7 @@ static bool32 IsBattlerGroundedInverseCheck(u32 battler, enum InverseBattleCheck return FALSE; if (holdEffect == HOLD_EFFECT_AIR_BALLOON) return FALSE; - if ((gAiLogicData->aiCalcInProgress ? gAiLogicData->abilities[battler] : GetBattlerAbility(battler)) == ABILITY_LEVITATE) + if (gAiLogicData->aiCalcInProgress ? gAiLogicData->abilities[battler] == ABILITY_LEVITATE : IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_LEVITATE)) return FALSE; if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (!(checkInverse == INVERSE_BATTLE) || !FlagGet(B_FLAG_INVERSE_BATTLE))) return FALSE; @@ -9094,10 +9099,20 @@ static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(ctx->move); bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; - if (ctx->isCrit || ctx->abilityAtk == ABILITY_INFILTRATOR || gProtectStructs[ctx->battlerAtk].confusionSelfDmg) + if (ctx->isCrit || gProtectStructs[ctx->battlerAtk].confusionSelfDmg) + { return UQ_4_12(1.0); + } + if (ctx->abilityAtk == ABILITY_INFILTRATOR) + { + if (ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef); + return UQ_4_12(1.0); + } if (reflect || lightScreen || auroraVeil) + { return (IsDoubleBattle()) ? UQ_4_12(0.667) : UQ_4_12(0.5); + } return UQ_4_12(1.0); } @@ -9130,35 +9145,60 @@ static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typ static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx) { + bool32 recordAbility = FALSE; + uq4_12_t modifier = UQ_4_12(1.0); + switch (ctx->abilityDef) { case ABILITY_MULTISCALE: case ABILITY_SHADOW_SHIELD: if (IsBattlerAtMaxHp(ctx->battlerDef)) - return UQ_4_12(0.5); + { + modifier = UQ_4_12(0.5); + recordAbility = TRUE; + } break; case ABILITY_FILTER: case ABILITY_SOLID_ROCK: case ABILITY_PRISM_ARMOR: if (ctx->typeEffectivenessModifier >= UQ_4_12(2.0)) - return UQ_4_12(0.75); + { + modifier = UQ_4_12(0.75); + recordAbility = TRUE; + } break; case ABILITY_FLUFFY: if (!IsMoveMakingContact(ctx->move, ctx->battlerAtk) && ctx->moveType == TYPE_FIRE) - return UQ_4_12(2.0); - if (IsMoveMakingContact(ctx->move, ctx->battlerAtk) && ctx->moveType != TYPE_FIRE) - return UQ_4_12(0.5); + { + modifier = UQ_4_12(2.0); + recordAbility = TRUE; + } + else if (IsMoveMakingContact(ctx->move, ctx->battlerAtk) && ctx->moveType != TYPE_FIRE) + { + modifier = UQ_4_12(0.5); + recordAbility = TRUE; + } break; case ABILITY_PUNK_ROCK: if (IsSoundMove(ctx->move)) - return UQ_4_12(0.5); + { + modifier = UQ_4_12(0.5); + recordAbility = TRUE; + } break; case ABILITY_ICE_SCALES: if (IsBattleMoveSpecial(ctx->move)) - return UQ_4_12(0.5); + { + modifier = UQ_4_12(0.5); + recordAbility = TRUE; + } break; } - return UQ_4_12(1.0); + + if (recordAbility && ctx->updateFlags) + RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef); + + return modifier; } static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef) From 340d815c6d468f404facbee46e24fdb38a7d3196 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:24:35 +0100 Subject: [PATCH 064/248] Stat Change (Animation) Refactor (#7144) --- asm/macros/battle_script.inc | 17 +- data/battle_scripts_1.s | 548 +++++---------------- data/battle_scripts_2.s | 2 - include/battle_scripts.h | 1 - include/battle_util.h | 1 + include/config/battle.h | 1 + include/constants/battle_script_commands.h | 9 +- include/constants/generational_changes.h | 1 + include/generational_changes.h | 1 + src/battle_script_commands.c | 383 +++++++------- src/battle_util.c | 21 +- test/battle/ability/contrary.c | 14 +- test/battle/ability/defiant.c | 33 +- test/battle/ability/opportunist.c | 2 - test/battle/ability/weak_armor.c | 2 +- test/battle/move_animations/all_anims.c | 49 ++ 16 files changed, 398 insertions(+), 687 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c899901eae..8cc9e8892b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -408,15 +408,12 @@ .4byte \argPtr .endm - .macro setgraphicalstatchangevalues + .macro unused_0x47 .byte 0x47 .endm - .macro playstatchangeanimation battler:req, stats:req, flags:req + .macro unused_0x48 .byte 0x48 - .byte \battler - .byte \stats - .byte \flags .endm .macro moveend endMode:req, endState:req @@ -770,10 +767,11 @@ .byte 0x88 .endm - .macro statbuffchange flags:req, failInstr:req + .macro statbuffchange flags:req, failInstr:req, stats=0 .byte 0x89 .2byte \flags .4byte \failInstr + .byte \stats .endm .macro normalisebuffs @@ -2516,11 +2514,10 @@ ANIM_ON = TRUE setstatchanger \stat, \amount, \mode - statbuffchange STAT_CHANGE_ALLOW_PTR, \script - setgraphicalstatchangevalues - .if \animation == TRUE - playanimation \battler, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + .if \animation == FALSE + setbyte sSTAT_ANIM_PLAYED, TRUE .endif + statbuffchange STAT_CHANGE_ALLOW_PTR, \script .ifnb \customString printstring \customString .else diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 576f53217e..18e46d09b6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -65,29 +65,23 @@ BattleScript_LowerAtkSpAtk:: jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkDoAnim jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd BattleScript_LowerAtkSpAtkDoAnim:: - playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_EFFECT_BATTLER, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkTrySpAtk:: - playstatchangeanimation BS_EFFECT_BATTLER, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerAtkSpAtkEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_EffectSpicyExtract:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE BattleScript_SpicyExtract_CheckShouldSkipAttackAnim + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim goto BattleScript_ButItFailed BattleScript_SpicyExtract_CheckShouldSkipAttackAnim: @@ -102,21 +96,16 @@ BattleScript_SpicyExtract_RaiseAtk: attackanimation waitanimation BattleScript_SpicyExtract_SkipAttackAnim: - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectSpicyExtractDefenseDown printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtractDefenseDown: - playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_EffectSpicyExtract_End printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtract_End: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectTidyUp:: @@ -185,20 +174,16 @@ BattleScript_FilletAwayTryAttack:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk, BIT_SPATK | BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpAtk:: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed, BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd printfromtable gStatUpStringIds @@ -207,7 +192,6 @@ BattleScript_FilletAwayEnd:: clearmoveresultflags MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectDoodle:: @@ -508,10 +492,6 @@ BattleScript_EffectAttackUpUserAlly_Works: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAllyUser_PrintString - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_EffectAttackUpUserAllyUser_PrintString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAttackUpUserAlly_TryAlly: @@ -522,14 +502,12 @@ BattleScript_EffectAttackUpUserAlly_TryAlly_: 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 + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAlly_AllyString pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectAttackUpUserAlly_End -BattleScript_EffectAttackUpUserAlly_AllyAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_EffectAttackUpUserAlly_AllyString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_EffectAttackUpUserAlly_End @@ -572,7 +550,7 @@ BattleScript_Teatimevul: goto BattleScript_MoveEnd BattleScript_Teatimesorb: call BattleScript_AbilityPopUpTarget - tryhealquarterhealth BS_TARGET BattleScript_Teatimesorb_end + tryhealquarterhealth BS_TARGET, BattleScript_Teatimesorb_end healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNREGAINEDHEALTH @@ -584,7 +562,6 @@ BattleScript_Teatimesorb_end: goto BattleScript_MoveEnd BattleScript_Teatimerod: call BattleScript_AbilityPopUpTarget - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer @@ -596,7 +573,6 @@ BattleScript_Teatimerod: goto BattleScript_MoveEnd BattleScript_Teatimemotor: call BattleScript_AbilityPopUpTarget - playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer @@ -870,20 +846,16 @@ BattleScript_EffectOctolock:: goto BattleScript_MoveEnd BattleScript_OctolockEndTurn:: - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef, BIT_SPDEF printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctolockTryLowerSpDef: - playstatchangeanimation BS_TARGET, BIT_SPDEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPDEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctlockTurnDmgEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE end2 BattleScript_EffectPoltergeist:: @@ -907,8 +879,6 @@ BattleScript_EffectTarShot:: attackanimation waitanimation statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TryTarShot - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TryTarShot: @@ -992,9 +962,6 @@ BattleScript_EffectStuffCheeks:: removeitem BS_ATTACKER setstatchanger STAT_DEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd - setgraphicalstatchangevalues - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StuffCheeksEnd @ cant raise def - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StuffCheeksEnd: @@ -1011,21 +978,17 @@ BattleScript_EffectDecorate:: BattleScript_DecorateBoost: attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DecorateBoostSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DecorateBoostSpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCoaching:: @@ -1044,21 +1007,17 @@ EffectCoaching_CheckAllyStats: BattleScript_CoachingWorks: attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoachingBoostDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoachingBoostDef: - playstatchangeanimation BS_TARGET, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectJungleHealing:: @@ -1182,13 +1141,11 @@ BattleScript_EffectStrengthSap:: BattleScript_StrengthSapTryLower: getstatvalue BS_TARGET, STAT_ATK jumpiffullhp BS_ATTACKER, BattleScript_StrengthSapMustLower +BattleScript_StrengthSapAnimation: attackanimation waitanimation statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StrengthSapHp -BattleScript_StrengthSapLower: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @ Drain HP without lowering a stat @@ -1216,11 +1173,9 @@ BattleScript_StrengthSapLiquidOoze: tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_StrengthSapMustLower: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_MoveEnd - attackanimation - waitanimation - goto BattleScript_StrengthSapLower + goto BattleScript_StrengthSapAnimation BattleScript_MoveEffectIncinerate:: printstring STRINGID_INCINERATEBURN @@ -1266,29 +1221,24 @@ BattleScript_VCreateStatLoss:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_VCreateStatLossRet BattleScript_VCreateStatAnim: - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_SpectralThiefSteal:: @@ -1299,7 +1249,6 @@ BattleScript_SpectralThiefSteal:: printstring STRINGID_SPECTRALTHIEFSTEAL waitmessage B_WAIT_TIME_LONG setbyte sB_ANIM_ARG2, 0 - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 spectralthiefprintstats flushtextbox goto BattleScript_EffectSpectralThiefFromDamage @@ -1330,20 +1279,16 @@ BattleScript_EffectPartingShotTryAtk: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotTrySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotSwitch printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: - setbyte sSTAT_ANIM_PLAYED, FALSE moveendall goto BattleScript_MoveSwitchPursuitEnd @@ -1369,21 +1314,19 @@ BattleScript_EffectAromaticMist:: goto BattleScript_ButItFailed BattleScript_EffectAromaticMistWorks: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AromaticMistAnim - pause B_WAIT_TIME_SHORTEST - printstring STRINGID_TARGETSTATWONTGOHIGHER - waitmessage B_WAIT_TIME_LONG - goto BattleScript_EffectAromaticMistEnd -BattleScript_AromaticMistAnim: + statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_EffectAromaticMistWontGoHigher attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAromaticMistEnd: goto BattleScript_MoveEnd +BattleScript_EffectAromaticMistWontGoHigher: + pause B_WAIT_TIME_SHORTEST + printstring STRINGID_TARGETSTATWONTGOHIGHER + waitmessage B_WAIT_TIME_LONG + goto BattleScript_EffectAromaticMistEnd BattleScript_EffectMagneticFlux:: attackcanceler @@ -1402,16 +1345,13 @@ BattleScript_EffectMagneticFluxTryDef: attackanimation waitanimation BattleScript_EffectMagneticFluxSkipAnim: - playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxTrySpDef addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxTrySpDef: - playstatchangeanimation BS_TARGET, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxLoop @@ -1419,7 +1359,6 @@ BattleScript_EffectMagneticFluxTrySpDef: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxLoop: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectMagneticFluxEnd setallytonexttarget BattleScript_EffectMagneticFluxStart BattleScript_EffectMagneticFluxEnd: @@ -1443,16 +1382,13 @@ BattleScript_EffectGearUpTryAtk: attackanimation waitanimation BattleScript_EffectGearUpSkipAnim: - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpTrySpAtk addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpTrySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpLoop @@ -1460,7 +1396,6 @@ BattleScript_EffectGearUpTrySpAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpLoop: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectGearUpEnd setallytonexttarget BattleScript_EffectGearUpStart BattleScript_EffectGearUpEnd: @@ -1477,8 +1412,6 @@ BattleScript_EffectAcupressureTry: tryaccupressure BS_TARGET, BattleScript_ButItFailed attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 statbuffchange MOVE_EFFECT_CERTAIN, BattleScript_MoveEnd printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG @@ -1518,7 +1451,7 @@ BattleScript_FlowerShieldLoop: goto BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldLoop2: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_FlowerShieldMoveTargetEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlowerShieldDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd pause 21 @@ -1526,8 +1459,7 @@ BattleScript_FlowerShieldLoop2: BattleScript_FlowerShieldDoAnim: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1552,22 +1484,18 @@ BattleScript_RototillerLoop: jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats BattleScript_RototillerCheckAffected: jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: - playstatchangeanimation BS_TARGET, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerMoveTargetEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerMoveTargetEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE moveendto MOVEEND_NEXT_TARGET addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RototillerLoop @@ -1722,7 +1650,7 @@ BattleScript_DefogWorks: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazardsWithAnim + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefogDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_DefogTryHazardsWithAnim pause B_WAIT_TIME_SHORT @@ -1730,8 +1658,7 @@ BattleScript_DefogWorks: BattleScript_DefogDoAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazards BattleScript_DefogPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1776,15 +1703,14 @@ BattleScript_EffectAutotomize:: attackcanceler attackstring ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AutotomizeAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_AutotomizePrintString BattleScript_AutotomizeAttackAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss BattleScript_AutotomizePrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1818,12 +1744,12 @@ BattleScript_EffectToxicThread:: attackcanceler jumpifsubstituteblocks BattleScript_FailedFromAtkString jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_ToxicThreadWorks - jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_FailedFromAtkString + jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_FailedFromAtkString BattleScript_ToxicThreadWorks: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ToxicThreadTryPsn jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_ToxicThreadDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_ToxicThreadTryPsn pause B_WAIT_TIME_SHORT @@ -1831,8 +1757,7 @@ BattleScript_ToxicThreadWorks: BattleScript_ToxicThreadDoAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn BattleScript_ToxicThreadPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1854,29 +1779,24 @@ BattleScript_VenomDrenchDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk, BIT_SPATK | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpAtk:: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpeed:: - playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPEED, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectNobleRoar:: @@ -1889,22 +1809,18 @@ BattleScript_NobleRoarDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarTryLowerSpAtk:: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectShellSmash:: @@ -1919,45 +1835,36 @@ BattleScript_EffectShellSmash:: BattleScript_ShellSmashTryDef:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpDef: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTryAttack jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTryAttack printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTryAttack: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_ATK | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk, BIT_SPATK | BIT_SPEED, jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpAtk: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpeed: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectLastResort:: @@ -1978,26 +1885,20 @@ BattleScript_GrowthDoMoveAnim:: attackanimation waitanimation jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2 - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE goto BattleScript_GrowthAtk BattleScript_GrowthAtk2: - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE BattleScript_GrowthAtk: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2 - playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_GrowthSpAtk BattleScript_GrowthSpAtk2: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE BattleScript_GrowthSpAtk: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd @@ -2005,7 +1906,6 @@ BattleScript_GrowthSpAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectSoak:: @@ -2057,28 +1957,22 @@ BattleScript_ShiftGearDoMoveAnim: attackanimation waitanimation jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, 10, BattleScript_ShiftGearSpeedBy1 - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_ShiftGearDoSpeed BattleScript_ShiftGearSpeedBy1: - playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE BattleScript_ShiftGearDoSpeed: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk, BIT_ATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearTryAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearTryAtk: - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCoil:: @@ -2091,29 +1985,24 @@ BattleScript_EffectCoil:: BattleScript_CoilDoMoveAnim: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef, BIT_DEF | BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryDef: - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc, BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryAcc: - playstatchangeanimation BS_ATTACKER, BIT_ACC, 0 setstatchanger STAT_ACC, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectQuiverDance:: @@ -2126,29 +2015,24 @@ BattleScript_EffectQuiverDance:: BattleScript_QuiverDanceDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectVictoryDance:: @@ -2161,29 +2045,24 @@ BattleScript_EffectVictoryDance:: BattleScript_VictoryDanceDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef, BIT_DEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTryDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTrySpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectMeFirst:: @@ -2203,22 +2082,18 @@ BattleScript_EffectAttackSpAttackUp:: BattleScript_AttackSpAttackUpDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpTrySpAtk:: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectAttackAccUp:: @@ -2230,22 +2105,18 @@ BattleScript_EffectAttackAccUp:: BattleScript_AttackAccUpDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_ACC, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc, BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpTryAcc:: - playstatchangeanimation BS_ATTACKER, BIT_ACC, 0 setstatchanger STAT_ACC, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectMistyTerrain:: @@ -3099,7 +2970,7 @@ BattleScript_EffectStatUp:: BattleScript_EffectStatUpAfterAtkCanceler:: attackstring ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_StatUpPrintString @@ -3107,8 +2978,7 @@ BattleScript_StatUpAttackAnim:: attackanimation waitanimation BattleScript_StatUpDoAnim:: - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd BattleScript_StatUpPrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -3116,8 +2986,6 @@ BattleScript_StatUpEnd:: goto BattleScript_MoveEnd BattleScript_StatUp:: - playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_StatUpMsg:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG return @@ -3156,7 +3024,7 @@ BattleScript_StatDownFromAttackString: attackstring ppreduce BattleScript_EffectStatDownFromStatBuffChange: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT @@ -3164,8 +3032,7 @@ BattleScript_EffectStatDownFromStatBuffChange: BattleScript_StatDownDoAnim:: attackanimation waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd bicword gHitMarker, HITMARKER_DISABLE_ANIMATION BattleScript_StatDownPrintString:: printfromtable gStatDownStringIds @@ -3179,11 +3046,8 @@ BattleScript_MirrorArmorReflect:: jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect BattleScript_MirrorArmorReflectStatLoss: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectPrintString goto BattleScript_MirrorArmorReflectWontFall -BattleScript_MirrorArmorReflectAnim: - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_MirrorArmorReflectPrintString: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -3210,7 +3074,6 @@ BattleScript_MirrorArmorReflectStickyWeb: goto BattleScript_StickyWebOnSwitchInEnd BattleScript_StatDown:: - playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG return @@ -3527,7 +3390,7 @@ BattleScript_EffectAuroraVeilSuccess:: BattleScript_VoltAbsorbHeal: copybyte gBattlerAbility, gBattlerTarget - tryhealquarterhealth BS_TARGET BattleScript_MonMadeMoveUseless @ Check if max hp + tryhealquarterhealth BS_TARGET, BattleScript_MonMadeMoveUseless @ Check if max hp goto BattleScript_MoveHPDrain BattleScript_AlreadyParalyzed:: @@ -3571,29 +3434,24 @@ BattleScript_GeomancySecondTurn: BattleScript_GeomancyDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_FirstChargingTurn:: @@ -3993,27 +3851,21 @@ BattleScript_CurseTrySpeed:: setbyte sB_ANIM_TURN, 1 attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_NEGATIVE setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryAttack:: - setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense, BIT_DEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryDefense:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_GhostCurse:: jumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse @@ -4141,8 +3993,6 @@ BattleScript_EffectSwagger:: setstatchanger STAT_ATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SwaggerTryConfuse: @@ -4369,7 +4219,6 @@ BattleScript_EffectBellyDrum:: waitanimation healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, MAX_STAT_STAGE, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printstring STRINGID_PKMNCUTHPMAXEDATTACK @@ -4478,7 +4327,7 @@ BattleScript_EffectDefenseCurl:: ppreduce setdefensecurlbit setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DefenseCurlDoStatUpAnim + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString attackanimation waitanimation @@ -4567,22 +4416,18 @@ BattleScript_EffectStockpile:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_EffectStockpileDef jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_EffectStockpileEnd BattleScript_EffectStockpileDef: - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE stockpile 1 goto BattleScript_MoveEnd @@ -4596,8 +4441,6 @@ BattleScript_MoveEffectStockpileWoreOff:: BattleScript_StockpileStatChangeDown: statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_StockpileStatChangeDown_Ret - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StockpileStatChangeDown_Ret: @@ -4688,8 +4531,6 @@ BattleScript_EffectFlatter:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FlatterTryConfuse:: @@ -4728,16 +4569,13 @@ BattleScript_EffectMemento:: attackanimation waitanimation jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk, BIT_SPATK @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTrySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease @@ -4745,7 +4583,6 @@ BattleScript_EffectMementoTrySpAtk: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTryFaint: - setbyte sSTAT_ANIM_PLAYED, FALSE tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectMementoPrintNoEffect: @@ -4763,7 +4600,6 @@ BattleScript_MementoTargetProtectEnd: effectivenesssound resultmessage waitmessage B_WAIT_TIME_LONG - setbyte sSTAT_ANIM_PLAYED, FALSE tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd @@ -4809,8 +4645,6 @@ BattleScript_EffectCharge:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectChargeString - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectChargeString: @@ -5092,22 +4926,18 @@ BattleScript_TickleDoMoveAnim:: accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleTryLowerDef:: - playstatchangeanimation BS_TARGET, BIT_DEF, STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_CantLowerMultipleStats:: @@ -5126,22 +4956,18 @@ BattleScript_EffectCosmicPower:: BattleScript_CosmicPowerDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectBulkUp:: @@ -5153,22 +4979,18 @@ BattleScript_EffectBulkUp:: BattleScript_BulkUpDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCalmMind:: @@ -5182,22 +5004,18 @@ BattleScript_CalmMindDoMoveAnim:: attackanimation waitanimation BattleScript_CalmMindStatRaise:: - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_CantRaiseMultipleStats:: @@ -5217,22 +5035,18 @@ BattleScript_EffectDragonDanceFromStatUp:: BattleScript_DragonDanceDoMoveAnim:: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPEED, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectCamouflage:: @@ -5891,15 +5705,12 @@ BattleScript_WeaknessPolicy:: BattleScript_WeaknessPolicyAtk: playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicySpAtk printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicySpAtk: - playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicyRemoveItem @@ -5908,18 +5719,15 @@ BattleScript_WeaknessPolicySpAtk: BattleScript_WeaknessPolicyRemoveItem: removeitem BS_TARGET BattleScript_WeaknessPolicyEnd: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_TargetItemStatRaise:: copybyte sBATTLER, gBattlerTarget - statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet + statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_TargetItemStatRaiseRemoveItemRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_TargetItemStatRaiseRemoveItemRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET @@ -5928,13 +5736,11 @@ BattleScript_TargetItemStatRaiseRemoveItemRet: BattleScript_AttackerItemStatRaise:: copybyte sBATTLER, gBattlerAttacker - statbuffchange MOVE_EFFECT_AFFECTS_USER, BattleScript_AttackerItemStatRaiseRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackerItemStatRaiseRet + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerItemStatRaiseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackerItemStatRaiseRet playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange MOVE_EFFECT_AFFECTS_USER, BattleScript_AttackerItemStatRaiseRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER @@ -6083,14 +5889,7 @@ BattleScript_StickyWebOnSwitchIn:: waitmessage B_WAIT_TIME_LONG jumpifability BS_TARGET, ABILITY_MIRROR_ARMOR, BattleScript_MirrorArmorReflectStickyWeb statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StickyWebOnSwitchInStatAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StickyWebOnSwitchInEnd - pause B_WAIT_TIME_SHORT - goto BattleScript_StickyWebOnSwitchInPrintStatMsg -BattleScript_StickyWebOnSwitchInStatAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_StickyWebOnSwitchInPrintStatMsg: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StickyWebOnSwitchInEnd: @@ -6162,11 +5961,9 @@ BattleScript_GulpMissileNoDmgGulping: swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler setstatchanger STAT_DEF, 1, TRUE statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_GulpMissileGulpingEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_GulpMissileGulpingTargetDefenseCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG +BattleScript_GulpMissileGulpingEnd: swapattackerwithtarget @ restore the battlers, just in case return BattleScript_GulpMissileNoSecondEffectGulping: @@ -6174,12 +5971,6 @@ BattleScript_GulpMissileNoSecondEffectGulping: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation return -BattleScript_GulpMissileGulpingTargetDefenseCantGoLower: - printstring STRINGID_STATSWONTDECREASE - waitmessage B_WAIT_TIME_LONG -BattleScript_GulpMissileGulpingEnd: - swapattackerwithtarget @ restore the battlers, just in case - return BattleScript_SeedSowerActivates:: pause B_WAIT_TIME_SHORT @@ -6204,7 +5995,6 @@ BattleScript_AngerShellTryDef:: BattleScript_AngerShellTrySpDef: modifybattlerstatstage BS_ATTACKER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON BattleScript_AngerShellTryAttack: - setbyte sSTAT_ANIM_PLAYED, FALSE modifybattlerstatstage BS_ATTACKER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON BattleScript_AngerShellTrySpAtk: modifybattlerstatstage BS_ATTACKER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON @@ -6212,7 +6002,6 @@ BattleScript_AngerShellTrySpeed: modifybattlerstatstage BS_ATTACKER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON BattleScript_AngerShellRet: restoreattacker - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_WindPowerActivates:: @@ -6261,38 +6050,31 @@ BattleScript_AllStatsUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AllStatsUpAtk jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet BattleScript_AllStatsUpAtk:: - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, 0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, 0 setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpAtk:: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, 0 setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, 0 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpRet:: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_RapidSpinAway:: @@ -6577,55 +6359,44 @@ BattleScript_PrintMonIsRootedRet:: return BattleScript_AtkDefDown:: - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownTryDef: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownRet: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_DefSpDefDown:: - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownTrySpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownRet:: - setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_DefDownSpeedUp:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_DefDownSpeedUpTryDef jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_DefDownSpeedUpRet BattleScript_DefDownSpeedUpTryDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpTrySpeed: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, 0 setstatchanger STAT_SPEED, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpRet @@ -6949,8 +6720,6 @@ BattleScript_CottonDownLoop: jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_CottonDownTargetSpeedCantGoLower - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_CottonDownLoopIncrement @@ -7106,17 +6875,16 @@ BattleScript_PowderMoveNoEffectWaitMsg: BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED waitmessage B_WAIT_TIME_LONG - jumpifability BS_ATTACKER ABILITY_STEADFAST BattleScript_TryActivateSteadFast + waitmessage B_WAIT_TIME_LONG BattleScript_MoveUsedFlinchedEnd: goto BattleScript_MoveEnd BattleScript_TryActivateSteadFast: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveUsedFlinchedEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_MoveUsedFlinchedEnd copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd setbyte gBattleCommunication STAT_SPEED stattextbuffer BS_ATTACKER printstring STRINGID_ATTACKERABILITYSTATRAISE @@ -7385,10 +7153,9 @@ BattleScript_DrizzleActivates:: BattleScript_AbilityRaisesDefenderStat:: pause B_WAIT_TIME_SHORT - statbuffchange 0, BattleScript_AbilityCantRaiseDefenderStat + statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_AbilityCantRaiseDefenderStat call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ABILITY_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange 0, BattleScript_AbilityCantRaiseDefenderStat printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG return @@ -7429,10 +7196,8 @@ BattleScript_AbilityPopUpOverwriteThenNormal: return BattleScript_SpeedBoostActivates:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd printstring STRINGID_PKMNRAISEDSPEED waitmessage B_WAIT_TIME_LONG BattleScript_SpeedBoostActivatesEnd: @@ -7447,8 +7212,6 @@ BattleScript_MoodyActivates:: jumpifbyteequal sSTATCHANGER, sZero, BattleScript_MoodyLower statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_MoodyLower - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyLower: @@ -7456,8 +7219,6 @@ BattleScript_MoodyLower: copybyte sSTATCHANGER, sSAVED_STAT_CHANGER statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_MoodyEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyEnd: @@ -7644,12 +7405,10 @@ BattleScript_ActivateWeatherAbilities_Loop: BattleScript_TryIntimidateHoldEffects: itemstatchangeeffects BS_TARGET jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_ADRENALINE_ORB, BattleScript_TryIntimidateHoldEffectsRet - jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, 12, BattleScript_TryIntimidateHoldEffectsRet + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_TryIntimidateHoldEffectsRet setstatchanger STAT_SPEED, 1, FALSE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet copybyte sBATTLER, gBattlerTarget setlastuseditem BS_TARGET printstring STRINGID_USINGITEMSTATOFPKMNROSE @@ -7676,10 +7435,8 @@ BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_ATK, 1, TRUE statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement - setgraphicalstatchangevalues jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_IntimidateWontDecrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_PKMNCUTSATTACKWITH BattleScript_IntimidateEffect_WaitString: waitmessage B_WAIT_TIME_LONG @@ -7710,14 +7467,8 @@ BattleScript_IntimidateWontDecrease: goto BattleScript_IntimidateEffect_WaitString BattleScript_IntimidateContrary: - call BattleScript_AbilityPopUpTarget - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_IntimidateContrary_WontIncrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds goto BattleScript_IntimidateEffect_WaitString -BattleScript_IntimidateContrary_WontIncrease: - printstring STRINGID_TARGETSTATWONTGOHIGHER - goto BattleScript_IntimidateEffect_WaitString BattleScript_IntimidateInReverse:: copybyte sBATTLER, gBattlerTarget @@ -7746,10 +7497,8 @@ BattleScript_SupersweetSyrupEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_EVASION, 1, TRUE statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement - setgraphicalstatchangevalues jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_SupersweetSyrupContrary jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SupersweetSyrupWontDecrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds BattleScript_SupersweetSyrupEffect_WaitString: waitmessage B_WAIT_TIME_LONG @@ -7770,14 +7519,8 @@ BattleScript_SupersweetSyrupWontDecrease: goto BattleScript_SupersweetSyrupEffect_WaitString BattleScript_SupersweetSyrupContrary: - call BattleScript_AbilityPopUpTarget - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SupersweetSyrupContrary_WontIncrease - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds goto BattleScript_SupersweetSyrupEffect_WaitString -BattleScript_SupersweetSyrupContrary_WontIncrease: - printstring STRINGID_TARGETSTATWONTGOHIGHER - goto BattleScript_SupersweetSyrupEffect_WaitString BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT @@ -7876,36 +7619,30 @@ BattleScript_CommanderActivates:: printstring STRINGID_COMMANDERACTIVATES waitmessage B_WAIT_TIME_LONG BattleScript_CommanderAtkIncrease: - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease, BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderDefIncrease: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease, BIT_SPATK | BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpAtkIncrease: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpDefIncrease: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpeedIncrease: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd @@ -7913,7 +7650,6 @@ BattleScript_CommanderSpeedIncrease: waitmessage B_WAIT_TIME_LONG BattleScript_CommanderEnd: restoreattacker - setbyte sSTAT_ANIM_PLAYED, FALSE end3 BattleScript_HospitalityActivates:: @@ -8089,9 +7825,6 @@ BattleScript_MoveStatDrain:: attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont .if B_ABSORBING_ABILITY_STRING >= GEN_5 printfromtable gStatUpStringIds @@ -8284,22 +8017,20 @@ BattleScript_WanderingSpiritActivatesRet: BattleScript_TargetsStatWasMaxedOut:: call BattleScript_AbilityPopUp - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_TargetsStatWasMaxedOutRet printstring STRINGID_TARGETSSTATWASMAXEDOUT waitmessage B_WAIT_TIME_LONG +BattleScript_TargetsStatWasMaxedOutRet: return BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet waitanimation printstring STRINGID_BATTLERABILITYRAISEDSTAT waitmessage B_WAIT_TIME_LONG +BattleScript_BattlerAbilityStatRaiseOnSwitchInRet: copybyte gBattlerAttacker, sSAVED_BATTLER end3 @@ -8308,12 +8039,10 @@ BattleScript_ScriptingAbilityStatRaise:: call BattleScript_AbilityPopUp saveattacker copybyte gBattlerAttacker, sBATTLER - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL - setgraphicalstatchangevalues - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_ScriptingAbilityStatRaiseRet printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG +BattleScript_ScriptingAbilityStatRaiseRet: restoreattacker return @@ -8321,16 +8050,14 @@ BattleScript_WeakArmorActivates:: call BattleScript_AbilityPopUp setstatchanger STAT_DEF, 1, TRUE statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefPrintString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds clearmoveresultflags MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesSpeed -BattleScript_WeakArmorDefAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_WeakArmorDefPrintString: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesSpeed: @@ -8340,39 +8067,34 @@ BattleScript_WeakArmorActivatesSpeed: setstatchanger STAT_SPEED, 1, FALSE .endif statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedPrintString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER clearmoveresultflags MOVE_RESULT_MISSED waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesEnd -BattleScript_WeakArmorSpeedAnim: - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_WeakArmorSpeedPrintString: printstring STRINGID_TARGETABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesEnd: return BattleScript_RaiseStatOnFaintingTarget:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_RaiseStatOnFaintingTarget_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseStatOnFaintingTarget_End: return BattleScript_AttackerAbilityStatRaise:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - waitanimation + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_AttackerAbilityStatRaise_End: @@ -8381,8 +8103,6 @@ BattleScript_AttackerAbilityStatRaise_End: BattleScript_FellStingerRaisesStat:: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_FellStingerRaisesAtkEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FellStingerRaisesAtkEnd: @@ -8532,15 +8252,14 @@ BattleScript_BattleBondActivatesOnMoveEndAttacker:: BattleScript_EffectBattleBondStatIncrease:: call BattleScript_AbilityPopUp - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk, BIT_SPATK | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -8945,9 +8664,9 @@ BattleScript_ConsumableStatRaiseRet:: BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_ConsumableStatRaiseRet_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End - setgraphicalstatchangevalues + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp removeitem BS_SCRIPTING @@ -9110,24 +8829,26 @@ BattleScript_MirrorHerbCopyStatChange:: printstring STRINGID_MIRRORHERBCOPIED waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_MirrorHerbStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_MirrorHerbStartReturn statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn + setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_MirrorHerbStartCopyStats BattleScript_MirrorHerbStartReturn: + setbyte sSTAT_ANIM_PLAYED, FALSE return BattleScript_OpportunistCopyStatChange:: call BattleScript_AbilityPopUpScripting - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 BattleScript_OpportunistStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_OpportunistCopyStatChangeEnd statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG + setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_OpportunistStartCopyStats BattleScript_OpportunistCopyStatChangeEnd: + setbyte sSTAT_ANIM_PLAYED, FALSE end3 BattleScript_TotemVar:: @@ -9140,8 +8861,6 @@ BattleScript_TotemVarEnd: return BattleScript_ApplyTotemVarBoost: statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TotemVarEnd - setgraphicalstatchangevalues - playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_TotemVar_Ret @loop until stats bitfield is empty @@ -9281,8 +9000,6 @@ BattleScript_RecoverHPZMove:: BattleScript_StatUpZMove:: statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpZMoveEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_ZMOVESTATUP waitmessage B_WAIT_TIME_LONG printfromtable gStatUpStringIds @@ -9291,7 +9008,7 @@ BattleScript_StatUpZMoveEnd: return BattleScript_HealReplacementZMove:: - playanimation BS_SCRIPTING B_ANIM_WISH_HEAL 0x0 + playanimation BS_SCRIPTING, B_ANIM_WISH_HEAL, 0x0 printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG healthbarupdate BS_SCRIPTING @@ -9311,38 +9028,31 @@ BattleScript_EffectExtremeEvoboost:: BattleScript_ExtremeEvoboostAnim: attackanimation waitanimation - playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS - playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostDef:: - playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_BY_TWO setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpeed:: - playstatchangeanimation BS_ATTACKER, BIT_SPEED, STAT_CHANGE_BY_TWO setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpAtk:: - playstatchangeanimation BS_ATTACKER, BIT_SPATK, STAT_CHANGE_BY_TWO setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpDef:: - playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_BY_TWO setstatchanger STAT_SPDEF, 2, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostEnd:: - setbyte sSTAT_ANIM_PLAYED, FALSE goto BattleScript_MoveEnd BattleScript_EffectHitSetRemoveTerrain:: @@ -9473,7 +9183,7 @@ BattleScript_EjectButtonActivates:: switchoutabilities BS_SCRIPTING copybyte sBATTLER, sSAVED_BATTLER waitstate - switchhandleorder BS_SCRIPTING 0x2 + switchhandleorder BS_SCRIPTING, 0x2 returntoball BS_SCRIPTING, FALSE getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING @@ -9595,7 +9305,6 @@ BattleScript_TargetAbilityStatRaiseRet:: copybyte gBattlerAttacker, gBattlerTarget call BattleScript_AbilityPopUp statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End - setgraphicalstatchangevalues call BattleScript_StatUp BattleScript_TargetAbilityStatRaiseRet_End: copybyte gBattlerAttacker, sSAVED_BATTLER @@ -9633,12 +9342,9 @@ BattleScript_RaiseSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RaiseSideStatsIncrement - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseSideStatsIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseSideStatsEnd setallytonexttarget BattleScript_RaiseSideStatsLoop BattleScript_RaiseSideStatsEnd: @@ -9652,12 +9358,9 @@ BattleScript_LowerSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerSideStatsIncrement - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerSideStatsIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_LowerSideStatsEnd setallytonexttarget BattleScript_LowerSideStatsLoop BattleScript_LowerSideStatsEnd: @@ -9854,12 +9557,10 @@ BattleScript_EffectRaiseCritAlliesAnim:: BattleScript_RaiseCritAlliesLoop: jumpifabsent BS_TARGET, BattleScript_RaiseCritAlliesIncrement setstatchanger STAT_ATK, 0, FALSE @ for animation - setgraphicalstatchangevalues - playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange 0, BattleScript_RaiseCritAlliesIncrement @ for animation printstring STRINGID_PKMNGETTINGPUMPED waitmessage B_WAIT_TIME_LONG BattleScript_RaiseCritAlliesIncrement: - setbyte sSTAT_ANIM_PLAYED, FALSE jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_RaiseCritAlliesEnd setallytonexttarget BattleScript_RaiseCritAlliesLoop BattleScript_RaiseCritAlliesEnd: @@ -9984,9 +9685,9 @@ BattleScript_BerserkGeneRet:: saveattacker savetarget copybyte gBattlerTarget, sBATTLER - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse - setgraphicalstatchangevalues + statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp BattleScript_BerserkGeneRet_TryConfuse: @@ -10063,4 +9764,3 @@ BattleScript_ForfeitBattleGaveMoney:: .endif waitmessage B_WAIT_TIME_LONG end2 - diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 8cb16379da..630c51b9e8 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -105,8 +105,6 @@ BattleScript_ItemIncreaseStat:: call BattleScript_UseItemMessage itemincreasestat statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG end diff --git a/include/battle_scripts.h b/include/battle_scripts.h index d4cb6dfb8a..50f0e2de0d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -339,7 +339,6 @@ extern const u8 BattleScript_GrassySurgeActivates[]; extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; extern const u8 BattleScript_EffectSpectralThief[]; -extern const u8 BattleScript_StatUpMsg[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainHeals[]; diff --git a/include/battle_util.h b/include/battle_util.h index 8201d19432..1bd4017a19 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -223,6 +223,7 @@ void MarkBattlerForControllerExec(u32 battler); void MarkBattlerReceivedLinkData(u32 battler); const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState); bool32 WasUnableToUseMove(u32 battler); +bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability); void PrepareStringBattle(enum StringID stringId, u32 battler); void ResetSentPokesToOpponentValue(void); void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler); diff --git a/include/config/battle.h b/include/config/battle.h index f4a14f4df4..f34004783f 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -161,6 +161,7 @@ #define B_MAGIC_GUARD GEN_LATEST // In Gen4 only, Magic Guard ignores immobilization caused by paralysis #define B_BATTLE_BOND GEN_LATEST // In Gen9+, Battle Bond increases Atk, SpAtk and Speed by one stage, once per battle #define B_ATE_MULTIPLIER GEN_LATEST // In Gen7+, -ate abilities (Aerilate, Galvanize, Normalize, Pixilate, Refrigerate) multiply damage by 1.2. Otherwise, it's 1.3, except Normalize which has no multiplier. +#define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side. // Item settings #define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore HP activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e08a6dc239..0399b53c12 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -221,16 +221,11 @@ enum CmdVarious // Cmd_statbuffchange #define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. If not set and unable to raise/lower stats, jump to failInstr. #define STAT_CHANGE_MIRROR_ARMOR (1 << 1) // Stat change redirection caused by Mirror Armor ability. +#define STAT_CHANGE_ONLY_CHECKING (1 << 2) // Checks if the stat change can occur. Does not change stats or play stat change animation. #define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 5) #define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 6) -// stat change flags for Cmd_playstatchangeanimation -#define STAT_CHANGE_NEGATIVE (1 << 0) -#define STAT_CHANGE_BY_TWO (1 << 1) -#define STAT_CHANGE_MULTIPLE_STATS (1 << 2) -#define STAT_CHANGE_CANT_PREVENT (1 << 3) - -// stat flags for Cmd_playstatchangeanimation +// stat flags for TryPlayStatChangeAnimation #define BIT_HP (1 << 0) #define BIT_ATK (1 << 1) #define BIT_DEF (1 << 2) diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 060d4167ef..7a3485e2f7 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -17,6 +17,7 @@ enum GenConfigTag GEN_CONFIG_BATTLE_BOND, GEN_CONFIG_ATE_MULTIPLIER, GEN_CONFIG_FELL_STINGER_STAT_RAISE, + GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 2a97728d0d..ef59c05962 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -20,6 +20,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND, [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, [GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER, + [GEN_CONFIG_DEFIANT_STICKY_WEB] = B_DEFIANT_STICKY_WEB, }; #if TESTING diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6ad315d144..65622b9a5a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -319,7 +319,7 @@ enum GiveCaughtMonStates #define TAG_LVLUP_BANNER_MON_ICON 55130 static void TrySetDestinyBondToHappen(void); -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr); +static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const u8 *BS_ptr); static bool32 IsMonGettingExpSentOut(void); static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); @@ -416,8 +416,8 @@ static void Cmd_jumpifabilitypresent(void); static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); static void Cmd_playanimation_var(void); -static void Cmd_setgraphicalstatchangevalues(void); -static void Cmd_playstatchangeanimation(void); +static void Cmd_unused_0x47(void); +static void Cmd_unused_0x48(void); static void Cmd_moveend(void); static void Cmd_sethealblock(void); static void Cmd_returnatktoball(void); @@ -675,8 +675,8 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_endselectionscript, //0x44 Cmd_playanimation, //0x45 Cmd_playanimation_var, //0x46 - Cmd_setgraphicalstatchangevalues, //0x47 - Cmd_playstatchangeanimation, //0x48 + Cmd_unused_0x47, //0x47 + Cmd_unused_0x48, //0x48 Cmd_moveend, //0x49 Cmd_sethealblock, //0x4A Cmd_returnatktoball, //0x4B @@ -3499,7 +3499,8 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (NoAliveMonsForEitherParty() || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; } @@ -3529,7 +3530,8 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + flags, + 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) { if (!mirrorArmorReflected) gBattlescriptCurrInstr++; @@ -3552,7 +3554,8 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (NoAliveMonsForEitherParty() || ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, 0) == STAT_CHANGE_DIDNT_WORK) + affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; } @@ -3582,7 +3585,8 @@ void SetMoveEffect(bool32 primary, bool32 certain) if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, - flags, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + flags, + 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) { if (!mirrorArmorReflected) gBattlescriptCurrInstr++; @@ -4003,6 +4007,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), stat, affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; @@ -5876,171 +5881,12 @@ static void Cmd_playanimation_var(void) PlayAnimation(battler, *(cmd->animIdPtr), cmd->argPtr, cmd->nextInstr); } -static void Cmd_setgraphicalstatchangevalues(void) +static void Cmd_unused_0x47(void) { - CMD_ARGS(); - - u8 value = GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger); - - switch (value) - { - case SET_STAT_BUFF_VALUE(1): // +1 - value = STAT_ANIM_PLUS1 + 1; - break; - case SET_STAT_BUFF_VALUE(2): // +2 - value = STAT_ANIM_PLUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(3): // +3 - value = STAT_ANIM_PLUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 - value = STAT_ANIM_MINUS1 + 1; - break; - case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 - value = STAT_ANIM_MINUS2 + 1; - break; - case SET_STAT_BUFF_VALUE(3) | STAT_BUFF_NEGATIVE: // -3 - value = STAT_ANIM_MINUS2 + 1; - break; - default: // <-12,-4> and <4, 12> - if (value & STAT_BUFF_NEGATIVE) - value = STAT_ANIM_MINUS2 + 1; - else - value = STAT_ANIM_PLUS2 + 1; - break; - } - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; - gBattleScripting.animArg2 = 0; - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_playstatchangeanimation(void) +static void Cmd_unused_0x48(void) { - CMD_ARGS(u8 battler, u8 stats, u8 flags); - - u32 currStat = 0; - u32 statAnimId = 0; - u32 changeableStatsCount = 0; - u32 startingStatAnimId = 0; - u32 flags = cmd->flags; - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 ability = GetBattlerAbility(battler); - u32 stats = cmd->stats; - bool32 defiantCompetitiveAffected = FALSE; - - if (gBattleScripting.statAnimPlayed) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - // Handle Contrary and Simple - if (ability == ABILITY_CONTRARY) - { - flags ^= STAT_CHANGE_NEGATIVE; - RecordAbilityBattle(battler, ability); - } - else if (ability == ABILITY_SIMPLE) - { - flags |= STAT_CHANGE_BY_TWO; - RecordAbilityBattle(battler, ability); - } - else if (ability == ABILITY_DEFIANT || ability == ABILITY_COMPETITIVE) - { - defiantCompetitiveAffected = TRUE; - } - - if (flags & STAT_CHANGE_NEGATIVE) // goes down - { - if (flags & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_MINUS2; - else - startingStatAnimId = STAT_ANIM_MINUS1; - - while (stats != 0) - { - if (stats & 1) - { - if (flags & STAT_CHANGE_CANT_PREVENT) - { - if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - } - } - else if (!gSideTimers[GetBattlerSide(battler)].mistTimer - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_CLEAR_AMULET - && ability != ABILITY_CLEAR_BODY - && ability != ABILITY_FULL_METAL_BODY - && ability != ABILITY_WHITE_SMOKE - && !((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) - && !(B_ILLUMINATE_EFFECT >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) - && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) - && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) - { - if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - if (defiantCompetitiveAffected) // Force single stat animations - break; - } - } - } - stats >>= 1, currStat++; - } - - if (changeableStatsCount > 1) // more than one stat, so the color is gray - { - if (flags & STAT_CHANGE_BY_TWO) - statAnimId = STAT_ANIM_MULTIPLE_MINUS2; - else - statAnimId = STAT_ANIM_MULTIPLE_MINUS1; - } - } - else // goes up - { - if (flags & STAT_CHANGE_BY_TWO) - startingStatAnimId = STAT_ANIM_PLUS2; - else - startingStatAnimId = STAT_ANIM_PLUS1; - - while (stats != 0) - { - if (stats & 1 && gBattleMons[battler].statStages[currStat] < MAX_STAT_STAGE) - { - statAnimId = startingStatAnimId + currStat; - changeableStatsCount++; - } - stats >>= 1, currStat++; - } - - if (changeableStatsCount > 1) // more than one stat, so the color is gray - { - if (flags & STAT_CHANGE_BY_TWO) - statAnimId = STAT_ANIM_MULTIPLE_PLUS2; - else - statAnimId = STAT_ANIM_MULTIPLE_PLUS1; - } - } - - if (flags & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2) - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - else if (changeableStatsCount != 0) - { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); - MarkBattlerForControllerExec(battler); - if (flags & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) - gBattleScripting.statAnimPlayed = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } } static bool32 TryKnockOffBattleScript(u32 battlerDef) @@ -12167,14 +12013,103 @@ static u16 ReverseStatChangeMoveEffect(u16 moveEffect) } } -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr) +static void TryPlayStatChangeAnimation(u32 battler, u32 ability, u32 stats, s32 statValue, u32 statId, bool32 certain) +{ + u32 currStat = 0; + u32 changeableStatsCount = 1; // current stat is counted automatically + u32 statAnimId = statId; + bool32 statChangeByTwo = statValue > 1 || statValue < -1; + + if (statValue <= -1) // goes down + { + if (statChangeByTwo) + statAnimId += STAT_ANIM_MINUS2; + else + statAnimId += STAT_ANIM_MINUS1; + + while (stats != 0) + { + if (stats & 1) + { + if (certain) + { + if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) + { + changeableStatsCount++; + break; + } + } + else if (!((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) + && !(B_ILLUMINATE_EFFECT >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) + && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) + && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) + { + if (gBattleMons[battler].statStages[currStat] > MIN_STAT_STAGE) + { + changeableStatsCount++; + break; + } + } + } + stats >>= 1, currStat++; + } + + if (changeableStatsCount > 1) // more than one stat, so the color is gray + { + if (statChangeByTwo) + statAnimId = STAT_ANIM_MULTIPLE_MINUS2; + else + statAnimId = STAT_ANIM_MULTIPLE_MINUS1; + } + } + else // goes up + { + if (statChangeByTwo) + statAnimId += STAT_ANIM_PLUS2; + else + statAnimId += STAT_ANIM_PLUS1; + + while (stats != 0) + { + if (stats & 1 && gBattleMons[battler].statStages[currStat] < MAX_STAT_STAGE) + { + changeableStatsCount++; + break; + } + stats >>= 1, currStat++; + } + + if (changeableStatsCount > 1) // more than one stat, so the color is gray + { + if (statChangeByTwo) + statAnimId = STAT_ANIM_MULTIPLE_PLUS2; + else + statAnimId = STAT_ANIM_MULTIPLE_PLUS1; + } + } + + if (!gBattleScripting.statAnimPlayed) + { + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); + MarkBattlerForControllerExec(battler); + if (changeableStatsCount > 1) + gBattleScripting.statAnimPlayed = TRUE; + } + else if (changeableStatsCount == 1) // final stat that can be changed + { + gBattleScripting.statAnimPlayed = FALSE; + } +} + +static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const u8 *BS_ptr) { - bool32 certain = FALSE; - bool32 notProtectAffected = FALSE; u32 index, battler, battlerAbility; enum ItemHoldEffect battlerHoldEffect; + bool32 certain = (flags & MOVE_EFFECT_CERTAIN); + bool32 notProtectAffected = (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED); bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); bool32 mirrorArmored = (flags & STAT_CHANGE_MIRROR_ARMOR); + bool32 onlyChecking = (flags & STAT_CHANGE_ONLY_CHECKING); if (affectsUser) battler = gBattlerAttacker; @@ -12186,30 +12121,26 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; - flags &= ~(MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR); - - if (flags & MOVE_EFFECT_CERTAIN) - certain = TRUE; - flags &= ~MOVE_EFFECT_CERTAIN; - - if (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED) - notProtectAffected++; - flags &= ~STAT_CHANGE_NOT_PROTECT_AFFECTED; + flags &= ~(STAT_CHANGE_ONLY_CHECKING | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED); if (battlerAbility == ABILITY_CONTRARY) { statValue ^= STAT_BUFF_NEGATIVE; - gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; - RecordAbilityBattle(battler, battlerAbility); - if (flags & STAT_CHANGE_UPDATE_MOVE_EFFECT) + if (!onlyChecking) { - flags &= ~STAT_CHANGE_UPDATE_MOVE_EFFECT; - gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); + gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; + RecordAbilityBattle(battler, battlerAbility); + if (flags & STAT_CHANGE_UPDATE_MOVE_EFFECT) + { + flags &= ~STAT_CHANGE_UPDATE_MOVE_EFFECT; + gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); + } } } - else if (battlerAbility == ABILITY_SIMPLE) + else if (battlerAbility == ABILITY_SIMPLE && !onlyChecking) { statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); + RecordAbilityBattle(battler, battlerAbility); } PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); @@ -12220,7 +12151,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr && !certain && gCurrentMove != MOVE_CURSE && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) { - if (flags == STAT_CHANGE_ALLOW_PTR) + if (flags & STAT_CHANGE_ALLOW_PTR) { if (gSpecialStatuses[battler].statLowered) { @@ -12244,7 +12175,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) && (!affectsUser || mirrorArmored) && !certain && gCurrentMove != MOVE_CURSE) { - if (flags == STAT_CHANGE_ALLOW_PTR) + if (flags & STAT_CHANGE_ALLOW_PTR) { if (gSpecialStatuses[battler].statLowered) { @@ -12275,7 +12206,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } else if ((index = IsFlowerVeilProtected(battler)) && !certain) { - if (flags == STAT_CHANGE_ALLOW_PTR) + if (flags & STAT_CHANGE_ALLOW_PTR) { if (gSpecialStatuses[battler].statLowered) { @@ -12299,7 +12230,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { - if (flags == STAT_CHANGE_ALLOW_PTR) + if (flags & STAT_CHANGE_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = battler; @@ -12312,7 +12243,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr } else if (battlerAbility == ABILITY_MIRROR_ARMOR && !affectsUser && !mirrorArmored && gBattlerAttacker != gBattlerTarget && battler == gBattlerTarget) { - if (flags == STAT_CHANGE_ALLOW_PTR) + if (flags & STAT_CHANGE_ALLOW_PTR) { SET_STATCHANGER(statId, GET_STAT_BUFF_VALUE(statValue) | STAT_BUFF_NEGATIVE, TRUE); BattleScriptPush(BS_ptr); @@ -12351,15 +12282,16 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8; gBattleTextBuff2[index] = B_BUFF_EOS; + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL + if (gBattleMons[battler].statStages[statId] == MIN_STAT_STAGE) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; } - else + else if (!onlyChecking) { gProtectStructs[battler].statFell = TRUE; gProtectStructs[battler].lashOutAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL } } } @@ -12391,11 +12323,13 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8; gBattleTextBuff2[index] = B_BUFF_EOS; + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE + if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; } - else + else if (!onlyChecking) { u32 statIncrease; if ((statValue + gBattleMons[battler].statStages[statId]) > MAX_STAT_STAGE) @@ -12403,29 +12337,31 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr else statIncrease = statValue; - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); gProtectStructs[battler].statRaised = TRUE; - // Check Mirror Herb / Opportunist - for (index = 0; index < gBattlersCount; index++) + if (statIncrease) { - if (IsBattlerAlly(index, battler)) - continue; // Only triggers on opposing side + // Check Mirror Herb / Opportunist + for (index = 0; index < gBattlersCount; index++) + { + if (IsBattlerAlly(index, battler)) + continue; // Only triggers on opposing side - if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST - && gProtectStructs[battler].activateOpportunist == 0) // don't activate opportunist on other mon's opportunist raises - { - gProtectStructs[index].activateOpportunist = 2; // set stats to copy - } - if (GetBattlerHoldEffect(index, TRUE) == HOLD_EFFECT_MIRROR_HERB) - { - gProtectStructs[index].eatMirrorHerb = 1; - } + if (GetBattlerAbility(index) == ABILITY_OPPORTUNIST + && gProtectStructs[battler].activateOpportunist == 0) // don't activate opportunist on other mon's opportunist raises + { + gProtectStructs[index].activateOpportunist = 2; // set stats to copy + } + if (GetBattlerHoldEffect(index, TRUE) == HOLD_EFFECT_MIRROR_HERB) + { + gProtectStructs[index].eatMirrorHerb = 1; + } - if (gProtectStructs[index].activateOpportunist == 2 || gProtectStructs[index].eatMirrorHerb == 1) - { - gQueuedStatBoosts[index].stats |= (1 << (statId - 1)); // -1 to start at atk - gQueuedStatBoosts[index].statChanges[statId - 1] += statIncrease; + if (gProtectStructs[index].activateOpportunist == 2 || gProtectStructs[index].eatMirrorHerb == 1) + { + gQueuedStatBoosts[index].stats |= (1 << (statId - 1)); // -1 to start at atk + gQueuedStatBoosts[index].statChanges[statId - 1] += statIncrease; + } } } } @@ -12439,26 +12375,38 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr return STAT_CHANGE_WORKED; } + if (onlyChecking) + return STAT_CHANGE_WORKED; + gBattleMons[battler].statStages[statId] += statValue; if (gBattleMons[battler].statStages[statId] < MIN_STAT_STAGE) gBattleMons[battler].statStages[statId] = MIN_STAT_STAGE; if (gBattleMons[battler].statStages[statId] > MAX_STAT_STAGE) gBattleMons[battler].statStages[statId] = MAX_STAT_STAGE; + + if (ShouldDefiantCompetitiveActivate(battler, battlerAbility)) + stats = 0; // use single stat animations when Defiant/Competitive activate + else + stats &= ~(1u << statId); + + TryPlayStatChangeAnimation(battler, battlerAbility, stats, statValue, statId, certain); return STAT_CHANGE_WORKED; } static void Cmd_statbuffchange(void) { - CMD_ARGS(u16 flags, const u8 *failInstr); + CMD_ARGS(u16 flags, const u8 *failInstr, u8 stats); u16 flags = cmd->flags; + u32 stats = cmd->stats; const u8 *ptrBefore = gBattlescriptCurrInstr; const u8 *failInstr = cmd->failInstr; if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), GET_STAT_BUFF_ID(gBattleScripting.statChanger), flags, + stats, failInstr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr = cmd->nextInstr; else if (gBattlescriptCurrInstr == ptrBefore) // Prevent infinite looping. @@ -18234,9 +18182,10 @@ void BS_SpectralThiefPrintStats(void) SET_STATCHANGER(stat, gBattleStruct->stolenStats[stat], FALSE); if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), stat, - MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) + MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, + 0, NULL) == STAT_CHANGE_WORKED) { - BattleScriptCall(BattleScript_StatUpMsg); + BattleScriptCall(BattleScript_StatUp); return; } } diff --git a/src/battle_util.c b/src/battle_util.c index 52aa01c535..cf82841ed8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1144,9 +1144,23 @@ bool32 WasUnableToUseMove(u32 battler) return FALSE; } +bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability) +{ + u32 side = GetBattlerSide(battler); + if (ability != ABILITY_DEFIANT && ability != ABILITY_COMPETITIVE) + return FALSE; + // if an ally dropped the stats (except for Sticky Web), don't activate + if (IsBattlerAlly(gSpecialStatuses[battler].changedStatsBattlerId, battler) && !gBattleScripting.stickyWebStatDrop) + return FALSE; + + if (GetGenConfig(GEN_CONFIG_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) + return TRUE; + // only activate Defiant/Competitive if Web was setup by foe + return gSideTimers[side].stickyWebBattlerSide != side; +} + void PrepareStringBattle(enum StringID stringId, u32 battler) { - u32 targetSide = GetBattlerSide(gBattlerTarget); u16 battlerAbility = GetBattlerAbility(battler); u16 targetAbility = GetBattlerAbility(gBattlerTarget); // Support for Contrary ability. @@ -1164,10 +1178,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) // Check Defiant and Competitive stat raise whenever a stat is lowered. else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH) - && (targetAbility == ABILITY_DEFIANT || targetAbility == ABILITY_COMPETITIVE) - && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget) - && ((gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) || gBattleScripting.stickyWebStatDrop == 1) - && !(gBattleScripting.stickyWebStatDrop == 1 && gSideTimers[targetSide].stickyWebBattlerSide == targetSide)) // Sticky Web must have been set by the foe + && ShouldDefiantCompetitiveActivate(gBattlerTarget, targetAbility)) { gBattlerAbility = gBattlerTarget; BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index e174427406..633c4e8b90 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -19,13 +19,16 @@ SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", } SCENE { ABILITY_POPUP(player, ABILITY_INTIMIDATE); if (ability == ABILITY_CONTRARY) { - ABILITY_POPUP(opponent, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Spinda's Attack rose!"); + } else { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } HP_BAR(player, captureDamage: &results[i].damage); - } - FINALLY { + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], (ability == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE + 1 : DEFAULT_STAT_STAGE - 1); + } FINALLY { EXPECT_MUL_EQ(results[1].damage, Q_4_12(2.25), results[0].damage); } } @@ -49,7 +52,6 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); if (abilityLeft == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentLeft, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -57,7 +59,6 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } if (abilityRight == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentRight, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -69,8 +70,7 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", } THEN { EXPECT_EQ(opponentLeft->statStages[STAT_ATK], (abilityLeft == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE+1 : DEFAULT_STAT_STAGE-1); EXPECT_EQ(opponentRight->statStages[STAT_ATK], (abilityRight == ABILITY_CONTRARY) ? DEFAULT_STAT_STAGE+1 : DEFAULT_STAT_STAGE-1); - } - FINALLY { + } FINALLY { EXPECT_MUL_EQ(results[1].damageLeft, Q_4_12(2.25), results[0].damageLeft); EXPECT_MUL_EQ(results[1].damageRight, Q_4_12(2.25), results[0].damageRight); } diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 2ff4597599..f1e28ca324 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -139,15 +139,19 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") } } -SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed") +SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_8); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -162,19 +166,29 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Co ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Attack sharply rose!"); } + // Defiant triggers correctly after Sticky Web + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack fell!"); + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); } } -SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if Court Changed") +SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed if Court Changed (Gen9)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_9); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); + ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); } - TURN { MOVE(opponent, MOVE_GROWL);} + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -183,12 +197,9 @@ SINGLE_BATTLE_TEST("Defiant correctly activates after Sticky Web lowers Speed if MESSAGE("Mankey was caught in a sticky web!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Mankey's Speed fell!"); - // Defiant doesn't activate - NONE_OF { - ABILITY_POPUP(player, ABILITY_DEFIANT); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Mankey's Attack sharply rose!"); - } + ABILITY_POPUP(player, ABILITY_DEFIANT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Mankey's Attack sharply rose!"); // Defiant triggers correctly after Sticky Web ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index d48b7c1eeb..78de0b057f 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -59,7 +59,6 @@ DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimid } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); if (abilityLeft == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentLeft, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Spinda's Attack rose!"); } else { @@ -67,7 +66,6 @@ DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimid MESSAGE("Mightyena's Intimidate cuts the opposing Spinda's Attack!"); } if (abilityRight == ABILITY_CONTRARY) { - ABILITY_POPUP(opponentRight, ABILITY_CONTRARY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Spinda's Attack rose!"); } else { diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index 6d661dfa7c..e133af6508 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a } } -SINGLE_BATTLE_TEST("Weak Armor still lowers boosts Speed if Defense can't go any lower") +SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower") { GIVEN { PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index 2ab420e5c2..c9f8605b99 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -1154,6 +1154,55 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } */ +SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - Singles (player to opponent)") +{ + u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 tempMove, tempSpecies; + FORCE_MOVE_ANIM(TRUE); + for (; j <= ANIM_TEST_END_MOVE; j++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + PARAMETRIZE { move = tempMove; species = tempSpecies; } + } + GIVEN { + PLAYER(species) { + HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); + if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + } + PLAYER(SPECIES_WOBBUFFET) { + Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); + HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + } + OPPONENT(SPECIES_WOBBUFFET) { + Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); + if (gMovesInfo[move].effect != EFFECT_BESTOW) + Item(ITEM_ORAN_BERRY); + } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } + } WHEN { + WhenSingles(move, player, opponent); + } SCENE { + if (!(gMovesInfo[move].effect == EFFECT_RECYCLE + || gMovesInfo[move].effect == EFFECT_BELCH + || gMovesInfo[move].effect == EFFECT_SPIT_UP + || gMovesInfo[move].effect == EFFECT_SWALLOW + || gMovesInfo[move].effect == EFFECT_TOPSY_TURVY)) // require a move that boosts stats before using this move + { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } + } + SceneSingles(move, player); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + // Z-Moves #define Z_MOVE_PARAMETERS PARAMETRIZE { zmove = MOVE_BREAKNECK_BLITZ; species = SPECIES_WOBBUFFET; move = MOVE_TACKLE; item = ITEM_NORMALIUM_Z; } \ PARAMETRIZE { zmove = MOVE_INFERNO_OVERDRIVE; species = SPECIES_WOBBUFFET; move = MOVE_EMBER; item = ITEM_FIRIUM_Z; } \ From 633370246124b5974c9cb8aeb9519cea7edc3b0d Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 18 Jun 2025 14:30:37 +0200 Subject: [PATCH 065/248] Converts more defines to enums and name unnamed enums (#7071) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- docs/tutorials/how_to_new_pokemon.md | 9 ++++-- include/battle.h | 2 +- include/battle_ai_util.h | 10 +++--- include/battle_util.h | 4 +-- include/constants/cries.h | 3 +- include/constants/pokedex.h | 6 ++-- include/constants/pokemon.h | 47 +++++++++++++++++----------- include/move.h | 4 +-- include/pokedex.h | 4 +-- include/pokemon.h | 21 +++++++------ src/battle_ai_util.c | 10 +++--- src/battle_script_commands.c | 2 +- src/battle_util.c | 8 ++--- src/contest_util.c | 3 +- src/credits.c | 2 +- src/debug.c | 2 +- src/dexnav.c | 4 +-- src/easy_chat.c | 2 +- src/egg_hatch.c | 2 +- src/mystery_event_script.c | 2 +- src/pokedex.c | 10 +++--- src/pokedex_plus_hgss.c | 18 +++++------ src/pokemon.c | 16 +++++----- src/pokemon_summary_screen.c | 2 +- src/scrcmd.c | 2 +- src/script_pokemon_util.c | 2 +- src/sound.c | 8 ++--- src/trade.c | 6 ++-- src/trainer_pools.c | 4 +-- 29 files changed, 116 insertions(+), 99 deletions(-) diff --git a/docs/tutorials/how_to_new_pokemon.md b/docs/tutorials/how_to_new_pokemon.md index de2d41d57c..100741de52 100644 --- a/docs/tutorials/how_to_new_pokemon.md +++ b/docs/tutorials/how_to_new_pokemon.md @@ -314,7 +314,8 @@ Cry_Pecharunt:: Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): ```diff -enum { +enum PokemonCry +{ CRY_NONE, ... #if P_FAMILY_TERAPAGOS @@ -371,7 +372,8 @@ Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-exp ```diff // National Pokedex order -enum { +enum NationalDexOrder +{ NATIONAL_DEX_NONE, // Kanto NATIONAL_DEX_BULBASAUR, @@ -394,7 +396,8 @@ Do keep in mind that if you intend to add your new species to the Hoenn Dex, you ```diff // Hoenn Pokedex order -enum { +enum HoennDexOrder +{ HOENN_DEX_NONE, HOENN_DEX_TREECKO, ... diff --git a/include/battle.h b/include/battle.h index 10021aebd3..821aa995e1 100644 --- a/include/battle.h +++ b/include/battle.h @@ -755,7 +755,7 @@ struct BattleStruct u8 supremeOverlordCounter[MAX_BATTLERS_COUNT]; u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. - u8 categoryOverride; // for Z-Moves and Max Moves + enum DamageCategory categoryOverride:8; // for Z-Moves and Max Moves u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index ff9ea73d3b..2144056cd5 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -128,7 +128,7 @@ u32 CountNegativeStatStages(u32 battlerId); // move checks bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); +bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather); @@ -141,8 +141,8 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect); bool32 HasMove(u32 battlerId, u32 move); -bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive); -bool32 HasMoveWithCategory(u32 battler, u32 category); +bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive); +bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); @@ -233,8 +233,8 @@ struct BattlePokemon *AllocSaveBattleMons(void); void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons); s32 CountUsablePartyMons(u32 battlerId); bool32 IsPartyFullyHealedExceptBattler(u32 battler); -bool32 PartyHasMoveCategory(u32 battlerId, u32 category); -bool32 SideHasMoveCategory(u32 battlerId, u32 category); +bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category); +bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category); // score increases u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); diff --git a/include/battle_util.h b/include/battle_util.h index 1bd4017a19..62b959cfe3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -309,7 +309,7 @@ void ClearIllusionMon(u32 battler); u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon); bool32 SetIllusionMon(struct Pokemon *mon, u32 battler); bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); -u32 GetBattleMoveCategory(u32 move); +enum DamageCategory GetBattleMoveCategory(u32 move); void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move); bool32 CanFling(u32 battler); bool32 IsTelekinesisBannedSpecies(u16 species); @@ -317,7 +317,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move); bool32 IsBelchPreventingMove(u32 battler, u32 move); bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); -u8 GetCategoryBasedOnStats(u32 battler); +enum DamageCategory GetCategoryBasedOnStats(u32 battler); void SetShellSideArmCategory(void); bool32 MoveIsAffectedBySheerForce(u32 move); bool32 TestIfSheerForceAffected(u32 battler, u16 move); diff --git a/include/constants/cries.h b/include/constants/cries.h index 554ffafc96..e309739462 100644 --- a/include/constants/cries.h +++ b/include/constants/cries.h @@ -1,7 +1,8 @@ #ifndef GUARD_CONSTANTS_CRIES_H #define GUARD_CONSTANTS_CRIES_H -enum { +enum PokemonCry +{ CRY_NONE, #if P_FAMILY_BULBASAUR CRY_BULBASAUR, diff --git a/include/constants/pokedex.h b/include/constants/pokedex.h index 241198e178..fd5ad2eb7b 100644 --- a/include/constants/pokedex.h +++ b/include/constants/pokedex.h @@ -3,7 +3,8 @@ // National Pokédex order // These constants are NOT disabled by P_GEN_X_POKEMON to keep pokedex_orders.h clean. -enum { +enum NationalDexOrder +{ NATIONAL_DEX_NONE, // Kanto NATIONAL_DEX_BULBASAUR, @@ -1063,7 +1064,8 @@ enum { #define POKEMON_SLOTS_NUMBER (NATIONAL_DEX_COUNT + 1) // Hoenn Pokédex order -enum { +enum HoennDexOrder +{ HOENN_DEX_NONE, HOENN_DEX_TREECKO, HOENN_DEX_GROVYLE, diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 659193861c..af01007cd2 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -218,29 +218,38 @@ #define EV_ITEM_RAISE_LIMIT ((I_VITAMIN_EV_CAP >= GEN_8) ? MAX_PER_STAT_EVS : 100) // Move category defines. -#define DAMAGE_CATEGORY_PHYSICAL 0 -#define DAMAGE_CATEGORY_SPECIAL 1 -#define DAMAGE_CATEGORY_STATUS 2 +enum DamageCategory +{ + DAMAGE_CATEGORY_PHYSICAL, + DAMAGE_CATEGORY_SPECIAL, + DAMAGE_CATEGORY_STATUS +}; // Growth rates -#define GROWTH_MEDIUM_FAST 0 -#define GROWTH_ERRATIC 1 -#define GROWTH_FLUCTUATING 2 -#define GROWTH_MEDIUM_SLOW 3 -#define GROWTH_FAST 4 -#define GROWTH_SLOW 5 +enum GrowthRate +{ + GROWTH_MEDIUM_FAST, + GROWTH_ERRATIC, + GROWTH_FLUCTUATING, + GROWTH_MEDIUM_SLOW, + GROWTH_FAST, + GROWTH_SLOW, +}; // Body colors for Pokédex search -#define BODY_COLOR_RED 0 -#define BODY_COLOR_BLUE 1 -#define BODY_COLOR_YELLOW 2 -#define BODY_COLOR_GREEN 3 -#define BODY_COLOR_BLACK 4 -#define BODY_COLOR_BROWN 5 -#define BODY_COLOR_PURPLE 6 -#define BODY_COLOR_GRAY 7 -#define BODY_COLOR_WHITE 8 -#define BODY_COLOR_PINK 9 +enum BodyColor +{ + BODY_COLOR_RED, + BODY_COLOR_BLUE, + BODY_COLOR_YELLOW, + BODY_COLOR_GREEN, + BODY_COLOR_BLACK, + BODY_COLOR_BROWN, + BODY_COLOR_PURPLE, + BODY_COLOR_GRAY, + BODY_COLOR_WHITE, + BODY_COLOR_PINK, +}; #define F_SUMMARY_SCREEN_FLIP_SPRITE 0x80 diff --git a/include/move.h b/include/move.h index b8c99257b2..deb9b7d85d 100644 --- a/include/move.h +++ b/include/move.h @@ -69,7 +69,7 @@ struct MoveInfo const u8 *description; u16 effect; u16 type:5; // Up to 32 - u16 category:2; + enum DamageCategory category:2; u16 power:9; // up to 511 // end of word u16 accuracy:7; @@ -200,7 +200,7 @@ static inline u32 GetMoveType(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].type; } -static inline u32 GetMoveCategory(u32 moveId) +static inline enum DamageCategory GetMoveCategory(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].category; } diff --git a/include/pokedex.h b/include/pokedex.h index aa88834e67..0dfc802312 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -8,9 +8,9 @@ void ResetPokedex(void); u16 GetNationalPokedexCount(u8 caseID); u16 GetHoennPokedexCount(u8 caseID); u8 DisplayCaughtMonDexPage(u16 species, bool32 isShiny, u32 personality); -s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID); +s8 GetSetPokedexFlag(enum NationalDexOrder nationalDexNo, u8 caseID); void DrawFootprint(u8 windowId, u16 species); -u16 CreateMonSpriteFromNationalDexNumber(u16 nationalNum, s16 x, s16 y, u16 paletteSlot); +u16 CreateMonSpriteFromNationalDexNumber(enum NationalDexOrder nationalNum, s16 x, s16 y, u16 paletteSlot); bool16 HasAllHoennMons(void); void ResetPokedexScrollPositions(void); bool16 HasAllMons(void); diff --git a/include/pokemon.h b/include/pokemon.h index 966d5f6a35..3b4cc0715b 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -4,6 +4,7 @@ #include "contest_effect.h" #include "sprite.h" #include "constants/battle.h" +#include "constants/cries.h" #include "constants/form_change_types.h" #include "constants/items.h" #include "constants/map_groups.h" @@ -431,8 +432,8 @@ struct SpeciesInfo /*0xC4*/ // Pokédex data u8 categoryName[13]; u8 speciesName[POKEMON_NAME_LENGTH + 1]; - u16 cryId; - u16 natDexNum; + enum PokemonCry cryId:16; + enum NationalDexOrder natDexNum:16; u16 height; //in decimeters u16 weight; //in hectograms u16 pokemonScale; @@ -440,7 +441,7 @@ struct SpeciesInfo /*0xC4*/ u16 trainerScale; u16 trainerOffset; const u8 *description; - u8 bodyColor:7; + enum BodyColor bodyColor:7; // Graphical Data u8 noFlip:1; u8 frontAnimDelay; @@ -789,11 +790,11 @@ u32 GetGMaxTargetSpecies(u32 species); bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo, enum EvoState evoState); u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo, enum EvoState evoState); bool8 IsMonPastEvolutionLevel(struct Pokemon *mon); -u16 NationalPokedexNumToSpecies(u16 nationalNum); -u16 NationalToHoennOrder(u16 nationalNum); -u16 SpeciesToNationalPokedexNum(u16 species); -u16 SpeciesToHoennPokedexNum(u16 species); -u16 HoennToNationalOrder(u16 hoennNum); +u16 NationalPokedexNumToSpecies(enum NationalDexOrder nationalNum); +enum HoennDexOrder NationalToHoennOrder(enum NationalDexOrder nationalNum); +enum NationalDexOrder SpeciesToNationalPokedexNum(u16 species); +enum HoennDexOrder SpeciesToHoennPokedexNum(u16 species); +enum NationalDexOrder HoennToNationalOrder(enum HoennDexOrder hoennNum); void DrawSpindaSpots(u32 personality, u8 *dest, bool32 isSecondFrame); void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); u8 GetPlayerFlankId(void); @@ -843,7 +844,7 @@ void BattleAnimateBackSprite(struct Sprite *sprite, u16 species); u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId); u16 FacilityClassToPicIndex(u16 facilityClass); u16 PlayerGenderToFrontTrainerPicId(u8 playerGender); -void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality); +void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality); bool8 HasTwoFramesAnimation(u16 species); struct MonSpritesGfxManager *CreateMonSpritesGfxManager(u8 managerId, u8 mode); void DestroyMonSpritesGfxManager(u8 managerId); @@ -865,7 +866,7 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality); u8 CalculatePartyCount(struct Pokemon *party); u16 SanitizeSpeciesId(u16 species); bool32 IsSpeciesEnabled(u16 species); -u16 GetCryIdBySpecies(u16 species); +enum PokemonCry GetCryIdBySpecies(u16 species); u16 GetSpeciesPreEvolution(u16 species); void HealPokemon(struct Pokemon *mon); void HealBoxPokemon(struct BoxPokemon *boxMon); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 01dab74882..cc692fbcb7 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -421,7 +421,7 @@ bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffe // This function checks if all physical/special moves are either unusable or unreasonable to use. // Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. -bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) +bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category) { u32 usable = 0; u16 *moves = GetMovesArray(attacker); @@ -2124,7 +2124,7 @@ u16 *GetMovesArray(u32 battler) return gBattleHistory->usedMoves[battler]; } -bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive) +bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive) { u32 i; u16 *moves = GetMovesArray(battlerId); @@ -2140,7 +2140,7 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv return TRUE; } -bool32 HasMoveWithCategory(u32 battler, u32 category) +bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category) { u32 i; u16 *moves = GetMovesArray(battler); @@ -3952,7 +3952,7 @@ bool32 IsPartyFullyHealedExceptBattler(u32 battlerId) return TRUE; } -bool32 PartyHasMoveCategory(u32 battlerId, u32 category) +bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category) { struct Pokemon *party = GetBattlerParty(battlerId); u32 i, j; @@ -3979,7 +3979,7 @@ bool32 PartyHasMoveCategory(u32 battlerId, u32 category) return FALSE; } -bool32 SideHasMoveCategory(u32 battlerId, u32 category) +bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category) { if (IsDoubleBattle()) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 65622b9a5a..1d7f2579e8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5055,7 +5055,7 @@ static void Cmd_getexp(void) if (B_EXP_CAP_TYPE == EXP_CAP_HARD && gBattleStruct->battlerExpReward != 0) { - u32 growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate; + enum GrowthRate growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate; u32 currentExp = GetMonData(&gPlayerParty[*expMonId], MON_DATA_EXP); u32 levelCap = GetCurrentLevelCap(); diff --git a/src/battle_util.c b/src/battle_util.c index cf82841ed8..6937acc088 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6007,7 +6007,7 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battler) return ITEM_NO_EFFECT; } -static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 category) +static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, enum DamageCategory category) { if (IsBattlerAlive(battler) && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) @@ -10347,7 +10347,7 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) return FALSE; } -static u32 SwapMoveDamageCategory(u32 move) +static enum DamageCategory SwapMoveDamageCategory(u32 move) { if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) return DAMAGE_CATEGORY_SPECIAL; @@ -10359,7 +10359,7 @@ static u32 SwapMoveDamageCategory(u32 move) can be removed but a lot of function arguments (battlerAtk and battlerDef) have to be added for this, about 50+. This is potentially a good change because it is less likely to cause bugs in the future. */ -u32 GetBattleMoveCategory(u32 move) +enum DamageCategory GetBattleMoveCategory(u32 move) { if (gMain.inBattle) { @@ -10449,7 +10449,7 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) } // Photon Geyser, Light That Burns the Sky, Tera Blast -u8 GetCategoryBasedOnStats(u32 battler) +enum DamageCategory GetCategoryBasedOnStats(u32 battler) { u32 attack = gBattleMons[battler].attack; u32 spAttack = gBattleMons[battler].spAttack; diff --git a/src/contest_util.c b/src/contest_util.c index 2fd5a7575a..3bd5e1ec5f 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -964,7 +964,8 @@ static void Task_ShowWinnerMonBanner(u8 taskId) static void Task_SetSeenWinnerMon(u8 taskId) { - int i, nationalDexNum; + int i; + enum NationalDexOrder nationalDexNum; if (JOY_NEW(A_BUTTON)) { diff --git a/src/credits.c b/src/credits.c index 7977db6e5d..bfc2cda12a 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1542,7 +1542,7 @@ static void SpriteCB_CreditsMonBg(struct Sprite *sprite) static void DeterminePokemonToShow(void) { - u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); + enum NationalDexOrder starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); u16 page; u16 dexNum; u16 j; diff --git a/src/debug.c b/src/debug.c index bdef2b6d98..f1a8de68c1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3677,7 +3677,7 @@ static void DebugAction_Give_Pokemon_Move(u8 taskId) static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://github.com/ghoulslash/pokeemerald/tree/custom-givemon { - u16 nationalDexNum; + enum NationalDexOrder nationalDexNum; int sentToPc; struct Pokemon mon; u8 i; diff --git a/src/dexnav.c b/src/dexnav.c index a839cc1208..38a5323994 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -1909,7 +1909,7 @@ static void DexNavFadeAndExit(void) static bool8 SpeciesInArray(u16 species, u8 section) { u32 i; - u16 dexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); switch (section) { @@ -2122,7 +2122,7 @@ static void SetTypeIconPosAndPal(u8 typeId, u8 x, u8 y, u8 spriteArrayId) static void PrintCurrentSpeciesInfo(void) { u16 species = DexNavGetSpecies(); - u16 dexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); u8 type1, type2; if (!GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) diff --git a/src/easy_chat.c b/src/easy_chat.c index 7bb3107120..7c0871cb78 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -5545,7 +5545,7 @@ static u16 GetRandomUnlockedEasyChatPokemon(void) numWords = gEasyChatGroups[EC_GROUP_POKEMON].numWords; for (i = 0; i < numWords; i++) { - u16 dexNum = SpeciesToNationalPokedexNum(*species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(*species); if (GetSetPokedexFlag(dexNum, FLAG_GET_SEEN)) { if (index) diff --git a/src/egg_hatch.c b/src/egg_hatch.c index f65ee674d8..d965c0c742 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -362,7 +362,7 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) static void AddHatchedMonToParty(u8 id) { u8 isEgg = 0x46; // ? - u16 species; + enum NationalDexOrder species; u8 name[POKEMON_NAME_LENGTH + 1]; u16 metLevel; u8 metLocation; diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index 8ef53351f8..c50ef5f963 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -340,7 +340,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) if (species != SPECIES_EGG) { - u16 pokedexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder pokedexNum = SpeciesToNationalPokedexNum(species); GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN); GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT); } diff --git a/src/pokedex.c b/src/pokedex.c index bc305a4b4a..91fe39367b 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4044,7 +4044,7 @@ static void Task_DisplayCaughtMonDexPage(u8 taskId) { u8 spriteId; u16 species = gTasks[taskId].tSpecies; - u16 dexNum = SpeciesToNationalPokedexNum(species); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); switch (gTasks[taskId].tState) { @@ -4513,7 +4513,7 @@ static u8* ConvertMeasurementToMetricString(u32 num, u32* index) return string; } -s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) +s8 GetSetPokedexFlag(enum NationalDexOrder nationalDexNo, u8 caseID) { u32 index, bit, mask; s8 retVal = 0; @@ -4890,7 +4890,7 @@ static u32 GetPokedexMonPersonality(u16 species) } } -u16 CreateMonSpriteFromNationalDexNumber(u16 nationalNum, s16 x, s16 y, u16 paletteSlot) +u16 CreateMonSpriteFromNationalDexNumber(enum NationalDexOrder nationalNum, s16 x, s16 y, u16 paletteSlot) { nationalNum = NationalPokedexNumToSpecies(nationalNum); return CreateMonPicSprite(nationalNum, FALSE, GetPokedexMonPersonality(nationalNum), TRUE, x, y, paletteSlot, TAG_NONE); @@ -4925,7 +4925,7 @@ static u16 CreateSizeScreenTrainerPic(u16 species, s16 x, s16 y, s8 paletteSlot) return CreateTrainerPicSprite(species, TRUE, x, y, paletteSlot, TAG_NONE); } -static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, enum BodyColor bodyColor, u8 type1, u8 type2) { u16 species; u16 i; @@ -5336,7 +5336,7 @@ static void Task_StartPokedexSearch(u8 taskId) u8 dexMode = GetSearchModeSelection(taskId, SEARCH_MODE); u8 order = GetSearchModeSelection(taskId, SEARCH_ORDER); u8 abcGroup = GetSearchModeSelection(taskId, SEARCH_NAME); - u8 bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); + enum BodyColor bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); u8 type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); u8 type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 15cc80a438..938fbf152b 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -354,7 +354,7 @@ struct PokemonStats u8 evYield_Defense; u8 evYield_SpDefense; u8 catchRate; - u8 growthRate; + enum GrowthRate growthRate:8; u8 eggGroup1; u8 eggGroup2; u8 eggCycles; @@ -590,7 +590,7 @@ static void Task_SwitchScreensFromFormsScreen(u8 taskId); static void Task_ExitFormsScreen(u8 taskId); //Physical/Special/Status category icon -static u8 ShowCategoryIcon(u32 category); +static u8 ShowCategoryIcon(enum DamageCategory category); static void DestroyCategoryIcon(void); static u16 NationalPokedexNumToSpeciesHGSS(u16 nationalNum); @@ -4090,7 +4090,7 @@ void Task_DisplayCaughtMonDexPageHGSS(u8 taskId) { u8 spriteId; u16 species; - u16 dexNum; + enum NationalDexOrder dexNum; if (!POKEDEX_PLUS_HGSS) return; // prevents the compiler from emitting static .rodata // if the feature is disabled @@ -4701,7 +4701,7 @@ static void LoadTilesetTilemapHGSS(u8 page) } //Physical/Special/Status category -static u8 ShowCategoryIcon(u32 category) +static u8 ShowCategoryIcon(enum DamageCategory category) { if (sPokedexView->categoryIconSpriteId == 0xFF) sPokedexView->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 139, 90, 0); @@ -5622,7 +5622,7 @@ static void PrintStatsScreen_Left(u8 taskId) if (gTasks[taskId].data[5] == 0) { u32 catchRate = sPokedexView->sPokemonStats.catchRate; - u32 growthRate = sPokedexView->sPokemonStats.growthRate; + enum GrowthRate growthRate = sPokedexView->sPokemonStats.growthRate; //Catch rate PrintStatsScreenTextSmall(WIN_STATS_LEFT, sText_Stats_CatchRate, base_x, base_y + base_y_offset*base_i); @@ -6178,8 +6178,8 @@ static void Task_HandleEvolutionScreenInput(u8 taskId) if (JOY_NEW(A_BUTTON)) { - u16 targetSpecies = sPokedexView->sEvoScreenData.targetSpecies[sPokedexView->sEvoScreenData.menuPos]; - u16 dexNum = SpeciesToNationalPokedexNum(targetSpecies); + u16 targetSpecies = sPokedexView->sEvoScreenData.targetSpecies[sPokedexView->sEvoScreenData.menuPos]; + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(targetSpecies); if (sPokedexView->isSearchResults && sPokedexView->originalSearchSelectionNum == 0) sPokedexView->originalSearchSelectionNum = sPokedexListItem->dexNum; @@ -7747,7 +7747,7 @@ static void Task_ClosePokedexFromSearchResultsStartMenu(u8 taskId) //* Search code * //* * //************************************ -static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, enum BodyColor bodyColor, u8 type1, u8 type2) { u16 species; u16 i; @@ -8163,7 +8163,7 @@ static void Task_StartPokedexSearch(u8 taskId) u8 dexMode = GetSearchModeSelection(taskId, SEARCH_MODE); u8 order = GetSearchModeSelection(taskId, SEARCH_ORDER); u8 abcGroup = GetSearchModeSelection(taskId, SEARCH_NAME); - u8 bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); + enum BodyColor bodyColor = GetSearchModeSelection(taskId, SEARCH_COLOR); u8 type1 = GetSearchModeSelection(taskId, SEARCH_TYPE_LEFT); u8 type2 = GetSearchModeSelection(taskId, SEARCH_TYPE_RIGHT); diff --git a/src/pokemon.c b/src/pokemon.c index 35f727e59e..0fc4df1212 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -119,7 +119,7 @@ static const struct CombinedMove sCombinedMoves[2] = #define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name // Assigns all Hoenn Dex Indexes to a National Dex Index -static const u16 sHoennToNationalOrder[HOENN_DEX_COUNT - 1] = +static const enum NationalDexOrder sHoennToNationalOrder[HOENN_DEX_COUNT - 1] = { HOENN_TO_NATIONAL(TREECKO), HOENN_TO_NATIONAL(GROVYLE), @@ -5041,7 +5041,7 @@ bool8 IsMonPastEvolutionLevel(struct Pokemon *mon) return FALSE; } -u16 NationalPokedexNumToSpecies(u16 nationalNum) +u16 NationalPokedexNumToSpecies(enum NationalDexOrder nationalNum) { u16 species; @@ -5059,7 +5059,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum) return GET_BASE_SPECIES_ID(species); } -u16 NationalToHoennOrder(u16 nationalNum) +enum HoennDexOrder NationalToHoennOrder(enum NationalDexOrder nationalNum) { u16 hoennNum; @@ -5077,7 +5077,7 @@ u16 NationalToHoennOrder(u16 nationalNum) return hoennNum + 1; } -u16 SpeciesToNationalPokedexNum(u16 species) +enum NationalDexOrder SpeciesToNationalPokedexNum(u16 species) { species = SanitizeSpeciesId(species); if (!species) @@ -5086,14 +5086,14 @@ u16 SpeciesToNationalPokedexNum(u16 species) return gSpeciesInfo[species].natDexNum; } -u16 SpeciesToHoennPokedexNum(u16 species) +enum HoennDexOrder SpeciesToHoennPokedexNum(u16 species) { if (!species) return 0; return NationalToHoennOrder(gSpeciesInfo[species].natDexNum); } -u16 HoennToNationalOrder(u16 hoennNum) +enum NationalDexOrder HoennToNationalOrder(enum HoennDexOrder hoennNum) { if (!hoennNum || hoennNum >= HOENN_DEX_COUNT) return 0; @@ -6404,7 +6404,7 @@ u16 PlayerGenderToFrontTrainerPicId(u8 playerGender) return FacilityClassToPicIndex(FACILITY_CLASS_BRENDAN); } -void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) +void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality) { u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT; if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) // don't set if it's already set @@ -7059,7 +7059,7 @@ void HealBoxPokemon(struct BoxPokemon *boxMon) BoxMonRestorePP(boxMon); } -u16 GetCryIdBySpecies(u16 species) +enum PokemonCry GetCryIdBySpecies(u16 species) { species = SanitizeSpeciesId(species); if (P_CRIES_ENABLED == FALSE || gSpeciesInfo[species].cryId >= CRY_COUNT || gTestRunnerHeadless) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index e4abb9f163..3bf7c0aac4 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1156,7 +1156,7 @@ static const struct SpriteTemplate sSpriteTemplate_StatusCondition = static const u16 sMarkings_Pal[] = INCBIN_U16("graphics/summary_screen/markings.gbapal"); // code -static u8 ShowCategoryIcon(u32 category) +static u8 ShowCategoryIcon(enum DamageCategory category) { if (sMonSummaryScreen->categoryIconSpriteId == 0xFF) sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 48, 128, 0); diff --git a/src/scrcmd.c b/src/scrcmd.c index 3f71fb6798..569e6a90bf 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -3099,7 +3099,7 @@ bool8 ScrCmd_checkobjectat(struct ScriptContext *ctx) bool8 Scrcmd_getsetpokedexflag(struct ScriptContext *ctx) { - u32 speciesId = SpeciesToNationalPokedexNum(VarGet(ScriptReadHalfword(ctx))); + enum NationalDexOrder speciesId = SpeciesToNationalPokedexNum(VarGet(ScriptReadHalfword(ctx))); u32 desiredFlag = VarGet(ScriptReadHalfword(ctx)); if (desiredFlag == FLAG_SET_CAUGHT || desiredFlag == FLAG_SET_SEEN) diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 7288870441..359ab75e41 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -334,7 +334,7 @@ void SetTeraType(struct ScriptContext *ctx) */ static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, bool8 isShiny, bool8 gmaxFactor, u8 teraType, u8 dmaxLevel) { - u16 nationalDexNum; + enum NationalDexOrder nationalDexNum; int sentToPc; struct Pokemon mon; u32 i; diff --git a/src/sound.c b/src/sound.c index 5b4ae29f71..f1f10f3b03 100644 --- a/src/sound.c +++ b/src/sound.c @@ -467,11 +467,11 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) SetPokemonCryChorus(chorus); SetPokemonCryPriority(priority); - species = GetCryIdBySpecies(species); - if (species != CRY_NONE) + enum PokemonCry cryId = GetCryIdBySpecies(species); + if (cryId != CRY_NONE) { - species--; - gMPlay_PokemonCry = SetPokemonCryTone(reverse ? &gCryTable_Reverse[species] : &gCryTable[species]); + cryId--; + gMPlay_PokemonCry = SetPokemonCryTone(reverse ? &gCryTable_Reverse[cryId] : &gCryTable[cryId]); } } diff --git a/src/trade.c b/src/trade.c index dbb8622b80..5fd04e1f82 100644 --- a/src/trade.c +++ b/src/trade.c @@ -3057,9 +3057,9 @@ static void UpdatePokedexForReceivedMon(u8 partyIdx) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - species = SpeciesToNationalPokedexNum(species); - GetSetPokedexFlag(species, FLAG_SET_SEEN); - HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); + enum NationalDexOrder dexNum = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(dexNum, FLAG_SET_SEEN); + HandleSetPokedexFlag(dexNum, FLAG_SET_CAUGHT, personality); } } diff --git a/src/trainer_pools.c b/src/trainer_pools.c index a2db4d81f5..ec38c7a01f 100644 --- a/src/trainer_pools.c +++ b/src/trainer_pools.c @@ -169,7 +169,7 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 u32 chosenTags = trainer->party[monIndex].tags; u16 chosenSpecies = trainer->party[monIndex].species; u16 chosenItem = trainer->party[monIndex].heldItem; - u16 chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; + enum NationalDexOrder chosenNatDex = gSpeciesInfo[chosenSpecies].natDexNum; // If tag was required, change pool rule to account for the required tag already being picked u32 tagsToEliminate = 0; for (u32 currTag = 0; currTag < POOL_NUM_TAGS; currTag++) @@ -197,7 +197,7 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 u32 currentTags = trainer->party[poolIndexArray[currIndex]].tags; u16 currentSpecies = trainer->party[poolIndexArray[currIndex]].species; u16 currentItem = trainer->party[poolIndexArray[currIndex]].heldItem; - u16 currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; + enum NationalDexOrder currentNatDex = gSpeciesInfo[currentSpecies].natDexNum; if (currentTags & tagsToEliminate) { poolIndexArray[currIndex] = POOL_SLOT_DISABLED; From 84972342d64e984ec728ec41a901aedd1c779aa0 Mon Sep 17 00:00:00 2001 From: Hedara Date: Wed, 18 Jun 2025 21:51:46 +0200 Subject: [PATCH 066/248] Add 'Macro' key to trainerproc --- tools/trainerproc/main.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 478f35dd3d..98ca8884fd 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -149,6 +149,9 @@ struct Trainer struct String pool_prune; int pool_prune_line; + + struct String macro; + int macro_line; }; static bool is_empty_string(struct String s) @@ -1280,14 +1283,21 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->pool_prune_line = value.location.line; trainer->pool_prune = token_string(&value); } + else if (is_literal_token(&key, "Macro")) + { + if (trainer->macro_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Macro'"); + trainer->macro_line = value.location.line; + trainer->macro = token_string(&value); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Battle Type', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); } } - if (!trainer->pic_line) + if (!trainer->pic_line && !trainer->macro_line) any_error = !set_show_parse_error(p, p->location, "expected 'Pic' before Pokemon"); - if (!trainer->name_line) + if (!trainer->name_line && !trainer->macro_line) any_error = !set_show_parse_error(p, p->location, "expected 'Name' before Pokemon"); if (!match_empty_line(p)) { @@ -1853,6 +1863,14 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } + if (trainer->macro_line) + { + fprintf(f, "#line %d\n", trainer->macro_line); + fprintf(f, " "); + fprint_string(f, trainer->macro); + fprintf(f, "\n"); + } + if (trainer->party_size_line) { fprintf(f, "#line %d\n", trainer->party_size_line); @@ -1867,6 +1885,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, " .party = (const struct TrainerMon[])\n"); fprintf(f, " {\n"); } + for (int j = 0; j < trainer->pokemon_n; j++) { struct Pokemon *pokemon = &trainer->pokemon[j]; From cc33d6171bae397cffdb9d4ef9adb53ee058986c Mon Sep 17 00:00:00 2001 From: Daniel Walls Date: Wed, 18 Jun 2025 20:16:25 -0700 Subject: [PATCH 067/248] Add config options for removing bard phoneme audio to save ROM space (#7155) --- data/sound_data.s | 1 + include/config/general.h | 1 + sound/direct_sound_data.inc | 60 ++++++++++++++++++ .../direct_sound_samples/phonemes/shared.aif | Bin 0 -> 54 bytes 4 files changed, 62 insertions(+) create mode 100644 sound/direct_sound_samples/phonemes/shared.aif diff --git a/data/sound_data.s b/data/sound_data.s index 39bef4b332..d1951ecc7c 100644 --- a/data/sound_data.s +++ b/data/sound_data.s @@ -2,6 +2,7 @@ .include "asm/macros/m4a.inc" .include "asm/macros/music_voice.inc" + .include "include/config/general.h" .include "include/config/pokemon.h" .include "sound/voice_groups.inc" .include "sound/keysplit_tables.inc" diff --git a/include/config/general.h b/include/config/general.h index 1bb70ce00d..db01fd22f9 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -73,6 +73,7 @@ #define COMPETITIVE_PARTY_SYNTAX TRUE // If TRUE, parties are defined in "competitive syntax". #define AUTO_SCROLL_TEXT FALSE // If TRUE, text will automatically scroll to the next line after NUM_FRAMES_AUTO_SCROLL_DELAY. Players can still press A_BUTTON or B_BUTTON to scroll on their own. #define NUM_FRAMES_AUTO_SCROLL_DELAY 49 +#define PHONEMES_SHARED FALSE // If TRUE, bard phonemes all reference the same sound (sound/direct_sound_samples/phonemes/shared.bin) to save ROM space. // Measurement system constants to be used for UNITS #define UNITS_IMPERIAL 0 // Inches, feet, pounds diff --git a/sound/direct_sound_data.inc b/sound/direct_sound_data.inc index 0e4980667c..6b345df53c 100644 --- a/sound/direct_sound_data.inc +++ b/sound/direct_sound_data.inc @@ -6172,6 +6172,64 @@ DirectSoundWaveData_sc88pro_nylon_str_guitar:: DirectSoundWaveData_sd90_special_scream_drive:: .incbin "sound/direct_sound_samples/sd90_special_scream_drive.bin" + +.if PHONEMES_SHARED == TRUE + .align 2 +DirectSoundWaveData_Phoneme_1:: +DirectSoundWaveData_Phoneme_2:: +DirectSoundWaveData_Phoneme_3:: +DirectSoundWaveData_Phoneme_4:: +DirectSoundWaveData_Phoneme_5:: +DirectSoundWaveData_Phoneme_6:: +DirectSoundWaveData_Phoneme_7:: +DirectSoundWaveData_Phoneme_8:: +DirectSoundWaveData_Phoneme_9:: +DirectSoundWaveData_Phoneme_10:: +DirectSoundWaveData_Phoneme_11:: +DirectSoundWaveData_Phoneme_12:: +DirectSoundWaveData_Phoneme_13:: +DirectSoundWaveData_Phoneme_14:: +DirectSoundWaveData_Phoneme_15:: +DirectSoundWaveData_Phoneme_16:: +DirectSoundWaveData_Phoneme_17:: +DirectSoundWaveData_Phoneme_18:: +DirectSoundWaveData_Phoneme_19:: +DirectSoundWaveData_Phoneme_20:: +DirectSoundWaveData_Phoneme_21:: +DirectSoundWaveData_Phoneme_22:: +DirectSoundWaveData_Phoneme_23:: +DirectSoundWaveData_Phoneme_24:: +DirectSoundWaveData_Phoneme_25:: +DirectSoundWaveData_Phoneme_26:: +DirectSoundWaveData_Phoneme_27:: +DirectSoundWaveData_Phoneme_28:: +DirectSoundWaveData_Phoneme_29:: +DirectSoundWaveData_Phoneme_30:: +DirectSoundWaveData_Phoneme_31:: +DirectSoundWaveData_Phoneme_32:: +DirectSoundWaveData_Phoneme_33:: +DirectSoundWaveData_Phoneme_34:: +DirectSoundWaveData_Phoneme_35:: +DirectSoundWaveData_Phoneme_36:: +DirectSoundWaveData_Phoneme_37:: +DirectSoundWaveData_Phoneme_38:: +DirectSoundWaveData_Phoneme_39:: +DirectSoundWaveData_Phoneme_40:: +DirectSoundWaveData_Phoneme_41:: +DirectSoundWaveData_Phoneme_42:: +DirectSoundWaveData_Phoneme_43:: +DirectSoundWaveData_Phoneme_44:: +DirectSoundWaveData_Phoneme_45:: +DirectSoundWaveData_Phoneme_46:: +DirectSoundWaveData_Phoneme_47:: +DirectSoundWaveData_Phoneme_48:: +DirectSoundWaveData_Phoneme_49:: +DirectSoundWaveData_Phoneme_50:: +DirectSoundWaveData_Phoneme_51:: + .incbin "sound/direct_sound_samples/phonemes/shared.bin" + +.else @ PHONEMES_SHARED + .align 2 DirectSoundWaveData_Phoneme_1:: .incbin "sound/direct_sound_samples/phonemes/01.bin" @@ -6376,6 +6434,8 @@ DirectSoundWaveData_Phoneme_50:: DirectSoundWaveData_Phoneme_51:: .incbin "sound/direct_sound_samples/phonemes/51.bin" +.endif @ PHONEMES_SHARED + .align 2 DirectSoundWaveData_sc88pro_accordion_duplicate:: .incbin "sound/direct_sound_samples/sc88pro_accordion_duplicate.bin" diff --git a/sound/direct_sound_samples/phonemes/shared.aif b/sound/direct_sound_samples/phonemes/shared.aif new file mode 100644 index 0000000000000000000000000000000000000000..98c3a19651c140ae2997aa2c90df6cffe1a18fa6 GIT binary patch literal 54 vcmZ?s5AtPTV9;~)baQj|_XV+q7#M*h1A~AA-x?P%iy=7J55(et@E8~X+vx^I literal 0 HcmV?d00001 From 390482d3553b677a4f0a877ead06b86f2778bcb7 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 19 Jun 2025 14:26:49 +0200 Subject: [PATCH 068/248] Fix debug text order (#7149) Co-authored-by: Hedara --- src/battle_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index dc65b14d13..8282dcadbb 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2413,8 +2413,8 @@ static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_COVERT_CLOAK] = COMPOUND_STRING("Covert Cloak"), [HOLD_EFFECT_LOADED_DICE] = COMPOUND_STRING("Loaded Dice"), [HOLD_EFFECT_BOOSTER_ENERGY] = COMPOUND_STRING("Booster Energy"), - [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Ogerpon Mask"), - [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Berserk Gene"), + [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Ogerpon Mask"), + [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Berserk Gene"), }; static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect) { From 3a42cd84af32197c0b4200c4845db8799478db6c Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Fri, 20 Jun 2025 17:31:16 +0200 Subject: [PATCH 069/248] comment test --- test/battle/ai/ai_smart_tera.c | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c index e82b09151e..550ba7d2a1 100644 --- a/test/battle/ai/ai_smart_tera.c +++ b/test/battle/ai/ai_smart_tera.c @@ -4,12 +4,12 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will tera if it enables a ko") { - KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. + KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. GIVEN { ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); ASSUME(GetMovePower(MOVE_AQUA_TAIL) == 90); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA); - PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); } + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); } PLAYER(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_AQUA_TAIL, MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } @@ -27,7 +27,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets outsped a ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); - PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } PLAYER(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { HP(60); Speed(1); Moves(MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } @@ -43,7 +43,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by p GIVEN { ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); - PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(1); Moves(MOVE_QUICK_ATTACK, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(1); Moves(MOVE_QUICK_ATTACK, MOVE_CELEBRATE); } PLAYER(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); Moves(MOVE_SEED_BOMB, MOVE_AQUA_TAIL); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } @@ -54,20 +54,20 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by p } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") -{ - KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. - PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); - GIVEN { - ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); - PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } - PLAYER(SPECIES_WOBBUFFET) { Speed(100); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } - } WHEN { - TURN { MOVE(player, MOVE_SEED_BOMB); } - } SCENE { - MESSAGE("The opposing Wobbuffet terastilized into the Fire type!"); - } -} \ No newline at end of file +// AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") +// { +// KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. +// PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); +// GIVEN { +// ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); +// AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); +// PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } +// PLAYER(SPECIES_WOBBUFFET) { Speed(100); } +// OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } +// OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } +// } WHEN { +// TURN { MOVE(player, MOVE_SEED_BOMB); } +// } SCENE { +// MESSAGE("The opposing Wobbuffet terastilized into the Fire type!"); +// } +// } \ No newline at end of file From bca28b40bba0534c9235008a3172a4fca6b36a90 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 20 Jun 2025 18:04:52 -0400 Subject: [PATCH 070/248] Use `argument.type` for `EFFECT_SOAK` (#7141) --- src/battle_ai_main.c | 5 ++-- src/battle_script_commands.c | 8 +++---- src/data/moves_info.h | 1 + test/battle/move_effect/soak.c | 43 +++++++++++++++++++++++++++++++++- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9cc0b5c149..3a43503719 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2661,10 +2661,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SOAK: { u32 types[3]; + u32 typeArg = GetMoveArgType(move); + GetBattlerTypes(battlerDef, FALSE, types); - // TODO: Use the type of the move like 'VARIOUS_TRY_SOAK'? if (PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) - || (types[0] == TYPE_WATER && types[1] == TYPE_WATER && types[2] == TYPE_MYSTERY)) + || (types[0] == typeArg && types[1] == typeArg && types[2] == TYPE_MYSTERY)) ADJUST_SCORE(-10); // target is already water-only break; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1d7f2579e8..6002e795b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10592,16 +10592,16 @@ static void Cmd_various(void) VARIOUS_ARGS(const u8 *failInstr); u32 types[3]; GetBattlerTypes(gBattlerTarget, FALSE, types); - u32 moveType = GetMoveType(gCurrentMove); - if ((types[0] == moveType && types[1] == moveType) + u32 typeToSet = GetMoveArgType(gCurrentMove); + if ((types[0] == typeToSet && types[1] == typeToSet) || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { gBattlescriptCurrInstr = cmd->failInstr; } else { - SET_BATTLER_TYPE(gBattlerTarget, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + SET_BATTLER_TYPE(gBattlerTarget, typeToSet); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, typeToSet); gBattlescriptCurrInstr = cmd->nextInstr; } return; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 532d4eb6bb..59bcab6fac 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -12571,6 +12571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .type = TYPE_WATER }, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, diff --git a/test/battle/move_effect/soak.c b/test/battle/move_effect/soak.c index 156e1f9558..307b4802db 100644 --- a/test/battle/move_effect/soak.c +++ b/test/battle/move_effect/soak.c @@ -1,4 +1,45 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Soak (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); + ASSUME(GetMoveEffect(MOVE_MAGIC_POWDER) == EFFECT_SOAK); +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder changes the target's type to pure Water/Psychic"); + +SINGLE_BATTLE_TEST("Soak/Magic Powder's type change is overwitten if the target changes form") +{ + u32 move; + PARAMETRIZE { move = MOVE_SOAK; } + PARAMETRIZE { move = MOVE_MAGIC_POWDER; } + GIVEN { + ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + switch (move) { + case MOVE_SOAK: MESSAGE("Mimikyu transformed into the Water type!"); break; + case MOVE_MAGIC_POWDER: MESSAGE("Mimikyu transformed into the Psychic type!"); break; + } + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + NOT MESSAGE("It doesn't affect Mimikyu…"); + ABILITY_POPUP(player, ABILITY_DISGUISE); + // Turn 3 + MESSAGE("It doesn't affect Mimikyu…"); + } +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder's type change overritten if the target transforms"); +TO_DO_BATTLE_TEST("(TERA) Soak/Magic Powder's type change overritten if the target Terastalizes"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is behind a Substitute"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is already Water/Psychic"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target has Multitype or RKS System"); From b094b70dc578d368845e399273bc38c84eec9278 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 21 Jun 2025 04:59:41 -0400 Subject: [PATCH 071/248] More battle controller function consolidation. (#6877) --- include/battle_controllers.h | 38 ++- src/battle_controller_link_opponent.c | 101 +----- src/battle_controller_link_partner.c | 88 +----- src/battle_controller_opponent.c | 120 +------ src/battle_controller_player.c | 180 +++-------- src/battle_controller_player_partner.c | 103 +----- src/battle_controller_recorded_opponent.c | 105 +----- src/battle_controller_recorded_player.c | 109 +------ src/battle_controller_safari.c | 46 +-- src/battle_controller_wally.c | 76 +---- src/battle_controllers.c | 369 +++++++++++++++------- 11 files changed, 426 insertions(+), 909 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 2ce28ca609..56b05e561c 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -323,7 +323,7 @@ void BtlController_EmitResetActionMoveSelection(u32 battler, u32 bufferId, u8 ca void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome); void BtlController_EmitDebugMenu(u32 battler, u32 bufferId); -void BattleControllerComplete(u32 battler); // Can be used for all the controllers. +void BtlController_Complete(u32 battler); // Can be used for all the controllers. void BtlController_Empty(u32 battler); // Empty command, does nothing, only completes the execution. void BtlController_TerminatorNop(u32 battler); // Dummy function at the end of the table. void BattleControllerDummy(u32 battler); @@ -336,8 +336,8 @@ void BtlController_HandleGetMonData(u32 battler); void BtlController_HandleGetRawMonData(u32 battler); void BtlController_HandleSetMonData(u32 battler); void BtlController_HandleSetRawMonData(u32 battler); -void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)); -void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)); +void BtlController_HandleLoadMonSprite(u32 battler); +void BtlController_HandleSwitchInAnim(u32 battler); void BtlController_HandleReturnMonToBall(u32 battler); void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority); void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId); @@ -345,9 +345,10 @@ void BtlController_HandleTrainerSlideBack(u32 battlerId, s16 data0, bool32 start void BtlController_HandleFaintAnimation(u32 battler); void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); -void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData); -void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct); -void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText); +void BtlController_HandleMoveAnimation(u32 battler); +void BtlController_HandlePrintString(u32 battler); +void BtlController_HandlePrintStringPlayerOnly(u32 battler); +void BtlController_HandleHealthBarUpdate(u32 battler); void DoStatusIconUpdate(u32 battler); void BtlController_HandleStatusIconUpdate(u32 battler); void BtlController_HandleStatusAnimation(u32 battler); @@ -362,10 +363,11 @@ bool32 TwoOpponentIntroMons(u32 battlerId); // Double battle with both opponent void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler)); void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay); void BtlController_HandleHidePartyStatusSummary(u32 battler); -void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData); +void BtlController_HandleBattleAnimation(u32 battler); // player controller void SetControllerToPlayer(u32 battler); +void PlayerBufferExecCompleted(u32 battler); void SetBattleEndCallbacks(u32 battler); void PlayerHandleBallThrowAnim(u32 battler); void PlayerHandleExpUpdate(u32 battler); @@ -388,37 +390,47 @@ void HandleChooseMoveAfterDma3(u32 battler); // recorded player controller void SetControllerToRecordedPlayer(u32 battler); +void RecordedPlayerBufferExecCompleted(u32 battler); // opponent controller void SetControllerToOpponent(u32 battler); +void OpponentBufferExecCompleted(u32 battler); void OpponentHandleTrainerSlide(u32 battler); // player partner controller void Controller_PlayerPartnerShowIntroHealthbox(u32 battler); // Also used by the link partner. void SetControllerToPlayerPartner(u32 battler); +void PlayerPartnerBufferExecCompleted(u32 battler); // safari controller void SetControllerToSafari(u32 battler); +void SafariBufferExecCompleted(u32 battler); // wally controller void SetControllerToWally(u32 battler); +void WallyBufferExecCompleted(u32 battler); // recorded opponent controller void SetControllerToRecordedOpponent(u32 battler); +void RecordedOpponentBufferExecCompleted(u32 battler); // link opponent void SetControllerToLinkOpponent(u32 battler); +void LinkOpponentBufferExecCompleted(u32 battler); // link partner void SetControllerToLinkPartner(u32 battler); +void LinkPartnerBufferExecCompleted(u32 battler); void TrySetBattlerShadowSpriteCallback(u32 battler); -bool32 TryShinyAnimAfterMonAnimUtil(u32 battler); -bool32 SwitchIn_ShowSubstituteUtil(u32 battler); -bool32 SwitchIn_WaitAndEndUtil(u32 battler); -bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler); -bool32 SwitchIn_ShowHealthboxUtil(u32 battler); -bool32 SwitchIn_TryShinyAnimUtil(u32 battler); +void TryShinyAnimAfterMonAnim(u32 battler); +void WaitForMonAnimAfterLoad(u32 battler); +void BtlController_HandleSwitchInWaitAndEnd(u32 battler); +void BtlController_Intro_DelayAndEnd(u32 battler); +void BtlController_HandleSwitchInShowHealthbox(u32 battler); +void BtlController_HandleSwitchInTryShinyAnim(u32 battler); +void BtlController_HandleSwitchInSoundAndEnd(u32 battler); +void BtlController_HandleSwitchInShowSubstitute(u32 battler); #endif // GUARD_BATTLE_CONTROLLERS_H diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index a039a5b522..f3a97383c7 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -30,23 +30,15 @@ #include "recorded_battle.h" #include "random.h" -static void LinkOpponentHandleLoadMonSprite(u32 battler); -static void LinkOpponentHandleSwitchInAnim(u32 battler); static void LinkOpponentHandleDrawTrainerPic(u32 battler); static void LinkOpponentHandleTrainerSlide(u32 battler); static void LinkOpponentHandleTrainerSlideBack(u32 battler); -static void LinkOpponentHandleMoveAnimation(u32 battler); -static void LinkOpponentHandlePrintString(u32 battler); -static void LinkOpponentHandleHealthBarUpdate(u32 battler); static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler); static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler); -static void LinkOpponentHandleBattleAnimation(u32 battler); static void LinkOpponentHandleLinkStandbyMsg(u32 battler); static void LinkOpponentHandleEndLinkBattle(u32 battler); static void LinkOpponentBufferRunCommand(u32 battler); -static void LinkOpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -54,8 +46,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = LinkOpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = LinkOpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkOpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = LinkOpponentHandleTrainerSlide, @@ -65,8 +57,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = LinkOpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = LinkOpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = BtlController_Empty, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -74,7 +66,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = LinkOpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -98,7 +90,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = LinkOpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkOpponentHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = LinkOpponentHandleEndLinkBattle, @@ -119,16 +111,7 @@ static void LinkOpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - LinkOpponentBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -186,7 +169,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -278,37 +261,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (TryShinyAnimAfterMonAnimUtil(battler)) - LinkOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - LinkOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void LinkOpponentBufferExecCompleted(u32 battler) +void LinkOpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = LinkOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -324,16 +277,6 @@ static void LinkOpponentBufferExecCompleted(u32 battler) } } -static void LinkOpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void LinkOpponentHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static void LinkOpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; @@ -419,7 +362,7 @@ static void LinkOpponentHandleTrainerSlide(u32 battler) trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB); BtlController_HandleTrainerSlide(battler, trainerPicId); - LinkOpponentBufferExecCompleted(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. + BtlController_Complete(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic. } static void LinkOpponentHandleTrainerSlideBack(u32 battler) @@ -427,21 +370,6 @@ static void LinkOpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void LinkOpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void LinkOpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, FALSE); -} - -static void LinkOpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); -} - static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler) { BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox); @@ -452,15 +380,10 @@ static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void LinkOpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); -} - static void LinkOpponentHandleLinkStandbyMsg(u32 battler) { RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]); - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void LinkOpponentHandleEndLinkBattle(u32 battler) @@ -475,6 +398,6 @@ static void LinkOpponentHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - LinkOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 9b27309bf6..408cc629e1 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -30,22 +30,14 @@ #include "recorded_battle.h" #include "random.h" -static void LinkPartnerHandleLoadMonSprite(u32 battler); -static void LinkPartnerHandleSwitchInAnim(u32 battler); static void LinkPartnerHandleDrawTrainerPic(u32 battler); static void LinkPartnerHandleTrainerSlideBack(u32 battler); -static void LinkPartnerHandleMoveAnimation(u32 battler); -static void LinkPartnerHandlePrintString(u32 battler); -static void LinkPartnerHandleHealthBarUpdate(u32 battler); static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler); static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler); -static void LinkPartnerHandleBattleAnimation(u32 battler); static void LinkPartnerHandleLinkStandbyMsg(u32 battler); static void LinkPartnerHandleEndLinkBattle(u32 battler); static void LinkPartnerBufferRunCommand(u32 battler); -static void LinkPartnerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -53,8 +45,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = LinkPartnerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = LinkPartnerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = LinkPartnerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -64,8 +56,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = LinkPartnerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = LinkPartnerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = BtlController_Empty, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -73,7 +65,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = LinkPartnerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -97,7 +89,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = LinkPartnerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = LinkPartnerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = LinkPartnerHandleEndLinkBattle, @@ -118,41 +110,11 @@ static void LinkPartnerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - LinkPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - LinkPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void LinkPartnerBufferExecCompleted(u32 battler) +void LinkPartnerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = LinkPartnerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -168,16 +130,6 @@ static void LinkPartnerBufferExecCompleted(u32 battler) } } -static void LinkPartnerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void LinkPartnerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - static void LinkPartnerHandleDrawTrainerPic(u32 battler) { s16 xPos; @@ -206,21 +158,6 @@ static void LinkPartnerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void LinkPartnerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void LinkPartnerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, FALSE); -} - -static void LinkPartnerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); -} - static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler) { u32 trainerPicId = LinkPlayerGetTrainerPicId(GetBattlerMultiplayerId(battler)); @@ -234,15 +171,10 @@ static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void LinkPartnerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); -} - static void LinkPartnerHandleLinkStandbyMsg(u32 battler) { RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]); - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void LinkPartnerHandleEndLinkBattle(u32 battler) @@ -252,6 +184,6 @@ static void LinkPartnerHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - LinkPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 0f33ae73fd..0004e711f7 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -40,26 +40,18 @@ #include "trainer_hill.h" #include "test_runner.h" -static void OpponentHandleLoadMonSprite(u32 battler); -static void OpponentHandleSwitchInAnim(u32 battler); static void OpponentHandleDrawTrainerPic(u32 battler); static void OpponentHandleTrainerSlideBack(u32 battler); -static void OpponentHandleMoveAnimation(u32 battler); -static void OpponentHandlePrintString(u32 battler); static void OpponentHandleChooseAction(u32 battler); static void OpponentHandleChooseMove(u32 battler); static void OpponentHandleChooseItem(u32 battler); static void OpponentHandleChoosePokemon(u32 battler); -static void OpponentHandleHealthBarUpdate(u32 battler); static void OpponentHandleIntroTrainerBallThrow(u32 battler); static void OpponentHandleDrawPartyStatusSummary(u32 battler); -static void OpponentHandleBattleAnimation(u32 battler); static void OpponentHandleEndLinkBattle(u32 battler); static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore); static void OpponentBufferRunCommand(u32 battler); -static void OpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -67,8 +59,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_GETRAWMONDATA] = BtlController_HandleGetRawMonData, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, @@ -78,8 +70,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = OpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -87,7 +79,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_OPENBAG] = OpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -111,7 +103,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = OpponentHandleEndLinkBattle, @@ -132,16 +124,7 @@ static void OpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands)) sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - OpponentBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -208,7 +191,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -310,49 +293,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].x2 == 0 - && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - TryShinyAnimation(battler, GetBattlerMon(battler)); - - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - OpponentBufferExecCompleted(battler); - } -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - OpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void OpponentBufferExecCompleted(u32 battler) +void OpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = OpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -368,17 +309,6 @@ static void OpponentBufferExecCompleted(u32 battler) } } -static void OpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void OpponentHandleSwitchInAnim(u32 battler) -{ - gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static u32 OpponentGetTrainerPicId(u32 battlerId) { u32 trainerPicId; @@ -469,20 +399,10 @@ static void OpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void OpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void OpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, TRUE); -} - static void OpponentHandleChooseAction(u32 battler) { AI_TrySwitchOrUseItem(battler); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void OpponentHandleChooseMove(u32 battler) @@ -531,7 +451,7 @@ static void OpponentHandleChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } } - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } else // Wild pokemon - use random move { @@ -591,14 +511,14 @@ static void OpponentHandleChooseMove(u32 battler) else BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } static void OpponentHandleChooseItem(u32 battler) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) @@ -671,7 +591,7 @@ static void OpponentHandleChoosePokemon(u32 battler) TestRunner_Battle_CheckSwitch(battler, chosenMonId); #endif // TESTING BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) @@ -690,11 +610,6 @@ static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) return count; } -static void OpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); -} - static void OpponentHandleIntroTrainerBallThrow(u32 battler) { BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox); @@ -705,11 +620,6 @@ static void OpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void OpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void OpponentHandleEndLinkBattle(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) @@ -718,5 +628,5 @@ static void OpponentHandleEndLinkBattle(u32 battler) gMain.callback1 = gPreBattleCallback1; SetMainCallback2(gMain.savedCallback); } - OpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index d2c24d19c4..78afeb27a6 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -48,24 +48,18 @@ #include "type_icons.h" #include "pokedex.h" -static void PlayerBufferExecCompleted(u32 battler); static void PlayerHandleLoadMonSprite(u32 battler); -static void PlayerHandleSwitchInAnim(u32 battler); static void PlayerHandleDrawTrainerPic(u32 battler); static void PlayerHandleTrainerSlide(u32 battler); static void PlayerHandleTrainerSlideBack(u32 battler); static void PlayerHandlePaletteFade(u32 battler); static void PlayerHandleSuccessBallThrowAnim(u32 battler); static void PlayerHandlePause(u32 battler); -static void PlayerHandleMoveAnimation(u32 battler); -static void PlayerHandlePrintString(u32 battler); -static void PlayerHandlePrintSelectionString(u32 battler); static void PlayerHandleChooseAction(u32 battler); static void PlayerHandleYesNoBox(u32 battler); static void PlayerHandleChooseItem(u32 battler); static void PlayerHandleChoosePokemon(u32 battler); static void PlayerHandleCmd23(u32 battler); -static void PlayerHandleHealthBarUpdate(u32 battler); static void PlayerHandleStatusXor(u32 battler); static void PlayerHandleDMA3Transfer(u32 battler); static void PlayerHandlePlayBGM(u32 battler); @@ -76,7 +70,6 @@ static void PlayerHandleOneReturnValue_Duplicate(u32 battler); static void PlayerHandleIntroTrainerBallThrow(u32 battler); static void PlayerHandleDrawPartyStatusSummary(u32 battler); static void PlayerHandleEndBounceEffect(u32 battler); -static void PlayerHandleBattleAnimation(u32 battler); static void PlayerHandleLinkStandbyMsg(u32 battler); static void PlayerHandleResetActionMoveSelection(u32 battler); static void PlayerHandleEndLinkBattle(u32 battler); @@ -89,7 +82,6 @@ static void MoveSelectionDisplayMoveType(u32 battler); static void MoveSelectionDisplayMoveNames(u32 battler); static void TryMoveSelectionDisplayMoveDescription(u32 battler); static void MoveSelectionDisplayMoveDescription(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void WaitForMonSelection(u32 battler); static void CompleteWhenChoseItem(u32 battler); static void Task_LaunchLvlUpAnim(u8); @@ -111,7 +103,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, [CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, @@ -121,16 +113,16 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, [CONTROLLER_PAUSE] = PlayerHandlePause, - [CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = PlayerHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, [CONTROLLER_YESNOBOX] = PlayerHandleYesNoBox, [CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, [CONTROLLER_OPENBAG] = PlayerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, [CONTROLLER_23] = PlayerHandleCmd23, - [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -154,7 +146,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg, [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection, [CONTROLLER_ENDLINKBATTLE] = PlayerHandleEndLinkBattle, @@ -170,7 +162,7 @@ void SetControllerToPlayer(u32 battler) gPlayerDpadHoldFrames = 0; } -static void PlayerBufferExecCompleted(u32 battler) +void PlayerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = PlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -193,14 +185,14 @@ static void PlayerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands)) sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } static void CompleteOnBattlerSpritePosX_0(u32 battler) { if (gSprites[gBattlerSpriteIds[battler]].x2 == 0) - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static u16 GetPrevBall(u16 ballId) @@ -311,7 +303,7 @@ static void HandleInputChooseAction(u32 battler) ArrowsChangeColorLastBallCycle(FALSE); TryHideLastUsedBall(); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } return; } @@ -337,7 +329,7 @@ static void HandleInputChooseAction(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_RUN, 0); break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(DPAD_LEFT)) { @@ -393,7 +385,7 @@ static void HandleInputChooseAction(u32 battler) } PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (B_QUICK_MOVE_CURSOR_TO_RUN) { @@ -413,7 +405,7 @@ static void HandleInputChooseAction(u32 battler) else if (DEBUG_BATTLE_MENU == TRUE && JOY_NEW(SELECT_BUTTON)) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_DEBUG, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (B_LAST_USED_BALL == TRUE && B_LAST_USED_BALL_CYCLE == FALSE && JOY_NEW(B_LAST_USED_BALL_BUTTON) && CanThrowLastUsedBall()) @@ -421,7 +413,7 @@ static void HandleInputChooseAction(u32 battler) PlaySE(SE_SELECT); TryHideLastUsedBall(); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -455,7 +447,7 @@ void HandleInputChooseTarget(u32 battler) EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); TryHideLastUsedBall(); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { @@ -613,7 +605,7 @@ void HandleInputShowEntireFieldTargets(u32 battler) else BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { @@ -642,7 +634,7 @@ void HandleInputShowTargets(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { @@ -746,7 +738,7 @@ void HandleInputChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8)); HideGimmickTriggerSprite(); TryHideLastUsedBall(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); break; case 1: gBattlerControllerFuncs[battler] = HandleInputChooseTarget; @@ -783,7 +775,7 @@ void HandleInputChooseMove(u32 battler) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0xFFFF); HideGimmickTriggerSprite(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); TryToHideMoveInfoWindow(); } } @@ -1226,15 +1218,6 @@ void SetBattleEndCallbacks(u32 battler) } } -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - PlayerBufferExecCompleted(battler); - } -} - static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) { bool8 healthboxAnimDone = FALSE; @@ -1270,7 +1253,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler)); gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -1360,48 +1343,6 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) -{ - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy - && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(battler); - - // Reset shiny anim (even if it didn't occur) - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - // Check if Substitute should be shown - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; - } -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - { - HandleLowHpMusicChange(GetBattlerMon(battler), battler); - PlayerBufferExecCompleted(battler); - } -} - -static void SwitchIn_TryShinyAnimShowHealthbox(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - { - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute; - } -} - void Task_PlayerController_RestoreBgmAfterCry(u8 taskId) { if (!IsCryPlayingOrClearCrySongs()) @@ -1619,7 +1560,7 @@ static void WaitForMonSelection(u32 battler) if ((gBattleResources->bufferA[battler][1] & 0xF) == 1) PrintLinkStandbyMsg(); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1639,7 +1580,7 @@ static void CompleteWhenChoseItem(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1669,13 +1610,13 @@ static void PlayerHandleYesNoInput(u32 battler) else BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_NOTHING_FAINTED, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } if (JOY_NEW(B_BUTTON)) { HandleBattleWindow(YESNOBOX_X_Y, WINDOW_CLEAR); PlaySE(SE_SELECT); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -1886,13 +1827,6 @@ static void PlayerHandleLoadMonSprite(u32 battler) gBattlerControllerFuncs[battler] = CompleteOnBattlerSpritePosX_0; } -static void PlayerHandleSwitchInAnim(u32 battler) -{ - gActionSelectionCursor[battler] = 0; - gMoveSelectionCursor[battler] = 0; - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnimShowHealthbox); -} - u32 LinkPlayerGetTrainerPicId(u32 multiplayerId) { u32 trainerPicId; @@ -1984,7 +1918,7 @@ static void PlayerHandleTrainerSlideBack(u32 battler) static void PlayerHandlePaletteFade(u32 battler) { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleSuccessBallThrowAnim(u32 battler) @@ -2004,25 +1938,7 @@ static void PlayerHandlePause(u32 battler) while (timer != 0) timer--; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, TRUE); -} - -static void PlayerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, TRUE, TRUE); -} - -static void PlayerHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - PlayerHandlePrintString(battler); - else - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void HandleChooseActionAfterDma3(u32 battler) @@ -2117,7 +2033,7 @@ static void PlayerHandleYesNoBox(u32 battler) } else { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -2139,7 +2055,7 @@ static void PlayerChooseMoveInBattlePalace(u32 battler) { gBattlePalaceMoveSelectionRngValue = gRngValue; BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler)); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -2208,7 +2124,7 @@ static void PlayerHandleChoosePokemon(u32 battler) && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else { @@ -2227,12 +2143,7 @@ static void PlayerHandleCmd23(u32 battler) { BattleStopLowHpSound(); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); + BtlController_Complete(battler); } void PlayerHandleExpUpdate(u32 battler) @@ -2242,7 +2153,7 @@ void PlayerHandleExpUpdate(u32 battler) if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } else { @@ -2268,7 +2179,7 @@ static void PlayerHandleStatusXor(u32 battler) u32 val = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS) ^ gBattleResources->bufferA[battler][1]; SetMonData(GetBattlerMon(battler), MON_DATA_STATUS, &val); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleDMA3Transfer(u32 battler) @@ -2295,37 +2206,37 @@ static void PlayerHandleDMA3Transfer(u32 battler) dst += 0x1000; size -= 0x1000; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandlePlayBGM(u32 battler) { PlayBGM(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleTwoReturnValues(u32 battler) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleChosenMonReturnValue(u32 battler) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, 0, NULL); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleOneReturnValue(u32 battler) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleOneReturnValue_Duplicate(u32 battler) { BtlController_EmitOneReturnValue_Duplicate(battler, B_COMM_TO_ENGINE, 0); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleIntroTrainerBallThrow(u32 battler) @@ -2343,12 +2254,7 @@ static void PlayerHandleEndBounceEffect(u32 battler) { EndBounceEffect(battler, BOUNCE_HEALTHBOX); EndBounceEffect(battler, BOUNCE_MON); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, TRUE); + BtlController_Complete(battler); } static void PlayerHandleLinkStandbyMsg(u32 battler) @@ -2367,7 +2273,7 @@ static void PlayerHandleLinkStandbyMsg(u32 battler) PrintLinkStandbyMsg(); break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleResetActionMoveSelection(u32 battler) @@ -2385,7 +2291,7 @@ static void PlayerHandleResetActionMoveSelection(u32 battler) gMoveSelectionCursor[battler] = 0; break; } - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerHandleEndLinkBattle(u32 battler) @@ -2395,7 +2301,7 @@ static void PlayerHandleEndLinkBattle(u32 battler) gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } @@ -2403,7 +2309,7 @@ static void Controller_WaitForDebug(u32 battler) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - PlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 0127e4bd20..11b6e8fa30 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -32,24 +32,16 @@ #include "constants/party_menu.h" #include "constants/trainers.h" -static void PlayerPartnerHandleLoadMonSprite(u32 battler); -static void PlayerPartnerHandleSwitchInAnim(u32 battler); static void PlayerPartnerHandleDrawTrainerPic(u32 battler); static void PlayerPartnerHandleTrainerSlideBack(u32 battler); -static void PlayerPartnerHandleMoveAnimation(u32 battler); -static void PlayerPartnerHandlePrintString(u32 battler); static void PlayerPartnerHandleChooseAction(u32 battler); static void PlayerPartnerHandleChooseMove(u32 battler); static void PlayerPartnerHandleChoosePokemon(u32 battler); -static void PlayerPartnerHandleHealthBarUpdate(u32 battler); static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler); static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler); -static void PlayerPartnerHandleBattleAnimation(u32 battler); static void PlayerPartnerHandleEndLinkBattle(u32 battler); static void PlayerPartnerBufferRunCommand(u32 battler); -static void PlayerPartnerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -57,8 +49,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = PlayerPartnerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = PlayerPartnerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerPartnerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -68,8 +60,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = PlayerPartnerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = PlayerPartnerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = PlayerPartnerHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -77,7 +69,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_OPENBAG] = BtlController_Empty, [CONTROLLER_CHOOSEPOKEMON] = PlayerPartnerHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = PlayerPartnerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // Partner's player gets experience the same way as the player. [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, @@ -101,7 +93,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = PlayerPartnerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = PlayerPartnerHandleEndLinkBattle, @@ -122,16 +114,7 @@ static void PlayerPartnerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - PlayerPartnerBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -159,7 +142,7 @@ static void Intro_WaitForHealthbox(u32 battler) if (finished) { gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -194,37 +177,7 @@ void Controller_PlayerPartnerShowIntroHealthbox(u32 battler) } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - PlayerPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - PlayerPartnerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void PlayerPartnerBufferExecCompleted(u32 battler) +void PlayerPartnerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = PlayerPartnerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -240,16 +193,6 @@ static void PlayerPartnerBufferExecCompleted(u32 battler) } } -static void PlayerPartnerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void PlayerPartnerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - // some explanation here // in emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it @@ -294,20 +237,10 @@ static void PlayerPartnerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void PlayerPartnerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void PlayerPartnerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void PlayerPartnerHandleChooseAction(u32 battler) { AI_TrySwitchOrUseItem(battler); - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerPartnerHandleChooseMove(u32 battler) @@ -337,7 +270,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void PlayerPartnerHandleChoosePokemon(u32 battler) @@ -378,12 +311,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); - PlayerPartnerBufferExecCompleted(battler); -} - -static void PlayerPartnerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); + BtlController_Complete(battler); } static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) @@ -406,16 +334,11 @@ static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void PlayerPartnerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void PlayerPartnerHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - PlayerPartnerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 2f836b45ce..a27318aee8 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -32,27 +32,19 @@ #include "constants/songs.h" #include "constants/trainers.h" -static void RecordedOpponentHandleLoadMonSprite(u32 battler); -static void RecordedOpponentHandleSwitchInAnim(u32 battler); static void RecordedOpponentHandleDrawTrainerPic(u32 battler); static void RecordedOpponentHandleTrainerSlideBack(u32 battler); -static void RecordedOpponentHandleMoveAnimation(u32 battler); -static void RecordedOpponentHandlePrintString(u32 battler); static void RecordedOpponentHandleChooseAction(u32 battler); static void RecordedOpponentHandleChooseMove(u32 battler); static void RecordedOpponentHandleChooseItem(u32 battler); static void RecordedOpponentHandleChoosePokemon(u32 battler); -static void RecordedOpponentHandleHealthBarUpdate(u32 battler); static void RecordedOpponentHandleStatusIconUpdate(u32 battler); static void RecordedOpponentHandleStatusAnimation(u32 battler); static void RecordedOpponentHandleIntroTrainerBallThrow(u32 battler); static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler); -static void RecordedOpponentHandleBattleAnimation(u32 battler); static void RecordedOpponentHandleEndLinkBattle(u32 battler); static void RecordedOpponentBufferRunCommand(u32 battler); -static void RecordedOpponentBufferExecCompleted(u32 battler); -static void SwitchIn_HandleSoundAndEnd(u32 battler); static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -60,8 +52,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, @@ -71,8 +63,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -80,7 +72,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, @@ -104,7 +96,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle, @@ -125,11 +117,11 @@ static void RecordedOpponentBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void RecordedOpponentBufferExecCompleted(u32 battler) +void RecordedOpponentBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = RecordedOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -145,15 +137,6 @@ static void RecordedOpponentBufferExecCompleted(u32 battler) } } -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - RecordedOpponentBufferExecCompleted(battler); - } -} - static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) { bool8 healthboxAnimDone = FALSE; @@ -192,7 +175,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } @@ -286,46 +269,6 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void TryShinyAnimAfterMonAnim(u32 battler) -{ - if (TryShinyAnimAfterMonAnimUtil(battler)) - RecordedOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; -} - -static void SwitchIn_HandleSoundAndEnd(u32 battler) -{ - if (SwitchIn_HandleSoundAndEndUtil(battler)) - RecordedOpponentBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void RecordedOpponentHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); -} - -static void RecordedOpponentHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); -} - static void RecordedOpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; @@ -371,20 +314,10 @@ static void RecordedOpponentHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void RecordedOpponentHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void RecordedOpponentHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void RecordedOpponentHandleChooseAction(u32 battler) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChooseMove(u32 battler) @@ -400,7 +333,7 @@ static void RecordedOpponentHandleChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveId | (target << 8)); } - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChooseItem(u32 battler) @@ -411,7 +344,7 @@ static void RecordedOpponentHandleChooseItem(u32 battler) gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler); gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler); BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedOpponentHandleChoosePokemon(u32 battler) @@ -419,12 +352,7 @@ static void RecordedOpponentHandleChoosePokemon(u32 battler) gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); - RecordedOpponentBufferExecCompleted(battler); -} - -static void RecordedOpponentHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, FALSE); + BtlController_Complete(battler); } static void RecordedOpponentHandleStatusIconUpdate(u32 battler) @@ -452,11 +380,6 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE); } -static void RecordedOpponentHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void RecordedOpponentHandleEndLinkBattle(u32 battler) { if (gBattleResources->bufferA[battler][1] == B_OUTCOME_DREW) @@ -466,6 +389,6 @@ static void RecordedOpponentHandleEndLinkBattle(u32 battler) FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedOpponentBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index d84276e30f..0230451827 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -29,27 +29,19 @@ #include "constants/songs.h" #include "constants/trainers.h" -static void RecordedPlayerHandleLoadMonSprite(u32 battler); -static void RecordedPlayerHandleSwitchInAnim(u32 battler); static void RecordedPlayerHandleDrawTrainerPic(u32 battler); static void RecordedPlayerHandleTrainerSlideBack(u32 battler); -static void RecordedPlayerHandleMoveAnimation(u32 battler); -static void RecordedPlayerHandlePrintString(u32 battler); static void RecordedPlayerHandleChooseAction(u32 battler); static void RecordedPlayerHandleChooseMove(u32 battler); static void RecordedPlayerHandleChooseItem(u32 battler); static void RecordedPlayerHandleChoosePokemon(u32 battler); -static void RecordedPlayerHandleHealthBarUpdate(u32 battler); static void RecordedPlayerHandleStatusIconUpdate(u32 battler); static void RecordedPlayerHandleStatusAnimation(u32 battler); static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler); static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler); -static void RecordedPlayerHandleBattleAnimation(u32 battler); static void RecordedPlayerHandleEndLinkBattle(u32 battler); static void RecordedPlayerBufferRunCommand(u32 battler); -static void RecordedPlayerBufferExecCompleted(u32 battler); -static void SwitchIn_WaitAndEnd(u32 battler); static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -57,8 +49,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic, [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, @@ -68,8 +60,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, [CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, @@ -77,7 +69,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, @@ -101,7 +93,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle, @@ -122,16 +114,7 @@ static void RecordedPlayerBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - RecordedPlayerBufferExecCompleted(battler); - } -} - -static void Intro_DelayAndEnd(u32 battler) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -172,7 +155,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler)); gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } else @@ -197,7 +180,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (healthboxAnimDone) { gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; - gBattlerControllerFuncs[battler] = Intro_DelayAndEnd; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; } } } @@ -271,37 +254,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) } } -static void WaitForMonAnimAfterLoad(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - RecordedPlayerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowSubstitute(u32 battler) -{ - if (SwitchIn_ShowSubstituteUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; -} - -static void SwitchIn_WaitAndEnd(u32 battler) -{ - if (SwitchIn_WaitAndEndUtil(battler)) - RecordedPlayerBufferExecCompleted(battler); -} - -static void SwitchIn_ShowHealthbox(u32 battler) -{ - if (SwitchIn_ShowHealthboxUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; -} - -static void SwitchIn_TryShinyAnim(u32 battler) -{ - if (SwitchIn_TryShinyAnimUtil(battler)) - gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; -} - -static void RecordedPlayerBufferExecCompleted(u32 battler) +void RecordedPlayerBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = RecordedPlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -317,16 +270,6 @@ static void RecordedPlayerBufferExecCompleted(u32 battler) } } -static void RecordedPlayerHandleLoadMonSprite(u32 battler) -{ - BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad); -} - -static void RecordedPlayerHandleSwitchInAnim(u32 battler) -{ - BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim); -} - static void RecordedPlayerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; @@ -382,22 +325,12 @@ static void RecordedPlayerHandleTrainerSlideBack(u32 battler) BtlController_HandleTrainerSlideBack(battler, 35, FALSE); } -static void RecordedPlayerHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void RecordedPlayerHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - static void ChooseActionInBattlePalace(u32 battler) { if (gBattleCommunication[4] >= gBattlersCount / 2) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_BATTLE_PALACE_ACTION, battler), 0); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -410,7 +343,7 @@ static void RecordedPlayerHandleChooseAction(u32 battler) else { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -427,7 +360,7 @@ static void RecordedPlayerHandleChooseMove(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8)); } - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedPlayerHandleChooseItem(u32 battler) @@ -438,7 +371,7 @@ static void RecordedPlayerHandleChooseItem(u32 battler) gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler); gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler); BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); } static void RecordedPlayerHandleChoosePokemon(u32 battler) @@ -446,12 +379,7 @@ static void RecordedPlayerHandleChoosePokemon(u32 battler) gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); - RecordedPlayerBufferExecCompleted(battler); -} - -static void RecordedPlayerHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); + BtlController_Complete(battler); } static void RecordedPlayerHandleStatusIconUpdate(u32 battler) @@ -488,16 +416,11 @@ static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } -static void RecordedPlayerHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, FALSE, FALSE); -} - static void RecordedPlayerHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedPlayerBufferExecCompleted(battler); + BtlController_Complete(battler); gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 9311c2f7a1..c8f5cf1939 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -31,19 +31,15 @@ static void SafariHandleDrawTrainerPic(u32 battler); static void SafariHandleSuccessBallThrowAnim(u32 battler); static void SafariHandleBallThrowAnim(u32 battler); -static void SafariHandlePrintString(u32 battler); -static void SafariHandlePrintSelectionString(u32 battler); static void SafariHandleChooseAction(u32 battler); static void SafariHandleChooseItem(u32 battler); static void SafariHandleChoosePokemon(u32 battler); static void SafariHandleStatusIconUpdate(u32 battler); static void SafariHandleFaintingCry(u32 battler); static void SafariHandleIntroTrainerBallThrow(u32 battler); -static void SafariHandleBattleAnimation(u32 battler); static void SafariHandleEndLinkBattle(u32 battler); static void SafariBufferRunCommand(u32 battler); -static void SafariBufferExecCompleted(u32 battler); static void CompleteWhenChosePokeblock(u32 battler); static void WaitForMonSelection(u32 battler); @@ -65,8 +61,8 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_Empty, - [CONTROLLER_PRINTSTRING] = SafariHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, [CONTROLLER_CHOOSEMOVE] = BtlController_Empty, @@ -97,7 +93,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty, - [CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = SafariHandleEndLinkBattle, @@ -118,7 +114,7 @@ static void SafariBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands)) sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -143,7 +139,7 @@ static void HandleInputChooseAction(u32 battler) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); break; } - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } else if (JOY_NEW(DPAD_LEFT)) { @@ -197,7 +193,7 @@ static void HandleInputChooseAction(u32 battler) static void Controller_WaitForHealthbox(u32 battler) { if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } static void SafariSetBattleEndCallbacks(u32 battler) @@ -225,7 +221,7 @@ static void CompleteWhenChosePokeblock(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -264,7 +260,7 @@ static void WaitForMonSelection(u32 battler) } } -static void SafariBufferExecCompleted(u32 battler) +void SafariBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = SafariBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -299,19 +295,6 @@ static void SafariHandleBallThrowAnim(u32 battler) BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); } -static void SafariHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - -static void SafariHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - SafariHandlePrintString(battler); - else - SafariBufferExecCompleted(battler); -} - static void HandleChooseActionAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) @@ -372,7 +355,7 @@ static void SafariHandleChoosePokemon(u32 battler) static void SafariHandleStatusIconUpdate(u32 battler) { UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_SAFARI_BALLS_TEXT); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); } // All of the other controllers(except Wally's) use CRY_MODE_FAINT. @@ -382,8 +365,8 @@ static void SafariHandleFaintingCry(u32 battler) u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); PlayCry_Normal(species, 25); - SafariBufferExecCompleted(battler); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); + BtlController_Complete(battler); } static void SafariHandleIntroTrainerBallThrow(u32 battler) @@ -394,17 +377,12 @@ static void SafariHandleIntroTrainerBallThrow(u32 battler) gBattlerControllerFuncs[battler] = Controller_WaitForHealthbox; } -static void SafariHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, TRUE, FALSE); -} - static void SafariHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - SafariBufferExecCompleted(battler); + BtlController_Complete(battler); if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) gBattlerControllerFuncs[battler] = SafariSetBattleEndCallbacks; } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 21492821bd..932b4a26b4 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -36,22 +36,15 @@ static void WallyHandleDrawTrainerPic(u32 battler); static void WallyHandleTrainerSlide(u32 battler); static void WallyHandleSuccessBallThrowAnim(u32 battler); static void WallyHandleBallThrowAnim(u32 battler); -static void WallyHandleMoveAnimation(u32 battler); -static void WallyHandlePrintString(u32 battler); -static void WallyHandlePrintSelectionString(u32 battler); static void WallyHandleChooseAction(u32 battler); static void WallyHandleChooseMove(u32 battler); static void WallyHandleChooseItem(u32 battler); -static void WallyHandleHealthBarUpdate(u32 battler); -static void WallyHandlePlaySE(u32 battler); static void WallyHandleFaintingCry(u32 battler); static void WallyHandleIntroTrainerBallThrow(u32 battler); static void WallyHandleDrawPartyStatusSummary(u32 battler); -static void WallyHandleBattleAnimation(u32 battler); static void WallyHandleEndLinkBattle(u32 battler); static void WallyBufferRunCommand(u32 battler); -static void WallyBufferExecCompleted(u32 battler); static void CompleteOnChosenItem(u32 battler); static void Intro_WaitForShinyAnimAndHealthbox(u32 battler); @@ -72,16 +65,16 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim, [CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, - [CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = WallyHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly, [CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction, [CONTROLLER_YESNOBOX] = BtlController_Empty, [CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove, [CONTROLLER_OPENBAG] = WallyHandleChooseItem, [CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty, [CONTROLLER_23] = BtlController_Empty, - [CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, [CONTROLLER_STATUSICONUPDATE] = BtlController_Empty, [CONTROLLER_STATUSANIMATION] = BtlController_Empty, @@ -96,7 +89,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, [CONTROLLER_CANTSWITCH] = BtlController_Empty, - [CONTROLLER_PLAYSE] = WallyHandlePlaySE, + [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, [CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM, [CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry, [CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide, @@ -105,7 +98,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty, [CONTROLLER_ENDBOUNCE] = BtlController_Empty, [CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty, - [CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, [CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle, @@ -130,7 +123,7 @@ static void WallyBufferRunCommand(u32 battler) if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands)) sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler); else - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -146,7 +139,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -157,7 +150,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -167,7 +160,7 @@ static void WallyHandleActions(u32 battler) if (--gBattleStruct->wallyWaitFrames == 0) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_WALLY_THROW, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; @@ -188,7 +181,7 @@ static void WallyHandleActions(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } break; } @@ -210,7 +203,7 @@ static void CompleteOnChosenItem(u32 battler) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } @@ -268,11 +261,11 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(GetBattlerMon(battler), battler); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } } -static void WallyBufferExecCompleted(u32 battler) +void WallyBufferExecCompleted(u32 battler) { gBattlerControllerFuncs[battler] = WallyBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -314,24 +307,6 @@ static void WallyHandleBallThrowAnim(u32 battler) BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); } -static void WallyHandleMoveAnimation(u32 battler) -{ - BtlController_HandleMoveAnimation(battler, FALSE); -} - -static void WallyHandlePrintString(u32 battler) -{ - BtlController_HandlePrintString(battler, FALSE, FALSE); -} - -static void WallyHandlePrintSelectionString(u32 battler) -{ - if (IsOnPlayerSide(battler)) - WallyHandlePrintString(battler); - else - WallyBufferExecCompleted(battler); -} - static void HandleChooseActionAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) @@ -379,7 +354,7 @@ static void WallyHandleChooseMove(u32 battler) { PlaySE(SE_SELECT); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0x100); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } break; } @@ -392,18 +367,6 @@ static void WallyHandleChooseItem(u32 battler) gBattlerInMenuId = battler; } -static void WallyHandleHealthBarUpdate(u32 battler) -{ - BtlController_HandleHealthBarUpdate(battler, TRUE); -} - -// For some reason Wally's SE don't take side into account and pan is always the same. Possibly a bug -static void WallyHandlePlaySE(u32 battler) -{ - PlaySE(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); - WallyBufferExecCompleted(battler); -} - // All of the other controllers use CRY_MODE_FAINT. // Wally's Pokémon during the tutorial is never intended to faint, so that's probably why it's different here. static void WallyHandleFaintingCry(u32 battler) @@ -411,7 +374,7 @@ static void WallyHandleFaintingCry(u32 battler) u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); PlayCry_Normal(species, 25); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); } static void WallyHandleIntroTrainerBallThrow(u32 battler) @@ -425,17 +388,12 @@ static void WallyHandleDrawPartyStatusSummary(u32 battler) BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, FALSE); } -static void WallyHandleBattleAnimation(u32 battler) -{ - BtlController_HandleBattleAnimation(battler, TRUE, FALSE); -} - static void WallyHandleEndLinkBattle(u32 battler) { gBattleOutcome = gBattleResources->bufferA[battler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - WallyBufferExecCompleted(battler); + BtlController_Complete(battler); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 4faec49613..57a4b3e357 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -620,6 +620,53 @@ bool32 IsValidForBattle(struct Pokemon *mon) && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); } +static inline bool32 IsControllerPlayer(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == PlayerBufferExecCompleted); +} + +static inline bool32 IsControllerRecordedPlayer(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedPlayerBufferExecCompleted); +} + +static inline bool32 IsControllerOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == OpponentBufferExecCompleted); +} + +static inline bool32 IsControllerPlayerPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == PlayerPartnerBufferExecCompleted); +} + +static inline bool32 IsControllerWally(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == WallyBufferExecCompleted); +} + +static inline bool32 IsControllerRecordedOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedOpponentBufferExecCompleted); +} + +static inline bool32 IsControllerLinkOpponent(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == LinkOpponentBufferExecCompleted); +} + +static inline bool32 IsControllerLinkPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == LinkPartnerBufferExecCompleted); +} + +bool32 ShouldUpdateTvData(u32 battler) +{ + return (IsControllerPlayer(battler) + || IsControllerLinkPartner(battler) + || IsControllerLinkOpponent(battler)); +} + static void SetBattlePartyIds(void) { s32 i, j; @@ -1589,7 +1636,7 @@ void BtlController_EmitDebugMenu(u32 battler, u32 bufferId) // Standardized Controller functions // Can be used for all the controllers. -void BattleControllerComplete(u32 battler) +void BtlController_Complete(u32 battler) { gBattlerControllerEndFuncs[battler](battler); } @@ -2209,7 +2256,7 @@ static void Controller_ReturnMonToBall2(u32 battler) if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) { FreeMonSprite(battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2243,7 +2290,7 @@ static void Controller_FaintPlayerMon(u32 battler) FreeOamMatrix(gSprites[spriteId].oam.matrixNum); DestroySprite(&gSprites[spriteId]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2252,7 +2299,7 @@ static void Controller_FaintOpponentMon(u32 battler) if (!gSprites[gBattlerSpriteIds[battler]].inUse) { SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2300,7 +2347,7 @@ static void Controller_DoMoveAnimation(u32 battler) CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(battler, gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } break; } @@ -2314,7 +2361,7 @@ static void Controller_HandleTrainerSlideBack(u32 battler) FreeTrainerFrontPicPalette(gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.affineParam); FreeSpriteOamMatrix(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); DestroySprite(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2331,38 +2378,38 @@ void Controller_WaitForHealthBar(u32 battler) { if (IsOnPlayerSide(battler)) HandleLowHpMusicChange(GetBattlerMon(battler), battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } static void Controller_WaitForBallThrow(u32 battler) { if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForBattleAnimation(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].animFromTableActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForStatusAnimation(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForTrainerPic(u32 battler) { if (gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].callback == SpriteCallbackDummy) - BattleControllerComplete(battler); + BtlController_Complete(battler); } void Controller_WaitForString(u32 battler) { if (!IsTextPrinterActive(B_WIN_MSG)) - BattleControllerComplete(battler); + BtlController_Complete(battler); } static void Controller_WaitForPartyStatusSummary(u32 battler) @@ -2370,7 +2417,7 @@ static void Controller_WaitForPartyStatusSummary(u32 battler) if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer++ > 92) { gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2383,7 +2430,7 @@ static void Controller_HitAnimation(u32 battler) gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -2396,7 +2443,7 @@ static void Controller_HitAnimation(u32 battler) // Used for all the commands which do nothing. void BtlController_Empty(u32 battler) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } // Dummy function at the end of the table. @@ -2432,7 +2479,7 @@ void BtlController_HandleGetMonData(u32 battler) } } BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, size, monData); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleGetRawMonData(u32 battler) @@ -2448,7 +2495,7 @@ void BtlController_HandleGetRawMonData(u32 battler) dst[i] = src[i]; BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, gBattleResources->bufferA[battler][2], dst); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSetMonData(u32 battler) @@ -2470,7 +2517,7 @@ void BtlController_HandleSetMonData(u32 battler) monToCheck >>= 1; } } - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSetRawMonData(u32 battler) @@ -2481,10 +2528,10 @@ void BtlController_HandleSetRawMonData(u32 battler) for (i = 0; i < gBattleResources->bufferA[battler][2]; i++) dst[i] = gBattleResources->bufferA[battler][3 + i]; - BattleControllerComplete(battler); + BtlController_Complete(battler); } -void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)) +void BtlController_HandleLoadMonSprite(u32 battler) { struct Pokemon *mon = GetBattlerMon(battler); u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -2505,18 +2552,38 @@ void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u SetBattlerShadowSpriteCallback(battler, species); - gBattlerControllerFuncs[battler] = controllerCallback; + if (IsControllerOpponent(battler) + && IsControllerLinkOpponent(battler) + && IsControllerRecordedOpponent(battler)) + gBattlerControllerFuncs[battler] = TryShinyAnimAfterMonAnim; + else + gBattlerControllerFuncs[battler] = WaitForMonAnimAfterLoad; } -void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)) +void BtlController_HandleSwitchInAnim(u32 battler) { + bool32 isPlayerSide = (IsControllerPlayer(battler) + || IsControllerPlayerPartner(battler) + || IsControllerRecordedPlayer(battler) + || IsControllerLinkPartner(battler)); + + if (IsControllerPlayer(battler)) + { + gActionSelectionCursor[battler] = 0; + gMoveSelectionCursor[battler] = 0; + } + else if (IsControllerOpponent(battler)) + { + gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; + } + if (isPlayerSide) ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3]); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; if (isPlayerSide) BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); StartSendOutAnim(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3], FALSE); - gBattlerControllerFuncs[battler] = controllerCallback; + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInTryShinyAnim; } void BtlController_HandleReturnMonToBall(u32 battler) @@ -2529,7 +2596,7 @@ void BtlController_HandleReturnMonToBall(u32 battler) else { FreeMonSprite(battler); - BattleControllerComplete(battler); + BtlController_Complete(battler); } } @@ -2712,7 +2779,7 @@ void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool HandleBallThrow(battler, target, animId, allowCriticalCapture); } -void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData) +void BtlController_HandleMoveAnimation(u32 battler) { if (!IsBattleSEPlaying(battler)) { @@ -2728,12 +2795,12 @@ void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData) gTransformedShininess[battler] = gAnimDisableStructPtr->transformedMonShininess; gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; gBattlerControllerFuncs[battler] = Controller_DoMoveAnimation; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr); } } -void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct) +void BtlController_HandlePrintString(u32 battler) { u16 *stringId; @@ -2747,20 +2814,29 @@ void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 ar TestRunner_Battle_RecordMessage(gDisplayedStringBattle); if (gTestRunnerHeadless) { - BattleControllerComplete(battler); + BtlController_Complete(battler); return; } } BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gBattlerControllerFuncs[battler] = Controller_WaitForString; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnString(*stringId); - if (arenaPtsDeduct) + if (IsControllerPlayer(battler) + || IsControllerOpponent(battler)) BattleArena_DeductSkillPoints(battler, *stringId); } -void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText) +void BtlController_HandlePrintStringPlayerOnly(u32 battler) +{ + if (IsOnPlayerSide(battler)) + BtlController_HandlePrintString(battler); + else + BtlController_Complete(battler); +} + +void BtlController_HandleHealthBarUpdate(u32 battler) { s32 maxHP, curHP; s16 hpVal; @@ -2779,7 +2855,9 @@ void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText) else { SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal); - if (updateHpText) + if (IsControllerPlayer(battler) + || IsControllerRecordedPlayer(battler) + || IsControllerWally(battler)) UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP); TestRunner_Battle_RecordHP(battler, curHP, 0); } @@ -2818,7 +2896,7 @@ void BtlController_HandleHitAnimation(u32 battler) { if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -2834,7 +2912,7 @@ void BtlController_HandlePlaySE(u32 battler) s32 pan = IsOnPlayerSide(battler) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandlePlayFanfareOrBGM(u32 battler) @@ -2849,7 +2927,7 @@ void BtlController_HandlePlayFanfareOrBGM(u32 battler) PlayFanfare(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); } - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleFaintingCry(u32 battler) @@ -2869,14 +2947,14 @@ void BtlController_HandleFaintingCry(u32 battler) } PlayCry_ByMode(GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), pan, CRY_MODE_FAINT); - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleIntroSlide(u32 battler) { HandleIntroSlide(gBattleResources->bufferA[battler][1]); gIntroSlideFlags |= 1; - BattleControllerComplete(battler); + BtlController_Complete(battler); } void BtlController_HandleSpriteInvisibility(u32 battler) @@ -2886,7 +2964,7 @@ void BtlController_HandleSpriteInvisibility(u32 battler) gSprites[gBattlerSpriteIds[battler]].invisible = gBattleResources->bufferA[battler][1]; CopyBattleSpriteInvisibility(battler); } - BattleControllerComplete(battler); + BtlController_Complete(battler); } bool32 TwoPlayerIntroMons(u32 battler) // Double battle with both player pokemon active. @@ -3044,7 +3122,7 @@ void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 co { if (gBattleResources->bufferA[battler][1] != 0 && IsOnPlayerSide(battler)) { - BattleControllerComplete(battler); + BtlController_Complete(battler); } else { @@ -3078,12 +3156,13 @@ void BtlController_HandleHidePartyStatusSummary(u32 battler) { if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[battler]].func = Task_HidePartyStatusSummary; - BattleControllerComplete(battler); + BtlController_Complete(battler); } -void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData) +void BtlController_HandleBattleAnimation(u32 battler) { - if (ignoreSE || !IsBattleSEPlaying(battler)) + if ((gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL)) + || !IsBattleSEPlaying(battler)) { u8 animationId = gBattleResources->bufferA[battler][1]; u16 argument = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8); @@ -3091,11 +3170,11 @@ void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 up gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][4]; if (TryHandleLaunchBattleTableAnimation(battler, battler, battler, animationId, argument)) - BattleControllerComplete(battler); + BtlController_Complete(battler); else gBattlerControllerFuncs[battler] = Controller_WaitForBattleAnimation; - if (updateTvData) + if (ShouldUpdateTvData(battler)) BattleTv_SetDataBasedOnAnimation(animationId); } } @@ -3153,107 +3232,157 @@ void TrySetBattlerShadowSpriteCallback(u32 battler) SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); } -bool32 TryShinyAnimAfterMonAnimUtil(u32 battler) +void TryShinyAnimAfterMonAnim(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[battler]].x2 != 0) - return FALSE; - - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[battler]].x2 == 0) { - TryShinyAnimation(battler, GetBattlerMon(battler)); - return FALSE; + if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + { + TryShinyAnimation(battler, GetBattlerMon(battler)); + } + else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) + { + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + BtlController_Complete(battler); + } } - - if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - return FALSE; - - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - return TRUE; } -bool32 SwitchIn_ShowSubstituteUtil(u32 battler) +void WaitForMonAnimAfterLoad(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback != SpriteCallbackDummy) - return FALSE; - - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - CopyBattleSpriteInvisibility(battler); - - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - - return TRUE; + if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0) + BtlController_Complete(battler); } -bool32 SwitchIn_WaitAndEndUtil(u32 battler) +void BtlController_HandleSwitchInShowSubstitute(u32 battler) { - return !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy; + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) + { + if (IsOnPlayerSide(battler)) + CopyBattleSpriteInvisibility(battler); + + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + + if (IsControllerOpponent(battler) + && IsControllerLinkOpponent(battler) + && IsControllerRecordedOpponent(battler)) + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd; + else + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInWaitAndEnd; + } } -bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler) +void BtlController_HandleSwitchInWaitAndEnd(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive || IsCryPlayingOrClearCrySongs()) - return FALSE; - - if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy_2 - && GetBattlerSide(battler) == B_SIDE_OPPONENT) - return FALSE; - - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - return TRUE; + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) + BtlController_Complete(battler); } -bool32 SwitchIn_ShowHealthboxUtil(u32 battler) +void BtlController_Intro_DelayAndEnd(u32 battler) +{ + if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; + BtlController_Complete(battler); + } +} + +void BtlController_HandleSwitchInSoundAndEnd(u32 battler) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) + { + if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy + || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2 + || IsOnPlayerSide(battler)) + { + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + if (IsControllerPlayer(battler)) + HandleLowHpMusicChange(GetBattlerMon(battler), battler); + BtlController_Complete(battler); + } + } +} + +void BtlController_HandleSwitchInShowHealthbox(u32 battler) { u32 side = GetBattlerSide(battler); - - if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - || (side == B_SIDE_OPPONENT && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy)) - return FALSE; - - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - if (side == B_SIDE_PLAYER) + if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim + && (side == B_SIDE_PLAYER || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)) { - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(GetBattlerMon(battler), battler); + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + if (side == B_SIDE_PLAYER) + { + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); + HandleLowHpMusicChange(GetBattlerMon(battler), battler); + } + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + + if (side == B_SIDE_OPPONENT) + CopyBattleSpriteInvisibility(battler); + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowSubstitute; } - - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - - if (side == B_SIDE_OPPONENT) - CopyBattleSpriteInvisibility(battler); - - return TRUE; } -bool32 SwitchIn_TryShinyAnimUtil(u32 battler) +static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) +{ + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy + && gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) + { + CopyBattleSpriteInvisibility(battler); + + // Reset shiny anim (even if it didn't occur) + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + // Check if Substitute should be shown + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd; + } +} + +void BtlController_HandleSwitchInTryShinyAnim(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) TryShinyAnimation(battler, GetBattlerMon(battler)); - if (gSprites[gBattleControllerData[battler]].callback != SpriteCallbackDummy - || gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - return FALSE; + if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy + && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) + { + DestroySprite(&gSprites[gBattleControllerData[battler]]); - DestroySprite(&gSprites[gBattleControllerData[battler]]); + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) + SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); - if (GetBattlerSide(battler) == B_SIDE_OPPONENT) - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); - - return TRUE; + if (IsControllerPlayer(battler)) + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute; + } + else + { + gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowHealthbox; + } + } } From cf7f15faacd44669cc26c9c59c7d50d421944c02 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 22 Jun 2025 10:21:37 -0400 Subject: [PATCH 072/248] Untangle `InitBtlControllers` functions (#6748) --- include/battle_controllers.h | 2 + src/battle_controllers.c | 588 +++++++++-------------------------- 2 files changed, 142 insertions(+), 448 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 56b05e561c..e55b3ef6e1 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -1,6 +1,8 @@ #ifndef GUARD_BATTLE_CONTROLLERS_H #define GUARD_BATTLE_CONTROLLERS_H +typedef void (*BattleControllerFunc)(u32 battler); + enum { REQUEST_ALL_BATTLE, REQUEST_SPECIES_BATTLE, diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 57a4b3e357..a9b0d875d4 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -36,8 +36,7 @@ COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; // Used by the b COMMON_DATA void (*gBattlerControllerEndFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; // Controller's buffer complete function for each battler static void CreateTasksForSendRecvLinkBuffers(void); -static void InitLinkBtlControllers(void); -static void InitSinglePlayerBtlControllers(void); +static void InitBtlControllersInternal(void); static void SetBattlePartyIds(void); static void Task_HandleSendLinkBuffersData(u8 taskId); static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); @@ -102,10 +101,7 @@ void InitBattleControllers(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) RecordedBattle_SaveParties(); - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - InitLinkBtlControllers(); - else - InitSinglePlayerBtlControllers(); + InitBtlControllersInternal(); SetBattlePartyIds(); @@ -122,492 +118,188 @@ void InitBattleControllers(void) *((u8 *)(&gBattleStruct->tv) + i) = 0; } -static void InitSinglePlayerBtlControllers(void) +static void InitBtlControllersInternal(void) { s32 i; + bool32 isLink = (gBattleTypeFlags & BATTLE_TYPE_LINK); + bool32 isDouble = IsDoubleBattle(); + bool32 isMaster = (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER); + bool32 isRecorded = (gBattleTypeFlags & BATTLE_TYPE_RECORDED); + bool32 isRecordedMaster = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER); + bool32 isRecordedLink = (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK); + bool32 isMulti = (gBattleTypeFlags & BATTLE_TYPE_MULTI); + bool32 isInGamePartner = (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER); + bool32 isAIvsAI = IsAiVsAiBattle(); - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { + if (!isLink || isMaster) gBattleMainFunc = BeginBattleIntro; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - - gBattlersCount = MAX_BATTLERS_COUNT; - - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); - - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - if (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE) - { - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 1; - } - else - { - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; - } - } - else if (!IsDoubleBattle()) - { - gBattleMainFunc = BeginBattleIntro; - - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToSafari; - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToWally; - else if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner; - else - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - + if (!isDouble) gBattlersCount = 2; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - } - else // see how the banks are switched - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - } - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - } - } - } else - { - gBattleMainFunc = BeginBattleIntro; - - if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayerPartner; - else - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - if (IsAiVsAiBattle()) - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; - else - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = MAX_BATTLERS_COUNT; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || !isMulti + || (!isLink && !isRecorded) + || (isLink && !isDouble)) + { + bool32 isPlayerPrimary; + if (isLink) + isPlayerPrimary = (isMaster || (isDouble && isMulti)); + else if (!isRecorded) + isPlayerPrimary = TRUE; + else if (isDouble) + isPlayerPrimary = (isInGamePartner || isMulti || isMaster); + else + isPlayerPrimary = (!isRecordedLink || isRecordedMaster); + + if (isPlayerPrimary) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; + } + else + { + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; + gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; + gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; + gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; + } + + if (isLink) + { + if (isDouble && isMulti && !isMaster) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToLinkPartner; + else + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer; + + if (!isDouble || !isMulti || !isMaster) { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); - - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; - } - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - u8 multiplayerId; - - for (multiplayerId = gRecordedBattleMultiplayerId, i = 0; i < MAX_BATTLERS_COUNT; i++) - { - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0); - break; - case 1: - case 2: - BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1); - break; - } - - if (i == multiplayerId) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) - || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedOpponent; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - } - } - else if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToLinkOpponent; + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer; + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToLinkOpponent; } else { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedPlayer; - gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - } + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent; + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToLinkPartner; + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent; } } - } -} - -static void InitLinkBtlControllers(void) -{ - s32 i; - u8 multiplayerId; - - if (!IsDoubleBattle()) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlersCount = 2; - } else { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; + // Player 1 + if (isRecorded) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToRecordedPlayer; + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToSafari; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToWally; + else if (isAIvsAI) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayerPartner; + else + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer; - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; + // Opponent 1 + bool32 isOpponent1Recorded; + if (isDouble) + isOpponent1Recorded = (!isInGamePartner && isRecorded && !isMulti && isRecordedLink); + else + isOpponent1Recorded = isRecorded && isRecordedLink; - gBattlersCount = 2; + if (isOpponent1Recorded) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToRecordedOpponent; + else + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent; + + // Player 2 + if (isInGamePartner) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner; + else if (isRecorded) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToRecordedPlayer; + else if (isAIvsAI) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner; + else + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer; + + // Opponent 2 + if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent; + else + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToRecordedOpponent; } - } - else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle()) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; + bool32 bufferPartyOrders; - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } + if (!isLink) + bufferPartyOrders = (isInGamePartner || (isRecorded && isMulti)); else + bufferPartyOrders = (isDouble && isMulti); + + if (bufferPartyOrders) { - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; + BufferBattlePartyCurrentOrderBySide(0, 0); + BufferBattlePartyCurrentOrderBySide(1, 0); + BufferBattlePartyCurrentOrderBySide(2, 1); + BufferBattlePartyCurrentOrderBySide(3, 1); - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; + gBattlerPartyIndexes[0] = 0; + gBattlerPartyIndexes[1] = 0; + gBattlerPartyIndexes[2] = 3; + if (!isLink && isInGamePartner && (BATTLE_TWO_VS_ONE_OPPONENT || WILD_DOUBLE_BATTLE)) + gBattlerPartyIndexes[3] = 1; + else + gBattlerPartyIndexes[3] = 3; } } - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - { - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - { - gBattleMainFunc = BeginBattleIntro; - - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkPartner; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } - else - { - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkPartner; - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - - gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - - gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - - gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - - gBattlersCount = MAX_BATTLERS_COUNT; - } - - BufferBattlePartyCurrentOrderBySide(0, 0); - BufferBattlePartyCurrentOrderBySide(1, 0); - BufferBattlePartyCurrentOrderBySide(2, 1); - BufferBattlePartyCurrentOrderBySide(3, 1); - gBattlerPartyIndexes[0] = 0; - gBattlerPartyIndexes[1] = 0; - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; - } else { - multiplayerId = GetMultiplayerId(); + u8 multiplayerId = isLink ? GetMultiplayerId() : gRecordedBattleMultiplayerId; - if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) - gBattleMainFunc = BeginBattleIntro; - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < MAX_LINK_PLAYERS; i++) { + u32 linkPositionLeft, linkPositionRight; + BattleControllerFunc linkBtlControllerFunc; + + if (i == multiplayerId) + { + linkPositionLeft = B_POSITION_PLAYER_LEFT; + linkPositionRight = B_POSITION_PLAYER_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToPlayer : SetControllerToRecordedPlayer; + } + else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) + || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) + { + linkPositionLeft = B_POSITION_PLAYER_LEFT; + linkPositionRight = B_POSITION_PLAYER_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToLinkPartner : SetControllerToRecordedPlayer; + } + else + { + linkPositionLeft = B_POSITION_OPPONENT_LEFT; + linkPositionRight = B_POSITION_OPPONENT_RIGHT; + linkBtlControllerFunc = isLink ? SetControllerToLinkOpponent : SetControllerToRecordedOpponent; + } + gBattlerControllerFuncs[gLinkPlayers[i].id] = linkBtlControllerFunc; switch (gLinkPlayers[i].id) { case 0: case 3: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 0); + gBattlerPositions[gLinkPlayers[i].id] = linkPositionLeft; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: BufferBattlePartyCurrentOrderBySide(gLinkPlayers[i].id, 1); + gBattlerPositions[gLinkPlayers[i].id] = linkPositionRight; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } - - if (i == multiplayerId) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) - || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - else - { - gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent; - switch (gLinkPlayers[i].id) - { - case 0: - case 3: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; - break; - case 1: - case 2: - gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; - break; - } - } - } } - - gBattlersCount = MAX_BATTLERS_COUNT; } } From 1f8455c769da4df8f126c350c7e017fc0a425b33 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 22 Jun 2025 14:39:13 -0400 Subject: [PATCH 073/248] Fixed TM and Berries disappearing when sorting (#7168) --- src/item.c | 4 +- test/bag.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 test/bag.c diff --git a/src/item.c b/src/item.c index 5696b38111..e9bbfeaad9 100644 --- a/src/item.c +++ b/src/item.c @@ -588,9 +588,9 @@ void SortBerriesOrTMHMs(enum Pocket pocketId) { for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) { - if (GetBagItemQuantity(pocketId, i) != 0) + if (GetBagItemQuantity(pocketId, i) != 0 || GetBagItemId(pocketId, i) != ITEM_NONE) { - if (GetBagItemQuantity(pocketId, j) == 0) + if (GetBagItemQuantity(pocketId, j) == 0 || GetBagItemId(pocketId, j) == ITEM_NONE) continue; if (GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) continue; diff --git a/test/bag.c b/test/bag.c new file mode 100644 index 0000000000..67e9a42442 --- /dev/null +++ b/test/bag.c @@ -0,0 +1,105 @@ +#include "global.h" +#include "battle.h" +#include "event_data.h" +#include "item.h" +#include "pokemon.h" +#include "test/overworld_script.h" +#include "test/test.h" + +TEST("TMs and HMs are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_TM_HM]; + + RUN_OVERWORLD_SCRIPT( + additem ITEM_HM07; + additem ITEM_TM25; + additem ITEM_TM14; + additem ITEM_TM42; + additem ITEM_HM05; + additem ITEM_TM05; + additem ITEM_TM01; + additem ITEM_HM02; + ); + + SortBerriesOrTMHMs(POCKET_TM_HM); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_TM01); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_TM05); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TM14); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_TM25); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_TM42); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_HM02); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_HM05); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_HM07); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Berries are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_BERRIES]; + + RUN_OVERWORLD_SCRIPT( + additem ITEM_POMEG_BERRY; + additem ITEM_MAGOST_BERRY; + additem ITEM_KELPSY_BERRY; + additem ITEM_MICLE_BERRY; + additem ITEM_CHARTI_BERRY; + additem ITEM_GANLON_BERRY; + additem ITEM_ORAN_BERRY; + additem ITEM_CHERI_BERRY; + ); + + SortBerriesOrTMHMs(POCKET_BERRIES); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHERI_BERRY); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_ORAN_BERRY); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_POMEG_BERRY); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_KELPSY_BERRY); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_MAGOST_BERRY); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_CHARTI_BERRY); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_GANLON_BERRY); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_MICLE_BERRY); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Items are correctly compacted in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_ITEMS]; + memset(pocket->itemSlots, 0, sizeof(gSaveBlock1Ptr->bag.items)); + + RUN_OVERWORLD_SCRIPT( + additem ITEM_NUGGET; + additem ITEM_BIG_NUGGET; + additem ITEM_TINY_MUSHROOM; + additem ITEM_BIG_MUSHROOM; + additem ITEM_PEARL; + additem ITEM_BIG_PEARL; + ); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + + // Try removing the small items, check that everything is compacted correctly + + RUN_OVERWORLD_SCRIPT( + removeitem ITEM_NUGGET; + removeitem ITEM_TINY_MUSHROOM; + removeitem ITEM_PEARL; + ); + + CompactItemsInBagPocket(POCKET_ITEMS); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + +} From 625918daf6aba287263b7af3656ac05c7e9b6826 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 23 Jun 2025 13:11:59 +0200 Subject: [PATCH 074/248] Add assumes for bag tests (#7188) --- test/bag.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/bag.c b/test/bag.c index 67e9a42442..a3fb0318dd 100644 --- a/test/bag.c +++ b/test/bag.c @@ -10,6 +10,15 @@ TEST("TMs and HMs are sorted correctly in the bag") { struct BagPocket *pocket = &gBagPockets[POCKET_TM_HM]; + ASSUME(GetItemPocket(ITEM_HM07) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM25) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM14) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM42) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_HM05) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM05) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_TM01) == POCKET_TM_HM); + ASSUME(GetItemPocket(ITEM_HM02) == POCKET_TM_HM); + RUN_OVERWORLD_SCRIPT( additem ITEM_HM07; additem ITEM_TM25; @@ -38,6 +47,15 @@ TEST("Berries are sorted correctly in the bag") { struct BagPocket *pocket = &gBagPockets[POCKET_BERRIES]; + ASSUME(GetItemPocket(ITEM_POMEG_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_MAGOST_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_KELPSY_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_MICLE_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_CHARTI_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_GANLON_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_ORAN_BERRY) == POCKET_BERRIES); + ASSUME(GetItemPocket(ITEM_CHERI_BERRY) == POCKET_BERRIES); + RUN_OVERWORLD_SCRIPT( additem ITEM_POMEG_BERRY; additem ITEM_MAGOST_BERRY; @@ -67,6 +85,13 @@ TEST("Items are correctly compacted in the bag") struct BagPocket *pocket = &gBagPockets[POCKET_ITEMS]; memset(pocket->itemSlots, 0, sizeof(gSaveBlock1Ptr->bag.items)); + ASSUME(GetItemPocket(ITEM_NUGGET) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_NUGGET) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_TINY_MUSHROOM) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_MUSHROOM) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_PEARL) == POCKET_ITEMS); + ASSUME(GetItemPocket(ITEM_BIG_PEARL) == POCKET_ITEMS); + RUN_OVERWORLD_SCRIPT( additem ITEM_NUGGET; additem ITEM_BIG_NUGGET; From 66e8200d956087cfee095ae993f8fe7942c1808a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 23 Jun 2025 15:26:31 +0200 Subject: [PATCH 075/248] Use battler arguments for SetMoveEffect (#7156) --- asm/macros/battle_script.inc | 27 +- data/battle_scripts_1.s | 390 ++++++++++----------- data/battle_scripts_2.s | 2 +- include/battle_script_commands.h | 20 +- include/constants/battle.h | 5 +- include/constants/battle_script_commands.h | 8 +- include/gba/defines.h | 1 + src/battle_end_turn.c | 4 +- src/battle_script_commands.c | 254 +++++++------- src/battle_util.c | 4 +- 10 files changed, 364 insertions(+), 351 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 2527172079..5d4fd7ed34 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -102,18 +102,22 @@ jumpifhalfword CMP_EQUAL, sMOVE_EFFECT, MOVE_EFFECT_CONTINUE, 1b .endm - .macro seteffectprimary moveEffect=0 + .macro seteffectprimary battler:req, effectBattler:req, moveEffect=0 .if \moveEffect != 0 setmoveeffect \moveEffect .endif .byte 0x16 + .byte \battler + .byte \effectBattler .endm - .macro seteffectsecondary moveEffect=0 + .macro seteffectsecondary battler:req, effectBattler:req, moveEffect=0 .if \moveEffect != 0 setmoveeffect \moveEffect .endif .byte 0x17 + .byte \battler + .byte \effectBattler .endm .macro clearvolatile battler:req, volatile:req @@ -350,6 +354,10 @@ .2byte \frames .endm + .macro setchargingturn + .byte 0x40 + .endm + .macro waitstate .byte 0x3a .endm @@ -599,6 +607,11 @@ .4byte \status2 .endm + .macro setmoveeffect effect:req + sethword sMOVE_EFFECT, \effect + sethword sSAVED_MOVE_EFFECT, \effect + .endm + .macro chosenstatusanimation battler:req, isStatus2:req, status:req .byte 0x66 .byte \battler @@ -767,8 +780,9 @@ .byte 0x88 .endm - .macro statbuffchange flags:req, failInstr:req, stats=0 + .macro statbuffchange battler:req, flags:req, failInstr:req, stats=0 .byte 0x89 + .byte \battler .2byte \flags .4byte \failInstr .byte \stats @@ -2348,11 +2362,6 @@ setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7 .endm - .macro setmoveeffect effect:req - sethword sMOVE_EFFECT, \effect - sethword sSAVED_MOVE_EFFECT, \effect - .endm - .macro chosenstatus1animation battler:req, status:req chosenstatusanimation \battler, 0x0, \status .endm @@ -2517,7 +2526,7 @@ .if \animation == FALSE setbyte sSTAT_ANIM_PLAYED, TRUE .endif - statbuffchange STAT_CHANGE_ALLOW_PTR, \script + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, \script .ifnb \customString printstring \customString .else diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6c77113eb2..718fc2ee5a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -66,12 +66,12 @@ BattleScript_LowerAtkSpAtk:: jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd BattleScript_LowerAtkSpAtkDoAnim:: setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk, BIT_SPATK + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkTrySpAtk:: setstatchanger STAT_SPATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerAtkSpAtkEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerAtkSpAtkEnd: @@ -97,12 +97,12 @@ BattleScript_SpicyExtract_RaiseAtk: waitanimation BattleScript_SpicyExtract_SkipAttackAnim: setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtractDefenseDown printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtractDefenseDown: setstatchanger STAT_DEF, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectSpicyExtract_End printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectSpicyExtract_End: @@ -175,17 +175,17 @@ BattleScript_FilletAwayTryAttack:: attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk, BIT_SPATK | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpAtk, BIT_SPATK | BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpAtk:: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayTrySpeed, BIT_SPEED printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayTrySpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FilletAwayEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayEnd:: @@ -235,7 +235,7 @@ BattleScript_SyrupBombEndTurn:: flushtextbox playanimation BS_ATTACKER, B_ANIM_SYRUP_BOMB_SPEED_DROP setstatchanger STAT_SPEED, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_SyrupBombTurnDmgEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_CHECK_PREVENTION | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_SyrupBombTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SyrupBombTurnDmgEnd: @@ -491,7 +491,7 @@ BattleScript_EffectAttackUpUserAlly_Works: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAttackUpUserAlly_TryAlly: @@ -501,7 +501,7 @@ BattleScript_EffectAttackUpUserAlly_End: BattleScript_EffectAttackUpUserAlly_TryAlly_: jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAlly_AllyString pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER @@ -563,7 +563,7 @@ BattleScript_Teatimesorb_end: BattleScript_Teatimerod: call BattleScript_AbilityPopUpTarget setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -574,7 +574,7 @@ BattleScript_Teatimerod: BattleScript_Teatimemotor: call BattleScript_AbilityPopUpTarget setstatchanger STAT_SPEED, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -710,7 +710,7 @@ BattleScript_SkyDropChangedTarget: goto BattleScript_MoveEnd BattleScript_SkyDropFlyingConfuseLock: - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: clearvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_MoveEnd @@ -776,13 +776,13 @@ BattleScript_FlingBlockedByShieldDust:: goto BattleScript_FlingEnd BattleScript_FlingFlameOrb: - seteffectsecondary MOVE_EFFECT_BURN + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_BURN goto BattleScript_FlingEnd BattleScript_FlingFlinch: - seteffectsecondary MOVE_EFFECT_FLINCH + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_FLINCH goto BattleScript_FlingEnd BattleScript_FlingLightBall: - seteffectsecondary MOVE_EFFECT_PARALYSIS + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PARALYSIS goto BattleScript_FlingEnd BattleScript_FlingMentalHerb: curecertainstatuses BS_TARGET @@ -795,10 +795,10 @@ BattleScript_FlingMentalHerb: restoretarget goto BattleScript_FlingEnd BattleScript_FlingPoisonBarb: - seteffectsecondary MOVE_EFFECT_POISON + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_POISON goto BattleScript_FlingEnd BattleScript_FlingToxicOrb: - seteffectsecondary MOVE_EFFECT_TOXIC + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_TOXIC goto BattleScript_FlingEnd BattleScript_FlingWhiteHerb: tryresetnegativestatstages BS_TARGET @@ -847,12 +847,12 @@ BattleScript_EffectOctolock:: BattleScript_OctolockEndTurn:: setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef, BIT_SPDEF + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctolockTryLowerSpDef, BIT_SPDEF printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctolockTryLowerSpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_OctlockTurnDmgEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_OctlockTurnDmgEnd: @@ -878,7 +878,7 @@ BattleScript_EffectTarShot:: setstatchanger STAT_SPEED, 1, TRUE attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TryTarShot + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TryTarShot printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TryTarShot: @@ -897,7 +897,7 @@ BattleScript_EffectNoRetreat:: waitanimation call BattleScript_AllStatsUp jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_MoveEnd - seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_TARGET, BS_TARGET, MOVE_EFFECT_PREVENT_ESCAPE printstring STRINGID_CANTESCAPEDUETOUSEDMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -961,7 +961,7 @@ BattleScript_EffectStuffCheeks:: setbyte sBERRY_OVERRIDE, 0 removeitem BS_ATTACKER setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StuffCheeksEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StuffCheeksEnd: @@ -979,13 +979,13 @@ BattleScript_DecorateBoost: attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_DecorateBoostSpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DecorateBoostSpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DecorateBoostSpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1008,13 +1008,13 @@ BattleScript_CoachingWorks: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef, BIT_DEF + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_CoachingBoostDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoachingBoostDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoachingBoostDef: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1133,7 +1133,7 @@ BattleScript_EffectStrengthSap:: ppreduce jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MIN_STAT_STAGE, BattleScript_StrengthSapTryLower pause B_WAIT_TIME_SHORT - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1143,7 +1143,7 @@ BattleScript_StrengthSapTryLower: BattleScript_StrengthSapAnimation: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StrengthSapHp printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1172,7 +1172,7 @@ BattleScript_StrengthSapLiquidOoze: tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_StrengthSapMustLower: - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_MoveEnd goto BattleScript_StrengthSapAnimation @@ -1221,19 +1221,19 @@ BattleScript_VCreateStatLoss:: jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_VCreateStatLossRet BattleScript_VCreateStatAnim: setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef, BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: setstatchanger STAT_SPEED, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateStatLossRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1279,12 +1279,12 @@ BattleScript_EffectPartingShotTryAtk: attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk, BIT_SPATK printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotTrySpAtk: setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotSwitch + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectPartingShotSwitch printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectPartingShotSwitch: @@ -1313,10 +1313,10 @@ BattleScript_EffectAromaticMist:: goto BattleScript_ButItFailed BattleScript_EffectAromaticMistWorks: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_EffectAromaticMistWontGoHigher + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_EffectAromaticMistWontGoHigher attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAromaticMistEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectAromaticMistEnd: @@ -1345,14 +1345,14 @@ BattleScript_EffectMagneticFluxTryDef: waitanimation BattleScript_EffectMagneticFluxSkipAnim: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef, BIT_SPDEF + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxTrySpDef addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxTrySpDef: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds @@ -1382,14 +1382,14 @@ BattleScript_EffectGearUpTryAtk: waitanimation BattleScript_EffectGearUpSkipAnim: setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpTrySpAtk addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds @@ -1411,7 +1411,7 @@ BattleScript_EffectAcupressureTry: tryaccupressure BS_TARGET, BattleScript_ButItFailed attackanimation waitanimation - statbuffchange MOVE_EFFECT_CERTAIN, BattleScript_MoveEnd + statbuffchange BS_TARGET, STAT_CHANGE_CERTAIN, BattleScript_MoveEnd printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1450,7 +1450,7 @@ BattleScript_FlowerShieldLoop: goto BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldLoop2: setstatchanger STAT_DEF, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_FlowerShieldMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_FlowerShieldMoveTargetEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlowerShieldDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd pause 21 @@ -1458,7 +1458,7 @@ BattleScript_FlowerShieldLoop2: BattleScript_FlowerShieldDoAnim: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd BattleScript_FlowerShieldString: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1484,13 +1484,13 @@ BattleScript_RototillerLoop: BattleScript_RototillerCheckAffected: jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect setstatchanger STAT_ATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerMoveTargetEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1649,7 +1649,7 @@ BattleScript_DefogWorks: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefogDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_DefogTryHazardsWithAnim pause B_WAIT_TIME_SHORT @@ -1657,7 +1657,7 @@ BattleScript_DefogWorks: BattleScript_DefogDoAnim:: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazards + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazards BattleScript_DefogPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1702,14 +1702,14 @@ BattleScript_EffectAutotomize:: attackcanceler attackstring ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AutotomizeAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_AutotomizePrintString BattleScript_AutotomizeAttackAnim:: attackanimation waitanimation - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AutotomizeWeightLoss BattleScript_AutotomizePrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1748,7 +1748,7 @@ BattleScript_ToxicThreadWorks: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ToxicThreadTryPsn + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ToxicThreadTryPsn jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_ToxicThreadDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_ToxicThreadTryPsn pause B_WAIT_TIME_SHORT @@ -1756,12 +1756,12 @@ BattleScript_ToxicThreadWorks: BattleScript_ToxicThreadDoAnim:: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_ToxicThreadTryPsn BattleScript_ToxicThreadPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ToxicThreadTryPsn:: - seteffectprimary MOVE_EFFECT_POISON + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_POISON goto BattleScript_MoveEnd BattleScript_EffectVenomDrench:: @@ -1779,19 +1779,19 @@ BattleScript_VenomDrenchDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk, BIT_SPATK | BIT_SPEED + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk, BIT_SPATK | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpAtk:: setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed, BIT_SPEED + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpeed:: setstatchanger STAT_SPEED, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1809,13 +1809,13 @@ BattleScript_NobleRoarDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarTryLowerSpAtk:: setstatchanger STAT_SPATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1835,31 +1835,31 @@ BattleScript_ShellSmashTryDef:: attackanimation waitanimation setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTrySpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_ShellSmashTryAttack + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTryAttack jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTryAttack printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTryAttack: setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk, BIT_SPATK | BIT_SPEED, + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk, BIT_SPATK | BIT_SPEED, jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpeed: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1889,7 +1889,7 @@ BattleScript_GrowthDoMoveAnim:: BattleScript_GrowthAtk2: setstatchanger STAT_ATK, 2, FALSE BattleScript_GrowthAtk: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk, BIT_SPATK + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1900,7 +1900,7 @@ BattleScript_GrowthTrySpAtk:: BattleScript_GrowthSpAtk2: setstatchanger STAT_SPATK, 2, FALSE BattleScript_GrowthSpAtk: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1961,13 +1961,13 @@ BattleScript_ShiftGearDoMoveAnim: BattleScript_ShiftGearSpeedBy1: setstatchanger STAT_SPEED, 1, FALSE BattleScript_ShiftGearDoSpeed: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk, BIT_ATK + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk, BIT_ATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearTryAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearTryAtk: setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1985,19 +1985,19 @@ BattleScript_CoilDoMoveAnim: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef, BIT_DEF | BIT_ACC + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef, BIT_DEF | BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryDef: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc, BIT_ACC + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc, BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryAcc: setstatchanger STAT_ACC, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -2015,19 +2015,19 @@ BattleScript_QuiverDanceDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef, BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -2045,19 +2045,19 @@ BattleScript_VictoryDanceDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef, BIT_DEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef, BIT_DEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTryDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -2082,13 +2082,13 @@ BattleScript_AttackSpAttackUpDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk, BIT_SPATK + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -2105,13 +2105,13 @@ BattleScript_AttackAccUpDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc, BIT_ACC + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc, BIT_ACC jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpTryAcc:: setstatchanger STAT_ACC, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -2969,7 +2969,7 @@ BattleScript_EffectStatUp:: BattleScript_EffectStatUpAfterAtkCanceler:: attackstring ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_StatUpPrintString @@ -2977,7 +2977,7 @@ BattleScript_StatUpAttackAnim:: attackanimation waitanimation BattleScript_StatUpDoAnim:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd BattleScript_StatUpPrintString:: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -3023,7 +3023,7 @@ BattleScript_StatDownFromAttackString: attackstring ppreduce BattleScript_EffectStatDownFromStatBuffChange: - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT @@ -3031,7 +3031,7 @@ BattleScript_EffectStatDownFromStatBuffChange: BattleScript_StatDownDoAnim:: attackanimation waitanimation - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StatDownEnd bicword gHitMarker, HITMARKER_DISABLE_ANIMATION BattleScript_StatDownPrintString:: printfromtable gStatDownStringIds @@ -3044,7 +3044,7 @@ BattleScript_MirrorArmorReflect:: call BattleScript_AbilityPopUp jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect BattleScript_MirrorArmorReflectStatLoss: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectPrintString goto BattleScript_MirrorArmorReflectWontFall BattleScript_MirrorArmorReflectPrintString: @@ -3285,7 +3285,7 @@ BattleScript_EffectConfuse:: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3434,19 +3434,19 @@ BattleScript_GeomancyDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef, BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpDef:: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -3464,7 +3464,7 @@ BattleScript_FirstChargingTurn:: ppreduce BattleScript_FirstChargingTurnAfterAttackString: setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP - seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER + setchargingturn twoturnmoveschargestringandanimation setadditionaleffects @ only onChargeTurnOnly effects will work here return @@ -3527,7 +3527,7 @@ BattleScript_MoveUsedMustRecharge:: BattleScript_EffectRage:: attackcanceler accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE - seteffectprimary MOVE_EFFECT_RAGE + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_RAGE goto BattleScript_HitFromAtkString BattleScript_RageMiss:: clearvolatile BS_ATTACKER, VOLATILE_RAGE @@ -3606,7 +3606,7 @@ BattleScript_EffectHappyHour:: ppreduce attackanimation waitanimation - seteffectprimary MOVE_EFFECT_HAPPY_HOUR + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_HAPPY_HOUR goto BattleScript_MoveEnd BattleScript_EffectDisable:: @@ -3804,7 +3804,7 @@ BattleScript_EffectMeanLook:: .endif attackanimation waitanimation - seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PREVENT_ESCAPE printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3821,7 +3821,7 @@ BattleScript_EffectNightmare:: BattleScript_NightmareWorked:: attackanimation waitanimation - seteffectprimary MOVE_EFFECT_NIGHTMARE + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NIGHTMARE printstring STRINGID_PKMNFELLINTONIGHTMARE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3851,17 +3851,17 @@ BattleScript_CurseTrySpeed:: attackanimation waitanimation setstatchanger STAT_SPEED, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryAttack printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryAttack:: setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense, BIT_DEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseTryDefense, BIT_DEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseTryDefense:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CurseEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CurseEnd:: @@ -3990,14 +3990,14 @@ BattleScript_EffectSwagger:: attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SwaggerTryConfuse: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd BattleScript_EffectFuryCutter:: @@ -4219,7 +4219,7 @@ BattleScript_EffectBellyDrum:: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER setstatchanger STAT_ATK, MAX_STAT_STAGE, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printstring STRINGID_PKMNCUTHPMAXEDATTACK waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4326,7 +4326,7 @@ BattleScript_EffectDefenseCurl:: ppreduce setdefensecurlbit setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString attackanimation waitanimation @@ -4416,13 +4416,13 @@ BattleScript_EffectStockpile:: jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_EffectStockpileEnd BattleScript_EffectStockpileDef: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -4439,7 +4439,7 @@ BattleScript_MoveEffectStockpileWoreOff:: return BattleScript_StockpileStatChangeDown: - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_StockpileStatChangeDown_Ret + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN, BattleScript_StockpileStatChangeDown_Ret printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StockpileStatChangeDown_Ret: @@ -4528,14 +4528,14 @@ BattleScript_EffectFlatter:: attackanimation waitanimation setstatchanger STAT_SPATK, 1, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FlatterTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd BattleScript_EffectNonVolatileStatus:: @@ -4569,14 +4569,14 @@ BattleScript_EffectMemento:: waitanimation jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect setstatchanger STAT_ATK, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk, BIT_SPATK @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTrySpAtk: setstatchanger STAT_SPATK, 2, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint @ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTryFaint printfromtable gStatDownStringIds @@ -4642,7 +4642,7 @@ BattleScript_EffectCharge:: waitanimation .if B_CHARGE_SPDEF_RAISE >= GEN_5 setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectChargeString printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -4926,13 +4926,13 @@ BattleScript_TickleDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef, BIT_DEF + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleTryLowerDef:: setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -4956,13 +4956,13 @@ BattleScript_CosmicPowerDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -4979,13 +4979,13 @@ BattleScript_BulkUpDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef, BIT_DEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -5004,13 +5004,13 @@ BattleScript_CalmMindDoMoveAnim:: waitanimation BattleScript_CalmMindStatRaise:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -5035,13 +5035,13 @@ BattleScript_DragonDanceDoMoveAnim:: attackanimation waitanimation setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -5705,13 +5705,13 @@ BattleScript_WeaknessPolicyAtk: playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk, BIT_SPATK + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicySpAtk printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicySpAtk: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicyRemoveItem printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG @@ -5722,11 +5722,11 @@ BattleScript_WeaknessPolicyEnd: BattleScript_TargetItemStatRaise:: copybyte sBATTLER, gBattlerTarget - statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_TargetItemStatRaiseRemoveItemRet + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_TargetItemStatRaiseRemoveItemRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_TargetItemStatRaiseRemoveItemRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet + statbuffchange BS_TARGET, 0, BattleScript_TargetItemStatRaiseRemoveItemRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET @@ -5735,11 +5735,11 @@ BattleScript_TargetItemStatRaiseRemoveItemRet: BattleScript_AttackerItemStatRaise:: copybyte sBATTLER, gBattlerAttacker - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerItemStatRaiseRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerItemStatRaiseRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackerItemStatRaiseRet playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - statbuffchange MOVE_EFFECT_AFFECTS_USER, BattleScript_AttackerItemStatRaiseRet + statbuffchange BS_ATTACKER, 0, BattleScript_AttackerItemStatRaiseRet printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER @@ -5753,7 +5753,7 @@ BattleScript_MistProtected:: return BattleScript_RageIsBuilding:: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RageIsBuildingEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RageIsBuildingEnd printstring STRINGID_PKMNRAGEBUILDING waitmessage B_WAIT_TIME_LONG BattleScript_RageIsBuildingEnd: @@ -5887,7 +5887,7 @@ BattleScript_StickyWebOnSwitchIn:: printstring STRINGID_STICKYWEBSWITCHIN waitmessage B_WAIT_TIME_LONG jumpifability BS_TARGET, ABILITY_MIRROR_ARMOR, BattleScript_MirrorArmorReflectStickyWeb - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd + statbuffchange BS_TARGET, STAT_CHANGE_CHECK_PREVENTION | STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StickyWebOnSwitchInEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -5931,7 +5931,7 @@ BattleScript_GulpMissileNoDmgGorging: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation swapattackerwithtarget - seteffectprimary MOVE_EFFECT_PARALYSIS + seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PARALYSIS swapattackerwithtarget return BattleScript_GulpMissileNoSecondEffectGorging: @@ -5959,7 +5959,7 @@ BattleScript_GulpMissileNoDmgGulping: waitanimation swapattackerwithtarget @ to make gStatDownStringIds down below print the right battler setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_GulpMissileGulpingEnd + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_GulpMissileGulpingEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GulpMissileGulpingEnd: @@ -6050,27 +6050,27 @@ BattleScript_AllStatsUp:: jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_AllStatsUpRet BattleScript_AllStatsUpAtk:: setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpDef:: setstatchanger STAT_DEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpeed:: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk, BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpSpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AllStatsUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AllStatsUpRet:: @@ -6359,13 +6359,13 @@ BattleScript_PrintMonIsRootedRet:: BattleScript_AtkDefDown:: setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef, BIT_DEF + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef, BIT_DEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownTryDef: setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownRet + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownRet: @@ -6373,13 +6373,13 @@ BattleScript_AtkDefDownRet: BattleScript_DefSpDefDown:: setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef, BIT_SPDEF jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownTrySpDef:: setstatchanger STAT_SPDEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -6391,13 +6391,13 @@ BattleScript_DefDownSpeedUp:: jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_DefDownSpeedUpRet BattleScript_DefDownSpeedUpTryDef:: setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpTrySpeed: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_CERTAIN, BattleScript_DefDownSpeedUpRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -6717,7 +6717,7 @@ BattleScript_CottonDownLoop: jumpiffainted BS_TARGET, TRUE, BattleScript_CottonDownLoopIncrement setstatchanger STAT_SPEED, 1, TRUE jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_CottonDownTargetSpeedCantGoLower printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -6879,11 +6879,11 @@ BattleScript_MoveUsedFlinchedEnd: goto BattleScript_MoveEnd BattleScript_TryActivateSteadFast: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveUsedFlinchedEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveUsedFlinchedEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_MoveUsedFlinchedEnd copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd setbyte gBattleCommunication STAT_SPEED stattextbuffer BS_ATTACKER printstring STRINGID_ATTACKERABILITYSTATRAISE @@ -7152,9 +7152,9 @@ BattleScript_DrizzleActivates:: BattleScript_AbilityRaisesDefenderStat:: pause B_WAIT_TIME_SHORT - statbuffchange STAT_CHANGE_ONLY_CHECKING, BattleScript_AbilityCantRaiseDefenderStat + statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_AbilityCantRaiseDefenderStat call BattleScript_AbilityPopUp - statbuffchange 0, BattleScript_AbilityCantRaiseDefenderStat + statbuffchange BS_TARGET, 0, BattleScript_AbilityCantRaiseDefenderStat printstring STRINGID_DEFENDERSSTATROSE waitmessage B_WAIT_TIME_LONG return @@ -7196,7 +7196,7 @@ BattleScript_AbilityPopUpOverwriteThenNormal: BattleScript_SpeedBoostActivates:: call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd printstring STRINGID_PKMNRAISEDSPEED waitmessage B_WAIT_TIME_LONG BattleScript_SpeedBoostActivatesEnd: @@ -7209,14 +7209,14 @@ sZero: BattleScript_MoodyActivates:: call BattleScript_AbilityPopUp jumpifbyteequal sSTATCHANGER, sZero, BattleScript_MoodyLower - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_MoodyLower printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyLower: jumpifbyteequal sSAVED_STAT_CHANGER, sZero, BattleScript_MoodyEnd copybyte sSTATCHANGER, sSAVED_STAT_CHANGER - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_MoodyEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -7407,7 +7407,7 @@ BattleScript_TryIntimidateHoldEffects: jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_TryIntimidateHoldEffectsRet setstatchanger STAT_SPEED, 1, FALSE playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_TryIntimidateHoldEffectsRet copybyte sBATTLER, gBattlerTarget setlastuseditem BS_TARGET printstring STRINGID_USINGITEMSTATOFPKMNROSE @@ -7433,7 +7433,7 @@ BattleScript_IntimidateLoop: BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_ATK, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_IntimidateWontDecrease printstring STRINGID_PKMNCUTSATTACKWITH @@ -7495,7 +7495,7 @@ BattleScript_SupersweetSyrupLoop: BattleScript_SupersweetSyrupEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_EVASION, 1, TRUE - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_SupersweetSyrupContrary jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SupersweetSyrupWontDecrease printfromtable gStatDownStringIds @@ -7619,31 +7619,31 @@ BattleScript_CommanderActivates:: waitmessage B_WAIT_TIME_LONG BattleScript_CommanderAtkIncrease: setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease, BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease, BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderDefIncrease: setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease, BIT_SPATK | BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease, BIT_SPATK | BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpAtkIncrease: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease, BIT_SPDEF | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease, BIT_SPDEF | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpDefIncrease: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpeedIncrease: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -7824,7 +7824,7 @@ BattleScript_MoveStatDrain:: attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont .if B_ABSORBING_ABILITY_STRING >= GEN_5 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -8016,7 +8016,7 @@ BattleScript_WanderingSpiritActivatesRet: BattleScript_TargetsStatWasMaxedOut:: call BattleScript_AbilityPopUp - statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_TargetsStatWasMaxedOutRet + statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_TargetsStatWasMaxedOutRet printstring STRINGID_TARGETSSTATWASMAXEDOUT waitmessage B_WAIT_TIME_LONG BattleScript_TargetsStatWasMaxedOutRet: @@ -8025,7 +8025,7 @@ BattleScript_TargetsStatWasMaxedOutRet: BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet waitanimation printstring STRINGID_BATTLERABILITYRAISEDSTAT waitmessage B_WAIT_TIME_LONG @@ -8038,7 +8038,7 @@ BattleScript_ScriptingAbilityStatRaise:: call BattleScript_AbilityPopUp saveattacker copybyte gBattlerAttacker, sBATTLER - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_ScriptingAbilityStatRaiseRet + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_ScriptingAbilityStatRaiseRet printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_ScriptingAbilityStatRaiseRet: @@ -8048,7 +8048,7 @@ BattleScript_ScriptingAbilityStatRaiseRet: BattleScript_WeakArmorActivates:: call BattleScript_AbilityPopUp setstatchanger STAT_DEF, 1, TRUE - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefPrintString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST @@ -8065,7 +8065,7 @@ BattleScript_WeakArmorActivatesSpeed: .else setstatchanger STAT_SPEED, 1, FALSE .endif - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedPrintString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST @@ -8080,27 +8080,27 @@ BattleScript_WeakArmorActivatesEnd: return BattleScript_RaiseStatOnFaintingTarget:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_RaiseStatOnFaintingTarget_End + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_RaiseStatOnFaintingTarget_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseStatOnFaintingTarget_End printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseStatOnFaintingTarget_End: return BattleScript_AttackerAbilityStatRaise:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_AttackerAbilityStatRaise_End: return BattleScript_FellStingerRaisesStat:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_FellStingerRaisesAtkEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -8200,7 +8200,7 @@ BattleScript_SpikyShieldRet:: BattleScript_KingsShieldEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - seteffectsecondary + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NONE copybyte sBATTLER, gBattlerTarget copybyte gBattlerTarget, gBattlerAttacker copybyte gBattlerAttacker, sBATTLER @@ -8210,7 +8210,7 @@ BattleScript_KingsShieldEffect:: BattleScript_BanefulBunkerEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE clearmoveresultflags MOVE_RESULT_NO_EFFECT - setnonvolatilestatus TRIGGER_ON_ATTACKER + setnonvolatilestatus TRIGGER_ON_PROTECT setmoveresultflags MOVE_RESULT_MISSED return @@ -8226,7 +8226,7 @@ BattleScript_GooeyActivates:: waitstate call BattleScript_AbilityPopUp swapattackerwithtarget @ for defiant, mirror armor - seteffectsecondary MOVE_EFFECT_SPD_MINUS_1 + seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_SPD_MINUS_1 swapattackerwithtarget return @@ -8252,19 +8252,19 @@ BattleScript_BattleBondActivatesOnMoveEndAttacker:: BattleScript_EffectBattleBondStatIncrease:: call BattleScript_AbilityPopUp setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk, BIT_SPATK | BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk, BIT_SPATK | BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed, BIT_SPEED + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed, BIT_SPEED jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpeed: setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -8339,7 +8339,7 @@ BattleScript_TruantLoafingAround:: BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP waitmessage B_WAIT_TIME_LONG - seteffectprimary MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_ATTACKER, BS_ATTACKER, MOVE_EFFECT_SLEEP moveendto MOVEEND_NEXT_TARGET end @@ -8628,7 +8628,7 @@ BattleScript_BerryConfuseHealEnd2_Anim: orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION removeitem BS_SCRIPTING end2 @@ -8644,8 +8644,8 @@ BattleScript_BerryConfuseHealRet_Anim: orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE healthbarupdate BS_SCRIPTING datahpupdate BS_SCRIPTING - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN - removeitem BS_TARGET + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION + removeitem BS_SCRIPTING return BattleScript_ConsumableStatRaiseEnd2:: @@ -8663,9 +8663,9 @@ BattleScript_ConsumableStatRaiseRet:: BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_ConsumableStatRaiseRet_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp removeitem BS_SCRIPTING @@ -8830,7 +8830,7 @@ BattleScript_MirrorHerbCopyStatChange:: removeitem BS_SCRIPTING BattleScript_MirrorHerbStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_MirrorHerbStartReturn - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_MirrorHerbStartCopyStats BattleScript_MirrorHerbStartReturn: @@ -8841,7 +8841,7 @@ BattleScript_OpportunistCopyStatChange:: call BattleScript_AbilityPopUpScripting BattleScript_OpportunistStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_OpportunistCopyStatChangeEnd - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once @@ -8859,7 +8859,7 @@ BattleScript_TotemVar_Ret:: BattleScript_TotemVarEnd: return BattleScript_ApplyTotemVarBoost: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TotemVarEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TotemVarEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_TotemVar_Ret @loop until stats bitfield is empty @@ -8997,7 +8997,7 @@ BattleScript_RecoverHPZMove:: return BattleScript_StatUpZMove:: - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpZMoveEnd printstring STRINGID_ZMOVESTATUP waitmessage B_WAIT_TIME_LONG @@ -9028,27 +9028,27 @@ BattleScript_ExtremeEvoboostAnim: attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostDef, BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostDef:: setstatchanger STAT_DEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed, BIT_SPEED | BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpeed:: setstatchanger STAT_SPEED, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk, BIT_SPATK | BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk, BIT_SPATK | BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpAtk:: setstatchanger STAT_SPATK, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef, BIT_SPDEF + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef, BIT_SPDEF printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostSpDef:: setstatchanger STAT_SPDEF, 2, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ExtremeEvoboostEnd:: @@ -9303,7 +9303,7 @@ BattleScript_TargetAbilityStatRaiseRet:: copybyte gBattlerAbility, gEffectBattler copybyte gBattlerAttacker, gBattlerTarget call BattleScript_AbilityPopUp - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End + statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End call BattleScript_StatUp BattleScript_TargetAbilityStatRaiseRet_End: copybyte gBattlerAttacker, sSAVED_BATTLER @@ -9339,7 +9339,7 @@ BattleScript_EffectRaiseStatAllies:: copybyte gBattlerTarget, gBattlerAttacker BattleScript_RaiseSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RaiseSideStatsIncrement printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -9355,7 +9355,7 @@ BattleScript_EffectLowerStatFoes:: copybyte sBATTLER, gBattlerTarget BattleScript_LowerSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerSideStatsIncrement printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -9556,7 +9556,7 @@ BattleScript_EffectRaiseCritAlliesAnim:: BattleScript_RaiseCritAlliesLoop: jumpifabsent BS_TARGET, BattleScript_RaiseCritAlliesIncrement setstatchanger STAT_ATK, 0, FALSE @ for animation - statbuffchange 0, BattleScript_RaiseCritAlliesIncrement @ for animation + statbuffchange BS_TARGET, 0, BattleScript_RaiseCritAlliesIncrement @ for animation printstring STRINGID_PKMNGETTINGPUMPED waitmessage B_WAIT_TIME_LONG BattleScript_RaiseCritAlliesIncrement: @@ -9684,15 +9684,15 @@ BattleScript_BerserkGeneRet:: saveattacker savetarget copybyte gBattlerTarget, sBATTLER - statbuffchange STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp BattleScript_BerserkGeneRet_TryConfuse: jumpifability BS_ATTACKER, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents jumpifsafeguard BattleScript_BerserkGeneRet_SafeguardProtected - seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER + seteffectprimary BS_ATTACKER, BS_ATTACKER, MOVE_EFFECT_CONFUSION goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_SafeguardProtected:: pause B_WAIT_TIME_SHORT diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 630c51b9e8..004b4ca8ab 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -104,7 +104,7 @@ BattleScript_ItemHealAndCureStatusEnd:: BattleScript_ItemIncreaseStat:: call BattleScript_UseItemMessage itemincreasestat - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_ItemEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG end diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index b28988bf55..df7163840f 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -22,6 +22,24 @@ struct PickupItem u8 percentage[10]; }; +union TRANSPARENT StatChangeFlags +{ + int raw; + u32 raw_u32; + u16 raw_u16; + u8 raw_u8; + struct { + bool32 allowPtr:1; // STAT_CHANGE_ALLOW_PTR + bool32 mirrorArmored:1; // STAT_CHANGE_MIRROR_ARMOR + bool32 onlyChecking:1; // STAT_CHANGE_ONLY_CHECKING + bool32 notProtectAffected:1; // STAT_CHANGE_NOT_PROTECT_AFFECTED + bool32 updateMoveEffect:1; // STAT_CHANGE_UPDATE_MOVE_EFFECT + bool32 statDropPrevention:1; // STAT_CHANGE_CHECK_PREVENTION + bool32 certain:1; // STAT_CHANGE_CERTAIN + bool32 padding:25; + }; +}; + s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); @@ -30,7 +48,7 @@ u8 GetBattlerTurnOrderNum(u8 battler); bool32 NoAliveMonsForBattlerSide(u32 battler); bool32 NoAliveMonsForPlayer(void); bool32 NoAliveMonsForEitherParty(void); -void SetMoveEffect(bool32 primary, bool32 certain); +void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certain); bool32 CanBattlerSwitch(u32 battlerId); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); diff --git a/include/constants/battle.h b/include/constants/battle.h index 35bc9b4c58..a3af32bb4a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -141,7 +141,7 @@ enum VolatileFlags // Volatile status ailments // These are removed after exiting the battle or switching -/* Definitions with names e.g. "Confusion" are accessible in the debug menu +/* Definitions with names e.g. "Confusion" are accessible in the debug menu * Enum, Type, (Field name, (optional)bitSize), Flags, (optional)(Debug menu header, (optional)max. value) */ #define VOLATILE_DEFINITIONS(F) \ @@ -390,7 +390,6 @@ enum MoveEffects MOVE_EFFECT_TRI_ATTACK, MOVE_EFFECT_UPROAR, MOVE_EFFECT_PAYDAY, - MOVE_EFFECT_CHARGING, MOVE_EFFECT_WRAP, MOVE_EFFECT_ATK_PLUS_1, MOVE_EFFECT_DEF_PLUS_1, @@ -515,8 +514,6 @@ enum MoveEffects #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_AFFECTS_USER 0x2000 -#define MOVE_EFFECT_CERTAIN 0x4000 #define MOVE_EFFECT_CONTINUE 0x8000 // Battle environment defines for gBattleEnvironment. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 0399b53c12..630687e0b3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -222,8 +222,10 @@ enum CmdVarious #define STAT_CHANGE_ALLOW_PTR (1 << 0) // If set, allow use of jumpptr. If not set and unable to raise/lower stats, jump to failInstr. #define STAT_CHANGE_MIRROR_ARMOR (1 << 1) // Stat change redirection caused by Mirror Armor ability. #define STAT_CHANGE_ONLY_CHECKING (1 << 2) // Checks if the stat change can occur. Does not change stats or play stat change animation. -#define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 5) -#define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 6) +#define STAT_CHANGE_NOT_PROTECT_AFFECTED (1 << 3) +#define STAT_CHANGE_UPDATE_MOVE_EFFECT (1 << 4) +#define STAT_CHANGE_CHECK_PREVENTION (1 << 5) +#define STAT_CHANGE_CERTAIN (1 << 6) // stat flags for TryPlayStatChangeAnimation #define BIT_HP (1 << 0) @@ -301,7 +303,7 @@ enum StatusTrigger { TRIGGER_ON_MOVE, TRIGGER_ON_ABILITY, - TRIGGER_ON_ATTACKER, + TRIGGER_ON_PROTECT, }; #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/include/gba/defines.h b/include/gba/defines.h index 6d2b9f910a..fe775820d8 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -24,6 +24,7 @@ #define ALIGNED(n) __attribute__((aligned(n))) #define PACKED __attribute__((packed)) +#define TRANSPARENT __attribute__ ((__transparent_union__)) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) #define INTR_CHECK (*(u16 *)0x3007FF8) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 11ccfdf745..7d4314c6dd 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -470,8 +470,8 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) { - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(TRUE, FALSE); + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; + SetMoveEffect(battler, battler, TRUE, FALSE); if (gBattleMons[battler].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); effect = TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9edb0bb7cb..e9b088d93a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -319,7 +319,7 @@ enum GiveCaughtMonStates #define TAG_LVLUP_BANNER_MON_ICON 55130 static void TrySetDestinyBondToHappen(void); -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const u8 *BS_ptr); +static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr); static bool32 IsMonGettingExpSentOut(void); static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); @@ -409,7 +409,7 @@ static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); static void Cmd_end3(void); -static void Cmd_unused5(void); +static void Cmd_setchargingturn(void); static void Cmd_call(void); static void Cmd_setroost(void); static void Cmd_jumpifabilitypresent(void); @@ -668,7 +668,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_end, //0x3D Cmd_end2, //0x3E Cmd_end3, //0x3F - Cmd_unused5, //0x40 + Cmd_setchargingturn, //0x40 Cmd_call, //0x41 Cmd_setroost, //0x42 Cmd_jumpifabilitypresent, //0x43 @@ -1434,8 +1434,17 @@ static void JumpIfMoveFailed(u32 adder, u32 move, u32 moveType, const u8 *failIn gBattlescriptCurrInstr += adder; } -static void Cmd_unused5(void) +static void Cmd_setchargingturn(void) { + CMD_ARGS(); + + if (!gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + { + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; + gLockedMoves[gBattlerAttacker] = gCurrentMove; + gProtectStructs[gBattlerAttacker].chargingTurn = TRUE; + } + gBattlescriptCurrInstr = cmd->nextInstr; } static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, const u8 *failInstr) @@ -3244,11 +3253,13 @@ static void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects ef gBattleStruct->poisonPuppeteerConfusion = TRUE; } -void SetMoveEffect(bool32 primary, bool32 certain) +// To avoid confusion the arguments are naned battler/effectBattler since they can be different from gBattlerAttacker/gBattlerTarget +void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certain) { - s32 i, affectsUser = 0; + s32 i; + bool32 affectsUser = (battler == effectBattler); bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); - u32 flags = 0; + union StatChangeFlags flags = {0}; u32 battlerAbility; bool32 activateAfterFaint = FALSE; @@ -3275,37 +3286,22 @@ void SetMoveEffect(bool32 primary, bool32 certain) break; } - if (gBattleScripting.moveEffect & MOVE_EFFECT_AFFECTS_USER) - { - gEffectBattler = gBattlerAttacker; // battler that effects get applied on - gBattleScripting.moveEffect &= ~MOVE_EFFECT_AFFECTS_USER; - affectsUser = MOVE_EFFECT_AFFECTS_USER; - gBattleScripting.battler = gBattlerTarget; // theoretically the attacker - } - else - { - gEffectBattler = gBattlerTarget; - gBattleScripting.battler = gBattlerAttacker; - } - + gBattleScripting.battler = battler; + gEffectBattler = effectBattler; battlerAbility = GetBattlerAbility(gEffectBattler); - // Just in case this flag is still set - gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; - - if (!primary && affectsUser != MOVE_EFFECT_AFFECTS_USER + if (!primary && !affectsUser && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && IsMoveEffectBlockedByTarget(battlerAbility)) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; else if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) - && !primary - && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) + && !primary) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; - else if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) + else if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && !affectsUser) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; switch (gBattleScripting.moveEffect) @@ -3451,18 +3447,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) MOVE_EFFECT_PARALYSIS }; gBattleScripting.moveEffect = RandomElement(RNG_TRI_ATTACK, sTriAttackEffects); - SetMoveEffect(primary, certain); + SetMoveEffect(battler, effectBattler, primary, certain); } break; - case MOVE_EFFECT_CHARGING: - if (!(gBattleMons[gEffectBattler].status2 & STATUS2_MULTIPLETURNS)) - { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; - gLockedMoves[gEffectBattler] = gCurrentMove; - gProtectStructs[gEffectBattler].chargingTurn = TRUE; - } - gBattlescriptCurrInstr++; - break; case MOVE_EFFECT_WRAP: if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) { @@ -3497,16 +3484,18 @@ void SetMoveEffect(bool32 primary, bool32 certain) case MOVE_EFFECT_ACC_PLUS_1: case MOVE_EFFECT_EVS_PLUS_1: if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, - 0, 0) == STAT_CHANGE_DIDNT_WORK) + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1), + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect; gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; @@ -3519,26 +3508,25 @@ void SetMoveEffect(bool32 primary, bool32 certain) case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; + flags.certain = affectsUser; if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; + flags.allowPtr = TRUE; else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + flags.updateMoveEffect = TRUE; - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, - flags, - 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + if (ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, + flags, + 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) { if (!mirrorArmorReflected) gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect; gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; @@ -3552,16 +3540,18 @@ void SetMoveEffect(bool32 primary, bool32 certain) case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_EVS_PLUS_2: if (NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, - 0, 0) == STAT_CHANGE_DIDNT_WORK) + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(2), + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect; gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; @@ -3574,26 +3564,25 @@ void SetMoveEffect(bool32 primary, bool32 certain) case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (affectsUser == MOVE_EFFECT_AFFECTS_USER) - flags = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN; - else - flags = 0; + flags.certain = affectsUser; if (mirrorArmorReflected && !affectsUser) - flags |= STAT_CHANGE_ALLOW_PTR; + flags.allowPtr = TRUE; else - flags |= STAT_CHANGE_UPDATE_MOVE_EFFECT; + flags.updateMoveEffect = TRUE; - if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, - gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, - flags, - 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) + if (ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, + flags, + 0, gBattlescriptCurrInstr + 1) == STAT_CHANGE_DIDNT_WORK) { if (!mirrorArmorReflected) gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect; gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; @@ -3838,7 +3827,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) { static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects); - SetMoveEffect(primary, certain); + SetMoveEffect(battler, effectBattler, primary, certain); } break; case MOVE_EFFECT_STEALTH_ROCK: @@ -3955,7 +3944,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) break; } } - SetMoveEffect(primary, certain); + SetMoveEffect(battler, effectBattler, primary, certain); break; case MOVE_EFFECT_PSYCHIC_NOISE: battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); @@ -4004,17 +3993,19 @@ void SetMoveEffect(bool32 primary, bool32 certain) } if (!commanderAffected || NoAliveMonsForEitherParty() - || ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - stat, - affectsUser | STAT_CHANGE_UPDATE_MOVE_EFFECT, - 0, - 0) == STAT_CHANGE_DIDNT_WORK) + || ChangeStatBuffs( + effectBattler, + SET_STAT_BUFF_VALUE(1), + stat, + STAT_CHANGE_UPDATE_MOVE_EFFECT, + 0, + 0) == STAT_CHANGE_DIDNT_WORK) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect; gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; @@ -4508,9 +4499,11 @@ static void Cmd_setadditionaleffects(void) // Activate effect if it's primary (chance == 0) or if RNGesus says so if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance)) { - gBattleScripting.moveEffect = additionalEffect->moveEffect | (MOVE_EFFECT_AFFECTS_USER * (additionalEffect->self)); + gBattleScripting.moveEffect = additionalEffect->moveEffect; SetMoveEffect( + gBattlerAttacker, + additionalEffect->self ? gBattlerAttacker : gBattlerTarget, percentChance == 0, // a primary effect percentChance >= 100 // certain to happen ); @@ -4545,16 +4538,22 @@ static void Cmd_setadditionaleffects(void) static void Cmd_seteffectprimary(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, u8 effectBattler); - SetMoveEffect(TRUE, FALSE); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 effectBattler = GetBattlerForBattleScript(cmd->effectBattler); + gBattlescriptCurrInstr = cmd->nextInstr - 1; + SetMoveEffect(battler, effectBattler, TRUE, FALSE); } static void Cmd_seteffectsecondary(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, u8 effectBattler); - SetMoveEffect(FALSE, FALSE); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 effectBattler = GetBattlerForBattleScript(cmd->effectBattler); + gBattlescriptCurrInstr = cmd->nextInstr - 1; + SetMoveEffect(battler, effectBattler, FALSE, FALSE); } static void Cmd_clearvolatile(void) @@ -11104,7 +11103,7 @@ static void Cmd_various(void) // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. if (gBattleMons[gBattlerTarget].status2 & STATUS2_LOCK_CONFUSE) - gBattleScripting.moveEffect = (MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN); + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; return; } case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. @@ -12101,43 +12100,26 @@ static void TryPlayStatChangeAnimation(u32 battler, u32 ability, u32 stats, s32 } } -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const u8 *BS_ptr) +static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr) { - u32 index, battler, battlerAbility; + u32 index, battlerAbility; enum ItemHoldEffect battlerHoldEffect; - bool32 certain = (flags & MOVE_EFFECT_CERTAIN); - bool32 notProtectAffected = (flags & STAT_CHANGE_NOT_PROTECT_AFFECTED); - bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); - bool32 mirrorArmored = (flags & STAT_CHANGE_MIRROR_ARMOR); - bool32 onlyChecking = (flags & STAT_CHANGE_ONLY_CHECKING); - - if (affectsUser) - battler = gBattlerAttacker; - else - battler = gBattlerTarget; - battlerAbility = GetBattlerAbility(battler); battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); - gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; - flags &= ~(STAT_CHANGE_ONLY_CHECKING | STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED); - if (battlerAbility == ABILITY_CONTRARY) { statValue ^= STAT_BUFF_NEGATIVE; - if (!onlyChecking) + if (!flags.onlyChecking) { gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; RecordAbilityBattle(battler, battlerAbility); - if (flags & STAT_CHANGE_UPDATE_MOVE_EFFECT) - { - flags &= ~STAT_CHANGE_UPDATE_MOVE_EFFECT; + if (flags.updateMoveEffect) gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect); - } } } - else if (battlerAbility == ABILITY_SIMPLE && !onlyChecking) + else if (battlerAbility == ABILITY_SIMPLE && !flags.onlyChecking) { statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); RecordAbilityBattle(battler, battlerAbility); @@ -12148,10 +12130,10 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const if (statValue <= -1) // Stat decrease. { if (gSideTimers[GetBattlerSide(battler)].mistTimer - && !certain && gCurrentMove != MOVE_CURSE + && !flags.certain && gCurrentMove != MOVE_CURSE && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) { - if (flags & STAT_CHANGE_ALLOW_PTR) + if (flags.allowPtr) { if (gSpecialStatuses[battler].statLowered) { @@ -12168,14 +12150,14 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const return STAT_CHANGE_DIDNT_WORK; } else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) + && !flags.notProtectAffected && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) { return STAT_CHANGE_DIDNT_WORK; } else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) - && (!affectsUser || mirrorArmored) && !certain && gCurrentMove != MOVE_CURSE) + && (flags.statDropPrevention || gBattlerAttacker != gBattlerTarget || flags.mirrorArmored) && !flags.certain && gCurrentMove != MOVE_CURSE) { - if (flags & STAT_CHANGE_ALLOW_PTR) + if (flags.allowPtr) { if (gSpecialStatuses[battler].statLowered) { @@ -12204,9 +12186,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const } return STAT_CHANGE_DIDNT_WORK; } - else if ((index = IsFlowerVeilProtected(battler)) && !certain) + else if ((index = IsFlowerVeilProtected(battler)) && !flags.certain) { - if (flags & STAT_CHANGE_ALLOW_PTR) + if (flags.allowPtr) { if (gSpecialStatuses[battler].statLowered) { @@ -12224,13 +12206,13 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const } return STAT_CHANGE_DIDNT_WORK; } - else if (!certain + else if (!flags.certain && (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC) || (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { - if (flags & STAT_CHANGE_ALLOW_PTR) + if (flags.allowPtr) { BattleScriptPush(BS_ptr); gBattleScripting.battler = battler; @@ -12241,9 +12223,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const } return STAT_CHANGE_DIDNT_WORK; } - else if (battlerAbility == ABILITY_MIRROR_ARMOR && !affectsUser && !mirrorArmored && gBattlerAttacker != gBattlerTarget && battler == gBattlerTarget) + else if (battlerAbility == ABILITY_MIRROR_ARMOR && !flags.mirrorArmored && gBattlerAttacker != gBattlerTarget && battler == gBattlerTarget) { - if (flags & STAT_CHANGE_ALLOW_PTR) + if (flags.allowPtr) { SET_STATCHANGER(statId, GET_STAT_BUFF_VALUE(statValue) | STAT_BUFF_NEGATIVE, TRUE); BattleScriptPush(BS_ptr); @@ -12288,7 +12270,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; } - else if (!onlyChecking) + else if (!flags.onlyChecking) { gProtectStructs[battler].statFell = TRUE; gProtectStructs[battler].lashOutAffected = TRUE; @@ -12329,7 +12311,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; } - else if (!onlyChecking) + else if (!flags.onlyChecking) { u32 statIncrease; if ((statValue + gBattleMons[battler].statStages[statId]) > MAX_STAT_STAGE) @@ -12369,13 +12351,13 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE) // same as B_MSG_STAT_WONT_DECREASE { - if (!(flags & STAT_CHANGE_ALLOW_PTR)) + if (!flags.allowPtr) return STAT_CHANGE_DIDNT_WORK; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; return STAT_CHANGE_WORKED; } - if (onlyChecking) + if (flags.onlyChecking) return STAT_CHANGE_WORKED; gBattleMons[battler].statStages[statId] += statValue; @@ -12389,25 +12371,27 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, u32 stats, const else stats &= ~(1u << statId); - TryPlayStatChangeAnimation(battler, battlerAbility, stats, statValue, statId, certain); + TryPlayStatChangeAnimation(battler, battlerAbility, stats, statValue, statId, flags.certain); return STAT_CHANGE_WORKED; } static void Cmd_statbuffchange(void) { - CMD_ARGS(u16 flags, const u8 *failInstr, u8 stats); + CMD_ARGS(u8 battler, u16 flags, const u8 *failInstr, u8 stats); u16 flags = cmd->flags; u32 stats = cmd->stats; const u8 *ptrBefore = gBattlescriptCurrInstr; const u8 *failInstr = cmd->failInstr; - if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), - GET_STAT_BUFF_ID(gBattleScripting.statChanger), - flags, - stats, - failInstr) == STAT_CHANGE_WORKED) + if (ChangeStatBuffs( + GetBattlerForBattleScript(cmd->battler), + GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), + GET_STAT_BUFF_ID(gBattleScripting.statChanger), + flags, + stats, + failInstr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr = cmd->nextInstr; else if (gBattlescriptCurrInstr == ptrBefore) // Prevent infinite looping. gBattlescriptCurrInstr = failInstr; @@ -16417,15 +16401,15 @@ static void Cmd_setnonvolatilestatus(void) { case TRIGGER_ON_ABILITY: if (gBattleScripting.moveEffect == MOVE_EFFECT_CONFUSION) - SetMoveEffect(FALSE, FALSE); + SetMoveEffect(gBattleScripting.battler, gEffectBattler, FALSE, FALSE); else SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect, TRIGGER_ON_ABILITY); break; case TRIGGER_ON_MOVE: SetNonVolatileStatusCondition(gBattlerTarget, GetMoveNonVolatileStatus(gCurrentMove), TRIGGER_ON_MOVE); break; - case TRIGGER_ON_ATTACKER: - SetNonVolatileStatusCondition(gBattlerAttacker, gBattleScripting.moveEffect, TRIGGER_ON_ATTACKER); + case TRIGGER_ON_PROTECT: + SetNonVolatileStatusCondition(gBattlerAttacker, gBattleScripting.moveEffect, TRIGGER_ON_PROTECT); break; } } @@ -18190,10 +18174,12 @@ void BS_SpectralThiefPrintStats(void) { gBattleStruct->stolenStats[0] &= ~(1u << stat); SET_STATCHANGER(stat, gBattleStruct->stolenStats[stat], FALSE); - if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), - stat, - MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, - 0, NULL) == STAT_CHANGE_WORKED) + if (ChangeStatBuffs( + gBattlerAttacker, + GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), + stat, + STAT_CHANGE_CERTAIN, + 0, NULL) == STAT_CHANGE_WORKED) { BattleScriptCall(BattleScript_StatUp); return; diff --git a/src/battle_util.c b/src/battle_util.c index aa7ca68ecc..5eb0fc0696 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4960,7 +4960,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); - SetMoveEffect(FALSE, FALSE); + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); BattleScriptPop(); effect++; } @@ -7022,7 +7022,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); - SetMoveEffect(FALSE, FALSE); + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); BattleScriptPop(); } } From 59350cc32ff32f7a61890001c781dae5efb09468 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:15:04 +0200 Subject: [PATCH 076/248] Increase party action limit (#7119) --- include/battle_controllers.h | 2 +- src/battle_controller_opponent.c | 2 +- src/battle_controller_player.c | 12 ++++++------ src/battle_controller_player_partner.c | 2 +- src/battle_controllers.c | 5 +++-- src/battle_main.c | 10 +++++----- src/battle_script_commands.c | 8 ++++---- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index e55b3ef6e1..80c8c6ee38 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -298,7 +298,7 @@ void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, u16 it void BtlController_EmitYesNoBox(u32 battler, u32 bufferId); void BtlController_EmitChooseMove(u32 battler, u32 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData); void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrder); -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data); +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data); void BtlController_EmitHealthBarUpdate(u32 battler, u32 bufferId, u16 hpValue); void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expPoints); void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 0004e711f7..6cab244d95 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -543,7 +543,7 @@ static void OpponentHandleChoosePokemon(u32 battler) s32 pokemonInBattle = 1; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 78afeb27a6..df3345ed5a 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1557,7 +1557,7 @@ static void WaitForMonSelection(u32 battler) else BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, PARTY_SIZE, NULL); - if ((gBattleResources->bufferA[battler][1] & 0xF) == 1) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_SEND_OUT) PrintLinkStandbyMsg(); BtlController_Complete(battler); @@ -2119,9 +2119,9 @@ static void PlayerHandleChoosePokemon(u32 battler) for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CANT_SWITCH + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CHOOSE_FAINTED_MON + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); BtlController_Complete(battler); @@ -2129,8 +2129,8 @@ static void PlayerHandleChoosePokemon(u32 battler) else { gBattleControllerData[battler] = CreateTask(TaskDummy, 0xFF); - gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1] & 0xF; - *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][1] >> 4; + gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1]; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][8]; *(&gBattleStruct->prevSelectedPartySlot) = gBattleResources->bufferA[battler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[battler][3] & 0xFF) | (gBattleResources->bufferA[battler][7] << 8); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 11b6e8fa30..513e286d12 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -277,7 +277,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) { s32 chosenMonId; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index a9b0d875d4..2a5cdbece9 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1005,7 +1005,7 @@ void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrde PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data) +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data) { s32 i; @@ -1014,9 +1014,10 @@ void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 sl gBattleResources->transferBuffer[2] = slotId; gBattleResources->transferBuffer[3] = abilityId & 0xFF; gBattleResources->transferBuffer[7] = (abilityId >> 8) & 0xFF; + gBattleResources->transferBuffer[8] = battlerPreventingSwitchout; for (i = 0; i < 3; i++) gBattleResources->transferBuffer[4 + i] = data[i]; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 8); // Only 7 bytes were written. + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 9); // Only 7 bytes were written. } static void UNUSED BtlController_EmitCmd23(u32 battler, u32 bufferId) diff --git a/src/battle_main.c b/src/battle_main.c index acfbac6061..68e0cd049c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4299,21 +4299,21 @@ static void HandleTurnActionSelectionState(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA || !CanBattlerEscape(battler)) { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } else if (GetItemHoldEffect(gBattleMons[battler].item) != HOLD_EFFECT_SHED_SHELL && (i = IsAbilityPreventingEscape(battler))) // must be last to keep i value integrity { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, i - 1, gBattleStruct->battlerPartyOrders[battler]); } else { if (battler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else if (battler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } MarkBattlerForControllerExec(battler); break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e9b088d93a..04e41aa2cb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7695,7 +7695,7 @@ static void ChooseMonToSendOut(u32 battler, u8 slotId) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); } @@ -7873,7 +7873,7 @@ static void Cmd_openpartyscreen(void) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -15953,7 +15953,7 @@ static void Cmd_givecaughtmon(void) case GIVECAUGHTMON_DO_CHOOSE_MON: if (!gPaletteFade.active) { - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); MarkBattlerForControllerExec(gBattlerAttacker); gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; } @@ -18020,7 +18020,7 @@ void BS_TryRevivalBlessing(void) else { // Open party menu, wait to go to next instruction. - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); MarkBattlerForControllerExec(gBattlerAttacker); } } From b5956d8eba73cafcf80f3ca70297ac3647a3d720 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 24 Jun 2025 17:15:16 -0400 Subject: [PATCH 077/248] Fix healthbox when blending effects happen (#7203) --- src/battle_controllers.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 2a5cdbece9..4a631e3f71 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -154,19 +154,12 @@ static void InitBtlControllersInternal(void) else isPlayerPrimary = (!isRecordedLink || isRecordedMaster); - if (isPlayerPrimary) + gBattlerPositions[B_BATTLER_0] = isPlayerPrimary ? B_POSITION_PLAYER_LEFT : B_POSITION_OPPONENT_LEFT; + gBattlerPositions[B_BATTLER_1] = isPlayerPrimary ? B_POSITION_OPPONENT_LEFT : B_POSITION_PLAYER_LEFT; + if (isDouble) { - gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; - } - else - { - gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; - gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; + gBattlerPositions[B_BATTLER_2] = isPlayerPrimary ? B_POSITION_PLAYER_RIGHT : B_POSITION_OPPONENT_RIGHT; + gBattlerPositions[B_BATTLER_3] = isPlayerPrimary ? B_POSITION_OPPONENT_RIGHT : B_POSITION_PLAYER_RIGHT; } if (isLink) From bfb0c2fa73a2a46b065f69509e0e34bbdb7b3342 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Wed, 25 Jun 2025 03:59:25 -0500 Subject: [PATCH 078/248] Added createfollowernpc macro to make a new follower from a gfx id (#7196) --- asm/macros/event.inc | 15 +++- include/follower_npc.h | 3 - include/global.h | 10 +-- src/follower_npc.c | 196 +++++++++++++++++++++++------------------ 4 files changed, 128 insertions(+), 96 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 7ffdcccf0a..d58f0197c2 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2570,7 +2570,7 @@ @ Follower NPCs - @ Sets an NPC up to follow the player. + @ Sets an existing NPC up to follow the player. @ Follower flags are defined in include/constants/follower_npc.h @ If you want to specify a battle partner without specifying a custom script, you can set the script parameter to 0. .macro setfollowernpc localId:req, flags:req, script=0, battlePartner=0 @@ -2598,6 +2598,19 @@ .endif .endm + @ Creates a new follower NPC with the specified graphics id. + .macro createfollowernpc gfx:req, flags:req, script=0, battlePartner=0 + .if FNPC_ENABLE_NPC_FOLLOWERS + callnative ScriptCreateFollowerNPC + .2byte \gfx + .2byte \flags + .4byte \script + .2byte \battlePartner + .else + .error "createfollowernpc unavailable with FNPC_ENABLE_NPC_FOLLOWERS defined as FALSE" + .endif + .endm + @ Remove the follower NPC (assumes there will only ever be one). .macro destroyfollowernpc .if FNPC_ENABLE_NPC_FOLLOWERS diff --git a/include/follower_npc.h b/include/follower_npc.h index 52355a78b7..ec41fa1364 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -23,9 +23,6 @@ enum FollowerNPCDataTypes FNPC_DATA_OBJ_ID, FNPC_DATA_CURRENT_SPRITE, FNPC_DATA_DELAYED_STATE, - FNPC_DATA_MAP_ID, - FNPC_DATA_MAP_NUM, - FNPC_DATA_MAP_GROUP, FNPC_DATA_EVENT_FLAG, FNPC_DATA_GFX_ID, FNPC_DATA_FOLLOWER_FLAGS, diff --git a/include/global.h b/include/global.h index 8aaca8e495..fa185f3332 100644 --- a/include/global.h +++ b/include/global.h @@ -204,11 +204,11 @@ struct Time /*0x04*/ s8 seconds; }; -struct NPCFollowerMapData +struct NPCFollowerPadding { - u8 id; - u8 number; - u8 group; + u8 padding1; + u8 padding2; + u8 padding3; }; struct NPCFollower @@ -220,7 +220,7 @@ struct NPCFollower u8 objId; u8 currentSprite; u8 delayedState; - struct NPCFollowerMapData map; + struct NPCFollowerPadding padding; struct Coords16 log; const u8 *script; u16 flag; diff --git a/src/follower_npc.c b/src/follower_npc.c index 0a8cde49c8..67129548ac 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -49,6 +49,7 @@ static void SetFollowerNPCScriptPointer(const u8 *script); static void PlayerLogCoordinates(struct ObjectEvent *player); static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *script); +static void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr); static u32 GetFollowerNPCSprite(void); static bool32 IsStateMovement(u32 state); static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower); @@ -92,15 +93,6 @@ void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value) case FNPC_DATA_DELAYED_STATE: gSaveBlock3Ptr->NPCfollower.delayedState = value; break; - case FNPC_DATA_MAP_ID: - gSaveBlock3Ptr->NPCfollower.map.id = value; - break; - case FNPC_DATA_MAP_NUM: - gSaveBlock3Ptr->NPCfollower.map.number = value; - break; - case FNPC_DATA_MAP_GROUP: - gSaveBlock3Ptr->NPCfollower.map.group = value; - break; case FNPC_DATA_EVENT_FLAG: gSaveBlock3Ptr->NPCfollower.flag = value; break; @@ -161,12 +153,6 @@ u32 GetFollowerNPCData(enum FollowerNPCDataTypes type) return gSaveBlock3Ptr->NPCfollower.currentSprite; case FNPC_DATA_DELAYED_STATE: return gSaveBlock3Ptr->NPCfollower.delayedState; - case FNPC_DATA_MAP_ID: - return gSaveBlock3Ptr->NPCfollower.map.id; - case FNPC_DATA_MAP_NUM: - return gSaveBlock3Ptr->NPCfollower.map.number; - case FNPC_DATA_MAP_GROUP: - return gSaveBlock3Ptr->NPCfollower.map.group; case FNPC_DATA_EVENT_FLAG: return gSaveBlock3Ptr->NPCfollower.flag; case FNPC_DATA_GFX_ID: @@ -187,77 +173,97 @@ void ClearFollowerNPCData(void) #endif } -static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *ptr) +static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *scriptPtr) { struct ObjectEventTemplate npc; struct ObjectEvent *follower; - u32 npcX, npcY; - u32 faceDirection; - u32 eventObjId; + u32 eventObjId = GetObjectEventIdByLocalId(localId); + u32 npcX = gObjectEvents[eventObjId].currentCoords.x; + u32 npcY = gObjectEvents[eventObjId].currentCoords.y; const u8 *script; u32 flag; - // Only allow 1 follower NPC at a time. - if (PlayerHasFollowerNPC()) + flag = GetObjectEventFlagIdByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + // If the object does not have an event flag, don't create follower. + if (flag == 0) return; - for (eventObjId = 0; eventObjId < OBJECT_EVENTS_COUNT; eventObjId++) + if (setScript == TRUE) + // Set the custom script. + script = scriptPtr; + else + // Use the object's original script. + script = GetObjectEventScriptPointerByObjectEventId(eventObjId); + + RemoveObjectEvent(&gObjectEvents[eventObjId]); + FlagSet(flag); + + npc = *GetObjectEventTemplateByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + npc.movementType = 0; + npc.script = script; + npc.localId = OBJ_EVENT_ID_NPC_FOLLOWER; + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, npcX, npcY)); + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + MoveObjectEventToMapCoords(follower, npcX, npcY); + ObjectEventTurn(follower, gObjectEvents[eventObjId].facingDirection); + follower->movementType = MOVEMENT_TYPE_NONE; + gSprites[follower->spriteId].callback = MovementType_None; + + SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); + SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); + SetFollowerNPCScriptPointer(script); + SetFollowerNPCData(FNPC_DATA_EVENT_FLAG, flag); + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + + // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. + if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) + && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + + // Set the follower sprite to match the player state. + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) + FollowerNPC_HandleSprite(); +} + +static void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr) +{ + struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEvent *follower; + struct ObjectEventTemplate npc = { - if (!gObjectEvents[eventObjId].active || gObjectEvents[eventObjId].isPlayer) - continue; + .localId = OBJ_EVENT_ID_NPC_FOLLOWER, + .graphicsId = gfx, + .x = player->currentCoords.x, + .y = player->currentCoords.y, + .elevation = PlayerGetElevation(), + .script = scriptPtr + }; - if (gObjectEvents[eventObjId].localId == localId) - { - flag = GetObjectEventFlagIdByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - // If the object does not have an event flag, don't create follower. - if (flag == 0) - return; + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, player->currentCoords.x, player->currentCoords.y)); + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + follower->movementType = MOVEMENT_TYPE_NONE; + gSprites[follower->spriteId].callback = MovementType_None; + + SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); + SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + SetFollowerNPCScriptPointer(scriptPtr); - if (setScript == TRUE) - // Set the custom script. - script = ptr; - else - // Use the object's original script. - script = GetObjectEventScriptPointerByObjectEventId(eventObjId); + // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. + if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) + && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - npcX = gObjectEvents[eventObjId].currentCoords.x; - npcY = gObjectEvents[eventObjId].currentCoords.y; - faceDirection = gObjectEvents[eventObjId].facingDirection; - SetFollowerNPCData(FNPC_DATA_MAP_ID, gObjectEvents[eventObjId].localId); - RemoveObjectEvent(&gObjectEvents[eventObjId]); - FlagSet(flag); + // Set the follower sprite to match the player state. + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) + FollowerNPC_HandleSprite(); - npc = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - npc.movementType = 0; - npc.script = script; - npc.localId = OBJ_EVENT_ID_NPC_FOLLOWER; - SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, npcX, npcY)); - follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; - MoveObjectEventToMapCoords(follower, npcX, npcY); - ObjectEventTurn(follower, faceDirection); - follower->movementType = MOVEMENT_TYPE_NONE; - gSprites[follower->spriteId].callback = MovementType_None; - - SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); - SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); - SetFollowerNPCData(FNPC_DATA_MAP_NUM, gSaveBlock1Ptr->location.mapNum); - SetFollowerNPCData(FNPC_DATA_MAP_GROUP, gSaveBlock1Ptr->location.mapGroup); - SetFollowerNPCScriptPointer(script); - SetFollowerNPCData(FNPC_DATA_EVENT_FLAG, flag); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); - SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); - SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); - - // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. - if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) - && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - - // Set the follower sprite to match the player state. - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) - FollowerNPC_HandleSprite(); - } - } + HideNPCFollower(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); } static u32 GetFollowerNPCSprite(void) @@ -951,13 +957,13 @@ void SetFollowerNPCSprite(u32 spriteIndex) SetFollowerNPCData(FNPC_DATA_CURRENT_SPRITE, spriteIndex); oldSpriteId = follower->spriteId; newGraphicsId = GetFollowerNPCSprite(); + clone = *GetObjectEventTemplateByLocalIdAndMap(OBJ_EVENT_ID_NPC_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); backupFollower = *follower; backupFollower.graphicsId = newGraphicsId; DestroySprite(&gSprites[oldSpriteId]); RemoveObjectEvent(&gObjectEvents[GetFollowerNPCObjectId()]); - clone = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP)); clone.graphicsId = newGraphicsId; clone.movementType = 0; clone.localId = OBJ_EVENT_ID_NPC_FOLLOWER; @@ -1128,20 +1134,20 @@ void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive) void CreateFollowerNPCAvatar(void) { - struct ObjectEvent *player; - struct ObjectEventTemplate clone; - if (!PlayerHasFollowerNPC()) return; - player = &gObjectEvents[gPlayerAvatar.objectEventId]; - clone = *GetObjectEventTemplateByLocalIdAndMap(GetFollowerNPCData(FNPC_DATA_MAP_ID), GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP)); - - clone.graphicsId = GetFollowerNPCSprite(); - clone.x = player->currentCoords.x - 7; - clone.y = player->currentCoords.y - 7; - clone.movementType = 0; - clone.localId = OBJ_EVENT_ID_NPC_FOLLOWER; + struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEventTemplate clone = + { + .localId = OBJ_EVENT_ID_NPC_FOLLOWER, + .graphicsId = GetFollowerNPCSprite(), + .x = player->currentCoords.x - 7, + .y = player->currentCoords.y - 7, + .elevation = player->currentElevation, + .script = GetFollowerNPCScriptPointer(), + .movementType = MOVEMENT_TYPE_FACE_DOWN + }; switch (GetPlayerFacingDirection()) { @@ -1157,7 +1163,7 @@ void CreateFollowerNPCAvatar(void) } // Create NPC and store ID. - SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&clone, GetFollowerNPCData(FNPC_DATA_MAP_NUM), GetFollowerNPCData(FNPC_DATA_MAP_GROUP), clone.x, clone.y)); + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&clone, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, clone.x, clone.y)); if (GetFollowerNPCData(FNPC_DATA_OBJ_ID) == OBJECT_EVENTS_COUNT) { ClearFollowerNPCData(); @@ -1622,17 +1628,33 @@ void ScriptSetFollowerNPC(struct ScriptContext *ctx) u32 battlePartner = ScriptReadHalfword(ctx); const u8 *script = (const u8 *)ScriptReadWord(ctx); + if (PlayerHasFollowerNPC()) + return; + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, battlePartner); TurnNPCIntoFollower(localId, flags, setScript, script); } +void ScriptCreateFollowerNPC(struct ScriptContext *ctx) +{ + u32 gfx = ScriptReadHalfword(ctx); + u32 flags = ScriptReadHalfword(ctx); + const u8 *script = (const u8 *)ScriptReadWord(ctx); + u32 battlePartner = ScriptReadHalfword(ctx); + + if (PlayerHasFollowerNPC()) + return; + + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, battlePartner); + CreateFollowerNPC(gfx, flags, script); +} + void ScriptDestroyFollowerNPC(struct ScriptContext *ctx) { if (!PlayerHasFollowerNPC()) return; RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); - FlagSet(GetFollowerNPCData(FNPC_DATA_EVENT_FLAG)); ClearFollowerNPCData(); UpdateFollowingPokemon(); } From 03d3245a39bfbe9b5e12f925e719febfaea0be73 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 25 Jun 2025 09:57:41 -0400 Subject: [PATCH 079/248] Easier expandability of debug menu (#6910) --- src/debug.c | 1732 ++++++++++--------------------------------- src/field_weather.c | 30 + 2 files changed, 419 insertions(+), 1343 deletions(-) diff --git a/src/debug.c b/src/debug.c index e5e37e1b14..a1ffe50671 100644 --- a/src/debug.c +++ b/src/debug.c @@ -71,110 +71,6 @@ #include "fake_rtc.h" #include "save.h" -// ******************************* -enum DebugMenu -{ - DEBUG_MENU_ITEM_UTILITIES, - DEBUG_MENU_ITEM_PCBAG, - DEBUG_MENU_ITEM_PARTY, - DEBUG_MENU_ITEM_GIVE, - DEBUG_MENU_ITEM_PLAYER, - DEBUG_MENU_ITEM_SCRIPTS, - DEBUG_MENU_ITEM_FLAGVAR, - //DEBUG_MENU_ITEM_BATTLE, - DEBUG_MENU_ITEM_SOUND, - DEBUG_MENU_ITEM_ROMINFO, - DEBUG_MENU_ITEM_CANCEL, -}; - -enum UtilDebugMenu -{ - DEBUG_UTIL_MENU_ITEM_FLY, - DEBUG_UTIL_MENU_ITEM_WARP, - DEBUG_UTIL_MENU_ITEM_WEATHER, - DEBUG_UTIL_MENU_ITEM_FONT_TEST, - DEBUG_UTIL_MENU_ITEM_TIME_MENU, - DEBUG_UTIL_MENU_ITEM_WATCHCREDITS, - DEBUG_UTIL_MENU_ITEM_CHEAT, - DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS, - DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS, - DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI // Please keep this at the bottom <3 -}; - -enum TimeMenuDebugMenu -{ - DEBUG_TIME_MENU_ITEM_PRINTTIME, - DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY, - DEBUG_TIME_MENU_ITEM_TIMESOFDAY, - DEBUG_TIME_MENU_ITEM_WEEKDAYS, - DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK, - DEBUG_TIME_MENU_ITEM_SETWALLCLOCK, -}; - -enum TimeMenuTimeOfDay -{ - DEBUG_TIME_MENU_ITEM_MORNING, - DEBUG_TIME_MENU_ITEM_DAY, - DEBUG_TIME_MENU_ITEM_EVENING, - DEBUG_TIME_MENU_ITEM_NIGHT, -}; - -enum TimeMenuWeekdays -{ - DEBUG_TIME_MENU_ITEM_SUNDAY, - DEBUG_TIME_MENU_ITEM_MONDAY, - DEBUG_TIME_MENU_ITEM_TUESDAY, - DEBUG_TIME_MENU_ITEM_WEDNESDAY, - DEBUG_TIME_MENU_ITEM_THURSDAY, - DEBUG_TIME_MENU_ITEM_FRIDAY, - DEBUG_TIME_MENU_ITEM_SATURDAY, -}; - -enum GivePCBagDebugMenu -{ - DEBUG_PCBAG_MENU_ITEM_ACCESS_PC, - DEBUG_PCBAG_MENU_ITEM_FILL, - DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG, - DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES, -}; - -enum GivePCBagFillDebugMenu -{ - DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST, - DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW, - DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES, - DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS, -}; - -enum PartyDebugMenu -{ - DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER, - DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG, - DEBUG_PARTY_MENU_ITEM_HEAL_PARTY, - DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1, - DEBUG_PARTY_MENU_ITEM_CHECK_EVS, - DEBUG_PARTY_MENU_ITEM_CHECK_IVS, - DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY, - DEBUG_PARTY_MENU_ITEM_SET_PARTY, - DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE, -}; - -enum ScriptDebugMenu -{ - DEBUG_UTIL_MENU_ITEM_SCRIPT_1, - DEBUG_UTIL_MENU_ITEM_SCRIPT_2, - DEBUG_UTIL_MENU_ITEM_SCRIPT_3, - DEBUG_UTIL_MENU_ITEM_SCRIPT_4, - DEBUG_UTIL_MENU_ITEM_SCRIPT_5, - DEBUG_UTIL_MENU_ITEM_SCRIPT_6, - DEBUG_UTIL_MENU_ITEM_SCRIPT_7, - DEBUG_UTIL_MENU_ITEM_SCRIPT_8, -}; - enum FlagsVarsDebugMenu { DEBUG_FLAGVAR_MENU_ITEM_FLAGS, @@ -243,46 +139,6 @@ enum DebugBattleTerrain DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9, }; -enum GiveDebugMenu -{ - DEBUG_GIVE_MENU_ITEM_ITEM_X, - DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE, - DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX, - DEBUG_GIVE_MENU_ITEM_MAX_MONEY, - DEBUG_GIVE_MENU_ITEM_MAX_COINS, - DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS, - DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG, -}; - -enum SoundDebugMenu -{ - DEBUG_SOUND_MENU_ITEM_SE, - DEBUG_SOUND_MENU_ITEM_MUS, -}; - -enum BerryFunctionsMenu -{ - DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL, - DEBUG_BERRY_FUNCTIONS_MENU_READY, - DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE, - DEBUG_BERRY_FUNCTIONS_MENU_WEEDS, - DEBUG_BERRY_FUNCTIONS_MENU_PESTS, -}; - -enum PlayerDebugMenu -{ - DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME, - DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER, - DEBUG_PLAYER_MENU_ITEM_PLAYER_ID, -}; - -enum ROMInfoDebugMenu -{ - DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK, - DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE, - DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER, -}; - // ******************************* // Constants #define DEBUG_MENU_FONT FONT_NORMAL @@ -311,9 +167,22 @@ enum ROMInfoDebugMenu #define DEBUG_NUMBER_ICON_X 210 #define DEBUG_NUMBER_ICON_Y 50 -#define DEBUG_MAX_MENU_ITEMS 50 +#define DEBUG_MAX_MENU_ITEMS 20 +#define DEBUG_MAX_SUB_MENU_LEVELS 4 // ******************************* +struct DebugMenuOption; + +typedef void (*DebugFunc)(u8 taskId); +typedef void (*DebugSubmenuFunc)(u8 taskId, const struct DebugMenuOption *items); + +struct DebugMenuOption +{ + const u8 *text; + const void *action; + const void *actionParams; +}; + struct DebugMonData { u16 species; @@ -331,68 +200,33 @@ struct DebugMonData struct DebugMenuListData { - struct ListMenuItem listItems[20 + 1]; + const struct DebugMenuOption *subMenuItems[DEBUG_MAX_SUB_MENU_LEVELS]; + struct ListMenuItem listItems[DEBUG_MAX_MENU_ITEMS + 1]; u8 itemNames[DEBUG_MAX_MENU_ITEMS + 1][26]; u8 listId; }; -struct DebugBattleData -{ - u8 submenu; - u8 battleType; - enum BattleEnvironment battleTerrain; - bool8 aiFlags[AI_FLAG_COUNT]; -}; - // EWRAM static EWRAM_DATA struct DebugMonData *sDebugMonData = NULL; static EWRAM_DATA struct DebugMenuListData *sDebugMenuListData = NULL; -static EWRAM_DATA struct DebugBattleData *sDebugBattleData = NULL; EWRAM_DATA bool8 gIsDebugBattle = FALSE; EWRAM_DATA u64 gDebugAIFlags = 0; // ******************************* // Define functions -static void Debug_ReShowMainMenu(void); -static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate); +static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items); static void Debug_DestroyMenu(u8 taskId); -static void Debug_DestroyMenu_Full(u8 taskId); static void DebugAction_Cancel(u8 taskId); static void DebugAction_DestroyExtraWindow(u8 taskId); -static void Debug_InitDebugBattleData(void); static void Debug_RefreshListMenu(u8 taskId); -static void Debug_RedrawListMenu(u8 taskId); -static void DebugAction_Util_Script_1(u8 taskId); -static void DebugAction_Util_Script_2(u8 taskId); -static void DebugAction_Util_Script_3(u8 taskId); -static void DebugAction_Util_Script_4(u8 taskId); -static void DebugAction_Util_Script_5(u8 taskId); -static void DebugAction_Util_Script_6(u8 taskId); -static void DebugAction_Util_Script_7(u8 taskId); -static void DebugAction_Util_Script_8(u8 taskId); +static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId); +static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_ExecuteScript(u8 taskId, const u8 *script); -static void DebugAction_OpenUtilitiesMenu(u8 taskId); -static void DebugAction_OpenPCBagMenu(u8 taskId); -static void DebugAction_OpenPartyMenu(u8 taskId); -static void DebugAction_OpenScriptsMenu(u8 taskId); -static void DebugAction_OpenFlagsVarsMenu(u8 taskId); -static void DebugAction_OpenGiveMenu(u8 taskId); -static void DebugAction_OpenSoundMenu(u8 taskId); -static void DebugAction_OpenPlayerMenu(u8 taskId); -static void DebugAction_OpenROMInfoMenu(u8 taskId); - -static void DebugTask_HandleMenuInput_Main(u8 taskId); -static void DebugTask_HandleMenuInput_Utilities(u8 taskId); -static void DebugTask_HandleMenuInput_PCBag(u8 taskId); -static void DebugTask_HandleMenuInput_PCBag_Fill(u8 taskId); -static void DebugTask_HandleMenuInput_Party(u8 taskId); -static void DebugTask_HandleMenuInput_Scripts(u8 taskId); +static void DebugTask_HandleMenuInput_General(u8 taskId); static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId); -static void DebugTask_HandleMenuInput_Battle(u8 taskId); -static void DebugTask_HandleMenuInput_Give(u8 taskId); -static void DebugTask_HandleMenuInput_Sound(u8 taskId); -static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId); static void DebugAction_Util_Fly(u8 taskId); static void DebugAction_Util_Warp_Warp(u8 taskId); @@ -401,25 +235,12 @@ static void DebugAction_Util_Warp_SelectMap(u8 taskId); static void DebugAction_Util_Warp_SelectWarp(u8 taskId); static void DebugAction_Util_Weather(u8 taskId); static void DebugAction_Util_Weather_SelectId(u8 taskId); -static void DebugAction_Util_FontTest(u8 taskId); -static void DebugAction_TimeMenu_CheckWallClock(u8 taskId); -static void DebugAction_TimeMenu_SetWallClock(u8 taskId); static void DebugAction_Util_WatchCredits(u8 taskId); static void DebugAction_Util_CheatStart(u8 taskId); -static void DebugAction_Util_BerryFunctions(u8 taskId); -static void DebugAction_Util_CheckEWRAMCounters(u8 taskId); -static void DebugAction_Util_Steven_Multi(u8 taskId); -static void DebugAction_Util_OpenTimeMenu(u8 taskId); - -static void DebugAction_TimeMenu_PrintTime(u8 taskId); -static void DebugAction_TimeMenu_PrintTimeOfDay(u8 taskId); -static void DebugAction_TimeMenu_TimesOfDay(u8 taskId); -static void DebugAction_TimeMenu_Weekdays(u8 taskId); static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId); static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId); -static void DebugAction_OpenPCBagFillMenu(u8 taskId); static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId); static void DebugAction_PCBag_Fill_PCBoxes_Slow(u8 taskId); static void DebugAction_PCBag_Fill_PCItemStorage(u8 taskId); @@ -428,16 +249,10 @@ static void DebugAction_PCBag_Fill_PocketPokeBalls(u8 taskId); static void DebugAction_PCBag_Fill_PocketTMHM(u8 taskId); static void DebugAction_PCBag_Fill_PocketBerries(u8 taskId); static void DebugAction_PCBag_Fill_PocketKeyItems(u8 taskId); -static void DebugAction_PCBag_AccessPC(u8 taskId); static void DebugAction_PCBag_ClearBag(u8 taskId); static void DebugAction_PCBag_ClearBoxes(u8 taskId); -static void DebugAction_Party_MoveReminder(u8 taskId); -static void DebugAction_Party_HatchAnEgg(u8 taskId); static void DebugAction_Party_HealParty(u8 taskId); -static void DebugAction_Party_InflictStatus1(u8 taskId); -static void DebugAction_Party_CheckEVs(u8 taskId); -static void DebugAction_Party_CheckIVs(u8 taskId); static void DebugAction_Party_ClearParty(u8 taskId); static void DebugAction_Party_SetParty(u8 taskId); static void DebugAction_Party_BattleSingle(u8 taskId); @@ -464,8 +279,6 @@ static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId); static void DebugAction_FlagsVars_CatchingOnOff(u8 taskId); static void DebugAction_FlagsVars_RunningShoes(u8 taskId); -static void Debug_InitializeBattle(u8 taskId); - static void DebugAction_Give_Item(u8 taskId); static void DebugAction_Give_Item_SelectId(u8 taskId); static void DebugAction_Give_Item_SelectQuantity(u8 taskId); @@ -503,10 +316,6 @@ static void DebugAction_Player_Name(u8 taskId); static void DebugAction_Player_Gender(u8 taskId); static void DebugAction_Player_Id(u8 taskId); -static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId); -static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId); -static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId); - extern const u8 Debug_FlagsNotSetOverworldConfigMessage[]; extern const u8 Debug_FlagsNotSetBattleConfigMessage[]; extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; @@ -550,13 +359,14 @@ extern const u8 FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon[]; // Text // General +static const u8 sDebugText_Arrow[] = _("{CLEAR_TO 110}{RIGHT_ARROW}"); static const u8 sDebugText_True[] = _("TRUE"); static const u8 sDebugText_False[] = _("FALSE"); static const u8 sDebugText_Colored_True[] = _("{COLOR GREEN}TRUE"); static const u8 sDebugText_Colored_False[] = _("{COLOR RED}FALSE"); static const u8 sDebugText_Dashes[] = _("---"); static const u8 sDebugText_Empty[] = _(""); -static const u8 sDebugText_Continue[] = _("Continue…{CLEAR_TO 110}{RIGHT_ARROW}"); +static const u8 sDebugText_Continue[] = _("Continue…"); // Util Menu static const u8 sDebugText_Util_WarpToMap_SelectMapGroup[] = _("Group: {STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n\n{STR_VAR_3}{CLEAR_TO 90}"); static const u8 sDebugText_Util_WarpToMap_SelectMap[] = _("Map: {STR_VAR_1}{CLEAR_TO 90}\nMapSec:{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}{CLEAR_TO 90}"); @@ -584,20 +394,11 @@ static const u8 *const gTimeOfDayStringsTable[TIMES_OF_DAY_COUNT] = { }; // Flags/Vars Menu -static const u8 sDebugText_FlagsVars_Flag[] = _("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}"); static const u8 sDebugText_FlagsVars_VariableHex[] = _("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_FlagsVars_Variable[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); static const u8 sDebugText_FlagsVars_VariableValueSet[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); // Give Menu -static const u8 sDebugText_ItemQuantity[] = _("Quantity:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); -static const u8 sDebugText_ItemID[] = _("Item ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}"); -static const u8 sDebugText_PokemonID[] = _("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonLevel[] = _("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonShiny[] = _("Shiny:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonAbility[] = _("Ability Num: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonTeraType[] = _("Tera Type: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonDynamaxLevel[] = _("Dmax Lvl:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonGmaxFactor[] = _("Gmax Factor:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); static const u8 sDebugText_IVs[] = _("IV {STR_VAR_1}:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_EVs[] = _("EV {STR_VAR_1}:{CLEAR_TO 90}\n {STR_VAR_3}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); // Sound Menu @@ -631,382 +432,184 @@ static const s32 sPowersOfTen[] = }; // ******************************* -// List Menu Items -static const struct ListMenuItem sDebugMenu_Items_Main[] = +// Menu Actions. Make sure that submenus are defined before the menus that call them. +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu_TimesOfDay[] = { - [DEBUG_MENU_ITEM_UTILITIES] = {COMPOUND_STRING("Utilities…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_UTILITIES}, - [DEBUG_MENU_ITEM_PCBAG] = {COMPOUND_STRING("PC/Bag…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PCBAG}, - [DEBUG_MENU_ITEM_PARTY] = {COMPOUND_STRING("Party…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PARTY}, - [DEBUG_MENU_ITEM_GIVE] = {COMPOUND_STRING("Give X…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_GIVE}, - [DEBUG_MENU_ITEM_PLAYER] = {COMPOUND_STRING("Player…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PLAYER}, - [DEBUG_MENU_ITEM_SCRIPTS] = {COMPOUND_STRING("Scripts…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SCRIPTS}, - [DEBUG_MENU_ITEM_FLAGVAR] = {COMPOUND_STRING("Flags & Vars…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_FLAGVAR}, - //[DEBUG_MENU_ITEM_BATTLE] = {COMPOUND_STRING("Battle Test{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_BATTLE}, - [DEBUG_MENU_ITEM_SOUND] = {COMPOUND_STRING("Sound…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SOUND}, - [DEBUG_MENU_ITEM_ROMINFO] = {COMPOUND_STRING("ROM Info…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_ROMINFO}, - [DEBUG_MENU_ITEM_CANCEL] = {COMPOUND_STRING("Cancel"), DEBUG_MENU_ITEM_CANCEL}, + [TIME_MORNING] = { gTimeOfDayStringsTable[TIME_MORNING], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_DAY] = { gTimeOfDayStringsTable[TIME_DAY], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_EVENING] = { gTimeOfDayStringsTable[TIME_EVENING], DebugAction_TimeMenu_ChangeTimeOfDay }, + [TIME_NIGHT] = { gTimeOfDayStringsTable[TIME_NIGHT], DebugAction_TimeMenu_ChangeTimeOfDay }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Utilities[] = +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu_Weekdays[] = { - [DEBUG_UTIL_MENU_ITEM_FLY] = {COMPOUND_STRING("Fly to map…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FLY}, - [DEBUG_UTIL_MENU_ITEM_WARP] = {COMPOUND_STRING("Warp to map warp…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WARP}, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = {COMPOUND_STRING("Set weather…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WEATHER}, - [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = {COMPOUND_STRING("Font Test…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FONT_TEST}, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = {COMPOUND_STRING("Time Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_TIME_MENU}, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {COMPOUND_STRING("Watch credits…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, - [DEBUG_UTIL_MENU_ITEM_CHEAT] = {COMPOUND_STRING("Cheat start"), DEBUG_UTIL_MENU_ITEM_CHEAT}, - [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = {COMPOUND_STRING("Berry Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS}, - [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = {COMPOUND_STRING("EWRAM Counters…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS}, - [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = {COMPOUND_STRING("Steven Multi"), DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI}, + [WEEKDAY_SUN] = { gDayNameStringsTable[WEEKDAY_SUN], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_MON] = { gDayNameStringsTable[WEEKDAY_MON], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_TUE] = { gDayNameStringsTable[WEEKDAY_TUE], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_WED] = { gDayNameStringsTable[WEEKDAY_WED], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_THU] = { gDayNameStringsTable[WEEKDAY_THU], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_FRI] = { gDayNameStringsTable[WEEKDAY_FRI], DebugAction_TimeMenu_ChangeWeekdays }, + [WEEKDAY_SAT] = { gDayNameStringsTable[WEEKDAY_SAT], DebugAction_TimeMenu_ChangeWeekdays }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_TimeMenu[] = +static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu[] = { - [DEBUG_TIME_MENU_ITEM_PRINTTIME] = {COMPOUND_STRING("Print current time…"), DEBUG_TIME_MENU_ITEM_PRINTTIME}, - [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Print current time of day…"), DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY}, - [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Change current time of day…"), DEBUG_TIME_MENU_ITEM_TIMESOFDAY}, - [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = {COMPOUND_STRING("Change current weekday…"), DEBUG_TIME_MENU_ITEM_WEEKDAYS}, - [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = {COMPOUND_STRING("Check wall clock…"), DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK}, - [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = {COMPOUND_STRING("Set wall clock…"), DEBUG_TIME_MENU_ITEM_SETWALLCLOCK}, + { COMPOUND_STRING("Get time…"), DebugAction_ExecuteScript, Debug_EventScript_TellTheTime }, + { COMPOUND_STRING("Get time of day…"), DebugAction_ExecuteScript, Debug_EventScript_PrintTimeOfDay }, + { COMPOUND_STRING("Set time of day…"), DebugAction_OpenSubMenuFakeRTC, sDebugMenu_Actions_TimeMenu_TimesOfDay }, + { COMPOUND_STRING("Set weekday…"), DebugAction_OpenSubMenuFakeRTC, sDebugMenu_Actions_TimeMenu_Weekdays }, + { COMPOUND_STRING("Check wall clock…"), DebugAction_ExecuteScript, PlayersHouse_2F_EventScript_CheckWallClock }, + { COMPOUND_STRING("Set wall clock…"), DebugAction_ExecuteScript, PlayersHouse_2F_EventScript_SetWallClock }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_TimeMenu_TimesOfDay[] = +static const struct DebugMenuOption sDebugMenu_Actions_BerryFunctions[] = { - [DEBUG_TIME_MENU_ITEM_MORNING] = {gTimeOfDayStringsTable[TIME_MORNING], DEBUG_TIME_MENU_ITEM_MORNING}, - [DEBUG_TIME_MENU_ITEM_DAY] = {gTimeOfDayStringsTable[TIME_DAY], DEBUG_TIME_MENU_ITEM_DAY}, - [DEBUG_TIME_MENU_ITEM_EVENING] = {gTimeOfDayStringsTable[TIME_EVENING], DEBUG_TIME_MENU_ITEM_EVENING}, - [DEBUG_TIME_MENU_ITEM_NIGHT] = {gTimeOfDayStringsTable[TIME_NIGHT], DEBUG_TIME_MENU_ITEM_NIGHT}, + { COMPOUND_STRING("Clear map trees"), DebugAction_BerryFunctions_ClearAll }, + { COMPOUND_STRING("Ready map trees"), DebugAction_BerryFunctions_Ready }, + { COMPOUND_STRING("Grow map trees"), DebugAction_BerryFunctions_NextStage }, + { COMPOUND_STRING("Give map trees pests"), DebugAction_BerryFunctions_Pests }, + { COMPOUND_STRING("Give map trees weeds"), DebugAction_BerryFunctions_Weeds }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_TimeMenu_Weekdays[] = +static const struct DebugMenuOption sDebugMenu_Actions_Utilities[] = { - [DEBUG_TIME_MENU_ITEM_SUNDAY] = {gDayNameStringsTable[WEEKDAY_SUN], DEBUG_TIME_MENU_ITEM_SUNDAY}, - [DEBUG_TIME_MENU_ITEM_MONDAY] = {gDayNameStringsTable[WEEKDAY_MON], DEBUG_TIME_MENU_ITEM_MONDAY}, - [DEBUG_TIME_MENU_ITEM_TUESDAY] = {gDayNameStringsTable[WEEKDAY_TUE], DEBUG_TIME_MENU_ITEM_TUESDAY}, - [DEBUG_TIME_MENU_ITEM_WEDNESDAY] = {gDayNameStringsTable[WEEKDAY_WED], DEBUG_TIME_MENU_ITEM_WEDNESDAY}, - [DEBUG_TIME_MENU_ITEM_THURSDAY] = {gDayNameStringsTable[WEEKDAY_THU], DEBUG_TIME_MENU_ITEM_THURSDAY}, - [DEBUG_TIME_MENU_ITEM_FRIDAY] = {gDayNameStringsTable[WEEKDAY_FRI], DEBUG_TIME_MENU_ITEM_FRIDAY}, - [DEBUG_TIME_MENU_ITEM_SATURDAY] = {gDayNameStringsTable[WEEKDAY_SAT], DEBUG_TIME_MENU_ITEM_SATURDAY}, + { COMPOUND_STRING("Fly to map…"), DebugAction_Util_Fly }, + { COMPOUND_STRING("Warp to map warp…"), DebugAction_Util_Warp_Warp }, + { COMPOUND_STRING("Set weather…"), DebugAction_Util_Weather }, + { COMPOUND_STRING("Font Test…"), DebugAction_ExecuteScript, Debug_EventScript_FontTest }, + { COMPOUND_STRING("Time Functions…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_TimeMenu, }, + { COMPOUND_STRING("Watch credits…"), DebugAction_Util_WatchCredits }, + { COMPOUND_STRING("Cheat start"), DebugAction_Util_CheatStart }, + { COMPOUND_STRING("Berry Functions…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_BerryFunctions }, + { COMPOUND_STRING("EWRAM Counters…"), DebugAction_ExecuteScript, Debug_EventScript_EWRAMCounters }, + { COMPOUND_STRING("Steven Multi"), DebugAction_ExecuteScript, Debug_EventScript_Steven_Multi }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_PCBag[] = +static const struct DebugMenuOption sDebugMenu_Actions_PCBag_Fill[] = { - [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = {COMPOUND_STRING("Access PC"), DEBUG_PCBAG_MENU_ITEM_ACCESS_PC}, - [DEBUG_PCBAG_MENU_ITEM_FILL] = {COMPOUND_STRING("Fill…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_PCBAG_MENU_ITEM_FILL}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = {COMPOUND_STRING("Clear Bag"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG}, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = {COMPOUND_STRING("Clear Storage Boxes"), DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES}, + { COMPOUND_STRING("Fill PC Boxes Fast"), DebugAction_PCBag_Fill_PCBoxes_Fast }, + { COMPOUND_STRING("Fill PC Boxes Slow (LAG!)"), DebugAction_PCBag_Fill_PCBoxes_Slow }, + { COMPOUND_STRING("Fill PC Items") , DebugAction_PCBag_Fill_PCItemStorage }, + { COMPOUND_STRING("Fill Pocket Items"), DebugAction_PCBag_Fill_PocketItems }, + { COMPOUND_STRING("Fill Pocket Poké Balls"), DebugAction_PCBag_Fill_PocketPokeBalls }, + { COMPOUND_STRING("Fill Pocket TMHM"), DebugAction_PCBag_Fill_PocketTMHM }, + { COMPOUND_STRING("Fill Pocket Berries"), DebugAction_PCBag_Fill_PocketBerries }, + { COMPOUND_STRING("Fill Pocket Key Items"), DebugAction_PCBag_Fill_PocketKeyItems }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_PCBag_Fill[] = +static const struct DebugMenuOption sDebugMenu_Actions_PCBag[] = { - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = {COMPOUND_STRING("Fill PC Boxes Fast"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = {COMPOUND_STRING("Fill PC Boxes Slow (LAG!)"), DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW}, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = {COMPOUND_STRING("Fill PC Items") , DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = {COMPOUND_STRING("Fill Pocket Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = {COMPOUND_STRING("Fill Pocket Poké Balls"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = {COMPOUND_STRING("Fill Pocket TMHM"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = {COMPOUND_STRING("Fill Pocket Berries"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES}, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = {COMPOUND_STRING("Fill Pocket Key Items"), DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS}, + { COMPOUND_STRING("Access PC"), DebugAction_ExecuteScript, EventScript_PC }, + { COMPOUND_STRING("Fill…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_PCBag_Fill }, + { COMPOUND_STRING("Clear Bag"), DebugAction_PCBag_ClearBag }, + { COMPOUND_STRING("Clear Storage Boxes"), DebugAction_PCBag_ClearBoxes }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Party[] = +static const struct DebugMenuOption sDebugMenu_Actions_Party[] = { - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = {COMPOUND_STRING("Move Reminder"), DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER}, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = {COMPOUND_STRING("Hatch an Egg"), DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG}, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = {COMPOUND_STRING("Heal party"), DEBUG_PARTY_MENU_ITEM_HEAL_PARTY}, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = {COMPOUND_STRING("Inflict Status1"), DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1}, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = {COMPOUND_STRING("Check EVs"), DEBUG_PARTY_MENU_ITEM_CHECK_EVS}, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = {COMPOUND_STRING("Check IVs"), DEBUG_PARTY_MENU_ITEM_CHECK_IVS}, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = {COMPOUND_STRING("Clear Party"), DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY}, - [DEBUG_PARTY_MENU_ITEM_SET_PARTY] = {COMPOUND_STRING("Set Party"), DEBUG_PARTY_MENU_ITEM_SET_PARTY}, - [DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE] = {COMPOUND_STRING("Start Debug Battle"), DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE}, + { COMPOUND_STRING("Move Reminder"), DebugAction_ExecuteScript, FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon }, + { COMPOUND_STRING("Hatch an Egg"), DebugAction_ExecuteScript, Debug_HatchAnEgg }, + { COMPOUND_STRING("Heal party"), DebugAction_Party_HealParty }, + { COMPOUND_STRING("Inflict Status1"), DebugAction_ExecuteScript, Debug_EventScript_InflictStatus1 }, + { COMPOUND_STRING("Check EVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckEVs }, + { COMPOUND_STRING("Check IVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckIVs }, + { COMPOUND_STRING("Clear Party"), DebugAction_Party_ClearParty }, + { COMPOUND_STRING("Set Party"), DebugAction_Party_SetParty }, + { COMPOUND_STRING("Start Debug Battle"), DebugAction_Party_BattleSingle }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Scripts[] = +static const struct DebugMenuOption sDebugMenu_Actions_Give[] = { - [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = {COMPOUND_STRING("Script 1"), DEBUG_UTIL_MENU_ITEM_SCRIPT_1}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = {COMPOUND_STRING("Script 2"), DEBUG_UTIL_MENU_ITEM_SCRIPT_2}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = {COMPOUND_STRING("Script 3"), DEBUG_UTIL_MENU_ITEM_SCRIPT_3}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = {COMPOUND_STRING("Script 4"), DEBUG_UTIL_MENU_ITEM_SCRIPT_4}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = {COMPOUND_STRING("Script 5"), DEBUG_UTIL_MENU_ITEM_SCRIPT_5}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = {COMPOUND_STRING("Script 6"), DEBUG_UTIL_MENU_ITEM_SCRIPT_6}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = {COMPOUND_STRING("Script 7"), DEBUG_UTIL_MENU_ITEM_SCRIPT_7}, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = {COMPOUND_STRING("Script 8"), DEBUG_UTIL_MENU_ITEM_SCRIPT_8}, + { COMPOUND_STRING("Give item XYZ…"), DebugAction_Give_Item }, + { COMPOUND_STRING("Pokémon (Basic)"), DebugAction_Give_PokemonSimple }, + { COMPOUND_STRING("Pokémon (Complex)"), DebugAction_Give_PokemonComplex }, + { COMPOUND_STRING("Max Money"), DebugAction_Give_MaxMoney }, + { COMPOUND_STRING("Max Coins"), DebugAction_Give_MaxCoins }, + { COMPOUND_STRING("Max Battle Points"), DebugAction_Give_MaxBattlePoints }, + { COMPOUND_STRING("Daycare Egg"), DebugAction_Give_DayCareEgg }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_FlagsVars[] = +static const struct DebugMenuOption sDebugMenu_Actions_Player[] = { - [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = {COMPOUND_STRING("Set Flag XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_FLAGS}, - [DEBUG_FLAGVAR_MENU_ITEM_VARS] = {COMPOUND_STRING("Set Var XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_FLAGVAR_MENU_ITEM_VARS}, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = {COMPOUND_STRING("Pokédex Flags All"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL}, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = {COMPOUND_STRING("Pokédex Flags Reset"), DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}Pokédex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = {COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = {COMPOUND_STRING("Toggle {STR_VAR_1}PokéNav"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = {COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = {COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = {COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = {COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = {COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = {COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = {COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE}, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = {COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING}, + { COMPOUND_STRING("Player name"), DebugAction_Player_Name }, + { COMPOUND_STRING("Toggle gender"), DebugAction_Player_Gender }, + { COMPOUND_STRING("New Trainer ID"), DebugAction_Player_Id }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Battle_0[] = +static const struct DebugMenuOption sDebugMenu_Actions_Scripts[] = { - [DEBUG_BATTLE_0_MENU_ITEM_WILD] = {COMPOUND_STRING("Wild…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD}, - [DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE] = {COMPOUND_STRING("Wild Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE}, - [DEBUG_BATTLE_0_MENU_ITEM_SINGLE] = {COMPOUND_STRING("Single…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_SINGLE}, - [DEBUG_BATTLE_0_MENU_ITEM_DOUBLE] = {COMPOUND_STRING("Double…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_DOUBLE}, - [DEBUG_BATTLE_0_MENU_ITEM_MULTI] = {COMPOUND_STRING("Multi…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_0_MENU_ITEM_MULTI}, + { COMPOUND_STRING("Script 1"), DebugAction_ExecuteScript, Debug_EventScript_Script_1 }, + { COMPOUND_STRING("Script 2"), DebugAction_ExecuteScript, Debug_EventScript_Script_2 }, + { COMPOUND_STRING("Script 3"), DebugAction_ExecuteScript, Debug_EventScript_Script_3 }, + { COMPOUND_STRING("Script 4"), DebugAction_ExecuteScript, Debug_EventScript_Script_4 }, + { COMPOUND_STRING("Script 5"), DebugAction_ExecuteScript, Debug_EventScript_Script_5 }, + { COMPOUND_STRING("Script 6"), DebugAction_ExecuteScript, Debug_EventScript_Script_6 }, + { COMPOUND_STRING("Script 7"), DebugAction_ExecuteScript, Debug_EventScript_Script_7 }, + { COMPOUND_STRING("Script 8"), DebugAction_ExecuteScript, Debug_EventScript_Script_8 }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Battle_1[] = +static const struct DebugMenuOption sDebugMenu_Actions_Sound[] = { - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00] = {COMPOUND_STRING("{STR_VAR_1}Check bad move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_00}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01] = {COMPOUND_STRING("{STR_VAR_1}Try to faint"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_01}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02] = {COMPOUND_STRING("{STR_VAR_1}Check viability"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_02}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03] = {COMPOUND_STRING("{STR_VAR_1}Setup first turn"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_03}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04] = {COMPOUND_STRING("{STR_VAR_1}Risky"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_04}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05] = {COMPOUND_STRING("{STR_VAR_1}Prefer strongest move"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_05}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06] = {COMPOUND_STRING("{STR_VAR_1}Prefer Baton Pass"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_06}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07] = {COMPOUND_STRING("{STR_VAR_1}Double battle"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_07}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08] = {COMPOUND_STRING("{STR_VAR_1}HP aware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_08}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09] = {COMPOUND_STRING("{STR_VAR_1}Negate Unaware"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_09}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10] = {COMPOUND_STRING("{STR_VAR_1}Will suicide"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_10}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11] = {COMPOUND_STRING("{STR_VAR_1}Help partner"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_11}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12] = {COMPOUND_STRING("{STR_VAR_1}Prefer status moves"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_12}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13] = {COMPOUND_STRING("{STR_VAR_1}Stall"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_13}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14] = {COMPOUND_STRING("{STR_VAR_1}Screener"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_14}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15] = {COMPOUND_STRING("{STR_VAR_1}Smart switching"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_15}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16] = {COMPOUND_STRING("{STR_VAR_1}Ace pokemon"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_16}, - [DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17] = {COMPOUND_STRING("{STR_VAR_1}Omniscient"), DEBUG_BATTLE_1_MENU_ITEM_AI_FLAG_17}, - [DEBUG_BATTLE_1_MENU_ITEM_CONTINUE] = {sDebugText_Continue, DEBUG_BATTLE_1_MENU_ITEM_CONTINUE}, + { COMPOUND_STRING("SFX…"), DebugAction_Sound_SE }, + { COMPOUND_STRING("Music…"), DebugAction_Sound_MUS }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Battle_2[] = +static const struct DebugMenuOption sDebugMenu_Actions_ROMInfo2[] = { - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0] = {COMPOUND_STRING("Grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1] = {COMPOUND_STRING("Long grass…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2] = {COMPOUND_STRING("Sand…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3] = {COMPOUND_STRING("Underwater…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4] = {COMPOUND_STRING("Water…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5] = {COMPOUND_STRING("Pond…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6] = {COMPOUND_STRING("Mountain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7] = {COMPOUND_STRING("Cave…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8] = {COMPOUND_STRING("Building…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8}, - [DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9] = {COMPOUND_STRING("Plain…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9}, + { COMPOUND_STRING("Save Block space"), DebugAction_ExecuteScript, Debug_CheckSaveBlock }, + { COMPOUND_STRING("ROM space"), DebugAction_ExecuteScript, Debug_CheckROMSpace }, + { COMPOUND_STRING("Expansion Version"), DebugAction_ExecuteScript, Debug_ShowExpansionVersion }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Give[] = +static const struct DebugMenuOption sDebugMenu_Actions_Flags[] = { - [DEBUG_GIVE_MENU_ITEM_ITEM_X] = {COMPOUND_STRING("Give item XYZ…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_ITEM_X}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = {COMPOUND_STRING("Pokémon (Basic){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE}, - [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = {COMPOUND_STRING("Pokémon (Complex){CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX}, - [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = {COMPOUND_STRING("Max Money"), DEBUG_GIVE_MENU_ITEM_MAX_MONEY}, - [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = {COMPOUND_STRING("Max Coins"), DEBUG_GIVE_MENU_ITEM_MAX_COINS}, - [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = {COMPOUND_STRING("Max Battle Points"), DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS}, - [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = {COMPOUND_STRING("Daycare Egg"), DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG}, + [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = { COMPOUND_STRING("Set Flag XYZ…"), DebugAction_FlagsVars_Flags }, + [DEBUG_FLAGVAR_MENU_ITEM_VARS] = { COMPOUND_STRING("Set Var XYZ…"), DebugAction_FlagsVars_Vars }, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = { COMPOUND_STRING("Pokédex Flags All"), DebugAction_FlagsVars_PokedexFlags_All }, + [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = { COMPOUND_STRING("Pokédex Flags Reset"), DebugAction_FlagsVars_PokedexFlags_Reset }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}Pokédex"), DebugAction_FlagsVars_SwitchDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DebugAction_FlagsVars_SwitchNatDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = { COMPOUND_STRING("Toggle {STR_VAR_1}PokéNav"), DebugAction_FlagsVars_SwitchPokeNav }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DebugAction_FlagsVars_SwitchMatchCall }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = { COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DebugAction_FlagsVars_RunningShoes }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DebugAction_FlagsVars_ToggleFlyFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DebugAction_FlagsVars_ToggleBadgeFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = { COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DebugAction_FlagsVars_ToggleGameClear }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DebugAction_FlagsVars_ToggleFrontierPass }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = { COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DebugAction_FlagsVars_CollisionOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = { COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DebugAction_FlagsVars_EncounterOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DebugAction_FlagsVars_TrainerSeeOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_FlagsVars_BagUseOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = { COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DebugAction_FlagsVars_CatchingOnOff }, + { NULL } }; -static const struct ListMenuItem sDebugMenu_Items_Sound[] = +static const struct DebugMenuOption sDebugMenu_Actions_Main[] = { - [DEBUG_SOUND_MENU_ITEM_SE] = {COMPOUND_STRING("SFX…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_SE}, - [DEBUG_SOUND_MENU_ITEM_MUS] = {COMPOUND_STRING("Music…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_SOUND_MENU_ITEM_MUS}, -}; - -static const struct ListMenuItem sDebugMenu_Items_BerryFunctions[] = -{ - [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = {COMPOUND_STRING("Clear map trees"), DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL}, - [DEBUG_BERRY_FUNCTIONS_MENU_READY] = {COMPOUND_STRING("Ready map trees"), DEBUG_BERRY_FUNCTIONS_MENU_READY}, - [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = {COMPOUND_STRING("Grow map trees"), DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE}, - [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = {COMPOUND_STRING("Give map trees pests"), DEBUG_BERRY_FUNCTIONS_MENU_PESTS}, - [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = {COMPOUND_STRING("Give map trees weeds"), DEBUG_BERRY_FUNCTIONS_MENU_WEEDS}, -}; - -static const struct ListMenuItem sDebugMenu_Items_Player[] = -{ - [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = {COMPOUND_STRING("Player name"), DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME}, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = {COMPOUND_STRING("Toggle gender"), DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER}, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = {COMPOUND_STRING("New Trainer ID"), DEBUG_PLAYER_MENU_ITEM_PLAYER_ID}, -}; - -static const struct ListMenuItem sDebugMenu_Items_ROMInfo[] = -{ - [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = {COMPOUND_STRING("Save Block space"), DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK}, - [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = {COMPOUND_STRING("ROM space"), DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE}, - [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = {COMPOUND_STRING("Expansion Version"), DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER}, -}; - -// ******************************* -// Menu Actions -static void (*const sDebugMenu_Actions_Main[])(u8) = -{ - [DEBUG_MENU_ITEM_UTILITIES] = DebugAction_OpenUtilitiesMenu, - [DEBUG_MENU_ITEM_PCBAG] = DebugAction_OpenPCBagMenu, - [DEBUG_MENU_ITEM_PARTY] = DebugAction_OpenPartyMenu, - [DEBUG_MENU_ITEM_GIVE] = DebugAction_OpenGiveMenu, - [DEBUG_MENU_ITEM_PLAYER] = DebugAction_OpenPlayerMenu, - [DEBUG_MENU_ITEM_SCRIPTS] = DebugAction_OpenScriptsMenu, - [DEBUG_MENU_ITEM_FLAGVAR] = DebugAction_OpenFlagsVarsMenu, - //[DEBUG_MENU_ITEM_BATTLE] = DebugAction_OpenBattleMenu, - [DEBUG_MENU_ITEM_SOUND] = DebugAction_OpenSoundMenu, - [DEBUG_MENU_ITEM_ROMINFO] = DebugAction_OpenROMInfoMenu, - [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel -}; - -static void (*const sDebugMenu_Actions_Utilities[])(u8) = -{ - [DEBUG_UTIL_MENU_ITEM_FLY] = DebugAction_Util_Fly, - [DEBUG_UTIL_MENU_ITEM_WARP] = DebugAction_Util_Warp_Warp, - [DEBUG_UTIL_MENU_ITEM_WEATHER] = DebugAction_Util_Weather, - [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = DebugAction_Util_FontTest, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = DebugAction_Util_OpenTimeMenu, - [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = DebugAction_Util_WatchCredits, - [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, - [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = DebugAction_Util_BerryFunctions, - [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = DebugAction_Util_CheckEWRAMCounters, - [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = DebugAction_Util_Steven_Multi, -}; - -static void (*const sDebugMenu_Actions_PCBag[])(u8) = -{ - [DEBUG_PCBAG_MENU_ITEM_ACCESS_PC] = DebugAction_PCBag_AccessPC, - [DEBUG_PCBAG_MENU_ITEM_FILL] = DebugAction_OpenPCBagFillMenu, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BAG] = DebugAction_PCBag_ClearBag, - [DEBUG_PCBAG_MENU_ITEM_CLEAR_BOXES] = DebugAction_PCBag_ClearBoxes, -}; - -static void (*const sDebugMenu_Actions_PCBag_Fill[])(u8) = -{ - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_FAST] = DebugAction_PCBag_Fill_PCBoxes_Fast, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_BOXES_SLOW] = DebugAction_PCBag_Fill_PCBoxes_Slow, - [DEBUG_PCBAG_MENU_ITEM_FILL_PC_ITEMS] = DebugAction_PCBag_Fill_PCItemStorage, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_ITEMS] = DebugAction_PCBag_Fill_PocketItems, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BALLS] = DebugAction_PCBag_Fill_PocketPokeBalls, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_TMHM] = DebugAction_PCBag_Fill_PocketTMHM, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_BERRIES] = DebugAction_PCBag_Fill_PocketBerries, - [DEBUG_PCBAG_MENU_ITEM_FILL_POCKET_KEY_ITEMS] = DebugAction_PCBag_Fill_PocketKeyItems, -}; - -static void (*const sDebugMenu_Actions_Party[])(u8) = -{ - [DEBUG_PARTY_MENU_ITEM_MOVE_REMINDER] = DebugAction_Party_MoveReminder, - [DEBUG_PARTY_MENU_ITEM_HATCH_AN_EGG] = DebugAction_Party_HatchAnEgg, - [DEBUG_PARTY_MENU_ITEM_HEAL_PARTY] = DebugAction_Party_HealParty, - [DEBUG_PARTY_MENU_ITEM_INFLICT_STATUS1] = DebugAction_Party_InflictStatus1, - [DEBUG_PARTY_MENU_ITEM_CHECK_EVS] = DebugAction_Party_CheckEVs, - [DEBUG_PARTY_MENU_ITEM_CHECK_IVS] = DebugAction_Party_CheckIVs, - [DEBUG_PARTY_MENU_ITEM_CLEAR_PARTY] = DebugAction_Party_ClearParty, - [DEBUG_PARTY_MENU_ITEM_SET_PARTY] = DebugAction_Party_SetParty, - [DEBUG_PARTY_MENU_ITEM_BATTLE_SINGLE] = DebugAction_Party_BattleSingle, -}; - -static void (*const sDebugMenu_Actions_Scripts[])(u8) = -{ - [DEBUG_UTIL_MENU_ITEM_SCRIPT_1] = DebugAction_Util_Script_1, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_2] = DebugAction_Util_Script_2, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_3] = DebugAction_Util_Script_3, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_4] = DebugAction_Util_Script_4, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_5] = DebugAction_Util_Script_5, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_6] = DebugAction_Util_Script_6, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_7] = DebugAction_Util_Script_7, - [DEBUG_UTIL_MENU_ITEM_SCRIPT_8] = DebugAction_Util_Script_8, -}; - -static void (*const sDebugMenu_Actions_Flags[])(u8) = -{ - [DEBUG_FLAGVAR_MENU_ITEM_FLAGS] = DebugAction_FlagsVars_Flags, - [DEBUG_FLAGVAR_MENU_ITEM_VARS] = DebugAction_FlagsVars_Vars, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = DebugAction_FlagsVars_PokedexFlags_All, - [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = DebugAction_FlagsVars_PokedexFlags_Reset, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = DebugAction_FlagsVars_SwitchDex, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = DebugAction_FlagsVars_SwitchNatDex, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = DebugAction_FlagsVars_SwitchPokeNav, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = DebugAction_FlagsVars_SwitchMatchCall, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = DebugAction_FlagsVars_RunningShoes, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = DebugAction_FlagsVars_ToggleFlyFlags, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = DebugAction_FlagsVars_ToggleBadgeFlags, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = DebugAction_FlagsVars_ToggleGameClear, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = DebugAction_FlagsVars_ToggleFrontierPass, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = DebugAction_FlagsVars_CollisionOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = DebugAction_FlagsVars_EncounterOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = DebugAction_FlagsVars_TrainerSeeOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = DebugAction_FlagsVars_BagUseOnOff, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = DebugAction_FlagsVars_CatchingOnOff, -}; -static void (*const sDebugMenu_Actions_Give[])(u8) = -{ - [DEBUG_GIVE_MENU_ITEM_ITEM_X] = DebugAction_Give_Item, - [DEBUG_GIVE_MENU_ITEM_POKEMON_SIMPLE] = DebugAction_Give_PokemonSimple, - [DEBUG_GIVE_MENU_ITEM_POKEMON_COMPLEX] = DebugAction_Give_PokemonComplex, - [DEBUG_GIVE_MENU_ITEM_MAX_MONEY] = DebugAction_Give_MaxMoney, - [DEBUG_GIVE_MENU_ITEM_MAX_COINS] = DebugAction_Give_MaxCoins, - [DEBUG_GIVE_MENU_ITEM_MAX_BATTLE_POINTS] = DebugAction_Give_MaxBattlePoints, - [DEBUG_GIVE_MENU_ITEM_DAYCARE_EGG] = DebugAction_Give_DayCareEgg, -}; - -static void (*const sDebugMenu_Actions_Sound[])(u8) = -{ - [DEBUG_SOUND_MENU_ITEM_SE] = DebugAction_Sound_SE, - [DEBUG_SOUND_MENU_ITEM_MUS] = DebugAction_Sound_MUS, -}; - -static void (*const sDebugMenu_Actions_BerryFunctions[])(u8) = -{ - [DEBUG_BERRY_FUNCTIONS_MENU_CLEAR_ALL] = DebugAction_BerryFunctions_ClearAll, - [DEBUG_BERRY_FUNCTIONS_MENU_READY] = DebugAction_BerryFunctions_Ready, - [DEBUG_BERRY_FUNCTIONS_MENU_NEXT_STAGE] = DebugAction_BerryFunctions_NextStage, - [DEBUG_BERRY_FUNCTIONS_MENU_PESTS] = DebugAction_BerryFunctions_Pests, - [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = DebugAction_BerryFunctions_Weeds, -}; - -static void (*const sDebugMenu_Actions_TimeMenu[])(u8) = -{ - [DEBUG_TIME_MENU_ITEM_PRINTTIME] = DebugAction_TimeMenu_PrintTime, - [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = DebugAction_TimeMenu_PrintTimeOfDay, - [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = DebugAction_TimeMenu_TimesOfDay, - [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = DebugAction_TimeMenu_Weekdays, - [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_TimeMenu_CheckWallClock, - [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = DebugAction_TimeMenu_SetWallClock, -}; - -static void (*const sDebugMenu_Actions_TimeMenu_TimesOfDay[])(u8) = -{ - [DEBUG_TIME_MENU_ITEM_MORNING] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_DAY] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_EVENING] = DebugAction_TimeMenu_ChangeTimeOfDay, - [DEBUG_TIME_MENU_ITEM_NIGHT] = DebugAction_TimeMenu_ChangeTimeOfDay, -}; - -static void (*const sDebugMenu_Actions_TimeMenu_Weekdays[])(u8) = -{ - [DEBUG_TIME_MENU_ITEM_SUNDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_MONDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_TUESDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_WEDNESDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_THURSDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_FRIDAY] = DebugAction_TimeMenu_ChangeWeekdays, - [DEBUG_TIME_MENU_ITEM_SATURDAY] = DebugAction_TimeMenu_ChangeWeekdays, -}; - -static void (*const sDebugMenu_Actions_Player[])(u8) = -{ - [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = DebugAction_Player_Name, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = DebugAction_Player_Gender, - [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = DebugAction_Player_Id, -}; - -static void (*const sDebugMenu_Actions_ROMInfo[])(u8) = -{ - [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = DebugAction_ROMInfo_CheckSaveBlock, - [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = DebugAction_ROMInfo_CheckROMSpace, - [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = DebugAction_ROMInfo_ExpansionVersion, + { COMPOUND_STRING("Utilities…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Utilities, }, + { COMPOUND_STRING("PC/Bag…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_PCBag, }, + { COMPOUND_STRING("Party…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Party, }, + { COMPOUND_STRING("Give X…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Give, }, + { COMPOUND_STRING("Player…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Player, }, + { COMPOUND_STRING("Scripts…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Scripts, }, + { COMPOUND_STRING("Flags & Vars…"), DebugAction_OpenSubMenuFlagsVars, sDebugMenu_Actions_Flags, }, + { COMPOUND_STRING("Sound…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Sound, }, + { COMPOUND_STRING("ROM Info…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_ROMInfo2, }, + { COMPOUND_STRING("Cancel"), DebugAction_Cancel, }, + { NULL } }; // ******************************* @@ -1055,168 +658,68 @@ static const struct WindowTemplate sDebugMenuWindowTemplateSound = .baseBlock = 1, }; -static const struct WindowTemplate sDebugMenuWindowTemplateFlagsVars = -{ - .bg = 0, - .tilemapLeft = 30 - DEBUG_MENU_WIDTH_FLAGVAR - 1, - .tilemapTop = 1, - .width = DEBUG_MENU_WIDTH_FLAGVAR, - .height = DEBUG_MENU_HEIGHT_FLAGVAR, - .paletteNum = 15, - .baseBlock = 1 + DEBUG_MENU_WIDTH_MAIN * DEBUG_MENU_HEIGHT_MAIN * 2, -}; - -// ******************************* -// List Menu Templates -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Main = -{ - .items = sDebugMenu_Items_Main, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Main), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Utilities = -{ - .items = sDebugMenu_Items_Utilities, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Utilities), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_PCBag = -{ - .items = sDebugMenu_Items_PCBag, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_PCBag), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_PCBag_Fill = -{ - .items = sDebugMenu_Items_PCBag_Fill, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_PCBag_Fill), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Party = -{ - .items = sDebugMenu_Items_Party, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Party), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Scripts = -{ - .items = sDebugMenu_Items_Scripts, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Scripts), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_FlagsVars = -{ - .items = sDebugMenu_Items_FlagsVars, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_FlagsVars), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_0 = -{ - .items = sDebugMenu_Items_Battle_0, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_0), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_1 = -{ - .items = sDebugMenu_Items_Battle_1, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_1), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Battle_2 = -{ - .items = sDebugMenu_Items_Battle_2, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Battle_2), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Give = -{ - .items = sDebugMenu_Items_Give, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Give), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Sound = -{ - .items = sDebugMenu_Items_Sound, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Sound), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_BerryFunctions = -{ - .items = sDebugMenu_Items_BerryFunctions, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_BerryFunctions), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu = -{ - .items = sDebugMenu_Items_TimeMenu, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu_TimesOfDay = -{ - .items = sDebugMenu_Items_TimeMenu_TimesOfDay, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu_TimesOfDay), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu_Weekdays = -{ - .items = sDebugMenu_Items_TimeMenu_Weekdays, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu_Weekdays), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_Player = -{ - .items = sDebugMenu_Items_Player, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_Player), -}; - -static const struct ListMenuTemplate sDebugMenu_ListTemplate_ROMInfo = -{ - .items = sDebugMenu_Items_ROMInfo, - .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .totalItems = ARRAY_COUNT(sDebugMenu_Items_ROMInfo), -}; +static bool32 Debug_SaveCallbackMenu(struct DebugMenuOption *callbackItems); // ******************************* // Functions universal void Debug_ShowMainMenu(void) { - sDebugBattleData = AllocZeroed(sizeof(*sDebugBattleData)); sDebugMenuListData = AllocZeroed(sizeof(*sDebugMenuListData)); - Debug_InitDebugBattleData(); - - Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); + sDebugMenuListData->listId = 0; + Debug_ShowMenu(DebugTask_HandleMenuInput_General, sDebugMenu_Actions_Main); } -static void Debug_ReShowMainMenu(void) +#define tMenuTaskId data[0] +#define tWindowId data[1] +#define tSubWindowId data[2] +#define tInput data[3] +#define tDigit data[4] + +static bool32 Debug_SaveCallbackMenu(struct DebugMenuOption *callbackItems) { - Debug_ShowMenu(DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); + bool32 success = FALSE; + for (u32 i = 0; i < DEBUG_MAX_SUB_MENU_LEVELS; i++) + { + if (sDebugMenuListData->subMenuItems[i] == NULL) + { + sDebugMenuListData->subMenuItems[i] = callbackItems; + success = TRUE; + break; + } + } + return success; } -#define tMenuTaskId data[0] -#define tWindowId data[1] -#define tSubWindowId data[2] -#define tInput data[3] -#define tDigit data[4] +static u32 Debug_RemoveCallbackMenu(void) +{ + u32 freeCallbackLevel = 0; + for (u32 i = DEBUG_MAX_SUB_MENU_LEVELS; i > 0; i--) + { + if (sDebugMenuListData->subMenuItems[i - 1] != NULL) + { + sDebugMenuListData->subMenuItems[i - 1] = NULL; + freeCallbackLevel = i - 1; + break; + } + } + return freeCallbackLevel; +} -static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate) +static const struct DebugMenuOption *Debug_GetCurrentCallbackMenu(void) +{ + const struct DebugMenuOption *callbackItems = NULL; + for (u32 i = DEBUG_MAX_SUB_MENU_LEVELS; i > 0; i--) + { + if (sDebugMenuListData->subMenuItems[i - 1] != NULL) + { + callbackItems = sDebugMenuListData->subMenuItems[i - 1]; + break; + } + } + return callbackItems; +} + +static void Debug_ShowMenuFromTemplate(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate) { struct ListMenuTemplate menuTemplate; u8 windowId; @@ -1259,6 +762,74 @@ static void Debug_ShowMenu(void (*HandleInput)(u8), struct ListMenuTemplate LMte CopyWindowToVram(windowId, COPYWIN_FULL); } +static bool32 IsSubMenuAction(const void *action) +{ + return action == DebugAction_OpenSubMenu + || action == DebugAction_OpenSubMenuFlagsVars + || action == DebugAction_OpenSubMenuFakeRTC; +} + +static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items) +{ + struct ListMenuTemplate menuTemplate = {0}; + u8 windowId; + u8 menuTaskId; + u8 inputTaskId; + + if (items != NULL) + Debug_SaveCallbackMenu((struct DebugMenuOption *)items); + else + items = Debug_GetCurrentCallbackMenu(); + + // create window + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplateMain); + DrawStdWindowFrame(windowId, FALSE); + + u32 i = 0; + for (i = 0; items[i].text != NULL; i++) + { + sDebugMenuListData->listItems[i].id = i; + StringExpandPlaceholders(gStringVar4, items[i].text); + if (IsSubMenuAction(items[i].action)) + StringAppend(gStringVar4, sDebugText_Arrow); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); + sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; + } + + // create list menu + menuTemplate.items = sDebugMenuListData->listItems; + menuTemplate.moveCursorFunc = ListMenuDefaultCursorMoveFunc; + menuTemplate.totalItems = i; + menuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; + menuTemplate.windowId = windowId; + menuTemplate.header_X = 0; + menuTemplate.item_X = 8; + menuTemplate.cursor_X = 0; + menuTemplate.upText_Y = 1; + menuTemplate.cursorPal = 2; + menuTemplate.fillValue = 1; + menuTemplate.cursorShadowPal = 3; + menuTemplate.lettersSpacing = 1; + menuTemplate.itemVerticalPadding = 0; + menuTemplate.scrollMultiple = LIST_NO_MULTIPLE_SCROLL; + menuTemplate.fontId = DEBUG_MENU_FONT; + menuTemplate.cursorKind = 0; + menuTaskId = ListMenuInit(&menuTemplate, 0, 0); + + // create input handler task + inputTaskId = CreateTask(HandleInput, 3); + gTasks[inputTaskId].tMenuTaskId = menuTaskId; + gTasks[inputTaskId].tWindowId = windowId; + gTasks[inputTaskId].tSubWindowId = 0; + + Debug_RefreshListMenu(inputTaskId); + + // draw everything + CopyWindowToVram(windowId, COPYWIN_FULL); +} + static void Debug_DestroyMenu(u8 taskId) { DestroyListMenuTask(gTasks[taskId].tMenuTaskId, NULL, NULL); @@ -1279,7 +850,6 @@ static void Debug_DestroyMenu_Full(u8 taskId) DestroyTask(taskId); UnfreezeObjectEvents(); Free(sDebugMenuListData); - Free(sDebugBattleData); } static void Debug_DestroyMenu_Full_Script(u8 taskId, const u8 *script) @@ -1336,7 +906,6 @@ static void DebugAction_DestroyExtraWindow(u8 taskId) UnfreezeObjectEvents(); } - static const u16 sLocationFlags[] = { FLAG_VISITED_LITTLEROOT_TOWN, @@ -1441,17 +1010,6 @@ static u8 Debug_CheckToggleFlags(u8 id) return result; } -static void Debug_InitDebugBattleData(void) -{ - u32 i; - sDebugBattleData->submenu = 0; - sDebugBattleData->battleType = 0xFF; - sDebugBattleData->battleTerrain = 0xFF; - - for (i = 0; i < AI_FLAG_COUNT; i++) - sDebugBattleData->aiFlags[i] = FALSE; -} - static void Debug_GenerateListMenuNames(u32 totalItems) { const u8 sColor_Red[] = _("{COLOR RED}"); @@ -1462,56 +1020,27 @@ static void Debug_GenerateListMenuNames(u32 totalItems) // Copy item names for all entries but the last (which is Cancel) for (i = 0; i < totalItems; i++) { - if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) + if (sDebugMenuListData->listId == 1) { - u16 species; - if (i == 6) - { - name = sDebugText_Continue; - StringCopy(&sDebugMenuListData->itemNames[i][0], name); - } - else if (GetMonData(&gEnemyParty[i], MON_DATA_SANITY_HAS_SPECIES)) - { - species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); - StringCopy(gStringVar1, GetSpeciesName(species)); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar1); - } - else - { - StringCopy(&sDebugMenuListData->itemNames[i][0], sDebugText_Dashes); - } + flagResult = Debug_CheckToggleFlags(i); + name = sDebugMenu_Actions_Flags[i].text; + } + + if (flagResult == 0xFF) + { + StringCopy(&sDebugMenuListData->itemNames[i][0], name); + } + else if (flagResult) + { + StringCopy(gStringVar1, sColor_Green); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); } else { - if (sDebugMenuListData->listId == 0) - { - flagResult = Debug_CheckToggleFlags(i); - name = sDebugMenu_Items_FlagsVars[i].name; - } - else if (sDebugMenuListData->listId == 1) - { - flagResult = sDebugBattleData->aiFlags[i]; - if (i == totalItems - 1) - flagResult = 0xFF; - name = sDebugMenu_Items_Battle_1[i].name; - } - - if (flagResult == 0xFF) - { - StringCopy(&sDebugMenuListData->itemNames[i][0], name); - } - else if (flagResult) - { - StringCopy(gStringVar1, sColor_Green); - StringExpandPlaceholders(gStringVar4, name); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); - } - else - { - StringCopy(gStringVar1, sColor_Red); - StringExpandPlaceholders(gStringVar4, name); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); - } + StringCopy(gStringVar1, sColor_Red); + StringExpandPlaceholders(gStringVar4, name); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); } sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; @@ -1523,20 +1052,14 @@ static void Debug_RefreshListMenu(u8 taskId) { u8 totalItems = 0; - if (sDebugMenuListData->listId == 0) + if (sDebugMenuListData->listId == 1) { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_FlagsVars; - totalItems = gMultiuseListMenuTemplate.totalItems; - } - else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu <= 1) - { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_1; - totalItems = gMultiuseListMenuTemplate.totalItems; - } - else if (sDebugMenuListData->listId == 1 && sDebugBattleData->submenu > 1) - { - gMultiuseListMenuTemplate = sDebugMenu_ListTemplate_Battle_2; - totalItems = 7; + for (u32 i = 0; i < ARRAY_COUNT(sDebugMenu_Actions_Flags); i++) + { + sDebugMenuListData->listItems[i].id = i; + sDebugMenuListData->listItems[i].name = sDebugMenu_Actions_Flags[i].text; + } + totalItems = gMultiuseListMenuTemplate.totalItems = ARRAY_COUNT(sDebugMenu_Actions_Flags) - 1; } // Failsafe to prevent memory corruption @@ -1573,105 +1096,63 @@ static void Debug_RedrawListMenu(u8 taskId) gTasks[taskId].tMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, scrollOffset, selectedRow); } - -// ******************************* -// Handle Inputs -static void DebugTask_HandleMenuInput_Main(u8 taskId) +static void DebugTask_HandleMenuInput_General(u8 taskId) { - void (*func)(u8); + const struct DebugMenuOption *options = Debug_GetCurrentCallbackMenu(); u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + struct DebugMenuOption option = options[input]; if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Main[input]) != NULL) - func(taskId); + if (option.action != NULL) + { + if (IsSubMenuAction(option.action)) + ((DebugSubmenuFunc)option.action)(taskId, option.actionParams); + else if (option.action == DebugAction_ExecuteScript) + Debug_DestroyMenu_Full_Script(taskId, (const u8 *)option.actionParams); + else + ((DebugFunc)option.action)(taskId); + } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - Debug_DestroyMenu_Full(taskId); - ScriptContext_Enable(); + if (Debug_GetCurrentCallbackMenu() != NULL && Debug_RemoveCallbackMenu() != 0) + { + Debug_DestroyMenu(taskId); + if (sDebugMenuListData->listId == 1) + Debug_ShowMenu(DebugTask_HandleMenuInput_FlagsVars, NULL); + else + Debug_ShowMenu(DebugTask_HandleMenuInput_General, NULL); + } + else + { + Debug_DestroyMenu_Full(taskId); + ScriptContext_Enable(); + } } } -static void DebugTask_HandleMenuInput_General(u8 taskId, const void (*const actions[])(u8), void (*callbackInput)(u8), struct ListMenuTemplate callbackMenuTemplate) -{ - void (*func)(u8); - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = actions[input]) != NULL) - func(taskId); - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ShowMenu(callbackInput, callbackMenuTemplate); - } -} - -static void DebugTask_HandleMenuInput_Utilities(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Utilities, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_PCBag(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_PCBag_Fill(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_PCBag_Fill, DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); -} - -static void DebugTask_HandleMenuInput_Party(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Party, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Scripts(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Scripts, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_TimeMenu(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu, DebugTask_HandleMenuInput_Utilities, sDebugMenu_ListTemplate_Utilities); -} - -static void DebugTask_HandleMenuInput_TimeMenu_TimesOfDay(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu_TimesOfDay, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_TimeMenu_Weekdays(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu_Weekdays, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) { - void (*func)(u8); + DebugSubmenuFunc func; u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Flags[input]) != NULL) + if ((func = sDebugMenu_Actions_Flags[input].action) != NULL) { if (input == DEBUG_FLAGVAR_MENU_ITEM_FLAGS || input == DEBUG_FLAGVAR_MENU_ITEM_VARS) { Debug_RedrawListMenu(taskId); - func(taskId); + func(taskId, sDebugMenu_Actions_Flags[input].actionParams); } else { - func(taskId); + func(taskId, sDebugMenu_Actions_Flags[input].actionParams); Debug_GenerateListMenuNames(gMultiuseListMenuTemplate.totalItems); RedrawListMenu(gTasks[taskId].tMenuTaskId); } @@ -1689,246 +1170,25 @@ static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) { PlaySE(SE_SELECT); Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); + Debug_ShowMainMenu(); } } -static void DebugTask_HandleBattleMenuReDraw(u8 taskId) +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId) { + Debug_DestroyMenu(taskId); + sDebugMenuListData->listId = 1; Debug_RefreshListMenu(taskId); - switch (sDebugBattleData->submenu) - { - case 0: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_0); - break; - case 1: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - case 2: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); - break; - case 3: - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - } + Debug_ShowMenuFromTemplate(DebugTask_HandleMenuInput_FlagsVars, gMultiuseListMenuTemplate); } -static void DebugTask_HandleMenuInput_Battle(u8 taskId) -{ - u16 idx; - u8 listTaskId = gTasks[taskId].tMenuTaskId; - ListMenu_ProcessInput(listTaskId); - - ListMenuGetCurrentItemArrayId(listTaskId, &idx); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - - switch (sDebugBattleData->submenu) - { - case 0: // Battle type - sDebugBattleData->battleType = idx; - sDebugBattleData->submenu++; - Debug_DestroyMenu(taskId); - - if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD // Skip AI Flag selection if wild battle - || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) - { - sDebugBattleData->submenu++; - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); - } - else - { - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - } - break; - case 1: // AI Flags - if (idx == sDebugMenu_ListTemplate_Battle_1.totalItems - 1) - { - sDebugBattleData->submenu++; - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, sDebugMenu_ListTemplate_Battle_2); - } - else - { - sDebugBattleData->aiFlags[idx] = !sDebugBattleData->aiFlags[idx]; - Debug_RedrawListMenu(taskId); - } - - break; - case 2: // Terrain - sDebugBattleData->submenu++; - sDebugBattleData->battleTerrain = idx; - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Battle, gMultiuseListMenuTemplate); - break; - case 3: // Enemy pokemon - if (idx == 6) - Debug_InitializeBattle(taskId); - break; - } - } - else if (JOY_NEW(B_BUTTON)) - { - switch (sDebugBattleData->submenu) - { - case 0: // Return to Main menu - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ReShowMainMenu(); - break; - case 2: // Skip AI Flag selection if wild battle - if (sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD - || sDebugBattleData->battleType == DEBUG_BATTLE_0_MENU_ITEM_WILD_DOUBLE) - { - sDebugBattleData->submenu = 0; - } - else - sDebugBattleData->submenu--; - DebugTask_HandleBattleMenuReDraw(taskId); - break; - default: - sDebugBattleData->submenu--; - DebugTask_HandleBattleMenuReDraw(taskId); - break; - } - } -} - -static void Debug_InitializeBattle(u8 taskId) -{ - u32 i; - gBattleTypeFlags = 0; - - // Set main battle flags - switch (sDebugBattleData->battleType) - { - case DEBUG_BATTLE_0_MENU_ITEM_WILD: - break; - case DEBUG_BATTLE_0_MENU_ITEM_SINGLE: - gBattleTypeFlags = (BATTLE_TYPE_TRAINER); - break; - case DEBUG_BATTLE_0_MENU_ITEM_DOUBLE: - gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER); - break; - case DEBUG_BATTLE_0_MENU_ITEM_MULTI: - gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER); - break; - } - - // Set terrain - gBattleEnvironment = sDebugBattleData->battleTerrain; - - // Populate enemy party - for (i = 0; i < PARTY_SIZE; i++) - { - ZeroMonData(&gEnemyParty[i]); - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) - gEnemyParty[i] = gPlayerParty[i]; - } - - // Set AI flags - for (i = 0; i < ARRAY_COUNT(sDebugBattleData->aiFlags); i++) - { - if (sDebugBattleData->aiFlags[i]) - gDebugAIFlags |= (1 << i); - } - - gIsDebugBattle = TRUE; - BattleSetup_StartTrainerBattle_Debug(); - - - Debug_DestroyMenu_Full(taskId); -} - -static void DebugTask_HandleMenuInput_Give(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Give, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Sound(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Sound, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_BerryFunctions, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_Player(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Player, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -static void DebugTask_HandleMenuInput_ROMInfo(u8 taskId) -{ - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_ROMInfo, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); -} - -// ******************************* -// Open sub-menus -static void DebugAction_OpenUtilitiesMenu(u8 taskId) +static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items) { Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Utilities, sDebugMenu_ListTemplate_Utilities); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } -static void DebugAction_OpenPCBagMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_PCBag, sDebugMenu_ListTemplate_PCBag); -} - -static void DebugAction_OpenPartyMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Party, sDebugMenu_ListTemplate_Party); -} - -static void DebugAction_OpenScriptsMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Scripts, sDebugMenu_ListTemplate_Scripts); -} - -static void DebugAction_OpenFlagsVarsMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - sDebugMenuListData->listId = 0; - Debug_ShowMenu(DebugTask_HandleMenuInput_FlagsVars, gMultiuseListMenuTemplate); -} - -static void DebugAction_OpenGiveMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Give, sDebugMenu_ListTemplate_Give); -} - -static void DebugAction_OpenSoundMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Sound, sDebugMenu_ListTemplate_Sound); -} - -static void DebugAction_Util_BerryFunctions(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_BerryFunctions, sDebugMenu_ListTemplate_BerryFunctions); -} - -static void DebugAction_Util_OpenTimeMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu, sDebugMenu_ListTemplate_TimeMenu); -} - -static void DebugAction_TimeMenu_TimesOfDay(u8 taskId) +static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items) { if (!OW_USE_FAKE_RTC) { @@ -1937,33 +1197,13 @@ static void DebugAction_TimeMenu_TimesOfDay(u8 taskId) else { Debug_DestroyMenu_Full(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_TimesOfDay, sDebugMenu_ListTemplate_TimeMenu_TimesOfDay); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } } -static void DebugAction_TimeMenu_Weekdays(u8 taskId) +static void DebugAction_ExecuteScript(u8 taskId, const u8 *script) { - if (!OW_USE_FAKE_RTC) - { - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FakeRTCNotEnabled); - } - else - { - Debug_DestroyMenu_Full(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_Weekdays, sDebugMenu_ListTemplate_TimeMenu_Weekdays); - } -} - -static void DebugAction_OpenPlayerMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_Player, sDebugMenu_ListTemplate_Player); -} - -static void DebugAction_OpenROMInfoMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_ROMInfo, sDebugMenu_ListTemplate_ROMInfo); + Debug_DestroyMenu_Full_Script(taskId, script); } // ******************************* @@ -2167,11 +1407,6 @@ void CheckPokemonStorageSize(struct ScriptContext *ctx) ConvertIntToDecimalStringN(gStringVar3, maxPkmnStorageSize - currPkmnStorageSize, STR_CONV_MODE_LEFT_ALIGN, 6); } -static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_CheckSaveBlock); -} - enum RoundMode { ROUND_CEILING, @@ -2220,41 +1455,6 @@ void CheckROMSize(struct ScriptContext *ctx) ConvertQ22_10ToDecimalString(gStringVar2, currROMFreeKB, 2, ROUND_FLOOR); } -static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId) -{ - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_CheckROMSpace); -} - -static const u8 sWeatherNames[WEATHER_COUNT][24] = { - [WEATHER_NONE] = _("NONE"), - [WEATHER_SUNNY_CLOUDS] = _("SUNNY CLOUDS"), - [WEATHER_SUNNY] = _("SUNNY"), - [WEATHER_RAIN] = _("RAIN"), - [WEATHER_SNOW] = _("SNOW"), - [WEATHER_RAIN_THUNDERSTORM] = _("RAIN THUNDERSTORM"), - [WEATHER_FOG_HORIZONTAL] = _("FOG HORIZONTAL"), - [WEATHER_VOLCANIC_ASH] = _("VOLCANIC ASH"), - [WEATHER_SANDSTORM] = _("SANDSTORM"), - [WEATHER_FOG_DIAGONAL] = _("FOG DIAGONAL"), - [WEATHER_UNDERWATER] = _("UNDERWATER"), - [WEATHER_SHADE] = _("SHADE"), - [WEATHER_DROUGHT] = _("DROUGHT"), - [WEATHER_DOWNPOUR] = _("DOWNPOUR"), - [WEATHER_UNDERWATER_BUBBLES] = _("UNDERWATER BUBBLES"), - [WEATHER_ABNORMAL] = _("ABNORMAL(NOT WORKING)"), - [WEATHER_ROUTE119_CYCLE] = _("ROUTE119 CYCLE"), - [WEATHER_ROUTE123_CYCLE] = _("ROUTE123 CYCLE"), - [WEATHER_FOG] = _("FOG"), -}; - -const u8 *GetWeatherName(u32 weatherId) -{ - return sWeatherNames[weatherId]; -} - -static const u8 sDebugText_WeatherNotDefined[] = _("NOT DEFINED!!!"); static void DebugAction_Util_Weather(u8 taskId) { u8 windowId; @@ -2272,7 +1472,7 @@ static void DebugAction_Util_Weather(u8 taskId) //Display initial ID StringCopy(gStringVar2, gText_DigitIndicator[0]); ConvertIntToDecimalStringN(gStringVar3, 1, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, sWeatherNames[0], CHAR_SPACE, 30); + StringCopyPadded(gStringVar1, GetWeatherName(0), CHAR_SPACE, 30); StringExpandPlaceholders(gStringVar4, sDebugText_Util_Weather_ID); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -2292,10 +1492,7 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - if (gTasks[taskId].tInput <= 15 || gTasks[taskId].tInput >= 20) - StringCopyPadded(gStringVar1, sWeatherNames[gTasks[taskId].tInput], CHAR_SPACE, 30); - else - StringCopyPadded(gStringVar1, sDebugText_WeatherNotDefined, CHAR_SPACE, 30); + StringCopyPadded(gStringVar1, GetWeatherName(gTasks[taskId].tInput), CHAR_SPACE, 30); StringExpandPlaceholders(gStringVar4, sDebugText_Util_Weather_ID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); @@ -2316,21 +1513,6 @@ static void DebugAction_Util_Weather_SelectId(u8 taskId) } } -static void DebugAction_Util_FontTest(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FontTest); -} - -static void DebugAction_TimeMenu_CheckWallClock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_CheckWallClock); -} - -static void DebugAction_TimeMenu_SetWallClock(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_SetWallClock); -} - static void DebugAction_Util_WatchCredits(u8 taskId) { Debug_DestroyMenu_Full(taskId); @@ -2369,18 +1551,6 @@ static void DebugAction_Util_CheatStart(u8 taskId) Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); } -static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId) -{ - Debug_DestroyMenu_Full(taskId); - LockPlayerFieldControls(); - ScriptContext_SetupScript(Debug_ShowExpansionVersion); -} - -static void DebugAction_Util_Steven_Multi(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Steven_Multi); -} - void BufferExpansionVersion(struct ScriptContext *ctx) { static const u8 sText_Released[] = _("\nRelease Build"); @@ -2398,12 +1568,6 @@ void BufferExpansionVersion(struct ScriptContext *ctx) string = StringCopy(string, sText_Unreleased); } -static void DebugAction_TimeMenu_PrintTime(u8 taskId) -{ - LockPlayerFieldControls(); - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_TellTheTime); -} - void DebugMenu_CalculateTime(struct ScriptContext *ctx) { if (OW_USE_FAKE_RTC) @@ -2423,75 +1587,22 @@ void DebugMenu_CalculateTime(struct ScriptContext *ctx) } } -static void DebugAction_TimeMenu_PrintTimeOfDay(u8 taskId) -{ - LockPlayerFieldControls(); - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_PrintTimeOfDay); -} - void DebugMenu_CalculateTimeOfDay(struct ScriptContext *ctx) { - switch (GetTimeOfDay()) + enum TimeOfDay timeOfDay = GetTimeOfDay(); + switch (timeOfDay) { case TIME_MORNING: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_MORNING]); - break; case TIME_DAY: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_DAY]); - break; case TIME_EVENING: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_EVENING]); - break; case TIME_NIGHT: - StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[TIME_NIGHT]); + StringExpandPlaceholders(gStringVar1, gTimeOfDayStringsTable[timeOfDay]); break; - default: + case TIMES_OF_DAY_COUNT: break; } } -// ******************************* -// Actions Scripts -static void DebugAction_Util_Script_1(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_1); -} - -static void DebugAction_Util_Script_2(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_2); -} - -static void DebugAction_Util_Script_3(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_3); -} - -static void DebugAction_Util_Script_4(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_4); -} - -static void DebugAction_Util_Script_5(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_5); -} - -static void DebugAction_Util_Script_6(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_6); -} - -static void DebugAction_Util_Script_7(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_7); -} - -static void DebugAction_Util_Script_8(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_Script_8); -} - // ******************************* // Actions Flags and Vars static void Debug_Display_FlagInfo(u32 flag, u32 digit, u8 windowId) @@ -2504,7 +1615,7 @@ static void Debug_Display_FlagInfo(u32 flag, u32 digit, u8 windowId) else StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); StringCopy(gStringVar3, gText_DigitIndicator[digit]); - StringExpandPlaceholders(gStringVar4, sDebugText_FlagsVars_Flag); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Flag: {STR_VAR_1}{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}\n{STR_VAR_3}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -2936,7 +2047,7 @@ static void Debug_Display_ItemInfo(u32 itemId, u32 digit, u8 windowId) WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemID); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Item ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -2980,7 +2091,7 @@ static void Debug_Display_ItemQuantity(u32 quantity, u32 digit, u8 windowId) StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEM_QUANTITY); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_ItemQuantity); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Quantity:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3075,7 +2186,7 @@ static void Debug_Display_SpeciesInfo(u32 species, u32 digit, u8 windowId) WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, species, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3154,7 +2265,7 @@ static void Debug_Display_Level(u32 level, u32 digit, u8 windowId) StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEADING_ZEROS, 3); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonLevel); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3286,7 +2397,7 @@ static void Debug_Display_Ability(u32 abilityId, u32 digit, u8 windowId)//(u32 n StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); u8 *end = StringCopy(gStringVar1, gAbilitiesInfo[abilityId].name); WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonAbility); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Ability Num: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); } @@ -3331,6 +2442,16 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) } } +static void Debug_Display_TeraType(u32 typeId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar3, typeId, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringCopy(gStringVar1, gTypesInfo[typeId].name); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Tera Type: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { u8 abilityCount = NUM_ABILITY_SLOTS - 1; //-1 for proper iteration @@ -3367,12 +2488,7 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gTypesInfo[0].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TeraType(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectTeraType; } @@ -3384,6 +2500,15 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) } } +static void Debug_Display_DynamaxLevel(u32 level, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Dmax Lvl:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) { if (JOY_NEW(DPAD_ANY)) @@ -3403,12 +2528,7 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) gTasks[taskId].tInput = 0; } - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gTypesInfo[gTasks[taskId].tInput].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonTeraType); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TeraType(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3417,11 +2537,7 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_DynamaxLevel(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectDynamaxLevel; } @@ -3433,18 +2549,18 @@ static void DebugAction_Give_Pokemon_SelectTeraType(u8 taskId) } } +static void Debug_Display_GigantamaxFactor(u32 input, u8 windowId) +{ + Debug_Display_TrueFalse(input, windowId, COMPOUND_STRING("Gmax Factor:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}")); +} + static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); Debug_HandleInput_Numeric(taskId, 0, MAX_DYNAMAX_LEVEL, 2); - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonDynamaxLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_DynamaxLevel(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3452,7 +2568,7 @@ static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) sDebugMonData->dynamaxLevel = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); + Debug_Display_GigantamaxFactor(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectGigantamaxFactor; } else if (JOY_NEW(B_BUTTON)) @@ -3481,7 +2597,7 @@ static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId) { PlaySE(SE_SELECT); gTasks[taskId].tInput ^= JOY_NEW(DPAD_UP | DPAD_DOWN) > 0; - Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); + Debug_Display_GigantamaxFactor(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3843,16 +2959,16 @@ static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId) DebugAction_DestroyExtraWindow(taskId); switch (input) { - case DEBUG_TIME_MENU_ITEM_MORNING: + case TIME_MORNING: FakeRtc_ForwardTimeTo(MORNING_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_DAY: + case TIME_DAY: FakeRtc_ForwardTimeTo(DAY_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_EVENING: + case TIME_EVENING: FakeRtc_ForwardTimeTo(EVENING_HOUR_BEGIN, 0, 0); break; - case DEBUG_TIME_MENU_ITEM_NIGHT: + case TIME_NIGHT: FakeRtc_ForwardTimeTo(NIGHT_HOUR_BEGIN, 0, 0); break; } @@ -3867,37 +2983,8 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) u32 daysToAdd = 0; DebugAction_DestroyExtraWindow(taskId); - switch(input) - { - case DEBUG_TIME_MENU_ITEM_SUNDAY: - daysToAdd = ((WEEKDAY_SUN - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_MONDAY: - daysToAdd = ((WEEKDAY_MON - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_TUESDAY: - daysToAdd = ((WEEKDAY_TUE - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_WEDNESDAY: - daysToAdd = ((WEEKDAY_WED - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_THURSDAY: - daysToAdd = ((WEEKDAY_THU - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_FRIDAY: - daysToAdd = ((WEEKDAY_FRI - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - case DEBUG_TIME_MENU_ITEM_SATURDAY: - daysToAdd = ((WEEKDAY_SAT - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); - break; - } + daysToAdd = ((input - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; + FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); Debug_DestroyMenu_Full(taskId); SetMainCallback2(CB2_LoadMap); } @@ -3905,12 +2992,6 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) // ******************************* // Actions PCBag -static void DebugAction_OpenPCBagFillMenu(u8 taskId) -{ - Debug_DestroyMenu(taskId); - Debug_ShowMenu(DebugTask_HandleMenuInput_PCBag_Fill, sDebugMenu_ListTemplate_PCBag_Fill); -} - static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId) //Credit: Sierraffinity { int boxId, boxPosition; @@ -4041,11 +3122,6 @@ static void DebugAction_PCBag_Fill_PocketKeyItems(u8 taskId) } } -static void DebugAction_PCBag_AccessPC(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, EventScript_PC); -} - static void DebugAction_PCBag_ClearBag(u8 taskId) { PlaySE(MUS_LEVEL_UP); @@ -4818,16 +3894,6 @@ static void DebugAction_BerryFunctions_Weeds(u8 taskId) // ******************************* // Actions Party/Boxes -static void DebugAction_Party_MoveReminder(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, FallarborTown_MoveRelearnersHouse_EventScript_ChooseMon); -} - -static void DebugAction_Party_HatchAnEgg(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_HatchAnEgg); -} - static void DebugAction_Party_HealParty(u8 taskId) { PlaySE(SE_USE_ITEM); @@ -4836,21 +3902,6 @@ static void DebugAction_Party_HealParty(u8 taskId) Debug_DestroyMenu_Full(taskId); } -static void DebugAction_Party_InflictStatus1(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_InflictStatus1); -} - -static void DebugAction_Party_CheckEVs(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_CheckEVs); -} - -static void DebugAction_Party_CheckIVs(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_CheckIVs); -} - static void DebugAction_Party_ClearParty(u8 taskId) { ZeroPlayerPartyMons(); @@ -4904,8 +3955,3 @@ void CheckEWRAMCounters(struct ScriptContext *ctx) ConvertIntToDecimalStringN(gStringVar1, gFollowerSteps, STR_CONV_MODE_LEFT_ALIGN, 5); ConvertIntToDecimalStringN(gStringVar2, gChainFishingDexNavStreak, STR_CONV_MODE_LEFT_ALIGN, 5); } - -static void DebugAction_Util_CheckEWRAMCounters(u8 taskId) -{ - Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_EWRAMCounters); -} diff --git a/src/field_weather.c b/src/field_weather.c index 7e8d83b2a5..7355b78809 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -1186,3 +1186,33 @@ bool32 IsWeatherAlphaBlend(void) || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES || gWeatherPtr->currWeather == WEATHER_UNDERWATER); } + +static const u8 sWeatherNames[WEATHER_COUNT][24] = { + [WEATHER_NONE] = _("NONE"), + [WEATHER_SUNNY_CLOUDS] = _("SUNNY CLOUDS"), + [WEATHER_SUNNY] = _("SUNNY"), + [WEATHER_RAIN] = _("RAIN"), + [WEATHER_SNOW] = _("SNOW"), + [WEATHER_RAIN_THUNDERSTORM] = _("RAIN THUNDERSTORM"), + [WEATHER_FOG_HORIZONTAL] = _("FOG HORIZONTAL"), + [WEATHER_VOLCANIC_ASH] = _("VOLCANIC ASH"), + [WEATHER_SANDSTORM] = _("SANDSTORM"), + [WEATHER_FOG_DIAGONAL] = _("FOG DIAGONAL"), + [WEATHER_UNDERWATER] = _("UNDERWATER"), + [WEATHER_SHADE] = _("SHADE"), + [WEATHER_DROUGHT] = _("DROUGHT"), + [WEATHER_DOWNPOUR] = _("DOWNPOUR"), + [WEATHER_UNDERWATER_BUBBLES] = _("UNDERWATER BUBBLES"), + [WEATHER_ABNORMAL] = _("ABNORMAL(NOT WORKING)"), + [WEATHER_ROUTE119_CYCLE] = _("ROUTE119 CYCLE"), + [WEATHER_ROUTE123_CYCLE] = _("ROUTE123 CYCLE"), + [WEATHER_FOG] = _("FOG"), +}; + +static const u8 sDebugText_WeatherNotDefined[] = _("NOT DEFINED!!!"); +const u8 *GetWeatherName(u32 weatherId) +{ + if (sWeatherNames[weatherId][0] != 0) + return sWeatherNames[weatherId]; + return sDebugText_WeatherNotDefined; +} From f8551830c9c735b2c3a62785ed465427307827ce Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:58:30 +0200 Subject: [PATCH 080/248] Adds Gen5+ Encore config (#7051) --- data/battle_scripts_1.s | 8 ++++++++ include/battle_scripts.h | 2 ++ include/battle_util.h | 2 +- include/config/battle.h | 1 + include/constants/battle_string_ids.h | 1 + include/constants/generational_changes.h | 1 + include/generational_changes.h | 3 ++- src/battle_main.c | 2 +- src/battle_message.c | 1 + src/battle_util.c | 22 ++++++++++++++++++++-- test/battle/ai/ai_switching.c | 1 - test/battle/move_effect/encore.c | 2 ++ test/battle/move_flags/cant_use_twice.c | 1 + test/battle/sleep_clause.c | 1 + 14 files changed, 42 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c7acc4b3bc..60d0f77b9f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5775,6 +5775,14 @@ BattleScript_DisabledNoMore:: BattleScript_SelectingDisabledMoveInPalace:: printstring STRINGID_PKMNMOVEISDISABLED + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_EncoredMove:: + printselectionstring STRINGID_PKMNGOTENCOREDMOVE + endselectionscript + +BattleScript_EncoredMoveInPalace:: + printselectionstring STRINGID_PKMNGOTENCOREDMOVE BattleScript_SelectingUnusableMoveInPalace:: moveendto MOVEEND_NEXT_TARGET end diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1c0e03b245..50cfbc1420 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -72,6 +72,8 @@ extern const u8 BattleScript_RoarSuccessSwitch[]; extern const u8 BattleScript_RoarSuccessEndBattle[]; extern const u8 BattleScript_MistProtected[]; extern const u8 BattleScript_RageIsBuilding[]; +extern const u8 BattleScript_EncoredMoveInPalace[]; +extern const u8 BattleScript_EncoredMove[]; extern const u8 BattleScript_MoveUsedIsDisabled[]; extern const u8 BattleScript_SelectingDisabledMove[]; extern const u8 BattleScript_DisabledNoMore[]; diff --git a/include/battle_util.h b/include/battle_util.h index 62b959cfe3..f6c591635b 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -233,7 +233,7 @@ void BattleScriptPushCursor(void); void BattleScriptCall(const u8 *bsPtr); void BattleScriptPop(void); u32 TrySetCantSelectMoveBattleScript(u32 battler); -u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); +u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); u8 GetImprisonedMovesCount(u32 battler, u16 move); s32 GetDrainedBigRootHp(u32 battler, s32 hp); diff --git a/include/config/battle.h b/include/config/battle.h index f34004783f..3fdc45e490 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -129,6 +129,7 @@ #define B_DESTINY_BOND_FAIL GEN_LATEST // In Gen7+, Destiny Bond fails if used repeatedly. #define B_PURSUIT_TARGET GEN_LATEST // In Gen4+, Pursuit attacks a switching opponent even if they weren't targeting them. Before Gen4, Pursuit only attacks a switching opponent that it originally targeted. #define B_SKIP_RECHARGE GEN_LATEST // In Gen1, recharging moves such as Hyper Beam skip the recharge if the target gets KO'd +#define B_ENCORE_TARGET GEN_LATEST // In Gen5+, encored moves are allowed to choose a target // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 680ea413d8..57b56d4cbe 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -138,6 +138,7 @@ enum StringID STRINGID_PKMNMOVEISDISABLED, STRINGID_PKMNMOVEDISABLEDNOMORE, STRINGID_PKMNGOTENCORE, + STRINGID_PKMNGOTENCOREDMOVE, STRINGID_PKMNENCOREENDED, STRINGID_PKMNTOOKAIM, STRINGID_PKMNSKETCHEDMOVE, diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 7a3485e2f7..143dc6e5bb 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -18,6 +18,7 @@ enum GenConfigTag GEN_CONFIG_ATE_MULTIPLIER, GEN_CONFIG_FELL_STINGER_STAT_RAISE, GEN_CONFIG_DEFIANT_STICKY_WEB, + GEN_CONFIG_ENCORE_TARGET, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index ef59c05962..146139d39e 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -18,9 +18,10 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_ABILITY_WEATHER] = B_ABILITY_WEATHER, [GEN_CONFIG_MOODY_STATS] = B_MOODY_ACC_EVASION, [GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND, - [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, [GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER, + [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, [GEN_CONFIG_DEFIANT_STICKY_WEB] = B_DEFIANT_STICKY_WEB, + [GEN_CONFIG_ENCORE_TARGET] = B_ENCORE_TARGET, }; #if TESTING diff --git a/src/battle_main.c b/src/battle_main.c index 6e99411ce8..b62f3d2cc9 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4237,7 +4237,7 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; return; } - else if (gDisableStructs[battler].encoredMove != 0) + else if (GetGenConfig(GEN_CONFIG_ENCORE_TARGET) < GEN_5 && gDisableStructs[battler].encoredMove != MOVE_NONE) { gChosenMoveByBattler[battler] = gDisableStructs[battler].encoredMove; gBattleStruct->chosenMovePositions[battler] = gDisableStructs[battler].encoredMovePos; diff --git a/src/battle_message.c b/src/battle_message.c index fbb36fa6d1..35d8b23083 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -297,6 +297,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNMOVEISDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} is disabled!\p"), [STRINGID_PKMNMOVEDISABLEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s move is no longer disabled!"), [STRINGID_PKMNGOTENCORE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} must do an encore!"), + [STRINGID_PKMNGOTENCOREDMOVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} can only use {B_CURRENT_MOVE}!\p"), [STRINGID_PKMNENCOREENDED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} ended its encore!"), [STRINGID_PKMNTOOKAIM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} took aim at {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNSKETCHEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sketched {B_BUFF1}!"), diff --git a/src/battle_util.c b/src/battle_util.c index 0b6510e7a2..66e5dfd4e2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1308,6 +1308,24 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); + if (GetGenConfig(GEN_CONFIG_ENCORE_TARGET) >= GEN_5 + && DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].encoredMove != move && gDisableStructs[battler].encoredMove != MOVE_NONE) + { + gBattleScripting.battler = battler; + gCurrentMove = gDisableStructs[battler].encoredMove; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[battler] = BattleScript_EncoredMoveInPalace; + gProtectStructs[battler].palaceUnableToUseMove = TRUE; + } + else + { + gSelectionBattleScripts[battler] = BattleScript_EncoredMove; + limitations++; + } + return limitations; + } + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = battler; @@ -1544,7 +1562,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) return limitations; } -u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) +u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move; enum BattleMoveEffects moveEffect; @@ -1616,7 +1634,7 @@ u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) #define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1) bool32 AreAllMovesUnusable(u32 battler) { - u8 unusable = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); + u32 unusable = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); if (unusable == ALL_MOVES_MASK) // All moves are unusable. { diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 1ab0003f50..4dce36a219 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -929,7 +929,6 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time") { - KNOWN_FAILING; // AI still switches even if ShouldSwitch is set to immediately return FALSE, something external seems to be triggering this PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); diff --git a/test/battle/move_effect/encore.c b/test/battle/move_effect/encore.c index e2a08f7d75..2c4ade2c88 100644 --- a/test/battle/move_effect/encore.c +++ b/test/battle/move_effect/encore.c @@ -14,6 +14,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns: Encore used PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 10; speedOpponent = 20; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 20; speedOpponent = 10; } GIVEN { + WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { @@ -41,6 +42,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns for player: PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 20; speedOpponent = 10; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 10; speedOpponent = 20; } GIVEN { + WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { diff --git a/test/battle/move_flags/cant_use_twice.c b/test/battle/move_flags/cant_use_twice.c index cba5596d26..3ed751b95d 100644 --- a/test/battle/move_flags/cant_use_twice.c +++ b/test/battle/move_flags/cant_use_twice.c @@ -32,6 +32,7 @@ SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { + WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index c2c74314e5..ca416d230e 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -1771,6 +1771,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your pa DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prevented when sleep clause is active") { GIVEN { + WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); From 7d7ffd58aeb91de50b2536d3ebb4c775a5bfe2ab Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 25 Jun 2025 18:20:55 +0200 Subject: [PATCH 081/248] Fixes Booster Energy timing activation + Clean up (#7175) Co-authored-by: PhallenTree <168426989+PhallenTree@users.noreply.github.com> --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 4 + include/battle.h | 2 +- include/battle_util.h | 3 +- include/constants/battle_script_commands.h | 7 ++ src/battle_end_turn.c | 8 +- src/battle_main.c | 6 +- src/battle_script_commands.c | 40 +++++++-- src/battle_util.c | 96 +++++++++------------- test/battle/hold_effect/booster_energy.c | 50 +++++++++++ 10 files changed, 144 insertions(+), 77 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ea97d5e10e..a4e0a0cbf2 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2562,3 +2562,8 @@ callnative BS_JumpIfNoWhiteOut .4byte \jumpInstr .endm + + .macro tryboosterenergy onFieldStatus:req + callnative BS_TryBoosterEnergy + .byte \onFieldStatus + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 60d0f77b9f..13503b0f91 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5561,6 +5561,7 @@ BattleScript_TerrainEnds_Ret:: printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_RESTORE_BG + tryboosterenergy ON_TERRAIN return BattleScript_TerrainEnds:: @@ -7399,6 +7400,7 @@ BattleScript_ShedSkinActivates:: BattleScript_ActivateWeatherAbilities: saveattacker savetarget + tryboosterenergy ON_WEATHER setbyte gBattlerAttacker, 0 BattleScript_ActivateWeatherAbilities_Loop: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 @@ -7703,6 +7705,7 @@ BattleScript_SnowWarningActivatesSnow:: BattleScript_ActivateTerrainEffects: saveattacker savetarget + tryboosterenergy ON_TERRAIN setbyte gBattlerAttacker, 0 BattleScript_ActivateTerrainSeed: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 @@ -8897,6 +8900,7 @@ BattleScript_ActivateTeraformZero_RemoveTerrain: printfromtable gTerrainStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ActivateTeraformZero_End: + tryboosterenergy ON_ANY end3 BattleScript_QuickClawActivation:: diff --git a/include/battle.h b/include/battle.h index 821aa995e1..52af53effc 100644 --- a/include/battle.h +++ b/include/battle.h @@ -128,7 +128,7 @@ struct DisableStruct u8 usedProteanLibero:1; u8 flashFireBoosted:1; u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) - u8 boosterEnergyActivates:1; + u8 boosterEnergyActivated:1; u8 roostActive:1; u8 unburdenActive:1; u8 neutralizingGas:1; diff --git a/include/battle_util.h b/include/battle_util.h index f6c591635b..d1ab994132 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -264,7 +264,7 @@ u32 GetProtectType(enum ProtectMethod method); bool32 CanBattlerEscape(u32 battler); // no ability check void BattleScriptExecute(const u8 *BS_ptr); void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); -u32 ItemBattleEffects(enum ItemCaseId, u32 battler, bool32 moveTurn); +u32 ItemBattleEffects(enum ItemCaseId, u32 battler); void ClearVariousBattlerFlags(u32 battler); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); @@ -396,5 +396,6 @@ void UpdateStallMons(void); bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); u32 GetMonVolatile(u32 battler, enum Volatile volatile); void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue); +u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 630687e0b3..8061399d27 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -306,4 +306,11 @@ enum StatusTrigger TRIGGER_ON_PROTECT, }; +enum TriggerOnFieldStatus +{ + ON_ANY, + ON_TERRAIN, + ON_WEATHER, +}; + #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 7d4314c6dd..b63fd3938f 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -512,7 +512,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) { case HOLD_EFFECT_LEFTOVERS: case HOLD_EFFECT_BLACK_SLUDGE: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) effect = TRUE; break; default: @@ -1423,11 +1423,11 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) case HOLD_EFFECT_FLAME_ORB: case HOLD_EFFECT_STICKY_BARB: case HOLD_EFFECT_TOXIC_ORB: - if (ItemBattleEffects(ITEMEFFECT_ORBS, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_ORBS, battler)) effect = TRUE; break; case HOLD_EFFECT_WHITE_HERB: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) effect = TRUE; break; default: @@ -1485,7 +1485,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler) enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); if (holdEffect == HOLD_EFFECT_EJECT_PACK) { - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) effect = TRUE; } gBattleStruct->eventBlockCounter = 0; diff --git a/src/battle_main.c b/src/battle_main.c index b62f3d2cc9..7b86856a3e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3869,7 +3869,7 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_ITEM_EFFECTS: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++], FALSE)) + if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) return; } gBattleStruct->switchInBattlerCounter = 0; @@ -4734,9 +4734,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivates)) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivated)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivates)) + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivated)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; else if (ability == ABILITY_UNBURDEN && gDisableStructs[battler].unburdenActive) speed *= 2; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d0784a137e..3008680337 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6378,7 +6378,7 @@ static void Cmd_moveend(void) break; } case MOVEEND_ITEM_EFFECTS_TARGET: - if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -6448,14 +6448,14 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0)) effect = TRUE; else gBattleScripting.moveendState++; break; case MOVEEND_KINGSROCK: // King's rock // These effects will occur at each hit in a multi-strike move - if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -6866,7 +6866,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ITEM_EFFECTS_ATTACKER: - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -7047,7 +7047,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_LIFEORB_SHELLBELL: - if (ItemBattleEffects(ITEMEFFECT_LIFEORB_SHELLBELL, 0, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_LIFEORB_SHELLBELL, 0)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -8143,7 +8143,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gDisableStructs[battler].truantSwitchInHack = 0; - if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler, FALSE)) + if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler)) return TRUE; else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0)) return TRUE; @@ -10962,7 +10962,7 @@ static void Cmd_various(void) case VARIOUS_MOVEEND_ITEM_EFFECTS: { VARIOUS_ARGS(); - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) return; break; } @@ -11235,7 +11235,7 @@ static void Cmd_various(void) gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID - if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler, FALSE)) + if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler)) return; gBattlescriptCurrInstr = cmd->nextInstr; return; @@ -17602,7 +17602,7 @@ void BS_RunStatChangeItems(void) // Change instruction before calling ItemBattleEffects. gBattlescriptCurrInstr = cmd->nextInstr; - ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE); + ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler)); } static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) @@ -18601,6 +18601,28 @@ void BS_JumpIfNoWhiteOut(void) gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_TryBoosterEnergy(void) +{ + NATIVE_ARGS(u8 onFieldStatus); + + for (u32 orderNum = 0; orderNum < gBattlersCount; orderNum++) + { + u32 battlerByTurnOrder = gBattlerByTurnOrder[orderNum]; + if (GetBattlerHoldEffect(battlerByTurnOrder, TRUE) != HOLD_EFFECT_BOOSTER_ENERGY) + continue; + + u32 ability = GetBattlerAbility(battlerByTurnOrder); + if (!(ability == ABILITY_PROTOSYNTHESIS && cmd->onFieldStatus != ON_TERRAIN) + && !(ability == ABILITY_QUARK_DRIVE && cmd->onFieldStatus != ON_WEATHER)) + continue; + + if (TryBoosterEnergy(battlerByTurnOrder, ability, ITEMEFFECT_NONE)) + return; + } + + gBattlescriptCurrInstr = cmd->nextInstr; +} + void BS_JumpIfAbilityCantBeSuppressed(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); diff --git a/src/battle_util.c b/src/battle_util.c index 66e5dfd4e2..8ea025f534 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1755,7 +1755,7 @@ bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck) return TRUE; } -#define FAINTED_ACTIONS_MAX_CASE 7 +#define FAINTED_ACTIONS_MAX_CASE 6 bool32 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -1830,19 +1830,14 @@ bool32 HandleFaintedMonActions(void) return TRUE; } } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount); - gBattleStruct->faintedActionsState = 6; + gBattleStruct->faintedActionsState = FAINTED_ACTIONS_MAX_CASE; break; case 5: if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount) - gBattleStruct->faintedActionsState = 6; + gBattleStruct->faintedActionsState = FAINTED_ACTIONS_MAX_CASE; else gBattleStruct->faintedActionsState = 4; break; - case 6: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE)) - return TRUE; - gBattleStruct->faintedActionsState++; - break; case FAINTED_ACTIONS_MAX_CASE: break; } @@ -5303,7 +5298,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gDisableStructs[battler].weatherAbilityDone && (gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect() && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !gDisableStructs[battler].boosterEnergyActivates) + && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].weatherAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -5332,7 +5327,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gDisableStructs[battler].terrainAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) - && !gDisableStructs[battler].boosterEnergyActivates) + && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].terrainAbilityDone = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); @@ -6256,7 +6251,6 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) if (gProtectStructs[battler].eatMirrorHerb) { - gLastUsedItem = gBattleMons[battler].item; gBattleScripting.battler = battler; gProtectStructs[battler].eatMirrorHerb = 0; @@ -6270,17 +6264,19 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) return effect; } -static inline u32 TryBoosterEnergy(u32 battler, enum ItemCaseId caseID) +u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID) { - if (gDisableStructs[battler].boosterEnergyActivates || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) return ITEM_NO_EFFECT; - if (((GetBattlerAbility(battler) == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) - || ((GetBattlerAbility(battler) == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) + if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) + || ((ability == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) { PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); gBattlerAbility = gBattleScripting.battler = battler; - gDisableStructs[battler].boosterEnergyActivates = TRUE; + gDisableStructs[battler].boosterEnergyActivated = TRUE; + gLastUsedItem = ITEM_BOOSTER_ENERGY; + RecordAbilityBattle(battler, ability); if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) BattleScriptExecute(BattleScript_BoosterEnergyEnd2); else @@ -6564,7 +6560,7 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) return effect; } -u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) +u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) { u32 moveType = 0; enum ItemEffect effect = ITEM_NO_EFFECT; @@ -6771,7 +6767,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) effect = TryConsumeMirrorHerb(battler, caseID); break; case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(battler, caseID); + effect = TryBoosterEnergy(battler, GetBattlerAbility(battler), caseID); break; default: break; @@ -6795,16 +6791,13 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (!moveTurn) - effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); + effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); break; case HOLD_EFFECT_RESTORE_PCT_HP: - if (!moveTurn) - effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); + effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); break; case HOLD_EFFECT_RESTORE_PP: - if (!moveTurn) - effect = ItemRestorePp(battler, gLastUsedItem, caseID); + effect = ItemRestorePp(battler, gLastUsedItem, caseID); break; case HOLD_EFFECT_WHITE_HERB: effect = RestoreWhiteHerbStats(battler); @@ -6816,7 +6809,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { goto LEFTOVERS; } - else if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD && !moveTurn) + else if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; if (gBattleStruct->moveDamage[battler] == 0) @@ -6829,7 +6822,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_LEFTOVERS: LEFTOVERS: - if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !moveTurn + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -6842,47 +6835,37 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case HOLD_EFFECT_CONFUSE_SPICY: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); + effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); break; case HOLD_EFFECT_CONFUSE_DRY: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); + effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); break; case HOLD_EFFECT_CONFUSE_SWEET: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); + effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); break; case HOLD_EFFECT_CONFUSE_BITTER: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); + effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); break; case HOLD_EFFECT_CONFUSE_SOUR: - if (!moveTurn) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); + effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); break; case HOLD_EFFECT_ATTACK_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); + effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); break; case HOLD_EFFECT_DEFENSE_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); + effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); break; case HOLD_EFFECT_SPEED_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); + effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); break; case HOLD_EFFECT_SP_ATTACK_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); + effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); break; case HOLD_EFFECT_SP_DEFENSE_UP: - if (!moveTurn) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); + effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); break; case HOLD_EFFECT_CRITICAL_UP: - if (!moveTurn && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (!(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) { gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; @@ -6892,8 +6875,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); + effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) @@ -6964,8 +6946,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) } break; case HOLD_EFFECT_MICLE_BERRY: - if (!moveTurn) - effect = TrySetMicleBerry(battler, gLastUsedItem, caseID); + effect = TrySetMicleBerry(battler, gLastUsedItem, caseID); break; case HOLD_EFFECT_BERSERK_GENE: effect = ConsumeBerserkGene(battler, caseID); @@ -6973,9 +6954,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_MIRROR_HERB: effect = TryConsumeMirrorHerb(battler, caseID); break; - case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(battler, caseID); - break; default: break; } @@ -8469,7 +8447,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) case ABILITY_PROTOSYNTHESIS: { u8 defHighestStat = GetHighestStatId(battlerDef); - if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivates) + if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivated) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); @@ -8478,7 +8456,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) case ABILITY_QUARK_DRIVE: { u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivates) + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivated) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); @@ -8726,7 +8704,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivates) + if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); @@ -8737,7 +8715,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivates) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); @@ -11396,7 +11374,7 @@ bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice { - if (ItemBattleEffects(caseId, battler, FALSE)) + if (ItemBattleEffects(caseId, battler)) return TRUE; } return FALSE; diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index f6f44a272c..41e5fe3b47 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -234,3 +234,53 @@ DOUBLE_BATTLE_TEST("Booster Energy triggers correctly for all battlers if multip ABILITY_POPUP(opponentLeft, ABILITY_PROTOSYNTHESIS); } } + +DOUBLE_BATTLE_TEST("Booster Energy activates on any terrain") +{ + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Speed(110); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_QUARK_DRIVE); + ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); + } +} + +DOUBLE_BATTLE_TEST("Booster Energy activates on air locked sun") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_RAGING_BOLT) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_PSYDUCK) { Ability(ABILITY_CLOUD_NINE); } + OPPONENT(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); }; + } WHEN { + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_CLOUD_NINE); + ABILITY_POPUP(opponentRight, ABILITY_DROUGHT); + ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); + } +} + +DOUBLE_BATTLE_TEST("Booster Energy will not activate on terrain if user has Protosynthesis instead of Quark Drive") +{ + GIVEN { + PLAYER(SPECIES_RAGING_BOLT) { Speed(110); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + PLAYER(SPECIES_WOBBUFFET) { Speed(80); } + OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); + NOT ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); + ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); // Activation after all terrains + } +} From f0230d0c8c531df1c5c21f5f26fb840c5aa3634d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 25 Jun 2025 14:08:22 -0400 Subject: [PATCH 082/248] Fixed Fake RTC debug menu (#7218) --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index a1ffe50671..df604413b9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1196,7 +1196,7 @@ static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOpti } else { - Debug_DestroyMenu_Full(taskId); + Debug_DestroyMenu(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } } From 4f731835b4dba3cbea4c322e7d23da4b4342276e Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 25 Jun 2025 20:13:29 +0200 Subject: [PATCH 083/248] Update .gitignore to add heal locations (#7050) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d7071897e6..8cc8ba9ed9 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ prefabs.json *.js /pokeemerald-*.png src/data/map_group_count.h +include/constants/heal_locations.h tools/trainerproc/trainerproc tools/compresSmol/compresSmol tools/compresSmol/compresSmolTilemap From c6221fa50ea7d5c8ca5b577f1cdca26c9878333b Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:13:43 -0500 Subject: [PATCH 084/248] Add debug options for follower NPCs (#7215) --- data/scripts/debug.inc | 18 +++++++ include/follower_npc.h | 2 + src/debug.c | 108 ++++++++++++++++++++++++++++++++++++++++- src/follower_npc.c | 101 ++++++++++++++++++++------------------ 4 files changed, 181 insertions(+), 48 deletions(-) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index d82ce2f358..05eeb4ecaf 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -270,6 +270,24 @@ Debug_ShowExpansionVersion:: Debug_ExpansionVersion: .string "pokeemerald-expansion {STR_VAR_1}$" +Debug_Follower_NPC_Not_Enabled:: + msgbox Debug_Enable_To_Use_Follower_NPCs, MSGBOX_DEFAULT + release + end + +Debug_Enable_To_Use_Follower_NPCs: + .string "Feature unavailable.\nSet FNPC_ENABLE_NPC_FOLLOWERS to\lTRUE in 'include/config/follower_npc.h'.$" + +Debug_Follower_NPC_Event_Script:: + lock + facefollowernpc + msgbox Debug_Follower_NPC_Test_Message, MSGBOX_DEFAULT + releaseall + end + +Debug_Follower_NPC_Test_Message: + .string "This is a Follower NPC test.$" + Debug_EventScript_Steven_Multi:: call MossdeepCity_SpaceCenter_2F_EventScript_ChoosePartyForMultiBattle release diff --git a/include/follower_npc.h b/include/follower_npc.h index ec41fa1364..a9be81d62c 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -82,6 +82,8 @@ const u8 *GetFollowerNPCScriptPointer(void); u32 GetFollowerNPCData(enum FollowerNPCDataTypes type); void ClearFollowerNPCData(void); +void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr); +void DestroyFollowerNPC(void); u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direction); void SetFollowerNPCSprite(u32 spriteIndex); diff --git a/src/debug.c b/src/debug.c index df604413b9..bc2b56aec1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -23,6 +23,7 @@ #include "field_message_box.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "follower_npc.h" #include "international_string_util.h" #include "item.h" #include "item_icon.h" @@ -58,6 +59,7 @@ #include "constants/battle_ai.h" #include "constants/battle_frontier.h" #include "constants/coins.h" +#include "constants/event_objects.h" #include "constants/expansion.h" #include "constants/flags.h" #include "constants/items.h" @@ -71,6 +73,17 @@ #include "fake_rtc.h" #include "save.h" +enum FollowerNPCCreateDebugMenu +{ + DEBUG_FNPC_BRENDAN, + DEBUG_FNPC_MAY, + DEBUG_FNPC_STEVEN, + DEBUG_FNPC_WALLY, + DEBUG_FNPC_RED, + DEBUG_FNPC_LEAF, + DEBUG_FNPC_COUNT, +}; + enum FlagsVarsDebugMenu { DEBUG_FLAGVAR_MENU_ITEM_FLAGS, @@ -223,6 +236,7 @@ static void Debug_RefreshListMenu(u8 taskId); static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_OpenSubMenuFlagsVars(u8 taskId); static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items); +static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_ExecuteScript(u8 taskId, const u8 *script); static void DebugTask_HandleMenuInput_General(u8 taskId); @@ -241,6 +255,9 @@ static void DebugAction_Util_CheatStart(u8 taskId); static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId); static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId); +static void DebugAction_CreateFollowerNPC(u8 taskId); +static void DebugAction_DestroyFollowerNPC(u8 taskId); + static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId); static void DebugAction_PCBag_Fill_PCBoxes_Slow(u8 taskId); static void DebugAction_PCBag_Fill_PCItemStorage(u8 taskId); @@ -345,6 +362,8 @@ extern const u8 Debug_CheckROMSpace[]; extern const u8 Debug_BoxFilledMessage[]; extern const u8 Debug_ShowExpansionVersion[]; extern const u8 Debug_EventScript_EWRAMCounters[]; +extern const u8 Debug_Follower_NPC_Event_Script[]; +extern const u8 Debug_Follower_NPC_Not_Enabled[]; extern const u8 Debug_EventScript_Steven_Multi[]; extern const u8 Debug_EventScript_PrintTimeOfDay[]; extern const u8 Debug_EventScript_TellTheTime[]; @@ -393,6 +412,17 @@ static const u8 *const gTimeOfDayStringsTable[TIMES_OF_DAY_COUNT] = { COMPOUND_STRING("Night"), }; +// Follower NPC + +static const u8 *const gFollowerNPCStringsTable[DEBUG_FNPC_COUNT] = { + COMPOUND_STRING("Brendan"), + COMPOUND_STRING("May"), + COMPOUND_STRING("Steven"), + COMPOUND_STRING("Wally"), + COMPOUND_STRING("Red"), + COMPOUND_STRING("Leaf"), +}; + // Flags/Vars Menu static const u8 sDebugText_FlagsVars_VariableHex[] = _("{STR_VAR_1}{CLEAR_TO 90}\n0x{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_FlagsVars_Variable[] = _("Var: {STR_VAR_1}{CLEAR_TO 90}\nVal: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_2}"); @@ -454,6 +484,17 @@ static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu_Weekdays[] = { NULL } }; +static const struct DebugMenuOption sDebugMenu_Actions_FollowerNPCMenu_Create[] = +{ + [DEBUG_FNPC_BRENDAN] = { gFollowerNPCStringsTable[DEBUG_FNPC_BRENDAN], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_MAY] = { gFollowerNPCStringsTable[DEBUG_FNPC_MAY], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_STEVEN] = { gFollowerNPCStringsTable[DEBUG_FNPC_STEVEN], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_WALLY] = { gFollowerNPCStringsTable[DEBUG_FNPC_WALLY], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_RED] = { gFollowerNPCStringsTable[DEBUG_FNPC_RED], DebugAction_CreateFollowerNPC }, + [DEBUG_FNPC_LEAF] = { gFollowerNPCStringsTable[DEBUG_FNPC_LEAF], DebugAction_CreateFollowerNPC }, + { NULL } +}; + static const struct DebugMenuOption sDebugMenu_Actions_TimeMenu[] = { { COMPOUND_STRING("Get time…"), DebugAction_ExecuteScript, Debug_EventScript_TellTheTime }, @@ -475,6 +516,13 @@ static const struct DebugMenuOption sDebugMenu_Actions_BerryFunctions[] = { NULL } }; +static const struct DebugMenuOption sDebugMenu_Actions_FollowerNPCMenu[] = +{ + { COMPOUND_STRING("Create Follower"), DebugAction_OpenSubMenuCreateFollowerNPC, sDebugMenu_Actions_FollowerNPCMenu_Create }, + { COMPOUND_STRING("Destroy Follower"), DebugAction_DestroyFollowerNPC }, + { NULL } +}; + static const struct DebugMenuOption sDebugMenu_Actions_Utilities[] = { { COMPOUND_STRING("Fly to map…"), DebugAction_Util_Fly }, @@ -486,6 +534,7 @@ static const struct DebugMenuOption sDebugMenu_Actions_Utilities[] = { COMPOUND_STRING("Cheat start"), DebugAction_Util_CheatStart }, { COMPOUND_STRING("Berry Functions…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_BerryFunctions }, { COMPOUND_STRING("EWRAM Counters…"), DebugAction_ExecuteScript, Debug_EventScript_EWRAMCounters }, + { COMPOUND_STRING("Follower NPC…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_FollowerNPCMenu }, { COMPOUND_STRING("Steven Multi"), DebugAction_ExecuteScript, Debug_EventScript_Steven_Multi }, { NULL } }; @@ -766,7 +815,8 @@ static bool32 IsSubMenuAction(const void *action) { return action == DebugAction_OpenSubMenu || action == DebugAction_OpenSubMenuFlagsVars - || action == DebugAction_OpenSubMenuFakeRTC; + || action == DebugAction_OpenSubMenuFakeRTC + || action == DebugAction_OpenSubMenuCreateFollowerNPC; } static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items) @@ -1206,6 +1256,19 @@ static void DebugAction_ExecuteScript(u8 taskId, const u8 *script) Debug_DestroyMenu_Full_Script(taskId, script); } +static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items) +{ + if (FNPC_ENABLE_NPC_FOLLOWERS) + { + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); + } + else + { + Debug_DestroyMenu_Full_Script(taskId, Debug_Follower_NPC_Not_Enabled); + } +} + // ******************************* // Actions Utilities @@ -3272,6 +3335,49 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) } } +static const u32 gDebugFollowerNPCGraphics[] = +{ + OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, + OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, + OBJ_EVENT_GFX_STEVEN, + OBJ_EVENT_GFX_WALLY, + OBJ_EVENT_GFX_RED, + OBJ_EVENT_GFX_LEAF, +}; + +static void DebugAction_CreateFollowerNPC(u8 taskId) +{ + u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + u32 gfx = gDebugFollowerNPCGraphics[input]; + + Debug_DestroyMenu_Full(taskId); + LockPlayerFieldControls(); + DestroyFollowerNPC(); + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, PARTNER_STEVEN); + CreateFollowerNPC(gfx, FNPC_ALL, Debug_Follower_NPC_Event_Script); + if (gfx != OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL && gfx != OBJ_EVENT_GFX_RIVAL_MAY_NORMAL) + { + u32 flags = GetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS); + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, (flags &= ~FNPC_RUNNING)); + } + UnlockPlayerFieldControls(); +} + +static void DebugAction_DestroyFollowerNPC(u8 taskId) +{ + if (FNPC_ENABLE_NPC_FOLLOWERS) + { + Debug_DestroyMenu_Full(taskId); + LockPlayerFieldControls(); + DestroyFollowerNPC(); + UnlockPlayerFieldControls(); + } + else + { + Debug_DestroyMenu_Full_Script(taskId, Debug_Follower_NPC_Not_Enabled); + } +} + #undef tCurrentSong #undef tMenuTaskId diff --git a/src/follower_npc.c b/src/follower_npc.c index 67129548ac..0b2a4b70b3 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -49,7 +49,6 @@ static void SetFollowerNPCScriptPointer(const u8 *script); static void PlayerLogCoordinates(struct ObjectEvent *player); static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *script); -static void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr); static u32 GetFollowerNPCSprite(void); static bool32 IsStateMovement(u32 state); static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower); @@ -227,45 +226,6 @@ static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, c FollowerNPC_HandleSprite(); } -static void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr) -{ - struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; - struct ObjectEvent *follower; - struct ObjectEventTemplate npc = - { - .localId = OBJ_EVENT_ID_NPC_FOLLOWER, - .graphicsId = gfx, - .x = player->currentCoords.x, - .y = player->currentCoords.y, - .elevation = PlayerGetElevation(), - .script = scriptPtr - }; - - SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, player->currentCoords.x, player->currentCoords.y)); - follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; - follower->movementType = MOVEMENT_TYPE_NONE; - gSprites[follower->spriteId].callback = MovementType_None; - - SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); - SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); - SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); - SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); - SetFollowerNPCScriptPointer(scriptPtr); - - // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. - if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) - && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - - // Set the follower sprite to match the player state. - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) - FollowerNPC_HandleSprite(); - - HideNPCFollower(); - SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); -} - static u32 GetFollowerNPCSprite(void) { u32 i; @@ -712,6 +672,58 @@ static void CalculateFollowerNPCEscalatorTrajectoryDown(struct Task *task) #undef tCounter +void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr) +{ + if (PlayerHasFollowerNPC()) + return; + + struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEvent *follower; + struct ObjectEventTemplate npc = + { + .localId = OBJ_EVENT_ID_NPC_FOLLOWER, + .graphicsId = gfx, + .x = player->currentCoords.x, + .y = player->currentCoords.y, + .elevation = PlayerGetElevation(), + .script = scriptPtr + }; + + SetFollowerNPCData(FNPC_DATA_OBJ_ID, TrySpawnObjectEventTemplate(&npc, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, player->currentCoords.x, player->currentCoords.y)); + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + follower->movementType = MOVEMENT_TYPE_NONE; + gSprites[follower->spriteId].callback = MovementType_None; + + SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); + SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + SetFollowerNPCScriptPointer(scriptPtr); + + // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. + if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) + && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + + // Set the follower sprite to match the player state. + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ON_FOOT)) + FollowerNPC_HandleSprite(); + + HideNPCFollower(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); +} + +void DestroyFollowerNPC(void) +{ + if (!PlayerHasFollowerNPC()) + return; + + RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); + ClearFollowerNPCData(); + UpdateFollowingPokemon(); +} + #define RETURN_STATE(state, dir) return newState == MOVEMENT_INVALID ? state + (dir - 1) : ReturnFollowerNPCDelayedState(dir - 1); u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direction) { @@ -1642,7 +1654,7 @@ void ScriptCreateFollowerNPC(struct ScriptContext *ctx) const u8 *script = (const u8 *)ScriptReadWord(ctx); u32 battlePartner = ScriptReadHalfword(ctx); - if (PlayerHasFollowerNPC()) + if (!FNPC_ENABLE_NPC_FOLLOWERS || PlayerHasFollowerNPC()) return; SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, battlePartner); @@ -1651,12 +1663,7 @@ void ScriptCreateFollowerNPC(struct ScriptContext *ctx) void ScriptDestroyFollowerNPC(struct ScriptContext *ctx) { - if (!PlayerHasFollowerNPC()) - return; - - RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); - ClearFollowerNPCData(); - UpdateFollowingPokemon(); + DestroyFollowerNPC(); } void ScriptFaceFollowerNPC(struct ScriptContext *ctx) From 2531613a528450c0d21ec1b564ccbfb6a8680a9f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 25 Jun 2025 21:15:40 +0200 Subject: [PATCH 085/248] Fixes Eject Pack not resolving correctly during switch in effects (#7002) --- asm/macros/battle_script.inc | 4 -- data/battle_scripts_1.s | 6 ++- include/battle.h | 2 +- include/battle_main.h | 1 + include/battle_scripts.h | 1 + include/battle_util.h | 1 + src/battle_main.c | 7 ++- src/battle_script_commands.c | 62 ++++++---------------- src/battle_util.c | 57 +++++++++++++++++++- test/battle/hold_effect/eject_pack.c | 78 ++++++++++++++++++++++++++++ 10 files changed, 162 insertions(+), 57 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a4e0a0cbf2..11cca995c0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1401,10 +1401,6 @@ .byte \battler .endm - .macro tryintimidateejectpack - callnative BS_TryIntimidateEjectPack - .endm - .macro allyswitchswapbattlers callnative BS_AllySwitchSwapBattler .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 13503b0f91..0a908236f6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7462,7 +7462,6 @@ BattleScript_IntimidateLoopIncrement: destroyabilitypopup restoretarget pause B_WAIT_TIME_MED - tryintimidateejectpack end3 BattleScript_IntimidatePrevented:: @@ -7520,7 +7519,6 @@ BattleScript_SupersweetSyrupLoopIncrement: destroyabilitypopup restoretarget pause B_WAIT_TIME_MED - tryintimidateejectpack end3 BattleScript_SupersweetSyrupWontDecrease: @@ -9215,6 +9213,10 @@ BattleScript_EjectPackActivate_End2:: call BattleScript_EjectPackActivate_Ret end2 +BattleScript_EjectPackActivate_End3:: + call BattleScript_EjectPackActivate_Ret + end3 + BattleScript_EjectPackActivates:: jumpifcantswitch BS_SCRIPTING, BattleScript_EjectButtonEnd goto BattleScript_EjectPackActivate_Ret diff --git a/include/battle.h b/include/battle.h index 52af53effc..e113edd6d4 100644 --- a/include/battle.h +++ b/include/battle.h @@ -160,7 +160,7 @@ struct ProtectStruct u32 unused:8; // End of 32-bit bitfield u16 disableEjectPack:1; - u16 statFell:1; + u16 tryEjectPack:1; u16 pranksterElevated:1; u16 quickDraw:1; u16 beakBlastCharge:1; diff --git a/include/battle_main.h b/include/battle_main.h index 42c2dc2b32..23e030f6d3 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -60,6 +60,7 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_OPPORTUNIST_1, FIRST_TURN_EVENTS_ITEM_EFFECTS, FIRST_TURN_EVENTS_OPPORTUNIST_2, + FIRST_TURN_EVENTS_EJECT_PACK, FIRST_TURN_EVENTS_END, }; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 50cfbc1420..80d6693bd5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -420,6 +420,7 @@ extern const u8 BattleScript_RedCardActivates[]; extern const u8 BattleScript_EjectButtonActivates[]; extern const u8 BattleScript_EjectPackActivate_Ret[]; extern const u8 BattleScript_EjectPackActivate_End2[]; +extern const u8 BattleScript_EjectPackActivate_End3[]; extern const u8 BattleScript_EjectPackActivates[]; extern const u8 BattleScript_MentalHerbCureRet[]; extern const u8 BattleScript_MentalHerbCureEnd2[]; diff --git a/include/battle_util.h b/include/battle_util.h index d1ab994132..f198857994 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -394,6 +394,7 @@ bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); +bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); u32 GetMonVolatile(u32 battler, enum Volatile volatile); void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue); u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); diff --git a/src/battle_main.c b/src/battle_main.c index 7b86856a3e..4427093e30 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3325,7 +3325,7 @@ const u8* FaintClearSetData(u32 battler) gProtectStructs[battler].fleeType = 0; gProtectStructs[battler].notFirstStrike = FALSE; gProtectStructs[battler].statRaised = FALSE; - gProtectStructs[battler].statFell = FALSE; + gProtectStructs[battler].tryEjectPack = FALSE; gProtectStructs[battler].pranksterElevated = FALSE; gDisableStructs[battler].isFirstTurn = 2; @@ -3880,6 +3880,11 @@ static void TryDoEventsBeforeFirstTurn(void) return; gBattleStruct->eventsBeforeFirstTurnState++; break; + case FIRST_TURN_EVENTS_EJECT_PACK: + gBattleStruct->eventsBeforeFirstTurnState++; + if (TrySwitchInEjectPack(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN)) + return; + break; case FIRST_TURN_EVENTS_END: for (i = 0; i < MAX_BATTLERS_COUNT; i++) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3008680337..240ed0367b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5999,7 +5999,7 @@ static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { - if (gProtectStructs[battlerDef].statFell + if (gProtectStructs[battlerDef].tryEjectPack && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(battlerDef) && CountUsablePartyMons(battlerDef) > 0 @@ -6901,6 +6901,9 @@ static void Cmd_moveend(void) break; } + for (u32 i = 0; i < gBattlersCount; i++) + gProtectStructs[i].tryEjectPack = FALSE; + u8 battlers[4] = {0, 1, 2, 3}; if (numEjectButtonBattlers > 1) SortBattlersBySpeed(battlers, FALSE); @@ -6952,7 +6955,7 @@ static void Cmd_moveend(void) SortBattlersBySpeed(battlers, FALSE); for (i = 0; i < gBattlersCount; i++) - gProtectStructs[i].statFell = FALSE; // restore for every possible eject pack battler + gProtectStructs[i].tryEjectPack = FALSE; for (i = 0; i < gBattlersCount; i++) { @@ -7024,6 +7027,8 @@ static void Cmd_moveend(void) && CanBattlerSwitch(gBattlerAttacker) && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battler))) { + for (u32 i = 0; i < gBattlersCount; i++) + gProtectStructs[i].tryEjectPack = FALSE; effect = TRUE; gLastUsedItem = gBattleMons[battler].item; SaveBattlerTarget(battler); // save battler with red card @@ -7116,6 +7121,9 @@ static void Cmd_moveend(void) break; } + for (u32 i = 0; i < gBattlersCount; i++) + gProtectStructs[i].tryEjectPack = FALSE; + u8 battlers[4] = {0, 1, 2, 3}; if (numEmergencyExitBattlers > 1) SortBattlersBySpeed(battlers, FALSE); @@ -7261,6 +7269,7 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; + gProtectStructs[i].tryEjectPack = FALSE; if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i)) { @@ -8236,6 +8245,8 @@ static void Cmd_switchineffects(void) return; } } + if (TrySwitchInEjectPack(ITEMEFFECT_NONE)) + return; // All battlers done, end for (i = 0; i < gBattlersCount; i++) gBattleStruct->battlerState[i].multipleSwitchInBattlers = FALSE; @@ -8246,7 +8257,7 @@ static void Cmd_switchineffects(void) break; default: UpdateSentMonFlags(battler); - if (!DoSwitchInEffectsForBattler(battler)) + if (!DoSwitchInEffectsForBattler(battler) && !TrySwitchInEjectPack(ITEMEFFECT_NONE)) gBattlescriptCurrInstr = cmd->nextInstr; break; } @@ -12272,7 +12283,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan } else if (!flags.onlyChecking) { - gProtectStructs[battler].statFell = TRUE; + gProtectStructs[battler].tryEjectPack = TRUE; gProtectStructs[battler].lashOutAffected = TRUE; } } @@ -18526,49 +18537,6 @@ void BS_JumpIfIntimidateAbilityPrevented(void) } } -void BS_TryIntimidateEjectPack(void) -{ - NATIVE_ARGS(); - - u32 affectedBattler = 0xFF; - u32 battler = BATTLE_OPPOSITE(gBattlerAttacker); - u32 partnerBattler = BATTLE_PARTNER(battler); - - bool32 ejectPackBattler = CanEjectPackTrigger(gBattlerAttacker, battler, MOVE_NONE); - bool32 ejectPackPartnerBattler = CanEjectPackTrigger(gBattlerAttacker, partnerBattler, MOVE_NONE); - - if (ejectPackBattler && ejectPackPartnerBattler) - { - u32 battlerSpeed = GetBattlerTotalSpeedStat(battler); - u32 partnerbattlerSpeed = GetBattlerTotalSpeedStat(partnerBattler); - - if (battlerSpeed >= partnerbattlerSpeed) - affectedBattler = battler; - else - affectedBattler = partnerBattler; - } - else if (ejectPackBattler) - { - affectedBattler = battler; - } - else if (ejectPackPartnerBattler) - { - affectedBattler = partnerBattler; - } - - gBattlescriptCurrInstr = cmd->nextInstr; - if (affectedBattler != 0xFF) - { - gProtectStructs[battler].statFell = FALSE; - gProtectStructs[partnerBattler].statFell = FALSE; - gAiLogicData->ejectPackSwitch = TRUE; - gBattleScripting.battler = affectedBattler; - gLastUsedItem = gBattleMons[affectedBattler].item; - RecordItemEffectBattle(affectedBattler, HOLD_EFFECT_EJECT_PACK); - BattleScriptCall(BattleScript_EjectPackActivate_Ret); - } -} - void BS_JumpIfCanGigantamax(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); diff --git a/src/battle_util.c b/src/battle_util.c index 8ea025f534..1580e2addc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6073,12 +6073,12 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) { - if (gProtectStructs[battler].statFell + if (gProtectStructs[battler].tryEjectPack && !gProtectStructs[battler].disableEjectPack && CountUsablePartyMons(battler) > 0 && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) // Does not activate if attacker used Parting Shot and can switch out { - gProtectStructs[battler].statFell = FALSE; + gProtectStructs[battler].tryEjectPack = FALSE; gBattleScripting.battler = battler; gAiLogicData->ejectPackSwitch = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) @@ -11380,6 +11380,59 @@ bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) return FALSE; } +bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) +{ + // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. + u32 ejectPackBattlers = 0; + u32 numEjectPackBattlers = 0; + + for (u32 i = 0; i < gBattlersCount; i++) + { + if (gProtectStructs[i].tryEjectPack + && GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_EJECT_PACK + && IsBattlerAlive(i) + && CountUsablePartyMons(i) > 0) + { + ejectPackBattlers |= 1u << i; + numEjectPackBattlers++; + } + } + + if (numEjectPackBattlers == 0) + return FALSE; + + u8 battlers[4] = {0, 1, 2, 3}; + if (numEjectPackBattlers > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (u32 i = 0; i < gBattlersCount; i++) + gProtectStructs[i].tryEjectPack = FALSE; + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + + if (!(ejectPackBattlers & 1u << battler)) + continue; + + gBattleScripting.battler = battler; + gLastUsedItem = gBattleMons[battler].item; + if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) + { + BattleScriptPushCursorAndCallback(BattleScript_EjectPackActivate_End3); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret; + } + gAiLogicData->ejectPackSwitch = TRUE; + return TRUE; + } + + return FALSE; +} + #define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeBitSize, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; // Gets the value of a volatile status flag for a certain battler diff --git a/test/battle/hold_effect/eject_pack.c b/test/battle/hold_effect/eject_pack.c index f33a59de21..39724bdffb 100644 --- a/test/battle/hold_effect/eject_pack.c +++ b/test/battle/hold_effect/eject_pack.c @@ -239,3 +239,81 @@ DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after } } } + +DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after intimidate (switch in after fainting)") +{ + u32 speed; + + PARAMETRIZE { speed = 1; } + PARAMETRIZE { speed = 11; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Speed(speed); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WYNAUT) { HP(1); Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_EKANS) { Speed(6); Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_POUND, target: opponentLeft); + SEND_OUT(opponentLeft, 2); + if (speed == 11) + SEND_OUT(playerRight, 2); + else + SEND_OUT(playerLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + if (speed == 11) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } + } +} + +DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after intimidate (switch in after 2 mons fainted)") +{ + u32 speed; + + PARAMETRIZE { speed = 1; } + PARAMETRIZE { speed = 11; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT) { Speed(speed); Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WYNAUT) { HP(1); Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(4); } + OPPONENT(SPECIES_EKANS) { Speed(6); Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_HYPER_VOICE); + SEND_OUT(opponentLeft, 3); + SEND_OUT(opponentRight, 2); + if (speed == 11) + SEND_OUT(playerRight, 2); + else + SEND_OUT(playerLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + if (speed == 11) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + } + } +} From f217344cb5a01b317df9ae362b719c4105d00abb Mon Sep 17 00:00:00 2001 From: Bolt-Strike Date: Wed, 25 Jun 2025 15:29:59 -0400 Subject: [PATCH 086/248] Disable unowned evo methods (#7103) --- include/config/pokedex_plus_hgss.h | 13 +- src/pokedex_plus_hgss.c | 458 +++++++++++++++-------------- 2 files changed, 240 insertions(+), 231 deletions(-) diff --git a/include/config/pokedex_plus_hgss.h b/include/config/pokedex_plus_hgss.h index 667a4bad50..15abb590f0 100644 --- a/include/config/pokedex_plus_hgss.h +++ b/include/config/pokedex_plus_hgss.h @@ -1,11 +1,12 @@ #ifndef GUARD_CONFIG_POKEDEX_PLUS_HGSS_H #define GUARD_CONFIG_POKEDEX_PLUS_HGSS_H -#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex. -#define HGSS_DECAPPED FALSE // If TRUE, uses decapped gfx and strings. -#define HGSS_DARK_MODE FALSE // If TRUE, enables dark mode. -#define HGSS_HIDE_UNSEEN_EVOLUTION_NAMES FALSE // If TRUE, hides evolution mon names. -#define HGSS_SORT_TMS_BY_NUM FALSE // If TRUE, sorts the TMS in HGSS Dex by TM number, rather than alphabetically. -#define HGSS_SHOW_EGG_MOVES_FOR_EVOS FALSE // If TRUE, shows Egg Moves for evolved Pokémon too. +#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex. +#define HGSS_DECAPPED FALSE // If TRUE, uses decapped gfx and strings. +#define HGSS_DARK_MODE FALSE // If TRUE, enables dark mode. +#define HGSS_HIDE_UNSEEN_EVOLUTION_NAMES FALSE // If TRUE, hides evolution mon names. +#define HGSS_HIDE_UNOWNED_EVOLUTION_METHODS FALSE // If TRUE, hides evolution methods. +#define HGSS_SORT_TMS_BY_NUM FALSE // If TRUE, sorts the TMS in HGSS Dex by TM number, rather than alphabetically. +#define HGSS_SHOW_EGG_MOVES_FOR_EVOS FALSE // If TRUE, shows Egg Moves for evolved Pokémon too. #endif // GUARD_CONFIG_POKEDEX_PLUS_HGSS_H diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 938fbf152b..d986ce63af 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6517,38 +6517,45 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } } - switch ((enum EvolutionMethods)evolutions[i].method) + bool32 caught = GetSetPokedexFlag(SpeciesToNationalPokedexNum(targetSpecies), FLAG_GET_CAUGHT); + if (HGSS_HIDE_UNOWNED_EVOLUTION_METHODS == TRUE && !caught) { - case EVO_SCRIPT_TRIGGER: - case EVO_NONE: StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); - break; - case EVO_LEVEL: - case EVO_LEVEL_BATTLE_ONLY: - StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); - if (evolutions[i].param > 1) + } + else + { + switch ((enum EvolutionMethods)evolutions[i].method) { - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEFT_ALIGN, EVO_SCREEN_LVL_DIGITS); //level - StringAppend(gStringVar4, gStringVar2); - } - if ((enum EvolutionMethods)evolutions[i].method == EVO_LEVEL_BATTLE_ONLY) - StringAppend(gStringVar4, COMPOUND_STRING(", in battle")); - break; - case EVO_TRADE: - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); - break; - case EVO_ITEM: - CopyItemName(evolutions[i].param, gStringVar2); - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); - break; - case EVO_SPLIT_FROM_EVO: - StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name - break; - case EVO_BATTLE_END: - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); - break; - case EVO_SPIN: + case EVO_SCRIPT_TRIGGER: + case EVO_NONE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); + break; + case EVO_LEVEL: + case EVO_LEVEL_BATTLE_ONLY: + StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); + if (evolutions[i].param > 1) + { + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEFT_ALIGN, EVO_SCREEN_LVL_DIGITS); //level + StringAppend(gStringVar4, gStringVar2); + } + if ((enum EvolutionMethods)evolutions[i].method == EVO_LEVEL_BATTLE_ONLY) + StringAppend(gStringVar4, COMPOUND_STRING(", in battle")); + break; + case EVO_TRADE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); + break; + case EVO_ITEM: + CopyItemName(evolutions[i].param, gStringVar2); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); + break; + case EVO_SPLIT_FROM_EVO: + StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name + break; + case EVO_BATTLE_END: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); + break; + case EVO_SPIN: StringCopy(gStringVar4, COMPOUND_STRING("Spin ")); if (evolutions[i].param == SPIN_CW_SHORT) StringAppend(gStringVar4, COMPOUND_STRING("CW <5s")); @@ -6560,186 +6567,186 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, COMPOUND_STRING("CCW >5s")); else StringAppend(gStringVar4, COMPOUND_STRING("CW/CCW >10s")); - break; - }//Switch end + break; + }//Switch end - // Check for additional conditions. Skips if there's no additional conditions. - for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - if (j == 0) + // Check for additional conditions. Skips if there's no additional conditions. + for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) { - StringAppend(gStringVar4, COMPOUND_STRING(", ")); - } + if (j == 0) + { + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + } - switch((enum EvolutionConditions)evolutions[i].params[j].condition) - { - // Gen 2 - case IF_GENDER: - switch(evolutions[i].params[j].arg1) + switch((enum EvolutionConditions)evolutions[i].params[j].condition) { - case MON_MALE: StringAppend(gStringVar4, COMPOUND_STRING("Male")); break; - case MON_FEMALE: StringAppend(gStringVar4, COMPOUND_STRING("Female")); break; - } - break; - case IF_MIN_FRIENDSHIP: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}friendship")); - break; - case IF_ATK_GT_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk > Def")); - break; - case IF_ATK_EQ_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk = Def")); - break; - case IF_ATK_LT_DEF: - StringAppend(gStringVar4, COMPOUND_STRING("Atk < Def")); - break; - case IF_TIME: - switch(evolutions[i].params[j].arg1) - { - case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("Morning")); break; - case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; - case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("Evening")); break; - case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Night")); break; - } - break; - case IF_NOT_TIME: - switch(evolutions[i].params[j].arg1) - { - case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Morning")); break; - case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("NOT Day")); break; - case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Evening")); break; - case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; // More intuitive than "NOT Night" - } - break; - case IF_HOLD_ITEM: - StringAppend(gStringVar4, COMPOUND_STRING("holds ")); - if (isAlcremie && IsItemSweet(evolutions[i].params[j].arg1)) - { - StringAppend(gStringVar4, COMPOUND_STRING("Sweet")); //item - } - else - { - CopyItemName(evolutions[i].params[j].arg1, gStringVar2); //item - StringAppend(gStringVar4, gStringVar2); - } - break; - // Gen 3 - case IF_PID_UPPER_MODULO_10_GT: - case IF_PID_UPPER_MODULO_10_EQ: - case IF_PID_UPPER_MODULO_10_LT: - arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT - && arg < 10 && arg >= 0) - arg = 9 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ + // Gen 2 + case IF_GENDER: + switch(evolutions[i].params[j].arg1) + { + case MON_MALE: StringAppend(gStringVar4, COMPOUND_STRING("Male")); break; + case MON_FEMALE: StringAppend(gStringVar4, COMPOUND_STRING("Female")); break; + } + break; + case IF_MIN_FRIENDSHIP: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}friendship")); + break; + case IF_ATK_GT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk > Def")); + break; + case IF_ATK_EQ_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk = Def")); + break; + case IF_ATK_LT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING("Atk < Def")); + break; + case IF_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Night")); break; + } + break; + case IF_NOT_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING("NOT Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING("NOT Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING("Day")); break; // More intuitive than "NOT Night" + } + break; + case IF_HOLD_ITEM: + StringAppend(gStringVar4, COMPOUND_STRING("holds ")); + if (isAlcremie && IsItemSweet(evolutions[i].params[j].arg1)) + { + StringAppend(gStringVar4, COMPOUND_STRING("Sweet")); //item + } + else + { + CopyItemName(evolutions[i].params[j].arg1, gStringVar2); //item + StringAppend(gStringVar4, gStringVar2); + } + break; + // Gen 3 + case IF_PID_UPPER_MODULO_10_GT: + case IF_PID_UPPER_MODULO_10_EQ: + case IF_PID_UPPER_MODULO_10_LT: + arg = evolutions[i].params[j].arg1; + if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT + && arg < 10 && arg >= 0) + arg = 9 - arg; + else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ && arg < 10 && arg >= 0) - arg = 1; - ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, COMPOUND_STRING("random %")); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_MIN_BEAUTY: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}beauty")); - break; - case IF_MIN_COOLNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}coolness")); - break; - case IF_MIN_SMARTNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}smartness")); - break; - case IF_MIN_TOUGHNESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}toughness")); - break; - case IF_MIN_CUTENESS: - StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}cuteness")); - break; - // Gen 4 - case IF_SPECIES_IN_PARTY: - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); //mon name - StringAppend(gStringVar4, COMPOUND_STRING(" in party")); - break; - case IF_IN_MAPSEC: - StringAppend(gStringVar4, COMPOUND_STRING("in ")); - StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_IN_MAP: - StringAppend(gStringVar4, COMPOUND_STRING("in ")); - GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_KNOWS_MOVE: - StringAppend(gStringVar4, COMPOUND_STRING("knows ")); - StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); - break; - // Gen 5 - case IF_TRADE_PARTNER_SPECIES: - StringAppend(gStringVar4, COMPOUND_STRING("traded with ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); - break; - // Gen 6 - case IF_TYPE_IN_PARTY: - StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); //type name - StringAppend(gStringVar4, COMPOUND_STRING("-type in party")); - break; - case IF_WEATHER: - StringAppend(gStringVar4, COMPOUND_STRING("weather ")); - StringAppend(gStringVar4, GetWeatherName(evolutions[i].params[j].arg1)); - break; - case IF_KNOWS_MOVE_TYPE: - StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, COMPOUND_STRING(" move")); - break; - // Gen 8 - case IF_NATURE: - StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" nature")); - break; - case IF_AMPED_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING("amped natures")); - break; - case IF_LOW_KEY_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING("low-Key natures")); - break; - case IF_RECOIL_DAMAGE_GE: - StringAppend(gStringVar4, COMPOUND_STRING("takes >= ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" recoil dmg")); - break; - case IF_CURRENT_DAMAGE_GE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" current dmg")); - break; - case IF_CRITICAL_HITS_GE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 2); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" critical hits")); - break; - case IF_USED_MOVE_X_TIMES: - StringAppend(gStringVar4, COMPOUND_STRING("use move ")); - StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" times")); - break; - // Gen 9 - case IF_DEFEAT_X_WITH_ITEMS: - StringAppend(gStringVar4, COMPOUND_STRING("defeat ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg3, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); - StringAppend(gStringVar4, COMPOUND_STRING(" that hold ")); - CopyItemName(evolutions[i].params[j].arg2, gStringVar2); - StringAppend(gStringVar4, gStringVar2); - break; - case IF_PID_MODULO_100_GT: - case IF_PID_MODULO_100_EQ: - case IF_PID_MODULO_100_LT: + arg = 1; + ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, COMPOUND_STRING("random %")); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_MIN_BEAUTY: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}beauty")); + break; + case IF_MIN_COOLNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}coolness")); + break; + case IF_MIN_SMARTNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}smartness")); + break; + case IF_MIN_TOUGHNESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}toughness")); + break; + case IF_MIN_CUTENESS: + StringAppend(gStringVar4, COMPOUND_STRING("{UP_ARROW_2}cuteness")); + break; + // Gen 4 + case IF_SPECIES_IN_PARTY: + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); //mon name + StringAppend(gStringVar4, COMPOUND_STRING(" in party")); + break; + case IF_IN_MAPSEC: + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_IN_MAP: + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_KNOWS_MOVE: + StringAppend(gStringVar4, COMPOUND_STRING("knows ")); + StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); + break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + StringAppend(gStringVar4, COMPOUND_STRING("traded with ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); + break; + // Gen 6 + case IF_TYPE_IN_PARTY: + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); //type name + StringAppend(gStringVar4, COMPOUND_STRING("-type in party")); + break; + case IF_WEATHER: + StringAppend(gStringVar4, COMPOUND_STRING("weather ")); + StringAppend(gStringVar4, GetWeatherName(evolutions[i].params[j].arg1)); + break; + case IF_KNOWS_MOVE_TYPE: + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, COMPOUND_STRING(" move")); + break; + // Gen 8 + case IF_NATURE: + StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" nature")); + break; + case IF_AMPED_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING("amped natures")); + break; + case IF_LOW_KEY_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING("low-Key natures")); + break; + case IF_RECOIL_DAMAGE_GE: + StringAppend(gStringVar4, COMPOUND_STRING("takes >= ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" recoil dmg")); + break; + case IF_CURRENT_DAMAGE_GE: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" current dmg")); + break; + case IF_CRITICAL_HITS_GE: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" critical hits")); + break; + case IF_USED_MOVE_X_TIMES: + StringAppend(gStringVar4, COMPOUND_STRING("use move ")); + StringAppend(gStringVar4, GetMoveName(evolutions[i].params[j].arg1)); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" times")); + break; + // Gen 9 + case IF_DEFEAT_X_WITH_ITEMS: + StringAppend(gStringVar4, COMPOUND_STRING("defeat ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg3, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); + StringAppend(gStringVar4, COMPOUND_STRING(" that hold ")); + CopyItemName(evolutions[i].params[j].arg2, gStringVar2); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_PID_MODULO_100_GT: + case IF_PID_MODULO_100_EQ: + case IF_PID_MODULO_100_LT: arg = evolutions[i].params[j].arg1; if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_GT && arg < 100 && arg >= 0) @@ -6750,28 +6757,29 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept ConvertIntToDecimalStringN(gStringVar2, arg, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(gStringVar4, COMPOUND_STRING("%")); StringAppend(gStringVar4, gStringVar2); - break; - case IF_MIN_OVERWORLD_STEPS: - StringAppend(gStringVar4, COMPOUND_STRING("after ")); - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 4); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" steps")); - break; - case IF_BAG_ITEM_COUNT: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" ")); - CopyItemNameHandlePlural(evolutions[i].params[j].arg1, gStringVar2, evolutions[i].params[j].arg2); - StringAppend(gStringVar4, gStringVar2); - StringAppend(gStringVar4, COMPOUND_STRING(" in bag")); - break; - case CONDITIONS_END: - break; - } + break; + case IF_MIN_OVERWORLD_STEPS: + StringAppend(gStringVar4, COMPOUND_STRING("after ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 4); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" steps")); + break; + case IF_BAG_ITEM_COUNT: + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + CopyItemNameHandlePlural(evolutions[i].params[j].arg1, gStringVar2, evolutions[i].params[j].arg2); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" in bag")); + break; + case CONDITIONS_END: + break; + } - if (evolutions[i].params[j+1].condition != CONDITIONS_END) - { - StringAppend(gStringVar4, COMPOUND_STRING(", ")); + if (evolutions[i].params[j+1].condition != CONDITIONS_END) + { + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + } } } From 6824e7d1754336c0f59206b94f60dfc58bdc1a2e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 25 Jun 2025 21:36:15 +0200 Subject: [PATCH 087/248] Attackcanceller clean up (#7210) --- include/battle_util.h | 23 ++-- src/battle_script_commands.c | 2 +- src/battle_util.c | 244 ++++++++++++++++++----------------- 3 files changed, 143 insertions(+), 126 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index f198857994..9b3d8a4b5a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -113,26 +113,23 @@ struct TypePower u16 effect; }; -enum +enum MoveSuccessOrder { CANCELLER_FLAGS, CANCELLER_STANCE_CHANGE_1, CANCELLER_SKY_DROP, CANCELLER_RECHARGE, - CANCELLER_ASLEEP, - CANCELLER_FROZEN, + CANCELLER_ASLEEP_OR_FROZEN, CANCELLER_OBEDIENCE, CANCELLER_TRUANT, CANCELLER_FLINCH, - CANCELLER_IN_LOVE, CANCELLER_DISABLED, - CANCELLER_HEAL_BLOCKED, - CANCELLER_GRAVITY, - CANCELLER_THROAT_CHOP, + CANCELLER_VOLATILE_BLOCKED, CANCELLER_TAUNTED, CANCELLER_IMPRISONED, CANCELLER_CONFUSED, CANCELLER_PARALYSED, + CANCELLER_INFATUATION, CANCELLER_BIDE, CANCELLER_THAW, CANCELLER_STANCE_CHANGE_2, @@ -148,7 +145,8 @@ enum CANCELLER_END, }; -enum { +enum Obedience +{ OBEYS, DISOBEYS_LOAFS, DISOBEYS_HITS_SELF, @@ -157,6 +155,13 @@ enum { DISOBEYS_RANDOM_MOVE, }; +enum MoveCanceller +{ + MOVE_STEP_SUCCESS, + MOVE_STEP_BREAK, + MOVE_STEP_REMOVES_STATUS, +}; + extern const struct TypePower gNaturalGiftTable[]; struct DamageContext @@ -241,7 +246,7 @@ bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck); u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -u32 AtkCanceller_MoveSuccessOrder(void); +enum MoveCanceller AtkCanceller_MoveSuccessOrder(void); void SetAtkCancellerForCalledMove(void); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 240ed0367b..7bc8d0664c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1222,7 +1222,7 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } - if (AtkCanceller_MoveSuccessOrder()) + if (AtkCanceller_MoveSuccessOrder() != MOVE_STEP_SUCCESS) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF diff --git a/src/battle_util.c b/src/battle_util.c index 1580e2addc..903f6ab3b9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -58,7 +58,6 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle functions instead of at the top of the file with the other declarations. */ -typedef void (*MoveSuccessOrderCancellers)(u32 *effect); static bool32 TryRemoveScreens(u32 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler); static u32 GetFlingPowerFromItemId(u32 itemId); @@ -1885,35 +1884,38 @@ static inline bool32 TryActivatePowderStatus(u32 move) void SetAtkCancellerForCalledMove(void) { - gBattleStruct->atkCancellerTracker = CANCELLER_HEAL_BLOCKED; + gBattleStruct->atkCancellerTracker = CANCELLER_VOLATILE_BLOCKED; gBattleStruct->isAtkCancelerForCalledMove = TRUE; } -static void CancellerFlags(u32 *effect) +static enum MoveCanceller CancellerFlags(void) { gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; + return MOVE_STEP_SUCCESS; } -static void CancellerStanceChangeOne(u32 *effect) +static enum MoveCanceller CancellerStanceChangeOne(void) { if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove()) - *effect = 1; + return MOVE_STEP_BREAK; + return MOVE_STEP_SUCCESS; } -static void CancellerSkyDrop(u32 *effect) +static enum MoveCanceller CancellerSkyDrop(void) { // If Pokemon is being held in Sky Drop if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) { gBattlescriptCurrInstr = BattleScript_MoveEnd; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerRecharge(u32 *effect) +static enum MoveCanceller CancellerRecharge(void) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { @@ -1922,11 +1924,12 @@ static void CancellerRecharge(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerAsleep(u32 *effect) +static enum MoveCanceller CancellerAsleepOrFrozen(void) { if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { @@ -1937,7 +1940,7 @@ static void CancellerAsleep(u32 *effect) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; BattleScriptCall(BattleScript_MoveUsedWokeUp); - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } else { @@ -1958,7 +1961,7 @@ static void CancellerAsleep(u32 *effect) gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } } else @@ -1967,15 +1970,11 @@ static void CancellerAsleep(u32 *effect) gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; BattleScriptCall(BattleScript_MoveUsedWokeUp); - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } } } -} - -static void CancellerFrozen(u32 *effect) -{ - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !MoveThawsUser(gCurrentMove)) + else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !MoveThawsUser(gCurrentMove)) { if (!RandomPercentage(RNG_FROZEN, 20)) { @@ -1989,19 +1988,22 @@ static void CancellerFrozen(u32 *effect) BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } + return MOVE_STEP_SUCCESS; } -static void CancellerObedience(u32 *effect) +static enum MoveCanceller CancellerObedience(void) { - u32 obedienceResult = GetAttackerObedienceForAction(); - if (obedienceResult != OBEYS - && !(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + enum Obedience obedienceResult = GetAttackerObedienceForAction(); + if (!(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves + && !gBattleMons[gBattlerAttacker].volatiles.multipleTurns) { switch (obedienceResult) { + case OBEYS: + gHitMarker |= HITMARKER_OBEYS; + break; case DISOBEYS_LOAFS: // Randomly select, then print a disobedient string // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE @@ -2042,15 +2044,13 @@ static void CancellerObedience(u32 *effect) gHitMarker |= HITMARKER_OBEYS; break; } - *effect = 1; - } - else - { - gHitMarker |= HITMARKER_OBEYS; + return MOVE_STEP_BREAK; } + gHitMarker |= HITMARKER_OBEYS; + return MOVE_STEP_SUCCESS; } -static void CancellerTruant(u32 *effect) +static enum MoveCanceller CancellerTruant(void) { if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { @@ -2060,11 +2060,12 @@ static void CancellerTruant(u32 *effect) gBattlerAbility = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerFlinch(u32 *effect) +static enum MoveCanceller CancellerFlinch(void) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { @@ -2072,32 +2073,12 @@ static void CancellerFlinch(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerInLove(u32 *effect) -{ - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) - { - gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); - if (!RandomPercentage(RNG_INFATUATION, 50)) - { - BattleScriptCall(BattleScript_MoveUsedIsInLove); - } - else - { - BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; - } - *effect = 1; - } -} - -static void CancellerDisabled(u32 *effect) +static enum MoveCanceller CancellerDisabled(void) { if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) { @@ -2106,11 +2087,12 @@ static void CancellerDisabled(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerHealBlocked(u32 *effect) +static enum MoveCanceller CancellerVolatileBlocked(void) { if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) { @@ -2119,36 +2101,29 @@ static void CancellerHealBlocked(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } -} - -static void CancellerGravity(u32 *effect) -{ - if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) { gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; gBattleScripting.battler = gBattlerAttacker; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } -} - -static void CancellerThroatChop(u32 *effect) -{ - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) + else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) { gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerTaunted(u32 *effect) +static enum MoveCanceller CancellerTaunted(void) { if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].tauntTimer && IsBattleMoveStatus(gCurrentMove)) { @@ -2156,11 +2131,12 @@ static void CancellerTaunted(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerImprisoned(u32 *effect) +static enum MoveCanceller CancellerImprisoned(void) { if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { @@ -2168,14 +2144,15 @@ static void CancellerImprisoned(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerConfused(u32 *effect) +static enum MoveCanceller CancellerConfused(void) { if (gBattleStruct->isAtkCancelerForCalledMove) - return; + return MOVE_STEP_SUCCESS; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { @@ -2211,11 +2188,12 @@ static void CancellerConfused(u32 *effect) { BattleScriptCall(BattleScript_MoveUsedIsConfusedNoMore); } - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerParalysed(u32 *effect) +static enum MoveCanceller CancellerParalysed(void) { if (!gBattleStruct->isAtkCancelerForCalledMove && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) @@ -2227,11 +2205,34 @@ static void CancellerParalysed(u32 *effect) //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerBide(u32 *effect) +static enum MoveCanceller CancellerInfatuation(void) +{ + if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + { + gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); + if (!RandomPercentage(RNG_INFATUATION, 50)) + { + BattleScriptCall(BattleScript_MoveUsedIsInLove); + } + else + { + BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; + } + return MOVE_STEP_BREAK; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceller CancellerBide(void) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { @@ -2257,11 +2258,12 @@ static void CancellerBide(u32 *effect) gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; } } - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerThaw(u32 *effect) +static enum MoveCanceller CancellerThaw(void) { if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { @@ -2271,7 +2273,7 @@ static void CancellerThaw(u32 *effect) BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && MoveThawsUser(gCurrentMove)) { @@ -2281,32 +2283,35 @@ static void CancellerThaw(u32 *effect) BattleScriptCall(BattleScript_MoveUsedUnfrostbite); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; } - *effect = 2; + return MOVE_STEP_REMOVES_STATUS; } + return MOVE_STEP_SUCCESS; } -static void CancellerStanceChangeTwo(u32 *effect) +static enum MoveCanceller CancellerStanceChangeTwo(void) { if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove()) - *effect = 1; + return MOVE_STEP_BREAK; + return MOVE_STEP_SUCCESS; } -static void CancellerWeatherPrimal(u32 *effect) +static enum MoveCanceller CancellerWeatherPrimal(void) { + enum MoveCanceller effect = MOVE_STEP_SUCCESS; if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) { u32 moveType = GetBattleMoveType(gCurrentMove); if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; - *effect = 1; + effect = MOVE_STEP_BREAK; } else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; - *effect = 1; + effect = MOVE_STEP_BREAK; } - if (*effect == 1) + if (effect == MOVE_STEP_BREAK) { gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; @@ -2315,19 +2320,21 @@ static void CancellerWeatherPrimal(u32 *effect) BattleScriptCall(BattleScript_PrimalWeatherBlocksMove); } } + return effect; } -static void CancellerDynamaxBlocked(u32 *effect) +static enum MoveCanceller CancellerDynamaxBlocked(void) { if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; BattleScriptCall(BattleScript_MoveBlockedByDynamax); - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerPowderStatus(u32 *effect) +static enum MoveCanceller CancellerPowderStatus(void) { if (TryActivatePowderStatus(gCurrentMove)) { @@ -2339,11 +2346,12 @@ static void CancellerPowderStatus(u32 *effect) || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerProtean(u32 *effect) +static enum MoveCanceller CancellerProtean(void) { u32 moveType = GetBattleMoveType(gCurrentMove); if (ProteanTryChangeType(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, moveType)) @@ -2355,11 +2363,12 @@ static void CancellerProtean(u32 *effect) PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; BattleScriptCall(BattleScript_ProteanActivates); - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerPsychicTerrain(u32 *effect) +static enum MoveCanceller CancellerPsychicTerrain(void) { if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && IsBattlerGrounded(gBattlerTarget) @@ -2371,11 +2380,12 @@ static void CancellerPsychicTerrain(u32 *effect) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerExplodingDamp(u32 *effect) +static enum MoveCanceller CancellerExplodingDamp(void) { u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); if (dampBattler && IsMoveDampBanned(gCurrentMove)) @@ -2383,11 +2393,12 @@ static void CancellerExplodingDamp(u32 *effect) gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - *effect = 1; + return MOVE_STEP_BREAK; } + return MOVE_STEP_SUCCESS; } -static void CancellerMultihitMoves(u32 *effect) +static enum MoveCanceller CancellerMultihitMoves(void) { if (GetMoveEffect(gCurrentMove) == EFFECT_MULTI_HIT) { @@ -2450,9 +2461,11 @@ static void CancellerMultihitMoves(u32 *effect) { gMultiHitCounter = 0; } + + return MOVE_STEP_SUCCESS; } -static void CancellerZMoves(u32 *effect) +static enum MoveCanceller CancellerZMoves(void) { if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) { @@ -2479,11 +2492,12 @@ static void CancellerZMoves(u32 *effect) if (!alreadyUsed) BattleScriptCall(BattleScript_ZMoveActivateDamaging); } - *effect = 1; + return MOVE_STEP_BREAK; // The original move is cancelled, not the z move } + return MOVE_STEP_SUCCESS; } -static void CancellerMultiTargetMoves(u32 *effect) +static enum MoveCanceller CancellerMultiTargetMoves(void) { u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); @@ -2526,24 +2540,22 @@ static void CancellerMultiTargetMoves(u32 *effect) else gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker); } + return MOVE_STEP_SUCCESS; } -static const MoveSuccessOrderCancellers sMoveSuccessOrderCancellers[] = +static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = { [CANCELLER_FLAGS] = CancellerFlags, [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, [CANCELLER_SKY_DROP] = CancellerSkyDrop, [CANCELLER_RECHARGE] = CancellerRecharge, - [CANCELLER_ASLEEP] = CancellerAsleep, - [CANCELLER_FROZEN] = CancellerFrozen, + [CANCELLER_ASLEEP_OR_FROZEN] = CancellerAsleepOrFrozen, [CANCELLER_OBEDIENCE] = CancellerObedience, [CANCELLER_TRUANT] = CancellerTruant, [CANCELLER_FLINCH] = CancellerFlinch, - [CANCELLER_IN_LOVE] = CancellerInLove, + [CANCELLER_INFATUATION] = CancellerInfatuation, [CANCELLER_DISABLED] = CancellerDisabled, - [CANCELLER_HEAL_BLOCKED] = CancellerHealBlocked, - [CANCELLER_GRAVITY] = CancellerGravity, - [CANCELLER_THROAT_CHOP] = CancellerThroatChop, + [CANCELLER_VOLATILE_BLOCKED] = CancellerVolatileBlocked, [CANCELLER_TAUNTED] = CancellerTaunted, [CANCELLER_IMPRISONED] = CancellerImprisoned, [CANCELLER_CONFUSED] = CancellerConfused, @@ -2562,17 +2574,17 @@ static const MoveSuccessOrderCancellers sMoveSuccessOrderCancellers[] = [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, }; -u32 AtkCanceller_MoveSuccessOrder(void) +enum MoveCanceller AtkCanceller_MoveSuccessOrder(void) { - u32 effect = 0; + enum MoveCanceller effect = MOVE_STEP_SUCCESS; - while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == 0) + while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == MOVE_STEP_SUCCESS) { - sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](&effect); + effect = sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](); gBattleStruct->atkCancellerTracker++; } - if (effect == 2) + if (effect == MOVE_STEP_REMOVES_STATUS) { BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); MarkBattlerForControllerExec(gBattlerAttacker); From 6f7dac6d11f25bbfccaa01bf39ba59677a10d1d2 Mon Sep 17 00:00:00 2001 From: Raymond Dodge Date: Wed, 25 Jun 2025 16:11:43 -0400 Subject: [PATCH 088/248] Add 'Give Decoration' function to overworld debug menu (#7219) Co-authored-by: hedara90 <90hedara@gmail.com> --- src/debug.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/debug.c b/src/debug.c index bc2b56aec1..8e6bada962 100644 --- a/src/debug.c +++ b/src/debug.c @@ -17,6 +17,8 @@ #include "data.h" #include "daycare.h" #include "debug.h" +#include "decoration.h" +#include "decoration_inventory.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -59,6 +61,7 @@ #include "constants/battle_ai.h" #include "constants/battle_frontier.h" #include "constants/coins.h" +#include "constants/decorations.h" #include "constants/event_objects.h" #include "constants/expansion.h" #include "constants/flags.h" @@ -313,6 +316,8 @@ static void DebugAction_Give_Pokemon_SelectIVs(u8 taskId); static void DebugAction_Give_Pokemon_SelectEVs(u8 taskId); static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId); static void DebugAction_Give_Pokemon_Move(u8 taskId); +static void DebugAction_Give_Decoration(u8 taskId); +static void DebugAction_Give_Decoration_SelectId(u8 taskId); static void DebugAction_Give_MaxMoney(u8 taskId); static void DebugAction_Give_MaxCoins(u8 taskId); static void DebugAction_Give_MaxBattlePoints(u8 taskId); @@ -580,6 +585,7 @@ static const struct DebugMenuOption sDebugMenu_Actions_Give[] = { COMPOUND_STRING("Give item XYZ…"), DebugAction_Give_Item }, { COMPOUND_STRING("Pokémon (Basic)"), DebugAction_Give_PokemonSimple }, { COMPOUND_STRING("Pokémon (Complex)"), DebugAction_Give_PokemonComplex }, + { COMPOUND_STRING("Give Decoration…"), DebugAction_Give_Decoration }, { COMPOUND_STRING("Max Money"), DebugAction_Give_MaxMoney }, { COMPOUND_STRING("Max Coins"), DebugAction_Give_MaxCoins }, { COMPOUND_STRING("Max Battle Points"), DebugAction_Give_MaxBattlePoints }, @@ -2984,6 +2990,82 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu #undef tSpriteId #undef tIterator +//Decoration +#define tSpriteId data[6] + +static void Debug_Display_DecorationInfo(u32 itemId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + u8* end = StringCopy(gStringVar1, gDecorations[itemId].name); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Decor ID: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + +static void DebugAction_Give_Decoration(u8 taskId) +{ + u8 windowId; + + ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); + RemoveWindow(gTasks[taskId].tWindowId); + + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); + DrawStdWindowFrame(windowId, FALSE); + + CopyWindowToVram(windowId, COPYWIN_FULL); + + // Display initial decoration + Debug_Display_DecorationInfo(1, 0, windowId); + + gTasks[taskId].func = DebugAction_Give_Decoration_SelectId; + gTasks[taskId].tSubWindowId = windowId; + gTasks[taskId].tInput = 1; + gTasks[taskId].tDigit = 0; + gTasks[taskId].tSpriteId = AddDecorationIconObject(gTasks[taskId].tInput, DEBUG_NUMBER_ICON_X+8, DEBUG_NUMBER_ICON_Y+10, 0, ITEM_TAG, ITEM_TAG); +} + +static void DestroyDecorationIcon(u8 taskId) +{ + FreeSpriteTilesByTag(ITEM_TAG); + FreeSpritePaletteByTag(ITEM_TAG); + FreeSpriteOamMatrix(&gSprites[gTasks[taskId].tSpriteId]); + DestroySprite(&gSprites[gTasks[taskId].tSpriteId]); +} + +static void DebugAction_Give_Decoration_SelectId(u8 taskId) +{ + if (JOY_NEW(DPAD_ANY)) + { + PlaySE(SE_SELECT); + Debug_HandleInput_Numeric(taskId, 1, NUM_DECORATIONS, DEBUG_NUMBER_DIGITS_ITEMS); + Debug_Display_DecorationInfo(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); + DestroyDecorationIcon(taskId); + gTasks[taskId].tSpriteId = AddDecorationIconObject(gTasks[taskId].tInput, DEBUG_NUMBER_ICON_X+8, DEBUG_NUMBER_ICON_Y+10, 0, ITEM_TAG, ITEM_TAG); + } + + if (JOY_NEW(A_BUTTON)) + { + DestroyItemIcon(taskId); + + PlaySE(MUS_LEVEL_UP); + DecorationAdd(gTasks[taskId].tInput); + DebugAction_DestroyExtraWindow(taskId); + } + else if (JOY_NEW(B_BUTTON)) + { + DestroyDecorationIcon(taskId); + + PlaySE(SE_SELECT); + DebugAction_DestroyExtraWindow(taskId); + } +} + +#undef tSpriteId + static void DebugAction_Give_MaxMoney(u8 taskId) { SetMoney(&gSaveBlock1Ptr->money, MAX_MONEY); From a82aa618fb77a5244ce4b54f02bc17e46dbf40ef Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Thu, 26 Jun 2025 13:42:32 +0100 Subject: [PATCH 089/248] Adds Ability Shield activation message (#7224) --- asm/macros/battle_script.inc | 5 +++ data/battle_scripts_1.s | 32 +++++++++----- include/battle_scripts.h | 2 + include/battle_util.h | 3 +- include/constants/battle_string_ids.h | 1 + src/battle_message.c | 1 + src/battle_script_commands.c | 26 +++++++++++- src/battle_util.c | 17 +++++--- test/battle/hold_effect/ability_shield.c | 54 +++++++++++++++++++----- 9 files changed, 111 insertions(+), 30 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 11cca995c0..7c6cef0a45 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2461,6 +2461,11 @@ .4byte \jumpInstr .endm + .macro tryactivateabilityshield battler:req + callnative BS_TryActivateAbilityShield + .byte \battler + .endm + .macro setallytonexttarget jumpInstr:req jumpifbyte CMP_GREATER_THAN, gBattlerTarget, 0x1, 1f addbyte gBattlerTarget, 0x2 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0a908236f6..fc18ab1e76 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7176,9 +7176,20 @@ BattleScript_AbilityCantRaiseDefenderStat:: restoreattacker return +BattleScript_AbilityShieldProtects:: + saveattacker + copybyte gBattlerAttacker, gBattlerAbility + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT + waitanimation + printstring STRINGID_ABILITYSHIELDPROTECTS + waitmessage B_WAIT_TIME_LONG + restoreattacker + return + BattleScript_AbilityPopUpTarget:: copybyte gBattlerAbility, gBattlerTarget BattleScript_AbilityPopUp:: + tryactivateabilityshield BS_ABILITY_BATTLER .if B_ABILITY_POP_UP == TRUE showabilitypopup BS_ABILITY_BATTLER pause 40 @@ -7428,14 +7439,10 @@ BattleScript_TryIntimidateHoldEffectsRet: BattleScript_IntimidateActivates:: savetarget -.if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ATTACKER - pause B_WAIT_TIME_LONG + call BattleScript_AbilityPopUp destroyabilitypopup -.endif setbyte gBattlerTarget, 0 BattleScript_IntimidateLoop: - jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_IntimidateLoopIncrement jumpiftargetally BattleScript_IntimidateLoopIncrement jumpifabsent BS_TARGET, BattleScript_IntimidateLoopIncrement jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_IntimidateLoopIncrement @@ -7488,16 +7495,12 @@ BattleScript_IntimidateInReverse:: BattleScript_SupersweetSyrupActivates:: savetarget -.if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ATTACKER - pause B_WAIT_TIME_LONG + call BattleScript_AbilityPopUp destroyabilitypopup -.endif printstring STRINGID_SUPERSWEETAROMAWAFTS waitmessage B_WAIT_TIME_LONG setbyte gBattlerTarget, 0 BattleScript_SupersweetSyrupLoop: - jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_SupersweetSyrupLoopIncrement jumpiftargetally BattleScript_SupersweetSyrupLoopIncrement jumpifabsent BS_TARGET, BattleScript_SupersweetSyrupLoopIncrement jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_SupersweetSyrupLoopIncrement @@ -7510,8 +7513,12 @@ BattleScript_SupersweetSyrupEffect: printfromtable gStatDownStringIds BattleScript_SupersweetSyrupEffect_WaitString: waitmessage B_WAIT_TIME_LONG + saveattacker + savetarget copybyte sBATTLER, gBattlerTarget call BattleScript_TryIntimidateHoldEffects + restoreattacker + restoretarget BattleScript_SupersweetSyrupLoopIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_SupersweetSyrupLoop @@ -7977,6 +7984,11 @@ BattleScript_ProteanActivates:: waitmessage B_WAIT_TIME_LONG return +BattleScript_AbilityAvoidsDamage:: + call BattleScript_AbilityPopUp + printfromtable gMissStringIds @ waitmessage is executed next so no waitmessage here + return + BattleScript_TeraShellDistortingTypeMatchups:: pause B_WAIT_TIME_SHORTEST call BattleScript_AbilityPopUpScripting diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 80d6693bd5..379e45cd39 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -243,6 +243,8 @@ extern const u8 BattleScript_ConsumableStatRaiseRet[]; extern const u8 BattleScript_BerryFocusEnergyRet[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; +extern const u8 BattleScript_AbilityAvoidsDamage[]; +extern const u8 BattleScript_AbilityShieldProtects[]; extern const u8 BattleScript_ArenaTurnBeginning[]; extern const u8 BattleScript_PalacePrintFlavorText[]; extern const u8 BattleScript_ArenaDoJudgment[]; diff --git a/include/battle_util.h b/include/battle_util.h index 9b3d8a4b5a..5e86fc615a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -257,7 +257,8 @@ bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability); u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler); -u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker); +u32 GetBattlerAbilityNoAbilityShield(u32 battler); +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield); u32 GetBattlerAbility(u32 battler); u32 IsAbilityOnSide(u32 battler, u32 ability); u32 IsAbilityOnOpposingSide(u32 battler, u32 ability); diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 57b56d4cbe..57cf6f7021 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -738,6 +738,7 @@ enum StringID STRINGID_TOXICSPIKESBADLYPOISONED, STRINGID_POWERCONSTRUCTPRESENCEOFMANY, STRINGID_POWERCONSTRUCTTRANSFORM, + STRINGID_ABILITYSHIELDPROTECTS, STRINGID_COUNT }; diff --git a/src/battle_message.c b/src/battle_message.c index 35d8b23083..eb44ca96ee 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -897,6 +897,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_QUESTIONFORFEITBATTLE] = COMPOUND_STRING("Would you like to give up on this battle and quit now? Quitting the battle is the same as losing the battle."), [STRINGID_POWERCONSTRUCTPRESENCEOFMANY] = COMPOUND_STRING("You sense the presence of many!"), [STRINGID_POWERCONSTRUCTTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into its Complete Forme!"), + [STRINGID_ABILITYSHIELDPROTECTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s Ability is protected by the effects of its {B_LAST_ITEM}!"), }; const u16 gTrainerUsedItemStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7bc8d0664c..2298c20be4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2879,8 +2879,15 @@ static void Cmd_resultmessage(void) return; } - if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up - CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, IsDoubleBattle()); + if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate + { + gBattlerAbility = gBattlerTarget; + gBattleCommunication[MULTISTRING_CHOOSER] = gBattleStruct->missStringId[gBattlerTarget]; + gBattlescriptCurrInstr = cmd->nextInstr; + BattleScriptCall(BattleScript_AbilityAvoidsDamage); + return; + } + gBattleCommunication[MSG_DISPLAY] = 1; stringId = gMissStringIds[gBattleStruct->missStringId[gBattlerTarget]]; } @@ -18601,3 +18608,18 @@ void BS_JumpIfAbilityCantBeSuppressed(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_TryActivateAbilityShield(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + gBattlescriptCurrInstr = cmd->nextInstr; + + if (GetBattlerAbilityNoAbilityShield(battler) != GetBattlerAbility(battler)) + { + gLastUsedItem = gBattleMons[battler].item; + RecordItemEffectBattle(battler, GetItemHoldEffect(gLastUsedItem)); + BattleScriptCall(BattleScript_AbilityShieldProtects); + } +} diff --git a/src/battle_util.c b/src/battle_util.c index 903f6ab3b9..30ee3b5541 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3878,7 +3878,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_INTIMIDATE: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerAttacker = battler; + gBattlerAbility = gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, TRUE); BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivates); @@ -3889,7 +3889,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup) { - gBattlerAttacker = battler; + gBattlerAbility = gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates); @@ -5415,19 +5415,24 @@ static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 && gCurrentTurnActionNumber < gBattlersCount); } +u32 GetBattlerAbilityNoAbilityShield(u32 battler) +{ + return GetBattlerAbilityInternal(battler, FALSE, TRUE); +} + u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler) { - return GetBattlerAbilityInternal(battler, TRUE); + return GetBattlerAbilityInternal(battler, TRUE, FALSE); } u32 GetBattlerAbility(u32 battler) { - return GetBattlerAbilityInternal(battler, FALSE); + return GetBattlerAbilityInternal(battler, FALSE, FALSE); } -u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker) +u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield) { - bool32 hasAbilityShield = GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; + bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; if (abilityCantBeSuppressed) diff --git a/test/battle/hold_effect/ability_shield.c b/test/battle/hold_effect/ability_shield.c index 3159d0d8a4..ded39ff05b 100644 --- a/test/battle/hold_effect/ability_shield.c +++ b/test/battle/hold_effect/ability_shield.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gItemsInfo[ITEM_ABILITY_SHIELD].holdEffect == HOLD_EFFECT_ABILITY_SHIELD); } -SINGLE_BATTLE_TEST("Ability Shield prevents Neutralizing Gas") +SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") { u32 item; @@ -22,12 +22,14 @@ SINGLE_BATTLE_TEST("Ability Shield prevents Neutralizing Gas") ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); if (item == ITEM_ABILITY_SHIELD) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Torkoal's Ability is protected by the effects of its Ability Shield!"); ABILITY_POPUP(player, ABILITY_DROUGHT); - MESSAGE("Torkoal's Drought intensified the sun's rays!"); } else { NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Torkoal's Ability is protected by the effects of its Ability Shield!"); ABILITY_POPUP(player, ABILITY_DROUGHT); - MESSAGE("Torkoal's Drought intensified the sun's rays!"); } } } @@ -41,17 +43,18 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker") PARAMETRIZE { item = ITEM_NONE; } GIVEN { - PLAYER(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); Item(item); } - OPPONENT(SPECIES_TINKATON) { Ability(ABILITY_MOLD_BREAKER); } + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + PLAYER(SPECIES_FLYGON) { Ability(ABILITY_LEVITATE); Item(item); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ABILITY_MOLD_BREAKER); } } WHEN { - TURN { MOVE(opponent, MOVE_GIGATON_HAMMER); } + TURN { MOVE(opponent, MOVE_EARTHQUAKE); } } SCENE { if (item == ITEM_ABILITY_SHIELD) { - NONE_OF { - MESSAGE("Shedinja fainted!"); - } + ABILITY_POPUP(player, ABILITY_LEVITATE); + NOT HP_BAR(player); } else { - MESSAGE("Shedinja fainted!"); + NOT ABILITY_POPUP(player, ABILITY_LEVITATE); + HP_BAR(player); } } } @@ -64,10 +67,12 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") PARAMETRIZE { item = ITEM_NONE; } GIVEN { + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_VIGOROTH) { Ability(ABILITY_VITAL_SPIRIT); Item(item); } OPPONENT(SPECIES_TOEDSCOOL) { Ability(ABILITY_MYCELIUM_MIGHT); } } WHEN { - TURN { MOVE(opponent, MOVE_SPORE); MOVE(player, MOVE_SPORE); } + TURN { MOVE(opponent, MOVE_SPORE); } } SCENE { if (item == ITEM_ABILITY_SHIELD) { @@ -90,6 +95,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") PARAMETRIZE { item = ITEM_NONE; } GIVEN { + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); PLAYER(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -104,3 +110,29 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") } } } + +SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + } + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + } + } +} From 8e7274f3fc8800935e11a4f960adc91666f46753 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 26 Jun 2025 15:53:14 +0200 Subject: [PATCH 090/248] lto support (#7182) --- .github/workflows/build.yml | 6 +++ Makefile | 35 ++++++++++++---- ld_script_modern.ld | 79 ++++++------------------------------- src/dodrio_berry_picking.c | 3 ++ src/strings.c | 4 +- 5 files changed, 49 insertions(+), 78 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30231dbd0f..8620999045 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,6 +31,12 @@ jobs: env: COMPARE: 0 run: make -j${nproc} -O all + + - name: LTO + run: | + make tidy + make -j${nproc} LTO=1 + # make tidy to purge previous build - name: Test env: diff --git a/Makefile b/Makefile index 735bd25454..ebf7679af3 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,8 @@ ANALYZE ?= 0 UNUSED_ERROR ?= 0 # Adds -Og and -g flags, which optimize the build for debugging and include debug info respectively DEBUG ?= 0 +# Adds -flto flag, which increases link time but results in a more efficient binary (especially in audio processing) +LTO ?= 0 ifeq (compare,$(MAKECMDGOALS)) COMPARE := 1 @@ -106,7 +108,7 @@ TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR) SHELL := bash -o pipefail # Set flags for tools -ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=1 +ASFLAGS := -mcpu=arm7tdmi -march=armv4t -meabi=5 --defsym MODERN=1 INCLUDE_DIRS := include INCLUDE_CPP_ARGS := $(INCLUDE_DIRS:%=-iquote %) @@ -121,7 +123,15 @@ CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) -std ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet + override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init + +ifneq ($(LTO),0) + ifneq ($(TEST),1) + override CFLAGS += -flto=auto -fno-fat-lto-objects -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections + endif +endif + ifeq ($(ANALYZE),1) override CFLAGS += -fanalyzer endif @@ -283,7 +293,7 @@ agbcc: LD_SCRIPT_TEST := ld_script_test.ld -$(OBJ_DIR)/ld_script_test.ld: $(LD_SCRIPT_TEST) $(LD_SCRIPT_DEPS) +$(OBJ_DIR)/ld_script_test.ld: $(LD_SCRIPT_TEST) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT_TEST) > ld_script_test.ld $(TESTELF): $(OBJ_DIR)/ld_script_test.ld $(OBJS) $(TEST_OBJS) libagbsyscall tools check-tools @@ -476,19 +486,28 @@ $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) # Linker script LD_SCRIPT := ld_script_modern.ld -LD_SCRIPT_DEPS := # Final rules libagbsyscall: @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1 -# Elf from object files -LDFLAGS = -Map ../../$(MAP) -$(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) libagbsyscall - @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat - @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ | cat" +# Enable LTO LDFLAGS if set +ifneq ($(LTO),0) +LDFLAGS := -march=armv4t -mabi=apcs-gnu -mcpu=arm7tdmi -Xlinker -Map=../../$(MAP) -Xlinker --print-memory-usage -Xassembler -meabi=5 -Xassembler -march=armv4t -Xassembler -mcpu=arm7tdmi -Xlinker --gc-sections +LDFLAGS += -Xlinker -flto=auto +$(ELF): $(LD_SCRIPT) $(OBJS) libagbsyscall + @echo "cd $(OBJ_DIR) && $(ARMCC) $(LDFLAGS) -T ../../$< -o ../../$@ " + +@cd $(OBJ_DIR) && $(ARMCC) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent +else +# Output .map file, memory usage readout and gc sections to clean-up unused data +LDFLAGS = -Map ../../$(MAP) --print-memory-usage --gc-sections +$(ELF): $(LD_SCRIPT) $(OBJS) libagbsyscall + @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ $(OBJS_REL) $(LIB) | cat + @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< -o ../../$@ | cat" + $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent +endif # Builds the rom from the elf file $(ROM): $(ELF) diff --git a/ld_script_modern.ld b/ld_script_modern.ld index ee4713ab17..f021ac2916 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -26,7 +26,7 @@ SECTIONS { .ewram.sbss (NOLOAD) : ALIGN(4) { - src/*.o(.sbss); + *.o(.sbss); } > EWRAM .iwram ORIGIN(IWRAM) : AT (__iwram_lma) @@ -41,14 +41,8 @@ SECTIONS { .iwram.bss (NOLOAD) : ALIGN(4) { - src/*.o(.bss); - data/*.o(.bss); - *libc.a:*.o(.bss*); - *libnosys.a:*.o(.bss*); - - src/m4a.o(.bss.code); - - src/*.o(common_data); + *.o(.bss*); + *.o(common_data); src/*.o(COMMON); *libc.a:*.o(COMMON); *libnosys.a:*.o(COMMON); @@ -63,9 +57,13 @@ SECTIONS { src/rom_header_gf.o(.text.*); src/rom_header_rhh.o(.text.*); src/crt0.o(.text); - src/main.o(.text); - src/*.o(.text*); + *libagbsyscall.a:*.o(.text*); + *libgcc.a:*.o(.text*); + *libc.a:*.o(.text*); + *libnosys.a:*.o(.text*); asm/*.o(.text*); + *.o(.text*); + *.o(.eh_frame); } > ROM =0 script_data : @@ -74,69 +72,14 @@ SECTIONS { data/*.o(script_data); } > ROM =0 - lib_text : - ALIGN(4) - { - src/libgcnmultiboot.o(.text); - src/m4a_1.o(.text); - src/m4a.o(.text); - src/agb_flash.o(.text); - src/agb_flash_1m.o(.text); - src/agb_flash_mx.o(.text); - src/siirtc.o(.text); - src/librfu_stwi.o(.text); - src/librfu_intr.o(.text); - src/librfu_rfu.o(.text); - src/librfu_sio32id.o(.text); - *libagbsyscall.a:*.o(.text*); - *libgcc.a:*.o(.text*); - *libc.a:*.o(.text*); - *libnosys.a:*.o(.text*); - src/libisagbprn.o(.text); - } > ROM =0 - .rodata : ALIGN(4) { - src/*.o(.rodata*); - data/*.o(.rodata*); - } > ROM =0 - - song_data : - ALIGN(4) - { - sound/songs/*.o(.rodata); - } > ROM =0 - - lib_rodata : - SUBALIGN(4) - { - src/m4a.o(.rodata); - src/agb_flash.o(.rodata); - src/agb_flash_1m.o(.rodata); - src/agb_flash_mx.o(.rodata); - src/agb_flash_le.o(.rodata); - src/siirtc.o(.rodata); - src/librfu_rfu.o(.rodata); - src/librfu_sio32id.o(.rodata); + *.o(.rodata*); *libgcc.a:*.o(.rodata*); *libc.a:*.o(.rodata*); *libc.a:*.o(.data*); - src/libisagbprn.o(.rodata); - } > ROM =0 - - multiboot_data : - ALIGN(4) - { - data/multiboot_ereader.o(.rodata); - data/multiboot_berry_glitch_fix.o(.rodata); - data/multiboot_pokemon_colosseum.o(.rodata); - } > ROM =0 - - gfx_data : - ALIGN(4) - { - src/graphics.o(.rodata); + sound/songs/*.o(.rodata); } > ROM =0 .data.iwram : diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 8f29f498f0..2593719022 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -3099,6 +3099,7 @@ struct ReadyToStartPacket { u8 id; bool8 ALIGNED(4) ready; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_ReadyToStart(bool32 ready) @@ -3303,6 +3304,7 @@ struct PickStatePacket { u8 id; u8 ALIGNED(4) pickState; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_PickState(u8 pickState) @@ -3334,6 +3336,7 @@ struct ReadyToEndPacket { u8 id; bool32 ready; + u32 unused; // Put here, so that packet has the same size as gRfu.packet(12 bytes). }; static void SendPacket_ReadyToEnd(bool32 ready) diff --git a/src/strings.c b/src/strings.c index 314d7536dc..4846bea8ed 100644 --- a/src/strings.c +++ b/src/strings.c @@ -18,8 +18,8 @@ const u8 gText_ExpandedPlaceholder_Kyogre[] = _("KYOGRE"); const u8 gText_ExpandedPlaceholder_Groudon[] = _("GROUDON"); const u8 gText_ExpandedPlaceholder_Brendan[] = _("BRENDAN"); const u8 gText_ExpandedPlaceholder_May[] = _("MAY"); -const u8 gText_EggNickname[] = _("EGG"); -const u8 gText_Pokemon[] = _("POKéMON"); +const u8 gText_EggNickname[POKEMON_NAME_LENGTH + 1] = _("EGG"); +const u8 gText_Pokemon[POKEMON_NAME_LENGTH + 1] = _("POKéMON"); const u8 gText_Player[] = _("PLAYER"); // Unused const u8 gText_Pokedex[] = _("POKéDEX"); // Unused const u8 gText_Time[] = _("TIME"); From ed59b2fb0e06867fbc6a14207203282f39ec6008 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 26 Jun 2025 16:08:12 +0200 Subject: [PATCH 091/248] Remove redundant move result flag checks (#7223) --- src/battle_script_commands.c | 11 ++--- src/battle_util.c | 93 ++++++++++++------------------------ 2 files changed, 35 insertions(+), 69 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2298c20be4..ed2ee03236 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6316,7 +6316,6 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerTurnDamaged(gBattlerTarget) && !IsBattleMoveStatus(gCurrentMove) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -6763,8 +6762,7 @@ static void Cmd_moveend(void) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget - && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove))) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -6773,10 +6771,10 @@ static void Cmd_moveend(void) effect = TRUE; } if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE + && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget - && MoveThawsUser(originallyUsedMove) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + && MoveThawsUser(originallyUsedMove)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); @@ -17729,8 +17727,7 @@ void BS_TryActivateGulpMissile(void) { NATIVE_ARGS(); - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT diff --git a/src/battle_util.c b/src/battle_util.c index 30ee3b5541..187af6227b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4403,8 +4403,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 switch (gLastUsedAbility) { case ABILITY_JUSTIFIED: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && moveType == TYPE_DARK && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -4416,8 +4415,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_RATTLED: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -4429,8 +4427,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WATER_COMPACTION: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && moveType == TYPE_WATER && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -4442,8 +4439,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STAMINA: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && gBattlerAttacker != gBattlerTarget + if (gBattlerAttacker != gBattlerTarget && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -4455,8 +4451,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_BERSERK: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && HadMoreThanHalfHpNowDoesnt(battler) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) @@ -4470,8 +4465,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WEAK_ARMOR: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && IsBattleMovePhysical(gCurrentMove) && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if both Speed and Defense cannot be raised. @@ -4485,8 +4479,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CURSED_BODY: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) @@ -4503,8 +4496,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_LINGERING_AROMA: case ABILITY_MUMMY: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) @@ -4527,8 +4519,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_WANDERING_SPIRIT: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) @@ -4550,9 +4541,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_POINT: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && gSpecialStatuses[battler].criticalHit - && IsBattlerTurnDamaged(gBattlerTarget) + if (gSpecialStatuses[battler].criticalHit + && IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -4562,10 +4552,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COLOR_CHANGE: - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) - && move != MOVE_STRUGGLE + if (move != MOVE_STRUGGLE && !IsBattleMoveStatus(move) - && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerTurnDamaged(battler) && !IS_BATTLER_OF_TYPE(battler, moveType) && moveType != TYPE_STELLAR && moveType != TYPE_MYSTERY @@ -4579,8 +4568,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GOOEY: case ABILITY_TANGLING_HAIR: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -4596,8 +4584,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_ROUGH_SKIN: case ABILITY_IRON_BARBS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -4677,7 +4664,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 goto STATIC; // Sleep if (i < sleep - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -4701,8 +4687,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker)) @@ -4722,8 +4707,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) @@ -4740,8 +4724,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_FLAME_BODY: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && (IsMoveMakingContact(move, gBattlerAttacker)) @@ -4758,8 +4741,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_CUTE_CHARM: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) @@ -4785,8 +4767,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_COTTON_DOWN: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerAttacker) + if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget)) { @@ -4796,8 +4777,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STEAM_ENGINE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) && (moveType == TYPE_FIRE || moveType == TYPE_WATER)) @@ -4809,8 +4789,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SAND_SPIT: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect())) { @@ -4828,8 +4807,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_PERISH_BODY: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -4848,8 +4826,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_GULP_MISSILE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT) @@ -4877,8 +4854,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_SEED_SOWER: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.terrainTimer)) @@ -4888,8 +4864,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_THERMAL_EXCHANGE: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget) + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && moveType == TYPE_FIRE) @@ -4901,8 +4876,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ANGER_SHELL: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && (gMultiHitCounter == 0 || gMultiHitCounter == 1) // Activates after all hits from a multi-hit move. && IsBattlerAlive(gBattlerTarget) @@ -4918,8 +4892,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; // fall through case ABILITY_ELECTROMORPHOSIS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) { @@ -4928,8 +4901,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_DEBRIS: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && (!gBattleStruct->isSkyBattle) + if (!gBattleStruct->isSkyBattle && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattleMovePhysical(gCurrentMove) && IsBattlerTurnDamaged(gBattlerTarget) @@ -4946,8 +4918,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 switch (gLastUsedAbility) { case ABILITY_POISON_TOUCH: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) + if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS @@ -4980,8 +4951,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_STENCH: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) + if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && RandomChance(RNG_STENCH, 1, 10) && IsBattlerTurnDamaged(gBattlerTarget) @@ -7256,7 +7226,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case HOLD_EFFECT_STICKY_BARB: if (IsBattlerTurnDamaged(gBattlerTarget) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) From 8bbb84fc9600595b56161769359ce04d3421d74f Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 26 Jun 2025 20:15:22 +0200 Subject: [PATCH 092/248] Fix incorrect type input (#7228) Co-authored-by: Hedara --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 187af6227b..0dd60674ca 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -211,7 +211,7 @@ static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u3 ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; ctx.move = move; - ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.moveType = moveType; ctx.updateFlags = recordAbilities; ctx.abilityAtk = GetBattlerAbility(battlerAtk); ctx.abilityDef = defAbility; From 206d2503d849c07dea2f773fe6f8f23f3473d59d Mon Sep 17 00:00:00 2001 From: i0brendan0 <19826742+i0brendan0@users.noreply.github.com> Date: Thu, 26 Jun 2025 14:00:02 -0500 Subject: [PATCH 093/248] Add Gen 2 Moonlight, Morning Sun, Synthesis configuration (#7209) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/config/battle.h | 2 ++ include/constants/generational_changes.h | 1 + include/generational_changes.h | 1 + src/battle_script_commands.c | 35 +++++++++++++++++++++++- test/battle/move_effect/moonlight.c | 21 ++++++++++++-- test/battle/move_effect/morning_sun.c | 21 ++++++++++++-- test/battle/move_effect/synthesis.c | 21 ++++++++++++-- 7 files changed, 92 insertions(+), 10 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 3fdc45e490..06373f2c19 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -130,6 +130,8 @@ #define B_PURSUIT_TARGET GEN_LATEST // In Gen4+, Pursuit attacks a switching opponent even if they weren't targeting them. Before Gen4, Pursuit only attacks a switching opponent that it originally targeted. #define B_SKIP_RECHARGE GEN_LATEST // In Gen1, recharging moves such as Hyper Beam skip the recharge if the target gets KO'd #define B_ENCORE_TARGET GEN_LATEST // In Gen5+, encored moves are allowed to choose a target +#define B_TIME_OF_DAY_HEALING_MOVES GEN_LATEST // In Gen2, Morning Sun, Moonlight, and Synthesis heal twice as much HP based off the time of day. Also changes how much they heal. Evening affects Moonlight. + // If OW_TIMES_OF_DAY is set to Gen 3, then Morning Sun is boosted during the day. // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 143dc6e5bb..1cf2d80072 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -19,6 +19,7 @@ enum GenConfigTag GEN_CONFIG_FELL_STINGER_STAT_RAISE, GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_CONFIG_ENCORE_TARGET, + GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 146139d39e..a734ee49e8 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -22,6 +22,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, [GEN_CONFIG_DEFIANT_STICKY_WEB] = B_DEFIANT_STICKY_WEB, [GEN_CONFIG_ENCORE_TARGET] = B_ENCORE_TARGET, + [GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES] = B_TIME_OF_DAY_HEALING_MOVES, }; #if TESTING diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ed2ee03236..f6bfbad7fd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14316,7 +14316,7 @@ static void Cmd_recoverbasedonsunlight(void) else gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } - else + else if (GetGenConfig(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; @@ -14325,6 +14325,39 @@ static void Cmd_recoverbasedonsunlight(void) else // not sunny weather gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; } + else // B_TIME_OF_DAY_HEALING_MOVES == GEN_2 + { + u32 healingModifier = 1; + u32 time = GetTimeOfDay(); + + switch (GetMoveEffect(gCurrentMove)) + { + case EFFECT_MOONLIGHT: + if (time == TIME_NIGHT || time == TIME_EVENING) + healingModifier = 2; + break; + case EFFECT_MORNING_SUN: + if ((OW_TIMES_OF_DAY == GEN_3 && time == TIME_DAY) // Gen 3 doesn't have morning + || (OW_TIMES_OF_DAY != GEN_3 && time == TIME_MORNING)) + healingModifier = 2; + break; + case EFFECT_SYNTHESIS: + if (time == TIME_DAY) + healingModifier = 2; + break; + default: + healingModifier = 1; + break; + } + + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + else if (gBattleWeather & B_WEATHER_SUN) + gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + else // not sunny weather + gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + + } if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; diff --git a/test/battle/move_effect/moonlight.c b/test/battle/move_effect/moonlight.c index 34baa31b14..9804e4ba1e 100644 --- a/test/battle/move_effect/moonlight.c +++ b/test/battle/move_effect/moonlight.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_MOONLIGHT) == EFFECT_MOONLIGHT); } -SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,15 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandsto HP_BAR(player, damage: -(400 / 4)); } } + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/4 of the user's max HP while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/2 of the user's max HP in Sunlight while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/4 of the user's max HP while it is night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/2 of the user's max HP in Sunlight while it is night or evening (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Moonlight recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is night or evening (Gen2)") diff --git a/test/battle/move_effect/morning_sun.c b/test/battle/move_effect/morning_sun.c index 64fb1b044b..eca9efd31f 100644 --- a/test/battle/move_effect/morning_sun.c +++ b/test/battle/move_effect/morning_sun.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_MORNING_SUN) == EFFECT_MORNING_SUN); } -SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sands PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,15 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sands HP_BAR(player, damage: -(400 / 4)); } } + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/4 of the user's max HP while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/2 of the user's max HP in Sunlight while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/4 of the user's max HP while it is morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/2 of the user's max HP in Sunlight while it is morning (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Morning Sun recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is morning (Gen2)") diff --git a/test/battle/move_effect/synthesis.c b/test/battle/move_effect/synthesis.c index 6799bd2870..d9651a509e 100644 --- a/test/battle/move_effect/synthesis.c +++ b/test/battle/move_effect/synthesis.c @@ -6,9 +6,10 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_SYNTHESIS) == EFFECT_SYNTHESIS); } -SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP") +SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP") } } -SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight") +SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -30,7 +32,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight") } } -SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow") +SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { u32 move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } @@ -38,6 +40,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { + WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,3 +49,15 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto HP_BAR(player, damage: -(400 / 4)); } } + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/4 of the user's max HP while it is not day (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/2 of the user's max HP in Sunlight while it is not day (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 1/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is not day (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/4 of the user's max HP while it is day (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/2 of the user's max HP in Sunlight while it is day (Gen2)") + +TO_DO_BATTLE_TEST("TODO: Synthesis recovers 2/8 of the user's max HP in Rain, Sandstorm, Hail, and Snow while it is day (Gen2)") From 1f5195c6863b38ce9ecd1aa99730948d0784c923 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:55:43 -0500 Subject: [PATCH 094/248] update fnpc docs for createfollowernpc --- docs/tutorials/how_to_follower_npc.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/tutorials/how_to_follower_npc.md b/docs/tutorials/how_to_follower_npc.md index e55e6d8149..0af297ce60 100644 --- a/docs/tutorials/how_to_follower_npc.md +++ b/docs/tutorials/how_to_follower_npc.md @@ -24,6 +24,11 @@ This would turn object number 3 on the current map into an NPC follower, give th The object ***MUST*** have an event flag or the NPC follower will not be created! +## Create a Follower +The `createfollowernpc` macro will create a new follower without needing to convert an existing NPC. It works similarly to `setfollowernpc`, but instead of providing an object id, you give it a GFX id. For example, if you wanted to create a follower with the May sprite, you could do something like this: +`createfollowernpc OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, FNPC_ALL, EventScript_MayFollow` +The created follower NPC will initially be invisible until the player takes a step. + ## Follower Flags These are required to tell the game what behavior you want the NPC follower to have. They are defined in [include/constants/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/constants/follower_npc.h). The second list of flags is the same as the first, but with shortened names to make them easier to type when scripting. The first 7 flags in the list are individual behaviors, whereas the remaining three are bundles of flags. For example, if you use `FNPC_SURF` in `setfollowernpc`, the NPC follower will be able to Surf behind the player. If you use `FNPC_ALL_WATER` instead, the NPC follower will be able to Dive and go up Waterfalls in addition to being able to Surf. Feel free to add your own custom bundles of flags to the file to meet your needs. From b60c897b4ad676b70098449e8db48f6e0f3a7e6c Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Fri, 27 Jun 2025 01:11:41 -0700 Subject: [PATCH 095/248] Add P_ASK_MOVE_CONFIRMATION (#7132) --- data/battle_scripts_1.s | 2 ++ include/config/pokemon.h | 1 + src/evolution_scene.c | 8 ++++---- src/move_relearner.c | 16 +++++++++++++++- src/party_menu.c | 22 ++++++++++++++++++++-- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fc18ab1e76..f7e3c382d5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5434,10 +5434,12 @@ BattleScript_AskToLearnMove:: waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxlearnmove BattleScript_ForgotAndLearnedNewMove +.if P_ASK_MOVE_CONFIRMATION == TRUE printstring STRINGID_STOPLEARNINGMOVE waitstate setbyte sLEARNMOVE_STATE, 0 yesnoboxstoplearningmove BattleScript_AskToLearnMove +.endif printstring STRINGID_DIDNOTLEARNMOVE goto BattleScript_TryLearnMoveLoop BattleScript_ForgotAndLearnedNewMove:: diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 2345cc3f36..92b0f3bd64 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -56,6 +56,7 @@ #define P_SHOW_TERA_TYPE GEN_8 // Since Gen 9, the Tera Type is shown on the summary screen. #define P_TM_LITERACY GEN_LATEST // Since Gen 6, TM illiterate Pokémon can learn TMs that teach moves that are in their level-up learnsets. #define P_CAN_FORGET_HIDDEN_MOVE FALSE // If TRUE, Pokémon can forget any move, even if it is a Hidden Move. +#define P_ASK_MOVE_CONFIRMATION FALSE // If FALSE, when a player decides not to learn a Move, the game does not ask the player for confirmation. #define P_EGG_CYCLE_LENGTH GEN_LATEST // Since Gen 8, egg cycles take half as many steps as before. Previous Gens have some varied step counts around 255. #define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, Pokémon encountered in the Battle Pyramid won't be shiny. #define P_NO_SHINIES_WITHOUT_POKEBALLS FALSE // If TRUE, Pokémon encountered when the player is out of Poké Balls won't be shiny diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 73f8c78527..c746414958 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -910,7 +910,7 @@ static void Task_EvolutionScene(u8 taskId) BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3]); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG); gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT; - gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; gTasks[taskId].tLearnMoveState++; } case MVSTATE_PRINT_YES_NO: @@ -986,7 +986,7 @@ static void Task_EvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveState = MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; } else { @@ -1313,7 +1313,7 @@ static void Task_TradeEvolutionScene(u8 taskId) BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT; - gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; gTasks[taskId].tLearnMoveState++; } case T_MVSTATE_PRINT_YES_NO: @@ -1370,7 +1370,7 @@ static void Task_TradeEvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveState = T_MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; } else { diff --git a/src/move_relearner.c b/src/move_relearner.c index 7ac7a6bb11..ee700beb44 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -603,7 +603,21 @@ static void DoMoveRelearnerMain(void) } else if (selection == MENU_B_PRESSED || selection == 1) { - sMoveRelearnerStruct->state = MENU_STATE_PRINT_STOP_TEACHING; + if (P_ASK_MOVE_CONFIRMATION) + { + sMoveRelearnerStruct->state = MENU_STATE_PRINT_STOP_TEACHING; + } + else + { + if (sMoveRelearnerMenuState.showContestInfo == FALSE) + { + sMoveRelearnerStruct->state = MENU_STATE_SETUP_BATTLE_MODE; + } + else if (sMoveRelearnerMenuState.showContestInfo == TRUE) + { + sMoveRelearnerStruct->state = MENU_STATE_SETUP_CONTEST_MODE; + } + } } } break; diff --git a/src/party_menu.c b/src/party_menu.c index 404157c497..0954715a5d 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -414,6 +414,7 @@ static void CB2_ReturnToPartyMenuWhileLearningMove(void); static void Task_ReturnToPartyMenuWhileLearningMove(u8); static void DisplayPartyMenuForgotMoveMessage(u8); static void Task_PartyMenuReplaceMove(u8); +static void Task_HandleStopLearningMove(u8 taskId); static void Task_StopLearningMoveYesNo(u8); static void Task_HandleStopLearningMoveYesNoInput(u8); static void Task_TryLearningNextMoveAfterText(u8); @@ -5567,11 +5568,28 @@ static void Task_PartyMenuReplaceMove(u8 taskId) static void StopLearningMovePrompt(u8 taskId) { + if (P_ASK_MOVE_CONFIRMATION == FALSE) + { + struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; + GetMonNickname(mon, gStringVar1); + } + StringCopy(gStringVar2, GetMoveName(gPartyMenu.data1)); - StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2); + StringExpandPlaceholders(gStringVar4, (P_ASK_MOVE_CONFIRMATION) ? gText_StopLearningMove2 : gText_MoveNotLearned); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); - gTasks[taskId].func = Task_StopLearningMoveYesNo; + gTasks[taskId].func = (P_ASK_MOVE_CONFIRMATION) ? Task_StopLearningMoveYesNo : Task_HandleStopLearningMove; +} + +static void Task_HandleStopLearningMove(u8 taskId) +{ + if (IsPartyMenuTextPrinterActive() != TRUE) + { + if (gPartyMenu.learnMoveState == 1) + gTasks[taskId].func = Task_TryLearningNextMoveAfterText; + else + gTasks[taskId].func = Task_ClosePartyMenuAfterText; + } } static void Task_StopLearningMoveYesNo(u8 taskId) From b1200117a98fd04c33abdb1cc0bc12b654bbefa6 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Fri, 27 Jun 2025 03:12:35 -0500 Subject: [PATCH 096/248] Better system for Follower NPC running frames (#7222) Co-authored-by: hedara90 <90hedara@gmail.com> --- docs/tutorials/how_to_follower_npc.md | 2 -- include/constants/follower_npc.h | 8 +------- include/follower_npc.h | 6 ++++++ include/follower_npc_alternate_sprites.h | 2 ++ src/debug.c | 5 ----- src/follower_npc.c | 23 +++++++++++++++++++++-- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/docs/tutorials/how_to_follower_npc.md b/docs/tutorials/how_to_follower_npc.md index e55e6d8149..5c6c9aa544 100644 --- a/docs/tutorials/how_to_follower_npc.md +++ b/docs/tutorials/how_to_follower_npc.md @@ -27,8 +27,6 @@ The object ***MUST*** have an event flag or the NPC follower will not be created ## Follower Flags These are required to tell the game what behavior you want the NPC follower to have. They are defined in [include/constants/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/constants/follower_npc.h). The second list of flags is the same as the first, but with shortened names to make them easier to type when scripting. The first 7 flags in the list are individual behaviors, whereas the remaining three are bundles of flags. For example, if you use `FNPC_SURF` in `setfollowernpc`, the NPC follower will be able to Surf behind the player. If you use `FNPC_ALL_WATER` instead, the NPC follower will be able to Dive and go up Waterfalls in addition to being able to Surf. Feel free to add your own custom bundles of flags to the file to meet your needs. -If the NPC doesn't have unique running frames, you should not use the `FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES`(`FNPC_RUNNING`) flag for them, as this will cause visual glitching. If the flag is not used, the follower will simply use their regular walking animation frames, just sped up. The only objects currently in the game that have unique running frames are the player and rival characters, so the running frames flag should be used for those. - To make sure the NPC follower uses the correct animation frames, you should add an entry to `gFollowerAlternateSprites` in [include/follower_npc_alternate_sprites.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/follower_npc_alternate_sprites.h). Only do this if your object has distinct animation frames for different behaviors (running, biking, surfing, etc). Follow the templates for Rival May and Rival Brendan that already exist there. ## Follower Movements diff --git a/include/constants/follower_npc.h b/include/constants/follower_npc.h index e1c84b05a4..989aab72b4 100644 --- a/include/constants/follower_npc.h +++ b/include/constants/follower_npc.h @@ -2,7 +2,6 @@ #define GUARD_CONSTANTS_FOLLOWER_NPC_H // NPC Follower Flags -#define FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES 0x1 // Only use this if the NPC has running anim frames. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_BIKE 0x2 // Player is allowed to use the Bike. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE 0x4 // Player is allowed to use Fly/Teleport/EscapeRope/etc. Part of FOLLOWER_NPC_FLAG_ALL_LAND. #define FOLLOWER_NPC_FLAG_CAN_SURF 0x8 // Player is allowed to Surf. Part of FOLLOWER_NPC_FLAG_ALL_WATER. @@ -10,12 +9,11 @@ #define FOLLOWER_NPC_FLAG_CAN_DIVE 0x20 // Player is allowed to use Dive. Part of FOLLOWER_NPC_FLAG_ALL_WATER. #define FOLLOWER_NPC_FLAG_CLEAR_ON_WHITE_OUT 0x80 // The NPC follower will be destroyed if the player whites out. -#define FOLLOWER_NPC_FLAG_ALL_LAND FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES | FOLLOWER_NPC_FLAG_CAN_BIKE | FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE +#define FOLLOWER_NPC_FLAG_ALL_LAND FOLLOWER_NPC_FLAG_CAN_BIKE | FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE #define FOLLOWER_NPC_FLAG_ALL_WATER FOLLOWER_NPC_FLAG_CAN_SURF | FOLLOWER_NPC_FLAG_CAN_WATERFALL | FOLLOWER_NPC_FLAG_CAN_DIVE #define FOLLOWER_NPC_FLAG_ALL FOLLOWER_NPC_FLAG_ALL_LAND | FOLLOWER_NPC_FLAG_ALL_WATER | FOLLOWER_NPC_FLAG_CLEAR_ON_WHITE_OUT // Shorter flag names for ease of use in setfollowernpc script macro -#define FNPC_RUNNING FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES #define FNPC_BIKE FOLLOWER_NPC_FLAG_CAN_BIKE #define FNPC_LEAVE_ROUTE FOLLOWER_NPC_FLAG_CAN_LEAVE_ROUTE #define FNPC_SURF FOLLOWER_NPC_FLAG_CAN_SURF @@ -27,8 +25,4 @@ #define FNPC_ALL_WATER FOLLOWER_NPC_FLAG_ALL_WATER #define FNPC_ALL FOLLOWER_NPC_FLAG_ALL - -#define FNPC_NONE 0 -#define FNPC_ALWAYS 2 - #endif // GUARD_CONSTANTS_FOLLOWER_NPC_H diff --git a/include/follower_npc.h b/include/follower_npc.h index a9be81d62c..458961bfad 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -12,6 +12,7 @@ struct FollowerNPCSpriteGraphics u16 acroBikeId; u16 surfId; u16 underwaterId; + bool8 hasRunningFrames; }; enum FollowerNPCDataTypes @@ -77,6 +78,11 @@ enum FollowerNPCHandleEscalatorFinishTaskStates{ MOVEMENT_FINISH }; +#define FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES 0x1 + +#define FNPC_NONE 0 +#define FNPC_ALWAYS 2 + void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value); const u8 *GetFollowerNPCScriptPointer(void); u32 GetFollowerNPCData(enum FollowerNPCDataTypes type); diff --git a/include/follower_npc_alternate_sprites.h b/include/follower_npc_alternate_sprites.h index a42795ddf9..15fc489765 100644 --- a/include/follower_npc_alternate_sprites.h +++ b/include/follower_npc_alternate_sprites.h @@ -19,6 +19,7 @@ static const struct FollowerNPCSpriteGraphics gFollowerNPCAlternateSprites[] = .acroBikeId = OBJ_EVENT_GFX_RIVAL_MAY_ACRO_BIKE, .surfId = OBJ_EVENT_GFX_RIVAL_MAY_SURFING, .underwaterId = OBJ_EVENT_GFX_MAY_UNDERWATER, + .hasRunningFrames = TRUE, }, { .normalId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, @@ -26,6 +27,7 @@ static const struct FollowerNPCSpriteGraphics gFollowerNPCAlternateSprites[] = .acroBikeId = OBJ_EVENT_GFX_RIVAL_BRENDAN_ACRO_BIKE, .surfId = OBJ_EVENT_GFX_RIVAL_BRENDAN_SURFING, .underwaterId = OBJ_EVENT_GFX_BRENDAN_UNDERWATER, + .hasRunningFrames = TRUE, }, }; diff --git a/src/debug.c b/src/debug.c index 8e6bada962..e46c5c5062 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3437,11 +3437,6 @@ static void DebugAction_CreateFollowerNPC(u8 taskId) DestroyFollowerNPC(); SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, PARTNER_STEVEN); CreateFollowerNPC(gfx, FNPC_ALL, Debug_Follower_NPC_Event_Script); - if (gfx != OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL && gfx != OBJ_EVENT_GFX_RIVAL_MAY_NORMAL) - { - u32 flags = GetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, (flags &= ~FNPC_RUNNING)); - } UnlockPlayerFieldControls(); } diff --git a/src/follower_npc.c b/src/follower_npc.c index 0b2a4b70b3..a92b1dd507 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -50,6 +50,7 @@ static void SetFollowerNPCScriptPointer(const u8 *script); static void PlayerLogCoordinates(struct ObjectEvent *player); static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, const u8 *script); static u32 GetFollowerNPCSprite(void); +static bool32 FollowerNPCHasRunningFrames(void); static bool32 IsStateMovement(u32 state); static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower); static u32 ReturnFollowerNPCDelayedState(u32 direction); @@ -212,9 +213,12 @@ static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, c SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); SetFollowerNPCScriptPointer(script); SetFollowerNPCData(FNPC_DATA_EVENT_FLAG, flag); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + if (FollowerNPCHasRunningFrames()) + followerFlags |= FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES; + + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) @@ -257,6 +261,18 @@ static u32 GetFollowerNPCSprite(void) return GetFollowerNPCData(FNPC_DATA_GFX_ID); } +static bool32 FollowerNPCHasRunningFrames(void) +{ + for (u32 i = 0; i < NELEMS(gFollowerNPCAlternateSprites); i++) + { + if (gFollowerNPCAlternateSprites[i].normalId == GetFollowerNPCData(FNPC_DATA_GFX_ID) + && gFollowerNPCAlternateSprites[i].hasRunningFrames == TRUE) + return TRUE; + } + + return FALSE; +} + static bool32 IsStateMovement(u32 state) { switch (state) @@ -696,10 +712,13 @@ void CreateFollowerNPC(u32 gfx, u32 followerFlags, const u8 *scriptPtr) SetFollowerNPCData(FNPC_DATA_IN_PROGRESS, TRUE); SetFollowerNPCData(FNPC_DATA_GFX_ID, follower->graphicsId); - SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); SetFollowerNPCScriptPointer(scriptPtr); + if (FollowerNPCHasRunningFrames()) + followerFlags |= FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES; + + SetFollowerNPCData(FNPC_DATA_FOLLOWER_FLAGS, followerFlags); // If the player is biking and the follower flags prohibit biking, force the player to dismount the bike. if (!CheckFollowerNPCFlag(FOLLOWER_NPC_FLAG_CAN_BIKE) From d1577d96adb29c31b0804828c6873c27300dd72a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 27 Jun 2025 19:37:24 +0200 Subject: [PATCH 097/248] Set correct Instruction in Cmd_setnonvolatilestatus (#7236) --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f6bfbad7fd..19f787dc9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16445,7 +16445,8 @@ static void Cmd_jumpifcaptivateaffected(void) static void Cmd_setnonvolatilestatus(void) { CMD_ARGS(u8 trigger); - + gBattlescriptCurrInstr = cmd->nextInstr - 1; + switch (cmd->trigger) { case TRIGGER_ON_ABILITY: From c5b939a312e35556ce1532ab6b284a871a6f032b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 27 Jun 2025 22:31:31 +0200 Subject: [PATCH 098/248] Changes pre-proc to a normal if for Item Desc Header (#7231) --- src/overworld.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/overworld.c b/src/overworld.c index 7c579a8785..9dac585f62 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -915,7 +915,7 @@ static void LoadMapFromWarp(bool32 a1) ClearTempFieldEventData(); ResetDexNavSearch(); // reset hours override on every warp - sHoursOverride = 0; + sHoursOverride = 0; ResetCyclingRoadChallengeData(); RestartWildEncounterImmunitySteps(); #if FREE_MATCH_CALL == FALSE @@ -3513,8 +3513,6 @@ bool8 GetSetItemObtained(u16 item, enum ItemObtainFlags caseId) return FALSE; } -#if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF - EWRAM_DATA static u8 sHeaderBoxWindowId = 0; EWRAM_DATA u8 sItemIconSpriteId = 0; EWRAM_DATA u8 sItemIconSpriteId2 = 0; @@ -3566,6 +3564,12 @@ static u8 ReformatItemDescription(u16 item, u8 *dest) void ScriptShowItemDescription(struct ScriptContext *ctx) { + if (OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_OFF) + { + (void) ScriptReadByte(ctx); + return; + } + u8 headerType = ScriptReadByte(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); @@ -3609,6 +3613,9 @@ void ScriptShowItemDescription(struct ScriptContext *ctx) void ScriptHideItemDescription(struct ScriptContext *ctx) { + if (OW_SHOW_ITEM_DESCRIPTIONS == OW_ITEM_DESCRIPTIONS_OFF) + return; + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE | SCREFF_HARDWARE); DestroyItemIconSprite(); @@ -3684,17 +3691,6 @@ static void DestroyItemIconSprite(void) } } -#else -void ScriptShowItemDescription(struct ScriptContext *ctx) -{ - (void) ScriptReadByte(ctx); -} -void ScriptHideItemDescription(struct ScriptContext *ctx) -{ -} -#endif // OW_SHOW_ITEM_DESCRIPTIONS - - // returns old sHoursOverride u16 SetTimeOfDay(u16 hours) { From 7a0cbc12d242d3fde7d733d9f4c724c1338f8b16 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 30 Jun 2025 12:45:09 -0400 Subject: [PATCH 099/248] Added `CRY_MODE_DYNAMAX` (#6933) --- data/battle_anim_scripts.s | 2 +- include/constants/sound.h | 1 + src/battle_anim_sound_tasks.c | 7 +++++++ src/pokemon_sprite_visualizer.c | 4 ++-- src/sound.c | 6 ++++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index dc99ac9ce3..9d309ec154 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -36122,7 +36122,7 @@ gBattleAnimMove_GMaxGoldRush:: @@@ DYNAMAX AND MAX RAIDS gBattleAnimGeneral_DynamaxGrowth:: @ PORTED FROM CFRU - createvisualtask SoundTask_PlayCryWithEcho, 2, ANIM_ATTACKER, 2 + createvisualtask SoundTask_PlayDynamaxCry, 0 delay 8 createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x0 waitforvisualfinish diff --git a/include/constants/sound.h b/include/constants/sound.h index dc434bcf8a..c16080d1dd 100644 --- a/include/constants/sound.h +++ b/include/constants/sound.h @@ -33,6 +33,7 @@ #define CRY_MODE_GROWL_2 10 // For 2nd cry used by the move Growl #define CRY_MODE_WEAK 11 // Used when a Pokémon is unhealthy #define CRY_MODE_WEAK_DOUBLES 12 // Equivalent to CRY_MODE_DOUBLES for CRY_MODE_WEAK +#define CRY_MODE_DYNAMAX 13 // Used during Dynamax // Given to SoundTask_PlayDoubleCry to determine which cry mode to use. Values are arbitrary #define DOUBLE_CRY_ROAR 2 diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index 1bd7008aa4..6645e6273b 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -311,6 +311,13 @@ void SoundTask_PlayCryWithEcho(u8 taskId) DestroyAnimVisualTask(taskId); } +void SoundTask_PlayDynamaxCry(u8 taskId) +{ + u16 species = (GetIllusionMonSpecies(gBattleAnimAttacker) != SPECIES_NONE) ? GetIllusionMonSpecies(gBattleAnimAttacker) : gAnimBattlerSpecies[gBattleAnimAttacker]; + PlayCry_ByMode(species, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER), CRY_MODE_DYNAMAX); + gTasks[taskId].func = SoundTask_WaitForCry; +} + static void SoundTask_PlayCryWithEcho_Step(u8 taskId) { u16 species = gTasks[taskId].tSpecies; diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index 3a764e9a3b..6984290f13 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -1673,12 +1673,12 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId) if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy)) { - PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL); LaunchAnimationTaskForBackSprite(Backsprite, data->animIdBack-1); } if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy)) { - PlayCryInternal(data->currentmonId, 0, 120, 10, 0); + PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL); if (HasTwoFramesAnimation(data->currentmonId)) StartSpriteAnim(Frontsprite, 1); diff --git a/src/sound.c b/src/sound.c index f1f10f3b03..0eec129dde 100644 --- a/src/sound.c +++ b/src/sound.c @@ -456,6 +456,12 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) case CRY_MODE_WEAK: pitch = 15000; break; + case CRY_MODE_DYNAMAX: + length = 255; + release = 255; + pitch = 12150; + chorus = 200; + break; } SetPokemonCryVolume(volume); From aae04ffc8484db8c685b9c5cdaf529a23bb037df Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Tue, 1 Jul 2025 04:50:48 +0700 Subject: [PATCH 100/248] Improve trainer back pic-related data and code (+ smol documentation) (#6821) --- docs/tutorials/how_to_trainer_back_pic.md | 93 ++++++++++++++++++++ docs/tutorials/how_to_trainer_front_pic.md | 97 +++++++++++++++++++++ docs/tutorials/how_to_trainer_pic.md | 98 ---------------------- include/data.h | 6 +- include/trainer_pokemon_sprites.h | 1 + src/battle_gfx_sfx_util.c | 4 +- src/data/graphics/trainers.h | 91 +++----------------- src/pokemon.c | 84 +++---------------- src/trainer_pokemon_sprites.c | 10 ++- 9 files changed, 226 insertions(+), 258 deletions(-) create mode 100644 docs/tutorials/how_to_trainer_back_pic.md create mode 100644 docs/tutorials/how_to_trainer_front_pic.md delete mode 100644 docs/tutorials/how_to_trainer_pic.md diff --git a/docs/tutorials/how_to_trainer_back_pic.md b/docs/tutorials/how_to_trainer_back_pic.md new file mode 100644 index 0000000000..5c262942ae --- /dev/null +++ b/docs/tutorials/how_to_trainer_back_pic.md @@ -0,0 +1,93 @@ +# How to add a new trainer back pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer back pic](#2-defining-the-trainer-back-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. Place graphics in [`graphics/trainers/back_pics`](./graphics/trainers/back_pics). +2. Point game to where graphic files are found: [`src/data/graphics/trainers`](./src/data/graphics/trainers.h). +3. Add trainer to [`include/constants/trainers.h`](./include/constants/trainers.h), + +## The Graphics + +### 1. Add the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: [`graphics/trainers/back_pics`](./graphics/trainers/back_pics). **Trainers sprites cannot be more than 16 - this includes the color that will be transparent, which is the first slot of the palette.** + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files in [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h): +```diff + const u8 gTrainerBackPic_Wally[] = INCBIN_U8("graphics/trainers/back_pics/wally.4bpp"); + const u8 gTrainerBackPic_Steven[] = INCBIN_U8("graphics/trainers/back_pics/steven.4bpp"); ++const u8 gTrainerBackPic_NewOne[] = INCBIN_U8("graphics/trainers/back_pics/new_one.4bpp"); + + const u16 gTrainerBackPicPalette_Red[] = INCBIN_U16("graphics/trainers/back_pics/red.gbapal"); + const u16 gTrainerBackPicPalette_Leaf[] = INCBIN_U16("graphics/trainers/back_pics/leaf.gbapal"); ++const u16 gTrainerBackPicPalette_NewOne[] = INCBIN_U16("graphics/trainers/back_pics/new_one.gbapal"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h) you'll find the `gTrainerBacksprites` struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the new trainer with the image we defined earlier. + +So, finally, it needs to look like this: +```diff + #define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, pal, anim) \ + [trainerPic] = \ + { \ + .coordinates = {.size = 8, .y_offset = yOffset}, \ + .backPic = {.data = sprite, .size = TRAINER_PIC_SIZE, .relativeFrames = TRUE}, \ + .palette = {.data = pal, .tag = trainerPic}, \ + .animation = anim, \ + } + + const struct TrainerBacksprite gTrainerBacksprites[] = + { + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), + ... + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), ++ TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_NEW_ONE, 4, gTrainerBackPic_NewOne, gTrainerBackPicPalette_NewOne, sBackAnims_Hoenn), +}; +``` + +**Note**: Trainer back pics can have 4 or 5 frames of animation. Trainers with 5 frames must have their `yOffset` set to 5, and their `anim` set to `sBackAnims_Kanto`. + +### The Data +#### 4. Defining the trainer back pic +Finally, let's bring it all together by defining our new trainer pic in [`include/constants/trainers.h`](./include/constants/trainers.h): + +```diff + #define TRAINER_BACK_PIC_WALLY 6 + #define TRAINER_BACK_PIC_STEVEN 7 ++#define TRAINER_BACK_PIC_NEW_ONE 8 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your new trainer back pic by going to [`src/data/battle_partners.party`](./src/data/battle_partners.party) and change the `Pic` field. The syntax should match the constant (`TRAINER_BACK_PIC_NEW_ONE`) with the underscore replaced by spaces. For example: +```diff + === PARTNER_STEVEN === + Name: STEVEN + Class: Rival +-Pic: Steven ++Pic: New One + Gender: Male + Music: Male +``` + +Otherwise if you use [`src/data/battle_partners.h`](./src/data/battle_partners.h), change the `trainerPic` field instead. For example: +```diff + [DIFFICULTY_NORMAL][PARTNER_STEVEN] = + { + .trainerName = _("STEVEN"), + .trainerClass = TRAINER_CLASS_RIVAL, +- .trainerPic = TRAINER_BACK_PIC_STEVEN, ++ .trainerPic = TRAINER_BACK_PIC_NEW_ONE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, +``` diff --git a/docs/tutorials/how_to_trainer_front_pic.md b/docs/tutorials/how_to_trainer_front_pic.md new file mode 100644 index 0000000000..092679c196 --- /dev/null +++ b/docs/tutorials/how_to_trainer_front_pic.md @@ -0,0 +1,97 @@ +# How to add a new trainer front pic + +## Content +* [Quick Summary](#quick-summary) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#2-edit-the-sprites) + * [2. Register the sprites](#2-register-the-sprites) + * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) +* [The Data](#the-data) + * [4. Defining the trainer pic](#2-defining-the-trainer-pic) +* [Usage](#usage) + +## Quick Summary +If you've done this before and just need a quick lookup, here's what files you need: +1. Place graphics into [`graphics/trainers/front_pics`](./graphics/trainers/front_pics). +2. Point game to where graphic files are found: [`src/data/graphics/trainers`](./src/data/graphics/trainers.h). +3. Add trainer to [`include/constants/trainers.h`](./include/constants/trainers.h). + +## The Graphics + +### 1. Edit the sprites +We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: [`graphics/trainers/front_pics`](./graphics/trainers/front_pics). **Trainers sprites cannot be more than 16 - this includes the color that will be transparent, which is the first slot of the palette.** + +### 2. Register the sprites +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files in [`src/data/graphics/trainers`](./data/graphics/trainers.h): +```diff + const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/brendan_rs.gbapal"); + + const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/may_rs.4bpp.smol"); + const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/may_rs.gbapal"); ++ ++const u32 gTrainerFrontPic_NewOne[] = INCBIN_U32("graphics/trainers/front_pics/new_one.4bpp.smol"); ++const u16 gTrainerPalette_NewOne[] = INCBIN_U16("graphics/trainers/front_pics/new_one.gbapal"); + + const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); +``` + +### 3. Connecting the Pictures to the Data +The last few things we have to do is prepare the graphics for usage. In [`src/data/graphics/trainers.h`](./src/data/graphics/trainers.h) you'll find the `gTrainerSprites` struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the new trainer with the image we defined earlier. + +So, finally, it needs to look like this: +```diff + #define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ + [trainerPic] = \ + { \ + .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ + .palette = {paletteFile, trainerPic}, \ + .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ + .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ + } + + const struct TrainerSprite gTrainerSprites[] = + { + TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), + TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), + ... + TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), ++ TRAINER_SPRITE(TRAINER_PIC_NEW_ONE, gTrainerFrontPic_NewOne, gTrainerPalette_NewOne), + }; +``` +### The Data +#### 4. Defining the trainer pic +Finally, let's bring it all together by defining our new trainer pic in [`include/constants/trainers.h`](./include/constants/trainers.h): + +```diff + #define TRAINER_PIC_RS_MAY 92 ++#define TRAINER_PIC_NEW_ONE 93 + + #define TRAINER_BACK_PIC_BRENDAN 0 + #define TRAINER_BACK_PIC_MAY 1 +``` +Remember to count the number next to the trainer pic up by one! + +## Usage +You can test your trainer type by going to [`src/data/trainers.party`](./src/data/trainers.party) and change the `Pic` field. The syntax should match the constant (`TRAINER_PIC_NEW_ONE`) with the underscore replaced by spaces. For example: +```diff + === TRAINER_BRENDAN_PLACEHOLDER === + Name: BRENDAN + Class: RS Protag +-Pic: RS Brendan ++Pic: New One + Gender: Male + Music: Male + Double Battle: No +``` + +Otherwise if you use [`src/data/trainers.h`](./src/data/trainers.h), change the `.trainerPic` field instead. For example: +```diff + [DIFFICULTY_NORMAL][TRAINER_BRENDAN_PLACEHOLDER] = + { + .trainerName = _("BRENDAN"), + .trainerClass = TRAINER_CLASS_RS_PROTAG, +- .trainerPic = TRAINER_PIC_RS_BRENDAN, ++ .trainerPic = TRAINER_PIC_NEW_ONE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .doubleBattle = FALSE, +``` diff --git a/docs/tutorials/how_to_trainer_pic.md b/docs/tutorials/how_to_trainer_pic.md deleted file mode 100644 index beddb641e4..0000000000 --- a/docs/tutorials/how_to_trainer_pic.md +++ /dev/null @@ -1,98 +0,0 @@ -# How to add a new trainer pic - -## Content -* [Quick Summary](#quick-summary) -* [The Graphics](#the-graphics) - * [1. Edit the sprites](#2-edit-the-sprites) - * [2. Register the sprites](#2-register-the-sprites) - * [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data) -* [The Data](#the-data) - * [4. Defining the trainer pic](#2-defining-the-trainer-pic) -* [Usage](#usage) - -## Quick Summary -If you've done this before and just need a quick lookup, here's what files you need: -1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) -2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes) -3. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) -4. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h) - -## The Graphics - -### 1. Edit the sprites -We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder: -[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics) - -**Remember to limit yourself to 16 colors including transparency in the first slot!** - -Export the palette and place into the same folder. - -### 2. Register the sprites -Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. -[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): -```diff -const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal"); - -const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz"); -const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_may.gbapal"); - -+ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz"); -+ const u16 gTrainerPalette_myTrainerClass[] = INCBIN_U16("graphics/trainers/palettes/myTrainerClass.gbapal"); - -const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); -``` - -### 3. Connecting the Pictures to the Data -The last few things we have to do is prepare the graphics for usage. In [src/data/graphics/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier. - -So, finally, it needs to look like this: -```diff -define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \ - [trainerPic] = \ - { \ - .frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \ - .palette = {paletteFile, trainerPic}, \ - .mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \ - .mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \ - } - -const struct TrainerSprite gTrainerSprites[] = -{ - TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker), - TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM), - ... - TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay), - TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass) -}; -``` -### The Data -#### 4. Defining the trainer pic -Finally, let's bring it all together by defining our new trainer pic in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h): - -```diff -#define TRAINER_PIC_RS_MAY 92 -+ #define TRAINER_PIC_MY_TRAINER_CLASS 93 - -#define TRAINER_BACK_PIC_BRENDAN 0 -#define TRAINER_BACK_PIC_MAY 1 -``` -Remember to count the number next to the trainer pic up by one! - -## Usage -You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example: -```diff - [TRAINER_BRENDAN_PLACEHOLDER] = - { - .partyFlags = 0, - .trainerClass = TRAINER_CLASS_RS_PROTAG, - .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, -- .trainerPic = TRAINER_PIC_RS_BRENDAN, -+ .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS, - .trainerName = _("BRENDAN"), - .items = {}, - .doubleBattle = FALSE, - .aiFlags = 0, - .partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder), - .party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder}, - }, -``` diff --git a/include/data.h b/include/data.h index 87b485b7d9..003d669f8e 100644 --- a/include/data.h +++ b/include/data.h @@ -42,9 +42,9 @@ struct TrainerSprite struct TrainerBacksprite { - struct MonCoords coordinates; - struct CompressedSpriteSheet backPic; - struct SpritePalette palette; + const struct MonCoords coordinates; + const struct SpriteFrameImage backPic; + const struct SpritePalette palette; const union AnimCmd *const *const animation; }; diff --git a/include/trainer_pokemon_sprites.h b/include/trainer_pokemon_sprites.h index 619fa91e70..ac464266eb 100644 --- a/include/trainer_pokemon_sprites.h +++ b/include/trainer_pokemon_sprites.h @@ -16,5 +16,6 @@ u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 palet u16 FreeAndDestroyTrainerPicSprite(u16 spriteId); u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId); u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass); +void CopyTrainerBackspriteFramesToDest(u8 trainerPicId, u8 *dest); #endif // GUARD_TRAINER_POKEMON_SPRITES_H diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index ca9bfb3d06..ca1b8fcb02 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -23,6 +23,7 @@ #include "data.h" #include "palette.h" #include "contest.h" +#include "trainer_pokemon_sprites.h" #include "constants/songs.h" #include "constants/rgb.h" #include "constants/battle_palace.h" @@ -697,8 +698,7 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battler) void DecompressTrainerBackPic(u16 backPicId, u8 battler) { u8 position = GetBattlerPosition(battler); - DecompressPicFromTable(&gTrainerBacksprites[backPicId].backPic, - gMonSpritesGfxPtr->spritesGfx[position]); + CopyTrainerBackspriteFramesToDest(backPicId, gMonSpritesGfxPtr->spritesGfx[position]); LoadPalette(gTrainerBacksprites[backPicId].palette.data, OBJ_PLTT_ID(battler), PLTT_SIZE_4BPP); } diff --git a/src/data/graphics/trainers.h b/src/data/graphics/trainers.h index eb107b34e8..d01e407d12 100644 --- a/src/data/graphics/trainers.h +++ b/src/data/graphics/trainers.h @@ -457,92 +457,23 @@ static const union AnimCmd *const sBackAnims_Kanto[] = sAnimCmd_Point_HGSS_Red_Leaf, }; -const struct SpriteFrameImage gTrainerBackPicTable_Brendan[] = -{ - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Brendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_May[] = -{ - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_May + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Red[] = -{ - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Red + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Leaf[] = -{ - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Leaf + TRAINER_PIC_SIZE * 4, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireBrendan[] = -{ - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireBrendan + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_RubySapphireMay[] = -{ - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_RubySapphireMay + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Wally[] = -{ - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Wally + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -const struct SpriteFrameImage gTrainerBackPicTable_Steven[] = -{ - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 0, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 1, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 2, TRAINER_PIC_SIZE}, - {gTrainerBackPic_Steven + TRAINER_PIC_SIZE * 3, TRAINER_PIC_SIZE}, -}; - -// .backPic goes functionally unused, since none of these pics are compressed -// and the place they would get extracted to gets overwritten later anyway -// the casts are so they'll play nice with the strict struct definition -#define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, table, pal, anim) \ +#define TRAINER_BACK_SPRITE(trainerPic, yOffset, sprite, pal, anim) \ [trainerPic] = \ { \ .coordinates = {.size = 8, .y_offset = yOffset}, \ - .backPic = {(const u32 *)sprite, TRAINER_PIC_SIZE * ARRAY_COUNT(table), trainerPic}, \ - .palette = {pal, trainerPic}, \ + .backPic = {.data = sprite, .size = TRAINER_PIC_SIZE, .relativeFrames = TRUE}, \ + .palette = {.data = pal, .tag = trainerPic}, \ .animation = anim, \ } const struct TrainerBacksprite gTrainerBacksprites[] = { - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerBackPicTable_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_MAY, 4, gTrainerBackPic_May, gTrainerBackPicTable_May, gTrainerPalette_May, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RED, 5, gTrainerBackPic_Red, gTrainerBackPicTable_Red, gTrainerBackPicPalette_Red, sBackAnims_Kanto), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_LEAF, 5, gTrainerBackPic_Leaf, gTrainerBackPicTable_Leaf, gTrainerBackPicPalette_Leaf, sBackAnims_Kanto), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN, 4, gTrainerBackPic_RubySapphireBrendan, gTrainerBackPicTable_RubySapphireBrendan, gTrainerPalette_RubySapphireBrendan, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY, 4, gTrainerBackPic_RubySapphireMay, gTrainerBackPicTable_RubySapphireMay, gTrainerPalette_RubySapphireMay, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_WALLY, 4, gTrainerBackPic_Wally, gTrainerBackPicTable_Wally, gTrainerPalette_Wally, sBackAnims_Hoenn), - TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerBackPicTable_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_BRENDAN, 4, gTrainerBackPic_Brendan, gTrainerPalette_Brendan, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_MAY, 4, gTrainerBackPic_May, gTrainerPalette_May, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RED, 5, gTrainerBackPic_Red, gTrainerBackPicPalette_Red, sBackAnims_Kanto), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_LEAF, 5, gTrainerBackPic_Leaf, gTrainerBackPicPalette_Leaf, sBackAnims_Kanto), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN, 4, gTrainerBackPic_RubySapphireBrendan, gTrainerPalette_RubySapphireBrendan, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY, 4, gTrainerBackPic_RubySapphireMay, gTrainerPalette_RubySapphireMay, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_WALLY, 4, gTrainerBackPic_Wally, gTrainerPalette_Wally, sBackAnims_Hoenn), + TRAINER_BACK_SPRITE(TRAINER_BACK_PIC_STEVEN, 4, gTrainerBackPic_Steven, gTrainerPalette_Steven, sBackAnims_Hoenn), }; diff --git a/src/pokemon.c b/src/pokemon.c index 0fc4df1212..12f2860435 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -810,80 +810,15 @@ const struct SpriteTemplate gBattlerSpriteTemplates[MAX_BATTLERS_COUNT] = }, }; -static const struct SpriteTemplate sTrainerBackSpriteTemplates[] = +static const struct SpriteTemplate sTrainerBackSpriteTemplate = { - [TRAINER_BACK_PIC_BRENDAN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Brendan, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_MAY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_May, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RED] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Red, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_LEAF] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Leaf, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_RubySapphireBrendan, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_RubySapphireMay, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_WALLY] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Wally, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, - [TRAINER_BACK_PIC_STEVEN] = { - .tileTag = TAG_NONE, - .paletteTag = 0, - .oam = &gOamData_BattleSpritePlayerSide, - .anims = NULL, - .images = gTrainerBackPicTable_Steven, - .affineAnims = gAffineAnims_BattleSpritePlayerSide, - .callback = SpriteCB_BattleSpriteStartSlideLeft, - }, + .tileTag = TAG_NONE, + .paletteTag = 0, + .oam = &gOamData_BattleSpritePlayerSide, + .anims = NULL, + .images = NULL, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }; #define NUM_SECRET_BASE_CLASSES 5 @@ -2240,7 +2175,8 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition gMultiuseSpriteTemplate.paletteTag = trainerPicId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) { - gMultiuseSpriteTemplate = sTrainerBackSpriteTemplates[trainerPicId]; + gMultiuseSpriteTemplate = sTrainerBackSpriteTemplate; + gMultiuseSpriteTemplate.images = &gTrainerBacksprites[trainerPicId].backPic; gMultiuseSpriteTemplate.anims = gTrainerBacksprites[trainerPicId].animation; } else diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index c15f4bc501..6dc2a69956 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -68,7 +68,7 @@ static bool16 DecompressPic(u16 species, u32 personality, bool8 isFrontPic, u8 * if (isFrontPic) DecompressPicFromTable(&gTrainerSprites[species].frontPic, dest); else - DecompressPicFromTable(&gTrainerBacksprites[species].backPic, dest); + CopyTrainerBackspriteFramesToDest(species, dest); } return FALSE; } @@ -357,3 +357,11 @@ u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass) } return gender; } + +void CopyTrainerBackspriteFramesToDest(u8 trainerPicId, u8 *dest) +{ + const struct SpriteFrameImage *frame = &gTrainerBacksprites[trainerPicId].backPic; + // y_offset is repurposed to indicates how many frames does the trainer pic have. + u32 size = (frame->size * gTrainerBacksprites[trainerPicId].coordinates.y_offset); + CpuSmartCopy16(frame->data, dest, size); +} From 10e55bd18ddb2b67972bd170fdd7ea1bfa9d8087 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 1 Jul 2025 17:49:31 +0200 Subject: [PATCH 101/248] Fixes Life Dew playing anim when it is not supposed to + tests (#7239) --- data/battle_scripts_1.s | 34 +++++++++- include/battle_scripts.h | 1 + include/constants/battle_move_effects.h | 1 + src/battle_script_commands.c | 8 +-- src/data/battle_move_effects.h | 6 ++ src/data/moves_info.h | 6 +- test/battle/move.c | 2 +- test/battle/move_effect/life_dew.c | 86 +++++++++++++++++++++++++ 8 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 test/battle/move_effect/life_dew.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f7e3c382d5..b2c4374857 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1038,7 +1038,6 @@ JungleHealing_RestoreTargetHealth: printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_JungleHealing_TryCureStatus: - jumpifmove MOVE_LIFE_DEW, BattleScript_JungleHealingTryRestoreAlly @ life dew only heals jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_JungleHealingCureStatus goto BattleScript_JungleHealingTryRestoreAlly BattleScript_JungleHealingCureStatus: @@ -1053,6 +1052,39 @@ BattleScript_JungleHealingTryRestoreAlly: setallytonexttarget JungleHealing_RestoreTargetHealth goto BattleScript_MoveEnd +BattleScript_EffectLifeDew:: + attackcanceler + attackstring + ppreduce + jumpiffullhp BS_ATTACKER, BattleScript_EffectLifeDewCheckPartner + copybyte gBattlerTarget, gBattlerAttacker + attackanimation + waitanimation + call BattleScript_EffectLifeDewHealing + jumpifabsent BS_ATTACKER_PARTNER, BattleScript_EffectLifeDewEnd + jumpiffullhp BS_ATTACKER_PARTNER, BattleScript_EffectLifeDewEnd + setallytonexttarget BattleScript_EffectLifeDewNextTarget +BattleScript_EffectLifeDewNextTarget: + call BattleScript_EffectLifeDewHealing +BattleScript_EffectLifeDewEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectLifeDewCheckPartner: + jumpifabsent BS_ATTACKER_PARTNER, BattleScript_ButItFailed + jumpiffullhp BS_ATTACKER_PARTNER, BattleScript_ButItFailed + attackanimation + waitanimation + setallytonexttarget BattleScript_EffectLifeDewNextTarget + +BattleScript_EffectLifeDewHealing: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + tryhealquarterhealth BS_TARGET, BattleScript_EffectLifeDewEnd + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + printstring STRINGID_PKMNREGAINEDHEALTH + waitmessage B_WAIT_TIME_LONG + return + BattleScript_EffectAllySwitch:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 379e45cd39..4531121cbd 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -343,6 +343,7 @@ extern const u8 BattleScript_GrassySurgeActivates[]; extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; extern const u8 BattleScript_EffectSpectralThief[]; +extern const u8 BattleScript_EffectLifeDew[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainHeals[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index f77a0d9799..aeda6b8cf7 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -348,6 +348,7 @@ enum BattleMoveEffects EFFECT_SPECTRAL_THIEF, EFFECT_RECOIL, EFFECT_SMACK_DOWN, + EFFECT_LIFE_DEW, NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 19f787dc9d..61cdfc65e6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14329,7 +14329,7 @@ static void Cmd_recoverbasedonsunlight(void) { u32 healingModifier = 1; u32 time = GetTimeOfDay(); - + switch (GetMoveEffect(gCurrentMove)) { case EFFECT_MOONLIGHT: @@ -14349,14 +14349,14 @@ static void Cmd_recoverbasedonsunlight(void) healingModifier = 1; break; } - + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; else if (gBattleWeather & B_WEATHER_SUN) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else // not sunny weather gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - + } if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) @@ -16446,7 +16446,7 @@ static void Cmd_setnonvolatilestatus(void) { CMD_ARGS(u8 trigger); gBattlescriptCurrInstr = cmd->nextInstr - 1; - + switch (cmd->trigger) { case TRIGGER_ON_ABILITY: diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index ca7e866e9c..54ad1c5cf7 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2212,4 +2212,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_LIFE_DEW] = + { + .battleScript = BattleScript_EffectLifeDew, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 08daab5a6b..7436eaf3f6 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -6056,7 +6056,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "User spins and removes some\n" #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 "effects, while upping speed."), - #else + #else "effects."), #endif .effect = EFFECT_RAPID_SPIN, @@ -18277,12 +18277,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters water to restore\n" "the HP of itself and allies."), - .effect = EFFECT_JUNGLE_HEALING, + .effect = EFFECT_LIFE_DEW, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = MOVE_TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, diff --git a/test/battle/move.c b/test/battle/move.c index 5a95c21d89..64500bb211 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -87,7 +87,7 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie GIVEN { ASSUME(GetMoveEffect(MOVE_ENDEAVOR) == EFFECT_ENDEAVOR); - ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_JUNGLE_HEALING); + ASSUME(GetMoveEffect(MOVE_LIFE_DEW) == EFFECT_LIFE_DEW); ASSUME(GetMoveEffect(MOVE_CRUSH_GRIP) == EFFECT_POWER_BASED_ON_TARGET_HP); ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); } diff --git a/test/battle/move_effect/life_dew.c b/test/battle/move_effect/life_dew.c new file mode 100644 index 0000000000..493c4c73e7 --- /dev/null +++ b/test/battle/move_effect/life_dew.c @@ -0,0 +1,86 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Life Dew fails if user and partner are both at full hp") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Life Dew recovers 25% of hp for both user and partner") +{ + s16 healing[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + HP_BAR(playerLeft, captureDamage: &healing[0]); + MESSAGE("Wobbuffet's HP was restored."); + HP_BAR(playerRight, captureDamage: &healing[1]); + MESSAGE("Wynaut's HP was restored."); + } THEN { + EXPECT_EQ(playerLeft->maxHP / 4, -healing[0]); + EXPECT_EQ(playerRight->maxHP / 4, -healing[1]); + } +} + +SINGLE_BATTLE_TEST("Life Dew works in singles on user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, player); + HP_BAR(player); + NOT HP_BAR(opponent); + } +} + +DOUBLE_BATTLE_TEST("Life Dew only works on user if partner is at full hp") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + HP_BAR(playerLeft); + NOT HP_BAR(playerRight); + } +} + +DOUBLE_BATTLE_TEST("Life Dew only works on partner if user is at full hp") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LIFE_DEW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIFE_DEW, playerLeft); + NOT HP_BAR(playerLeft); + HP_BAR(playerRight); + } +} From be2d36b6ee41086ac68a7309373bbb7d35b047a7 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:48:12 +0200 Subject: [PATCH 102/248] Fixes instances of battler mutation for abilities (#7250) --- charmap.txt | 2 +- data/battle_scripts_1.s | 52 ++++++++++++++++------------------------ include/battle_scripts.h | 1 - src/battle_message.c | 42 ++++++++++++++++---------------- src/battle_util.c | 28 +++++++--------------- 5 files changed, 52 insertions(+), 73 deletions(-) diff --git a/charmap.txt b/charmap.txt index 34fb683d0c..d3fb9d22e7 100644 --- a/charmap.txt +++ b/charmap.txt @@ -379,7 +379,7 @@ B_LAST_ITEM = FD 16 B_LAST_ABILITY = FD 17 B_ATK_ABILITY = FD 18 B_DEF_ABILITY = FD 19 -B_SCR_ACTIVE_ABILITY = FD 1A +B_SCR_ABILITY = FD 1A B_EFF_ABILITY = FD 1B B_TRAINER1_CLASS = FD 1C B_TRAINER1_NAME = FD 1D diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b2c4374857..150f2649ab 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6582,13 +6582,12 @@ BattleScript_PowerConstruct:: flushtextbox printstring STRINGID_POWERCONSTRUCTPRESENCEOFMANY waitmessage B_WAIT_TIME_SHORT - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - handleformchange BS_ATTACKER, 0 - handleformchange BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_POWER_CONSTRUCT + call BattleScript_AbilityPopUpScripting + handleformchange BS_SCRIPTING, 0 + handleformchange BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_POWER_CONSTRUCT waitanimation - handleformchange BS_ATTACKER, 2 + handleformchange BS_SCRIPTING, 2 printstring STRINGID_POWERCONSTRUCTTRANSFORM waitmessage B_WAIT_TIME_SHORT end3 @@ -6613,7 +6612,6 @@ BattleScript_GulpMissileFormChange:: BattleScript_AttackerFormChange:: pause 5 - copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp flushtextbox BattleScript_AttackerFormChangeNoPopup:: @@ -6632,27 +6630,17 @@ BattleScript_AttackerFormChangeEnd3NoPopup:: call BattleScript_AttackerFormChangeNoPopup end3 -BattleScript_AttackerFormChangeWithString:: +BattleScript_AttackerFormChangeWithStringEnd3:: pause 5 - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting flushtextbox -BattleScript_AttackerFormChangeWithStringNoPopup:: - handleformchange BS_ATTACKER, 0 - handleformchange BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE + handleformchange BS_SCRIPTING, 0 + handleformchange BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - handleformchange BS_ATTACKER, 2 + handleformchange BS_SCRIPTING, 2 printstring STRINGID_PKMNTRANSFORMED waitmessage B_WAIT_TIME_LONG - return - -BattleScript_AttackerFormChangeWithStringEnd3:: - call BattleScript_AttackerFormChangeWithString - end3 - -BattleScript_AttackerFormChangeWithStringEnd3NoPopup:: - call BattleScript_AttackerFormChangeWithStringNoPopup end3 BattleScript_AttackerFormChangeMoveEffect:: @@ -7708,6 +7696,8 @@ BattleScript_HospitalityActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET + restoreattacker + restoretarget end3 BattleScript_AttackWeakenedByStrongWinds:: @@ -8078,14 +8068,12 @@ BattleScript_TargetsStatWasMaxedOutRet: return BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet + call BattleScript_AbilityPopUpScripting + statbuffchange BS_SCRIPTING, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet waitanimation printstring STRINGID_BATTLERABILITYRAISEDSTAT waitmessage B_WAIT_TIME_LONG BattleScript_BattlerAbilityStatRaiseOnSwitchInRet: - copybyte gBattlerAttacker, sSAVED_BATTLER end3 BattleScript_ScriptingAbilityStatRaise:: @@ -8145,10 +8133,9 @@ BattleScript_RaiseStatOnFaintingTarget_End: return BattleScript_AttackerAbilityStatRaise:: - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End - copybyte gBattlerAbility, gBattlerAttacker - call BattleScript_AbilityPopUp - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerAbilityStatRaise_End + call BattleScript_AbilityPopUpScripting + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackerAbilityStatRaise_End printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_AttackerAbilityStatRaise_End: @@ -8214,6 +8201,8 @@ BattleScript_ImposterActivates:: waitanimation printstring STRINGID_IMPOSTERTRANSFORM waitmessage B_WAIT_TIME_LONG + restoreattacker + restoretarget end3 BattleScript_HurtAttacker: @@ -9327,6 +9316,7 @@ BattleScript_PastelVeilLoopIncrement: setallytonexttarget BattleScript_PastelVeil_TryCurePoison goto BattleScript_PastelVeilEnd BattleScript_PastelVeilEnd: + restoretarget end3 BattleScript_NeutralizingGasExits:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 4531121cbd..42c9b55e8c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -453,7 +453,6 @@ extern const u8 BattleScript_MirrorArmorReflect[]; extern const u8 BattleScript_GooeyActivates[]; extern const u8 BattleScript_PastelVeilActivates[]; extern const u8 BattleScript_AttackerFormChangeEnd3NoPopup[]; -extern const u8 BattleScript_AttackerFormChangeWithStringEnd3NoPopup[]; extern const u8 BattleScript_AttackerFormChangeMoveEffect[]; extern const u8 BattleScript_BothCanNoLongerEscape[]; extern const u8 BattleScript_OctolockEndTurn[]; diff --git a/src/battle_message.c b/src/battle_message.c index eb44ca96ee..82dd9fe040 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -194,7 +194,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PLAYERWHITEOUT2_WILD] = COMPOUND_STRING("You panicked and dropped ¥{B_BUFF1}…"), [STRINGID_PLAYERWHITEOUT2_TRAINER] = COMPOUND_STRING("You gave ¥{B_BUFF1} to the winner…"), [STRINGID_PLAYERWHITEOUT3] = COMPOUND_STRING("You were overwhelmed by your defeat!"), - [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p"), + [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ABILITY}!\p"), [STRINGID_HITXTIMES] = COMPOUND_STRING("The Pokémon was hit {B_BUFF1} time(s)!"), //SV has dynamic plural here [STRINGID_PKMNFELLASLEEP] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} fell asleep!"), [STRINGID_PKMNMADESLEEP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"), //not in gen 5+, ability popup @@ -355,8 +355,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNMOVEBOUNCED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} bounced the {B_CURRENT_MOVE} back!"), [STRINGID_PKMNWAITSFORTARGET] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} waits for a target to make a move!"), [STRINGID_PKMNSNATCHEDMOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} snatched {B_SCR_NAME_WITH_PREFIX2}'s move!"), - [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it rain!"), //not in gen 5+, ability popup - [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its Speed!"), //not in gen 5+, ability popup + [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it rain!"), //not in gen 5+, ability popup + [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its Speed!"), //not in gen 5+, ability popup [STRINGID_PKMNPROTECTEDBY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was protected by {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSUSAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"), //I don't see this in SV text [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup @@ -367,8 +367,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"), //not in gen 5+, ability popup [STRINGID_PKMNRAISEDFIREPOWERWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"), //not in gen 5+, ability popup [STRINGID_PKMNANCHORSITSELFWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} anchors itself with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup - [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup + [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup + [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTSWITH] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_PKMNTRACED] = COMPOUND_STRING("It traced {B_BUFF1}'s {B_BUFF2}!"), [STRINGID_STATSHARPLY] = gText_StatSharply, @@ -470,11 +470,11 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNSXPREVENTSBURNS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents burns!"), //not in gen 5+, ability popup [STRINGID_PKMNSXBLOCKSY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXRESTOREDHPALITTLE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} restored its HP a little!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup [STRINGID_PKMNSXINFATUATEDY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} infatuated {B_ATK_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXMADEYINEFFECTIVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} ineffective!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ITSUCKEDLIQUIDOOZE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sucked up the liquid ooze!"), [STRINGID_PKMNTRANSFORMED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} transformed!"), [STRINGID_ELECTRICITYWEAKENED] = COMPOUND_STRING("Electricity's power was weakened!"), @@ -493,7 +493,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNTRAPPEDBYSANDTOMB] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became trapped by the quicksand!"), [STRINGID_EMPTYSTRING4] = COMPOUND_STRING(""), [STRINGID_ABOOSTED] = COMPOUND_STRING(" a boosted"), - [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup [STRINGID_PKMNMAKESGROUNDMISS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} makes Ground-type moves miss with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_YOUTHROWABALLNOWRIGHT] = COMPOUND_STRING("You throw a Ball now, right? I… I'll do my best!"), [STRINGID_PKMNSXTOOKATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} took the attack!"), //In gen 5+ but without naming the ability @@ -508,17 +508,17 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TRAINER1USEDITEM] = COMPOUND_STRING("{B_ATK_TRAINER_NAME_WITH_CLASS} used {B_LAST_ITEM}!"), [STRINGID_BOXISFULL] = COMPOUND_STRING("The Box is full! You can't catch any more!\p"), [STRINGID_PKMNAVOIDEDATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided the attack!"), - [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it ineffective!"), //not in gen 5+, ability popup [STRINGID_PKMNSXPREVENTSFLINCHING] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents flinching!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYHASBURN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already burned!"), [STRINGID_STATSWONTDECREASE2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stats won't go any lower!"), - [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWOREOFF] = COMPOUND_STRING("{B_ATK_TEAM1} team's {B_BUFF1} wore off!"), [STRINGID_PKMNRAISEDDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised DEFENSE a little!"), //expansion doesn't use anymore [STRINGID_PKMNRAISEDSPDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised SP. DEF a little!"), //expansion doesn't use anymore [STRINGID_THEWALLSHATTERED] = COMPOUND_STRING("The wall shattered!"), //not in gen5+, uses "your teams light screen wore off!" etc instead [STRINGID_PKMNSXPREVENTSYSZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), - [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ATTACKERCANTESCAPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can't escape!"), [STRINGID_PKMNOBTAINEDX] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} obtained {B_BUFF1}."), [STRINGID_PKMNOBTAINEDX2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} obtained {B_BUFF2}."), @@ -613,7 +613,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_GRASSYTERRAINENDS] = COMPOUND_STRING("The grass disappeared from the battlefield."), [STRINGID_TARGETABILITYSTATRAISE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised its {B_BUFF1}!"), [STRINGID_TARGETSSTATWASMAXEDOUT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed its {B_BUFF1}!"), - [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), [STRINGID_POISONHEALHPUP] = COMPOUND_STRING("The poisoning healed {B_ATK_NAME_WITH_PREFIX2} a little bit!"), //don't think this message is displayed anymore [STRINGID_BADDREAMSDMG] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is tormented!"), [STRINGID_MOLDBREAKERENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} breaks the mold!"), @@ -624,11 +624,11 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SOLARPOWERHPDROP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} takes its toll!"), //don't think this message is displayed anymore [STRINGID_AFTERMATHDMG] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt!"), [STRINGID_ANTICIPATIONACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} shuddered!"), - [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), + [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_ICEBODYHPGAIN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} healed it a little bit!"), //don't think this message is displayed anymore [STRINGID_SNOWWARNINGHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_FRISKACTIVATES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX2} and found its {B_LAST_ITEM}!"), - [STRINGID_UNNERVEENTERS] = COMPOUND_STRING("{B_DEF_TEAM1} team is too nervous to eat Berries!"), + [STRINGID_UNNERVEENTERS] = COMPOUND_STRING("{B_SCR_TEAM1} team is too nervous to eat Berries!"), [STRINGID_HARVESTBERRY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} harvested its {B_LAST_ITEM}!"), [STRINGID_MAGICBOUNCEACTIVATES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} bounced the {B_ATK_NAME_WITH_PREFIX2} back!"), [STRINGID_PROTEANTYPECHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed it into the {B_BUFF1} type!"), @@ -702,8 +702,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ATTACKERCUREDTARGETSTATUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cured {B_DEF_NAME_WITH_PREFIX2}'s problem!"), [STRINGID_ATTACKERLOSTFIRETYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} burned itself out!"), [STRINGID_HEALERCURE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} cured {B_SCR_NAME_WITH_PREFIX2}'s problem!"), - [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), - [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} was taken over!"), + [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} was taken over!"), [STRINGID_PKNMABSORBINGPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is absorbing power!"), [STRINGID_NOONEWILLBEABLETORUNAWAY] = COMPOUND_STRING("No one will be able to run away during the next turn!"), [STRINGID_DESTINYKNOTACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!"), @@ -718,7 +718,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_COMATOSEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is drowsing!"), [STRINGID_SCREENCLEANERENTERS] = COMPOUND_STRING("All screens on the field were cleansed!"), [STRINGID_FETCHEDPOKEBALL] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!"), - [STRINGID_BATTLERABILITYRAISEDSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_BATTLERABILITYRAISEDSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), [STRINGID_ASANDSTORMKICKEDUP] = COMPOUND_STRING("A sandstorm kicked up!"), [STRINGID_PKMNSWILLPERISHIN3TURNS] = COMPOUND_STRING("Both Pokémon will perish in three turns!"), //don't think this message is displayed anymore [STRINGID_ABILITYRAISEDSTATDRASTICALLY] = COMPOUND_STRING("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1} drastically!"), @@ -794,9 +794,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SUNLIGHTACTIVATEDABILITY] = COMPOUND_STRING("The harsh sunlight activated {B_SCR_NAME_WITH_PREFIX2}'s Protosynthesis!"), [STRINGID_STATWASHEIGHTENED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"), [STRINGID_ELECTRICTERRAINACTIVATEDABILITY] = COMPOUND_STRING("The Electric Terrain activated {B_SCR_NAME_WITH_PREFIX2}'s Quark Drive!"), - [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p"), + [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p"), [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} gained strength from the fallen!"), - [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup + [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup [STRINGID_PREPARESHELLTRAP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} set a shell trap!"), [STRINGID_SHELLTRAPDIDNTWORK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!"), [STRINGID_SPIKESDISAPPEAREDFROMTEAM] = COMPOUND_STRING("The spikes disappeared from the ground around {B_ATK_TEAM2} team!"), @@ -866,7 +866,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BIZARREAREACREATED] = COMPOUND_STRING("A bizarre area was created in which Defense and Sp. Def stats are swapped!"), [STRINGID_TIDYINGUPCOMPLETE] = COMPOUND_STRING("Tidying up complete!"), [STRINGID_PKMNTERASTALLIZEDINTO] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} terastallized into the {B_BUFF1} type!"), - [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!"), + [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ABILITY}!"), [STRINGID_FOGCREPTUP] = COMPOUND_STRING("Fog crept up as thick as soup!"), [STRINGID_FOGISDEEP] = COMPOUND_STRING("The fog is deep…"), [STRINGID_FOGLIFTED] = COMPOUND_STRING("The fog lifted."), diff --git a/src/battle_util.c b/src/battle_util.c index 0dd60674ca..c4a957a40d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3533,8 +3533,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gBattleStruct->tracedAbility[battler] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability - gBattlerAbility = battler; - PREPARE_MON_NICK_WITH_PREFIX_LOWER_BUFFER(gBattleTextBuff1, chosenTarget, gBattlerPartyIndexes[chosenTarget]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) } @@ -3555,6 +3553,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleStruct->illusion[diagonalBattler].state != ILLUSION_ON && !(gStatuses3[diagonalBattler] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER)) { + SaveBattlerAttacker(gBattlerAttacker); + SaveBattlerTarget(gBattlerTarget); gBattlerAttacker = battler; gBattlerTarget = diagonalBattler; BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); @@ -3602,7 +3602,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { - gBattlerTarget = GetOppositeBattler(battler); + gBattleScripting.battler = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3614,7 +3614,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { - gBattlerTarget = GetOppositeBattler(battler); + gBattleScripting.battler = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3636,6 +3636,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_PASTEL_VEIL: if (!gSpecialStatuses[battler].switchInAbilityDone) { + SaveBattlerTarget(gBattlerTarget); gBattlerTarget = battler; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); @@ -3683,7 +3684,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_FriskActivates); // Try activate effect++; } @@ -3728,7 +3728,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { SET_STATCHANGER(statId, 1, FALSE); - gBattlerAttacker = battler; PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); effect++; @@ -3921,7 +3920,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SHIELDS_DOWN: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); effect++; } @@ -3930,8 +3928,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; if (B_INTREPID_SWORD == GEN_9) gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3944,8 +3940,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN) && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; if (B_DAUNTLESS_SHIELD == GEN_9) gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -3959,8 +3953,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4081,6 +4073,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[partner].hp < gBattleMons[partner].maxHP && IsBattlerAlive(partner)) { + SaveBattlerAttacker(gBattlerAttacker); + SaveBattlerTarget(gBattlerTarget); gBattlerTarget = partner; gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; @@ -4109,8 +4103,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_EQUAL)) break; - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(stat, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4122,7 +4114,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[battler].species == SPECIES_TERAPAGOS_NORMAL && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_SWITCH)) { - gBattlerAttacker = battler; gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_TERA_SHIFT; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeWithStringEnd3); @@ -4344,7 +4335,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SHIELDS_DOWN: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); effect++; } @@ -4352,7 +4342,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_POWER_CONSTRUCT: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - gBattlerAttacker = battler; + gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_PowerConstruct); effect++; } @@ -4376,7 +4366,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetActiveGimmick(battler) != GIMMICK_TERA && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_TURN_END)) { - gBattlerAttacker = battler; + gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3NoPopup); effect++; } From 92b4b7f0a00a9ec14d1485d41500a00876026cb7 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:06:23 +0200 Subject: [PATCH 103/248] Keep removed headers (#7261) --- include/gba/defines.h | 1 + ld_script_modern.ld | 5 +++-- ld_script_test.ld | 5 +++-- src/agb_flash_1m.c | 2 +- src/rom_header.s | 16 ++++++++-------- src/rom_header_gf.c | 5 ++--- src/rom_header_rhh.c | 3 +-- src/siirtc.c | 2 +- 8 files changed, 20 insertions(+), 19 deletions(-) diff --git a/include/gba/defines.h b/include/gba/defines.h index fe775820d8..481f203052 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -13,6 +13,7 @@ #define COMMON_DATA __attribute__((section("common_data"))) #define UNUSED __attribute__((unused)) #define USED __attribute__((used)) +#define KEEP_SECTION __attribute__((section(".text.consts"))) #define ARM_FUNC __attribute__((target("arm"))) diff --git a/ld_script_modern.ld b/ld_script_modern.ld index f021ac2916..47989bd91f 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -54,14 +54,15 @@ SECTIONS { ALIGN(4) { src/rom_header.o(.text*); - src/rom_header_gf.o(.text.*); - src/rom_header_rhh.o(.text.*); + KEEP(*.o(.text.header_gf)); + KEEP(*.o(.text.header_rhh)); src/crt0.o(.text); *libagbsyscall.a:*.o(.text*); *libgcc.a:*.o(.text*); *libc.a:*.o(.text*); *libnosys.a:*.o(.text*); asm/*.o(.text*); + KEEP(*.o(.text.consts)); *.o(.text*); *.o(.eh_frame); } > ROM =0 diff --git a/ld_script_test.ld b/ld_script_test.ld index d279d6b4f6..e1c21bcfbc 100644 --- a/ld_script_test.ld +++ b/ld_script_test.ld @@ -75,8 +75,9 @@ SECTIONS { ALIGN(4) { src/rom_header.o(.text); - src/rom_header_gf.o(.text.*); - src/rom_header_rhh.o(.text.*); + KEEP(*.o(.text.header_gf)); + KEEP(*.o(.text.header_rhh)); + KEEP(*.o(.text.consts)); src/*.o(.text); } > ROM =0 diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c index 49696a7bbf..3e2ad719c6 100644 --- a/src/agb_flash_1m.c +++ b/src/agb_flash_1m.c @@ -1,7 +1,7 @@ #include "gba/gba.h" #include "gba/flash_internal.h" -USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; +KEEP_SECTION USED static const char AgbLibFlashVersion[] = "FLASH1M_V103"; static const struct FlashSetupInfo *const sSetupInfos[] = { diff --git a/src/rom_header.s b/src/rom_header.s index 5ced627a39..eed3c53c63 100644 --- a/src/rom_header.s +++ b/src/rom_header.s @@ -7,34 +7,34 @@ Start:: RomHeaderNintendoLogo:: .space 156 -RomHeaderGameTitle: +RomHeaderGameTitle:: .space 12 RomHeaderGameCode:: .space 4 -RomHeaderMakerCode: +RomHeaderMakerCode:: .space 2 -RomHeaderMagic: +RomHeaderMagic:: .byte 0 -RomHeaderMainUnitCode: +RomHeaderMainUnitCode:: .byte 0 -RomHeaderDeviceType: +RomHeaderDeviceType:: .byte 0 -RomHeaderReserved1: +RomHeaderReserved1:: .space 7 RomHeaderSoftwareVersion:: .byte 0 -RomHeaderChecksum: +RomHeaderChecksum:: .byte 0 -RomHeaderReserved2: +RomHeaderReserved2:: .space 2 .word 0 diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 5613fe6152..1662850352 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -97,9 +97,8 @@ struct GFRomHeader }; // This seems to need to be in the text section for some reason. -// To avoid a changed section attributes warning it's put in a special .text.consts section. -__attribute__((section(".text.consts"))) -USED static const struct GFRomHeader sGFRomHeader = { +// To avoid a changed section attributes warning it's put in a special .text.header_gf section. +__attribute__((section(".text.header_gf"))) USED static const struct GFRomHeader sGFRomHeader = { .version = GAME_VERSION, .language = GAME_LANGUAGE, .gameName = "pokemon emerald version", diff --git a/src/rom_header_rhh.c b/src/rom_header_rhh.c index e9310415c3..9a97948e8a 100644 --- a/src/rom_header_rhh.c +++ b/src/rom_header_rhh.c @@ -27,8 +27,7 @@ struct RHHRomHeader /*0x17*/ u8 padding; }; -__attribute__((section(".text.consts"))) -USED static const struct RHHRomHeader sRHHRomHeader = +__attribute__((section(".text.header_rhh"))) USED static const struct RHHRomHeader sRHHRomHeader = { .rhh_magic = { 'R', 'H', 'H', 'E', 'X', 'P' }, .expansionVersionMajor = EXPANSION_VERSION_MAJOR, diff --git a/src/siirtc.c b/src/siirtc.c index 5c511f6815..ecce71a03c 100644 --- a/src/siirtc.c +++ b/src/siirtc.c @@ -75,7 +75,7 @@ static u8 ReadData(); static void EnableGpioPortRead(); static void DisableGpioPortRead(); -USED static const char AgbLibRtcVersion[] = "SIIRTC_V001"; +KEEP_SECTION USED static const char AgbLibRtcVersion[] = "SIIRTC_V001"; void SiiRtcUnprotect(void) { From e503f97f322e7ab99d9fd95d4bcd42ef96adae0f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:08:12 +0200 Subject: [PATCH 104/248] Use dedicated functions for Mud/Water Sport (#7248) --- include/battle_util.h | 5 -- include/constants/battle.h | 4 +- src/battle_ai_main.c | 4 +- src/battle_debug.c | 8 +-- src/battle_main.c | 2 +- src/battle_script_commands.c | 8 +-- src/battle_util.c | 70 ++++++++++++++------------- test/battle/move_effect/mud_sport.c | 30 ++++++++++++ test/battle/move_effect/water_sport.c | 30 ++++++++++++ 9 files changed, 108 insertions(+), 53 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 5e86fc615a..81a3466bda 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -54,7 +54,6 @@ enum { ABILITYEFFECT_ATK_SYNCHRONIZE, ABILITYEFFECT_MOVE_END_OTHER, ABILITYEFFECT_NEUTRALIZINGGAS, - ABILITYEFFECT_FIELD_SPORT, // Only used if B_SPORT_TURNS >= GEN_6 ABILITYEFFECT_ON_WEATHER, ABILITYEFFECT_ON_TERRAIN, ABILITYEFFECT_SWITCH_IN_TERRAIN, @@ -63,10 +62,6 @@ enum { ABILITYEFFECT_SWITCH_IN_STATUSES, }; -// Special cases -#define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS >= GEN_6 -#define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS >= GEN_6 - // For the first argument of ItemBattleEffects, to deteremine which block of item effects to try enum ItemCaseId { diff --git a/include/constants/battle.h b/include/constants/battle.h index a3af32bb4a..2ebf99ebce 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -167,7 +167,9 @@ enum VolatileFlags F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) + F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) /* Use within a macro to get the maximum allowed value for a volatile. Requires _typeBitSize and debug parameters as input. */ #define GET_VOLATILE_MAXIMUM(_typeBitSize, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeBitSize) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 3a43503719..78693b1950 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2050,13 +2050,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MUD_SPORT: if (gFieldStatuses & STATUS_FIELD_MUDSPORT - || gStatuses4[battlerAtk] & STATUS4_MUD_SPORT + || gBattleMons[battlerAtk].volatiles.mudSport || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_WATER_SPORT: if (gFieldStatuses & STATUS_FIELD_WATERSPORT - || gStatuses4[battlerAtk] & STATUS4_WATER_SPORT + || gBattleMons[battlerAtk].volatiles.waterSport || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; diff --git a/src/battle_debug.c b/src/battle_debug.c index 8282dcadbb..b91ca4b5e4 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -169,8 +169,6 @@ enum enum { LIST_STATUS4_ELECTRIFIED, - LIST_STATUS4_MUD_SPORT, - LIST_STATUS4_WATER_SPORT, LIST_STATUS4_SALT_CURE, LIST_STATUS4_SYRUP_BOMB, LIST_STATUS4_GLAIVE_RUSH, @@ -348,8 +346,6 @@ static const u8 sText_LaserFocus[] = _("Laser Focus"); static const u8 sText_PowerTrick[] = _("Power Trick"); static const u8 sText_SkyDropped[] = _("Sky Dropped"); static const u8 sText_Electrified[] = _("Electrified"); -static const u8 sText_MudSport[] = _("Mud Sport"); -static const u8 sText_WaterSport[] = _("Water Sport"); static const u8 sText_InfiniteConfusion[] = _("Infinite Confusion"); static const u8 sText_SaltCure[] = _("Salt Cure"); static const u8 sText_SyrupBomb[] = _("Syrup Bomb"); @@ -548,6 +544,8 @@ static const struct ListMenuItem sVolatileStatusListItems[] = {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, + {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, + {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, }; static const struct ListMenuItem sStatus3ListItems[] = @@ -580,8 +578,6 @@ static const struct ListMenuItem sStatus3ListItems[] = static const struct ListMenuItem sStatus4ListItems[] = { {sText_Electrified, LIST_STATUS4_ELECTRIFIED}, - {sText_MudSport, LIST_STATUS4_MUD_SPORT}, - {sText_WaterSport, LIST_STATUS4_WATER_SPORT}, {sText_SaltCure, LIST_STATUS4_SALT_CURE}, {sText_SyrupBomb, LIST_STATUS4_SYRUP_BOMB}, {sText_GlaiveRush, LIST_STATUS4_GLAIVE_RUSH}, diff --git a/src/battle_main.c b/src/battle_main.c index 4427093e30..b0f2392231 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3156,7 +3156,7 @@ void SwitchInClearSetData(u32 battler) gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); - gStatuses4[battler] &= (STATUS4_MUD_SPORT | STATUS4_WATER_SPORT | STATUS4_INFINITE_CONFUSION); + gStatuses4[battler] &= STATUS4_INFINITE_CONFUSION; for (i = 0; i < gBattlersCount; i++) { if (!IsBattlerAlly(battler, i) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 61cdfc65e6..1a0e933383 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15393,9 +15393,9 @@ static void Cmd_settypebasedhalvers(void) } else { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_MUD_SPORT)) + if (!gBattleMons[gBattlerAttacker].volatiles.waterSport) { - gStatuses4[gBattlerAttacker] |= STATUS4_MUD_SPORT; + gBattleMons[gBattlerAttacker].volatiles.waterSport = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } @@ -15415,9 +15415,9 @@ static void Cmd_settypebasedhalvers(void) } else { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_WATER_SPORT)) + if (!gBattleMons[gBattlerAttacker].volatiles.mudSport) { - gStatuses4[gBattlerAttacker] |= STATUS4_WATER_SPORT; + gBattleMons[gBattlerAttacker].volatiles.mudSport = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } diff --git a/src/battle_util.c b/src/battle_util.c index c4a957a40d..60fdf39b65 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5199,35 +5199,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; } break; - case ABILITYEFFECT_FIELD_SPORT: - switch (gLastUsedAbility) - { - case ABILITYEFFECT_MUD_SPORT: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses4[i] & STATUS4_MUD_SPORT) - effect = i + 1; - } - break; - case ABILITYEFFECT_WATER_SPORT: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses4[i] & STATUS4_WATER_SPORT) - effect = i + 1; - } - break; - default: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - } - break; case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) @@ -7933,6 +7904,40 @@ u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter) return basePower; } +static inline u32 IsFieldMudSportAffected(u32 moveType) +{ + if (moveType == TYPE_ELECTRIC && (gFieldStatuses & STATUS_FIELD_MUDSPORT)) + return TRUE; + + if (B_SPORT_TURNS < GEN_6) + { + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.mudSport) + return TRUE; + } + } + + return FALSE; +} + +static inline u32 IsFieldWaterSportAffected(u32 moveType) +{ + if (moveType == TYPE_FIRE && (gFieldStatuses & STATUS_FIELD_WATERSPORT)) + return TRUE; + + if (B_SPORT_TURNS < GEN_6) + { + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.waterSport) + return TRUE; + } + } + + return FALSE; +} + static inline u32 CalcMoveBasePower(struct DamageContext *ctx) { u32 battlerAtk = ctx->battlerAtk; @@ -8268,12 +8273,9 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - - if (moveType == TYPE_ELECTRIC && ((gFieldStatuses & STATUS_FIELD_MUDSPORT) - || AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0))) + if (IsFieldMudSportAffected(ctx->moveType)) modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); - if (moveType == TYPE_FIRE && ((gFieldStatuses & STATUS_FIELD_WATERSPORT) - || AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0))) + if (IsFieldWaterSportAffected(ctx->moveType)) modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); // attacker's abilities diff --git a/test/battle/move_effect/mud_sport.c b/test/battle/move_effect/mud_sport.c index 143bbe1447..ff483699b4 100644 --- a/test/battle/move_effect/mud_sport.c +++ b/test/battle/move_effect/mud_sport.c @@ -2,3 +2,33 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Mud Sport (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 67% (Gen5+)") +{ + s16 playerDmg[2]; + s16 opponentDmg[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHOCK_WAVE); MOVE(opponent, MOVE_SHOCK_WAVE); } + TURN { MOVE(player, MOVE_MUD_SPORT); } + TURN { MOVE(player, MOVE_SHOCK_WAVE); MOVE(opponent, MOVE_SHOCK_WAVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, opponent); + HP_BAR(player, captureDamage: &playerDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MUD_SPORT, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHOCK_WAVE, opponent); + HP_BAR(player, captureDamage: &playerDmg[1]); + + } THEN { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } +} diff --git a/test/battle/move_effect/water_sport.c b/test/battle/move_effect/water_sport.c index f7521c1fcc..cf4ec929c3 100644 --- a/test/battle/move_effect/water_sport.c +++ b/test/battle/move_effect/water_sport.c @@ -2,3 +2,33 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Water Sport (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 67% (Gen5+)") +{ + s16 playerDmg[2]; + s16 opponentDmg[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FIRE_PLEDGE); MOVE(opponent, MOVE_FIRE_PLEDGE); } + TURN { MOVE(player, MOVE_WATER_SPORT); } + TURN { MOVE(player, MOVE_FIRE_PLEDGE); MOVE(opponent, MOVE_FIRE_PLEDGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponent); + HP_BAR(player, captureDamage: &playerDmg[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_SPORT, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, player); + HP_BAR(opponent, captureDamage: &opponentDmg[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PLEDGE, opponent); + HP_BAR(player, captureDamage: &playerDmg[1]); + + } THEN { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } +} From c27cc2ed705b93a0e649dc8d88ff0f95a6747494 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:16:05 +0200 Subject: [PATCH 105/248] Script clean up for Flame Burst and Costar (#7264) --- data/battle_scripts_1.s | 17 +++++------------ src/battle_message.c | 2 +- src/battle_script_commands.c | 3 +-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 150f2649ab..ffcd8b7d82 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1573,16 +1573,12 @@ BattleScript_EffectAfterYou:: BattleScript_MoveEffectFlameBurst:: tryfaintmon BS_TARGET - copybyte sBATTLER, sSAVED_BATTLER printstring STRINGID_BURSTINGFLAMESHIT waitmessage B_WAIT_TIME_LONG - savetarget - copybyte gBattlerTarget, sSAVED_BATTLER orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - tryfaintmon BS_TARGET - restoretarget + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING + tryfaintmon BS_SCRIPTING goto BattleScript_MoveEnd BattleScript_EffectPowerTrick:: @@ -7634,12 +7630,9 @@ BattleScript_SupremeOverlordActivates:: BattleScript_CostarActivates:: pause B_WAIT_TIME_SHORT - savetarget - copybyte gBattlerTarget, sBATTLER call BattleScript_AbilityPopUp printstring STRINGID_PKMNCOPIEDSTATCHANGES waitmessage B_WAIT_TIME_LONG - restoretarget end3 BattleScript_ZeroToHeroActivates:: @@ -8187,11 +8180,11 @@ BattleScript_FriskMsg:: BattleScript_FriskActivates:: saveattacker - savetarget + savetarget copybyte gBattlerAttacker, sBATTLER tryfriskmsg BS_SCRIPTING restoreattacker - restoretarget + restoretarget end3 BattleScript_ImposterActivates:: diff --git a/src/battle_message.c b/src/battle_message.c index 82dd9fe040..9082bbef6c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -318,7 +318,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNENDUREDHIT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} endured the hit!"), [STRINGID_MAGNITUDESTRENGTH] = COMPOUND_STRING("Magnitude {B_BUFF1}!"), [STRINGID_PKMNCUTHPMAXEDATTACK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cut its own HP and maximized its Attack!"), - [STRINGID_PKMNCOPIEDSTATCHANGES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} copied {B_DEF_NAME_WITH_PREFIX2}'s stat changes!"), + [STRINGID_PKMNCOPIEDSTATCHANGES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} copied {B_SCR_NAME_WITH_PREFIX2}'s stat changes!"), [STRINGID_PKMNGOTFREE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} got free of {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, generic rapid spin? [STRINGID_PKMNSHEDLEECHSEED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} shed Leech Seed!"), //not in gen 5+, generic rapid spin? [STRINGID_PKMNBLEWAWAYSPIKES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} blew away Spikes!"), //not in gen 5+, generic rapid spin? diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1a0e933383..f51561eab0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3712,8 +3712,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { - i = BATTLE_PARTNER(gBattlerTarget); - gBattleScripting.savedBattler = i; + gBattleScripting.battler = i = BATTLE_PARTNER(gBattlerTarget); gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; if (gBattleStruct->moveDamage[i] == 0) gBattleStruct->moveDamage[i] = 1; From b3f52166dfaa2ce06ec20dd499aefc241acad6f1 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 4 Jul 2025 05:06:36 -0400 Subject: [PATCH 106/248] Changing P_ONLY_OBTAINABLE_SHINIES to truly be Only Obtainable Shinies (#7275) --- include/config/pokemon.h | 2 +- src/pokemon.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/config/pokemon.h b/include/config/pokemon.h index 92b0f3bd64..fdee4e8ad2 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -58,7 +58,7 @@ #define P_CAN_FORGET_HIDDEN_MOVE FALSE // If TRUE, Pokémon can forget any move, even if it is a Hidden Move. #define P_ASK_MOVE_CONFIRMATION FALSE // If FALSE, when a player decides not to learn a Move, the game does not ask the player for confirmation. #define P_EGG_CYCLE_LENGTH GEN_LATEST // Since Gen 8, egg cycles take half as many steps as before. Previous Gens have some varied step counts around 255. -#define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, Pokémon encountered in the Battle Pyramid won't be shiny. +#define P_ONLY_OBTAINABLE_SHINIES FALSE // If TRUE, Pokémon encountered in the Battle Pyramid or while catching is disabled won't be shiny. #define P_NO_SHINIES_WITHOUT_POKEBALLS FALSE // If TRUE, Pokémon encountered when the player is out of Poké Balls won't be shiny #define P_SHOW_DYNAMIC_TYPES FALSE // If TRUE, all moves with dynamic type changes will be reflected as their current type in battle/summary screens instead of just select ones like in vanilla. diff --git a/src/pokemon.c b/src/pokemon.c index 12f2860435..1ed82d39c4 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1081,7 +1081,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, { isShiny = TRUE; } - else if (P_ONLY_OBTAINABLE_SHINIES && InBattlePyramid()) + else if (P_ONLY_OBTAINABLE_SHINIES && (InBattlePyramid() || (B_FLAG_NO_CATCHING != 0 && FlagGet(B_FLAG_NO_CATCHING)))) { isShiny = FALSE; } From e8abfbce496a97f225938131017ec03c77ff4e2d Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 4 Jul 2025 18:07:53 +0100 Subject: [PATCH 107/248] Untangled TMs and HMs from item ids (#7173) --- include/constants/items.h | 3 - include/item.h | 124 ++++++++++++++++++++++++++++------- include/metaprogram.h | 24 ++++++- include/pokemon.h | 3 +- src/apprentice.c | 8 +-- src/battle_dome.c | 7 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 2 +- src/data/items.h | 108 ------------------------------ src/daycare.c | 4 +- src/debug.c | 5 +- src/evolution_scene.c | 4 +- src/field_specials.c | 3 +- src/item.c | 25 ++++++- src/item_icon.c | 12 ++-- src/item_menu.c | 8 +-- src/item_use.c | 2 +- src/party_menu.c | 20 +----- src/pokedex_plus_hgss.c | 16 ++--- src/pokemon.c | 28 ++++---- src/pokemon_summary_screen.c | 2 +- 21 files changed, 201 insertions(+), 209 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index 0abfc31a44..58f453414f 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -1027,9 +1027,6 @@ #define MAIL_NONE 0xFF #define ITEM_TO_MULCH(itemId)(((itemId) - ITEM_GROWTH_MULCH) + 1) -#define NUM_TECHNICAL_MACHINES 100 -#define NUM_HIDDEN_MACHINES 8 - #define MAX_BAG_ITEM_CAPACITY 999 #define MAX_PC_ITEM_CAPACITY 999 #define MAX_PYRAMID_BAG_ITEM_CAPACITY 99 // Values higher than 255 require free SaveBlock2 space. diff --git a/include/item.h b/include/item.h index 7fcdb37fe3..b14d9bdf14 100644 --- a/include/item.h +++ b/include/item.h @@ -3,8 +3,44 @@ #include "constants/item.h" #include "constants/items.h" +#include "constants/moves.h" #include "constants/tms_hms.h" +/* Expands to: + * enum + * { + * ITEM_TM_FOCUS_PUNCH = ITEM_TM01, + * ... + * ITEM_HM_CUT = ITM_HM01, + * ... + * }; */ +#define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n), +#define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n), +#define TO_TMHM_NUMS(a, ...) (__VA_ARGS__) +enum TMHMItemId +{ + RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA)))) + RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA)))) +}; + +#undef ENUM_TM +#undef ENUM_HM +#undef TO_TMHM_NUMS + +/* Each of these TM_HM enums corresponds an index in the list of TMs + HMs item ids in + * gTMHMItemMoveIds. The index for an item can be retrieved with GetItemTMHMIndex below. + */ +#define UNPACK_TM_HM_ENUM(_tmHm) CAT(ENUM_TM_HM_, _tmHm), +enum TMHMIndex +{ + FOREACH_TMHM(UNPACK_TM_HM_ENUM) + NUM_ALL_MACHINES, + NUM_TECHNICAL_MACHINES = (0 FOREACH_TM(PLUS_ONE)), + NUM_HIDDEN_MACHINES = (0 FOREACH_HM(PLUS_ONE)), +}; + +#undef UNPACK_TM_HM_ENUM + typedef void (*ItemUseFunc)(u8); struct Item @@ -20,8 +56,8 @@ struct Item u8 holdEffectParam; u8 importance:2; u8 notConsumed:1; - u8 padding:5; - enum Pocket pocket:8; + enum Pocket pocket:5; + u8 padding; u8 type; u8 battleUsage; u8 flingPower; @@ -29,14 +65,75 @@ struct Item const u16 *iconPalette; }; -struct __attribute__((packed, aligned(2))) BagPocket +struct ALIGNED(2) BagPocket { struct ItemSlot *itemSlots; u16 capacity; }; +struct TmHmIndexKey +{ + enum TMHMItemId itemId:16; + u16 moveId; +}; + extern const struct Item gItemsInfo[]; extern struct BagPocket gBagPockets[]; +extern const struct TmHmIndexKey gTMHMItemMoveIds[]; + +#define UNPACK_ITEM_TO_TM_INDEX(_tm) case CAT(ITEM_TM_, _tm): return CAT(ENUM_TM_HM_, _tm) + 1; +#define UNPACK_ITEM_TO_HM_INDEX(_hm) case CAT(ITEM_HM_, _hm): return CAT(ENUM_TM_HM_, _hm) + 1; +#define UNPACK_ITEM_TO_TM_MOVE_ID(_tm) case CAT(ITEM_TM_, _tm): return CAT(MOVE_, _tm); +#define UNPACK_ITEM_TO_HM_MOVE_ID(_hm) case CAT(ITEM_HM_, _hm): return CAT(MOVE_, _hm); + +static inline enum TMHMIndex GetItemTMHMIndex(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return 1; + * case ITEM_TM_DRAGON_CLAW: + * return 2; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_INDEX) + FOREACH_HM(UNPACK_ITEM_TO_HM_INDEX) + default: + return 0; + } +} + +static inline u16 GetItemTMHMMoveId(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return MOVE_FOCUS_PUNCH; + * case ITEM_TM_DRAGON_CLAW: + * return MOVE_DRAGON_CLAW; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_MOVE_ID) + FOREACH_HM(UNPACK_ITEM_TO_HM_MOVE_ID) + default: + return MOVE_NONE; + } +} + +#undef UNPACK_ITEM_TO_TM_INDEX +#undef UNPACK_ITEM_TO_HM_INDEX +#undef UNPACK_ITEM_TO_TM_MOVE_ID +#undef UNPACK_ITEM_TO_HM_MOVE_ID + +static inline enum TMHMItemId GetTMHMItemId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].itemId; +} + +static inline u16 GetTMHMMoveId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].moveId; +} u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos); u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos); @@ -85,25 +182,4 @@ u32 GetItemStatus1Mask(u16 itemId); u32 GetItemStatus2Mask(u16 itemId); u32 GetItemSellPrice(u32 itemId); -/* Expands to: - * enum - * { - * ITEM_TM_FOCUS_PUNCH, - * ... - * ITEM_HM_CUT, - * ... - * }; */ -#define ENUM_TM(id) CAT(ITEM_TM_, id), -#define ENUM_HM(id) CAT(ITEM_HM_, id), -enum -{ - ENUM_TM_START_ = ITEM_TM01 - 1, - FOREACH_TM(ENUM_TM) - - ENUM_HM_START_ = ITEM_HM01 - 1, - FOREACH_HM(ENUM_HM) -}; -#undef ENUM_TM -#undef ENUM_HM - #endif // GUARD_ITEM_H diff --git a/include/metaprogram.h b/include/metaprogram.h index e12822946a..47fa99af72 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -26,8 +26,9 @@ #define STR(...) STR_(__VA_ARGS__) #define STR_(...) #__VA_ARGS__ -/* You'll never guess what this one does */ +/* You'll never guess what these do */ #define APPEND_SEMICOLON(a) a; +#define APPEND_COMMA(a) a, /* Converts a string to a compound literal, essentially making it a pointer to const u8 */ #define COMPOUND_STRING(str) (const u8[]) _(str) @@ -98,6 +99,21 @@ #define R_FOR_EACH_WITH_(macro, args, a, ...) INVOKE_WITH(macro, args, a) __VA_OPT__(R_FOR_EACH_WITH_P PARENS (macro, args, __VA_ARGS__)) #define R_FOR_EACH_WITH_P() R_FOR_EACH_WITH_ +/* Expands to 'macro(a, b)' for each 'a' in 'as' and 'b' in 'bs'. + * Uses the shorter of 'as' and 'bs'. (Credit to MGriffin) */ +#define R_ZIP(macro, as, bs) CAT(R_ZIP_, CAT(R_ZIP_NONEMPTY(as), R_ZIP_NONEMPTY(bs)))(macro, FIRST as, FIRST bs, (EXCEPT_1 as), (EXCEPT_1 bs)) +#define R_ZIP_00(macro, a, b, as, bs) +#define R_ZIP_01(macro, a, b, as, bs) +#define R_ZIP_10(macro, a, b, as, bs) +#define R_ZIP_11(macro, a, b, as, bs) macro(a, b) R_ZIP_P PARENS (macro, as, bs) +#define R_ZIP_P() R_ZIP + +#define R_ZIP_NONEMPTY(as) R_ZIP_NONEMPTY_ as +#define R_ZIP_NONEMPTY_(...) FIRST(__VA_OPT__(1,) 0) + +/* Just a lot of numbers (with leading zeroes - remove with REMOVE_LEADING_ZEROES) */ +#define NUMBERS_256 (00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255) + /* Picks the xth VA_ARG if it exists, otherwise returns a default value */ #define DEFAULT(_default, ...) FIRST(__VA_OPT__(__VA_ARGS__, ) _default) #define DEFAULT_2(_default, ...) DEFAULT(_default __VA_OPT__(, SECOND(__VA_ARGS__))) @@ -171,4 +187,10 @@ Input must be of the form (upper << lower) where upper can be up to 3, lower up /* Finds the required digits to display the number (maximum 4) */ #define MAX_DIGITS(_num) 1 + !!(_num / 10) + !!(_num / 100) + !!(_num / 1000) +/* Converts a number with leading zeroes to a normal int (base 10 and up to three digits only!) */ +#define REMOVE_LEADING_ZEROES(_num) (((0x##_num / 256) * 100) + ((0x##_num / 16) * 10) + (0x##_num % 16)) + +/* Useful for counting arguments */ +#define PLUS_ONE(...) + 1 + #endif diff --git a/include/pokemon.h b/include/pokemon.h index 3b4cc0715b..f6c242606f 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -824,7 +824,8 @@ void CreateTask_PlayMapChosenOrBattleBGM(u16 songId); const u16 *GetMonFrontSpritePal(struct Pokemon *mon); const u16 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, bool32 isShiny, u32 personality); const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFemale); -bool8 IsMoveHM(u16 move); +bool32 IsMoveHM(u16 move); +bool32 CannotForgetMove(u16 move); bool8 IsMonSpriteNotFlipped(u16 species); s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); diff --git a/src/apprentice.c b/src/apprentice.c index 4b0403b281..585b4eed43 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -353,14 +353,12 @@ static u16 GetRandomAlternateMove(u8 monId) // NOTE: Below is an infinite loop if a species which cannot learn TMs is assigned to an Apprentice do { - id = Random() % (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES); - shouldUseMove = CanLearnTeachableMove(species, ItemIdToBattleMoveId(ITEM_TM01 + id)); + id = (Random() % NUM_ALL_MACHINES) + 1; + move = GetTMHMMoveId(id); + shouldUseMove = CanLearnTeachableMove(species, move); } while (!shouldUseMove); - move = ItemIdToBattleMoveId(ITEM_TM01 + id); - shouldUseMove = TRUE; - if (numLearnsetMoves <= MAX_MON_MOVES) j = 0; else diff --git a/src/battle_dome.c b/src/battle_dome.c index ff7fe4b8b0..68bd6af252 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -27,6 +27,7 @@ #include "sound.h" #include "pokemon_icon.h" #include "data.h" +#include "item.h" #include "international_string_util.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" @@ -3976,12 +3977,12 @@ static bool32 IsDomeLuckyMove(u32 move) static bool32 IsDomePopularMove(u32 move) { u8 i; - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + i) == move) + if (GetTMHMMoveId(i + 1) == move) return TRUE; } - if (i == NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) + if (i == NUM_ALL_MACHINES) return FALSE; // Filter in TMs/HMs if (GetMovePower(move) >= 90) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4372b09291..e49d824d75 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8497,7 +8497,7 @@ static void Cmd_yesnoboxlearnmove(void) else { u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, B_POSITION_PLAYER_LEFT); gBattleScripting.learnMoveState = 6; diff --git a/src/battle_util.c b/src/battle_util.c index 31caab95a0..76786d1f44 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10445,7 +10445,7 @@ enum DamageCategory GetCategoryBasedOnStats(u32 battler) static u32 GetFlingPowerFromItemId(u32 itemId) { - if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { u32 power = GetMovePower(ItemIdToBattleMoveId(itemId)); if (power > 1) diff --git a/src/data/items.h b/src/data/items.h index 187b4bc399..d1d7ae3125 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -10454,7 +10454,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FOCUS_PUNCH, }, [ITEM_TM_DRAGON_CLAW] = @@ -10469,7 +10468,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DRAGON_CLAW, }, [ITEM_TM_WATER_PULSE] = @@ -10484,7 +10482,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATER_PULSE, }, [ITEM_TM_CALM_MIND] = @@ -10499,7 +10496,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CALM_MIND, }, [ITEM_TM_ROAR] = @@ -10514,7 +10510,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROAR, }, [ITEM_TM_TOXIC] = @@ -10529,7 +10524,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TOXIC, }, [ITEM_TM_HAIL] = @@ -10551,7 +10545,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HAIL, }, [ITEM_TM_BULK_UP] = @@ -10566,7 +10559,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULK_UP, }, [ITEM_TM_BULLET_SEED] = @@ -10581,7 +10573,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULLET_SEED, }, [ITEM_TM_HIDDEN_POWER] = @@ -10596,7 +10587,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HIDDEN_POWER, }, [ITEM_TM_SUNNY_DAY] = @@ -10611,7 +10601,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SUNNY_DAY, }, [ITEM_TM_TAUNT] = @@ -10626,7 +10615,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TAUNT, }, [ITEM_TM_ICE_BEAM] = @@ -10645,7 +10633,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ICE_BEAM, }, [ITEM_TM_BLIZZARD] = @@ -10666,7 +10653,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BLIZZARD, }, [ITEM_TM_HYPER_BEAM] = @@ -10681,7 +10667,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HYPER_BEAM, }, [ITEM_TM_LIGHT_SCREEN] = @@ -10696,7 +10681,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_LIGHT_SCREEN, }, [ITEM_TM_PROTECT] = @@ -10711,7 +10695,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PROTECT, }, [ITEM_TM_RAIN_DANCE] = @@ -10726,7 +10709,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RAIN_DANCE, }, [ITEM_TM_GIGA_DRAIN] = @@ -10741,7 +10723,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_GIGA_DRAIN, }, [ITEM_TM_SAFEGUARD] = @@ -10756,7 +10737,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SAFEGUARD, }, [ITEM_TM_FRUSTRATION] = @@ -10771,7 +10751,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FRUSTRATION, }, [ITEM_TM_SOLAR_BEAM] = @@ -10786,7 +10765,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SOLAR_BEAM, }, [ITEM_TM_IRON_TAIL] = @@ -10801,7 +10779,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_IRON_TAIL, }, [ITEM_TM_THUNDERBOLT] = @@ -10816,7 +10793,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDERBOLT, }, [ITEM_TM_THUNDER] = @@ -10831,7 +10807,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDER, }, [ITEM_TM_EARTHQUAKE] = @@ -10846,7 +10821,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_EARTHQUAKE, }, [ITEM_TM_RETURN] = @@ -10861,7 +10835,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RETURN, }, [ITEM_TM_DIG] = @@ -10876,7 +10849,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIG, }, [ITEM_TM_PSYCHIC] = @@ -10891,7 +10863,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PSYCHIC, }, [ITEM_TM_SHADOW_BALL] = @@ -10906,7 +10877,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHADOW_BALL, }, [ITEM_TM_BRICK_BREAK] = @@ -10921,7 +10891,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BRICK_BREAK, }, [ITEM_TM_DOUBLE_TEAM] = @@ -10936,7 +10905,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DOUBLE_TEAM, }, [ITEM_TM_REFLECT] = @@ -10951,7 +10919,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REFLECT, }, [ITEM_TM_SHOCK_WAVE] = @@ -10966,7 +10933,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHOCK_WAVE, }, [ITEM_TM_FLAMETHROWER] = @@ -10981,7 +10947,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLAMETHROWER, }, [ITEM_TM_SLUDGE_BOMB] = @@ -10996,7 +10961,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SLUDGE_BOMB, }, [ITEM_TM_SANDSTORM] = @@ -11011,7 +10975,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SANDSTORM, }, [ITEM_TM_FIRE_BLAST] = @@ -11026,7 +10989,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FIRE_BLAST, }, [ITEM_TM_ROCK_TOMB] = @@ -11041,7 +11003,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_TOMB, }, [ITEM_TM_AERIAL_ACE] = @@ -11056,7 +11017,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_AERIAL_ACE, }, [ITEM_TM_TORMENT] = @@ -11071,7 +11031,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TORMENT, }, [ITEM_TM_FACADE] = @@ -11086,7 +11045,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FACADE, }, [ITEM_TM_SECRET_POWER] = @@ -11101,7 +11059,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SECRET_POWER, }, [ITEM_TM_REST] = @@ -11116,7 +11073,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REST, }, [ITEM_TM_ATTRACT] = @@ -11131,7 +11087,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ATTRACT, }, [ITEM_TM_THIEF] = @@ -11146,7 +11101,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THIEF, }, [ITEM_TM_STEEL_WING] = @@ -11161,7 +11115,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STEEL_WING, }, [ITEM_TM_SKILL_SWAP] = @@ -11176,7 +11129,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SKILL_SWAP, }, [ITEM_TM_SNATCH] = @@ -11191,7 +11143,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SNATCH, }, [ITEM_TM_OVERHEAT] = @@ -11206,7 +11157,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_OVERHEAT, }, [ITEM_TM51] = @@ -11218,7 +11168,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM52] = @@ -11230,7 +11179,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM53] = @@ -11242,7 +11190,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM54] = @@ -11254,7 +11201,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM55] = @@ -11266,7 +11212,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM56] = @@ -11278,7 +11223,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM57] = @@ -11290,7 +11234,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM58] = @@ -11302,7 +11245,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM59] = @@ -11314,7 +11256,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM60] = @@ -11326,7 +11267,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM61] = @@ -11338,7 +11278,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM62] = @@ -11350,7 +11289,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM63] = @@ -11362,7 +11300,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM64] = @@ -11374,7 +11311,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM65] = @@ -11386,7 +11322,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM66] = @@ -11398,7 +11333,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM67] = @@ -11410,7 +11344,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM68] = @@ -11422,7 +11355,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM69] = @@ -11434,7 +11366,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM70] = @@ -11446,7 +11377,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM71] = @@ -11458,7 +11388,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM72] = @@ -11470,7 +11399,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM73] = @@ -11482,7 +11410,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM74] = @@ -11494,7 +11421,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM75] = @@ -11506,7 +11432,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM76] = @@ -11518,7 +11443,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM77] = @@ -11530,7 +11454,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM78] = @@ -11542,7 +11465,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM79] = @@ -11554,7 +11476,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM80] = @@ -11566,7 +11487,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM81] = @@ -11578,7 +11498,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM82] = @@ -11590,7 +11509,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM83] = @@ -11602,7 +11520,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM84] = @@ -11614,7 +11531,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM85] = @@ -11626,7 +11542,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM86] = @@ -11638,7 +11553,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM87] = @@ -11650,7 +11564,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM88] = @@ -11662,7 +11575,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM89] = @@ -11674,7 +11586,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM90] = @@ -11686,7 +11597,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM91] = @@ -11698,7 +11608,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM92] = @@ -11710,7 +11619,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM93] = @@ -11722,7 +11630,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM94] = @@ -11734,7 +11641,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM95] = @@ -11746,7 +11652,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM96] = @@ -11758,7 +11663,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM97] = @@ -11770,7 +11674,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM98] = @@ -11782,7 +11685,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM99] = @@ -11794,7 +11696,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM100] = @@ -11806,7 +11707,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_HM_CUT] = @@ -11821,7 +11721,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CUT, }, [ITEM_HM_FLY] = @@ -11836,7 +11735,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLY, }, [ITEM_HM_SURF] = @@ -11851,7 +11749,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SURF, }, [ITEM_HM_STRENGTH] = @@ -11866,7 +11763,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STRENGTH, }, [ITEM_HM_FLASH] = @@ -11881,7 +11777,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLASH, }, [ITEM_HM_ROCK_SMASH] = @@ -11896,7 +11791,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_SMASH, }, [ITEM_HM_WATERFALL] = @@ -11911,7 +11805,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATERFALL, }, [ITEM_HM_DIVE] = @@ -11926,7 +11819,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIVE, }, diff --git a/src/daycare.c b/src/daycare.c index e2f6f8f070..fdb98d6630 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -895,9 +895,9 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { - for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (j = 0; j < NUM_ALL_MACHINES; j++) { - u16 moveId = ItemIdToBattleMoveId(ITEM_TM01 + j); + u16 moveId = GetTMHMMoveId(j + 1); if (sHatchedEggFatherMoves[i] == moveId && CanLearnTeachableMove(GetMonData(egg, MON_DATA_SPECIES_OR_EGG), moveId)) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) diff --git a/src/debug.c b/src/debug.c index e46c5c5062..3f970ae7fc 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3236,10 +3236,11 @@ static void DebugAction_PCBag_Fill_PocketPokeBalls(u8 taskId) static void DebugAction_PCBag_Fill_PocketTMHM(u8 taskId) { - u16 itemId; + u16 index, itemId; - for (itemId = ITEM_TM01; itemId <= ITEM_HM08; itemId++) + for (index = 0; index < NUM_ALL_MACHINES; index++) { + itemId = GetTMHMItemId(index + 1); if (CheckBagHasSpace(itemId, 1) && ItemIdToBattleMoveId(itemId) != MOVE_NONE) AddBagItem(itemId, 1); } diff --git a/src/evolution_scene.c b/src/evolution_scene.c index c746414958..1f9d2af8fa 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -992,7 +992,7 @@ static void Task_EvolutionScene(u8 taskId) { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); @@ -1376,7 +1376,7 @@ static void Task_TradeEvolutionScene(u8 taskId) { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); diff --git a/src/field_specials.c b/src/field_specials.c index 0ac0d9fa68..927326e399 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -19,6 +19,7 @@ #include "field_weather.h" #include "graphics.h" #include "international_string_util.h" +#include "item.h" #include "item_icon.h" #include "link.h" #include "load_save.h" @@ -1671,7 +1672,7 @@ u16 GetMysteryGiftCardStat(void) bool8 BufferTMHMMoveName(void) { - if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + if (gItemsInfo[gSpecialVar_0x8004].pocket == POCKET_TM_HM) { StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(gSpecialVar_0x8004))); return TRUE; diff --git a/src/item.c b/src/item.c index fb470866bc..f0f9071c5a 100644 --- a/src/item.c +++ b/src/item.c @@ -31,6 +31,27 @@ EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; #include "data/pokemon/item_effects.h" #include "data/items.h" +#define UNPACK_TM_ITEM_ID(_tm) [CAT(ENUM_TM_HM_, _tm) + 1] = { CAT(ITEM_TM_, _tm), CAT(MOVE_, _tm) }, +#define UNPACK_HM_ITEM_ID(_hm) [CAT(ENUM_TM_HM_, _hm) + 1] = { CAT(ITEM_HM_, _hm), CAT(MOVE_, _hm) }, + +const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = +{ + [0] = { ITEM_NONE, MOVE_NONE }, // Failsafe + FOREACH_TM(UNPACK_TM_ITEM_ID) + FOREACH_HM(UNPACK_HM_ITEM_ID) + /* + * Expands to the following: + * + * [1] = { ITEM_TM_FOCUS_PUNCH, MOVE_FOCUS_PUNCH }, + * [2] = { ITEM_TM_DRAGON_CLAW, MOVE_DRAGON_CLAW }, + * [3] = { ITEM_TM_WATER_PULSE, MOVE_WATER_PULSE }, + * etc etc + */ +}; + +#undef UNPACK_TM_ITEM_ID +#undef UNPACK_HM_ITEM_ID + static inline u16 GetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos) { return pocket->itemSlots[pocketPos].itemId; @@ -592,7 +613,9 @@ void SortBerriesOrTMHMs(enum Pocket pocketId) { if (GetBagItemQuantity(pocketId, j) == 0 || GetBagItemId(pocketId, j) == ITEM_NONE) continue; - if (GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) + if (pocketId == POCKET_BERRIES && GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) // To do + continue; + if (pocketId == POCKET_TM_HM && GetItemTMHMIndex(GetBagItemId(pocketId, i)) <= GetItemTMHMIndex(GetBagItemId(pocketId, j))) continue; } SwapItemSlots(pocketId, i, j); diff --git a/src/item_icon.c b/src/item_icon.c index a218ebaf8e..8d4ff3223d 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -166,11 +166,11 @@ const void *GetItemIconPic(u16 itemId) return gItemIcon_ReturnToFieldArrow; // Use last icon, the "return to field" arrow if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPic; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { - if (itemId < ITEM_TM01 + NUM_TECHNICAL_MACHINES) - return gItemIcon_TM; - return gItemIcon_HM; + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) + return gItemIcon_HM; + return gItemIcon_TM; } return gItemsInfo[itemId].iconPic; @@ -182,8 +182,8 @@ const u16 *GetItemIconPalette(u16 itemId) return gItemIconPalette_ReturnToFieldArrow; if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPalette; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) - return gTypesInfo[GetMoveType(gItemsInfo[itemId].secondaryId)].paletteTMHM; + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) + return gTypesInfo[GetMoveType(GetItemTMHMMoveId(itemId))].paletteTMHM; return gItemsInfo[itemId].iconPalette; } diff --git a/src/item_menu.c b/src/item_menu.c index aa241b7c75..647b99eb2d 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -916,16 +916,16 @@ static void GetItemNameFromPocket(u8 *dest, u16 itemId) case POCKET_TM_HM: end = StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(itemId))); PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); - if (itemId >= ITEM_HM01) + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) { // Get HM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 1); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId) - NUM_TECHNICAL_MACHINES, STR_CONV_MODE_LEADING_ZEROS, 1); StringExpandPlaceholders(dest, gText_NumberItem_HM); } else { // Get TM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId), STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(dest, gText_NumberItem_TMBerry); } break; @@ -983,7 +983,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) itemQuantity = GetBagItemQuantity(gBagPosition.pocket, itemIndex); // Draw HM icon - if (itemId >= ITEM_HM01 && itemId <= ITEM_HM08) + if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) BlitBitmapToWindow(windowId, gBagMenuHMIcon_Gfx, 8, y - 1, 16, 16); if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemId) == FALSE) diff --git a/src/item_use.c b/src/item_use.c index ad0fb47565..9df366e595 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -884,7 +884,7 @@ void ItemUseOutOfBattle_DynamaxCandy(u8 taskId) void ItemUseOutOfBattle_TMHM(u8 taskId) { - if (gSpecialVar_ItemId >= ITEM_HM01) + if (GetItemTMHMIndex(gSpecialVar_ItemId) > NUM_TECHNICAL_MACHINES) DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpHM, BootUpSoundTMHM); // HM else DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpTM, BootUpSoundTMHM); // TM diff --git a/src/party_menu.c b/src/party_menu.c index 0954715a5d..16ea3522d7 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -158,14 +158,6 @@ enum { #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, @@ -1567,14 +1559,8 @@ static bool8 DoesSelectedMonKnowHM(u8 *slotPtr) for (u32 i = 0; i < MAX_MON_MOVES; i++) { - u32 j = 0; - u16 move = GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i); - - while (sHMMoves[j] != HM_MOVES_END) - { - if (sHMMoves[j++] == move) - return TRUE; - } + if (IsMoveHM(GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i))) + return TRUE; } return FALSE; } @@ -5355,7 +5341,7 @@ void ItemUseCB_PPUp(u8 taskId, TaskFunc task) u16 ItemIdToBattleMoveId(u16 item) { - return (GetItemPocket(item) == POCKET_TM_HM) ? gItemsInfo[item].secondaryId : MOVE_NONE; + return (GetItemPocket(item) == POCKET_TM_HM) ? GetItemTMHMMoveId(item) : MOVE_NONE; } bool8 MonKnowsMove(struct Pokemon *mon, u16 move) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index d986ce63af..db7ff38ee0 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -290,9 +290,9 @@ static EWRAM_DATA u16 sLastSelectedPokemon = 0; static EWRAM_DATA u8 sPokeBallRotation = 0; static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL; //Pokedex Plus HGSS_Ui -#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) +#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_ALL_MACHINES) EWRAM_DATA static u16 sStatsMoves[MOVES_COUNT_TOTAL] = {0}; -EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES] = {0}; +EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_ALL_MACHINES] = {0}; struct SearchOptionText @@ -5054,13 +5054,13 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu // TM Moves if (HGSS_SORT_TMS_BY_NUM) { - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - move = ItemIdToBattleMoveId(ITEM_TM01 + i); + move = GetTMHMMoveId(i + 1); if (move != MOVE_NONE && CanLearnTeachableMove(species, move)) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + i; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(i + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; @@ -5072,12 +5072,12 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { move = teachableLearnset[i]; - for (u16 j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (u16 j = 0; j < NUM_ALL_MACHINES; j++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + j) == move) + if (GetTMHMMoveId(j + 1) == move) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + j; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(j + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; diff --git a/src/pokemon.c b/src/pokemon.c index 1ed82d39c4..4a3b0bf706 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -871,14 +871,6 @@ static const s8 sFriendshipEventModifiers[][3] = [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10}, }; -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - static const struct SpeciesItem sAlteringCaveWildMonHeldItems[] = { {SPECIES_NONE, ITEM_NONE}, @@ -5947,19 +5939,21 @@ const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFema } } -bool8 IsMoveHM(u16 move) -{ - int i = 0; +#define OR_MOVE_IS_HM(_hm) || (move == MOVE_##_hm) +bool32 IsMoveHM(u16 move) +{ + return FALSE FOREACH_HM(OR_MOVE_IS_HM); +} + +#undef OR_MOVE_IS_HM + +bool32 CannotForgetMove(u16 move) +{ if (P_CAN_FORGET_HIDDEN_MOVE) return FALSE; - while (sHMMoves[i] != HM_MOVES_END) - { - if (sHMMoves[i++] == move) - return TRUE; - } - return FALSE; + return IsMoveHM(move); } bool8 IsMonSpriteNotFlipped(u16 species) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 3bf7c0aac4..b63f6d17eb 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2609,7 +2609,7 @@ static bool8 CanReplaceMove(void) { if (sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES || sMonSummaryScreen->newMove == MOVE_NONE - || IsMoveHM(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex]) != TRUE) + || !CannotForgetMove(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex])) return TRUE; else return FALSE; From c6a62758a2c608e329308242344e400dd8a51298 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 5 Jul 2025 07:45:20 -0400 Subject: [PATCH 108/248] Use compound strings in battle debug menu (#7282) --- src/battle_debug.c | 379 +++++++++++++++------------------------------ 1 file changed, 122 insertions(+), 257 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index b91ca4b5e4..a98b3a12a5 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -263,145 +263,10 @@ enum static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect); // const rom data -static const u8 sText_Moves[] = _("Moves"); static const u8 sText_Ability[] = _("Ability"); static const u8 sText_HeldItem[] = _("Held Item"); static const u8 sText_HoldEffect[] = _("Hold Effect"); -static const u8 sText_PP[] = _("PP"); -static const u8 sText_Types[] = _("Types"); -static const u8 sText_Stats[] = _("Stats"); -static const u8 sText_StatStages[] = _("Stat Stages"); -static const u8 sText_Status1[] = _("Status1"); -static const u8 sText_VolatileStatus[] = _("Volatiles"); -static const u8 sText_Status3[] = _("Status3"); -static const u8 sText_Status4[] = _("Status4"); -static const u8 sText_SideStatus[] = _("Side Status"); -static const u8 sText_AI[] = _("AI"); -static const u8 sText_AIMovePts[] = _("AI Pts/Dmg"); -static const u8 sText_AiKnowledge[] = _("AI Info"); -static const u8 sText_AiParty[] = _("AI Party"); -static const u8 sText_Various[] = _("Various"); -static const u8 sText_CurrHp[] = _("HP Current"); -static const u8 sText_MaxHp[] = _("HP Max"); -static const u8 sText_Attack[] = _("Attack"); -static const u8 sText_Defense[] = _("Defense"); -static const u8 sText_Speed[] = _("Speed"); -static const u8 sText_SpAtk[] = _("Sp. Atk"); -static const u8 sText_SpDef[] = _("Sp. Def"); -static const u8 sText_Sleep[] = _("Sleep"); -static const u8 sText_Poison[] = _("Poison"); -static const u8 sText_Burn[] = _("Burn"); -static const u8 sText_Freeze[] = _("Freeze"); -static const u8 sText_Paralysis[] = _("Paralysis"); -static const u8 sText_ToxicPoison[] = _("Toxic Poison"); -static const u8 sText_ToxicCounter[] = _("Toxic Counter"); -static const u8 sText_Frostbite[] = _("Frostbite"); -static const u8 sText_Confusion[] = _("Confusion"); -static const u8 sText_Flinched[] = _("Flinched"); -static const u8 sText_Uproar[] = _("Uproar"); -static const u8 sText_Torment[] = _("Torment"); -static const u8 sText_Bide[] = _("Bide"); -static const u8 sText_LockConfuse[] = _("Lock Confuse"); -static const u8 sText_MultipleTurns[] = _("Multiple Turns"); -static const u8 sText_Wrapped[] = _("Wrapped"); -static const u8 sText_Powder[] = _("Powder"); -static const u8 sText_Infatuation[] = _("Infatuation"); -static const u8 sText_DefenseCurl[] = _("Defense Curl"); -static const u8 sText_Transformed[] = _("Transformed"); -static const u8 sText_Recharge[] = _("Recharge"); -static const u8 sText_Rage[] = _("Rage"); -static const u8 sText_Substitute[] = _("Substitute"); -static const u8 sText_DestinyBond[] = _("Destiny Bond"); -static const u8 sText_EscapePrevention[] = _("Escape Prevention"); -static const u8 sText_Nightmare[] = _("Nightmare"); -static const u8 sText_Cursed[] = _("Cursed"); -static const u8 sText_Foresight[] = _("Foresight"); -static const u8 sText_DragonCheer[] = _("Dragon Cheer"); -static const u8 sText_FocusEnergy[] = _("Focus Energy"); -static const u8 sText_LeechSeedHealer[] = _("Leech Seed Healer"); -static const u8 sText_LeechSeeded[] = _("Leech Seeded"); -static const u8 sText_AlwaysHits[] = _("Always Hits"); -static const u8 sText_PerishSong[] = _("Perish Song"); -static const u8 sText_OnAir[] = _("On Air"); -static const u8 sText_Underground[] = _("Underground"); -static const u8 sText_Minimized[] = _("Minimized"); -static const u8 sText_ChargedUp[] = _("Charged Up"); -static const u8 sText_Rooted[] = _("Rooted"); -static const u8 sText_Yawn[] = _("Yawn"); -static const u8 sText_ImprisonedOthers[] = _("Imprisoned Others"); -static const u8 sText_Grudge[] = _("Grudge"); -static const u8 sText_GastroAcid[] = _("Gastro Acid"); -static const u8 sText_Embargo[] = _("Embargo"); -static const u8 sText_Underwater[] = _("Underwater"); -static const u8 sText_Trace[] = _("Trace"); -static const u8 sText_SmackedDown[] = _("Smacked Down"); -static const u8 sText_MeFirst[] = _("Me First"); -static const u8 sText_Telekinesis[] = _("Telekinesis"); -static const u8 sText_PhantomForce[] = _("Phantom Force"); -static const u8 sText_MiracleEyed[] = _("Miracle Eyed"); -static const u8 sText_MagnetRise[] = _("Magnet Rise"); -static const u8 sText_HealBlock[] = _("Heal Block"); -static const u8 sText_AquaRing[] = _("Aqua Ring"); -static const u8 sText_LaserFocus[] = _("Laser Focus"); -static const u8 sText_PowerTrick[] = _("Power Trick"); -static const u8 sText_SkyDropped[] = _("Sky Dropped"); -static const u8 sText_Electrified[] = _("Electrified"); -static const u8 sText_InfiniteConfusion[] = _("Infinite Confusion"); -static const u8 sText_SaltCure[] = _("Salt Cure"); -static const u8 sText_SyrupBomb[] = _("Syrup Bomb"); -static const u8 sText_GlaiveRush[] = _("Glaive Rush"); -static const u8 sText_Reflect[] = _("Reflect"); -static const u8 sText_LightScreen[] = _("Light Screen"); -static const u8 sText_StickyWeb[] = _("Sticky Web"); -static const u8 sText_Spikes[] = _("Spikes"); -static const u8 sText_Safeguard[] = _("Safeguard"); -static const u8 sText_FutureAttack[] = _("Future Attack"); -static const u8 sText_Mist[] = _("Mist"); -static const u8 sText_Tailwind[] = _("Tailwind"); -static const u8 sText_AuroraVeil[] = _("Aurora Veil"); -static const u8 sText_LuckyChant[] = _("Lucky Chant"); -static const u8 sText_ToxicSpikes[] = _("Toxic Spikes"); -static const u8 sText_StealthRock[] = _("Stealth Rock"); -static const u8 sText_Steelsurge[] = _("Steelsurge"); -static const u8 sText_DamageNonTypes[] = _("Damage Non-Types"); -static const u8 sText_Rainbow[] = _("Rainbow"); -static const u8 sText_SeaOfFire[] = _("Sea of Fire"); -static const u8 sText_Swamp[] = _("Swamp"); -static const u8 sText_CheckBadMove[] = _("Check Bad Move"); -static const u8 sText_TryToFaint[] = _("Try to Faint"); -static const u8 sText_CheckViability[] = _("Check Viability"); -static const u8 sText_ForceSetupFirstTurn[] = _("Force Setup First Turn"); -static const u8 sText_Risky[] = _("Risky"); -static const u8 sText_TryTo2HKO[] = _("Try to 2HKO"); -static const u8 sText_PreferBatonPass[] = _("Prefer Baton Pass"); -static const u8 sText_DoubleBattle[] = _("Double Battle"); -static const u8 sText_HpAware[] = _("HP Aware"); -static const u8 sText_PowerfulStatus[] = _("Powerful Status"); -static const u8 sText_NegateUnaware[] = _("Negate Unaware"); -static const u8 sText_WillSuicide[] = _("Will Suicide"); -static const u8 sText_PreferStatusMoves[] = _("Prefer Status Moves"); -static const u8 sText_Stall[] = _("Stall"); -static const u8 sText_SmartSwitching[] = _("Smart Switching"); -static const u8 sText_AcePokemon[] = _("Ace Pokémon"); -static const u8 sText_Omniscient[] = _("Omniscient"); -static const u8 sText_SmartMonChoices[] = _("Smart Mon Choices"); -static const u8 sText_Conservative[] = _("Conservative"); -static const u8 sText_SequenceSwitching[] = _("Sequence Switching"); -static const u8 sText_DoubleAcePokemon[] = _("Double Ace Pokémon"); -static const u8 sText_WeighAbilityPrediction[] = _("Weigh Ability Prediction"); -static const u8 sText_PreferHighestDamageMove[] = _("Prefer Highest Damage Move"); -static const u8 sText_PredictSwitch[] = _("Predict Switch"); -static const u8 sText_PredictIncomingMon[] = _("Predict Incoming Mon"); -static const u8 sText_DynamicFunc[] = _("Dynamic Func"); -static const u8 sText_Roaming[] = _("Roaming"); -static const u8 sText_Safari[] = _("Safari"); -static const u8 sText_FirstBattle[] = _("First Battle"); -static const u8 sText_ShowHP[] = _("Show HP"); -static const u8 sText_SubstituteHp[] = _("Substitute HP"); -static const u8 sText_InLove[] = _("In Love"); -static const u8 sText_Unknown[] = _("Unknown"); static const u8 sText_EmptyString[] = _(""); -static const u8 sText_IsSwitching[] = _("Switching to "); static const struct BitfieldInfo sStatus1Bitfield[] = { @@ -487,160 +352,160 @@ static const struct BitfieldInfo sAIBitfield[] = static const struct ListMenuItem sMainListItems[] = { - {sText_Moves, LIST_ITEM_MOVES}, - {sText_Ability, LIST_ITEM_ABILITY}, - {sText_HeldItem, LIST_ITEM_HELD_ITEM}, - {sText_PP, LIST_ITEM_PP}, - {sText_Types, LIST_ITEM_TYPES}, - {sText_Stats, LIST_ITEM_STATS}, - {sText_StatStages, LIST_ITEM_STAT_STAGES}, - {sText_Status1, LIST_ITEM_STATUS1}, - {sText_VolatileStatus, LIST_ITEM_VOLATILE}, - {sText_Status3, LIST_ITEM_STATUS3}, - {sText_Status4, LIST_ITEM_STATUS4}, - {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, - {sText_AI, LIST_ITEM_AI}, - {sText_AIMovePts, LIST_ITEM_AI_MOVES_PTS}, - {sText_AiKnowledge, LIST_ITEM_AI_INFO}, - {sText_AiParty, LIST_ITEM_AI_PARTY}, - {sText_Various, LIST_ITEM_VARIOUS}, + {COMPOUND_STRING("Moves"), LIST_ITEM_MOVES}, + {sText_Ability, LIST_ITEM_ABILITY}, + {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {COMPOUND_STRING("PP"), LIST_ITEM_PP}, + {COMPOUND_STRING("Types"), LIST_ITEM_TYPES}, + {COMPOUND_STRING("Stats"), LIST_ITEM_STATS}, + {COMPOUND_STRING("Stat Stages"), LIST_ITEM_STAT_STAGES}, + {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, + {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, + {COMPOUND_STRING("Status3"), LIST_ITEM_STATUS3}, + {COMPOUND_STRING("Status4"), LIST_ITEM_STATUS4}, + {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, + {COMPOUND_STRING("AI"), LIST_ITEM_AI}, + {COMPOUND_STRING("AI Pts/Dmg"), LIST_ITEM_AI_MOVES_PTS}, + {COMPOUND_STRING("AI Info"), LIST_ITEM_AI_INFO}, + {COMPOUND_STRING("AI Party"), LIST_ITEM_AI_PARTY}, + {COMPOUND_STRING("Various"), LIST_ITEM_VARIOUS}, }; static const struct ListMenuItem sStatsListItems[] = { - {sText_CurrHp, LIST_STAT_HP_CURRENT}, - {sText_MaxHp, LIST_STAT_HP_MAX}, - {sText_Attack, LIST_STAT_ATTACK}, - {sText_Defense, LIST_STAT_DEFENSE}, - {sText_Speed, LIST_STAT_SPEED}, - {sText_SpAtk, LIST_STAT_SP_ATK}, - {sText_SpDef, LIST_STAT_SP_DEF}, + {COMPOUND_STRING("HP Current"), LIST_STAT_HP_CURRENT}, + {COMPOUND_STRING("HP Max"), LIST_STAT_HP_MAX}, + {COMPOUND_STRING("Attack"), LIST_STAT_ATTACK}, + {COMPOUND_STRING("Defense"), LIST_STAT_DEFENSE}, + {COMPOUND_STRING("Speed"), LIST_STAT_SPEED}, + {COMPOUND_STRING("Sp. Atk"), LIST_STAT_SP_ATK}, + {COMPOUND_STRING("Sp. Def"), LIST_STAT_SP_DEF}, }; static const struct ListMenuItem sStatus1ListItems[] = { - {sText_Sleep, LIST_STATUS1_SLEEP}, - {sText_Poison, LIST_STATUS1_POISON}, - {sText_Burn, LIST_STATUS1_BURN}, - {sText_Freeze, LIST_STATUS1_FREEZE}, - {sText_Paralysis, LIST_STATUS1_PARALYSIS}, - {sText_ToxicPoison, LIST_STATUS1_TOXIC_POISON}, - {sText_ToxicCounter, LIST_STATUS1_TOXIC_COUNTER}, - {sText_Frostbite, LIST_STATUS1_FROSTBITE}, + {COMPOUND_STRING("Sleep"), LIST_STATUS1_SLEEP}, + {COMPOUND_STRING("Poison"), LIST_STATUS1_POISON}, + {COMPOUND_STRING("Burn"), LIST_STATUS1_BURN}, + {COMPOUND_STRING("Freeze"), LIST_STATUS1_FREEZE}, + {COMPOUND_STRING("Paralysis"), LIST_STATUS1_PARALYSIS}, + {COMPOUND_STRING("Toxic Poison"), LIST_STATUS1_TOXIC_POISON}, + {COMPOUND_STRING("Toxic Counter"), LIST_STATUS1_TOXIC_COUNTER}, + {COMPOUND_STRING("Frostbite"), LIST_STATUS1_FROSTBITE}, }; static const struct ListMenuItem sVolatileStatusListItems[] = { - {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, - {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, - {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, - {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, - {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, - {COMPOUND_STRING("Recharge"), VOLATILE_RECHARGE}, - {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, - {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, + {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, + {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, + {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, + {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, + {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, + {COMPOUND_STRING("Recharge"), VOLATILE_RECHARGE}, + {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, + {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, {COMPOUND_STRING("EscapePrevention"), VOLATILE_ESCAPE_PREVENTION}, - {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, - {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, - {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, - {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, - {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, - {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, + {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, + {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, + {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, + {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, + {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, + {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, }; static const struct ListMenuItem sStatus3ListItems[] = { - {sText_LeechSeedHealer, LIST_STATUS3_LEECH_SEED_HEALER}, - {sText_LeechSeeded, LIST_STATUS3_LEECH_SEEDED}, - {sText_AlwaysHits, LIST_STATUS3_ALWAYS_HITS}, - {sText_PerishSong, LIST_STATUS3_PERISH_SONG}, - {sText_OnAir, LIST_STATUS3_ON_AIR}, - {sText_Underground, LIST_STATUS3_UNDERGROUND}, - {sText_Minimized, LIST_STATUS3_MINIMIZED}, - {sText_ChargedUp, LIST_STATUS3_CHARGED_UP}, - {sText_Rooted, LIST_STATUS3_ROOTED}, - {sText_Yawn, LIST_STATUS3_YAWN}, - {sText_ImprisonedOthers, LIST_STATUS3_IMPRISONED_OTHERS}, - {sText_Grudge, LIST_STATUS3_GRUDGE}, - {sText_GastroAcid, LIST_STATUS3_GASTRO_ACID}, - {sText_Embargo, LIST_STATUS3_EMBARGO}, - {sText_Underwater, LIST_STATUS3_UNDERWATER}, - {sText_SmackedDown, LIST_STATUS3_SMACKED_DOWN}, - {sText_Telekinesis, LIST_STATUS3_TELEKINESIS}, - {sText_MiracleEyed, LIST_STATUS3_MIRACLE_EYED}, - {sText_MagnetRise, LIST_STATUS3_MAGNET_RISE}, - {sText_HealBlock, LIST_STATUS3_HEAL_BLOCK}, - {sText_AquaRing, LIST_STATUS3_AQUA_RING}, - {sText_LaserFocus, LIST_STATUS3_LASER_FOCUS}, - {sText_PowerTrick, LIST_STATUS3_POWER_TRICK}, + {COMPOUND_STRING("Leech Seed Healer"), LIST_STATUS3_LEECH_SEED_HEALER}, + {COMPOUND_STRING("Leech Seeded"), LIST_STATUS3_LEECH_SEEDED}, + {COMPOUND_STRING("Always Hits"), LIST_STATUS3_ALWAYS_HITS}, + {COMPOUND_STRING("Perish Song"), LIST_STATUS3_PERISH_SONG}, + {COMPOUND_STRING("On Air"), LIST_STATUS3_ON_AIR}, + {COMPOUND_STRING("Underground"), LIST_STATUS3_UNDERGROUND}, + {COMPOUND_STRING("Minimized"), LIST_STATUS3_MINIMIZED}, + {COMPOUND_STRING("Charged Up"), LIST_STATUS3_CHARGED_UP}, + {COMPOUND_STRING("Rooted"), LIST_STATUS3_ROOTED}, + {COMPOUND_STRING("Yawn"), LIST_STATUS3_YAWN}, + {COMPOUND_STRING("Imprisoned Others"), LIST_STATUS3_IMPRISONED_OTHERS}, + {COMPOUND_STRING("Grudge"), LIST_STATUS3_GRUDGE}, + {COMPOUND_STRING("Gastro Acid"), LIST_STATUS3_GASTRO_ACID}, + {COMPOUND_STRING("Embargo"), LIST_STATUS3_EMBARGO}, + {COMPOUND_STRING("Underwater"), LIST_STATUS3_UNDERWATER}, + {COMPOUND_STRING("Smacked Down"), LIST_STATUS3_SMACKED_DOWN}, + {COMPOUND_STRING("Telekinesis"), LIST_STATUS3_TELEKINESIS}, + {COMPOUND_STRING("Miracle Eyed"), LIST_STATUS3_MIRACLE_EYED}, + {COMPOUND_STRING("Magnet Rise"), LIST_STATUS3_MAGNET_RISE}, + {COMPOUND_STRING("Heal Block"), LIST_STATUS3_HEAL_BLOCK}, + {COMPOUND_STRING("Aqua Ring"), LIST_STATUS3_AQUA_RING}, + {COMPOUND_STRING("Laser Focus"), LIST_STATUS3_LASER_FOCUS}, + {COMPOUND_STRING("Power Trick"), LIST_STATUS3_POWER_TRICK}, }; static const struct ListMenuItem sStatus4ListItems[] = { - {sText_Electrified, LIST_STATUS4_ELECTRIFIED}, - {sText_SaltCure, LIST_STATUS4_SALT_CURE}, - {sText_SyrupBomb, LIST_STATUS4_SYRUP_BOMB}, - {sText_GlaiveRush, LIST_STATUS4_GLAIVE_RUSH}, + {COMPOUND_STRING("Electrified"), LIST_STATUS4_ELECTRIFIED}, + {COMPOUND_STRING("Salt Cure"), LIST_STATUS4_SALT_CURE}, + {COMPOUND_STRING("Syrup Bomb"), LIST_STATUS4_SYRUP_BOMB}, + {COMPOUND_STRING("Glaive Rush"), LIST_STATUS4_GLAIVE_RUSH}, }; static const struct ListMenuItem sSideStatusListItems[] = { - {sText_Reflect, LIST_SIDE_REFLECT}, - {sText_LightScreen, LIST_SIDE_LIGHTSCREEN}, - {sText_StickyWeb, LIST_SIDE_STICKY_WEB}, - {sText_Spikes, LIST_SIDE_SPIKES}, - {sText_Safeguard, LIST_SIDE_SAFEGUARD}, - {sText_Mist, LIST_SIDE_MIST}, - {sText_Tailwind, LIST_SIDE_TAILWIND}, - {sText_AuroraVeil, LIST_SIDE_AURORA_VEIL}, - {sText_LuckyChant, LIST_SIDE_LUCKY_CHANT}, - {sText_ToxicSpikes, LIST_SIDE_TOXIC_SPIKES}, - {sText_StealthRock, LIST_SIDE_STEALTH_ROCK}, - {sText_Steelsurge, LIST_SIDE_STEELSURGE}, - {sText_DamageNonTypes, LIST_SIDE_DAMAGE_NON_TYPES}, - {sText_Rainbow, LIST_SIDE_RAINBOW}, - {sText_SeaOfFire, LIST_SIDE_SEA_OF_FIRE}, - {sText_Swamp, LIST_SIDE_SWAMP}, + {COMPOUND_STRING("Reflect"), LIST_SIDE_REFLECT}, + {COMPOUND_STRING("Light Screen"), LIST_SIDE_LIGHTSCREEN}, + {COMPOUND_STRING("Sticky Web"), LIST_SIDE_STICKY_WEB}, + {COMPOUND_STRING("Spikes"), LIST_SIDE_SPIKES}, + {COMPOUND_STRING("Safeguard"), LIST_SIDE_SAFEGUARD}, + {COMPOUND_STRING("Mist"), LIST_SIDE_MIST}, + {COMPOUND_STRING("Tailwind"), LIST_SIDE_TAILWIND}, + {COMPOUND_STRING("Aurora Veil"), LIST_SIDE_AURORA_VEIL}, + {COMPOUND_STRING("Lucky Chant"), LIST_SIDE_LUCKY_CHANT}, + {COMPOUND_STRING("Toxic Spikes"), LIST_SIDE_TOXIC_SPIKES}, + {COMPOUND_STRING("Stealth Rock"), LIST_SIDE_STEALTH_ROCK}, + {COMPOUND_STRING("Steelsurge"), LIST_SIDE_STEELSURGE}, + {COMPOUND_STRING("Damage Non-Types"), LIST_SIDE_DAMAGE_NON_TYPES}, + {COMPOUND_STRING("Rainbow"), LIST_SIDE_RAINBOW}, + {COMPOUND_STRING("Sea of Fire"), LIST_SIDE_SEA_OF_FIRE}, + {COMPOUND_STRING("Swamp"), LIST_SIDE_SWAMP}, }; static const struct ListMenuItem sAIListItems[] = { - {sText_CheckBadMove, LIST_AI_CHECK_BAD_MOVE}, - {sText_TryToFaint, LIST_AI_TRY_TO_FAINT}, - {sText_CheckViability, LIST_AI_CHECK_VIABILITY}, - {sText_ForceSetupFirstTurn, LIST_AI_FORCE_SETUP_FIRST_TURN}, - {sText_Risky, LIST_AI_RISKY}, - {sText_TryTo2HKO, LIST_AI_TRY_TO_2HKO}, - {sText_PreferBatonPass, LIST_AI_PREFER_BATON_PASS}, - {sText_DoubleBattle, LIST_AI_DOUBLE_BATTLE}, - {sText_HpAware, LIST_AI_HP_AWARE}, - {sText_PowerfulStatus, LIST_AI_POWERFUL_STATUS}, - {sText_NegateUnaware, LIST_AI_NEGATE_UNAWARE}, - {sText_WillSuicide, LIST_AI_WILL_SUICIDE}, - {sText_PreferStatusMoves, LIST_AI_PREFER_STATUS_MOVES}, - {sText_Stall, LIST_AI_STALL}, - {sText_SmartSwitching, LIST_AI_SMART_SWITCHING}, - {sText_AcePokemon, LIST_AI_ACE_POKEMON}, - {sText_Omniscient, LIST_AI_OMNISCIENT}, - {sText_SmartMonChoices, LIST_AI_SMART_MON_CHOICES}, - {sText_Conservative, LIST_AI_CONSERVATIVE}, - {sText_SequenceSwitching, LIST_AI_SEQUENCE_SWITCHING}, - {sText_DoubleAcePokemon, LIST_AI_DOUBLE_ACE_POKEMON}, - {sText_WeighAbilityPrediction, LIST_AI_WEIGH_ABILITY_PREDICTION}, - {sText_PreferHighestDamageMove, LIST_AI_PREFER_HIGHEST_DAMAGE_MOVE}, - {sText_PredictSwitch, LIST_AI_PREDICT_SWITCH}, - {sText_PredictIncomingMon, LIST_AI_PREDICT_INCOMING_MON}, - {sText_DynamicFunc, LIST_AI_DYNAMIC_FUNC}, - {sText_Roaming, LIST_AI_ROAMING}, - {sText_Safari, LIST_AI_SAFARI}, - {sText_FirstBattle, LIST_AI_FIRST_BATTLE}, + {COMPOUND_STRING("Check Bad Move"), LIST_AI_CHECK_BAD_MOVE}, + {COMPOUND_STRING("Try to Faint"), LIST_AI_TRY_TO_FAINT}, + {COMPOUND_STRING("Check Viability"), LIST_AI_CHECK_VIABILITY}, + {COMPOUND_STRING("Force Setup First Turn"), LIST_AI_FORCE_SETUP_FIRST_TURN}, + {COMPOUND_STRING("Risky"), LIST_AI_RISKY}, + {COMPOUND_STRING("Try to 2HKO"), LIST_AI_TRY_TO_2HKO}, + {COMPOUND_STRING("Prefer Baton Pass"), LIST_AI_PREFER_BATON_PASS}, + {COMPOUND_STRING("Double Battle"), LIST_AI_DOUBLE_BATTLE}, + {COMPOUND_STRING("HP Aware"), LIST_AI_HP_AWARE}, + {COMPOUND_STRING("Powerful Status"), LIST_AI_POWERFUL_STATUS}, + {COMPOUND_STRING("Negate Unaware"), LIST_AI_NEGATE_UNAWARE}, + {COMPOUND_STRING("Will Suicide"), LIST_AI_WILL_SUICIDE}, + {COMPOUND_STRING("Prefer Status Moves"), LIST_AI_PREFER_STATUS_MOVES}, + {COMPOUND_STRING("Stall"), LIST_AI_STALL}, + {COMPOUND_STRING("Smart Switching"), LIST_AI_SMART_SWITCHING}, + {COMPOUND_STRING("Ace Pokémon"), LIST_AI_ACE_POKEMON}, + {COMPOUND_STRING("Omniscient"), LIST_AI_OMNISCIENT}, + {COMPOUND_STRING("Smart Mon Choices"), LIST_AI_SMART_MON_CHOICES}, + {COMPOUND_STRING("Conservative"), LIST_AI_CONSERVATIVE}, + {COMPOUND_STRING("Sequence Switching"), LIST_AI_SEQUENCE_SWITCHING}, + {COMPOUND_STRING("Double Ace Pokémon"), LIST_AI_DOUBLE_ACE_POKEMON}, + {COMPOUND_STRING("Weigh Ability Prediction"), LIST_AI_WEIGH_ABILITY_PREDICTION}, + {COMPOUND_STRING("Prefer Highest Damage Move"), LIST_AI_PREFER_HIGHEST_DAMAGE_MOVE}, + {COMPOUND_STRING("Predict Switch"), LIST_AI_PREDICT_SWITCH}, + {COMPOUND_STRING("Predict Incoming Mon"), LIST_AI_PREDICT_INCOMING_MON}, + {COMPOUND_STRING("Dynamic Func"), LIST_AI_DYNAMIC_FUNC}, + {COMPOUND_STRING("Roaming"), LIST_AI_ROAMING}, + {COMPOUND_STRING("Safari"), LIST_AI_SAFARI}, + {COMPOUND_STRING("First Battle"), LIST_AI_FIRST_BATTLE}, }; static const struct ListMenuItem sVariousListItems[] = { - {sText_ShowHP, VARIOUS_SHOW_HP}, - {sText_SubstituteHp, VARIOUS_SUBSTITUTE_HP}, - {sText_InLove, VARIOUS_IN_LOVE}, + {COMPOUND_STRING("Show HP"), VARIOUS_SHOW_HP}, + {COMPOUND_STRING("Substitute HP"), VARIOUS_SUBSTITUTE_HP}, + {COMPOUND_STRING("In Love"), VARIOUS_IN_LOVE}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -934,7 +799,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) { u32 switchMon = GetMonData(&gEnemyParty[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, sText_IsSwitching, 74, 64, 0, NULL); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Switching to "), 74, 64, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); } From c360900a5b19e63d89f2fa44f927a485e4b68bbf Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 5 Jul 2025 07:46:23 -0400 Subject: [PATCH 109/248] Renaming STATUS1_REFRESH and adding more constants for common STATUS1 checks. (#7284) --- include/constants/battle.h | 5 ++++- src/battle_ai_main.c | 10 +++++----- src/battle_ai_switch_items.c | 5 ++--- src/battle_ai_util.c | 4 ++-- src/battle_script_commands.c | 6 +++--- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 2ebf99ebce..e785498489 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -132,7 +132,10 @@ enum BattlerId #define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON) #define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) -#define STATUS1_REFRESH (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) +#define STATUS1_CAN_MOVE (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE) +#define STATUS1_INCAPACITATED (STATUS1_SLEEP | STATUS1_FREEZE) +#define STATUS1_ICY_ANY (STATUS1_FREEZE | STATUS1_FROSTBITE) +#define STATUS1_DAMAGING (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_FROSTBITE) enum VolatileFlags { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 78693b1950..751402af43 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1059,7 +1059,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Don't use anything but super effective thawing moves if target is frozen if any other attack available - if (((GetMoveType(move) == TYPE_FIRE && GetMovePower(move) != 0) || CanBurnHitThaw(move)) && effectiveness < UQ_4_12(2.0) && (gBattleMons[battlerDef].status1 & (STATUS1_FROSTBITE | STATUS1_FREEZE))) + if (((GetMoveType(move) == TYPE_FIRE && GetMovePower(move) != 0) || CanBurnHitThaw(move)) && effectiveness < UQ_4_12(2.0) && (gBattleMons[battlerDef].status1 & STATUS1_ICY_ANY)) { u32 aiMove; for (i = 0; i < MAX_MON_MOVES; i++) @@ -2029,7 +2029,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_REFRESH: - if (!(gBattleMons[battlerDef].status1 & (STATUS1_PSN_ANY | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_FROSTBITE))) + if (!(gBattleMons[battlerDef].status1 & STATUS1_CAN_MOVE)) ADJUST_SCORE(-10); break; case EFFECT_PSYCHO_SHIFT: @@ -2085,7 +2085,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_BIDE: if (!HasDamagingMove(battlerDef) || aiData->hpPercents[battlerAtk] < 30 //Close to death - || gBattleMons[battlerDef].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) //No point in biding if can't take damage + || gBattleMons[battlerDef].status1 & STATUS1_INCAPACITATED) //No point in biding if can't take damage ADJUST_SCORE(-10); break; case EFFECT_HIT_SWITCH_TARGET: @@ -2565,7 +2565,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && GetMoveEffect(aiData->partnerMove) == EFFECT_PLEDGE && move != aiData->partnerMove) // Different pledge moves { - if (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_INCAPACITATED) // && gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 != 1) // Will wake up this turn - how would AI know ADJUST_SCORE(-10); // Don't use combo move if your partner will cause failure } @@ -3835,7 +3835,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(10); // check thawing moves - if ((gBattleMons[battlerAtk].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) && MoveThawsUser(move)) + if (gBattleMons[battlerAtk].status1 & STATUS1_ICY_ANY && MoveThawsUser(move)) ADJUST_SCORE(10); // check burn / frostbite diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index dde7434155..550a2f91f7 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -2395,12 +2395,11 @@ static bool32 ShouldUseItem(u32 battler) case EFFECT_ITEM_CURE_STATUS: if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) shouldUse = TRUE; - if (itemEffects[3] & ITEM3_POISON && (gBattleMons[battler].status1 & STATUS1_POISON - || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON)) + if (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) shouldUse = TRUE; if (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) shouldUse = TRUE; - if (itemEffects[3] & ITEM3_FREEZE && (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE)) + if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) shouldUse = TRUE; if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) shouldUse = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 88b4e3b065..645a34beba 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1870,7 +1870,7 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) bool32 IsBattlerDamagedByStatus(u32 battler) { - return gBattleMons[battler].status1 & (STATUS1_BURN | STATUS1_FROSTBITE | STATUS1_POISON | STATUS1_TOXIC_POISON) + return gBattleMons[battler].status1 & STATUS1_DAMAGING || gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_NIGHTMARE | STATUS2_CURSED) || gStatuses3[battler] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED) || gStatuses4[battler] & (STATUS4_SALT_CURE) @@ -4809,7 +4809,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) scoreIncrease += GOOD_EFFECT; - else if (gBattleMons[battlerDef].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_FROSTBITE)) + else if (gBattleMons[battlerDef].status1 & STATUS1_DAMAGING) scoreIncrease += DECENT_EFFECT; if (IsBattlerPredictedToSwitch(battlerDef)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e49d824d75..7138ad9803 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14687,7 +14687,7 @@ static void Cmd_curestatuswithmove(void) u32 shouldHeal; if (GetMoveEffect(gCurrentMove) == EFFECT_REFRESH) - shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_REFRESH; + shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_CAN_MOVE; else // Take Heart shouldHeal = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; @@ -15871,9 +15871,9 @@ static void Cmd_handleballthrow(void) * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) / (3 * gBattleMons[gBattlerTarget].maxHP); - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE)) + if (gBattleMons[gBattlerTarget].status1 & STATUS1_INCAPACITATED) odds *= 2; - if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON | STATUS1_FROSTBITE)) + if (gBattleMons[gBattlerTarget].status1 & STATUS1_CAN_MOVE) odds = (odds * 15) / 10; if (gBattleResults.catchAttempts[ballId] < 255) From 38a3963ec2ecb9eafa068b7b5c9ba3f8bbf0757a Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 5 Jul 2025 13:47:36 +0100 Subject: [PATCH 110/248] Fix Psych Up message and cleanup and don't allow switching to self in tests (#7277) --- asm/macros/battle_script.inc | 3 +-- data/battle_scripts_1.s | 2 +- src/battle_message.c | 3 ++- src/battle_script_commands.c | 17 ++++++++++++----- test/test_runner_battle.c | 4 ++-- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 02da5bc775..b23992d332 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1033,9 +1033,8 @@ .4byte \failInstr .endm - .macro copyfoestats unused:req + .macro copyfoestats .byte 0xbd - .4byte \unused .endm .macro rapidspinfree diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bacf15e1c6..a57ce67c25 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4258,7 +4258,7 @@ BattleScript_EffectPsychUp:: attackcanceler attackstring ppreduce - copyfoestats BattleScript_ButItFailed + copyfoestats attackanimation waitanimation printstring STRINGID_PKMNCOPIEDSTATCHANGES diff --git a/src/battle_message.c b/src/battle_message.c index 9082bbef6c..860a3d5ac2 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1202,7 +1202,8 @@ const u16 gGotBurnedStringIds[] = const u16 gGotFrostbiteStringIds[] = { - [B_MSG_STATUSED] = STRINGID_PKMNGOTFROSTBITE + [B_MSG_STATUSED] = STRINGID_PKMNGOTFROSTBITE, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNGOTFROSTBITE }; const u16 gFrostbiteHealedStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7138ad9803..ff4104b19e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -61,6 +61,7 @@ #include "constants/songs.h" #include "constants/trainer_slide.h" #include "constants/trainers.h" +#include "test/battle.h" #include "battle_util.h" #include "constants/pokemon.h" #include "config/battle.h" @@ -2397,7 +2398,7 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) // According to Gen5 Weakness berry activation happens after the attackanimation. // It doesn't have any impact on gameplay and is only a visual thing which can be adjusted later. -static inline bool32 TryActivateWeakenessBerry(u32 battlerDef) +static inline bool32 TryActivateWeaknessBerry(u32 battlerDef) { if (gSpecialStatuses[battlerDef].berryReduced && gBattleMons[battlerDef].item != ITEM_NONE) { @@ -2440,7 +2441,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) if (TryTeraShellDistortTypeMatchups(battlerDef)) return TRUE; - if (TryActivateWeakenessBerry(battlerDef)) + if (TryActivateWeaknessBerry(battlerDef)) return TRUE; } } @@ -2450,7 +2451,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) return TRUE; if (TryTeraShellDistortTypeMatchups(gBattlerTarget)) return TRUE; - if (TryActivateWeakenessBerry(gBattlerTarget)) + if (TryActivateWeaknessBerry(gBattlerTarget)) return TRUE; } @@ -7431,6 +7432,11 @@ static void Cmd_getswitchedmondata(void) if (gBattleControllerExecFlags) return; + if (TESTING + && gBattlerPartyIndexes[battler] == gBattleStruct->monToSwitchIntoId[battler] + && gBattleStruct->hpBefore[battler] != 0) // battler is alive + Test_ExitWithResult(TEST_RESULT_ERROR, 0, ":L:%s:%d: battler is trying to switch to themself", __FILE__, __LINE__); + gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler]; BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); @@ -14269,7 +14275,7 @@ static void Cmd_halvehp(void) // Psych Up static void Cmd_copyfoestats(void) { - CMD_ARGS(const u8 *unused); + CMD_ARGS(); s32 i; @@ -14277,8 +14283,9 @@ static void Cmd_copyfoestats(void) { gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i]; } + gBattleScripting.battler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; // Has an unused jump ptr(possibly for a failed attempt) parameter. + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_rapidspinfree(void) diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 20271a588d..51f0ca02dd 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2016,9 +2016,9 @@ void CloseTurn(u32 sourceLine) { if (!(DATA.actionBattlers & (1 << i))) { - if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. SetAiActionToPass(sourceLine, i); - else + else Move(sourceLine, &gBattleMons[i], (struct MoveContext) { move: MOVE_CELEBRATE, explicitMove: TRUE }); } } From 4052ab337c4f25a66ec38b770ce61b5924cc2309 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 5 Jul 2025 08:49:35 -0400 Subject: [PATCH 111/248] Expanding and Refactoring Skill Swap and other ability-changing moves (#7238) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_ai_main.h | 5 +- include/battle_ai_util.h | 9 +- src/battle_ai_main.c | 232 +++++---------- src/battle_ai_util.c | 435 +++++++++++++++++++++++++++- test/battle/ai/ai_check_viability.c | 32 ++ 5 files changed, 535 insertions(+), 178 deletions(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 31d6437b97..6c58063350 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -38,7 +38,10 @@ enum AIScore WEAK_EFFECT = 1, DECENT_EFFECT = 2, GOOD_EFFECT = 3, - BEST_EFFECT = 4 + BEST_EFFECT = 4, + BAD_EFFECT = -1, + AWFUL_EFFECT = -3, + WORST_EFFECT = -5 }; // AI_TryToFaint diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 2144056cd5..991584a534 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -177,6 +177,7 @@ bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect); +bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsSwitchOutEffect(enum BattleMoveEffects effect); bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); @@ -208,10 +209,14 @@ bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); // ability logic bool32 IsMoxieTypeAbility(u32 ability); -bool32 ShouldTriggerAbility(u32 battler, u32 ability); +bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability); +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability); +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct AiLogicData *aiData); +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData); +s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData); // partner logic -#define IS_TARGETING_PARTNER(battlerAtk, battlerDef)((battlerAtk) == (battlerDef ^ BIT_FLANK)) +bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); u32 GetAllyChosenMove(u32 battlerId); bool32 IsValidDoubleBattle(u32 battlerAtk); bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 751402af43..bc3c35db84 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1030,7 +1030,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; SetTypeBeforeUsingMove(move, battlerAtk); @@ -1142,7 +1142,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: - if (moveType == TYPE_DARK && !IsBattleMoveStatus(move) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (moveType == TYPE_DARK && !IsBattleMoveStatus(move) && !IsTargetingPartner(battlerAtk, battlerDef)) RETURN_SCORE_MINUS(10); break; case ABILITY_RATTLED: @@ -2312,7 +2312,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // evasion check if (gBattleMons[battlerDef].statStages[STAT_EVASION] == MIN_STAT_STAGE - || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner + || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IsTargetingPartner(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner ADJUST_SCORE(-10); break; case EFFECT_PSYCH_UP: // haze stats check @@ -2361,26 +2361,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || !CanBattlerGetOrLoseItem(battlerAtk, gBattleMons[battlerAtk].item)) // AI knows its own item ADJUST_SCORE(-10); break; - case EFFECT_ROLE_PLAY: - if (aiData->abilities[battlerAtk] == aiData->abilities[battlerDef] - || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeCopied) - ADJUST_SCORE(-10); - else if (IsAbilityOfRating(aiData->abilities[battlerAtk], 5)) - ADJUST_SCORE(-4); - break; - case EFFECT_DOODLE: // Same as Role Play, but also check if the partner's ability should be replaced - if (aiData->abilities[battlerAtk] == aiData->abilities[battlerDef] - || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == aiData->abilities[battlerDef] - || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[BATTLE_PARTNER(battlerAtk)]].cantBeSuppressed - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeCopied) - ADJUST_SCORE(-10); - else if (IsAbilityOfRating(aiData->abilities[battlerAtk], 5) || IsAbilityOfRating(aiData->abilities[BATTLE_PARTNER(battlerAtk)], 5)) - ADJUST_SCORE(-4); - break; case EFFECT_WISH: if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter) ADJUST_SCORE(-10); @@ -2401,40 +2381,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) ADJUST_SCORE(-20); break; - case EFFECT_SKILL_SWAP: - if (aiData->abilities[battlerAtk] == ABILITY_NONE || aiData->abilities[battlerDef] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeSwapped - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeSwapped - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - ADJUST_SCORE(-10); - break; - case EFFECT_WORRY_SEED: - if (aiData->abilities[battlerDef] == ABILITY_INSOMNIA - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - break; - case EFFECT_GASTRO_ACID: - if (gStatuses3[battlerDef] & STATUS3_GASTRO_ACID - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeSuppressed) - ADJUST_SCORE(-10); - break; + case EFFECT_DOODLE: case EFFECT_ENTRAINMENT: - if (aiData->abilities[battlerAtk] == ABILITY_NONE - || gAbilitiesInfo[aiData->abilities[battlerAtk]].cantBeCopied - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); - else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - ADJUST_SCORE(-10); - break; + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: case EFFECT_SIMPLE_BEAM: - if (aiData->abilities[battlerDef] == ABILITY_SIMPLE - || gAbilitiesInfo[aiData->abilities[battlerDef]].cantBeOverwritten - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) - ADJUST_SCORE(-10); + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + if (!CanEffectChangeAbility(battlerAtk, battlerDef, moveEffect, aiData)) + ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); break; case EFFECT_SNATCH: if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched) @@ -2442,27 +2397,27 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_POWER_TRICK: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].defense >= gBattleMons[battlerAtk].attack && !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(-10); break; case EFFECT_POWER_SWAP: // Don't use if attacker's stat stages are higher than opponents - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].statStages[STAT_ATK] >= gBattleMons[battlerDef].statStages[STAT_ATK] && gBattleMons[battlerAtk].statStages[STAT_SPATK] >= gBattleMons[battlerDef].statStages[STAT_SPATK]) ADJUST_SCORE(-10); break; case EFFECT_GUARD_SWAP: // Don't use if attacker's stat stages are higher than opponents - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].statStages[STAT_DEF] >= gBattleMons[battlerDef].statStages[STAT_DEF] && gBattleMons[battlerAtk].statStages[STAT_SPDEF] >= gBattleMons[battlerDef].statStages[STAT_SPDEF]) ADJUST_SCORE(-10); break; case EFFECT_SPEED_SWAP: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2475,7 +2430,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_HEART_SWAP: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2492,7 +2447,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_POWER_SPLIT: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2509,7 +2464,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_GUARD_SPLIT: - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2674,14 +2629,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_HEAL_PULSE: // and floral healing - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) // Don't heal enemies + if (!IsTargetingPartner(battlerAtk, battlerDef)) // Don't heal enemies { ADJUST_SCORE(-10); break; } // fallthrough case EFFECT_HIT_ENEMY_HEAL_ALLY: // pollen puff - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) return 0; // cannot even select @@ -2698,7 +2653,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOPSY_TURVY: - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 targetPositiveStages = CountPositiveStatStages(battlerDef); u32 targetNegativeStages = CountNegativeStatStages(battlerDef); @@ -2743,7 +2698,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (isDoubleBattle) { - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (!IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); } else @@ -2766,7 +2721,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: - if (!IS_TARGETING_PARTNER(battlerAtk, battlerDef) + if (!IsTargetingPartner(battlerAtk, battlerDef) || !isDoubleBattle || AI_IsSlower(battlerAtk, battlerDef, move) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) @@ -2943,7 +2898,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 movesetIndex = gAiThinkingStruct->movesetIndex; - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (IsBattleMoveStatus(move)) @@ -2984,7 +2939,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; enum BattleMoveEffects partnerEffect = GetMoveEffect(aiData->partnerMove); bool32 partnerProtecting = IsAllyProtectingFromMove(battlerAtk, move, aiData->partnerMove) && !MoveIgnoresProtect(move); - bool32 attackerHasBadAbility = (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating < 0); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); @@ -3174,7 +3128,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - ADJUST_SCORE(-DECENT_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); } } // No reason to kill partner has been found. @@ -3203,7 +3157,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // check specific target - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { bool32 isMoveAffectedByPartnerAbility = TRUE; @@ -3252,7 +3206,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + else if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3298,7 +3252,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + else if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3314,7 +3268,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_WATER_COMPACTION: if (moveType == TYPE_WATER && isFriendlyFireOK - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3333,7 +3287,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case ABILITY_STEAM_ENGINE: if (isFriendlyFireOK && (moveType == TYPE_WATER || moveType == TYPE_FIRE) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3349,7 +3303,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_THERMAL_EXCHANGE: if (moveType == TYPE_FIRE && isFriendlyFireOK && !IsBattleMoveStatus(move) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3376,7 +3330,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3394,7 +3348,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(DECENT_EFFECT); } - if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3407,7 +3361,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_JUSTIFIED: if (moveType == TYPE_DARK && isFriendlyFireOK && !IsBattleMoveStatus(move) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3429,7 +3383,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_RATTLED: if (!IsBattleMoveStatus(move) && isFriendlyFireOK && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) - && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3445,7 +3399,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_CONTRARY: case ABILITY_DEFIANT: case ABILITY_COMPETITIVE: - if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { @@ -3471,6 +3425,15 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SIMPLE_BEAM: + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + AbilityChangeScore(battlerAtk, battlerAtkPartner, effect, &score, aiData); + return score; case EFFECT_SPICY_EXTRACT: if (AI_ShouldSpicyExtract(battlerAtk, battlerAtkPartner, move, aiData)) { @@ -3519,51 +3482,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_PLUS(WEAK_EFFECT); } break; - case EFFECT_SKILL_SWAP: - if (aiData->abilities[battlerAtk] != aiData->abilities[BATTLE_PARTNER(battlerAtk)] && !attackerHasBadAbility) - { - // Partner abilities - if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_TRUANT) - { - ADJUST_SCORE(10); - } - else if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_INTIMIDATE) - { - ADJUST_SCORE(DECENT_EFFECT); - } - // Active mon abilities - if (aiData->abilities[battlerAtk] == ABILITY_COMPOUND_EYES - && HasMoveWithLowAccuracy(battlerAtkPartner, FOE(battlerAtkPartner), 90, TRUE, atkPartnerAbility, aiData->abilities[FOE(battlerAtkPartner)], atkPartnerHoldEffect, aiData->holdEffects[FOE(battlerAtkPartner)])) - { - ADJUST_SCORE(GOOD_EFFECT); - } - else if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY && HasMoveThatLowersOwnStats(battlerAtkPartner)) - { - ADJUST_SCORE(GOOD_EFFECT); - } - return score; - } - break; - case EFFECT_ROLE_PLAY: - if (attackerHasBadAbility && !partnerHasBadAbility) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); - } - break; - case EFFECT_WORRY_SEED: - case EFFECT_GASTRO_ACID: - case EFFECT_SIMPLE_BEAM: - if (partnerHasBadAbility) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); - } - break; - case EFFECT_ENTRAINMENT: - if (partnerHasBadAbility && IsAbilityOfRating(aiData->abilities[battlerAtk], 0)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); - } - break; case EFFECT_SOAK: if (atkPartnerAbility == ABILITY_WONDER_GUARD && !IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_WATER) @@ -3619,6 +3537,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else // checking opponent { // these checks mostly handled in AI_CheckBadMove and AI_CheckViability +/* switch (effect) { case EFFECT_SKILL_SWAP: @@ -3630,7 +3549,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } - +*/ // lightning rod, flash fire against enemy handled in AI_CheckBadMove } @@ -3800,7 +3719,7 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } else { - ADJUST_SCORE(-DECENT_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); } } break; @@ -4622,11 +4541,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } } break; - case EFFECT_ROLE_PLAY: - case EFFECT_DOODLE: - if (IsAbilityOfRating(aiData->abilities[battlerDef], 5)) - ADJUST_SCORE(DECENT_EFFECT); - break; case EFFECT_INGRAIN: ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) @@ -4663,29 +4577,15 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) ADJUST_SCORE(DECENT_EFFECT); break; - case EFFECT_SKILL_SWAP: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - break; - else if (gAbilitiesInfo[aiData->abilities[battlerDef]].aiRating > gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating) - ADJUST_SCORE(DECENT_EFFECT); - break; - case EFFECT_WORRY_SEED: - case EFFECT_GASTRO_ACID: - case EFFECT_SIMPLE_BEAM: - if (IsAbilityOfRating(aiData->abilities[battlerDef], 5)) - ADJUST_SCORE(DECENT_EFFECT); - break; + case EFFECT_DOODLE: case EFFECT_ENTRAINMENT: - if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) - break; - if (aiData->abilities[battlerDef] != aiData->abilities[battlerAtk] && !(gStatuses3[battlerDef] & STATUS3_GASTRO_ACID)) - { - if (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating <= 0) - ADJUST_SCORE(DECENT_EFFECT); - else if (IsAbilityOfRating(aiData->abilities[battlerDef], 5) && gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating <= 3) - ADJUST_SCORE(WEAK_EFFECT); - } - break; + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SIMPLE_BEAM: + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + AbilityChangeScore(battlerAtk, battlerDef, moveEffect, &score, aiData); + return score; case EFFECT_IMPRISON: if (predictedMove != MOVE_NONE && HasMove(battlerAtk, predictedMove)) ADJUST_SCORE(DECENT_EFFECT); @@ -5301,7 +5201,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // Targeting partner, check benefits of doing that instead - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetMovePower(move) != 0) @@ -5328,7 +5228,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u8 i; - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) + if (IsTargetingPartner(battlerAtk, battlerDef) || gBattleResults.battleTurnCounter != 0) return score; @@ -5459,7 +5359,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u8 i; struct AiLogicData *aiData = gAiLogicData; - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetMoveCriticalHitStage(move) > 0) @@ -5532,7 +5432,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Adds score bonus to OHKOs and 2HKOs static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) return score; if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 1) @@ -5546,7 +5446,7 @@ static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Prefers moves that are good for baton pass static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) + if (IsTargetingPartner(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 || !IsBattleMoveStatus(move) || !HasMoveWithEffect(battlerAtk, EFFECT_BATON_PASS) @@ -5604,7 +5504,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) + if (IsTargetingPartner(battlerAtk, battlerDef)) { if ((effect == EFFECT_HEAL_PULSE || effect == EFFECT_HIT_ENEMY_HEAL_ALLY) || (moveType == TYPE_ELECTRIC && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_VOLT_ABSORB) @@ -6002,7 +5902,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ION_DELUGE: case EFFECT_MAGIC_COAT: case EFFECT_SNATCH: - ADJUST_SCORE(-BEST_EFFECT); + ADJUST_SCORE(WORST_EFFECT); break; // Get stuck in bad matchup @@ -6012,7 +5912,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INGRAIN: case EFFECT_NO_RETREAT: case EFFECT_MEAN_LOOK: - ADJUST_SCORE(-GOOD_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); break; default: @@ -6025,17 +5925,17 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (GetMoveAdditionalEffectById(move, i)->moveEffect) { case MOVE_EFFECT_WRAP: - ADJUST_SCORE(-GOOD_EFFECT); + ADJUST_SCORE(AWFUL_EFFECT); break; case MOVE_EFFECT_FEINT: - ADJUST_SCORE(-BEST_EFFECT); + ADJUST_SCORE(WORST_EFFECT); break; } } // Take advantage of ability damage bonus if ((ability == ABILITY_STAKEOUT || ability == ABILITY_ANALYTIC) && IsBattleMoveStatus(move)) - ADJUST_SCORE(-WEAK_EFFECT); + ADJUST_SCORE(BAD_EFFECT); // This must be last or the player can gauge whether the AI is predicting based on how long it thinks if (!IsBattlerPredictedToSwitch(battlerDef)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 645a34beba..fd08bd7c0c 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1982,6 +1982,9 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) // Don't decrese stat if opposing battler has Encore if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; + + if (DoesAbilityRaiseStatsWhenLowered(gAiLogicData->abilities[battlerDef])) + return NO_INCREASE; // TODO: Avoid decreasing stat if // player can kill ai in 2 hits with decreased attack / sp atk stages @@ -2358,6 +2361,28 @@ bool32 HasMoveThatLowersOwnStats(u32 battlerId) return FALSE; } +bool32 HasMoveThatRaisesOwnStats(u32 battlerId) +{ + s32 i, j; + u32 aiMove; + u16 *moves = GetMovesArray(battlerId); + for (i = 0; i < MAX_MON_MOVES; i++) + { + aiMove = moves[i]; + if (aiMove != MOVE_NONE && aiMove != MOVE_UNAVAILABLE) + { + u32 additionalEffectCount = GetMoveAdditionalEffectCount(aiMove); + for (j = 0; j < additionalEffectCount; j++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, j); + if (IsSelfStatRaisingEffect(additionalEffect->moveEffect) && additionalEffect->self) + return TRUE; + } + } + } + return FALSE; +} + bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) { s32 i; @@ -2588,6 +2613,31 @@ bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect) } } +bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect) +{ + // Self stat lowering moves like Power Up Punch or Charge Beam + switch (effect) + { + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + return TRUE; + default: + return FALSE; + } +} + bool32 IsSwitchOutEffect(enum BattleMoveEffects effect) { // Switch out effects like U-Turn, Volt Switch, etc. @@ -3618,6 +3668,12 @@ bool32 IsValidDoubleBattle(u32 battlerAtk) return FALSE; } +// TODO: Handling for when the 'partner' is not actually a partner, a la Battle Royale or B_WILD_NATURAL_ENEMIES +bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef) +{ + return ((battlerAtk) == (battlerDef ^ BIT_FLANK)); +} + u32 GetAllyChosenMove(u32 battlerId) { u32 partnerBattler = BATTLE_PARTNER(battlerId); @@ -4887,50 +4943,411 @@ bool32 IsMoxieTypeAbility(u32 ability) } } -// Should the AI use a spread move to deliberately activate its partner's ability? -bool32 ShouldTriggerAbility(u32 battler, u32 ability) +bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability) { switch (ability) { + case ABILITY_CONTRARY: + case ABILITY_COMPETITIVE: + case ABILITY_DEFIANT: + return TRUE; + default: + return FALSE; + } +} + +bool32 DoesIntimidateRaiseStats(u32 ability) +{ + switch (ability) + { + case ABILITY_COMPETITIVE: + case ABILITY_CONTRARY: + case ABILITY_DEFIANT: + case ABILITY_GUARD_DOG: + case ABILITY_RATTLED: + return TRUE; + default: + return FALSE; + } +} + +// TODO: work out when to attack into the player's contextually 'beneficial' ability +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability) +{ + if (IsTargetingPartner(battlerAtk, battlerDef)) + { + switch (ability) + { case ABILITY_LIGHTNING_ROD: case ABILITY_STORM_DRAIN: if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) return FALSE; else - return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); case ABILITY_DEFIANT: case ABILITY_JUSTIFIED: case ABILITY_MOXIE: case ABILITY_SAP_SIPPER: case ABILITY_THERMAL_EXCHANGE: - return (BattlerStatCanRise(battler, ability, STAT_ATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_ATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)); case ABILITY_COMPETITIVE: - return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); + // TODO: logic for when to trigger Contrary case ABILITY_CONTRARY: return TRUE; case ABILITY_DRY_SKIN: case ABILITY_VOLT_ABSORB: case ABILITY_WATER_ABSORB: - return (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_HP_AWARE); + return (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_HP_AWARE); case ABILITY_RATTLED: case ABILITY_STEAM_ENGINE: - return BattlerStatCanRise(battler, ability, STAT_SPEED); + return BattlerStatCanRise(battlerDef, ability, STAT_SPEED); case ABILITY_FLASH_FIRE: - return (HasMoveWithType(battler, TYPE_FIRE) && !gDisableStructs[battler].flashFireBoosted); + return (HasMoveWithType(battlerDef, TYPE_FIRE) && !gDisableStructs[battlerDef].flashFireBoosted); case ABILITY_WATER_COMPACTION: case ABILITY_WELL_BAKED_BODY: - return (BattlerStatCanRise(battler, ability, STAT_DEF)); + return (BattlerStatCanRise(battlerDef, ability, STAT_DEF)); default: return FALSE; + } } + else + { + return FALSE; + } +} + +// Used by CheckBadMove; this is determining purely if the effect CAN change an ability, not if it SHOULD. +// At the moment, the parts about Mummy and Wandering Spirit are not actually used. +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct AiLogicData *aiData) +{ + // Dynamaxed Pokemon are immune to some ability-changing effects. + if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + { + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_SKILL_SWAP: + return FALSE; + default: + break; + } + } + + if (gStatuses3[battlerDef] & STATUS3_GASTRO_ACID) + return FALSE; + + u32 atkAbility = aiData->abilities[battlerAtk]; + u32 defAbility = aiData->abilities[battlerDef]; + bool32 hasSameAbility = (atkAbility == defAbility); + + if (defAbility == ABILITY_NONE) + return FALSE; + + if (atkAbility == ABILITY_NONE) + { + switch (effect) + { + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + return FALSE; + + default: + break; + } + } + + // Checking for Ability-specific immunities. + switch (effect) + { + case EFFECT_DOODLE: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSuppressed || gAbilitiesInfo[defAbility].cantBeCopied) + return FALSE; + + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + u32 partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; + if (gAbilitiesInfo[partnerAbility].cantBeSuppressed) + return FALSE; + if (partnerAbility == defAbility) + return FALSE; + } + break; + + case EFFECT_ROLE_PLAY: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSuppressed || gAbilitiesInfo[defAbility].cantBeCopied) + return FALSE; + break; + + case EFFECT_SKILL_SWAP: + if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSwapped || gAbilitiesInfo[defAbility].cantBeSwapped) + return FALSE; + break; + + case EFFECT_GASTRO_ACID: + if (gAbilitiesInfo[defAbility].cantBeSuppressed) + return FALSE; + break; + + case EFFECT_ENTRAINMENT: + if (hasSameAbility || gAbilitiesInfo[defAbility].cantBeOverwritten || gAbilitiesInfo[atkAbility].cantBeCopied) + return FALSE; + break; + + case EFFECT_SIMPLE_BEAM: + if (defAbility == ABILITY_SIMPLE || gAbilitiesInfo[defAbility].cantBeOverwritten) + return FALSE; + break; + + case EFFECT_WORRY_SEED: + if (defAbility == ABILITY_INSOMNIA || gAbilitiesInfo[defAbility].cantBeOverwritten) + return FALSE; + break; + + default: + return FALSE; + } + + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_ABILITY_SHIELD) + { + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SIMPLE_BEAM: + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + return FALSE; + default: + break; + } + } + + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD) + { + switch (effect) + { + case EFFECT_DOODLE: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + return FALSE; + default: + break; + } + } + + return TRUE; +} + +bool32 DoesEffectReplaceTargetAbility(u32 effect) +{ + switch (effect) + { + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_SIMPLE_BEAM: + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + return TRUE; + default: + return FALSE; + } +} + +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData) +{ + bool32 isTargetingPartner = IsTargetingPartner(battlerAtk, battlerDef); + u32 abilityAtk = aiData->abilities[battlerAtk]; + u32 abilityDef = aiData->abilities[battlerDef]; + bool32 partnerHasBadAbility = FALSE; + u32 partnerAbility = ABILITY_NONE; + bool32 attackerHasBadAbility = (gAbilitiesInfo[abilityAtk].aiRating < 0); + s32 currentAbilityScore, transferredAbilityScore = 0; + + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; + if (!(gAbilitiesInfo[partnerAbility].cantBeSuppressed) && (gAbilitiesInfo[partnerAbility].aiRating < 0)) + partnerHasBadAbility = TRUE; + } + + if (effect == EFFECT_GASTRO_ACID) + abilityAtk = ABILITY_NONE; + else if (effect == EFFECT_SIMPLE_BEAM) + abilityAtk = ABILITY_SIMPLE; + else if (effect == EFFECT_WORRY_SEED) + abilityAtk = ABILITY_INSOMNIA; + + if (effect == EFFECT_DOODLE || effect == EFFECT_ROLE_PLAY || effect == EFFECT_SKILL_SWAP) + { + if (partnerHasBadAbility && effect == EFFECT_DOODLE) + ADJUST_SCORE_PTR(DECENT_EFFECT); + + if (attackerHasBadAbility) + ADJUST_SCORE_PTR(DECENT_EFFECT); + + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerAtk, abilityAtk, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerAtk, abilityDef, aiData); + ADJUST_SCORE_PTR(transferredAbilityScore - currentAbilityScore); + } + + if (isTargetingPartner) + { + if (DoesEffectReplaceTargetAbility(effect)) + { + if (partnerHasBadAbility) + ADJUST_SCORE_PTR(BEST_EFFECT); + + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityDef, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityAtk, aiData); + ADJUST_SCORE_PTR(transferredAbilityScore - currentAbilityScore); + } + else // This is only Role Play as Doodle can't target the partner + { + ADJUST_SCORE_PTR(-20); + } + + // Trigger Plus or Minus in modern gens. This is not in the overarching function because Skill Swap is rarely beneficial here. + if (B_PLUS_MINUS_INTERACTION >= GEN_5) + { + if (((effect == EFFECT_ENTRAINMENT) && (abilityAtk == ABILITY_PLUS || abilityAtk == ABILITY_MINUS)) || ((effect == EFFECT_ROLE_PLAY) && (abilityDef == ABILITY_PLUS || abilityDef == ABILITY_MINUS))) + ADJUST_SCORE_PTR(DECENT_EFFECT); + } + + } + // Targeting an opponent. + else + { + // We already checked if we want their ability, so now we look to see if we want them to lose their ability. + if (DoesEffectReplaceTargetAbility(effect)) + { + currentAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityDef, aiData); + transferredAbilityScore = BattlerBenefitsFromAbilityScore(battlerDef, abilityAtk, aiData); + ADJUST_SCORE_PTR(currentAbilityScore - transferredAbilityScore); + } + } +} + +s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData) +{ + if (gAbilitiesInfo[ability].aiRating < 0) + return WORST_EFFECT; + + switch (ability) + { + // Transferrable abilities that can be assumed to be always beneficial. + case ABILITY_CLEAR_BODY: + case ABILITY_GOOD_AS_GOLD: + case ABILITY_MAGIC_GUARD: + case ABILITY_MOODY: + case ABILITY_PURIFYING_SALT: + case ABILITY_SPEED_BOOST: + case ABILITY_WHITE_SMOKE: + return GOOD_EFFECT; + // Conditional ability logic goes here. + case ABILITY_COMPOUND_EYES: + if (HasMoveWithLowAccuracy(battler, FOE(battler), 90, TRUE, aiData->abilities[battler], aiData->abilities[FOE(battler)], aiData->holdEffects[battler], aiData->holdEffects[FOE(battler)])) + return GOOD_EFFECT; + break; + case ABILITY_CONTRARY: + if (HasMoveThatLowersOwnStats(battler)) + return BEST_EFFECT; + if (HasMoveThatRaisesOwnStats(battler)) + return AWFUL_EFFECT; + break; + case ABILITY_FRIEND_GUARD: + case ABILITY_POWER_SPOT: + case ABILITY_VICTORY_STAR: + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler)) && aiData->abilities[BATTLE_PARTNER(battler)] != ability) + return GOOD_EFFECT; + break; + case ABILITY_GUTS: + if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL) && gBattleMons[battler].status1 & (STATUS1_REFRESH)) + return GOOD_EFFECT; + break; + case ABILITY_HUGE_POWER: + case ABILITY_PURE_POWER: + if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)) + return BEST_EFFECT; + break; + // Also used to Worry Seed WORRY_SEED + case ABILITY_INSOMNIA: + case ABILITY_VITAL_SPIRIT: + if (HasMoveWithEffect(battler, EFFECT_REST)) + return WORST_EFFECT; + return NO_INCREASE; + case ABILITY_INTIMIDATE: + u32 abilityDef = aiData->abilities[FOE(battler)]; + if (DoesIntimidateRaiseStats(abilityDef)) + { + return AWFUL_EFFECT; + } + else + { + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(FOE(battler)))) + { + abilityDef = aiData->abilities[BATTLE_PARTNER(FOE(battler))]; + if (DoesIntimidateRaiseStats(abilityDef)) + { + return AWFUL_EFFECT; + } + else + { + s32 score1 = IncreaseStatDownScore(battler, FOE(battler), STAT_ATK); + s32 score2 = IncreaseStatDownScore(battler, BATTLE_PARTNER(FOE(battler)), STAT_ATK); + if (score1 > score2) + return score1; + else + return score2; + } + } + return IncreaseStatDownScore(battler, FOE(battler), STAT_ATK); + } + case ABILITY_NO_GUARD: + if (HasLowAccuracyMove(battler, FOE(battler))) + return GOOD_EFFECT; + break; + // Toxic counter ticks upward while Poison Healed; losing Poison Heal while Toxiced can KO. + case ABILITY_POISON_HEAL: + if (gBattleMons[battler].status1 & (STATUS1_POISON)) + return WEAK_EFFECT; + if (gBattleMons[battler].status1 & (STATUS1_TOXIC_POISON)) + return BEST_EFFECT; + break; + // Also used to Simple Beam SIMPLE_BEAM. + case ABILITY_SIMPLE: + // Prioritize moves like Metal Claw, Charge Beam, or Power up Punch + if (HasMoveThatRaisesOwnStats(battler)) + return GOOD_EFFECT; + return NO_INCREASE; + case ABILITY_BEADS_OF_RUIN: + case ABILITY_SWORD_OF_RUIN: + case ABILITY_TABLETS_OF_RUIN: + case ABILITY_VESSEL_OF_RUIN: + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + if (aiData->abilities[BATTLE_PARTNER(battler)] != ability) + return GOOD_EFFECT; + else + return NO_INCREASE; + } + return GOOD_EFFECT; + default: + break; + } + + return NO_INCREASE; } u32 GetThinkingBattler(u32 battler) diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 0a5a9ff3df..47cf2450a9 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -278,3 +278,35 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") +{ + GIVEN { + PLAYER(SPECIES_ZUBAT) { Moves(MOVE_REST, MOVE_SLEEP_TALK, MOVE_AIR_CUTTER); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_BUDEW) { Moves(MOVE_WORRY_SEED, MOVE_SLUDGE_BOMB); } + } WHEN { + TURN { MOVE(player, MOVE_AIR_CUTTER); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm") +{ + u32 ability, move; + PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_LEAF_STORM; } + PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_CHARGE_BEAM; } + PARAMETRIZE { ability = ABILITY_OVERGROW; move = MOVE_CHARGE_BEAM; } + + GIVEN { + PLAYER(SPECIES_SERPERIOR) { Moves(move); Ability(ability); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_SWOOBAT) { Moves(MOVE_GUST, MOVE_SIMPLE_BEAM); } + } WHEN { + if (ability == ABILITY_CONTRARY && move == MOVE_LEAF_STORM) + TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_SIMPLE_BEAM); } + else + TURN { MOVE(player, move); NOT_EXPECT_MOVE(opponent, MOVE_SIMPLE_BEAM); } + } +} + + From e53709aa2553933dd77ab625c1022b1c033ba8f3 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 5 Jul 2025 15:51:56 +0100 Subject: [PATCH 112/248] Fix incorrect status in beneficial ability Guts check (#7285) --- 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 fd08bd7c0c..163c6b7e5e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -5273,7 +5273,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return GOOD_EFFECT; break; case ABILITY_GUTS: - if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL) && gBattleMons[battler].status1 & (STATUS1_REFRESH)) + if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL) && gBattleMons[battler].status1 & (STATUS1_CAN_MOVE)) return GOOD_EFFECT; break; case ABILITY_HUGE_POWER: From b183b660a1fb09c43d0fc7a9841090c8a6c0ff90 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Sun, 6 Jul 2025 14:10:50 +0100 Subject: [PATCH 113/248] Added missing braces (#7288) --- src/battle_ai_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 163c6b7e5e..5f8b6bb4be 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -5288,6 +5288,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return WORST_EFFECT; return NO_INCREASE; case ABILITY_INTIMIDATE: + { u32 abilityDef = aiData->abilities[FOE(battler)]; if (DoesIntimidateRaiseStats(abilityDef)) { @@ -5314,6 +5315,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData } return IncreaseStatDownScore(battler, FOE(battler), STAT_ATK); } + } case ABILITY_NO_GUARD: if (HasLowAccuracyMove(battler, FOE(battler))) return GOOD_EFFECT; From 0422a013c4ef8ce48184eb3a2bd550f32d370938 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:33:57 +0200 Subject: [PATCH 114/248] Add Set Hidden Nature option to the debug menu (#7281) --- data/scripts/debug.inc | 89 ++++++++++++++++++++++++++++++++++++++++++ data/specials.inc | 1 + src/debug.c | 4 +- src/field_specials.c | 7 ++++ 4 files changed, 100 insertions(+), 1 deletion(-) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index 05eeb4ecaf..e43df32813 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -353,6 +353,44 @@ Debug_EventScript_InflictStatus1_Single: releaseall end +Debug_EventScript_SetHiddenNature:: + special ChoosePartyMon + waitstate + goto_if_ge VAR_0x8004, PARTY_SIZE, Debug_EventScript_InflictStatus1_Close + specialvar VAR_RESULT, ScriptGetPartyMonSpecies + goto_if_eq VAR_RESULT, SPECIES_EGG, Debug_EventScript_InflictStatus1_Close + dynmultipush Debug_EventScript_ChangeNature_Text_Hardy, 0 + dynmultipush Debug_EventScript_ChangeNature_Text_Lonely, 1 + dynmultipush Debug_EventScript_ChangeNature_Text_Brave, 2 + dynmultipush Debug_EventScript_ChangeNature_Text_Adamant, 3 + dynmultipush Debug_EventScript_ChangeNature_Text_Naughty, 4 + dynmultipush Debug_EventScript_ChangeNature_Text_Bold, 5 + dynmultipush Debug_EventScript_ChangeNature_Text_Docile, 6 + dynmultipush Debug_EventScript_ChangeNature_Text_Relaxed, 7 + dynmultipush Debug_EventScript_ChangeNature_Text_Impish, 8 + dynmultipush Debug_EventScript_ChangeNature_Text_Lax, 9 + dynmultipush Debug_EventScript_ChangeNature_Text_Timid, 10 + dynmultipush Debug_EventScript_ChangeNature_Text_Hasty, 11 + dynmultipush Debug_EventScript_ChangeNature_Text_Serious, 12 + dynmultipush Debug_EventScript_ChangeNature_Text_Jolly, 13 + dynmultipush Debug_EventScript_ChangeNature_Text_Naive, 14 + dynmultipush Debug_EventScript_ChangeNature_Text_Modest, 15 + dynmultipush Debug_EventScript_ChangeNature_Text_Mild, 16 + dynmultipush Debug_EventScript_ChangeNature_Text_Quiet, 17 + dynmultipush Debug_EventScript_ChangeNature_Text_Bashful, 18 + dynmultipush Debug_EventScript_ChangeNature_Text_Rash, 19 + dynmultipush Debug_EventScript_ChangeNature_Text_Calm, 20 + dynmultipush Debug_EventScript_ChangeNature_Text_Gentle, 21 + dynmultipush Debug_EventScript_ChangeNature_Text_Sassy, 22 + dynmultipush Debug_EventScript_ChangeNature_Text_Careful, 23 + dynmultipush Debug_EventScript_ChangeNature_Text_Quirky, 24 + dynmultistack 0, 0, TRUE, 7, FALSE, 0, NULL + switch VAR_RESULT + case MULTI_B_PRESSED, Debug_EventScript_InflictStatus1_Close + special SetHiddenNature + releaseall + end + Debug_EventScript_InflictStatus1_Single_Poison: setstatus1 STATUS1_POISON, VAR_0x8004 releaseall @@ -461,6 +499,57 @@ Debug_EventScript_InflictStatus1_Text_Freeze: Debug_EventScript_InflictStatus1_Text_Frostbite: .string "Frostbite$" +Debug_EventScript_ChangeNature_Text_Hardy: + .string "Hardy$" +Debug_EventScript_ChangeNature_Text_Lonely: + .string "Lonely$" +Debug_EventScript_ChangeNature_Text_Brave: + .string "Brave$" +Debug_EventScript_ChangeNature_Text_Adamant: + .string "Adamant$" +Debug_EventScript_ChangeNature_Text_Naughty: + .string "Naughty$" +Debug_EventScript_ChangeNature_Text_Bold: + .string "Bold$" +Debug_EventScript_ChangeNature_Text_Docile: + .string "Docile$" +Debug_EventScript_ChangeNature_Text_Relaxed: + .string "Relaxed$" +Debug_EventScript_ChangeNature_Text_Impish: + .string "Impish$" +Debug_EventScript_ChangeNature_Text_Lax: + .string "Lax$" +Debug_EventScript_ChangeNature_Text_Timid: + .string "Timid$" +Debug_EventScript_ChangeNature_Text_Hasty: + .string "Hasty$" +Debug_EventScript_ChangeNature_Text_Serious: + .string "Serious$" +Debug_EventScript_ChangeNature_Text_Jolly: + .string "Jolly$" +Debug_EventScript_ChangeNature_Text_Naive: + .string "Naive$" +Debug_EventScript_ChangeNature_Text_Modest: + .string "Modest$" +Debug_EventScript_ChangeNature_Text_Mild: + .string "Mild$" +Debug_EventScript_ChangeNature_Text_Quiet: + .string "Quiet$" +Debug_EventScript_ChangeNature_Text_Bashful: + .string "Bashful$" +Debug_EventScript_ChangeNature_Text_Rash: + .string "Rash$" +Debug_EventScript_ChangeNature_Text_Calm: + .string "Calm$" +Debug_EventScript_ChangeNature_Text_Gentle: + .string "Gentle$" +Debug_EventScript_ChangeNature_Text_Sassy: + .string "Sassy$" +Debug_EventScript_ChangeNature_Text_Careful: + .string "Careful$" +Debug_EventScript_ChangeNature_Text_Quirky: + .string "Quirky$" + Debug_EventScript_EWRAMCounters:: callnative CheckEWRAMCounters msgbox Debug_EventScript_EWRAMCounters_Text, MSGBOX_DEFAULT diff --git a/data/specials.inc b/data/specials.inc index c95cea9a7e..0a2ae2da50 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -563,3 +563,4 @@ gSpecials:: def_special UseBlankMessageToCancelPokemonPic def_special EnterCode def_special GetCodeFeedback + def_special SetHiddenNature diff --git a/src/debug.c b/src/debug.c index 3f970ae7fc..041734ebf5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -345,6 +345,7 @@ extern const u8 Debug_EventScript_FontTest[]; extern const u8 Debug_EventScript_CheckEVs[]; extern const u8 Debug_EventScript_CheckIVs[]; extern const u8 Debug_EventScript_InflictStatus1[]; +extern const u8 Debug_EventScript_SetHiddenNature[]; extern const u8 Debug_EventScript_Script_1[]; extern const u8 Debug_EventScript_Script_2[]; extern const u8 Debug_EventScript_Script_3[]; @@ -572,6 +573,7 @@ static const struct DebugMenuOption sDebugMenu_Actions_Party[] = { COMPOUND_STRING("Hatch an Egg"), DebugAction_ExecuteScript, Debug_HatchAnEgg }, { COMPOUND_STRING("Heal party"), DebugAction_Party_HealParty }, { COMPOUND_STRING("Inflict Status1"), DebugAction_ExecuteScript, Debug_EventScript_InflictStatus1 }, + { COMPOUND_STRING("Set Hidden Nature"), DebugAction_ExecuteScript, Debug_EventScript_SetHiddenNature }, { COMPOUND_STRING("Check EVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckEVs }, { COMPOUND_STRING("Check IVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckIVs }, { COMPOUND_STRING("Clear Party"), DebugAction_Party_ClearParty }, @@ -3418,7 +3420,7 @@ static void DebugAction_Sound_MUS_SelectId(u8 taskId) } } -static const u32 gDebugFollowerNPCGraphics[] = +static const u32 gDebugFollowerNPCGraphics[] = { OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, diff --git a/src/field_specials.c b/src/field_specials.c index 927326e399..549a3b9198 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -4361,3 +4361,10 @@ void GetCodeFeedback(void) else gSpecialVar_Result = 0; } + +void SetHiddenNature(void) +{ + u32 hiddenNature = gSpecialVar_Result; + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_HIDDEN_NATURE, &hiddenNature); + CalculateMonStats(&gPlayerParty[gSpecialVar_0x8004]); +} From 7ae97ab6e930376cf6b385c9a3fb4c2af96a5987 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:36:21 +0200 Subject: [PATCH 115/248] Refactor move Synchronise (#7271) --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 46 +++++----------- include/battle_scripts.h | 2 +- include/constants/battle.h | 1 + src/battle_script_commands.c | 73 +++++++++++++++++++------- src/battle_util.c | 3 +- test/battle/gimmick/terastal.c | 2 +- test/battle/move_effect/synchronoise.c | 70 ++++++++++++++++++++++++ 8 files changed, 147 insertions(+), 55 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b23992d332..d9a7ca5fed 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2461,6 +2461,11 @@ .byte \battler .endm + .macro trysynchronoise jumpInstr:req + callnative BS_TrySynchronoise + .4byte \jumpInstr + .endm + .macro setallytonexttarget jumpInstr:req jumpifbyte CMP_GREATER_THAN, gBattlerTarget, 0x1, 1f addbyte gBattlerTarget, 0x2 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a57ce67c25..6f20b90345 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1622,42 +1622,20 @@ BattleScript_EffectPsychoShiftCanWork: BattleScript_EffectSynchronoise:: attackcanceler attackstring + pause B_WAIT_TIME_MED ppreduce - selectfirstvalidtarget -BattleScript_SynchronoiseLoop: - movevaluescleanup - jumpifcantusesynchronoise BattleScript_SynchronoiseNoEffect - accuracycheck BattleScript_SynchronoiseMissed, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG + trysynchronoise BattleScript_MoveEnd + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + goto BattleScript_HitFromCritCalc + +BattleScript_ItDoesntAffectFoe:: + savetarget + copybyte gBattlerTarget, sBATTLER + printstring STRINGID_ITDOESNTAFFECT + waitmessage B_WAIT_TIME_SHORT flushtextbox - tryfaintmon BS_TARGET -BattleScript_SynchronoiseMoveTargetEnd: - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_SynchronoiseLoop - end -BattleScript_SynchronoiseMissed: - pause B_WAIT_TIME_SHORT - resultmessage - waitmessage B_WAIT_TIME_LONG - goto BattleScript_SynchronoiseMoveTargetEnd -BattleScript_SynchronoiseNoEffect: - pause B_WAIT_TIME_SHORT - printstring STRINGID_NOEFFECTONTARGET - waitmessage B_WAIT_TIME_LONG - goto BattleScript_SynchronoiseMoveTargetEnd + restoretarget + return BattleScript_MoveEffectSmackDown:: printstring STRINGID_FELLSTRAIGHTDOWN diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 525d3aefe4..dba2ad49d0 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -526,7 +526,6 @@ extern const u8 BattleScript_TeraShellDistortingTypeMatchups[]; extern const u8 BattleScript_TeraFormChange[]; extern const u8 BattleScript_SleepClausePreventsEnd[]; extern const u8 BattleScript_PowerConstruct[]; - extern const u8 BattleScript_AbilityProtectsDoesntAffect[]; extern const u8 BattleScript_ImmunityProtected[]; extern const u8 BattleScript_SafeguardProtected[]; @@ -538,6 +537,7 @@ extern const u8 BattleScript_AlreadyPoisoned[]; extern const u8 BattleScript_AlreadyParalyzed[]; extern const u8 BattleScript_AlreadyBurned[]; extern const u8 BattleScript_PrintAbilityMadeIneffective[]; +extern const u8 BattleScript_ItDoesntAffectFoe[]; // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index e785498489..9064eb3863 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -345,6 +345,7 @@ enum TypeSideHazard #define MOVE_RESULT_FOE_HUNG_ON (1 << 7) #define MOVE_RESULT_STURDIED (1 << 8) #define MOVE_RESULT_FOE_ENDURED_AFFECTION (1 << 9) +#define MOVE_RESULT_SYNCHRONOISE_AFFECTED (1 << 10) #define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) enum BattleWeather diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ff4104b19e..32c2111488 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1242,22 +1242,24 @@ static void Cmd_attackcanceler(void) u32 abilityDef = GetBattlerAbility(gBattlerTarget); - if (CanAbilityBlockMove(gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerAttacker), - abilityDef, - gCurrentMove, - ABILITY_RUN_SCRIPT)) + if (CanAbilityBlockMove( + gBattlerAttacker, + gBattlerTarget, + GetBattlerAbility(gBattlerAttacker), + abilityDef, + gCurrentMove, + ABILITY_RUN_SCRIPT)) return; if (GetMoveNonVolatileStatus(gCurrentMove) == MOVE_EFFECT_PARALYSIS) { - if (CanAbilityAbsorbMove(gBattlerAttacker, - gBattlerTarget, - abilityDef, - gCurrentMove, - GetBattleMoveType(gCurrentMove), - ABILITY_RUN_SCRIPT)) + if (CanAbilityAbsorbMove( + gBattlerAttacker, + gBattlerTarget, + abilityDef, + gCurrentMove, + GetBattleMoveType(gCurrentMove), + ABILITY_RUN_SCRIPT)) return; } @@ -2418,6 +2420,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) if (IsDoubleSpreadMove()) { u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + if (!gBattleStruct->printedStrongWindsWeakenedAttack) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -5957,9 +5960,10 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) u32 battler; for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { - if (battler != gBattlerAttacker - && !(excludeCurrent && battler == gBattlerTarget) - && IsBattlerAlive(battler) + if (battler == gBattlerAttacker || !IsBattlerAlive(battler)) + continue; + + if (!(excludeCurrent && battler == gBattlerTarget) && !gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] && (!IsBattlerAlly(battler, gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) break; @@ -6665,8 +6669,9 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - if (moveEffect == EFFECT_EXPLOSION || moveEffect == EFFECT_MISTY_EXPLOSION) - BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); // Edge case for Explosion not changing targets + if (moveEffect == EFFECT_EXPLOSION || moveEffect == EFFECT_MISTY_EXPLOSION // Edge case for Explosion not changing targets + || moveEffect == EFFECT_SYNCHRONOISE) // So we don't go back to the Synchronoise script + BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); else BattleScriptPush(GetMoveBattleScript(gCurrentMove)); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; @@ -17907,7 +17912,6 @@ void BS_JumpIfSleepClause(void) void BS_FickleBeamDamageCalculation(void) { NATIVE_ARGS(); - gBattleStruct->fickleBeamBoosted = FALSE; if (RandomPercentage(RNG_FICKLE_BEAM, 30)) { @@ -18671,3 +18675,36 @@ void BS_TryActivateAbilityShield(void) BattleScriptCall(BattleScript_AbilityShieldProtects); } } + +void BS_TrySynchronoise(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + bool32 atleastOneSharedType = FALSE; + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SYNCHRONOISE_AFFECTED + || gBattlerAttacker == battlerDef + || !IsBattlerAlive(battlerDef)) + continue; + + if (DoBattlersShareType(gBattlerAttacker, battlerDef)) + { + atleastOneSharedType = TRUE; + continue; + } + + if (!DoBattlersShareType(gBattlerAttacker, battlerDef)) + { + gBattleScripting.battler = battlerDef; + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_NO_EFFECT | MOVE_RESULT_SYNCHRONOISE_AFFECTED; + BattleScriptCall(BattleScript_ItDoesntAffectFoe); + return; + } + } + + if (atleastOneSharedType) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->jumpInstr; +} diff --git a/src/battle_util.c b/src/battle_util.c index 76786d1f44..e40020e11f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2513,6 +2513,7 @@ static enum MoveCanceller CancellerMultiTargetMoves(void) if (gBattlerAttacker == battlerDef || !IsBattlerAlive(battlerDef) + || (GetMoveEffect(gCurrentMove) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(gBattlerAttacker, battlerDef)) || (moveTarget == MOVE_TARGET_BOTH && gBattlerAttacker == BATTLE_PARTNER(battlerDef)) || IsBattlerProtected(gBattlerAttacker, battlerDef, gCurrentMove)) // Missing Invulnerable check { @@ -7914,7 +7915,7 @@ static inline u32 IsFieldMudSportAffected(u32 moveType) return TRUE; } } - + return FALSE; } diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 7ce10a5942..441487c002 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -385,7 +385,7 @@ SINGLE_BATTLE_TEST("(TERA) Synchronoise uses a Terastallized Pokemon's Tera Type } SCENE { // turn 1 MESSAGE("The opposing Wobbuffet used Synchronoise!"); - MESSAGE("It won't have any effect on Wobbuffet!"); + MESSAGE("It doesn't affect Wobbuffet…"); // turn 2 MESSAGE("The opposing Wobbuffet used Synchronoise!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, opponent); diff --git a/test/battle/move_effect/synchronoise.c b/test/battle/move_effect/synchronoise.c index 9b68ccc63a..45b4f125ea 100644 --- a/test/battle/move_effect/synchronoise.c +++ b/test/battle/move_effect/synchronoise.c @@ -1,4 +1,74 @@ #include "global.h" #include "test/battle.h" +DOUBLE_BATTLE_TEST("Synchronoise hits all Pokemon that share a type with the attacker") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerRight); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will fail if there is no corresponding typing on the field") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_BULBASAUR); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + MESSAGE("Wobbuffet used Synchronoise!"); + MESSAGE("It doesn't affect the opposing Bulbasaur…"); + MESSAGE("It doesn't affect Bulbasaur…"); + MESSAGE("It doesn't affect the opposing Bulbasaur…"); + NOT MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will hit if there is at least one target") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + HP_BAR(opponentLeft); + NONE_OF { + HP_BAR(playerRight); + HP_BAR(opponentRight); + MESSAGE("But it failed!"); + } + } +} + +DOUBLE_BATTLE_TEST("Synchronoise will fail if the corresponding typing mon protects") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BULBASAUR); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_PROTECT); MOVE(playerLeft, MOVE_SYNCHRONOISE); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); + } +} + TO_DO_BATTLE_TEST("TODO: Write Synchronoise (Move Effect) test titles") From 31a561201b2ecbc218f7118bd691f64da6bf5d3b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:30:35 +0200 Subject: [PATCH 116/248] Adds hazard queue (#7295) --- data/battle_scripts_1.s | 48 +-- include/battle.h | 25 +- include/battle_scripts.h | 12 +- include/battle_util.h | 6 + include/constants/battle.h | 39 +-- src/battle_ai_main.c | 49 ++- src/battle_ai_switch_items.c | 12 +- src/battle_ai_util.c | 32 +- src/battle_debug.c | 227 +++++++++----- src/battle_message.c | 18 ++ src/battle_script_commands.c | 331 ++++++++++---------- src/battle_util.c | 76 +++++ test/battle/hazards.c | 40 +++ test/battle/move_effect/court_change.c | 24 +- test/battle/move_effect/defog.c | 24 +- test/battle/move_effect/hit_switch_target.c | 4 +- test/battle/move_effect/rapid_spin.c | 29 ++ test/battle/move_effect/spikes.c | 27 ++ test/battle/move_effect/tidy_up.c | 4 +- test/battle/move_effect/toxic_spikes.c | 25 ++ 20 files changed, 666 insertions(+), 386 deletions(-) create mode 100644 test/battle/hazards.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6f20b90345..3bec1be182 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6113,53 +6113,13 @@ BattleScript_LeechSeedFree:: waitmessage B_WAIT_TIME_LONG return -BattleScript_SpikesFree:: - printstring STRINGID_PKMNBLEWAWAYSPIKES +BattleScript_SpinHazardsAway:: + printfromtable gSpinHazardsStringIds waitmessage B_WAIT_TIME_LONG return -BattleScript_ToxicSpikesFree:: - printstring STRINGID_PKMNBLEWAWAYTOXICSPIKES - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StickyWebFree:: - printstring STRINGID_PKMNBLEWAWAYSTICKYWEB - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StealthRockFree:: - printstring STRINGID_PKMNBLEWAWAYSTEALTHROCK - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SteelsurgeFree:: - printstring STRINGID_PKMNBLEWAWAYSHARPSTEEL - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SpikesDefog:: - printstring STRINGID_SPIKESDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_ToxicSpikesDefog:: - printstring STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StickyWebDefog:: - printstring STRINGID_STICKYWEBDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_StealthRockDefog:: - printstring STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM - waitmessage B_WAIT_TIME_LONG - return - -BattleScript_SteelsurgeDefog:: - printstring STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM +BattleScript_DefogClearHazards:: + printfromtable gDefogHazardsStringIds waitmessage B_WAIT_TIME_LONG return diff --git a/include/battle.h b/include/battle.h index e113edd6d4..cdeac89719 100644 --- a/include/battle.h +++ b/include/battle.h @@ -117,24 +117,20 @@ struct DisableStruct u8 tarShot:1; u8 octolock:1; u8 cudChew:1; - u8 spikesDone:1; - u8 toxicSpikesDone:1; - u8 stickyWebDone:1; - u8 stealthRockDone:1; u8 weatherAbilityDone:1; u8 terrainAbilityDone:1; u8 syrupBombIsShiny:1; - u8 steelSurgeDone:1; u8 usedProteanLibero:1; u8 flashFireBoosted:1; - u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) u8 boosterEnergyActivated:1; + u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) u8 roostActive:1; u8 unburdenActive:1; u8 neutralizingGas:1; u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in - u8 padding:3; + u8 hazardsDone:1; + u8 padding:1; }; // Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects @@ -222,21 +218,18 @@ struct SideTimer u16 lightscreenTimer; u16 mistTimer; u16 safeguardTimer; - u16 spikesAmount; // debug menu complains. might be better to solve there instead if possible - u16 toxicSpikesAmount; - u16 stealthRockAmount; - u16 stickyWebAmount; + u8 spikesAmount:4; + u8 toxicSpikesAmount:4; u8 stickyWebBattlerId; u8 stickyWebBattlerSide; // Used for Court Change u16 auroraVeilTimer; u16 tailwindTimer; u16 luckyChantTimer; - u16 steelsurgeAmount; // Timers below this point are not swapped by Court Change - u16 followmeTimer; + u8 followmeTimer:4; u8 followmeTarget:3; u8 followmePowder:1; // Rage powder, does not affect grass type pokemon. - u16 retaliateTimer; + u8 retaliateTimer; u16 damageNonTypesTimer; u8 damageNonTypesType; u16 rainbowTimer; @@ -780,6 +773,10 @@ struct BattleStruct s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; + u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; + u8 numHazards[NUM_BATTLE_SIDES]; + u8 hazardsCounter:4; // Counter for applying hazard on switch in + u8 padding2:4; }; struct AiBattleData diff --git a/include/battle_scripts.h b/include/battle_scripts.h index dba2ad49d0..06a7e90107 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -92,7 +92,7 @@ extern const u8 BattleScript_AllStatsUp[]; extern const u8 BattleScript_RapidSpinAway[]; extern const u8 BattleScript_WrapFree[]; extern const u8 BattleScript_LeechSeedFree[]; -extern const u8 BattleScript_SpikesFree[]; +extern const u8 BattleScript_SpinHazardsAway[]; extern const u8 BattleScript_MonTookFutureAttack[]; extern const u8 BattleScript_NoMovesLeft[]; extern const u8 BattleScript_SelectingMoveWithNoPP[]; @@ -312,13 +312,7 @@ extern const u8 BattleScript_SelectingNotAllowedMoveGravityInPalace[]; extern const u8 BattleScript_SelectingNotAllowedMoveHealBlock[]; extern const u8 BattleScript_MoveUsedHealBlockPrevents[]; extern const u8 BattleScript_SelectingNotAllowedMoveHealBlockInPalace[]; -extern const u8 BattleScript_ToxicSpikesFree[]; -extern const u8 BattleScript_StickyWebFree[]; -extern const u8 BattleScript_StealthRockFree[]; -extern const u8 BattleScript_SpikesDefog[]; -extern const u8 BattleScript_ToxicSpikesDefog[]; -extern const u8 BattleScript_StickyWebDefog[]; -extern const u8 BattleScript_StealthRockDefog[]; +extern const u8 BattleScript_DefogClearHazards[]; extern const u8 BattleScript_MegaEvolution[]; extern const u8 BattleScript_WishMegaEvolution[]; extern const u8 BattleScript_MoveEffectClearSmog[]; @@ -555,8 +549,6 @@ extern const u8 BattleScript_EffectSetWeather[]; extern const u8 BattleScript_EffectSetTerrain[]; extern const u8 BattleScript_EffectStonesurge[]; extern const u8 BattleScript_EffectSteelsurge[]; -extern const u8 BattleScript_SteelsurgeFree[]; -extern const u8 BattleScript_SteelsurgeDefog[]; extern const u8 BattleScript_DamageNonTypesStarts[]; extern const u8 BattleScript_DamageNonTypesContinues[]; extern const u8 BattleScript_DefogTryHazards[]; diff --git a/include/battle_util.h b/include/battle_util.h index a95d76c61a..dd7a908e57 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -400,5 +400,11 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); u32 GetMonVolatile(u32 battler, enum Volatile volatile); void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue); u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); +void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); +bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); +bool32 AreAnyHazardsOnSide(u32 side); +void RemoveAllHazardsFromField(u32 side); +bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); +void RemoveHazardFromField(u32 side, enum Hazards hazardType); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 9064eb3863..6d207177c4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -289,28 +289,31 @@ enum Volatile // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) #define SIDE_STATUS_LIGHTSCREEN (1 << 1) -#define SIDE_STATUS_STICKY_WEB (1 << 2) -#define SIDE_STATUS_SPIKES (1 << 4) -#define SIDE_STATUS_SAFEGUARD (1 << 5) -#define SIDE_STATUS_FUTUREATTACK (1 << 6) -#define SIDE_STATUS_MIST (1 << 8) -// (1 << 9) previously was SIDE_STATUS_SPIKES_DAMAGED -#define SIDE_STATUS_TAILWIND (1 << 10) -#define SIDE_STATUS_AURORA_VEIL (1 << 11) -#define SIDE_STATUS_LUCKY_CHANT (1 << 12) -#define SIDE_STATUS_TOXIC_SPIKES (1 << 13) -#define SIDE_STATUS_STEALTH_ROCK (1 << 14) -// Missing flags previously were SIDE_STATUS_TOXIC_SPIKES_DAMAGED, SIDE_STATUS_STEALTH_ROCK_DAMAGED, SIDE_STATUS_STICKY_WEB_DAMAGED -#define SIDE_STATUS_STEELSURGE (1 << 18) -#define SIDE_STATUS_DAMAGE_NON_TYPES (1 << 19) -#define SIDE_STATUS_RAINBOW (1 << 20) -#define SIDE_STATUS_SEA_OF_FIRE (1 << 21) -#define SIDE_STATUS_SWAMP (1 << 22) +#define SIDE_STATUS_SAFEGUARD (1 << 2) +#define SIDE_STATUS_FUTUREATTACK (1 << 3) +#define SIDE_STATUS_MIST (1 << 4) +#define SIDE_STATUS_TAILWIND (1 << 5) +#define SIDE_STATUS_AURORA_VEIL (1 << 6) +#define SIDE_STATUS_LUCKY_CHANT (1 << 7) +#define SIDE_STATUS_DAMAGE_NON_TYPES (1 << 8) +#define SIDE_STATUS_RAINBOW (1 << 9) +#define SIDE_STATUS_SEA_OF_FIRE (1 << 10) +#define SIDE_STATUS_SWAMP (1 << 11) -#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) #define SIDE_STATUS_PLEDGE_ANY (SIDE_STATUS_RAINBOW | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) +enum Hazards +{ + HAZARDS_NONE, + HAZARDS_SPIKES, + HAZARDS_STICKY_WEB, + HAZARDS_TOXIC_SPIKES, + HAZARDS_STEALTH_ROCK, + HAZARDS_STEELSURGE, + HAZARDS_MAX_COUNT, +}; + // Used for damaging entry hazards based on type enum TypeSideHazard { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index bc3c35db84..e66c77ce87 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1817,7 +1817,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // only one mon needs to set up the last layer of Spikes break; case EFFECT_STEALTH_ROCK: - if (gSideTimers[GetBattlerSide(battlerDef)].stealthRockAmount > 0 + if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STEALTH_ROCK) || PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) //Only one mon needs to set up Stealth Rocks ADJUST_SCORE(-10); break; @@ -1828,9 +1828,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // only one mon needs to set up the last layer of Toxic Spikes break; case EFFECT_STICKY_WEB: - if (gSideTimers[GetBattlerSide(battlerDef)].stickyWebAmount) + if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) ADJUST_SCORE(-10); - else if (PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) && gSideTimers[GetBattlerSide(battlerDef)].stickyWebAmount) + else if (PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) && IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) ADJUST_SCORE(-10); // only one mon needs to set up Sticky Web break; case EFFECT_FORESIGHT: @@ -2283,9 +2283,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-9); break; case EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(battlerDef)] - & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) - || gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY) + if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) + || AreAnyHazardsOnSide(GetBattlerSide(battlerAtk))) { if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { @@ -2294,7 +2293,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_HAZARDS_ANY) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef))) { ADJUST_SCORE(-10); //Don't blow away opposing hazards break; @@ -4390,12 +4389,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) //ADJUST_SCORE(8); break; case EFFECT_DEFOG: - if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) || (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))) { ADJUST_SCORE(GOOD_EFFECT); } - else if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SPIKES)) //Don't blow away hazards if you set them up + else if (!IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_SPIKES)) //Don't blow away hazards if you set them up { if (isDoubleBattle) { @@ -4939,7 +4938,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RAPID_SPIN: - if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)) ADJUST_SCORE(GOOD_EFFECT); case EFFECT_SPECTRAL_THIEF: @@ -5789,13 +5788,31 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score return score; } +bool32 DoesSideHaveDamagingHazards(u32 side) +{ + for (u32 counter = 0; counter < HAZARDS_MAX_COUNT; counter++) + { + switch (gBattleStruct->hazardsQueue[side][counter]) + { + case HAZARDS_SPIKES: + case HAZARDS_TOXIC_SPIKES: + case HAZARDS_STEALTH_ROCK: + case HAZARDS_STEELSURGE: + return TRUE; + default: + return FALSE; + } + } + return FALSE; +} + static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 i; u32 unmodifiedScore = score; u32 ability = gBattleMons[battlerAtk].ability; - u32 opposingHazardFlags = gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES); - u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); + bool32 opposingHazardFlags = DoesSideHaveDamagingHazards(GetBattlerSide(battlerDef)); + bool32 aiHazardFlags = AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)); enum BattleMoveEffects moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; @@ -5856,21 +5873,21 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_HIT_SWITCH_TARGET: - if (opposingHazardFlags != 0) + if (opposingHazardFlags) ADJUST_SCORE(BEST_EFFECT); else ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_ROAR: - if (opposingHazardFlags != 0) + if (opposingHazardFlags) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RAPID_SPIN: - if (aiHazardFlags != 0) + if (aiHazardFlags) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_DEFOG: - if (aiHazardFlags != 0) + if (aiHazardFlags) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_WISH: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 550a2f91f7..e7bcf00e7b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1529,20 +1529,20 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon u16 heldItemEffect = GetItemHoldEffect(battleMon->item); u32 maxHP = battleMon->maxHP, ability = battleMon->ability, status = battleMon->status1; u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0; - u32 hazardFlags = gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_SAFEGUARD); + u32 side = GetBattlerSide(battler); // Check ways mon might avoid all hazards if (ability != ABILITY_MAGIC_GUARD || (heldItemEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !((gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) || ability == ABILITY_KLUTZ))) { // Stealth Rock - if ((hazardFlags & SIDE_STATUS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) + if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, defType1, defType2, battleMon->maxHP); // G-Max Steelsurge - if ((hazardFlags & SIDE_STATUS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) + if (IsHazardOnSide(side, HAZARDS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, defType1, defType2, battleMon->maxHP); // Spikes - if ((hazardFlags & SIDE_STATUS_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) + if (IsHazardOnSide(side, HAZARDS_TOXIC_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) { spikesDamage = maxHP / ((5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2); if (spikesDamage == 0) @@ -1550,11 +1550,11 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon hazardDamage += spikesDamage; } - if ((hazardFlags & SIDE_STATUS_TOXIC_SPIKES) && (defType1 != TYPE_POISON && defType2 != TYPE_POISON + if (IsHazardOnSide(side, HAZARDS_SPIKES) && (defType1 != TYPE_POISON && defType2 != TYPE_POISON && defType1 != TYPE_STEEL && defType2 != TYPE_STEEL && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 - && !(hazardFlags & SIDE_STATUS_SAFEGUARD) + && !(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) && !IsAbilityStatusProtected(battler, ability) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5f8b6bb4be..149aada871 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1982,7 +1982,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) // Don't decrese stat if opposing battler has Encore if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; - + if (DoesAbilityRaiseStatsWhenLowered(gAiLogicData->abilities[battlerDef])) return NO_INCREASE; @@ -2979,13 +2979,13 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) u32 ability = GetMonAbility(mon); // we know our own party data enum ItemHoldEffect holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); s32 hazardDamage = 0; u32 type1 = GetSpeciesType(species, 0); u32 type2 = GetSpeciesType(species, 1); u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); + u32 side = GetBattlerSide(currBattler); - if (flags == 0) + if (!AreAnyHazardsOnSide(side)) return FALSE; if (ability == ABILITY_MAGIC_GUARD) @@ -2997,12 +2997,12 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) return FALSE; - if (flags & SIDE_STATUS_STEALTH_ROCK) + if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK)) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, type1, type2, maxHp); - if ((flags & SIDE_STATUS_STEELSURGE)) + if (IsHazardOnSide(side, HAZARDS_STEELSURGE)) hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, type1, type2, maxHp); - if (flags & SIDE_STATUS_SPIKES && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING + if (IsHazardOnSide(side, HAZARDS_SPIKES) && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING && ability != ABILITY_LEVITATE && holdEffect != HOLD_EFFECT_AIR_BALLOON) || holdEffect == HOLD_EFFECT_IRON_BALL || gFieldStatuses & STATUS_FIELD_GRAVITY)) { @@ -3070,7 +3070,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov return SHOULD_PIVOT; /* TODO - check if switchable mon unafffected by/will remove hazards - if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) + if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) return SHOULD_PIVOT;*/ /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) @@ -3152,7 +3152,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (!hasStatBoost) { // TODO - check if switching prevents/removes hazards - //if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) + //if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) //return SHOULD_PIVOT; // TODO - not always a good idea @@ -4787,9 +4787,9 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) ADJUST_SCORE_PTR(GOOD_EFFECT); - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerDef) != 0) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE && AI_IsFaster(battlerAtk, battlerDef, move)) @@ -5029,7 +5029,7 @@ bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability) // At the moment, the parts about Mummy and Wandering Spirit are not actually used. bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct AiLogicData *aiData) { - // Dynamaxed Pokemon are immune to some ability-changing effects. + // Dynamaxed Pokemon are immune to some ability-changing effects. if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) { switch (effect) @@ -5044,7 +5044,7 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct if (gStatuses3[battlerDef] & STATUS3_GASTRO_ACID) return FALSE; - + u32 atkAbility = aiData->abilities[battlerAtk]; u32 defAbility = aiData->abilities[battlerDef]; bool32 hasSameAbility = (atkAbility == defAbility); @@ -5078,7 +5078,7 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct { u32 partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; if (gAbilitiesInfo[partnerAbility].cantBeSuppressed) - return FALSE; + return FALSE; if (partnerAbility == defAbility) return FALSE; } @@ -5113,7 +5113,7 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct if (defAbility == ABILITY_INSOMNIA || gAbilitiesInfo[defAbility].cantBeOverwritten) return FALSE; break; - + default: return FALSE; } @@ -5217,14 +5217,14 @@ void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, { ADJUST_SCORE_PTR(-20); } - + // Trigger Plus or Minus in modern gens. This is not in the overarching function because Skill Swap is rarely beneficial here. if (B_PLUS_MINUS_INTERACTION >= GEN_5) { if (((effect == EFFECT_ENTRAINMENT) && (abilityAtk == ABILITY_PLUS || abilityAtk == ABILITY_MINUS)) || ((effect == EFFECT_ROLE_PLAY) && (abilityDef == ABILITY_PLUS || abilityDef == ABILITY_MINUS))) ADJUST_SCORE_PTR(DECENT_EFFECT); } - + } // Targeting an opponent. else diff --git a/src/battle_debug.c b/src/battle_debug.c index a98b3a12a5..30f3d6766b 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -107,6 +107,7 @@ enum LIST_ITEM_VOLATILE, LIST_ITEM_STATUS3, LIST_ITEM_STATUS4, + LIST_ITEM_HAZARDS, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, LIST_ITEM_AI_MOVES_PTS, @@ -176,18 +177,22 @@ enum enum { - LIST_SIDE_REFLECT, - LIST_SIDE_LIGHTSCREEN, LIST_SIDE_STICKY_WEB, LIST_SIDE_SPIKES, + LIST_SIDE_TOXIC_SPIKES, + LIST_SIDE_STEALTH_ROCK, + LIST_SIDE_STEELSURGE, +}; + +enum +{ + LIST_SIDE_REFLECT, + LIST_SIDE_LIGHTSCREEN, LIST_SIDE_SAFEGUARD, LIST_SIDE_MIST, LIST_SIDE_TAILWIND, LIST_SIDE_AURORA_VEIL, LIST_SIDE_LUCKY_CHANT, - LIST_SIDE_TOXIC_SPIKES, - LIST_SIDE_STEALTH_ROCK, - LIST_SIDE_STEELSURGE, LIST_SIDE_DAMAGE_NON_TYPES, LIST_SIDE_RAINBOW, LIST_SIDE_SEA_OF_FIRE, @@ -250,6 +255,7 @@ enum VAL_BITFIELD_16, VAL_BITFIELD_32, VAL_VOLATILE, + VAL_HAZARDS, VAR_SIDE_STATUS, VAR_SHOW_HP, VAR_SUBSTITUTE, @@ -352,23 +358,24 @@ static const struct BitfieldInfo sAIBitfield[] = static const struct ListMenuItem sMainListItems[] = { - {COMPOUND_STRING("Moves"), LIST_ITEM_MOVES}, - {sText_Ability, LIST_ITEM_ABILITY}, - {sText_HeldItem, LIST_ITEM_HELD_ITEM}, - {COMPOUND_STRING("PP"), LIST_ITEM_PP}, - {COMPOUND_STRING("Types"), LIST_ITEM_TYPES}, - {COMPOUND_STRING("Stats"), LIST_ITEM_STATS}, - {COMPOUND_STRING("Stat Stages"), LIST_ITEM_STAT_STAGES}, - {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, - {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, - {COMPOUND_STRING("Status3"), LIST_ITEM_STATUS3}, - {COMPOUND_STRING("Status4"), LIST_ITEM_STATUS4}, - {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, - {COMPOUND_STRING("AI"), LIST_ITEM_AI}, - {COMPOUND_STRING("AI Pts/Dmg"), LIST_ITEM_AI_MOVES_PTS}, - {COMPOUND_STRING("AI Info"), LIST_ITEM_AI_INFO}, - {COMPOUND_STRING("AI Party"), LIST_ITEM_AI_PARTY}, - {COMPOUND_STRING("Various"), LIST_ITEM_VARIOUS}, + {COMPOUND_STRING("Moves"), LIST_ITEM_MOVES}, + {sText_Ability, LIST_ITEM_ABILITY}, + {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {COMPOUND_STRING("PP"), LIST_ITEM_PP}, + {COMPOUND_STRING("Types"), LIST_ITEM_TYPES}, + {COMPOUND_STRING("Stats"), LIST_ITEM_STATS}, + {COMPOUND_STRING("Stat Stages"), LIST_ITEM_STAT_STAGES}, + {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, + {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, + {COMPOUND_STRING("Status3"), LIST_ITEM_STATUS3}, + {COMPOUND_STRING("Status4"), LIST_ITEM_STATUS4}, + {COMPOUND_STRING("Hazards"), LIST_ITEM_HAZARDS}, + {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, + {COMPOUND_STRING("AI"), LIST_ITEM_AI}, + {COMPOUND_STRING("AI Pts/Dmg"), LIST_ITEM_AI_MOVES_PTS}, + {COMPOUND_STRING("AI Info"), LIST_ITEM_AI_INFO}, + {COMPOUND_STRING("AI Party"), LIST_ITEM_AI_PARTY}, + {COMPOUND_STRING("Various"), LIST_ITEM_VARIOUS}, }; static const struct ListMenuItem sStatsListItems[] = @@ -448,20 +455,24 @@ static const struct ListMenuItem sStatus4ListItems[] = {COMPOUND_STRING("Glaive Rush"), LIST_STATUS4_GLAIVE_RUSH}, }; +static const struct ListMenuItem sHazardsListItems[] = +{ + {COMPOUND_STRING("Spikes"), LIST_SIDE_SPIKES}, + {COMPOUND_STRING("Sticky Web"), LIST_SIDE_STICKY_WEB}, + {COMPOUND_STRING("Toxic Spikes"), LIST_SIDE_TOXIC_SPIKES}, + {COMPOUND_STRING("Stealth Rock"), LIST_SIDE_STEALTH_ROCK}, + {COMPOUND_STRING("Steelsurge"), LIST_SIDE_STEELSURGE}, +}; + static const struct ListMenuItem sSideStatusListItems[] = { {COMPOUND_STRING("Reflect"), LIST_SIDE_REFLECT}, {COMPOUND_STRING("Light Screen"), LIST_SIDE_LIGHTSCREEN}, - {COMPOUND_STRING("Sticky Web"), LIST_SIDE_STICKY_WEB}, - {COMPOUND_STRING("Spikes"), LIST_SIDE_SPIKES}, {COMPOUND_STRING("Safeguard"), LIST_SIDE_SAFEGUARD}, {COMPOUND_STRING("Mist"), LIST_SIDE_MIST}, {COMPOUND_STRING("Tailwind"), LIST_SIDE_TAILWIND}, {COMPOUND_STRING("Aurora Veil"), LIST_SIDE_AURORA_VEIL}, {COMPOUND_STRING("Lucky Chant"), LIST_SIDE_LUCKY_CHANT}, - {COMPOUND_STRING("Toxic Spikes"), LIST_SIDE_TOXIC_SPIKES}, - {COMPOUND_STRING("Stealth Rock"), LIST_SIDE_STEALTH_ROCK}, - {COMPOUND_STRING("Steelsurge"), LIST_SIDE_STEELSURGE}, {COMPOUND_STRING("Damage Non-Types"), LIST_SIDE_DAMAGE_NON_TYPES}, {COMPOUND_STRING("Rainbow"), LIST_SIDE_RAINBOW}, {COMPOUND_STRING("Sea of Fire"), LIST_SIDE_SEA_OF_FIRE}, @@ -659,6 +670,8 @@ static void PrintDigitChars(struct BattleDebugMenu *data); static void SetUpModifyArrows(struct BattleDebugMenu *data); static void UpdateBattlerValue(struct BattleDebugMenu *data); static void UpdateMonData(struct BattleDebugMenu *data); +static void ChangeHazardsValue(struct BattleDebugMenu *data); +static u32 GetHazardsValue(struct BattleDebugMenu *data); static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp); static void SwitchToDebugView(u8 taskId); @@ -1424,6 +1437,10 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) listTemplate.items = sVariousListItems; itemsCount = ARRAY_COUNT(sVariousListItems); break; + case LIST_ITEM_HAZARDS: + listTemplate.items = sHazardsListItems; + itemsCount = ARRAY_COUNT(sHazardsListItems); + break; case LIST_ITEM_SIDE_STATUS: listTemplate.items = sSideStatusListItems; itemsCount = ARRAY_COUNT(sSideStatusListItems); @@ -1625,6 +1642,9 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) case VAL_VOLATILE: SetMonVolatile(data->battlerId, data->currentSecondaryListItemId, data->modifyArrows.currValue); break; + case VAL_HAZARDS: + ChangeHazardsValue(data); + break; case VAR_SIDE_STATUS: *GetSideStatusValue(data, TRUE, data->modifyArrows.currValue != 0) = data->modifyArrows.currValue; break; @@ -1702,6 +1722,83 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) charDigits[i] = valueDigits[i] + CHAR_0; } +static void ChangeHazardsValue(struct BattleDebugMenu *data) +{ + u32 side = GetBattlerSide(data->battlerId); + + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: + if (data->modifyArrows.currValue > 0) + { + if (gSideTimers[side].spikesAmount == 0) + PushHazardTypeToQueue(side, HAZARDS_SPIKES); + gSideTimers[side].spikesAmount = data->modifyArrows.currValue; + } + else if (data->modifyArrows.currValue == 0) + { + gSideTimers[side].spikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_SPIKES); + } + break; + case LIST_SIDE_TOXIC_SPIKES: + if (data->modifyArrows.currValue > 0) + { + if (gSideTimers[side].toxicSpikesAmount == 0) + PushHazardTypeToQueue(side, HAZARDS_TOXIC_SPIKES); + gSideTimers[side].toxicSpikesAmount = data->modifyArrows.currValue; + } + else if (data->modifyArrows.currValue == 0) + { + gSideTimers[side].toxicSpikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); + } + break; + case LIST_SIDE_STICKY_WEB: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STICKY_WEB); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STICKY_WEB); + break; + case LIST_SIDE_STEALTH_ROCK: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STEALTH_ROCK); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STEALTH_ROCK); + break; + case LIST_SIDE_STEELSURGE: + if (data->modifyArrows.currValue > 0) + PushHazardTypeToQueue(side, HAZARDS_STEELSURGE); + else if (data->modifyArrows.currValue == 0) + RemoveHazardFromField(side, HAZARDS_STEELSURGE); + break; + } +} + +static u32 GetHazardsValue(struct BattleDebugMenu *data) +{ + u32 hazardsLayers = 0; + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: + hazardsLayers = gSideTimers[GetBattlerSide(data->battlerId)].spikesAmount; + break; + case LIST_SIDE_TOXIC_SPIKES: + hazardsLayers = gSideTimers[GetBattlerSide(data->battlerId)].toxicSpikesAmount; + break; + case LIST_SIDE_STICKY_WEB: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STICKY_WEB); + break; + case LIST_SIDE_STEALTH_ROCK: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STEALTH_ROCK); + break; + case LIST_SIDE_STEELSURGE: + hazardsLayers = IsHazardOnSide(GetBattlerSide(data->battlerId), HAZARDS_STEELSURGE); + break; + } + return hazardsLayers; +} + static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) { struct SideTimer *sideTimer = &gSideTimers[GetBattlerSide(data->battlerId)]; @@ -1726,26 +1823,6 @@ static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_LIGHTSCREEN; } return &sideTimer->lightscreenTimer; - case LIST_SIDE_STICKY_WEB: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STICKY_WEB; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STICKY_WEB; - sideTimer->stickyWebBattlerId = data->battlerId; - sideTimer->stickyWebBattlerSide = GetBattlerSide(data->battlerId); - } - return &sideTimer->stickyWebAmount; - case LIST_SIDE_SPIKES: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_SPIKES; - } - return &sideTimer->spikesAmount; case LIST_SIDE_SAFEGUARD: if (changeStatus) { @@ -1791,33 +1868,6 @@ static u16 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_LUCKY_CHANT; } return &sideTimer->luckyChantTimer; - case LIST_SIDE_TOXIC_SPIKES: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TOXIC_SPIKES; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_TOXIC_SPIKES; - } - return &sideTimer->toxicSpikesAmount; - case LIST_SIDE_STEALTH_ROCK: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEALTH_ROCK; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEALTH_ROCK; - } - return &sideTimer->stealthRockAmount; - case LIST_SIDE_STEELSURGE: - if (changeStatus) - { - if (statusTrue) - *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEELSURGE; - else - *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEELSURGE; - } - return &sideTimer->steelsurgeAmount; case LIST_SIDE_DAMAGE_NON_TYPES: if (changeStatus) { @@ -2034,16 +2084,29 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.maxValue = (1 << data->bitfield[data->currentSecondaryListItemId].bitsCount) - 1; data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); break; + case LIST_ITEM_HAZARDS: + data->modifyArrows.minValue = 0; + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_SPIKES: + data->modifyArrows.maxValue = 3; + break; + case LIST_SIDE_TOXIC_SPIKES: + data->modifyArrows.maxValue = 2; + break; + case LIST_SIDE_STICKY_WEB: + case LIST_SIDE_STEALTH_ROCK: + case LIST_SIDE_STEELSURGE: + data->modifyArrows.maxValue = 1; + break; + } + data->modifyArrows.maxDigits = 2; + data->modifyArrows.typeOfVal = VAL_HAZARDS; + data->modifyArrows.currValue = GetHazardsValue(data); + break; case LIST_ITEM_SIDE_STATUS: data->modifyArrows.minValue = 0; - - if (data->currentSecondaryListItemId == LIST_SIDE_SPIKES) - data->modifyArrows.maxValue = 3; - else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK || data->currentSecondaryListItemId == LIST_SIDE_STICKY_WEB) - data->modifyArrows.maxValue = 1; - else - data->modifyArrows.maxValue = 9; - + data->modifyArrows.maxValue = 9; data->modifyArrows.maxDigits = 2; data->modifyArrows.modifiedValPtr = &gSideStatuses[GetBattlerSide(data->battlerId)]; data->modifyArrows.typeOfVal = VAR_SIDE_STATUS; diff --git a/src/battle_message.c b/src/battle_message.c index 860a3d5ac2..6be243ba51 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1400,6 +1400,24 @@ const u16 gDamageNonTypesDmgStringIds[] = [B_MSG_HURT_BY_ROCKS_THROWN] = STRINGID_PKMNHURTBYROCKSTHROWN, }; +const u16 gDefogHazardsStringIds[] = +{ + [HAZARDS_SPIKES] = STRINGID_SPIKESDISAPPEAREDFROMTEAM, + [HAZARDS_STICKY_WEB] = STRINGID_STICKYWEBDISAPPEAREDFROMTEAM, + [HAZARDS_TOXIC_SPIKES] = STRINGID_TOXICSPIKESDISAPPEAREDFROMTEAM, + [HAZARDS_STEALTH_ROCK] = STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM, + [HAZARDS_STEELSURGE] = STRINGID_SHARPSTEELDISAPPEAREDFROMTEAM, +}; + +const u16 gSpinHazardsStringIds[] = +{ + [HAZARDS_SPIKES] = STRINGID_PKMNBLEWAWAYSPIKES, + [HAZARDS_STICKY_WEB] = STRINGID_PKMNBLEWAWAYSTICKYWEB, + [HAZARDS_TOXIC_SPIKES] = STRINGID_PKMNBLEWAWAYTOXICSPIKES, + [HAZARDS_STEALTH_ROCK] = STRINGID_PKMNBLEWAWAYSTEALTHROCK, + [HAZARDS_STEELSURGE] = STRINGID_PKMNBLEWAWAYSHARPSTEEL, +}; + const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 32c2111488..567bdd85ee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3848,7 +3848,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK)) + if (!IsHazardOnSide(GetBattlerSide(gEffectBattler), HAZARDS_STEALTH_ROCK)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -4284,7 +4284,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; } case MOVE_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + if (!IsHazardOnSide(GetBattlerSide(gBattlerTarget), HAZARDS_STEELSURGE)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -4293,8 +4293,8 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_DEFOG: if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || AreAnyHazardsOnSide(GetBattlerSide(gBattlerTarget)) + || AreAnyHazardsOnSide(GetBattlerSide(gBattlerAttacker)) || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) { BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -8026,23 +8026,6 @@ static void Cmd_switchhandleorder(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) -{ - gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; - gHitMarker &= ~HITMARKER_DESTINYBOND; - gBattleScripting.battler = battler; - gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; - - if (gBattlescriptCurrInstr[1] == BS_TARGET) - BattleScriptCall(BattleScript_DmgHazardsOnTarget); - else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) - BattleScriptCall(BattleScript_DmgHazardsOnAttacker); - else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) - BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting); - else - BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler); -} - bool32 DoSwitchInAbilities(u32 battler) { return (TryPrimalReversion(battler) @@ -8062,9 +8045,106 @@ static void UpdateSentMonFlags(u32 battler) gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[battler]; } +static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) +{ + gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; + gHitMarker &= ~HITMARKER_DESTINYBOND; + gBattleScripting.battler = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; + + if (gBattlescriptCurrInstr[1] == BS_TARGET) + BattleScriptCall(BattleScript_DmgHazardsOnTarget); + else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) + BattleScriptCall(BattleScript_DmgHazardsOnAttacker); + else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) + BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting); + else + BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler); +} + +void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) +{ + switch (hazardType) + { + case HAZARDS_NONE: + break; + case HAZARDS_SPIKES: + if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD + && IsBattlerAffectedByHazards(battler, FALSE) + && IsBattlerGrounded(battler)) + { + u8 spikesDmg = (5 - gSideTimers[side].spikesAmount) * 2; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); + } + break; + case HAZARDS_STICKY_WEB: + if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler)) + { + gBattleScripting.battler = battler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + BattleScriptCall(BattleScript_StickyWebOnSwitchIn); + } + break; + case HAZARDS_TOXIC_SPIKES: + if (!IsBattlerGrounded(battler)) + break; + + if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. + { + gBattleStruct->hazardsCounter--; // reduce counter so the next hazard can be applied + gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); + gBattleScripting.battler = battler; + BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); + } + else if (IsBattlerAffectedByHazards(battler, TRUE) + && CanBePoisoned(battler, battler, GetBattlerAbility(battler), GetBattlerAbility(battler))) + { + gBattleScripting.battler = battler; + BattleScriptPushCursor(); + if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) + { + gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; + gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; + } + else + { + gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; + gBattleMons[battler].status1 |= STATUS1_POISON; + } + + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + } + break; + case HAZARDS_STEALTH_ROCK: + if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + { + gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); + if (gBattleStruct->moveDamage[battler] != 0) + SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); + } + break; + case HAZARDS_STEELSURGE: + if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) + { + gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); + if (gBattleStruct->moveDamage[battler] != 0) + SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); + } + break; + case HAZARDS_MAX_COUNT: + break; + } +} + static bool32 DoSwitchInEffectsForBattler(u32 battler) { u32 i = 0; + u32 side = GetBattlerSide(battler); // Neutralizing Gas announces itself before hazards if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[battler].announceNeutralizingGas == 0) { @@ -8091,85 +8171,17 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->battlerState[battler].storedLunarDance = FALSE; } } - else if (!(gDisableStructs[battler].spikesDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SPIKES) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD - && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler)) + else if (!gDisableStructs[battler].hazardsDone) { - u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - - gDisableStructs[battler].spikesDone = TRUE; - SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); - } - else if (!(gDisableStructs[battler].stealthRockDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEALTH_ROCK) - && IsBattlerAffectedByHazards(battler, FALSE) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) - { - gDisableStructs[battler].stealthRockDone = TRUE; - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); - - if (gBattleStruct->moveDamage[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); - } - else if (!(gDisableStructs[battler].toxicSpikesDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TOXIC_SPIKES) - && IsBattlerGrounded(battler)) - { - gDisableStructs[battler].toxicSpikesDone = TRUE; - if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. + TryHazardsOnSwitchIn(battler, side, gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter]); + gBattleStruct->hazardsCounter++; + // Done once we reach the first element without any hazard type or the array is full + if (gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter] == HAZARDS_NONE + || gBattleStruct->hazardsCounter == HAZARDS_MAX_COUNT) { - gSideStatuses[GetBattlerSide(battler)] &= ~SIDE_STATUS_TOXIC_SPIKES; - gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0; - gBattleScripting.battler = battler; - BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); + gDisableStructs[battler].hazardsDone = TRUE; + gBattleStruct->hazardsCounter = 0; } - else if (IsBattlerAffectedByHazards(battler, TRUE)) - { - if (CanBePoisoned(gBattlerAttacker, battler, GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(battler))) - { - gBattleScripting.battler = battler; - BattleScriptPushCursor(); - if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; - gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; - } - else - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; - gBattleMons[battler].status1 |= STATUS1_POISON; - } - - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - } - else if (!(gDisableStructs[battler].stickyWebDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STICKY_WEB) - && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler)) - { - gDisableStructs[battler].stickyWebDone = TRUE; - gBattleScripting.battler = battler; - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - BattleScriptCall(BattleScript_StickyWebOnSwitchIn); - } - else if (!(gDisableStructs[battler].steelSurgeDone) - && (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_STEELSURGE) - && IsBattlerAffectedByHazards(battler, FALSE) - && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) - { - gDisableStructs[battler].steelSurgeDone = TRUE; - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); - - if (gBattleStruct->moveDamage[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); } else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) { @@ -8220,12 +8232,6 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) return TRUE; } - gDisableStructs[battler].stickyWebDone = FALSE; - gDisableStructs[battler].spikesDone = FALSE; - gDisableStructs[battler].toxicSpikesDone = FALSE; - gDisableStructs[battler].stealthRockDone = FALSE; - gDisableStructs[battler].steelSurgeDone = FALSE; - for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == battler) @@ -8234,6 +8240,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } + gDisableStructs[battler].hazardsDone = FALSE; gBattleStruct->battlerState[battler].forcedSwitch = FALSE; return FALSE; } @@ -9567,6 +9574,32 @@ static void RemoveAllTerrains(void) } \ } +static bool32 DefogClearHazards(u32 saveBattler, u32 side, bool32 clear) +{ + if (!AreAnyHazardsOnSide(side)) + return FALSE; + + for (u32 hazardType = HAZARDS_NONE + 1; hazardType < HAZARDS_MAX_COUNT; hazardType++) + { + bool32 checkOrClear = clear ? IsHazardOnSideAndClear(side, hazardType) : IsHazardOnSide(side, hazardType); + if (checkOrClear) + { + if (clear) + { + gBattleStruct->numHazards[side]--; + gBattleCommunication[MULTISTRING_CHOOSER] = hazardType; + BattleScriptCall(BattleScript_DefogClearHazards); + } + else + { + gBattlerAttacker = saveBattler; + } + return TRUE; + } + } + return FALSE; +} + static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) { s32 i; @@ -9589,11 +9622,8 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { gBattlerAttacker = i; // For correct battle string. Ally's / Foe's - DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeDefog, 0); + if (DefogClearHazards(saveBattler, i, clear)) + return TRUE; } if (gBattleWeather & B_WEATHER_FOG) { @@ -9621,14 +9651,9 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear) for (i = 0; i < NUM_BATTLE_SIDES; i++) { - struct SideTimer *sideTimer = &gSideTimers[i]; - u32 *sideStatuses = &gSideStatuses[i]; - gBattlerAttacker = i; // For correct battle string. Ally's / Foe's - DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesDefog, 0); - DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebDefog, 0); + if (DefogClearHazards(saveBattler, i, clear)) + return TRUE; } for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -9780,17 +9805,23 @@ void BS_CourtChangeSwapSideStatuses(void) COURTCHANGE_SWAP(SIDE_STATUS_TAILWIND, tailwindTimer, temp); // Lucky Chant doesn't exist in gen 8, but seems like it should be affected by Court Change COURTCHANGE_SWAP(SIDE_STATUS_LUCKY_CHANT, luckyChantTimer, temp); - COURTCHANGE_SWAP(SIDE_STATUS_SPIKES, spikesAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STICKY_WEB, stickyWebAmount, temp); - COURTCHANGE_SWAP(SIDE_STATUS_STEELSURGE, steelsurgeAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_DAMAGE_NON_TYPES, damageNonTypesTimer, temp); // Track Pledge effect side COURTCHANGE_SWAP(SIDE_STATUS_RAINBOW, rainbowTimer, temp); COURTCHANGE_SWAP(SIDE_STATUS_SEA_OF_FIRE, seaOfFireTimer, temp); COURTCHANGE_SWAP(SIDE_STATUS_SWAMP, swampTimer, temp); + // Hazards + u32 tempQueue[HAZARDS_MAX_COUNT] = {HAZARDS_NONE}; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + tempQueue[i] = gBattleStruct->hazardsQueue[B_SIDE_PLAYER][i]; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[B_SIDE_PLAYER][i] = gBattleStruct->hazardsQueue[B_SIDE_OPPONENT][i]; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[B_SIDE_OPPONENT][i] = tempQueue[i]; + SWAP(sideTimerPlayer->spikesAmount, sideTimerOpp->spikesAmount, temp); + SWAP(sideTimerPlayer->toxicSpikesAmount, sideTimerOpp->toxicSpikesAmount, temp); + // Change battler IDs of swapped effects. Needed for the correct string when they expire UPDATE_COURTCHANGED_BATTLER(stickyWebBattlerId); @@ -13950,7 +13981,8 @@ static void Cmd_trysetspikes(void) } else { - gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES; + if (gSideTimers[targetSide].spikesAmount == 0) // Add only once to the queue + PushHazardTypeToQueue(targetSide, HAZARDS_SPIKES); gSideTimers[targetSide].spikesAmount++; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14313,35 +14345,18 @@ static void Cmd_rapidspinfree(void) gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; BattleScriptCall(BattleScript_LeechSeedFree); } - else if (gSideStatuses[atkSide] & SIDE_STATUS_SPIKES) + else if (AreAnyHazardsOnSide(atkSide)) { - gSideStatuses[atkSide] &= ~SIDE_STATUS_SPIKES; - gSideTimers[atkSide].spikesAmount = 0; - BattleScriptCall(BattleScript_SpikesFree); - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_TOXIC_SPIKES) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_TOXIC_SPIKES; - gSideTimers[atkSide].toxicSpikesAmount = 0; - BattleScriptCall(BattleScript_ToxicSpikesFree); - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STICKY_WEB) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STICKY_WEB; - gSideTimers[atkSide].stickyWebAmount = 0; - BattleScriptCall(BattleScript_StickyWebFree); - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STEALTH_ROCK) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STEALTH_ROCK; - gSideTimers[atkSide].stealthRockAmount = 0; - BattleScriptCall(BattleScript_StealthRockFree); - } - else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE) - { - gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE; - gSideTimers[atkSide].steelsurgeAmount = 0; - BattleScriptCall(BattleScript_SteelsurgeFree); + for (u32 hazardType = HAZARDS_NONE + 1; hazardType < HAZARDS_MAX_COUNT; hazardType++) + { + if (IsHazardOnSideAndClear(atkSide, hazardType)) + { + gBattleStruct->numHazards[atkSide]--; + gBattleCommunication[MULTISTRING_CHOOSER] = hazardType; + BattleScriptCall(BattleScript_SpinHazardsAway); + return; + } + } } else { @@ -14432,16 +14447,15 @@ static void Cmd_setstickyweb(void) u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STICKY_WEB) + if (IsHazardOnSide(targetSide, HAZARDS_STICKY_WEB)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gSideStatuses[targetSide] |= SIDE_STATUS_STICKY_WEB; + PushHazardTypeToQueue(targetSide, HAZARDS_STICKY_WEB); gSideTimers[targetSide].stickyWebBattlerId = gBattlerAttacker; // For Mirror Armor gSideTimers[targetSide].stickyWebBattlerSide = GetBattlerSide(gBattlerAttacker); // For Court Change/Defiant - set this to the user's side - gSideTimers[targetSide].stickyWebAmount = 1; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14967,8 +14981,9 @@ static void Cmd_settoxicspikes(void) } else { + if (gSideTimers[targetSide].toxicSpikesAmount == 0) + PushHazardTypeToQueue(targetSide, HAZARDS_TOXIC_SPIKES); gSideTimers[targetSide].toxicSpikesAmount++; - gSideStatuses[targetSide] |= SIDE_STATUS_TOXIC_SPIKES; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15158,14 +15173,13 @@ static void Cmd_setstealthrock(void) CMD_ARGS(const u8 *failInstr); u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEALTH_ROCK) + if (IsHazardOnSide(targetSide, HAZARDS_STEALTH_ROCK)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gSideStatuses[targetSide] |= SIDE_STATUS_STEALTH_ROCK; - gSideTimers[targetSide].stealthRockAmount = 1; + PushHazardTypeToQueue(targetSide, HAZARDS_STEALTH_ROCK); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -18544,14 +18558,13 @@ void BS_SetSteelsurge(void) { NATIVE_ARGS(const u8 *failInstr); u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + if (IsHazardOnSide(targetSide, HAZARDS_STEELSURGE)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; - gSideTimers[targetSide].steelsurgeAmount = 1; + PushHazardTypeToQueue(targetSide, HAZARDS_STEELSURGE); gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/src/battle_util.c b/src/battle_util.c index e40020e11f..8664fb417d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11445,3 +11445,79 @@ void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue) return; } } + +// Hazards are added to a queue and applied based in order (FIFO) +void PushHazardTypeToQueue(u32 side, enum Hazards hazardType) +{ + if (!IsHazardOnSide(side, hazardType)) // Failsafe + gBattleStruct->hazardsQueue[side][gBattleStruct->numHazards[side]++] = hazardType; +} + +bool32 IsHazardOnSide(u32 side, enum Hazards hazardType) +{ + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + { + if (gBattleStruct->hazardsQueue[side][i] == hazardType) + return TRUE; + } + return FALSE; +} + +bool32 AreAnyHazardsOnSide(u32 side) +{ + return gBattleStruct->numHazards[side] > 0; +} + +bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType) +{ + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + { + if (gBattleStruct->hazardsQueue[side][i] == hazardType) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + if (hazardType == HAZARDS_SPIKES) + gSideTimers[side].spikesAmount = 0; + else if (hazardType == HAZARDS_TOXIC_SPIKES) + gSideTimers[side].toxicSpikesAmount = 0; + return TRUE; + } + } + return FALSE; +} + +void RemoveAllHazardsFromField(u32 side) +{ + gSideTimers[side].spikesAmount = 0; + gSideTimers[side].toxicSpikesAmount = 0; + gBattleStruct->numHazards[side] = 0; + for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; +} + +void RemoveHazardFromField(u32 side, enum Hazards hazardType) +{ + u32 i; + for (i = 0; i < HAZARDS_MAX_COUNT; i++) + { + if (gBattleStruct->hazardsQueue[side][i] == hazardType) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + gBattleStruct->numHazards[side]--; + if (hazardType == HAZARDS_SPIKES) + gSideTimers[side].spikesAmount = 0; + else if (hazardType == HAZARDS_TOXIC_SPIKES) + gSideTimers[side].toxicSpikesAmount = 0; + break; + } + } + while (i < HAZARDS_MAX_COUNT) + { + if (i+1 == HAZARDS_MAX_COUNT) + { + gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; + break; + } + gBattleStruct->hazardsQueue[side][i] = gBattleStruct->hazardsQueue[side][i+1]; + i++; + } +} diff --git a/test/battle/hazards.c b/test/battle/hazards.c new file mode 100644 index 0000000000..9c974bb7b1 --- /dev/null +++ b/test/battle/hazards.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Hazards are applied based on order of set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_GRIMER); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 1); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 2); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); SWITCH(player, 0); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + MESSAGE("Wobbuffet was poisoned!"); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("Pointed stones dug into Wynaut!"); + MESSAGE("Wynaut was caught in a sticky web!"); + MESSAGE("Wynaut was hurt by the spikes!"); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STEALTH_ROCK); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + } +} diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 41381df18c..56d38c165d 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -29,16 +29,16 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the opponent") MESSAGE("Wynaut swapped the battle effects affecting each side of the field!"); SEND_IN_MESSAGE("Wynaut"); NONE_OF { - MESSAGE("Wynaut was hurt by the spikes!"); - MESSAGE("Pointed stones dug into Wynaut!"); - MESSAGE("Wynaut was poisoned!"); MESSAGE("Wynaut was caught in a sticky web!"); + MESSAGE("Pointed stones dug into Wynaut!"); + MESSAGE("Wynaut was hurt by the spikes!"); + MESSAGE("Wynaut was poisoned!"); } MESSAGE("2 sent out Wobbuffet!"); - MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); - MESSAGE("Pointed stones dug into the opposing Wobbuffet!"); - MESSAGE("The opposing Wobbuffet was poisoned!"); MESSAGE("The opposing Wobbuffet was caught in a sticky web!"); + MESSAGE("Pointed stones dug into the opposing Wobbuffet!"); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + MESSAGE("The opposing Wobbuffet was poisoned!"); } } @@ -64,16 +64,16 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") MESSAGE("The opposing Wynaut used Court Change!"); MESSAGE("The opposing Wynaut swapped the battle effects affecting each side of the field!"); SEND_IN_MESSAGE("Wobbuffet"); - MESSAGE("Wobbuffet was hurt by the spikes!"); - MESSAGE("Pointed stones dug into Wobbuffet!"); - MESSAGE("Wobbuffet was poisoned!"); MESSAGE("Wobbuffet was caught in a sticky web!"); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was hurt by the spikes!"); + MESSAGE("Wobbuffet was poisoned!"); MESSAGE("2 sent out Wynaut!"); NONE_OF { - MESSAGE("The opposing Wynaut was hurt by the spikes!"); - MESSAGE("Pointed stones dug into the opposing Wynaut!"); - MESSAGE("The opposing Wynaut was poisoned!"); MESSAGE("The opposing Wynaut was caught in a sticky web!"); + MESSAGE("Pointed stones dug into the opposing Wynaut!"); + MESSAGE("The opposing Wynaut was hurt by the spikes!"); + MESSAGE("The opposing Wynaut was poisoned!"); } } } diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index ce0ab844c7..96b79438f1 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -154,8 +154,8 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) { - MESSAGE("The pointed stones disappeared from around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); @@ -365,16 +365,30 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { MESSAGE("The spikes disappeared from the ground around your team!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The poison spikes disappeared from the ground around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); // Opponent side MESSAGE("The spikes disappeared from the ground around the opposing team!"); - MESSAGE("The pointed stones disappeared from around the opposing team!"); - MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); MESSAGE("The sticky web has disappeared from the ground around the opposing team!"); + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + MESSAGE("The pointed stones disappeared from around the opposing team!"); } + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + + EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][5], HAZARDS_NONE); } } diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index 251279e198..76a500bd46 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -159,8 +159,8 @@ SINGLE_BATTLE_TEST("Dragon Tail switches target out and incoming mon has Levitat ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); HP_BAR(opponent); MESSAGE("The opposing Weezing was dragged out!"); - HP_BAR(opponent); - NOT STATUS_ICON(opponent, poison: TRUE); MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + NOT STATUS_ICON(opponent, poison: TRUE); + HP_BAR(opponent); } } diff --git a/test/battle/move_effect/rapid_spin.c b/test/battle/move_effect/rapid_spin.c index 9d142bf32e..852b4d69a7 100644 --- a/test/battle/move_effect/rapid_spin.c +++ b/test/battle/move_effect/rapid_spin.c @@ -63,3 +63,32 @@ SINGLE_BATTLE_TEST("Rapid Spin: Mortal Spin blows away Wrap, hazards and poisons MESSAGE("Wobbuffet blew away Stealth Rock!"); } } + +SINGLE_BATTLE_TEST("Rapid Spin blows away all hazards") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { MOVE(opponent, MOVE_STICKY_WEB); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); MOVE(player, MOVE_RAPID_SPIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAPID_SPIN, player); + + MESSAGE("Wobbuffet blew away Spikes!"); + MESSAGE("Wobbuffet blew away Sticky Web!"); + MESSAGE("Wobbuffet blew away Toxic Spikes!"); + MESSAGE("Wobbuffet blew away Stealth Rock!"); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + } +} diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 03dcec84f4..4b458f5c68 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -133,3 +133,30 @@ SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon") } } } + +SINGLE_BATTLE_TEST("Toxic Spikes: Only three layers can be set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + TURN { MOVE(opponent, MOVE_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + u32 spikesAmount = gSideTimers[0].spikesAmount; + EXPECT_EQ(spikesAmount, 3); + } +} diff --git a/test/battle/move_effect/tidy_up.c b/test/battle/move_effect/tidy_up.c index 842c186ab0..61468e8cea 100644 --- a/test/battle/move_effect/tidy_up.c +++ b/test/battle/move_effect/tidy_up.c @@ -43,9 +43,9 @@ SINGLE_BATTLE_TEST("Tidy Up removes hazards and raises Stats") MESSAGE("Wobbuffet used Tidy Up!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_TIDY_UP, player); MESSAGE("The spikes disappeared from the ground around your team!"); - MESSAGE("The pointed stones disappeared from around your team!"); - MESSAGE("The poison spikes disappeared from the ground around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The poison spikes disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); MESSAGE("Tidying up complete!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Wobbuffet's Attack rose!"); diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index 4d4dbf7c43..3d21c0693b 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -266,3 +266,28 @@ SINGLE_BATTLE_TEST("Toxic Spikes print bad poison for 2 layers") MESSAGE("The opposing Wynaut was badly poisoned!"); } } + +SINGLE_BATTLE_TEST("Toxic Spikes: Only two layers can be set up") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, opponent); + } THEN { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_TOXIC_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); + u32 toxicSpikesAmount = gSideTimers[0].toxicSpikesAmount; + EXPECT_EQ(toxicSpikesAmount, 2); + } +} From 5a6e7749abe93da9c5acb834497de05f566c623f Mon Sep 17 00:00:00 2001 From: Nephrite Date: Tue, 8 Jul 2025 17:17:05 +0300 Subject: [PATCH 117/248] Removed all instances of .chance = 100, SHEER_FORCE_NO_BOOST (#7300) --- src/data/moves_info.h | 117 +----------------------------------------- 1 file changed, 1 insertion(+), 116 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 2de237f01b..465d3c0153 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -17178,8 +17178,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestComboMoves = {0}, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ION_DELUGE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_PlasmaFists, }, @@ -17228,8 +17226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #if B_UPDATED_MOVE_DATA >= GEN_8 .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_EVS_PLUS_1, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, + .self = TRUE, }), #endif .battleAnimScript = gBattleAnimMove_ZippyZap, @@ -17346,8 +17343,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_BuzzyBuzz, }, @@ -17372,8 +17367,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SizzlySlide, }, @@ -17396,8 +17389,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LIGHT_SCREEN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_GlitzyGlow, }, @@ -17420,8 +17411,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REFLECT, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_BaddyBad, }, @@ -17445,8 +17434,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LEECH_SEED, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SappySeed, }, @@ -17469,8 +17456,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HAZE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_FreezyFrost, }, @@ -17493,8 +17478,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AROMATHERAPY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), .battleAnimScript = gBattleAnimMove_SparklySwirl, }, @@ -21756,8 +21739,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxFlare, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SUN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21778,8 +21759,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxFlutterby, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SP_ATK_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21800,8 +21779,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxLightning, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ELECTRIC_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21822,8 +21799,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxStrike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SPEED_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21844,8 +21819,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxKnuckle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_ATTACK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21866,8 +21839,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxPhantasm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_DEFENSE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21888,8 +21859,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxHailstorm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HAIL, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21910,8 +21879,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxOoze, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_ATK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21932,8 +21899,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxGeyser, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21954,8 +21919,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxAirstream, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SPEED, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21976,8 +21939,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxStarfall, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_MISTY_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -21998,8 +21959,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxWyrmwind, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_ATTACK_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22020,8 +21979,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxMindstorm, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22042,8 +21999,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxRockfall, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SANDSTORM, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22065,8 +22020,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxQuake, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_DEF, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22087,8 +22040,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxDarkness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SP_DEF_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22109,8 +22060,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxOvergrowth, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_GRASSY_TERRAIN, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22131,8 +22080,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_MaxSteelspike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RAISE_TEAM_DEFENSE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22153,8 +22100,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVineLash, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_VINE_LASH, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22175,8 +22120,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxWildfire, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WILDFIRE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22197,8 +22140,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCannonade, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CANNONADE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22219,8 +22160,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxBefuddle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_EFFECT_SPORE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22241,8 +22180,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYZE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22263,8 +22200,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxGoldRush, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22285,8 +22220,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxChiStrike, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CRIT_PLUS_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22307,8 +22240,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxTerror, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22329,8 +22260,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_SPEED_2_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22351,8 +22280,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxResonance, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AURORA_VEIL, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22373,8 +22300,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCuddle, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_INFATUATE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22395,8 +22320,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxReplenish, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RECYCLE_BERRIES, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22417,8 +22340,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxMalodor, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22439,8 +22360,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxMeltdown, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_TORMENT_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22462,8 +22381,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxDrumSolo, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22485,8 +22402,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFireball, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22508,8 +22423,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxHydrosnipe, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIXED_POWER, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22530,8 +22443,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxWindRage, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_DEFOG, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22552,8 +22463,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxGravitas, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_GRAVITY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22574,8 +22483,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxStonesurge, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_STEALTH_ROCK, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22596,8 +22503,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxVolcalith, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_VOLCALITH, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22618,8 +22523,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxTartness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22640,8 +22543,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSweetness, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_AROMATHERAPY, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22662,8 +22563,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSandblast, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SANDBLAST_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22684,8 +22583,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxStunShock, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON_PARALYZE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22706,8 +22603,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxCentiferno, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FIRE_SPIN_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22728,8 +22623,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSmite, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSE_SIDE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22751,8 +22644,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSnooze, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_YAWN_FOE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22773,8 +22664,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxFinale, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_HEAL_TEAM, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22795,8 +22684,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_STEELSURGE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, @@ -22817,8 +22704,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .battleAnimScript = gBattleAnimMove_GMaxDepletion, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPITE, - .chance = 100, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, }), }, From 57dad22ac463a10aab81ee5e2f0911748c1dbf53 Mon Sep 17 00:00:00 2001 From: khbsd Date: Tue, 8 Jul 2025 18:52:42 +0000 Subject: [PATCH 118/248] feat: separate water and rock smash encounter rate checks (#7293) --- include/wild_encounter.h | 7 +++--- src/dexnav.c | 2 +- src/wild_encounter.c | 51 ++++++++++++++++++++++++++++++---------- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 8a0eb671f6..c8f60712f9 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -63,9 +63,10 @@ bool8 StandardWildEncounter_Debug(void); u32 CalculateChainFishingShinyRolls(void); void CreateWildMon(u16 species, u8 level); u16 GetCurrentMapWildMonHeaderId(void); -u8 ChooseWildMonIndex_Land(void); -u8 ChooseWildMonIndex_WaterRock(void); -u8 ChooseHiddenMonIndex(void); +u32 ChooseWildMonIndex_Land(void); +u32 ChooseWildMonIndex_Water(void); +u32 ChooseWildMonIndex_Rocks(void); +u32 ChooseHiddenMonIndex(void); bool32 MapHasNoEncounterData(void); enum TimeOfDay GetTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area); diff --git a/src/dexnav.c b/src/dexnav.c index 38a5323994..e1fc4a497f 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -2577,7 +2577,7 @@ bool8 TryFindHiddenPokemon(void) } else { - species = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + species = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; environment = ENCOUNTER_TYPE_WATER; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b5de5d7415..eafd522d78 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -178,7 +178,7 @@ static void FeebasSeedRng(u16 seed) } // LAND_WILD_COUNT -u8 ChooseWildMonIndex_Land(void) +u32 ChooseWildMonIndex_Land(void) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -218,10 +218,10 @@ u8 ChooseWildMonIndex_Land(void) return wildMonIndex; } -// ROCK_WILD_COUNT / WATER_WILD_COUNT -u8 ChooseWildMonIndex_WaterRock(void) +// WATER_WILD_COUNT +u32 ChooseWildMonIndex_Water(void) { - u8 wildMonIndex = 0; + u32 wildMonIndex = 0; bool8 swap = FALSE; u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL; @@ -245,8 +245,35 @@ u8 ChooseWildMonIndex_WaterRock(void) return wildMonIndex; } +// ROCK_WILD_COUNT +u32 ChooseWildMonIndex_Rocks(void) +{ + u32 wildMonIndex = 0; + bool8 swap = FALSE; + u8 rand = Random() % ENCOUNTER_CHANCE_ROCK_SMASH_MONS_TOTAL; + + if (rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0) + wildMonIndex = 0; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1) + wildMonIndex = 1; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2) + wildMonIndex = 2; + else if (rand >= ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_ROCK_SMASH_MONS_SLOT_3) + wildMonIndex = 3; + else + wildMonIndex = 4; + + if (LURE_STEP_COUNT != 0 && (Random() % 10 < 2)) + swap = TRUE; + + if (swap) + wildMonIndex = 4 - wildMonIndex; + + return wildMonIndex; +} + // FISH_WILD_COUNT -static u8 ChooseWildMonIndex_Fishing(u8 rod) +static u32 ChooseWildMonIndex_Fishing(u8 rod) { u8 wildMonIndex = 0; bool8 swap = FALSE; @@ -411,7 +438,7 @@ enum TimeOfDay GetTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area } } - if (wildMonInfo == NULL && !OW_TIME_OF_DAY_DISABLE_FALLBACK) + if (wildMonInfo == NULL && !OW_TIME_OF_DAY_DISABLE_FALLBACK) return OW_TIME_OF_DAY_FALLBACK; else return timeOfDay; @@ -529,10 +556,10 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, enum if (OW_STORM_DRAIN >= GEN_8 && TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex, WATER_WILD_COUNT)) break; - wildMonIndex = ChooseWildMonIndex_WaterRock(); + wildMonIndex = ChooseWildMonIndex_Water(); break; case WILD_AREA_ROCKS: - wildMonIndex = ChooseWildMonIndex_WaterRock(); + wildMonIndex = ChooseWildMonIndex_Rocks(); break; default: case WILD_AREA_FISHING: @@ -1007,7 +1034,7 @@ u16 GetLocalWildMon(bool8 *isWaterMon) else if (landMonsInfo == NULL && waterMonsInfo != NULL) { *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } // Either land or water Pokémon if ((Random() % 100) < 80) @@ -1017,7 +1044,7 @@ u16 GetLocalWildMon(bool8 *isWaterMon) else { *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } } @@ -1033,7 +1060,7 @@ u16 GetLocalWaterMon(void) const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo; if (waterMonsInfo) - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; } return SPECIES_NONE; } @@ -1226,7 +1253,7 @@ bool8 StandardWildEncounter_Debug(void) return TRUE; } -u8 ChooseHiddenMonIndex(void) +u32 ChooseHiddenMonIndex(void) { #ifdef ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL u8 rand = Random() % ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL; From b5a13d5e7f2f22ec7b147c126a2c807ed1f5dbe8 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 8 Jul 2025 16:00:37 -0400 Subject: [PATCH 119/248] Fixed Flag Vars menu keeping artifacts from bag menu + cleanup (#7226) --- src/debug.c | 208 +++++++++++++++++----------------------------------- 1 file changed, 66 insertions(+), 142 deletions(-) diff --git a/src/debug.c b/src/debug.c index 041734ebf5..ba91351b98 100644 --- a/src/debug.c +++ b/src/debug.c @@ -231,19 +231,20 @@ EWRAM_DATA u64 gDebugAIFlags = 0; // ******************************* // Define functions static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption *items); +static u8 Debug_GenerateListMenuNames(void); static void Debug_DestroyMenu(u8 taskId); static void DebugAction_Cancel(u8 taskId); static void DebugAction_DestroyExtraWindow(u8 taskId); static void Debug_RefreshListMenu(u8 taskId); static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items); -static void DebugAction_OpenSubMenuFlagsVars(u8 taskId); +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_OpenSubMenuFakeRTC(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_ExecuteScript(u8 taskId, const u8 *script); +static void DebugAction_ToggleFlag(u8 taskId); static void DebugTask_HandleMenuInput_General(u8 taskId); -static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId); static void DebugAction_Util_Fly(u8 taskId); static void DebugAction_Util_Warp_Warp(u8 taskId); @@ -637,20 +638,20 @@ static const struct DebugMenuOption sDebugMenu_Actions_Flags[] = [DEBUG_FLAGVAR_MENU_ITEM_VARS] = { COMPOUND_STRING("Set Var XYZ…"), DebugAction_FlagsVars_Vars }, [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_ALL] = { COMPOUND_STRING("Pokédex Flags All"), DebugAction_FlagsVars_PokedexFlags_All }, [DEBUG_FLAGVAR_MENU_ITEM_DEXFLAGS_RESET] = { COMPOUND_STRING("Pokédex Flags Reset"), DebugAction_FlagsVars_PokedexFlags_Reset }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}Pokédex"), DebugAction_FlagsVars_SwitchDex }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DebugAction_FlagsVars_SwitchNatDex }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = { COMPOUND_STRING("Toggle {STR_VAR_1}PokéNav"), DebugAction_FlagsVars_SwitchPokeNav }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DebugAction_FlagsVars_SwitchMatchCall }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = { COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DebugAction_FlagsVars_RunningShoes }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DebugAction_FlagsVars_ToggleFlyFlags }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DebugAction_FlagsVars_ToggleBadgeFlags }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = { COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DebugAction_FlagsVars_ToggleGameClear }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DebugAction_FlagsVars_ToggleFrontierPass }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = { COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DebugAction_FlagsVars_CollisionOnOff }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = { COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DebugAction_FlagsVars_EncounterOnOff }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DebugAction_FlagsVars_TrainerSeeOnOff }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_FlagsVars_BagUseOnOff }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = { COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DebugAction_FlagsVars_CatchingOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKEDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}Pokédex"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_NATDEX] = { COMPOUND_STRING("Toggle {STR_VAR_1}National Dex"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchNatDex }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_POKENAV] = { COMPOUND_STRING("Toggle {STR_VAR_1}PokéNav"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchPokeNav }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_MATCH_CALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}Match Call"), DebugAction_ToggleFlag, DebugAction_FlagsVars_SwitchMatchCall }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_RUN_SHOES] = { COMPOUND_STRING("Toggle {STR_VAR_1}Running Shoes"), DebugAction_ToggleFlag, DebugAction_FlagsVars_RunningShoes }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Fly Flags"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleFlyFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BADGES_ALL] = { COMPOUND_STRING("Toggle {STR_VAR_1}All badges"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleBadgeFlags }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_GAME_CLEAR] = { COMPOUND_STRING("Toggle {STR_VAR_1}Game clear"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleGameClear }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_FRONTIER_PASS] = { COMPOUND_STRING("Toggle {STR_VAR_1}Frontier Pass"), DebugAction_ToggleFlag, DebugAction_FlagsVars_ToggleFrontierPass }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = { COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CollisionOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = { COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_EncounterOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_TrainerSeeOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_BagUseOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = { COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CatchingOnOff }, { NULL } }; @@ -776,49 +777,6 @@ static const struct DebugMenuOption *Debug_GetCurrentCallbackMenu(void) return callbackItems; } -static void Debug_ShowMenuFromTemplate(void (*HandleInput)(u8), struct ListMenuTemplate LMtemplate) -{ - struct ListMenuTemplate menuTemplate; - u8 windowId; - u8 menuTaskId; - u8 inputTaskId; - - // create window - HideMapNamePopUpWindow(); - LoadMessageBoxAndBorderGfx(); - windowId = AddWindow(&sDebugMenuWindowTemplateMain); - DrawStdWindowFrame(windowId, FALSE); - - // create list menu - menuTemplate = LMtemplate; - menuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; - menuTemplate.windowId = windowId; - menuTemplate.header_X = 0; - menuTemplate.item_X = 8; - menuTemplate.cursor_X = 0; - menuTemplate.upText_Y = 1; - menuTemplate.cursorPal = 2; - menuTemplate.fillValue = 1; - menuTemplate.cursorShadowPal = 3; - menuTemplate.lettersSpacing = 1; - menuTemplate.itemVerticalPadding = 0; - menuTemplate.scrollMultiple = LIST_NO_MULTIPLE_SCROLL; - menuTemplate.fontId = DEBUG_MENU_FONT; - menuTemplate.cursorKind = 0; - menuTaskId = ListMenuInit(&menuTemplate, 0, 0); - - // create input handler task - inputTaskId = CreateTask(HandleInput, 3); - gTasks[inputTaskId].tMenuTaskId = menuTaskId; - gTasks[inputTaskId].tWindowId = windowId; - gTasks[inputTaskId].tSubWindowId = 0; - - Debug_RefreshListMenu(inputTaskId); - - // draw everything - CopyWindowToVram(windowId, COPYWIN_FULL); -} - static bool32 IsSubMenuAction(const void *action) { return action == DebugAction_OpenSubMenu @@ -845,21 +803,30 @@ static void Debug_ShowMenu(DebugFunc HandleInput, const struct DebugMenuOption * windowId = AddWindow(&sDebugMenuWindowTemplateMain); DrawStdWindowFrame(windowId, FALSE); - u32 i = 0; - for (i = 0; items[i].text != NULL; i++) + u32 totalItems = 0; + + if (sDebugMenuListData->listId == 1) { - sDebugMenuListData->listItems[i].id = i; - StringExpandPlaceholders(gStringVar4, items[i].text); - if (IsSubMenuAction(items[i].action)) - StringAppend(gStringVar4, sDebugText_Arrow); - StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); - sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; + totalItems = Debug_GenerateListMenuNames(); + } + else + { + for (u32 i = 0; items[i].text != NULL; i++) + { + sDebugMenuListData->listItems[i].id = i; + StringExpandPlaceholders(gStringVar4, items[i].text); + if (IsSubMenuAction(items[i].action)) + StringAppend(gStringVar4, sDebugText_Arrow); + StringCopy(&sDebugMenuListData->itemNames[i][0], gStringVar4); + sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; + totalItems++; + } } // create list menu menuTemplate.items = sDebugMenuListData->listItems; menuTemplate.moveCursorFunc = ListMenuDefaultCursorMoveFunc; - menuTemplate.totalItems = i; + menuTemplate.totalItems = totalItems; menuTemplate.maxShowed = DEBUG_MENU_HEIGHT_MAIN; menuTemplate.windowId = windowId; menuTemplate.header_X = 0; @@ -1068,13 +1035,18 @@ static u8 Debug_CheckToggleFlags(u8 id) return result; } -static void Debug_GenerateListMenuNames(u32 totalItems) +static u8 Debug_GenerateListMenuNames(void) { const u8 sColor_Red[] = _("{COLOR RED}"); const u8 sColor_Green[] = _("{COLOR GREEN}"); u32 i, flagResult = 0; u8 const *name = NULL; + u8 totalItems = 0; + if (sDebugMenuListData->listId == 1) + // Failsafe to prevent memory corruption + totalItems = min(ARRAY_COUNT(sDebugMenu_Actions_Flags) - 1, DEBUG_MAX_MENU_ITEMS); + // Copy item names for all entries but the last (which is Cancel) for (i = 0; i < totalItems; i++) { @@ -1104,25 +1076,12 @@ static void Debug_GenerateListMenuNames(u32 totalItems) sDebugMenuListData->listItems[i].name = &sDebugMenuListData->itemNames[i][0]; sDebugMenuListData->listItems[i].id = i; } + return totalItems; } static void Debug_RefreshListMenu(u8 taskId) { - u8 totalItems = 0; - - if (sDebugMenuListData->listId == 1) - { - for (u32 i = 0; i < ARRAY_COUNT(sDebugMenu_Actions_Flags); i++) - { - sDebugMenuListData->listItems[i].id = i; - sDebugMenuListData->listItems[i].name = sDebugMenu_Actions_Flags[i].text; - } - totalItems = gMultiuseListMenuTemplate.totalItems = ARRAY_COUNT(sDebugMenu_Actions_Flags) - 1; - } - - // Failsafe to prevent memory corruption - totalItems = min(totalItems, DEBUG_MAX_MENU_ITEMS); - Debug_GenerateListMenuNames(totalItems); + u8 totalItems = Debug_GenerateListMenuNames(); // Set list menu data gMultiuseListMenuTemplate.items = sDebugMenuListData->listItems; @@ -1143,17 +1102,6 @@ static void Debug_RefreshListMenu(u8 taskId) gMultiuseListMenuTemplate.cursorKind = 0; } -static void Debug_RedrawListMenu(u8 taskId) -{ - u8 listTaskId = gTasks[taskId].tMenuTaskId; - u16 scrollOffset, selectedRow; - ListMenuGetScrollAndRow(listTaskId, &scrollOffset, &selectedRow); - - DestroyListMenuTask(gTasks[taskId].tMenuTaskId, &scrollOffset, &selectedRow); - Debug_RefreshListMenu(taskId); - gTasks[taskId].tMenuTaskId = ListMenuInit(&gMultiuseListMenuTemplate, scrollOffset, selectedRow); -} - static void DebugTask_HandleMenuInput_General(u8 taskId) { const struct DebugMenuOption *options = Debug_GetCurrentCallbackMenu(); @@ -1166,11 +1114,22 @@ static void DebugTask_HandleMenuInput_General(u8 taskId) if (option.action != NULL) { if (IsSubMenuAction(option.action)) + { ((DebugSubmenuFunc)option.action)(taskId, option.actionParams); + } else if (option.action == DebugAction_ExecuteScript) + { Debug_DestroyMenu_Full_Script(taskId, (const u8 *)option.actionParams); + } + else if (option.action == DebugAction_ToggleFlag) + { + ((DebugFunc)option.actionParams)(taskId); + DebugAction_ToggleFlag(taskId); + } else + { ((DebugFunc)option.action)(taskId); + } } } else if (JOY_NEW(B_BUTTON)) @@ -1179,10 +1138,9 @@ static void DebugTask_HandleMenuInput_General(u8 taskId) if (Debug_GetCurrentCallbackMenu() != NULL && Debug_RemoveCallbackMenu() != 0) { Debug_DestroyMenu(taskId); - if (sDebugMenuListData->listId == 1) - Debug_ShowMenu(DebugTask_HandleMenuInput_FlagsVars, NULL); - else - Debug_ShowMenu(DebugTask_HandleMenuInput_General, NULL); + if (sDebugMenuListData->listId != 0) + sDebugMenuListData->listId = 0; + Debug_ShowMenu(DebugTask_HandleMenuInput_General, NULL); } else { @@ -1192,57 +1150,17 @@ static void DebugTask_HandleMenuInput_General(u8 taskId) } } - -static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) -{ - DebugSubmenuFunc func; - u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if ((func = sDebugMenu_Actions_Flags[input].action) != NULL) - { - if (input == DEBUG_FLAGVAR_MENU_ITEM_FLAGS || input == DEBUG_FLAGVAR_MENU_ITEM_VARS) - { - Debug_RedrawListMenu(taskId); - func(taskId, sDebugMenu_Actions_Flags[input].actionParams); - } - else - { - func(taskId, sDebugMenu_Actions_Flags[input].actionParams); - Debug_GenerateListMenuNames(gMultiuseListMenuTemplate.totalItems); - RedrawListMenu(gTasks[taskId].tMenuTaskId); - } - - // Remove TRUE/FALSE window for functions that haven't been assigned flags - if (gTasks[taskId].tInput == 0xFF) - { - ClearStdWindowAndFrame(gTasks[taskId].tSubWindowId, TRUE); - RemoveWindow(gTasks[taskId].tSubWindowId); - Free(sDebugMenuListData); - } - } - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - Debug_DestroyMenu(taskId); - Debug_ShowMainMenu(); - } -} - -static void DebugAction_OpenSubMenuFlagsVars(u8 taskId) +static void DebugAction_OpenSubMenuFlagsVars(u8 taskId, const struct DebugMenuOption *items) { Debug_DestroyMenu(taskId); sDebugMenuListData->listId = 1; - Debug_RefreshListMenu(taskId); - Debug_ShowMenuFromTemplate(DebugTask_HandleMenuInput_FlagsVars, gMultiuseListMenuTemplate); + Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items) { Debug_DestroyMenu(taskId); + sDebugMenuListData->listId = 0; Debug_ShowMenu(DebugTask_HandleMenuInput_General, items); } @@ -1264,6 +1182,12 @@ static void DebugAction_ExecuteScript(u8 taskId, const u8 *script) Debug_DestroyMenu_Full_Script(taskId, script); } +static void DebugAction_ToggleFlag(u8 taskId) +{ + Debug_GenerateListMenuNames(); + RedrawListMenu(gTasks[taskId].tMenuTaskId); +} + static void DebugAction_OpenSubMenuCreateFollowerNPC(u8 taskId, const struct DebugMenuOption *items) { if (FNPC_ENABLE_NPC_FOLLOWERS) From d15c490223d3a2c7731f3c1ae1ce16a923d9d15e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:33:48 +0200 Subject: [PATCH 120/248] Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc (#7303) --- include/battle_util.h | 23 ++- src/battle_ai_main.c | 21 ++- src/battle_ai_switch_items.c | 4 +- src/battle_ai_util.c | 6 +- src/battle_script_commands.c | 224 ++--------------------- src/battle_util.c | 337 ++++++++++++++++++++++++++++------- 6 files changed, 316 insertions(+), 299 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index dd7a908e57..9eca2dacd7 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -23,17 +23,12 @@ #define MOVE_LIMITATION_PLACEHOLDER (1 << 15) #define MOVE_LIMITATIONS_ALL 0xFFFF -enum NonVolatileStatus +// Switches between simulated battle calc and actual battle combat +enum FunctionCallOption { - STATUS_CHECK_TRIGGER, - STATUS_RUN_SCRIPT, -}; - -enum AbilityEffectOptions -{ - ABILITY_CHECK_TRIGGER, - ABILITY_CHECK_TRIGGER_AI, - ABILITY_RUN_SCRIPT, + CHECK_TRIGGER, // Check the function without running scripts / setting any flags. + AI_CHECK, // Check the function without running scripts / setting any flags. Same as CHECK_TRIGGER but only used when additional data has to be fetched during ai calcs + RUN_SCRIPT, // Used during actual combat where a script has to be run / flags need to be set }; enum MoveAbsorbed @@ -245,8 +240,8 @@ enum MoveCanceller AtkCanceller_MoveSuccessOrder(void); void SetAtkCancellerForCalledMove(void); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum AbilityEffectOptions option); -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); @@ -360,7 +355,7 @@ bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 ability); bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects secondaryMoveEffect, enum NonVolatileStatus option); +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); @@ -406,5 +401,7 @@ bool32 AreAnyHazardsOnSide(u32 side); void RemoveAllHazardsFromField(u32 side); bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); void RemoveHazardFromField(u32 side, enum Hazards hazardType); +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index e66c77ce87..f3976fae4a 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -547,18 +547,27 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) aiData->speedStats[battler] = GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } +#define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 move) { u32 accuracy; u32 abilityAtk = aiData->abilities[battlerAtk]; u32 abilityDef = aiData->abilities[battlerDef]; - if (abilityAtk == ABILITY_NO_GUARD || abilityDef == ABILITY_NO_GUARD || GetMoveAccuracy(move) == 0) // Moves with accuracy 0 or no guard ability always hit. - accuracy = 100; + if (CanMoveSkipAccuracyCalc(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) + { + accuracy = BYPASSES_ACCURACY_CALC; + } else + { accuracy = GetTotalAccuracy(battlerAtk, battlerDef, move, abilityAtk, abilityDef, aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]); + // Cap normal accuracy at 100 for ai calcs. + // Done for comparison with moves that bypass accuracy checks (will be seen as 101 for ai calcs)) + accuracy = (accuracy > 100) ? 100 : accuracy; + } return accuracy; } +#undef BYPASSES_ACCURACY_CALC static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather) { @@ -672,8 +681,8 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk) u32 abilityAtk = ABILITY_NONE; u32 abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); u32 moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now - if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, ABILITY_CHECK_TRIGGER) - || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, ABILITY_CHECK_TRIGGER) + if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, CHECK_TRIGGER) + || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, CHECK_TRIGGER) || (CalcPartyMonTypeEffectivenessMultiplier(move, species, abilityDef) == 0)) { totalStallValue += currentStallValue; @@ -1105,10 +1114,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // check non-user target if (!(moveTarget & MOVE_TARGET_USER)) { - if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, ABILITY_CHECK_TRIGGER_AI)) + if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) RETURN_SCORE_MINUS(20); - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, move, moveType, ABILITY_CHECK_TRIGGER_AI)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, move, moveType, AI_CHECK)) RETURN_SCORE_MINUS(20); switch (abilityDef) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index e7bcf00e7b..393eb054bf 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1010,8 +1010,8 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) bool32 moveAffectsTarget = TRUE; if (lastUsedMove != MOVE_NONE && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) - || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), ABILITY_CHECK_TRIGGER) - || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, ABILITY_CHECK_TRIGGER))) + || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), AI_CHECK) + || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, AI_CHECK))) moveAffectsTarget = FALSE; if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 149aada871..6d2fb0afce 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -514,16 +514,16 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) partnerDefAbility = aiData->abilities[BATTLE_PARTNER(ctx->battlerDef)]; } - if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, ABILITY_CHECK_TRIGGER)) + if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, AI_CHECK)) return TRUE; - if (CanAbilityAbsorbMove(ctx->battlerAtk, ctx->battlerDef, battlerDefAbility, ctx->move, ctx->moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, ctx->battlerDef, battlerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) return TRUE; // Limited to Lighning Rod and Storm Drain because otherwise the AI would consider Water Absorb, etc... if (partnerDefAbility == ABILITY_LIGHTNING_ROD || partnerDefAbility == ABILITY_STORM_DRAIN) { - if (CanAbilityAbsorbMove(ctx->battlerAtk, BATTLE_PARTNER(ctx->battlerDef), partnerDefAbility, ctx->move, ctx->moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(ctx->battlerAtk, BATTLE_PARTNER(ctx->battlerDef), partnerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) return TRUE; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 567bdd85ee..f148129b2d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1248,7 +1248,7 @@ static void Cmd_attackcanceler(void) GetBattlerAbility(gBattlerAttacker), abilityDef, gCurrentMove, - ABILITY_RUN_SCRIPT)) + RUN_SCRIPT)) return; if (GetMoveNonVolatileStatus(gCurrentMove) == MOVE_EFFECT_PARALYSIS) @@ -1259,7 +1259,7 @@ static void Cmd_attackcanceler(void) abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), - ABILITY_RUN_SCRIPT)) + RUN_SCRIPT)) return; } @@ -1432,7 +1432,7 @@ static void JumpIfMoveFailed(u32 adder, u32 move, u32 moveType, const u8 *failIn GetBattlerAbility(gBattlerTarget), move, moveType, - ABILITY_RUN_SCRIPT)) + RUN_SCRIPT)) return; } @@ -1464,211 +1464,6 @@ static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, return affected; } -static bool32 AccuracyCalcHelper(u32 move, u32 battler) -{ - bool32 effect = FALSE; - u32 ability = ABILITY_NONE; - enum BattleMoveEffects moveEffect = GetMoveEffect(move); - u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - - if ((gStatuses3[battler] & STATUS3_ALWAYS_HITS && gDisableStructs[battler].battlerWithSureHit == gBattlerAttacker) - || (B_TOXIC_NEVER_MISS >= GEN_6 - && nonVolatileStatus == MOVE_EFFECT_TOXIC - && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) - || gStatuses4[battler] & STATUS4_GLAIVE_RUSH) - { - effect = TRUE; - } - // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. - else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD - && !(gStatuses3[battler] & STATUS3_COMMANDER) - && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == SKY_DROP_NO_TARGET)) - { - effect = TRUE; - ability = ABILITY_NO_GUARD; - } - // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. - else if (GetBattlerAbility(battler) == ABILITY_NO_GUARD - && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battler] == SKY_DROP_NO_TARGET)) - { - effect = TRUE; - ability = ABILITY_NO_GUARD; - } - // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. - else if (gStatuses3[battler] & STATUS3_TELEKINESIS - && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && moveEffect != EFFECT_OHKO - && moveEffect != EFFECT_SHEER_COLD) - { - effect = TRUE; - } - else if (gBattleStruct->battlerState[battler].pursuitTarget) - { - effect = TRUE; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE)) - { - effect = TRUE; - } - else if ((gStatuses3[battler] & STATUS3_COMMANDER) - || (gStatuses3[battler] & STATUS3_PHANTOM_FORCE) - || ((gStatuses3[battler] & STATUS3_ON_AIR) && !(MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move))) - || ((gStatuses3[battler] & STATUS3_UNDERGROUND) && !MoveDamagesUnderground(move)) - || ((gStatuses3[battler] & STATUS3_UNDERWATER) && !MoveDamagesUnderWater(move))) - { - gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; - effect = TRUE; - } - else if (B_MINIMIZE_DMG_ACC >= GEN_6 - && (gStatuses3[battler] & STATUS3_MINIMIZED) - && MoveIncreasesPowerToMinimizedTargets(move)) - { - effect = TRUE; - } - else if (GetMoveAccuracy(move) == 0) - { - effect = TRUE; - } - - if (!effect && HasWeatherEffect()) - { - if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battler, B_WEATHER_RAIN)) - effect = TRUE; - else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) - effect = TRUE; - - if (effect) - return effect; - } - - if (ability != ABILITY_NONE) - RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); - - return effect; -} - -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) -{ - u32 calc, moveAcc; - s8 buff, accStage, evasionStage; - u32 atkParam = GetBattlerHoldEffectParam(battlerAtk); - u32 defParam = GetBattlerHoldEffectParam(battlerDef); - u32 atkAlly = BATTLE_PARTNER(battlerAtk); - u32 atkAllyAbility = GetBattlerAbility(atkAlly); - - gPotentialItemEffectBattler = battlerDef; - accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; - evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; - if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE - || (B_ILLUMINATE_EFFECT >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) - evasionStage = DEFAULT_STAT_STAGE; - if (MoveIgnoresDefenseEvasionStages(move)) - evasionStage = DEFAULT_STAT_STAGE; - if (defAbility == ABILITY_UNAWARE) - accStage = DEFAULT_STAT_STAGE; - - if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) - buff = accStage; - else - buff = accStage + DEFAULT_STAT_STAGE - evasionStage; - - if (buff < MIN_STAT_STAGE) - buff = MIN_STAT_STAGE; - if (buff > MAX_STAT_STAGE) - buff = MAX_STAT_STAGE; - - moveAcc = GetMoveAccuracy(move); - // Check Thunder and Hurricane on sunny weather. - if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) - moveAcc = 50; - // Check Wonder Skin. - if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) - moveAcc = 50; - - calc = gAccuracyStageRatios[buff].dividend * moveAcc; - calc /= gAccuracyStageRatios[buff].divisor; - - // Attacker's ability - switch (atkAbility) - { - case ABILITY_COMPOUND_EYES: - calc = (calc * 130) / 100; // 1.3 compound eyes boost - break; - case ABILITY_VICTORY_STAR: - calc = (calc * 110) / 100; // 1.1 victory star boost - break; - case ABILITY_HUSTLE: - if (IsBattleMovePhysical(move)) - calc = (calc * 80) / 100; // 1.2 hustle loss - break; - } - - // Target's ability - switch (defAbility) - { - case ABILITY_SAND_VEIL: - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) - calc = (calc * 80) / 100; // 1.2 sand veil loss - break; - case ABILITY_SNOW_CLOAK: - if (HasWeatherEffect() && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) - calc = (calc * 80) / 100; // 1.2 snow cloak loss - break; - case ABILITY_TANGLED_FEET: - if (gBattleMons[battlerDef].volatiles.confusionTurns) - calc = (calc * 50) / 100; // 1.5 tangled feet loss - break; - } - - // Attacker's ally's ability - switch (atkAllyAbility) - { - case ABILITY_VICTORY_STAR: - if (IsBattlerAlive(atkAlly)) - calc = (calc * 110) / 100; // 1.1 ally's victory star boost - break; - } - - // Attacker's hold effect - switch (atkHoldEffect) - { - case HOLD_EFFECT_WIDE_LENS: - calc = (calc * (100 + atkParam)) / 100; - break; - case HOLD_EFFECT_ZOOM_LENS: - if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) - calc = (calc * (100 + atkParam)) / 100; - break; - } - - // Target's hold effect - switch (defHoldEffect) - { - case HOLD_EFFECT_EVASION_UP: - calc = (calc * (100 - defParam)) / 100; - break; - } - - if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) - { - if (atkAbility == ABILITY_RIPEN) - calc = (calc * 140) / 100; // ripen gives 40% acc boost - else - calc = (calc * 120) / 100; // 20% acc boost - } - - if (gFieldStatuses & STATUS_FIELD_GRAVITY) - calc = (calc * 5) / 3; // 1.66 Gravity acc boost - - if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerDef) == AFFECTION_FIVE_HEARTS) - calc = (calc * 90) / 100; - - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_FOG) - calc = (calc * 60) / 100; // modified by 3/5 - - return calc; -} - static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move) { if (move == ACC_CURR_MOVE) @@ -1696,7 +1491,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u GetBattlerAbility(gBattlerTarget), gCurrentMove, GetBattleMoveType(gCurrentMove), - ABILITY_RUN_SCRIPT); + RUN_SCRIPT); } } else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT @@ -1726,10 +1521,11 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u continue; numTargets++; - if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) || AccuracyCalcHelper(move, battlerDef)) + u32 abilityDef = GetBattlerAbility(battlerDef); + if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) + || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) continue; - u32 abilityDef = GetBattlerAbility(battlerDef); u32 holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); u32 accuracy = GetTotalAccuracy(gBattlerAttacker, battlerDef, @@ -3337,7 +3133,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai GetBattlerAbility(gBattlerAttacker), battlerAbility, gBattleScripting.moveEffect, - STATUS_CHECK_TRIGGER)) + CHECK_TRIGGER)) SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect, TRIGGER_ON_MOVE); break; case MOVE_EFFECT_CONFUSION: @@ -12548,7 +12344,7 @@ static void Cmd_trynonvolatilestatus(void) GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(gBattlerTarget), GetMoveNonVolatileStatus(gCurrentMove), - STATUS_RUN_SCRIPT)) + RUN_SCRIPT)) canInflictStatus = FALSE; if (canInflictStatus && DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) @@ -13008,7 +12804,7 @@ static void Cmd_checknonvolatiletrigger(void) GetBattlerAbility(gBattlerAttacker), GetBattlerAbility(gBattlerTarget), cmd->nonVolatile, - STATUS_CHECK_TRIGGER)) + CHECK_TRIGGER)) gBattlescriptCurrInstr = cmd->failInstr; else if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) gBattlescriptCurrInstr = cmd->failInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 8664fb417d..d882f28fa4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -65,8 +65,8 @@ static void SetRandomMultiHitCounter(); static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item); static bool32 CanBeInfinitelyConfused(u32 battler); static bool32 IsAnyTargetAffected(u32 battlerAtk); -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum NonVolatileStatus option); -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonVolatileStatus option); +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option); +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent); @@ -2520,13 +2520,13 @@ static enum MoveCanceller CancellerMultiTargetMoves(void) gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; gBattleStruct->noResultString[battlerDef] = TRUE; } - else if (CanAbilityBlockMove(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER) + else if (CanAbilityBlockMove(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER) || (IsBattlerTerrainAffected(gBattlerAttacker, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(gBattlerAttacker, abilityAtk, gCurrentMove) > 0)) { gBattleStruct->moveResultFlags[battlerDef] = 0; gBattleStruct->noResultString[battlerDef] = TRUE; } - else if (CanAbilityAbsorbMove(gBattlerAttacker, battlerDef, abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), ABILITY_CHECK_TRIGGER)) + else if (CanAbilityAbsorbMove(gBattlerAttacker, battlerDef, abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; gBattleStruct->noResultString[battlerDef] = DO_ACCURACY_CHECK; @@ -2962,13 +2962,13 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum AbilityEffectOptions option) +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option) { const u8 *battleScriptBlocksMove = NULL; u32 battlerAbility = battlerDef; s32 atkPriority = 0; - if (option == ABILITY_CHECK_TRIGGER_AI) + if (option == AI_CHECK) atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); else atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); @@ -3018,7 +3018,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) { - if (option == ABILITY_RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; @@ -3031,7 +3031,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a && IsBattlerAlive(partnerDef) && !IsBattlerAlly(battlerAtk, partnerDef)) { - if (option == ABILITY_CHECK_TRIGGER_AI) + if (option == AI_CHECK) abilityDef = gAiLogicData->abilities[partnerDef]; else abilityDef = GetBattlerAbility(partnerDef); @@ -3053,7 +3053,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a if (battleScriptBlocksMove == NULL) return FALSE; - if (option == ABILITY_RUN_SCRIPT) + if (option == RUN_SCRIPT) { gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. gLastUsedAbility = abilityDef; @@ -3065,7 +3065,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a return TRUE; } -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum AbilityEffectOptions option) +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option) { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; const u8 *battleScript = NULL; @@ -3139,7 +3139,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 break; } - if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option != ABILITY_RUN_SCRIPT) + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option != RUN_SCRIPT) return effect; switch (effect) @@ -5122,7 +5122,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gLastUsedAbility, GetBattlerAbility(gBattlerAttacker), gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER)) + CHECK_TRIGGER)) { if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; @@ -5152,7 +5152,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gLastUsedAbility, GetBattlerAbility(gBattlerAttacker), gBattleStruct->synchronizeMoveEffect, - STATUS_CHECK_TRIGGER)) + CHECK_TRIGGER)) { if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; @@ -5499,24 +5499,26 @@ bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClau if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause) return FALSE; - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_SLEEP, // also covers yawn - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_SLEEP, // also covers yawn + CHECK_TRIGGER)) return TRUE; return FALSE; } bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - abilityAtk, - abilityDef, - MOVE_EFFECT_TOXIC, // also covers poison - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + abilityAtk, + abilityDef, + MOVE_EFFECT_TOXIC, // also covers poison + CHECK_TRIGGER)) return TRUE; return FALSE; } @@ -5524,36 +5526,39 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 ability // TODO: check order of battlerAtk and battlerDef bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_BURN, - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_BURN, + CHECK_TRIGGER)) return TRUE; return FALSE; } bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_PARALYSIS, - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_PARALYSIS, + CHECK_TRIGGER)) return TRUE; return FALSE; } bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_FREEZE, - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_FREEZE, + CHECK_TRIGGER)) return TRUE; return FALSE; } @@ -5561,17 +5566,18 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) // Unused, technically also redundant bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) { - if (CanSetNonVolatileStatus(battlerAtk, - battlerDef, - ABILITY_NONE, // attacker ability does not matter - abilityDef, - MOVE_EFFECT_FREEZE_OR_FROSTBITE, // also covers frostbite - STATUS_CHECK_TRIGGER)) + if (CanSetNonVolatileStatus( + battlerAtk, + battlerDef, + ABILITY_NONE, // attacker ability does not matter + abilityDef, + MOVE_EFFECT_FREEZE_OR_FROSTBITE, // also covers frostbite + CHECK_TRIGGER)) return TRUE; return FALSE; } -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects effect, enum NonVolatileStatus option) +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects effect, enum FunctionCallOption option) { const u8 *battleScript = NULL; u32 sideBattler = ABILITY_NONE; @@ -5614,7 +5620,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_NotAffected; } - else if (option == STATUS_RUN_SCRIPT // Check only important during battle execution for moves + else if (option == RUN_SCRIPT // Check only important during battle execution for moves && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityDef, TRUE) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) { @@ -5741,11 +5747,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u return TRUE; } -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum NonVolatileStatus option) +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option) { if (battleScript != NULL) { - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) { if (battleScript != BattleScript_NotAffected) gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FAILED; @@ -5766,17 +5772,17 @@ static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abi return FALSE; } -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum NonVolatileStatus option) +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option) { // Can freely sleep own partner if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(battlerAtk, battlerDef)) { - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) gBattleStruct->battlerState[battlerDef].sleepClauseEffectExempt = TRUE; return FALSE; } - if (option == STATUS_RUN_SCRIPT) + if (option == RUN_SCRIPT) gBattleStruct->battlerState[battlerDef].sleepClauseEffectExempt = FALSE; // Can't sleep if clause is active otherwise if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef))) @@ -9767,7 +9773,7 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) MulByTypeEffectiveness(&ctx, &modifier, type2); if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) - || CanAbilityAbsorbMove(0, 0, abilityDef, MOVE_NONE, moveType, ABILITY_CHECK_TRIGGER)) + || CanAbilityAbsorbMove(0, 0, abilityDef, MOVE_NONE, moveType, CHECK_TRIGGER)) modifier = UQ_4_12(0.0); return modifier; @@ -11158,8 +11164,8 @@ static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerD { u32 abilityDef = GetBattlerAbility(battlerDef); - return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER) - || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, ABILITY_CHECK_TRIGGER); + return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, CHECK_TRIGGER) + || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER); } bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) @@ -11329,11 +11335,11 @@ void UpdateStallMons(void) u32 moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); u32 abilityDef = GetBattlerAbility(gBattlerTarget); - if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER)) { gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; } - else if (CanAbilityBlockMove(gBattlerAttacker, gBattlerTarget, abilityAtk, abilityDef, gCurrentMove, ABILITY_CHECK_TRIGGER)) + else if (CanAbilityBlockMove(gBattlerAttacker, gBattlerTarget, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER)) { gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; } @@ -11521,3 +11527,212 @@ void RemoveHazardFromField(u32 side, enum Hazards hazardType) i++; } } + +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option) +{ + bool32 effect = FALSE; + u32 ability = ABILITY_NONE; + enum BattleMoveEffects moveEffect = GetMoveEffect(move); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); + + if ((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) + || (B_TOXIC_NEVER_MISS >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + || gStatuses4[battlerDef] & STATUS4_GLAIVE_RUSH) + { + effect = TRUE; + } + // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. + else if (abilityAtk == ABILITY_NO_GUARD + && !(gStatuses3[battlerDef] & STATUS3_COMMANDER) + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battlerDef] == SKY_DROP_NO_TARGET)) + { + effect = TRUE; + ability = ABILITY_NO_GUARD; + } + // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits. + else if (abilityDef == ABILITY_NO_GUARD + && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battlerDef] == SKY_DROP_NO_TARGET)) + { + effect = TRUE; + ability = ABILITY_NO_GUARD; + } + // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. + else if (gStatuses3[battlerDef] & STATUS3_TELEKINESIS + && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) + && moveEffect != EFFECT_OHKO + && moveEffect != EFFECT_SHEER_COLD) + { + effect = TRUE; + } + else if (gBattleStruct->battlerState[battlerDef].pursuitTarget) + { + effect = TRUE; + } + else if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + { + effect = TRUE; + } + else if ((gStatuses3[battlerDef] & STATUS3_COMMANDER) + || (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) + || ((gStatuses3[battlerDef] & STATUS3_ON_AIR) && !(MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move))) + || ((gStatuses3[battlerDef] & STATUS3_UNDERGROUND) && !MoveDamagesUnderground(move)) + || ((gStatuses3[battlerDef] & STATUS3_UNDERWATER) && !MoveDamagesUnderWater(move))) + { + if (option == RUN_SCRIPT) + { + gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; + effect = TRUE; + } + else + { + effect = FALSE; + } + } + else if (B_MINIMIZE_DMG_ACC >= GEN_6 + && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) + && MoveIncreasesPowerToMinimizedTargets(move)) + { + effect = TRUE; + } + else if (GetMoveAccuracy(move) == 0) + { + effect = TRUE; + } + + if (!effect && HasWeatherEffect()) + { + if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_RAIN)) + effect = TRUE; + else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) + effect = TRUE; + + if (effect) + return effect; + } + + if (ability != ABILITY_NONE && option == RUN_SCRIPT) + RecordAbilityBattle(battlerAtk, ABILITY_NO_GUARD); + + return effect; +} + +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) +{ + u32 calc, moveAcc; + s8 buff, accStage, evasionStage; + u32 atkParam = GetBattlerHoldEffectParam(battlerAtk); + u32 defParam = GetBattlerHoldEffectParam(battlerDef); + + gPotentialItemEffectBattler = battlerDef; + accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; + evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; + if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE + || (B_ILLUMINATE_EFFECT >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) + evasionStage = DEFAULT_STAT_STAGE; + if (MoveIgnoresDefenseEvasionStages(move)) + evasionStage = DEFAULT_STAT_STAGE; + if (defAbility == ABILITY_UNAWARE) + accStage = DEFAULT_STAT_STAGE; + + if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + buff = accStage; + else + buff = accStage + DEFAULT_STAT_STAGE - evasionStage; + + if (buff < MIN_STAT_STAGE) + buff = MIN_STAT_STAGE; + if (buff > MAX_STAT_STAGE) + buff = MAX_STAT_STAGE; + + moveAcc = GetMoveAccuracy(move); + // Check Thunder and Hurricane on sunny weather. + if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) + moveAcc = 50; + // Check Wonder Skin. + if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) + moveAcc = 50; + + calc = gAccuracyStageRatios[buff].dividend * moveAcc; + calc /= gAccuracyStageRatios[buff].divisor; + + // Attacker's ability + switch (atkAbility) + { + case ABILITY_COMPOUND_EYES: + calc = (calc * 130) / 100; // 1.3 compound eyes boost + break; + case ABILITY_VICTORY_STAR: + calc = (calc * 110) / 100; // 1.1 victory star boost + break; + case ABILITY_HUSTLE: + if (IsBattleMovePhysical(move)) + calc = (calc * 80) / 100; // 1.2 hustle loss + break; + } + + // Target's ability + switch (defAbility) + { + case ABILITY_SAND_VEIL: + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) + calc = (calc * 80) / 100; // 1.2 sand veil loss + break; + case ABILITY_SNOW_CLOAK: + if (HasWeatherEffect() && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + calc = (calc * 80) / 100; // 1.2 snow cloak loss + break; + case ABILITY_TANGLED_FEET: + if (gBattleMons[battlerDef].volatiles.confusionTurns) + calc = (calc * 50) / 100; // 1.5 tangled feet loss + break; + } + + // Attacker's ally's ability + u32 atkAlly = BATTLE_PARTNER(battlerAtk); + switch (GetBattlerAbility(atkAlly)) + { + case ABILITY_VICTORY_STAR: + if (IsBattlerAlive(atkAlly)) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost + break; + } + + // Attacker's hold effect + switch (atkHoldEffect) + { + case HOLD_EFFECT_WIDE_LENS: + calc = (calc * (100 + atkParam)) / 100; + break; + case HOLD_EFFECT_ZOOM_LENS: + if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) + calc = (calc * (100 + atkParam)) / 100; + break; + } + + // Target's hold effect + switch (defHoldEffect) + { + case HOLD_EFFECT_EVASION_UP: + calc = (calc * (100 - defParam)) / 100; + break; + } + + if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) + { + if (atkAbility == ABILITY_RIPEN) + calc = (calc * 140) / 100; // ripen gives 40% acc boost + else + calc = (calc * 120) / 100; // 20% acc boost + } + + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + calc = (calc * 5) / 3; // 1.66 Gravity acc boost + + if (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerDef) == AFFECTION_FIVE_HEARTS) + calc = (calc * 90) / 100; + + if (HasWeatherEffect() && gBattleWeather & B_WEATHER_FOG) + calc = (calc * 60) / 100; // modified by 3/5 + + return calc; +} From 95a02dddb9887906ce973320ed7a0cd2757b4c2d Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 9 Jul 2025 18:11:39 -0400 Subject: [PATCH 121/248] Improved logic for Guard Split and Power Split. (#7298) --- include/config/ai.h | 6 ++ src/battle_ai_main.c | 121 ++++++++++++++++++++++++++++-------- test/battle/ai/ai_doubles.c | 54 ++++++++++++++++ 3 files changed, 155 insertions(+), 26 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index 91ee3525ae..c51ff6d790 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -79,4 +79,10 @@ #define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 #define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 +// AI's desired stat changes for Guard Split and Power Split, treated as % +#define GUARD_SPLIT_ALLY_PERCENTAGE 200 +#define GUARD_SPLIT_ENEMY_PERCENTAGE 50 +#define POWER_SPLIT_ALLY_PERCENTAGE 150 +#define POWER_SPLIT_ENEMY_PERCENTAGE 50 + #endif // GUARD_CONFIG_AI_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f3976fae4a..dae2895d96 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2455,11 +2455,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_POWER_SPLIT: - if (IsTargetingPartner(battlerAtk, battlerDef)) - { - ADJUST_SCORE(-10); - } - else + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 atkAttack = gBattleMons[battlerAtk].attack; u32 defAttack = gBattleMons[battlerDef].attack; @@ -2472,11 +2468,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_GUARD_SPLIT: - if (IsTargetingPartner(battlerAtk, battlerDef)) - { - ADJUST_SCORE(-10); - } - else + if (!IsTargetingPartner(battlerAtk, battlerDef)) { u32 atkDefense = gBattleMons[battlerAtk].defense; u32 defDefense = gBattleMons[battlerDef].defense; @@ -3530,6 +3522,55 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && gBattleMons[battlerAtkPartner].hp < gBattleMons[battlerAtkPartner].maxHP / 2) RETURN_SCORE_PLUS(WEAK_EFFECT); break; + case EFFECT_SPEED_SWAP: + break; + case EFFECT_GUARD_SPLIT: + { + u32 atkDefense = gBattleMons[battlerAtk].defense; + u32 defDefense = gBattleMons[battlerDef].defense; + u32 atkSpDefense = gBattleMons[battlerAtk].spDefense; + u32 defSpDefense = gBattleMons[battlerDef].spDefense; + + // It's actually * 100 and / 2 + u32 newDefense = (atkDefense + defDefense) * 50; + u32 newSpDefense = (atkSpDefense + defSpDefense) * 50; + + // We want to massively raise our defense. + if (newDefense > atkDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > atkSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newDefense > defDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > defSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + break; + } + case EFFECT_POWER_SPLIT: + { + u32 atkAttack = gBattleMons[battlerAtk].attack; + u32 defAttack = gBattleMons[battlerDef].attack; + u32 atkSpAttack = gBattleMons[battlerAtk].spAttack; + u32 defSpAttack = gBattleMons[battlerDef].spAttack; + + // * 100 and / 2 + u32 newAttack = (atkAttack + defAttack) * 50; + u32 newSpAtk = (atkSpAttack + defSpAttack) * 50; + + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && newAttack > atkAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) && newAttack > defAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > atkSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > defSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + break; + } default: break; } // attacker move effects @@ -4721,26 +4762,54 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (gBattleMons[battlerDef].speed > gBattleMons[battlerAtk].speed) ADJUST_SCORE(DECENT_EFFECT); break; - case EFFECT_GUARD_SPLIT: - { - u32 newDefense = (gBattleMons[battlerAtk].defense + gBattleMons[battlerDef].defense) / 2; - u32 newSpDef = (gBattleMons[battlerAtk].spDefense + gBattleMons[battlerDef].spDefense) / 2; +case EFFECT_GUARD_SPLIT: + { + u32 atkDefense = gBattleMons[battlerAtk].defense; + u32 defDefense = gBattleMons[battlerDef].defense; + u32 atkSpDefense = gBattleMons[battlerAtk].spDefense; + u32 defSpDefense = gBattleMons[battlerDef].spDefense; - if ((newDefense > gBattleMons[battlerAtk].defense && newSpDef >= gBattleMons[battlerAtk].spDefense) - || (newSpDef > gBattleMons[battlerAtk].spDefense && newDefense >= gBattleMons[battlerAtk].defense)) - ADJUST_SCORE(DECENT_EFFECT); - } + // It's actually * 100 and / 2; + u32 newDefense = (atkDefense + defDefense) * 50; + u32 newSpDefense = (atkSpDefense + defSpDefense) * 50; + + // We want to massively raise our defense. + if (newDefense > atkDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense > atkSpDefense * GUARD_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + // We also want to massively lower theirs. + if (newDefense < defDefense * GUARD_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpDefense < defSpDefense * GUARD_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); break; + } case EFFECT_POWER_SPLIT: - { - u32 newAttack = (gBattleMons[battlerAtk].attack + gBattleMons[battlerDef].attack) / 2; - u32 newSpAtk = (gBattleMons[battlerAtk].spAttack + gBattleMons[battlerDef].spAttack) / 2; + { + u32 atkAttack = gBattleMons[battlerAtk].attack; + u32 defAttack = gBattleMons[battlerDef].attack; + u32 atkSpAttack = gBattleMons[battlerAtk].spAttack; + u32 defSpAttack = gBattleMons[battlerDef].spAttack; - if ((newAttack > gBattleMons[battlerAtk].attack && newSpAtk >= gBattleMons[battlerAtk].spAttack) - || (newSpAtk > gBattleMons[battlerAtk].spAttack && newAttack >= gBattleMons[battlerAtk].attack)) - ADJUST_SCORE(DECENT_EFFECT); - } - break; + // It's actually * 100 and / 2 + u32 newAttack = (atkAttack + defAttack) * 50; + u32 newSpAtk = (atkSpAttack + defSpAttack) * 50; + + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && newAttack > atkAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && newSpAtk > atkSpAttack * POWER_SPLIT_ALLY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newAttack < defAttack * POWER_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + if (newSpAtk < defSpAttack * POWER_SPLIT_ENEMY_PERCENTAGE) + ADJUST_AND_RETURN_SCORE(GOOD_EFFECT); + + ADJUST_SCORE(WORST_EFFECT); + } case EFFECT_ELECTRIC_TERRAIN: case EFFECT_MISTY_TERRAIN: if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 5edc271fff..243c6611e9 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -410,3 +410,57 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha } } +AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") +{ + + u32 player, opponent; + + PARAMETRIZE { player = SPECIES_SHUCKLE; opponent = SPECIES_PHEROMOSA; } + PARAMETRIZE { player = SPECIES_PHEROMOSA; opponent = SPECIES_SHUCKLE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseDefense < gSpeciesInfo[SPECIES_WOBBUFFET].baseDefense); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseDefense < gSpeciesInfo[SPECIES_SHUCKLE].baseDefense); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseSpDefense < gSpeciesInfo[SPECIES_WOBBUFFET].baseSpDefense); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpDefense < gSpeciesInfo[SPECIES_SHUCKLE].baseSpDefense); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(player); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GUARD_SPLIT, MOVE_NIGHT_SHADE); } + OPPONENT(opponent); + } WHEN { + if (player == SPECIES_SHUCKLE) + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUARD_SPLIT, target:playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUARD_SPLIT, target:opponentRight); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Power Split to improve its stats") +{ + + u32 player, opponent; + + PARAMETRIZE { player = SPECIES_SHUCKLE; opponent = SPECIES_PHEROMOSA; } + PARAMETRIZE { player = SPECIES_PHEROMOSA; opponent = SPECIES_SHUCKLE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseAttack > gSpeciesInfo[SPECIES_WOBBUFFET].baseAttack); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseAttack > gSpeciesInfo[SPECIES_SHUCKLE].baseAttack); + ASSUME(gSpeciesInfo[SPECIES_PHEROMOSA].baseSpAttack > gSpeciesInfo[SPECIES_WOBBUFFET].baseSpAttack); + ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpAttack > gSpeciesInfo[SPECIES_SHUCKLE].baseSpAttack); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(player); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POWER_SPLIT, MOVE_TACKLE, MOVE_ROUND); } + OPPONENT(opponent) { Moves(MOVE_TACKLE, MOVE_ROUND); } + } WHEN { + if (player == SPECIES_PHEROMOSA) + TURN { EXPECT_MOVE(opponentLeft, MOVE_POWER_SPLIT, target:playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_POWER_SPLIT, target:opponentRight); } + } +} + From 0d09e5cce81ed9dd51f3018a72f230685d83cd0d Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Fri, 11 Jul 2025 00:09:52 +0700 Subject: [PATCH 122/248] battle_interface: overhaul ability pop up (#7227) --- data/battle_scripts_1.s | 11 +- graphics/battle_interface/ability_pop_up.png | Bin 284 -> 234 bytes graphics_file_rules.mk | 3 + include/sprite.h | 1 + src/battle_interface.c | 581 ++++++++----------- src/battle_script_commands.c | 5 +- src/sprite.c | 1 - 7 files changed, 269 insertions(+), 333 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3bec1be182..f7d988026d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7153,7 +7153,7 @@ BattleScript_AbilityPopUp:: tryactivateabilityshield BS_ABILITY_BATTLER .if B_ABILITY_POP_UP == TRUE showabilitypopup BS_ABILITY_BATTLER - pause 40 + pause B_WAIT_TIME_SHORT .endif recordability BS_ABILITY_BATTLER sethword sABILITY_OVERWRITE, 0 @@ -7166,13 +7166,13 @@ BattleScript_AbilityPopUpScripting: BattleScript_AbilityPopUpOverwriteThenNormal: setbyte sFIXED_ABILITY_POPUP, TRUE showabilitypopup BS_ABILITY_BATTLER - pause 60 + pause B_WAIT_TIME_SHORT sethword sABILITY_OVERWRITE, 0 updateabilitypopup BS_ABILITY_BATTLER - pause 20 + pause B_WAIT_TIME_SHORT recordability BS_ABILITY_BATTLER destroyabilitypopup - pause 40 + setbyte sFIXED_ABILITY_POPUP, FALSE return BattleScript_SpeedBoostActivates:: @@ -7401,7 +7401,6 @@ BattleScript_TryIntimidateHoldEffectsRet: BattleScript_IntimidateActivates:: savetarget call BattleScript_AbilityPopUp - destroyabilitypopup setbyte gBattlerTarget, 0 BattleScript_IntimidateLoop: jumpiftargetally BattleScript_IntimidateLoopIncrement @@ -7964,8 +7963,8 @@ BattleScript_CursedBodyActivates:: BattleScript_MummyActivates:: .if B_ABILITY_POP_UP == TRUE - call BattleScript_AbilityPopUpTarget setbyte sFIXED_ABILITY_POPUP, TRUE + call BattleScript_AbilityPopUpTarget copybyte gBattlerAbility, gBattlerAttacker copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png index ede0a7b5d7e3efd42ad54dff69f5b28e891b1d56..fa0f09dba38e527f29092bcc76e8b00f69b175b1 100644 GIT binary patch delta 206 zcmbQk^omijGr-TCmrII^fq{Y7)59eQNH+kn0tYjYeEX+Ce4?IOeRgrNmlH_p+O=~n zJv~51F!PezK&sT!#W5tJ_3d;+z6Jvx=Ghjl|NqbUz`)bJ`N3@MpRW`rUC&ZldgPJI zq9qO5Ebqjfe$^+iMeaOW!lKRa>d#(BEeVZ=@Cl+-jT;(Rbq=tyEnqs%5b{9g0FxL{ z;D_p!=a;=XUg#UDe9%#tue$!S%bwHw)*63K*E^JAx!)kiH5cdt22WQ%mvv4FO#oR^ BO#}b{ delta 256 zcmaFGIEP8EGr-TCmrII^fq{Y7)59eQNIQTq2Q!eIyS?!ZkYX$ja(7}_cTVQzL`AiF zpa2?ZoIm>tP-vE?i(^Pc>)Wdb`5F{>m@o7;{rfL(ebHF;O82gNm60WpXO-fvU7o*q zo%+4Si+&WH@zVA6;9+=L8_aIO=>I^tVG4tpCgYnRA&&=aW`Yb`La${l74N=~9lkZS zE&hah!$bQ+EQVGyJU1#WIP@dKy*%52S+y5 nRAc5*_(~E2yZ_pg`wW diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 75460992f8..2b9cb9df8b 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -340,6 +340,9 @@ $(UNUSEDGFXDIR)/color_frames.4bpp: %.4bpp: %.png $(BATINTGFXDIR)/unused_window2bar.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 5 -Wnum_tiles +$(BATINTGFXDIR)/ability_pop_up.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 8 -mheight 4 + $(JPCONTESTGFXDIR)/composite_1.4bpp: $(JPCONTESTGFXDIR)/frame_1.4bpp \ $(JPCONTESTGFXDIR)/floor.4bpp \ $(JPCONTESTGFXDIR)/frame_2.4bpp \ diff --git a/include/sprite.h b/include/sprite.h index 5b5fd5e62f..7919075053 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -324,5 +324,6 @@ void ResetAffineAnimData(void); u32 GetSpanPerImage(u32 shape, u32 size); void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); +u8 IndexOfSpriteTileTag(u16 tag); #endif //GUARD_SPRITE_H diff --git a/src/battle_interface.c b/src/battle_interface.c index f26a7af98f..2aee6460cb 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2410,30 +2410,69 @@ static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 wi CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); } -#define ABILITY_POP_UP_TAG 0xD720 +#define ABILITY_POP_UP_POS_X_DIFF 64 +#define ABILITY_POP_UP_POS_X_SLIDE 128 +#define ABILITY_POP_UP_POS_X_SPEED 4 -// for sprite -#define tOriginalX data[0] -#define tHide data[1] -#define tFrames data[2] -#define tRightToLeft data[3] -#define tBattlerId data[4] -#define tIsMain data[5] +#define ABILITY_POP_UP_WIN_WIDTH 10 +#define ABILITY_POP_UP_STR_WIDTH (ABILITY_POP_UP_WIN_WIDTH * 8) -// for task -#define tSpriteId1 data[6] -#define tSpriteId2 data[7] +#define ABILITY_POP_UP_PLAYER_LEFT_WIN_W 6 +#define ABILITY_POP_UP_PLAYER_RIGHT_WIN_W 4 +#define ABILITY_POP_UP_OPPONENT_LEFT_WIN_W 7 +#define ABILITY_POP_UP_OPPONENT_RIGHT_WIN_W 3 -static const u8 ALIGNED(4) sAbilityPopUpGfx[] = INCBIN_U8("graphics/battle_interface/ability_pop_up.4bpp"); +#define ABILITY_POP_UP_WAIT_FRAMES 48 + +/* + * BG = BackGround + * FG = ForeGround + * SH = SHadow + */ +#define ABILITY_POP_UP_BATTLER_BG_TXTCLR 2 +#define ABILITY_POP_UP_BATTLER_FG_TXTCLR 7 +#define ABILITY_POP_UP_BATTLER_SH_TXTCLR 1 + +#define ABILITY_POP_UP_ABILITY_BG_TXTCLR 7 +#define ABILITY_POP_UP_ABILITY_FG_TXTCLR 9 +#define ABILITY_POP_UP_ABILITY_SH_TXTCLR 1 + +#define sState data[0] +#define sAutoDestroy data[1] +#define sTimer data[2] +#define sIsPlayerSide data[3] +#define sBattlerId data[4] +#define sIsMain data[5] + +enum +{ + APU_STATE_SLIDE_IN = 0, + APU_STATE_IDLE, + APU_STATE_SLIDE_OUT, + APU_STATE_END +}; + +enum +{ + TAG_ABILITY_POP_UP = 0xD720, // Only used for the SpritePalette, the rest below is for the SpriteSheets. + TAG_ABILITY_POP_UP_PLAYER1 = TAG_ABILITY_POP_UP, + TAG_ABILITY_POP_UP_OPPONENT1, + TAG_ABILITY_POP_UP_PLAYER2, + TAG_ABILITY_POP_UP_OPPONENT2, + TAG_LAST_BALL_WINDOW, +}; + +static const u32 sAbilityPopUpGfx[] = INCBIN_U32("graphics/battle_interface/ability_pop_up.4bpp"); static const u16 sAbilityPopUpPalette[] = INCBIN_U16("graphics/battle_interface/ability_pop_up.gbapal"); static const struct SpriteSheet sSpriteSheet_AbilityPopUp = { - sAbilityPopUpGfx, sizeof(sAbilityPopUpGfx), ABILITY_POP_UP_TAG + sAbilityPopUpGfx, sizeof(sAbilityPopUpGfx), TAG_ABILITY_POP_UP }; + static const struct SpritePalette sSpritePalette_AbilityPopUp = { - sAbilityPopUpPalette, ABILITY_POP_UP_TAG + sAbilityPopUpPalette, TAG_ABILITY_POP_UP }; static const struct OamData sOamData_AbilityPopUp = @@ -2447,8 +2486,8 @@ static const struct OamData sOamData_AbilityPopUp = static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp = { - .tileTag = ABILITY_POP_UP_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .tileTag = TAG_NONE, // Changed on the fly. + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_AbilityPopUp, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2456,279 +2495,153 @@ static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp = .callback = SpriteCb_AbilityPopUp }; -#define ABILITY_POP_UP_POS_X_DIFF (64 - 7) // Hide second sprite underneath to gain proper letter spacing -#define ABILITY_POP_UP_POS_X_SLIDE 68 - static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] = { - {29, 80}, // player left - {186, 19}, // opponent left - {29, 97}, // player right - {186, 36}, // opponent right + { 24, 80}, // Player left + {178, 19}, // Opponent left + { 24, 97}, // Player right + {178, 36}, // Opponent right }; static const s16 sAbilityPopUpCoordsSingles[MAX_BATTLERS_COUNT][2] = { - {29, 97}, // player - {186, 57}, // opponent + { 24, 97}, // Player + {178, 57}, // Opponent }; -#define POPUP_WINDOW_WIDTH 8 -#define MAX_POPUP_STRING_WIDTH (POPUP_WINDOW_WIDTH * 8) - -static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 color1, u32 color2, u32 color3, u32 *windowId) +static u8 *AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 bgColor, u32 fgColor, u32 shadowColor, u32 *windowId) { u32 fontId; - u8 color[3] = {color1, color2, color3}; + u8 color[3] = {bgColor, fgColor, shadowColor}; struct WindowTemplate winTemplate = {0}; - winTemplate.width = POPUP_WINDOW_WIDTH; + winTemplate.width = ABILITY_POP_UP_WIN_WIDTH; winTemplate.height = 2; *windowId = AddWindow(&winTemplate); - FillWindowPixelBuffer(*windowId, PIXEL_FILL(color1)); + FillWindowPixelBuffer(*windowId, PIXEL_FILL(bgColor)); - fontId = GetFontIdToFit(str, FONT_SMALL, 0, 76); + fontId = GetFontIdToFit(str, FONT_SMALL, 0, ABILITY_POP_UP_STR_WIDTH); AddTextPrinterParameterized4(*windowId, fontId, x, y, 0, 0, color, TEXT_SKIP_DRAW, str); + return (u8 *)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA)); } -static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 xTileAmount, bool32 arg3) +static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 windowWidth, bool32 printNickname) { - CpuCopy32(windowTileData + 256, dest + 256, xTileAmount * 32); - if (xTileAmount > 0) + #define PIXELS(n) (n * 4) + if (windowWidth > 0) { do { - if (arg3) - CpuCopy32(windowTileData + 16, dest + 16, 16); + if (printNickname) + { + CpuCopy32(windowTileData + PIXELS(3), dest + PIXELS(3), PIXELS(5)); + CpuCopy32(windowTileData + TILE_OFFSET_4BPP(ABILITY_POP_UP_WIN_WIDTH), dest + TILE_OFFSET_4BPP(8), PIXELS(5)); + } else - CpuCopy32(windowTileData + 20, dest + 20, 12); - dest += 32, windowTileData += 32; - xTileAmount--; - } while (xTileAmount != 0); + { + CpuCopy32(windowTileData + PIXELS(7), dest + PIXELS(7), PIXELS(1)); + CpuCopy32(windowTileData + TILE_OFFSET_4BPP(ABILITY_POP_UP_WIN_WIDTH), dest + TILE_OFFSET_4BPP(8), TILE_SIZE_4BPP); + } + + dest += TILE_SIZE_4BPP, windowTileData += TILE_SIZE_4BPP; + windowWidth--; + } while (windowWidth != 0); } + #undef PIXELS } -static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x1, u32 x2, u32 y, u32 color1, u32 color2, u32 color3) +static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x, u32 y, u32 bgColor, u32 fgColor, u32 shadowColor, u32 printNickname, u32 battler) { - u32 windowId; - u8 *windowTileData; - u16 width; + u32 windowId, fontId; + u8 *windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x, y, bgColor, fgColor, shadowColor, &windowId); + u32 size1 = ABILITY_POP_UP_OPPONENT_LEFT_WIN_W, size2 = ABILITY_POP_UP_OPPONENT_RIGHT_WIN_W; - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x1, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); - RemoveWindow(windowId); - - width = GetStringWidth(FONT_SMALL, str, 0); - - if (width > MAX_POPUP_STRING_WIDTH - 5) + spriteTileData1 += TILE_OFFSET_4BPP(1); + if (IsOnPlayerSide(battler)) { - windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(str, x2 - MAX_POPUP_STRING_WIDTH, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0)); - RemoveWindow(windowId); + size1 = ABILITY_POP_UP_PLAYER_LEFT_WIN_W, size2 = ABILITY_POP_UP_PLAYER_RIGHT_WIN_W; + // Increment again as the *first* column of the sprite + // is not shown for player's pop up when sliding in. + spriteTileData1 += TILE_OFFSET_4BPP(1); } -} -static const u8 sText_Spaces20[]= _(" "); -static void ClearAbilityName(u8 spriteId1, u8 spriteId2) -{ - PrintOnAbilityPopUp(sText_Spaces20, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, - 5, 12, - 4, - 7, 9, 1); + TextIntoAbilityPopUp(spriteTileData1, windowTileData, size1, printNickname); + fontId = GetFontIdToFit(str, FONT_SMALL, 0, ABILITY_POP_UP_STR_WIDTH); + if (GetStringWidth(fontId, str, 0) > (size1 * 8)) + { + windowTileData += TILE_OFFSET_4BPP(size1); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, size2, printNickname); + } + + RemoveWindow(windowId); } static void PrintBattlerOnAbilityPopUp(u8 battler, u8 spriteId1, u8 spriteId2) { - int i; - u8 lastChar; - u8* textPtr; - u8 monName[POKEMON_NAME_LENGTH + 3] = {0}; + u32 totalChar = 0, lastChar; struct Pokemon *illusionMon = GetIllusionMonPtr(battler); - u8 nick[POKEMON_NAME_LENGTH + 1] = {0}; if (illusionMon != NULL) - GetMonData(illusionMon, MON_DATA_NICKNAME, nick); + GetMonData(illusionMon, MON_DATA_NICKNAME, gStringVar1); else - GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, nick); + GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, gStringVar1); - for (i = 0; i < POKEMON_NAME_LENGTH; ++i) - { - if (nick[i] == EOS) // End of string - break; + while (gStringVar1[totalChar] != EOS) + totalChar++; - monName[i] = nick[i]; - } - - textPtr = monName + i; - - lastChar = *(textPtr - 1); - - // Make the string say "[NAME]'s" instead of "[NAME]" - textPtr[0] = CHAR_SGL_QUOTE_RIGHT; // apostraphe - textPtr++; + lastChar = gStringVar1[totalChar - 1]; + StringAppend(gStringVar1, COMPOUND_STRING("'")); if (lastChar != CHAR_S && lastChar != CHAR_s) - { - textPtr[0] = CHAR_s; - textPtr++; - } + StringAppend(gStringVar1, COMPOUND_STRING("s")); - textPtr[0] = EOS; - - PrintOnAbilityPopUp((const u8 *)monName, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32), - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32), - 5, 12, - 0, - 2, 7, 1); + PrintOnAbilityPopUp(gStringVar1, + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum), + 0, 0, + ABILITY_POP_UP_BATTLER_BG_TXTCLR, ABILITY_POP_UP_BATTLER_FG_TXTCLR, ABILITY_POP_UP_BATTLER_SH_TXTCLR, + TRUE, gSprites[spriteId1].sBattlerId); } static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) { - ClearAbilityName(spriteId1, spriteId2); + PrintOnAbilityPopUp(COMPOUND_STRING(" "), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum) + TILE_OFFSET_4BPP(8), + 0, 4, + ABILITY_POP_UP_ABILITY_BG_TXTCLR, ABILITY_POP_UP_ABILITY_FG_TXTCLR, ABILITY_POP_UP_ABILITY_SH_TXTCLR, + FALSE, gSprites[spriteId1].sBattlerId); PrintOnAbilityPopUp(gAbilitiesInfo[ability].name, - (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, - (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, - 5, 12, - 4, - 7, 9, 1); -} - -#define PIXEL_COORDS_TO_OFFSET(x, y)( \ -/*Add tiles by X*/ \ -((y / 8) * 32 * 8) \ -/*Add tiles by X*/ \ -+ ((x / 8) * 32) \ -/*Add pixels by Y*/ \ -+ ((((y) - ((y / 8) * 8))) * 4) \ -/*Add pixels by X*/ \ -+ ((((x) - ((x / 8) * 8)) / 2))) - -static const u16 sOverwrittenPixelsTable[][2] = -{ - {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, - {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, - - {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, - - {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, - {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, - - {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, - {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, - -//Second Row Of Image - {PIXEL_COORDS_TO_OFFSET(0, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(0, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(8, 47), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 45), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 46), 8}, - {PIXEL_COORDS_TO_OFFSET(16, 47), 8}, -}; - -static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount) -{ - u32 i = 0; - - if (pixelCount & 1) - { - while (pixelCount != 0) - { - dest[i] &= ~(0xF); - dest[i] |= (src[i] & 0xF); - if (--pixelCount != 0) - { - dest[i] &= ~(0xF0); - dest[i] |= (src[i] & 0xF0); - pixelCount--; - } - i++; - } - } - else - { - for (i = 0; i < pixelCount / 2; i++) - dest[i] = src[i]; - } -} - -static void RestoreOverwrittenPixels(u8 *tiles) -{ - u32 i; - u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); - - CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); - - for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) - { - CopyPixels(buffer + sOverwrittenPixelsTable[i][0], - sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], - sOverwrittenPixelsTable[i][1]); - } - - CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); - Free(buffer); + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8), + (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId2].oam.tileNum) + TILE_OFFSET_4BPP(8), + 0, 4, + ABILITY_POP_UP_ABILITY_BG_TXTCLR, ABILITY_POP_UP_ABILITY_FG_TXTCLR, ABILITY_POP_UP_ABILITY_SH_TXTCLR, + FALSE, gSprites[spriteId1].sBattlerId); } static inline bool32 IsAnyAbilityPopUpActive(void) { + u32 activeAbilityPopUps = 0; for (u32 battler = 0; battler < gBattlersCount; battler++) { if (gBattleStruct->battlerState[battler].activeAbilityPopUps) - return TRUE; + activeAbilityPopUps++; } - return FALSE; + return activeAbilityPopUps; } void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) { + u8 *spriteIds; + u32 xSlide, tileTag, battlerPosition = GetBattlerPosition(battler); + struct SpriteTemplate template; const s16 (*coords)[2]; - u8 spriteId1, spriteId2, battlerPosition, taskId; - if (B_ABILITY_POP_UP == FALSE) + if (!B_ABILITY_POP_UP) return; - if (gBattleScripting.abilityPopupOverwrite != 0) + if (gBattleScripting.abilityPopupOverwrite) ability = gBattleScripting.abilityPopupOverwrite; if (gTestRunnerEnabled) @@ -2739,111 +2652,122 @@ void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) } if (!IsAnyAbilityPopUpActive()) - { - LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); LoadSpritePalette(&sSpritePalette_AbilityPopUp); + + tileTag = (TAG_ABILITY_POP_UP_PLAYER1 + battler); + if (IndexOfSpriteTileTag(tileTag) == 0xFF) + { + struct SpriteSheet sheet = sSpriteSheet_AbilityPopUp; + sheet.tag = tileTag; + LoadSpriteSheet(&sheet); } + coords = isDoubleBattle ? sAbilityPopUpCoordsDoubles : sAbilityPopUpCoordsSingles; + xSlide = IsOnPlayerSide(battler) ? -ABILITY_POP_UP_POS_X_SLIDE : ABILITY_POP_UP_POS_X_SLIDE; + + template = sSpriteTemplate_AbilityPopUp; + template.tileTag = tileTag; + spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler]; + spriteIds[0] = CreateSprite(&template, coords[battlerPosition][0] + xSlide, + coords[battlerPosition][1], 0); + spriteIds[1] = CreateSprite(&template, coords[battlerPosition][0] + xSlide + ABILITY_POP_UP_POS_X_DIFF, + coords[battlerPosition][1], 0); + + if (IsOnPlayerSide(battler)) + { + gSprites[spriteIds[0]].sIsPlayerSide = TRUE; + gSprites[spriteIds[1]].sIsPlayerSide = TRUE; + } + + gSprites[spriteIds[1]].oam.tileNum += 32; // Second half of the pop up tiles. + + // Create only one instance, as it's only used for + // tracking the SpriteSheet(s) and SpritePalette. + if (!IsAnyAbilityPopUpActive()) + CreateTask(Task_FreeAbilityPopUpGfx, 5); + gBattleStruct->battlerState[battler].activeAbilityPopUps = TRUE; - battlerPosition = GetBattlerPosition(battler); - if (isDoubleBattle) - coords = sAbilityPopUpCoordsDoubles; - else - coords = sAbilityPopUpCoordsSingles; + gSprites[spriteIds[0]].sIsMain = TRUE; + gSprites[spriteIds[0]].sBattlerId = battler; + gSprites[spriteIds[1]].sBattlerId = battler; - if ((battlerPosition & BIT_SIDE) == B_SIDE_PLAYER) - { - spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE, - coords[battlerPosition][1], 0); - spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, - coords[battlerPosition][1], 1); //Appears below - - gSprites[spriteId1].tRightToLeft = TRUE; - gSprites[spriteId2].tRightToLeft = TRUE; - } - else - { - spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE, - coords[battlerPosition][1], 0); - spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp, - coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, - coords[battlerPosition][1], 1); //Appears below - - gSprites[spriteId1].tRightToLeft = FALSE; - gSprites[spriteId2].tRightToLeft = FALSE; - } - - gSprites[spriteId1].tOriginalX = coords[battlerPosition][0]; - gSprites[spriteId2].tOriginalX = coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_DIFF; - gSprites[spriteId2].oam.tileNum += (8 * 4); //Second half of pop up - - gBattleStruct->abilityPopUpSpriteIds[battler][0] = spriteId1; - gBattleStruct->abilityPopUpSpriteIds[battler][1] = spriteId2; - - taskId = CreateTask(Task_FreeAbilityPopUpGfx, 5); - gTasks[taskId].tSpriteId1 = spriteId1; - gTasks[taskId].tSpriteId2 = spriteId2; - - gSprites[spriteId1].tIsMain = TRUE; - gSprites[spriteId1].tBattlerId = battler; - gSprites[spriteId2].tBattlerId = battler; - - StartSpriteAnim(&gSprites[spriteId1], 0); - StartSpriteAnim(&gSprites[spriteId2], 0); - - PrintBattlerOnAbilityPopUp(battler, spriteId1, spriteId2); - PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); - RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); + PrintBattlerOnAbilityPopUp(battler, spriteIds[0], spriteIds[1]); + PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]); } void UpdateAbilityPopup(u8 battler) { - u8 spriteId1 = gBattleStruct->abilityPopUpSpriteIds[battler][0]; - u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battler][1]; - u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battler].ability; - - PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); - RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); + u8 *spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler]; + u16 ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite + : gBattleMons[battler].ability; + PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]); } -#define FRAMES_TO_WAIT 48 - static void SpriteCb_AbilityPopUp(struct Sprite *sprite) { - if (!sprite->tHide) // Show + s16 *data = sprite->data; + u32 battlerPosition = GetBattlerPosition(sBattlerId); + u32 fullX = sprite->x + sprite->x2; + u32 speed; + + switch (sState) { - if (sprite->tIsMain && ++sprite->tFrames == 4) + case APU_STATE_SLIDE_IN: + { + const s16 (*coords)[2] = IsDoubleBattle() ? sAbilityPopUpCoordsDoubles : sAbilityPopUpCoordsSingles; + u32 xCoord = coords[battlerPosition][0]; + + if (sIsMain && ++sTimer == 4) PlaySE(SE_BALL_TRAY_ENTER); - if ((!sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX) - || (sprite->tRightToLeft && (sprite->x += 4) >= sprite->tOriginalX) - ) - { - sprite->x = sprite->tOriginalX; - sprite->tHide = TRUE; - sprite->tFrames = FRAMES_TO_WAIT; - } + + if (!sIsMain) + xCoord += ABILITY_POP_UP_POS_X_DIFF; + + if (fullX == xCoord) + { + sTimer = ABILITY_POP_UP_WAIT_FRAMES; + sState = APU_STATE_IDLE; + break; + } + + speed = sIsPlayerSide ? ABILITY_POP_UP_POS_X_SPEED : -ABILITY_POP_UP_POS_X_SPEED; + sprite->x2 += speed; + break; } - else // Hide + case APU_STATE_IDLE: { - if (sprite->tFrames == 0) + if (!sTimer || sAutoDestroy) { - if ((!sprite->tRightToLeft && (sprite->x += 4) >= sprite->tOriginalX + ABILITY_POP_UP_POS_X_SLIDE) - ||(sprite->tRightToLeft && (sprite->x -= 4) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) - ) - { - gBattleStruct->battlerState[sprite->tBattlerId].activeAbilityPopUps = FALSE; - DestroySprite(sprite); - } - } - else - { - if (!gBattleScripting.fixedPopup) - sprite->tFrames--; + sState = APU_STATE_SLIDE_OUT; + break; } + + if (!gBattleScripting.fixedPopup) + sTimer--; + + break; + } + case APU_STATE_SLIDE_OUT: + { + if (fullX == sprite->x) + { + sState = APU_STATE_END; + break; + } + + speed = sIsPlayerSide ? -ABILITY_POP_UP_POS_X_SPEED : ABILITY_POP_UP_POS_X_SPEED; + sprite->x2 += speed; + break; + } + case APU_STATE_END: + { + if (sIsMain) + gBattleStruct->battlerState[sBattlerId].activeAbilityPopUps = FALSE; + + DestroySprite(sprite); + break; + } } } @@ -2851,26 +2775,33 @@ void DestroyAbilityPopUp(u8 battler) { if (gBattleStruct->battlerState[battler].activeAbilityPopUps) { - gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][0]].tFrames = 0; - gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][1]].tFrames = 0; + gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][0]].sAutoDestroy = TRUE; + gSprites[gBattleStruct->abilityPopUpSpriteIds[battler][1]].sAutoDestroy = TRUE; } - gBattleScripting.fixedPopup = FALSE; } static void Task_FreeAbilityPopUpGfx(u8 taskId) { - if (!gSprites[gTasks[taskId].tSpriteId1].inUse - && !gSprites[gTasks[taskId].tSpriteId2].inUse - && !IsAnyAbilityPopUpActive()) + if (!IsAnyAbilityPopUpActive()) { - FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (IndexOfSpriteTileTag(TAG_ABILITY_POP_UP_PLAYER1 + battler) != 0xFF) + FreeSpriteTilesByTag(TAG_ABILITY_POP_UP_PLAYER1 + battler); + } + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroyTask(taskId); } } +#undef sState +#undef sAutoDestroy +#undef sTimer +#undef sIsPlayerSide +#undef sBattlerId +#undef sIsMain + // last used ball -#define LAST_BALL_WINDOW_TAG 0xD721 static const struct OamData sOamData_LastUsedBall = { @@ -2891,8 +2822,8 @@ static const struct OamData sOamData_LastUsedBall = static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow = { - .tileTag = LAST_BALL_WINDOW_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .tileTag = TAG_LAST_BALL_WINDOW, + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_LastUsedBall, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2922,7 +2853,7 @@ static const struct OamData sOamData_MoveInfoWindow = static const struct SpriteTemplate sSpriteTemplate_MoveInfoWindow = { .tileTag = MOVE_INFO_WINDOW_TAG, - .paletteTag = ABILITY_POP_UP_TAG, + .paletteTag = TAG_ABILITY_POP_UP, .oam = &sOamData_MoveInfoWindow, .anims = gDummySpriteAnimTable, .images = NULL, @@ -2941,7 +2872,7 @@ static const struct SpriteTemplate sSpriteTemplate_MoveInfoWindow = #endif static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow = { - sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), LAST_BALL_WINDOW_TAG + sLastUsedBallWindowGfx, sizeof(sLastUsedBallWindowGfx), TAG_LAST_BALL_WINDOW }; #if B_MOVE_DESCRIPTION_BUTTON == R_BUTTON @@ -3020,7 +2951,7 @@ void TryAddLastUsedBallItemSprites(void) // window LoadSpritePalette(&sSpritePalette_AbilityPopUp); - if (GetSpriteTileStartByTag(LAST_BALL_WINDOW_TAG) == 0xFFFF) + if (GetSpriteTileStartByTag(TAG_LAST_BALL_WINDOW) == 0xFFFF) LoadSpriteSheet(&sSpriteSheet_LastUsedBallWindow); if (gBattleStruct->ballSpriteIds[1] == MAX_SPRITES) @@ -3038,8 +2969,8 @@ void TryAddLastUsedBallItemSprites(void) static void DestroyLastUsedBallWinGfx(struct Sprite *sprite) { - FreeSpriteTilesByTag(LAST_BALL_WINDOW_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + FreeSpriteTilesByTag(TAG_LAST_BALL_WINDOW); + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroySprite(sprite); gBattleStruct->ballSpriteIds[1] = MAX_SPRITES; } @@ -3076,7 +3007,7 @@ void TryToHideMoveInfoWindow(void) static void DestroyMoveInfoWinGfx(struct Sprite *sprite) { FreeSpriteTilesByTag(MOVE_INFO_WINDOW_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + FreeSpritePaletteByTag(TAG_ABILITY_POP_UP); DestroySprite(sprite); gBattleStruct->moveInfoSpriteId = MAX_SPRITES; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f148129b2d..c0842af259 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10795,7 +10795,10 @@ static void Cmd_various(void) case VARIOUS_DESTROY_ABILITY_POPUP: { VARIOUS_ARGS(); - DestroyAbilityPopUp(battler); + for (u32 i = 0; i < gBattlersCount; i++) + { + DestroyAbilityPopUp(i); + } break; } case VARIOUS_TOTEM_BOOST: diff --git a/src/sprite.c b/src/sprite.c index 225c181f42..1b89a50be1 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -85,7 +85,6 @@ static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct Aff static s16 ConvertScaleParam(s16 scale); static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static u8 IndexOfSpriteTileTag(u16 tag); static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); static void UpdateSpriteMatrixAnchorPos(struct Sprite *, s32, s32); From 419219bb3102a54b3db85b9787f5cc98e6e8a2e5 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 10 Jul 2025 13:58:31 -0400 Subject: [PATCH 123/248] Add AI_FLAG_ASSUME_STAB (#6797) --- docs/tutorials/ai_flags.md | 3 ++ include/battle_ai_util.h | 1 + include/config/ai.h | 13 +++-- include/constants/battle_ai.h | 3 +- include/pokemon.h | 1 + src/battle_ai_main.c | 14 ++++++ src/battle_ai_switch_items.c | 6 ++- src/battle_ai_util.c | 13 ++++- src/pokemon.c | 8 ++++ test/battle/ai/ai_assume_stab.c | 85 +++++++++++++++++++++++++++++++++ test/battle/ai/ai_flag_risky.c | 2 +- test/battle/ai/ai_switching.c | 6 +-- 12 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 test/battle/ai/ai_assume_stab.c diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index af3d3c0718..7910049fbe 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -144,6 +144,9 @@ Marks the last two Pokémon in the party as Ace Pokémon, with the same behaviou ## `AI_FLAG_OMNISCIENT` AI has full knowledge of player moves, abilities, and hold items, and can use this knowledge when making decisions. +## `AI_FLAG_ASSUME_STAB` +A significantly more restricted version of `AI_FLAG_OMNISCIENT`, the AI only knows the player's STAB moves, as their existence would be reasonable to assume in almost any case. + ## `AI_FLAG_SMART_MON_CHOICES` Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled. diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 991584a534..b0ad69f5d9 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -60,6 +60,7 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); bool32 IsAiBattlerAware(u32 battlerId); +bool32 IsAiBattlerAssumingStab(void); void ClearBattlerMoveHistory(u32 battlerId); void RecordLastUsedMoveBy(u32 battlerId, u32 move); void RecordAllMoves(u32 battler); diff --git a/include/config/ai.h b/include/config/ai.h index c51ff6d790..57fc7ecb60 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -69,10 +69,15 @@ #define AI_CONSERVE_TERA_CHANCE_PER_MON 10 // Chance for AI with smart tera flag to decide not to tera before considering defensive benefit is this*(X-1), where X is the number of alive pokemon that could tera #define AI_TERA_PREDICT_CHANCE 40 // Chance for AI with smart tera flag to tera in the situation where tera would save it from a KO, but could be punished by a KO from a different move. -// AI PP Stall detection chance per roll -#define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 -// Score reduction if any roll for PP stall detection passes -#define PP_STALL_SCORE_REDUCTION 20 +// AI_FLAG_PP_STALL_PREVENTION settings +#define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 // Detection chance per roll +#define PP_STALL_SCORE_REDUCTION 20 // Score reduction if any roll for PP stall detection passes + +// AI_FLAG_ASSUME_STAB settings +#define ASSUME_STAB_SEES_ABILITY FALSE // Flag also gives omniscience for player's ability. Can use AI_FLAG_WEIGH_ABILITY_PREDICTION instead for smarter prediction without omniscience. + +// AI_FLAG_SMART_SWITCHING settings +#define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise // AI's acceptable number of hits to KO the partner via friendly fire in a double battle. #define FRIENDLY_FIRE_RISKY_THRESHOLD 2 diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 1f19d3e966..4fc13aaa1b 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -33,8 +33,9 @@ #define AI_FLAG_PP_STALL_PREVENTION (1 << 25) // AI keeps track of the player's switches where the incoming mon is immune to the chosen move #define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT #define AI_FLAG_SMART_TERA (1 << 27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). +#define AI_FLAG_ASSUME_STAB (1 << 28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. -#define AI_FLAG_COUNT 28 +#define AI_FLAG_COUNT 29 // Flags at and after 32 need different formatting, as in // #define AI_FLAG_PLACEHOLDER ((u64)1 << 32) diff --git a/include/pokemon.h b/include/pokemon.h index f6c242606f..1a6bb8c696 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -881,5 +881,6 @@ u32 GetTeraTypeFromPersonality(struct Pokemon *mon); struct Pokemon *GetSavedPlayerPartyMon(u32 index); u8 *GetSavedPlayerPartyCount(void); void SavePlayerPartyMon(u32 index, struct Pokemon *mon); +u32 IsSpeciesOfType(u32 species, u32 type); #endif // GUARD_POKEMON_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index dae2895d96..6fee14ca15 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -533,6 +533,17 @@ void Ai_UpdateFaintData(u32 battler) aiMon->isFainted = TRUE; } +void RecordMovesBasedOnStab(u32 battler) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 playerMove = gBattleMons[battler].moves[i]; + if (IsSpeciesOfType(gBattleMons[battler].species, GetMoveType(playerMove)) && GetMovePower(playerMove != 0)) + RecordKnownMove(battler, playerMove); + } +} + void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { u32 ability, holdEffect; @@ -545,6 +556,9 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) aiData->hpPercents[battler] = GetHealthPercentage(battler); aiData->moveLimitations[battler] = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); aiData->speedStats[battler] = GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); + + if (IsAiBattlerAssumingStab()) + RecordMovesBasedOnStab(battler); } #define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 393eb054bf..587b085500 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -192,6 +192,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); opposingBattler = GetBattlerAtPosition(opposingPosition); + u16 *playerMoves = GetMovesArray(opposingBattler); // Gets types of player (opposingBattler) and computer (battler) atkType1 = gBattleMons[opposingBattler].types[0]; @@ -255,7 +256,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Get max damage mon could take for (i = 0; i < MAX_MON_MOVES; i++) { - playerMove = gBattleMons[opposingBattler].moves[i]; + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); @@ -1941,11 +1942,12 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle { int i = 0; u32 playerMove; + u16 *playerMoves = GetMovesArray(opposingBattler); s32 damageTaken = 0, maxDamageTaken = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - playerMove = gBattleMons[opposingBattler].moves[i]; + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6d2fb0afce..f0defb570a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -132,6 +132,15 @@ bool32 IsAiBattlerAware(u32 battlerId) return BattlerHasAi(battlerId); } +bool32 IsAiBattlerAssumingStab() +{ + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STAB + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STAB) + return TRUE; + + return FALSE; +} + bool32 IsAiBattlerPredictingAbility(u32 battlerId) { if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION @@ -1423,8 +1432,8 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) if (gDisableStructs[battlerId].overwrittenAbility) return gDisableStructs[battlerId].overwrittenAbility; - // The AI knows its own ability. - if (IsAiBattlerAware(battlerId)) + // The AI knows its own ability, and omniscience handling + if (IsAiBattlerAware(battlerId) || (IsAiBattlerAssumingStab() && ASSUME_STAB_SEES_ABILITY)) return knownAbility; // Check neutralizing gas, gastro acid diff --git a/src/pokemon.c b/src/pokemon.c index 4a3b0bf706..91524ae97d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -7154,3 +7154,11 @@ void SavePlayerPartyMon(u32 index, struct Pokemon *mon) { gSaveBlock1Ptr->playerParty[index] = *mon; } + +u32 IsSpeciesOfType(u32 species, u32 type) +{ + if (gSpeciesInfo[species].types[0] == type + || gSpeciesInfo[species].types[1] == type) + return TRUE; + return FALSE; +} diff --git a/test/battle/ai/ai_assume_stab.c b/test/battle/ai/ai_assume_stab.c new file mode 100644 index 0000000000..6147229ae7 --- /dev/null +++ b/test/battle/ai/ai_assume_stab.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STAB sees the player's STAB moves") +{ + u32 aiFlag = 0; + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = AI_FLAG_OMNISCIENT; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiFlag); + PLAYER(SPECIES_TYPHLOSION) { Speed(5); Moves(MOVE_TACKLE, MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_TACKLE); Level(1); } + OPPONENT(SPECIES_SCIZOR) { Speed(4); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_BLISSEY) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + if (aiFlag == AI_FLAG_ASSUME_STAB || aiFlag == AI_FLAG_OMNISCIENT) + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } + else + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STAB does not see the player's non-STAB moves") +{ + u32 aiFlag = 0; + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = AI_FLAG_OMNISCIENT; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiFlag); + PLAYER(SPECIES_GOREBYSS) { Speed(5); Moves(MOVE_TACKLE, MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_TACKLE); Level(1); } + OPPONENT(SPECIES_SCIZOR) { Speed(4); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_BLISSEY) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + if (aiFlag == AI_FLAG_OMNISCIENT) + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } + else + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI correctly records assumed STAB moves") +{ + u32 aiFlag = 0; + // Not checking Omniscient here because it doesn't change the battle history + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_STAB; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiFlag); + PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_FLAMETHROWER, MOVE_SMOG); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_HEADBUTT, MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_THUNDERBOLT, target:opponentRight); } + } THEN { + if (aiFlag == AI_FLAG_ASSUME_STAB) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_FLAMETHROWER); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_HEADBUTT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + else if (aiFlag == 0) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + } +} diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 5a076f6fe1..5af51b9e8c 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -64,7 +64,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: Mid-battle switches prioritize offensive o PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | aiRiskyFlag); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT | aiRiskyFlag); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); SpDefense(41); } // Mid battle, AI sends out Aron diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 4dce36a219..8a41e9fdfe 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -85,7 +85,7 @@ AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the pla AI_SINGLE_BATTLE_TEST("When AI switches out due to having no move that affects the player, AI will send in a mon that can hit the player, even if not ideal") { GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_CELEBRATE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } @@ -314,7 +314,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize defensive options") { GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } // Mid battle, AI sends out Aron @@ -373,7 +373,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Item(ITEM_EJECT_PACK); Moves(MOVE_OVERHEAT); Speed(6); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } From cb03086c1d64c5e47cba87ac5ff5962dff5640f5 Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 10 Jul 2025 14:02:31 -0400 Subject: [PATCH 124/248] AI checks the partner's moves for Flatter, Swagger, and Soak. (#7306) --- include/constants/battle.h | 3 +++ src/battle_ai_main.c | 27 +++++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 6d207177c4..f0861ad43a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -302,6 +302,9 @@ enum Volatile #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) #define SIDE_STATUS_PLEDGE_ANY (SIDE_STATUS_RAINBOW | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) +#define SIDE_STATUS_GOOD_FOG (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) +#define SIDE_STATUS_GOOD_COURT (SIDE_STATUS_GOOD_FOG | SIDE_STATUS_TAILWIND | SIDE_STATUS_LUCKY_CHANT | SIDE_STATUS_RAINBOW) +#define SIDE_STATUS_BAD_COURT (SIDE_STATUS_DAMAGE_NON_TYPES | SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_SWAMP) enum Hazards { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 6fee14ca15..38999fcf65 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4316,8 +4316,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HAIL: if (ShouldSetHail(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) - && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); @@ -4332,8 +4331,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_SNOWSCAPE: if (ShouldSetSnow(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) - && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); @@ -4421,10 +4419,17 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; case EFFECT_SWAGGER: + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + ADJUST_SCORE(DECENT_EFFECT); + if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) + ADJUST_SCORE(GOOD_EFFECT); + IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); + break; case EFFECT_FLATTER: - if (HasMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) - || HasMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4454,11 +4459,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_DEFOG: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) - || (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))) + || (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_FOG)) { ADJUST_SCORE(GOOD_EFFECT); } - else if (!IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_SPIKES)) //Don't blow away hazards if you set them up + else if (!AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) || CountUsablePartyMons(battlerDef) == 0) //Don't blow away hazards if you set them up { if (isDoubleBattle) { @@ -4919,7 +4924,9 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SOAK: - if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) + if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) + || HasMoveWithType(BATTLE_PARTNER(battlerAtk), TYPE_ELECTRIC) || HasMoveWithType(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) + || (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) ADJUST_SCORE(DECENT_EFFECT); // Get some super effective moves break; case EFFECT_THIRD_TYPE: From 4e558af76e939eb2a7ad878f79d012a74830caec Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 10 Jul 2025 14:03:46 -0400 Subject: [PATCH 125/248] AI uses After You to help set up Trick Room. (#7310) --- src/battle_ai_main.c | 15 +++++++++++++-- test/battle/ai/ai_doubles.c | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 38999fcf65..43d01dfa2e 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2991,6 +2991,14 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsMoveEffectWeather(move)) ADJUST_SCORE(-10); break; + case EFFECT_AFTER_YOU: + if (effect == EFFECT_TRICK_ROOM) + ADJUST_SCORE(DECENT_EFFECT); + break; + case EFFECT_TRICK_ROOM: + if (effect == EFFECT_AFTER_YOU) + ADJUST_SCORE(DECENT_EFFECT); + break; default: break; } @@ -3521,12 +3529,15 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_AFTER_YOU: + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)) + ADJUST_SCORE(DECENT_EFFECT); + if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove) // Opponent mon 1 goes before partner - || AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove)) // Opponent mon 2 goes before partner + && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove)) // Opponent mon 2 goes before partner { if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last - RETURN_SCORE_PLUS(WEAK_EFFECT); + ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_HEAL_PULSE: diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 243c6611e9..cbf7c3423b 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -410,6 +410,29 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha } } +AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") +{ + u32 move; + + PARAMETRIZE { move = MOVE_TRICK_ROOM; } + PARAMETRIZE { move = MOVE_MOONBLAST; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_INDEEDEE_M) { Speed(5); Moves(MOVE_AFTER_YOU, MOVE_PSYCHIC); } + OPPONENT(SPECIES_CLEFAIRY) { Speed(3); Moves(move, MOVE_PSYCHIC); } + } WHEN { + if (move == MOVE_TRICK_ROOM) + TURN { EXPECT_MOVE(opponentLeft, MOVE_AFTER_YOU, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_AFTER_YOU); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") { From 424c127b8bab529ef7b8834e3d8b74c9281bb672 Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 10 Jul 2025 16:08:14 -0400 Subject: [PATCH 126/248] AI Tests + accompanying bugfixes for Skill Swap, Worry Seed, weather setting in double battles, and Discharging into an ally's lightningrod (#7297) --- include/battle_ai_main.h | 3 +- src/battle_ai_util.c | 10 ++-- test/battle/ai/ai_check_viability.c | 37 +++++++++++-- test/battle/ai/ai_doubles.c | 84 +++++++++++++++++++++++------ 4 files changed, 111 insertions(+), 23 deletions(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 6c58063350..547395d480 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -39,9 +39,10 @@ enum AIScore DECENT_EFFECT = 2, GOOD_EFFECT = 3, BEST_EFFECT = 4, + PERFECT_EFFECT = 10, BAD_EFFECT = -1, AWFUL_EFFECT = -3, - WORST_EFFECT = -5 + WORST_EFFECT = -10 }; // AI_TryToFaint diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index f0defb570a..48403d4e11 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -5279,7 +5279,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData case ABILITY_POWER_SPOT: case ABILITY_VICTORY_STAR: if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler)) && aiData->abilities[BATTLE_PARTNER(battler)] != ability) - return GOOD_EFFECT; + return BEST_EFFECT; break; case ABILITY_GUTS: if (HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL) && gBattleMons[battler].status1 & (STATUS1_CAN_MOVE)) @@ -5295,7 +5295,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData case ABILITY_VITAL_SPIRIT: if (HasMoveWithEffect(battler, EFFECT_REST)) return WORST_EFFECT; - return NO_INCREASE; + break; case ABILITY_INTIMIDATE: { u32 abilityDef = aiData->abilities[FOE(battler)]; @@ -5335,6 +5335,8 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return WEAK_EFFECT; if (gBattleMons[battler].status1 & (STATUS1_TOXIC_POISON)) return BEST_EFFECT; + if (gBattleMons[battler].status1 & STATUS1_ANY) + return NO_INCREASE; break; // Also used to Simple Beam SIMPLE_BEAM. case ABILITY_SIMPLE: @@ -5354,11 +5356,13 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return NO_INCREASE; } return GOOD_EFFECT; + case ABILITY_NONE: + return NO_INCREASE; default: break; } - return NO_INCREASE; + return WEAK_EFFECT; } u32 GetThinkingBattler(u32 battler) diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 47cf2450a9..1407023ece 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -281,12 +281,22 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") { + u32 move; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT; + + PARAMETRIZE { move = MOVE_REST; } + PARAMETRIZE { move = MOVE_EXTREME_SPEED; } + PARAMETRIZE { move = MOVE_REST; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + PARAMETRIZE { move = MOVE_EXTREME_SPEED; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } GIVEN { - PLAYER(SPECIES_ZUBAT) { Moves(MOVE_REST, MOVE_SLEEP_TALK, MOVE_AIR_CUTTER); } - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); - OPPONENT(SPECIES_BUDEW) { Moves(MOVE_WORRY_SEED, MOVE_SLUDGE_BOMB); } + AI_FLAGS(aiFlags); + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_SLEEP_TALK, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_WORRY_SEED, MOVE_HEADBUTT); } } WHEN { - TURN { MOVE(player, MOVE_AIR_CUTTER); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + if (move == MOVE_REST) + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + else + TURN { MOVE(player, MOVE_HEADBUTT); NOT_EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } } } @@ -309,4 +319,23 @@ AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm") } } +AI_SINGLE_BATTLE_TEST("AI uses Skill Swap against Poison Heal") +{ + u8 status; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT; + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_POISON; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; aiFlags |= AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; } + GIVEN { + PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); Status1(status); } + AI_FLAGS(aiFlags); + OPPONENT(SPECIES_SPINDA) { Moves(MOVE_SKILL_SWAP, MOVE_HEADBUTT); } + } WHEN { + if (status == STATUS1_TOXIC_POISON) + TURN { EXPECT_MOVE(opponent, MOVE_SKILL_SWAP); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_SKILL_SWAP); } + } +} diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index cbf7c3423b..33c3eca074 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -348,7 +348,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") } } -AI_DOUBLE_BATTLE_TEST("AI knows if redirection abilities provide immunity to allies") +AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (gen 4)") { KNOWN_FAILING; ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); @@ -356,26 +356,44 @@ AI_DOUBLE_BATTLE_TEST("AI knows if redirection abilities provide immunity to all ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - u32 ability, move, species, config; + u32 ability, move, species; - PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_4; } - PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_5; } - PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_4; } - PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_5; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); - WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); - PLAYER(SPECIES_ZIGZAGOON); - PLAYER(SPECIES_ZIGZAGOON); - OPPONENT(SPECIES_SLAKING) { Moves(move, MOVE_SCRATCH); } + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_4); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_HEADBUTT); } OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_ROUND); } } WHEN { - if (config == GEN_5) - TURN { EXPECT_MOVE(opponentLeft, move); } - else - TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_HEADBUTT); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (gen 5+)") +{ + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); + + u32 ability, move, species; + + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_HEADBUTT); } + OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_ROUND); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } } } @@ -410,6 +428,41 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha } } +// Sandstorm is omitted on purpose. +// Tornadus is currently not willing to set up Sandstorm for its ally, but the actual purpose of this test is to demonstrate that Tornadus or Whimsicott will perform standard VGC openers. +// Rain Dance, Sunny Day, and Snowscape are the actually important ones; setting up a good Sandstorm test + functionality is less important and will be done in later PRs. +AI_DOUBLE_BATTLE_TEST("AI will set up weather for its ally") +{ + u32 goodWeather, badWeather, weatherTrigger; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } + PARAMETRIZE { goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } + PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } +// PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } +// PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; +// goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TORNADUS) { Ability(ABILITY_PRANKSTER); Moves(goodWeather, badWeather, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherTrigger, MOVE_EARTH_POWER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, goodWeather); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") { u32 move; @@ -433,6 +486,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") } } + AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") { From cb606cee6a64fcef48fef51d1cfde1b77ca5e904 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 10 Jul 2025 23:37:06 +0200 Subject: [PATCH 127/248] Fix HGSS dex running out of heap (#7317) Co-authored-by: Hedara --- src/pokedex_plus_hgss.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index db7ff38ee0..49e1016d32 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -4228,6 +4228,13 @@ static void Task_ExitCaughtMonPage(u8 taskId) paletteNum = gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum; paletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality); LoadPalette(paletteData, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); + + if (sPokedexView) + { + Free(sPokedexView); + sPokedexView = NULL; + } + DestroyTask(taskId); } } From 3ee93c69ecf5349f88f4114a9548309621016bc8 Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 10 Jul 2025 23:38:08 -0400 Subject: [PATCH 128/248] Preliminary handling for AI_FLAG_ASSUME_POWERFUL_STATUS, not actually yet called. --- docs/tutorials/ai_flags.md | 4 ++ include/battle_ai_util.h | 2 + include/config/ai.h | 5 ++ include/constants/battle_ai.h | 3 +- src/battle_ai_main.c | 11 +++++ src/battle_ai_util.c | 90 +++++++++++++++++++++++++++++++++++ 6 files changed, 114 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index 7910049fbe..9f39090b65 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -147,6 +147,10 @@ AI has full knowledge of player moves, abilities, and hold items, and can use th ## `AI_FLAG_ASSUME_STAB` A significantly more restricted version of `AI_FLAG_OMNISCIENT`, the AI only knows the player's STAB moves, as their existence would be reasonable to assume in almost any case. +## `AI_FLAG_ASSUME_POWERFUL_STATUS` +A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know if the player has certain iconic status moves, plus also Fake Out and fixed percentage moves like Super Fang. + + ## `AI_FLAG_SMART_MON_CHOICES` Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled. diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index b0ad69f5d9..1e03090dde 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -61,6 +61,8 @@ bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); bool32 IsAiBattlerAware(u32 battlerId); bool32 IsAiBattlerAssumingStab(void); +bool32 IsAiBattlerAssumingPowerfulStatus(void); +bool32 ShouldRecordStatusMove(u32 move); void ClearBattlerMoveHistory(u32 battlerId); void RecordLastUsedMoveBy(u32 battlerId, u32 move); void RecordAllMoves(u32 battler); diff --git a/include/config/ai.h b/include/config/ai.h index 57fc7ecb60..be091649af 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -76,6 +76,11 @@ // AI_FLAG_ASSUME_STAB settings #define ASSUME_STAB_SEES_ABILITY FALSE // Flag also gives omniscience for player's ability. Can use AI_FLAG_WEIGH_ABILITY_PREDICTION instead for smarter prediction without omniscience. +// AI_FLAG_ASSUME_POWERFUL_STATUS settings +#define ASSUME_POWERFUL_STATUS_HIGH_ODDS 95 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore +#define ASSUME_POWERFUL_STATUS_MEDIUM_ODDS 75 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect +#define ASSUME_POWERFUL_STATUS_LOW_ODDS 50 // Chance for AI to see niche moves a pokemon may have but probably won't, like Trick Room or Speed Swap + // AI_FLAG_SMART_SWITCHING settings #define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 4fc13aaa1b..fa2a96ee5d 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -34,8 +34,9 @@ #define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT #define AI_FLAG_SMART_TERA (1 << 27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). #define AI_FLAG_ASSUME_STAB (1 << 28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ASSUME_POWERFUL_STATUS (1 << 29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. -#define AI_FLAG_COUNT 29 +#define AI_FLAG_COUNT 30 // Flags at and after 32 need different formatting, as in // #define AI_FLAG_PLACEHOLDER ((u64)1 << 32) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 43d01dfa2e..a69edaa48f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -544,6 +544,17 @@ void RecordMovesBasedOnStab(u32 battler) } } +void RecordPowerfulStatusMoves(u32 battler) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 playerMove = gBattleMons[battler].moves[i]; + if (ShouldRecordStatusMove(playerMove)) + RecordKnownMove(battler, playerMove); + } +} + void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { u32 ability, holdEffect; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 48403d4e11..b6a208a9c7 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -249,6 +249,96 @@ void SaveBattlerData(u32 battlerId) gAiThinkingStruct->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; } +bool32 ShouldRecordStatusMove(u32 move) +{ + u32 rand = Random() % 100; + + if (rand >= ASSUME_POWERFUL_STATUS_HIGH_ODDS) + return FALSE; + + switch (GetMoveEffect(move)) + { + // variable odds by additional effect + case EFFECT_NON_VOLATILE_STATUS: + if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP) + return TRUE; + else if (rand < ASSUME_POWERFUL_STATUS_MEDIUM_ODDS) + return TRUE; + break; + // High odds + case EFFECT_AURORA_VEIL: + case EFFECT_CHILLY_RECEPTION: + case EFFECT_CONVERSION: + case EFFECT_FIRST_TURN_ONLY: + case EFFECT_FOLLOW_ME: + case EFFECT_INSTRUCT: + case EFFECT_JUNGLE_HEALING: + case EFFECT_REVIVAL_BLESSING: + case EFFECT_SHED_TAIL: + case EFFECT_STICKY_WEB: + return TRUE; + // Medium odds + case EFFECT_AFTER_YOU: + case EFFECT_DEFOG: + case EFFECT_ENCORE: + case EFFECT_HAZE: + case EFFECT_HEAL_BELL: + case EFFECT_HEALING_WISH: + case EFFECT_LIFE_DEW: + case EFFECT_MEMENTO: + case EFFECT_PARTING_SHOT: + case EFFECT_PROTECT: + case EFFECT_RESTORE_HP: + case EFFECT_ROAR: + case EFFECT_TAUNT: + case EFFECT_TAILWIND: + case EFFECT_TELEPORT: + case EFFECT_TRICK: + // defoggables / screens and hazards + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_SPIKES: + case EFFECT_STEALTH_ROCK: + case EFFECT_TOXIC_SPIKES: + // field status + case EFFECT_HAIL: + case EFFECT_RAIN_DANCE: + case EFFECT_SANDSTORM: + case EFFECT_SNOWSCAPE: + case EFFECT_SUNNY_DAY: + case EFFECT_TRICK_ROOM: + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + if (rand < ASSUME_POWERFUL_STATUS_MEDIUM_ODDS) + return TRUE; + break; + // Low odds + case EFFECT_COURT_CHANGE: + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_FIXED_PERCENT_DAMAGE: + case EFFECT_GASTRO_ACID: + case EFFECT_GUARD_SPLIT: + case EFFECT_IMPRISON: + case EFFECT_PERISH_SONG: + case EFFECT_POWER_SPLIT: + case EFFECT_QUASH: + case EFFECT_ROLE_PLAY: + case EFFECT_SKILL_SWAP: + case EFFECT_SPEED_SWAP: + case EFFECT_WORRY_SEED: + if (rand < ASSUME_POWERFUL_STATUS_LOW_ODDS) + return TRUE; + break; + default: + break; + } + + return FALSE; +} + static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) { u32 i, j; From 026b1f25f24072ee36f8d4c2e81c37a40bb38729 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 11 Jul 2025 00:31:47 -0400 Subject: [PATCH 129/248] I suspect the test is set up wrong, more than I have the logic wrong. Though that could also be true. --- include/random.h | 5 +++ src/battle_ai_main.c | 3 ++ src/battle_ai_util.c | 30 +++++++------- test/battle/ai/ai_assume_powerful_status.c | 48 ++++++++++++++++++++++ 4 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 test/battle/ai/ai_assume_powerful_status.c diff --git a/include/random.h b/include/random.h index f23ff2f184..df749312fd 100644 --- a/include/random.h +++ b/include/random.h @@ -202,6 +202,11 @@ enum RandomTag RNG_AI_BOOST_INTO_HAZE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, + RNG_AI_ASSUME_POWERFUL_STATUS_SLEEP, + RNG_AI_ASSUME_POWERFUL_STATUS_NONVOLATILE, + RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS, + RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, + RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS, }; #define RandomWeighted(tag, ...) \ diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a69edaa48f..a14ebd4c1a 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -570,6 +570,9 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) if (IsAiBattlerAssumingStab()) RecordMovesBasedOnStab(battler); + + if (IsAiBattlerAssumingPowerfulStatus()) + RecordPowerfulStatusMoves(battler); } #define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b6a208a9c7..f09fe2d132 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -141,6 +141,15 @@ bool32 IsAiBattlerAssumingStab() return FALSE; } +bool32 IsAiBattlerAssumingPowerfulStatus() +{ + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_POWERFUL_STATUS + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_POWERFUL_STATUS) + return TRUE; + + return FALSE; +} + bool32 IsAiBattlerPredictingAbility(u32 battlerId) { if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION @@ -251,18 +260,13 @@ void SaveBattlerData(u32 battlerId) bool32 ShouldRecordStatusMove(u32 move) { - u32 rand = Random() % 100; - - if (rand >= ASSUME_POWERFUL_STATUS_HIGH_ODDS) - return FALSE; - switch (GetMoveEffect(move)) { // variable odds by additional effect case EFFECT_NON_VOLATILE_STATUS: - if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP) + if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP && RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_SLEEP, ASSUME_POWERFUL_STATUS_HIGH_ODDS)) return TRUE; - else if (rand < ASSUME_POWERFUL_STATUS_MEDIUM_ODDS) + else if (RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_NONVOLATILE, ASSUME_POWERFUL_STATUS_MEDIUM_ODDS)) return TRUE; break; // High odds @@ -276,7 +280,7 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_REVIVAL_BLESSING: case EFFECT_SHED_TAIL: case EFFECT_STICKY_WEB: - return TRUE; + return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS, ASSUME_POWERFUL_STATUS_HIGH_ODDS); // Medium odds case EFFECT_AFTER_YOU: case EFFECT_DEFOG: @@ -288,8 +292,10 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_MEMENTO: case EFFECT_PARTING_SHOT: case EFFECT_PROTECT: + case EFFECT_REST: case EFFECT_RESTORE_HP: case EFFECT_ROAR: + case EFFECT_SLEEP_TALK: case EFFECT_TAUNT: case EFFECT_TAILWIND: case EFFECT_TELEPORT: @@ -311,9 +317,7 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_GRASSY_TERRAIN: case EFFECT_MISTY_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: - if (rand < ASSUME_POWERFUL_STATUS_MEDIUM_ODDS) - return TRUE; - break; + return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, ASSUME_POWERFUL_STATUS_MEDIUM_ODDS); // Low odds case EFFECT_COURT_CHANGE: case EFFECT_DOODLE: @@ -329,9 +333,7 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_SKILL_SWAP: case EFFECT_SPEED_SWAP: case EFFECT_WORRY_SEED: - if (rand < ASSUME_POWERFUL_STATUS_LOW_ODDS) - return TRUE; - break; + return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS, ASSUME_POWERFUL_STATUS_LOW_ODDS); default: break; } diff --git a/test/battle/ai/ai_assume_powerful_status.c b/test/battle/ai/ai_assume_powerful_status.c new file mode 100644 index 0000000000..7c1f08f352 --- /dev/null +++ b/test/battle/ai/ai_assume_powerful_status.c @@ -0,0 +1,48 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_POWERFUL_STATUS correctly records assumed status moves") +{ + PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_HIGH_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS); + PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS); + PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_LOW_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS); + + u32 aiFlag = 0; + PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_POWERFUL_STATUS; } + PARAMETRIZE { aiFlag = 0; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiFlag); + PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_COURT_CHANGE, MOVE_FAKE_OUT); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HAIL, MOVE_SHED_TAIL, MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_THUNDERBOLT, target:opponentRight); } + } THEN { + if (aiFlag == AI_FLAG_ASSUME_POWERFUL_STATUS) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_COURT_CHANGE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FAKE_OUT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_HAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_SHED_TAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + else if (aiFlag == 0) + { + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); + } + } +} From 7d5a949b7106e6e02ac7b9061719186096495b26 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 11 Jul 2025 12:50:38 +0300 Subject: [PATCH 130/248] Bag refactor 2 (#7166) --- Makefile | 2 +- include/constants/item.h | 2 +- include/gba/defines.h | 1 + include/item.h | 36 +- src/item.c | 719 +++++++++++++++++---------------------- src/item_menu.c | 17 +- src/item_menu_icons.c | 4 +- src/party_menu.c | 15 +- test/bag.c | 14 +- 9 files changed, 367 insertions(+), 443 deletions(-) diff --git a/Makefile b/Makefile index ebf7679af3..7456a9073b 100644 --- a/Makefile +++ b/Makefile @@ -124,7 +124,7 @@ ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init +override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull ifneq ($(LTO),0) ifneq ($(TEST),1) diff --git a/include/constants/item.h b/include/constants/item.h index a8266c7237..bd35bdb861 100644 --- a/include/constants/item.h +++ b/include/constants/item.h @@ -11,7 +11,7 @@ enum Pocket POCKETS_COUNT, }; -#define POCKET_NONE POCKETS_COUNT +#define POCKET_DUMMY POCKETS_COUNT #define REPEL_LURE_MASK (1 << 15) #define IS_LAST_USED_LURE(var) (var & REPEL_LURE_MASK) diff --git a/include/gba/defines.h b/include/gba/defines.h index 481f203052..674c5fdc14 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -26,6 +26,7 @@ #define ALIGNED(n) __attribute__((aligned(n))) #define PACKED __attribute__((packed)) #define TRANSPARENT __attribute__ ((__transparent_union__)) +#define NONNULL __attribute__((__nonnull__)) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) #define INTR_CHECK (*(u16 *)0x3007FF8) diff --git a/include/item.h b/include/item.h index b14d9bdf14..565784c85a 100644 --- a/include/item.h +++ b/include/item.h @@ -68,7 +68,8 @@ struct Item struct ALIGNED(2) BagPocket { struct ItemSlot *itemSlots; - u16 capacity; + u16 capacity:10; + enum Pocket id:6; }; struct TmHmIndexKey @@ -135,35 +136,42 @@ static inline u16 GetTMHMMoveId(enum TMHMIndex index) return gTMHMItemMoveIds[index].moveId; } +enum SortPocket +{ + SORT_NONE, + SORT_POCKET_BY_ITEM_ID, + SORT_POCKET_TM_HM, +}; + +void GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos, u16 *itemId, u16 *quantity); u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos); u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos); -void SetBagItemQuantity(enum Pocket pocketId, u32 pocketPos, u16 newValue); void ApplyNewEncryptionKeyToBagItems(u32 newKey); void SetBagItemsPointers(void); u8 *CopyItemName(u16 itemId, u8 *dst); u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity); -bool8 IsBagPocketNonEmpty(enum Pocket pocketId); -bool8 CheckBagHasItem(u16 itemId, u16 count); -bool8 HasAtLeastOneBerry(void); -bool8 HasAtLeastOnePokeBall(void); -bool8 CheckBagHasSpace(u16 itemId, u16 count); +bool32 IsBagPocketNonEmpty(enum Pocket pocketId); +bool32 CheckBagHasItem(u16 itemId, u16 count); +bool32 HasAtLeastOneBerry(void); +bool32 HasAtLeastOnePokeBall(void); +bool32 CheckBagHasSpace(u16 itemId, u16 count); u32 GetFreeSpaceForItemInBag(u16 itemId); -bool8 AddBagItem(u16 itemId, u16 count); -bool8 RemoveBagItem(u16 itemId, u16 count); +bool32 AddBagItem(u16 itemId, u16 count); +bool32 RemoveBagItem(u16 itemId, u16 count); u8 CountUsedPCItemSlots(void); -bool8 CheckPCHasItem(u16 itemId, u16 count); -bool8 AddPCItem(u16 itemId, u16 count); +bool32 CheckPCHasItem(u16 itemId, u16 count); +bool32 AddPCItem(u16 itemId, u16 count); void RemovePCItem(u8 index, u16 count); void CompactPCItems(void); void SwapRegisteredBike(void); void CompactItemsInBagPocket(enum Pocket pocketId); -void SortBerriesOrTMHMs(enum Pocket pocketId); +void SortPocket(enum Pocket pocketId, enum SortPocket sortPocket); void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to); void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to); void ClearBag(void); u16 CountTotalItemQuantityInBag(u16 itemId); -bool8 AddPyramidBagItem(u16 itemId, u16 count); -bool8 RemovePyramidBagItem(u16 itemId, u16 count); +bool32 AddPyramidBagItem(u16 itemId, u16 count); +bool32 RemovePyramidBagItem(u16 itemId, u16 count); const u8 *GetItemName(u16 itemId); u32 GetItemPrice(u16 itemId); const u8 *GetItemEffect(u32 itemId); diff --git a/src/item.c b/src/item.c index f0f9071c5a..45a3dfe421 100644 --- a/src/item.c +++ b/src/item.c @@ -21,10 +21,19 @@ #include "constants/item_effects.h" #include "constants/hold_effects.h" -static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count); -static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count); +#define DUMMY_PC_BAG_POCKET \ +{ \ + .id = POCKET_DUMMY, \ + .capacity = PC_ITEMS_COUNT, \ + .itemSlots = gSaveBlock1Ptr->pcItems, \ +} + +static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count); +static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count); static const u8 *GetItemPluralName(u16); static bool32 DoesItemHavePluralName(u16); +static void BagPocket_GetSetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting); +static void BagPocket_GetSetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting); EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; @@ -52,54 +61,71 @@ const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = #undef UNPACK_TM_ITEM_ID #undef UNPACK_HM_ITEM_ID -static inline u16 GetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos) +static void (*const sBagPocket_GetSetSlotDataFuncs[])(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) = { - return pocket->itemSlots[pocketPos].itemId; + [POCKET_ITEMS] = BagPocket_GetSetSlotDataGeneric, + [POCKET_KEY_ITEMS] = BagPocket_GetSetSlotDataGeneric, + [POCKET_POKE_BALLS] = BagPocket_GetSetSlotDataGeneric, + [POCKET_TM_HM] = BagPocket_GetSetSlotDataGeneric, + [POCKET_BERRIES] = BagPocket_GetSetSlotDataGeneric, + [POCKET_DUMMY] = BagPocket_GetSetSlotDataPC, +}; + +static void NONNULL BagPocket_GetSetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) +{ + if (isSetting) + { + pocket->itemSlots[pocketPos].itemId = *quantity ? *itemId : ITEM_NONE; // Sets to zero if quantity is zero + pocket->itemSlots[pocketPos].quantity = *quantity ^ gSaveBlock2Ptr->encryptionKey; + } + else + { + *itemId = pocket->itemSlots[pocketPos].itemId; + *quantity = pocket->itemSlots[pocketPos].quantity ^ gSaveBlock2Ptr->encryptionKey; + } } -static inline u16 GetBagItemQuantityPocket(struct BagPocket *pocket, u32 pocketPos) +static void NONNULL BagPocket_GetSetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) { - return gSaveBlock2Ptr->encryptionKey ^ pocket->itemSlots[pocketPos].quantity; + if (isSetting) + { + pocket->itemSlots[pocketPos].itemId = *quantity ? *itemId : ITEM_NONE; // Sets to zero if quantity is zero + pocket->itemSlots[pocketPos].quantity = *quantity; + } + else + { + *itemId = pocket->itemSlots[pocketPos].itemId; + *quantity = pocket->itemSlots[pocketPos].quantity; + } } -static inline void SetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos, u16 itemId) +static inline void NONNULL BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity) { - pocket->itemSlots[pocketPos].itemId = itemId; + sBagPocket_GetSetSlotDataFuncs[pocket->id](pocket, pocketPos, itemId, quantity, FALSE); } -static inline void SetBagItemQuantityPocket(struct BagPocket *pocket, u32 pocketPos, u16 newValue) +static inline void NONNULL BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity) { - pocket->itemSlots[pocketPos].quantity = newValue ^ gSaveBlock2Ptr->encryptionKey; + sBagPocket_GetSetSlotDataFuncs[pocket->id](pocket, pocketPos, itemId, quantity, TRUE); +} + +void GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos, u16 *itemId, u16 *quantity) +{ + BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, itemId, quantity); } u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos) { - return GetBagItemIdPocket(&gBagPockets[pocketId], pocketPos); + u16 itemId, quantity; + BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, &itemId, &quantity); + return itemId; } u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos) { - return GetBagItemQuantityPocket(&gBagPockets[pocketId], pocketPos); -} - -static void SetBagItemId(enum Pocket pocketId, u32 pocketPos, u16 itemId) -{ - SetBagItemIdPocket(&gBagPockets[pocketId], pocketPos, itemId); -} - -void SetBagItemQuantity(enum Pocket pocketId, u32 pocketPos, u16 newValue) -{ - SetBagItemQuantityPocket(&gBagPockets[pocketId], pocketPos, newValue); -} - -static u16 GetPCItemQuantity(u16 *quantity) -{ - return *quantity; -} - -static void SetPCItemQuantity(u16 *quantity, u16 newValue) -{ - *quantity = newValue; + u16 itemId, quantity; + BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, &itemId, &quantity); + return quantity; } void ApplyNewEncryptionKeyToBagItems(u32 newKey) @@ -117,18 +143,23 @@ void SetBagItemsPointers(void) { gBagPockets[POCKET_ITEMS].itemSlots = gSaveBlock1Ptr->bag.items; gBagPockets[POCKET_ITEMS].capacity = BAG_ITEMS_COUNT; + gBagPockets[POCKET_ITEMS].id = POCKET_ITEMS; gBagPockets[POCKET_KEY_ITEMS].itemSlots = gSaveBlock1Ptr->bag.keyItems; gBagPockets[POCKET_KEY_ITEMS].capacity = BAG_KEYITEMS_COUNT; + gBagPockets[POCKET_KEY_ITEMS].id = POCKET_KEY_ITEMS; gBagPockets[POCKET_POKE_BALLS].itemSlots = gSaveBlock1Ptr->bag.pokeBalls; gBagPockets[POCKET_POKE_BALLS].capacity = BAG_POKEBALLS_COUNT; + gBagPockets[POCKET_POKE_BALLS].id = POCKET_POKE_BALLS; gBagPockets[POCKET_TM_HM].itemSlots = gSaveBlock1Ptr->bag.TMsHMs; gBagPockets[POCKET_TM_HM].capacity = BAG_TMHM_COUNT; + gBagPockets[POCKET_TM_HM].id = POCKET_TM_HM; gBagPockets[POCKET_BERRIES].itemSlots = gSaveBlock1Ptr->bag.berries; gBagPockets[POCKET_BERRIES].capacity = BAG_BERRIES_COUNT; + gBagPockets[POCKET_BERRIES].id = POCKET_BERRIES; } u8 *CopyItemName(u16 itemId, u8 *dst) @@ -155,68 +186,56 @@ u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) } } -bool8 IsBagPocketNonEmpty(enum Pocket pocketId) +bool32 IsBagPocketNonEmpty(enum Pocket pocketId) { u8 i; for (i = 0; i < gBagPockets[pocketId].capacity; i++) { - if (GetBagItemId(pocketId, i) != 0) + if (GetBagItemId(pocketId, i) != ITEM_NONE) return TRUE; } return FALSE; } -bool8 CheckBagHasItem(u16 itemId, u16 count) +static bool32 NONNULL BagPocket_CheckHasItem(struct BagPocket *pocket, u16 itemId, u16 count) { - u8 i; - enum Pocket pocketId; + u16 tempItemId, tempQuantity; + // Check for item slots that contain the item + for (u32 i = 0; i < pocket->capacity && count > 0; i++) + { + BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); + if (tempItemId == itemId) + count -= min(count, tempQuantity); + } + + return count == 0; +} + +bool32 CheckBagHasItem(u16 itemId, u16 count) +{ if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) return CheckPyramidBagHasItem(itemId, count); - pocketId = GetItemPocket(itemId); - // Check for item slots that contain the item - for (i = 0; i < gBagPockets[pocketId].capacity; i++) - { - if (GetBagItemId(pocketId, i) == itemId) - { - u16 quantity; - // Does this item slot contain enough of the item? - quantity = GetBagItemQuantity(pocketId, i); - if (quantity >= count) - return TRUE; - count -= quantity; - // Does this item slot and all previous slots contain enough of the item? - if (count == 0) - return TRUE; - } - } - return FALSE; + + return BagPocket_CheckHasItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } -bool8 HasAtLeastOneBerry(void) +bool32 HasAtLeastOneBerry(void) { - u16 i; - - for (i = FIRST_BERRY_INDEX; i <= LAST_BERRY_INDEX; i++) - { - if (CheckBagHasItem(i, 1) == TRUE) - { - gSpecialVar_Result = TRUE; - return TRUE; - } - } gSpecialVar_Result = FALSE; - return FALSE; + + for (u32 i = FIRST_BERRY_INDEX; i <= LAST_BERRY_INDEX && gSpecialVar_Result == FALSE; i++) + gSpecialVar_Result = CheckBagHasItem(i, 1); + + return gSpecialVar_Result; } -bool8 HasAtLeastOnePokeBall(void) +bool32 HasAtLeastOnePokeBall(void) { - u16 ballId; - - for (ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) + for (u32 ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) { if (CheckBagHasItem(ballId, 1) == TRUE) return TRUE; @@ -224,7 +243,7 @@ bool8 HasAtLeastOnePokeBall(void) return FALSE; } -bool8 CheckBagHasSpace(u16 itemId, u16 count) +bool32 CheckBagHasSpace(u16 itemId, u16 count) { if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; @@ -235,335 +254,250 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) return GetFreeSpaceForItemInBag(itemId) >= count; } -u32 GetFreeSpaceForItemInBag(u16 itemId) +static u32 NONNULL BagPocket_GetFreeSpaceForItem(struct BagPocket *pocket, u16 itemId) { - u8 i; - enum Pocket pocketId = GetItemPocket(itemId); - u16 ownedCount; u32 spaceForItem = 0; - - if (GetItemPocket(itemId) >= POCKETS_COUNT) - return 0; + u16 tempItemId, tempQuantity; // Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocketId].capacity; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - - if (GetBagItemId(pocketId, i) == itemId) - { - ownedCount = GetBagItemQuantity(pocketId, i); - spaceForItem += max(0, MAX_BAG_ITEM_CAPACITY - ownedCount); - } - else if (GetBagItemId(pocketId, i) == ITEM_NONE) - { - spaceForItem += MAX_BAG_ITEM_CAPACITY; - } + BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); + if (tempItemId == ITEM_NONE || tempItemId == itemId) + spaceForItem += (tempItemId ? (MAX_BAG_ITEM_CAPACITY - tempQuantity) : MAX_BAG_ITEM_CAPACITY); } + return spaceForItem; } -static inline u32 PrepareTempPocket(struct BagPocket *tempPocket, enum Pocket pocketId) +u32 GetFreeSpaceForItemInBag(u16 itemId) { - u32 size = gBagPockets[pocketId].capacity * sizeof(struct ItemSlot); - tempPocket->itemSlots = AllocZeroed(size); - tempPocket->capacity = gBagPockets[pocketId].capacity; - memcpy(tempPocket->itemSlots, gBagPockets[pocketId].itemSlots, size); + if (GetItemPocket(itemId) >= POCKETS_COUNT) + return 0; - return size; + return BagPocket_GetFreeSpaceForItem(&gBagPockets[GetItemPocket(itemId)], itemId); } -static inline void ClearTempPocket(struct BagPocket *pocket) +static inline bool32 NONNULL CheckSlotAndUpdateCount(struct BagPocket *pocket, u16 itemId, u32 pocketPos, u32 *nextPocketPos, u16 *count, u16 *tempPocketSlotQuantities) { - Free(pocket->itemSlots); - Free(pocket); + u16 tempItemId, tempQuantity; + BagPocket_GetSlotData(pocket, pocketPos, &tempItemId, &tempQuantity); + if (tempItemId == ITEM_NONE || tempItemId == itemId) + { + // The quantity already at the slot - zero if an empty slot + if (!tempItemId) + tempQuantity = 0; + + // Record slot quantity in tempPocketSlotQuantities, adjust count + tempPocketSlotQuantities[pocketPos] = min(MAX_BAG_ITEM_CAPACITY, *count + tempQuantity); + *count -= min(*count, MAX_BAG_ITEM_CAPACITY - tempQuantity); + + // Set the starting index for the next loop to set items (shifted by one) + if (!*nextPocketPos) + *nextPocketPos = pocketPos + 1; + + return TRUE; + } + + return FALSE; } -static inline void RestorePocketAndClearTempPocket(struct BagPocket *tempPocket, enum Pocket pocketId, u32 pocketSize) +static bool32 NONNULL BagPocket_AddItem(struct BagPocket *pocket, u16 itemId, u16 count) { - memcpy(gBagPockets[pocketId].itemSlots, tempPocket->itemSlots, pocketSize); - ClearTempPocket(tempPocket); + u32 itemLookupIndex, itemAddIndex = 0; + + // First, check that there is a free slot for this item + u16 *tempPocketSlotQuantities = AllocZeroed(sizeof(u16) * pocket->capacity); + + switch (pocket->id) + { + case POCKET_TM_HM: + case POCKET_BERRIES: + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && count > 0; itemLookupIndex++) + { + // Check if we found a slot to store the item but weren't able to reduce count to 0 + // This means that we have more than one stack's worth, which isn't allowed in these pockets + if (CheckSlotAndUpdateCount(pocket, itemId, itemLookupIndex, &itemAddIndex, &count, tempPocketSlotQuantities) && count > 0) + { + Free(tempPocketSlotQuantities); + return FALSE; + } + } + break; + default: + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && count > 0; itemLookupIndex++) + CheckSlotAndUpdateCount(pocket, itemId, itemLookupIndex, &itemAddIndex, &count, tempPocketSlotQuantities); + } + + // If the count is still greater than zero, clearly we have not found enough slots for this... + // Otherwise, we have found slots - update the actual pockets with the updated quantities + if (count == 0) + { + for (--itemAddIndex; itemAddIndex < itemLookupIndex; itemAddIndex++) + { + if (tempPocketSlotQuantities[itemAddIndex] > 0) + BagPocket_SetSlotData(pocket, itemAddIndex, &itemId, &tempPocketSlotQuantities[itemAddIndex]); + } + } + + Free(tempPocketSlotQuantities); + return count == 0; } -bool8 AddBagItem(u16 itemId, u16 count) +bool32 AddBagItem(u16 itemId, u16 count) { - u8 i; - if (GetItemPocket(itemId) >= POCKETS_COUNT) return FALSE; // check Battle Pyramid Bag if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) - { return AddPyramidBagItem(itemId, count); - } - else - { - u16 ownedCount; - enum Pocket pocketId = GetItemPocket(itemId); - struct BagPocket *tempPocket = AllocZeroed(sizeof(struct BagPocket)); - u32 pocketSize = PrepareTempPocket(tempPocket, pocketId); - for (i = 0; i < gBagPockets[pocketId].capacity; i++) - { - if (GetBagItemIdPocket(tempPocket, i) == itemId) - { - ownedCount = GetBagItemQuantityPocket(tempPocket, i); - // check if won't exceed max slot capacity - if (ownedCount + count <= MAX_BAG_ITEM_CAPACITY) - { - // successfully added to already existing item's count - SetBagItemQuantityPocket(tempPocket, i, ownedCount + count); - RestorePocketAndClearTempPocket(tempPocket, pocketId, pocketSize); - return TRUE; - } - else - { - // try creating another instance of the item if possible - if (pocketId == POCKET_TM_HM || pocketId == POCKET_BERRIES) - { - ClearTempPocket(tempPocket); - return FALSE; - } - else - { - count -= MAX_BAG_ITEM_CAPACITY - ownedCount; - SetBagItemQuantityPocket(tempPocket, i, MAX_BAG_ITEM_CAPACITY); - // don't create another instance of the item if it's at max slot capacity and count is equal to 0 - if (count == 0) - { - break; - } - } - } - } - } - - // we're done if quantity is equal to 0 - if (count > 0) - { - // either no existing item was found or we have to create another instance, because the capacity was exceeded - for (i = 0; i < gBagPockets[pocketId].capacity; i++) - { - if (GetBagItemIdPocket(tempPocket, i) == ITEM_NONE) - { - SetBagItemIdPocket(tempPocket, i, itemId); - if (count > MAX_BAG_ITEM_CAPACITY) - { - // try creating a new slot with max capacity if duplicates are possible - if (pocketId == POCKET_TM_HM || pocketId == POCKET_BERRIES) - { - ClearTempPocket(tempPocket); - return FALSE; - } - count -= MAX_BAG_ITEM_CAPACITY; - SetBagItemQuantityPocket(tempPocket, i, MAX_BAG_ITEM_CAPACITY); - } - else - { - // created a new slot and added quantity - SetBagItemQuantityPocket(tempPocket, i, count); - count = 0; - break; - } - } - } - - if (count > 0) - { - ClearTempPocket(tempPocket); - return FALSE; - } - } - RestorePocketAndClearTempPocket(tempPocket, pocketId, pocketSize); - return TRUE; - } + return BagPocket_AddItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } -bool8 RemoveBagItem(u16 itemId, u16 count) +static bool32 NONNULL BagPocket_RemoveItem(struct BagPocket *pocket, u16 itemId, u16 count) { - u8 i; - u16 totalQuantity = 0; + u32 itemLookupIndex, itemRemoveIndex = 0, totalQuantity = 0; + u16 tempItemId, tempQuantity; + u16 *tempPocketSlotQuantities = AllocZeroed(sizeof(u16) * pocket->capacity); - if (GetItemPocket(itemId) >= POCKETS_COUNT || itemId == ITEM_NONE) - return FALSE; - - // check Battle Pyramid Bag - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && totalQuantity < count; itemLookupIndex++) { - return RemovePyramidBagItem(itemId, count); - } - else - { - u16 ownedCount, firstStackIndex = 0; - enum Pocket pocketId = GetItemPocket(itemId); - - for (i = 0; i < gBagPockets[pocketId].capacity; i++) + BagPocket_GetSlotData(pocket, itemLookupIndex, &tempItemId, &tempQuantity); + if (tempItemId == itemId) { - if (GetBagItemId(pocketId, i) == itemId) - { - if (totalQuantity == 0) - firstStackIndex = i; - totalQuantity += GetBagItemQuantity(pocketId, i); - } + // Index for the next loop - where we should start removing items + if (!itemRemoveIndex) + itemRemoveIndex = itemLookupIndex + 1; + + // Gather quantities (+ 1 to tempPocketSlotQuantities so that even if setting to 0 we know which indices to target) + totalQuantity += tempQuantity; + tempPocketSlotQuantities[itemLookupIndex] = (tempQuantity <= count ? 0 : tempQuantity - count) + 1; } + } - if (totalQuantity < count) - return FALSE; // We don't have enough of the item - + if (totalQuantity >= count) // We have enough of the item + { if (CurMapIsSecretBase() == TRUE) { VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_BAG); VarSet(VAR_SECRET_BASE_LAST_ITEM_USED, itemId); } - for (i = firstStackIndex; i < gBagPockets[pocketId].capacity; i++) + // Update the quantities correctly with the items removed + for (--itemRemoveIndex; itemRemoveIndex < itemLookupIndex; itemRemoveIndex++) { - if (GetBagItemId(pocketId, i) == itemId) + if (tempPocketSlotQuantities[itemRemoveIndex] > 0) { - ownedCount = GetBagItemQuantity(pocketId, i); - if (ownedCount >= count) - { - SetBagItemQuantity(pocketId, i, ownedCount - count); - count = 0; - } - else - { - count -= ownedCount; - SetBagItemQuantity(pocketId, i, 0); - } - - if (GetBagItemQuantity(pocketId, i) == 0) - SetBagItemId(pocketId, i, ITEM_NONE); - - if (count == 0) - return TRUE; + tempPocketSlotQuantities[itemRemoveIndex]--; // Reverse the +1 shift + BagPocket_SetSlotData(pocket, itemRemoveIndex, &itemId, &tempPocketSlotQuantities[itemRemoveIndex]); } } - return TRUE; } + + Free(tempPocketSlotQuantities); + return totalQuantity >= count; } -static s32 FindFreePCItemSlot(void) +bool32 RemoveBagItem(u16 itemId, u16 count) { - s8 i; + if (GetItemPocket(itemId) >= POCKETS_COUNT || itemId == ITEM_NONE) + return FALSE; - for (i = 0; i < PC_ITEMS_COUNT; i++) - { - if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) - return i; - } - return -1; + // check Battle Pyramid Bag + if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + return RemovePyramidBagItem(itemId, count); + + return BagPocket_RemoveItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } -u8 CountUsedPCItemSlots(void) +static u8 NONNULL BagPocket_CountUsedItemSlots(struct BagPocket *pocket) { u8 usedSlots = 0; - u8 i; + u16 tempItemId, tempQuantity; - for (i = 0; i < PC_ITEMS_COUNT; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE) + BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); + if (tempItemId) usedSlots++; } return usedSlots; } -bool8 CheckPCHasItem(u16 itemId, u16 count) +u8 CountUsedPCItemSlots(void) { - u8 i; + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_CountUsedItemSlots(&dummyPocket); +} - for (i = 0; i < PC_ITEMS_COUNT; i++) +static bool32 NONNULL BagPocket_CheckPocketForItemCount(struct BagPocket *pocket, u16 itemId, u16 count) +{ + u16 tempItemId, tempQuantity; + + for (u32 i = 0; i < pocket->capacity; i++) { - if (gSaveBlock1Ptr->pcItems[i].itemId == itemId && GetPCItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) >= count) + BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); + if (tempItemId == itemId && tempQuantity >= count) return TRUE; } return FALSE; } -bool8 AddPCItem(u16 itemId, u16 count) +bool32 CheckPCHasItem(u16 itemId, u16 count) { - u8 i; - s8 freeSlot; - u16 ownedCount; - struct ItemSlot *newItems; + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_CheckPocketForItemCount(&dummyPocket, itemId, count); +} - // Copy PC items - newItems = AllocZeroed(sizeof(gSaveBlock1Ptr->pcItems)); - memcpy(newItems, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems)); +bool32 AddPCItem(u16 itemId, u16 count) +{ + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_AddItem(&dummyPocket, itemId, count); +} - // Use any item slots that already contain this item - for (i = 0; i < PC_ITEMS_COUNT; i++) +static void NONNULL BagPocket_CompactItems(struct BagPocket *pocket) +{ + u16 itemId, quantity, zero = 0, slotCursor = 0; + for (u32 i = 0; i < pocket->capacity; i++) { - if (newItems[i].itemId == itemId) + BagPocket_GetSlotData(pocket, i, &itemId, &quantity); + if (itemId == ITEM_NONE) { - ownedCount = GetPCItemQuantity(&newItems[i].quantity); - if (ownedCount + count <= MAX_PC_ITEM_CAPACITY) - { - SetPCItemQuantity(&newItems[i].quantity, ownedCount + count); - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; - } - count += ownedCount - MAX_PC_ITEM_CAPACITY; - SetPCItemQuantity(&newItems[i].quantity, MAX_PC_ITEM_CAPACITY); - if (count == 0) - { - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; - } + if (!slotCursor) + slotCursor = i + 1; + } + else if (slotCursor > 0) + { + BagPocket_SetSlotData(pocket, slotCursor - 1, &itemId, &quantity); + BagPocket_SetSlotData(pocket, i, &zero, &zero); + slotCursor++; } } - - // Put any remaining items into a new item slot. - if (count > 0) - { - freeSlot = FindFreePCItemSlot(); - if (freeSlot == -1) - { - Free(newItems); - return FALSE; - } - else - { - newItems[freeSlot].itemId = itemId; - SetPCItemQuantity(&newItems[freeSlot].quantity, count); - } - } - - // Copy items back to the PC - memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); - Free(newItems); - return TRUE; } void RemovePCItem(u8 index, u16 count) { - gSaveBlock1Ptr->pcItems[index].quantity -= count; - if (gSaveBlock1Ptr->pcItems[index].quantity == 0) - { - gSaveBlock1Ptr->pcItems[index].itemId = ITEM_NONE; - CompactPCItems(); - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + + // Get id, quantity at slot + u16 tempItemId, tempQuantity; + BagPocket_GetSlotData(&dummyPocket, index, &tempItemId, &tempQuantity); + + // Remove quantity + tempQuantity -= count; + BagPocket_SetSlotData(&dummyPocket, index, &tempItemId, &tempQuantity); + + // Compact if necessary + if (tempQuantity == 0) + BagPocket_CompactItems(&dummyPocket); } void CompactPCItems(void) { - u16 i; - u16 j; - - for (i = 0; i < PC_ITEMS_COUNT - 1; i++) - { - for (j = i + 1; j < PC_ITEMS_COUNT; j++) - { - if (gSaveBlock1Ptr->pcItems[i].itemId == 0) - { - struct ItemSlot temp = gSaveBlock1Ptr->pcItems[i]; - gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j]; - gSaveBlock1Ptr->pcItems[j] = temp; - } - } - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + BagPocket_CompactItems(&dummyPocket); } void SwapRegisteredBike(void) @@ -579,101 +513,80 @@ void SwapRegisteredBike(void) } } -static void SwapItemSlots(enum Pocket pocketId, u32 pocketPosA, u16 pocketPosB) -{ - struct ItemSlot *itemA = &gBagPockets[pocketId].itemSlots[pocketPosA], - *itemB = &gBagPockets[pocketId].itemSlots[pocketPosB], - temp; - SWAP(*itemA, *itemB, temp); -} - void CompactItemsInBagPocket(enum Pocket pocketId) { - u16 i, j; + BagPocket_CompactItems(&gBagPockets[pocketId]); +} - for (i = 0; i < gBagPockets[pocketId].capacity - 1; i++) +// Opens the possibility of sorting by other means e.g. ghoulslash's advanced sorting +static inline bool32 ItemIndexCompare(u16 itemA, u16 itemB, enum SortPocket sortPocket) +{ + switch (sortPocket) { - for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) + case SORT_POCKET_BY_ITEM_ID: + return itemA > itemB; + case SORT_POCKET_TM_HM: + return GetItemTMHMIndex(itemA) > GetItemTMHMIndex(itemB); + default: + return FALSE; + } +} + +void SortPocket(enum Pocket pocketId, enum SortPocket sortPocket) +{ + u16 itemId_i, quantity_i, itemId_j, quantity_j; + struct BagPocket *pocket = &gBagPockets[pocketId]; + + for (u32 i = 0; i < pocket->capacity - 1; i++) + { + BagPocket_GetSlotData(pocket, i, &itemId_i, &quantity_i); + for (u32 j = i + 1; j < pocket->capacity; j++) { - if (GetBagItemQuantity(pocketId, i) == 0) - SwapItemSlots(pocketId, i, j); + BagPocket_GetSlotData(pocket, j, &itemId_j, &quantity_j); + if (itemId_j && (!itemId_i || ItemIndexCompare(itemId_i, itemId_j, sortPocket))) + { + BagPocket_SetSlotData(pocket, i, &itemId_j, &quantity_j); + BagPocket_SetSlotData(pocket, j, &itemId_i, &quantity_i); + itemId_i = itemId_j; + quantity_i = quantity_j; + } } } } -void SortBerriesOrTMHMs(enum Pocket pocketId) +static inline void NONNULL BagPocket_MoveItemSlot(struct BagPocket *pocket, u32 from, u32 to) { - u16 i, j; - - for (i = 0; i < gBagPockets[pocketId].capacity - 1; i++) + if (from != to) { - for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) + s8 shift = (to > from) ? 1 : -1; + if (to > from) + to--; + + // Record the values at "from" + u16 fromItemId, fromQuantity, tempItemId, tempQuantity; + BagPocket_GetSlotData(pocket, from, &fromItemId, &fromQuantity); + + // Shuffle items between "to" and "from" + for (u32 i = from; i == to - shift; i += shift) { - if (GetBagItemQuantity(pocketId, i) != 0 || GetBagItemId(pocketId, i) != ITEM_NONE) - { - if (GetBagItemQuantity(pocketId, j) == 0 || GetBagItemId(pocketId, j) == ITEM_NONE) - continue; - if (pocketId == POCKET_BERRIES && GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) // To do - continue; - if (pocketId == POCKET_TM_HM && GetItemTMHMIndex(GetBagItemId(pocketId, i)) <= GetItemTMHMIndex(GetBagItemId(pocketId, j))) - continue; - } - SwapItemSlots(pocketId, i, j); + BagPocket_GetSlotData(pocket, i + shift, &tempItemId, &tempQuantity); + BagPocket_SetSlotData(pocket, i, &tempItemId, &tempQuantity); } + + // Move the saved "from" to "to" + BagPocket_SetSlotData(pocket, to, &fromItemId, &fromQuantity); } } void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to) { - if (from != to) - { - u32 i; - s8 shift = -1; - struct BagPocket *pocket = &gBagPockets[pocketId]; - - // Record the values at "from" - u16 fromItemId = GetBagItemIdPocket(pocket, from), - fromQuantity = GetBagItemQuantityPocket(pocket, from); - - // Shuffle items between "to" and "from" - if (to > from) - { - to--; - shift = 1; - } - - for (i = from; i == to - shift; i += shift) - { - SetBagItemIdPocket(pocket, i, GetBagItemIdPocket(pocket, i + shift)); - SetBagItemQuantityPocket(pocket, i, GetBagItemQuantityPocket(pocket, i + shift)); - } - - // Move the saved "from" to "to" - SetBagItemIdPocket(pocket, to, fromItemId); - SetBagItemQuantityPocket(pocket, to, fromQuantity); - } + BagPocket_MoveItemSlot(&gBagPockets[pocketId], from, to); } void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to) { - if (from != to) - { - s16 i, count; - struct ItemSlot firstSlot = itemSlots[from]; - - if (to > from) - { - to--; - for (i = from, count = to; i < count; i++) - itemSlots[i] = itemSlots[i + 1]; - } - else - { - for (i = from, count = to; i > count; i--) - itemSlots[i] = itemSlots[i - 1]; - } - itemSlots[to] = firstSlot; - } + struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; + return BagPocket_MoveItemSlot(&dummyPocket, from, to); } void ClearBag(void) @@ -681,22 +594,26 @@ void ClearBag(void) CpuFastFill(0, &gSaveBlock1Ptr->bag, sizeof(struct Bag)); } -u16 CountTotalItemQuantityInBag(u16 itemId) +static inline u16 NONNULL BagPocket_CountTotalItemQuantity(struct BagPocket *pocket, u16 itemId) { - u16 i; - u16 ownedCount = 0; - enum Pocket pocketId = GetItemPocket(itemId); + u16 tempItemId, tempQuantity, ownedCount = 0; - for (i = 0; i < gBagPockets[pocketId].capacity; i++) + for (u32 i = 0; i < pocket->capacity; i++) { - if (GetBagItemId(pocketId, i) == itemId) - ownedCount += GetBagItemQuantity(pocketId, i); + BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); + if (tempItemId == itemId) + ownedCount += tempQuantity; } return ownedCount; } -static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count) +u16 CountTotalItemQuantityInBag(u16 itemId) +{ + return BagPocket_CountTotalItemQuantity(&gBagPockets[GetItemPocket(itemId)], itemId); +} + +static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count) { u8 i; u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; @@ -722,7 +639,7 @@ static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count) return FALSE; } -static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count) +static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count) { u8 i; u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; @@ -748,7 +665,7 @@ static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count) return FALSE; } -bool8 AddPyramidBagItem(u16 itemId, u16 count) +bool32 AddPyramidBagItem(u16 itemId, u16 count) { u16 i; @@ -826,7 +743,7 @@ bool8 AddPyramidBagItem(u16 itemId, u16 count) } } -bool8 RemovePyramidBagItem(u16 itemId, u16 count) +bool32 RemovePyramidBagItem(u16 itemId, u16 count) { u16 i; diff --git a/src/item_menu.c b/src/item_menu.c index 647b99eb2d..d6e3598b58 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -964,12 +964,11 @@ static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListM static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) { - u16 itemId; - u16 itemQuantity; - int offset; - if (itemIndex != LIST_CANCEL) { + u16 itemId, itemQuantity; + s32 offset; + if (gBagMenu->toSwapPos != NOT_SWAPPING) { // Swapping items, draw cursor at original item's location @@ -979,8 +978,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) BagMenu_PrintCursorAtPos(y, COLORID_NONE); } - itemId = GetBagItemId(gBagPosition.pocket, itemIndex); - itemQuantity = GetBagItemQuantity(gBagPosition.pocket, itemIndex); + GetBagItemIdAndQuantity(gBagPosition.pocket, itemIndex, &itemId, &itemQuantity); // Draw HM icon if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) @@ -1133,8 +1131,10 @@ void UpdatePocketItemList(u8 pocketId) switch (pocketId) { case POCKET_TM_HM: + SortPocket(pocketId, SORT_POCKET_TM_HM); + break; case POCKET_BERRIES: - SortBerriesOrTMHMs(pocketId); + SortPocket(pocketId, SORT_POCKET_BY_ITEM_ID); break; default: CompactItemsInBagPocket(pocketId); @@ -1287,8 +1287,7 @@ static void Task_BagMenu_HandleInput(u8 taskId) BagDestroyPocketScrollArrowPair(); BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); tListPosition = listPosition; - tQuantity = GetBagItemQuantity(gBagPosition.pocket, listPosition); - gSpecialVar_ItemId = GetBagItemId(gBagPosition.pocket, listPosition); + GetBagItemIdAndQuantity(gBagPosition.pocket, listPosition, &gSpecialVar_ItemId, (u16*)&tQuantity); sContextMenuFuncs[gBagPosition.location](taskId); break; } diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index 61413ebeca..fa769b160f 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -101,7 +101,7 @@ static const union AnimCmd *const sBagSpriteAnimTable[] = [POCKET_TM_HM] = sSpriteAnim_Bag_TMsHMs, [POCKET_BERRIES] = sSpriteAnim_Bag_Berries, [POCKET_KEY_ITEMS] = sSpriteAnim_Bag_KeyItems, - [POCKET_NONE] = sSpriteAnim_Bag_Closed, + [POCKET_DUMMY] = sSpriteAnim_Bag_Closed, }; static const union AffineAnimCmd sSpriteAffineAnim_BagNormal[] = @@ -474,7 +474,7 @@ void SetBagVisualPocketId(u8 bagPocketId, bool8 isSwitchingPockets) sprite->y2 = -5; sprite->callback = SpriteCB_BagVisualSwitchingPockets; sprite->sPocketId = bagPocketId; - StartSpriteAnim(sprite, POCKET_NONE); + StartSpriteAnim(sprite, POCKET_DUMMY); } else { diff --git a/src/party_menu.c b/src/party_menu.c index 16ea3522d7..18b577567f 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -426,7 +426,6 @@ static void Task_SacredAshDisplayHPRestored(u8); static void GiveItemOrMailToSelectedMon(u8); static void DisplayItemMustBeRemovedFirstMessage(u8); static void Task_SwitchItemsFromBagYesNo(u8); -static void RemoveItemToGiveFromBag(u16); static void CB2_WriteMailToGiveMonFromBag(void); static void GiveItemToSelectedMon(u8); static void Task_UpdateHeldItemSpriteAndClosePartyMenu(u8); @@ -6850,7 +6849,7 @@ static void GiveItemOrMailToSelectedMon(u8 taskId) { if (ItemIsMail(gPartyMenu.bagItem)) { - RemoveItemToGiveFromBag(gPartyMenu.bagItem); + RemoveBagItem(gPartyMenu.bagItem, 1); sPartyMenuInternal->exitCallback = CB2_WriteMailToGiveMonFromBag; Task_ClosePartyMenu(taskId); } @@ -6869,7 +6868,7 @@ static void GiveItemToSelectedMon(u8 taskId) item = gPartyMenu.bagItem; DisplayGaveHeldItemMessage(&gPlayerParty[gPartyMenu.slotId], item, FALSE, 1); GiveItemToMon(&gPlayerParty[gPartyMenu.slotId], item); - RemoveItemToGiveFromBag(item); + RemoveBagItem(item, 1); gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } } @@ -6948,7 +6947,7 @@ static void Task_HandleSwitchItemsFromBagYesNoInput(u8 taskId) { case 0: // Yes, switch items item = gPartyMenu.bagItem; - RemoveItemToGiveFromBag(item); + RemoveBagItem(item, 1); if (AddBagItem(sPartyMenuItemId, 1) == FALSE) { ReturnGiveItemToBagOrPC(item); @@ -6984,14 +6983,6 @@ static void DisplayItemMustBeRemovedFirstMessage(u8 taskId) gTasks[taskId].func = Task_UpdateHeldItemSpriteAndClosePartyMenu; } -static void RemoveItemToGiveFromBag(u16 item) -{ - if (gPartyMenu.action == PARTY_ACTION_GIVE_PC_ITEM) // Unused, never occurs - RemovePCItem(item, 1); - else - RemoveBagItem(item, 1); -} - // Returns FALSE if there was no space to return the item // but there always should be, and the return is ignored in all uses static bool8 ReturnGiveItemToBagOrPC(u16 item) diff --git a/test/bag.c b/test/bag.c index a3fb0318dd..6d0620dd6e 100644 --- a/test/bag.c +++ b/test/bag.c @@ -30,7 +30,7 @@ TEST("TMs and HMs are sorted correctly in the bag") additem ITEM_HM02; ); - SortBerriesOrTMHMs(POCKET_TM_HM); + SortPocket(POCKET_TM_HM, SORT_POCKET_TM_HM); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_TM01); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_TM05); @@ -67,7 +67,7 @@ TEST("Berries are sorted correctly in the bag") additem ITEM_CHERI_BERRY; ); - SortBerriesOrTMHMs(POCKET_BERRIES); + SortPocket(POCKET_BERRIES, SORT_POCKET_BY_ITEM_ID); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHERI_BERRY); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_ORAN_BERRY); @@ -102,11 +102,17 @@ TEST("Items are correctly compacted in the bag") ); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[0].quantity, 1); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].quantity, 1); EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[2].quantity, 1); EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[3].quantity, 1); EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[4].quantity, 1); EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[5].quantity, 1); EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); // Try removing the small items, check that everything is compacted correctly @@ -120,11 +126,13 @@ TEST("Items are correctly compacted in the bag") CompactItemsInBagPocket(POCKET_ITEMS); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[0].quantity, 1); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[1].quantity, 1); EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[2].quantity, 1); EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NONE); EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_NONE); EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_NONE); EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); - } From 9228826ae18823fa18e3226f0be54c295963a6c6 Mon Sep 17 00:00:00 2001 From: Linathan <35115312+LinathanZel@users.noreply.github.com> Date: Fri, 11 Jul 2025 13:14:19 -0400 Subject: [PATCH 131/248] New and polished battle animations (#7074) --- data/battle_anim_scripts.s | 2311 +++++++++++++++-- .../battle_anims/sprites/tatsugiri_curly.png | Bin 0 -> 1045 bytes .../battle_anims/sprites/tatsugiri_droopy.png | Bin 0 -> 1036 bytes .../sprites/tatsugiri_stretchy.png | Bin 0 -> 1040 bytes graphics/battle_anims/sprites/tera_symbol.png | Bin 0 -> 320 bytes include/battle_anim.h | 10 + include/constants/battle_anim.h | 10 + include/graphics.h | 8 + src/battle_anim_dark.c | 15 + src/battle_anim_effects_1.c | 7 +- src/battle_anim_effects_3.c | 35 + src/battle_anim_electric.c | 23 +- src/battle_anim_fire.c | 6 + src/battle_anim_ground.c | 5 +- src/battle_anim_ice.c | 3 +- src/battle_anim_mons.c | 73 +- src/battle_anim_new.c | 322 ++- src/battle_anim_poison.c | 43 +- src/battle_anim_rock.c | 5 +- src/data/battle_anim.h | 8 + src/graphics.c | 12 + test/battle/move_animations/all_anims.c | 257 ++ 22 files changed, 2904 insertions(+), 249 deletions(-) create mode 100644 graphics/battle_anims/sprites/tatsugiri_curly.png create mode 100644 graphics/battle_anims/sprites/tatsugiri_droopy.png create mode 100644 graphics/battle_anims/sprites/tatsugiri_stretchy.png create mode 100644 graphics/battle_anims/sprites/tera_symbol.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9d309ec154..8b504a37f9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -100,26 +100,16 @@ gBattleAnimMove_WakeUpSlap:: end gBattleAnimMove_HammerArm:: - loadspritegfx ANIM_TAG_IMPACT - loadspritegfx ANIM_TAG_ROCKS - loadspritegfx ANIM_TAG_SLAM_HIT - monbg ANIM_TARGET - setalpha 12, 8 - playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 - delay 1 - createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 - delay 3 - setarg 7, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, ANIM_TARGET, 1 - playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 - createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, 0, 0, 5 - clearmonbg ANIM_TARGET + loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @punch + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0, -32, 15 + delay 19 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_SquishTarget, 2 + waitforvisualfinish blendoff end @@ -322,6 +312,7 @@ gBattleAnimGeneral_Tailwind:: gBattleAnimMove_Acupressure:: loadspritegfx ANIM_TAG_ACUPRESSURE loadspritegfx ANIM_TAG_SPARK_2 + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER createsprite gAcupressureSpriteTemplate, ANIM_ATTACKER, 40, 0, -40, 40 waitforvisualfinish call ElectricityEffect @@ -377,29 +368,77 @@ gBattleAnimMove_CloseCombat:: loadspritegfx ANIM_TAG_HANDS_AND_FEET call SetHighSpeedBg createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_VITAL_THROW2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_MEGA_KICK2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_COMET_PUNCH, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_VITAL_THROW2, +63 - delay 10 + delay 2 createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 - createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 playsewithpan SE_M_MEGA_KICK2, +63 - delay 10 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 2 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 2, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 1 call UnsetHighSpeedBg clearmonbg ANIM_TARGET blendoff @@ -1179,7 +1218,7 @@ gBattleAnimMove_RockPolish:: setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 0, 12, RGB_BLACK waitforvisualfinish - loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 10, 7 + loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 10, 7 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -10, 3 delay 1 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 24, -19 @@ -1217,7 +1256,7 @@ gBattleAnimMove_RockPolish:: createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -21, -16 delay 2 waitforvisualfinish - playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -20, 9 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -10, -15 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 1, 17 @@ -1295,32 +1334,39 @@ gBattleAnimMove_PoisonJab:: end gBattleAnimMove_DarkPulse:: - loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_PURPLE_RING monbg ANIM_TARGET fadetobg BG_DARK waitbgfadein - delay 0 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - createvisualtask AnimTask_SpiteTargetShadow, 2 loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 - delay 8 - createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, RGB(9, 8, 7), 12 + createvisualtask AnimTask_SwayMon, ANIM_TARGET, 0, 6, 0x0800, 8, ANIM_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 4, 0, 12, RGB(30, 10, 13) + call DarkPulseParticle + call DarkPulseParticle + call DarkPulseParticle waitforvisualfinish + blendoff clearmonbg ANIM_TARGET - delay 1 restorebg waitbgfadein end +DarkPulseParticle: + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + createsprite gDarkPulseSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + return gBattleAnimMove_NightSlash:: loadspritegfx ANIM_TAG_SLASH @@ -1706,7 +1752,11 @@ gBattleAnimMove_EarthPower:: loadspritegfx ANIM_TAG_FIRE_PLUME createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET - delay 40 + delay 32 + fadetobg BG_FISSURE + waitbgfadeout + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 + waitbgfadein loopsewithpan 145, SOUND_PAN_TARGET 11, 3 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 @@ -1727,6 +1777,10 @@ gBattleAnimMove_EarthPower:: waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein end gBattleAnimMove_Switcheroo:: @@ -1925,40 +1979,30 @@ SnowSlide1: delay 2 return +@Credits to Skeli gBattleAnimMove_IceShard:: monbg ANIM_TARGET splitbgprio ANIM_TARGET setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS - fadetobg BG_ICE - waitbgfadein - createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 70, 0, 42, 35 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 58, 0, 30, 35 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, -12, 0, 22, 40 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 0, 0, 10, 40 - delay 5 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -30, 10, -12, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -42, 10, -24, 45 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -20, 10, -36, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 10, -24, 45 - delay 5 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, 20, 22, 45 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, -2, 20, 10, 45 - createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 20, -2, 30 - createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, 20, 10, 30 + loadspritegfx ANIM_TAG_IMPACT + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gIceShardSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 4 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, -31, 0, 7, RGB(0, 20, 31) createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 - waitforvisualfinish - delay 20 call IceCrystalEffectShort createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish - restorebg - waitbgfadein - clearmonbg ANIM_TARGET blendoff + clearmonbg ANIM_TARGET end gBattleAnimMove_ShadowClaw:: @@ -2700,62 +2744,69 @@ gBattleAnimMove_LeafStorm:: end gBattleAnimMove_PowerWhip:: - loadspritegfx ANIM_TAG_WHIP_HIT + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 10 delay 6 playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET - createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 - delay 6 - call SetImpactBackground - createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 + createsprite gSpinningVineSpriteTemplate, ANIM_ATTACKER, 2, -42, -25, 0, 0, 25 + createvisualtask AnimTask_IsTargetPlayerSide, 2 + jumpretfalse PowerWhipOnOpponent + goto PowerWhipOnPlayer +PowerWhipOnOpponent: + fadetobg BG_IMPACT_OPPONENT + goto PowerWhipContinue +PowerWhipOnPlayer: + fadetobg BG_IMPACT_PLAYER + goto PowerWhipContinue +PowerWhipContinue: + waitbgfadeout + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 + playsewithpan SE_BANG, SOUND_PAN_TARGET + waitforvisualfinish + delay 20 restorebg waitbgfadein + waitforvisualfinish end gBattleAnimMove_RockWrecker:: - jumpargeq 7, 1, RockWrecker_1 - fadetobg BG_ROCK_WRECKER - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 1, -1 - goto RockWrecker_2 -RockWrecker_1: - fadetobg BG_ROCK_WRECKER - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 0, -1 loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_REALLY_BIG_ROCK + loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_IMPACT - createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 - delay 3 + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + delay 10 + loopsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER, 10, 3 + waitforvisualfinish playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 130, 16, 0, 0, 0, 25, (1 << 8) | 1 + createsprite gReallyBigRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 131, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 8, 0, 40, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 5, 0, -20, 24, 14, 1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 0, 5, 20, -18, 14, 2 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, -5, 0, -20, -18, 14, 2 + call OpposingExplosion2 waitforvisualfinish - call UnsetPsychicBg - end -RockWrecker_2: - loadspritegfx ANIM_TAG_ROCKS - loadspritegfx ANIM_TAG_IMPACT - createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 - delay 3 - playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER - createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, 0, 0, 25, 257 - waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 - playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET - createsprite gRockFragmentSpriteTemplate ANIM_TARGET, 2, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, 0, 5, 20, -18, 14, 2 - createsprite gRockFragmentSpriteTemplate ANIM_ATTACKER, 2, -5, 0, -20, -18, 14, 2 waitforvisualfinish + blendoff call UnsetPsychicBg end @@ -3286,16 +3337,11 @@ gBattleAnimMove_AquaJet:: loadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_SPLASH loadspritegfx ANIM_TAG_SWEAT_BEAD - playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER - createsprite gDiveBallSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + createvisualtask AnimTask_AttackerStretchAndDisappear, 2 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER waitforvisualfinish - playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER - createsprite gDiveWaterSplashSpriteTemplate, ANIM_ATTACKER, 3, 0 - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets - call DiveSetUpWaterDroplets + delay 1 + createvisualtask AnimTask_SetAttackerInvisibleWaitForSignal, 2 loadspritegfx ANIM_TAG_WATER_IMPACT loadspritegfx ANIM_TAG_SMALL_BUBBLES monbg ANIM_DEF_PARTNER @@ -3310,6 +3356,8 @@ gBattleAnimMove_AquaJet:: delay 12 call RisingWaterHitEffect waitforvisualfinish + createvisualtask AnimTask_ExtremeSpeedMonReappear, 2 + waitforvisualfinish visible ANIM_ATTACKER clearmonbg ANIM_DEF_PARTNER blendoff @@ -4814,16 +4862,17 @@ gBattleAnimMove_ShellSmash:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_HANDS_AND_FEET - playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER - createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 10, 30 - createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 10, 30 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, -41, 0, 2, 819, 0, 10, 30 + createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 32, 0, 6, -819, 0, 10, 30 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x8, 0x1, 0x0 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + invisible ANIM_ATTACKER + playsewithpan SE_M_STRENGTH, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish - playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + visible ANIM_ATTACKER createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2 createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 1 createsprite gShellSmashPurpleRocksSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2 @@ -8572,17 +8621,22 @@ gBattleAnimMove_WaterShuriken:: loadspritegfx ANIM_TAG_IMPACT @hydro pump hit monbg ANIM_DEF_PARTNER splitbgprio ANIM_TARGET - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0x87, 0xffc0, SOUND_PAN_TARGET, 0x5, 0x5, 0x0, 0x5 - createsprite gWaterShurikenStarTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x27 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gWaterShurikenStarTemplate, ANIM_TARGET, 2, 0, 0, 20 delay 8 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 delay 5 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 delay 5 - createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x28, 0xf + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createsprite gWaterShurikenRingTemplate, ANIM_TARGET, 2, 0, 0, 20, 15 delay 12 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET - createsprite gWaterShurikenImpactTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 4, 1 + createsprite gWaterShurikenImpactTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -9019,17 +9073,34 @@ gBattleAnimMove_ElectricTerrain:: gBattleAnimMove_DazzlingGleam:: loadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_BLUE_STAR - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 13, RGB_WHITE - playsewithpan SE_M_TWISTER, SOUND_PAN_ATTACKER - @call 0x081D56B3 -> middle of GrantingStarsEffect + loadspritegfx ANIM_TAG_IMPACT + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 13, RGB(31, 25, 25) + loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 16, 3 createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 - delay 8 waitforvisualfinish createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 3, 0, 16, RGB_WHITE - delay 4 - playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(31, 28, 28) + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 21, 1 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_HYPER_BEAM, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB_WHITE + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB(31, 25, 25) waitforvisualfinish clearmonbg 0x0 blendoff @@ -9217,7 +9288,7 @@ gBattleAnimMove_OblivionWing:: waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 14, RGB_BLACK @Black waitforvisualfinish - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 call OblivionWingBeam call OblivionWingBeam createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 40, 1 @@ -10060,7 +10131,7 @@ gBattleAnimMove_IceHammer:: createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, RGB_BLACK waitforvisualfinish playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET - createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0xf + createsprite gIceHammerPunchStompTemplate, ANIM_TARGET, 3, 0, -32, 15 delay 19 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_SquishTarget, 0x2 @@ -12183,7 +12254,7 @@ gBattleAnimMove_MoongeistBeam:: createsprite gGrowingChargeOrbSpriteTemplate, ANIM_ATTACKER, 2, 0x0 @;Charge circle call MoongeistBeamCharge delay 32 - createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xCC, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, RGB_RED, 16, 0, 0 call MoongeistBeamOrbs @@ -14363,6 +14434,7 @@ SetSteelBeamBackground: goto SetHighSpeedBgFade SetSteelBeamBgPlayer: fadetobg BG_STEEL_BEAM_PLAYER + goto SetHighSpeedBgFade @Credits to Skeli gBattleAnimMove_ExpandingForce:: @@ -15621,37 +15693,55 @@ gBattleAnimMove_GlacialLance:: gBattleAnimMove_AstralBarrage:: - loadspritegfx ANIM_TAG_FLAT_ROCK - loadspritegfx ANIM_TAG_ICE_CRYSTALS - loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLAT_ROCK, 0, 10, 10, RGB(2, 1, 4) - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 10, 10, RGB(2, 1, 4) + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_SHADOW_BALL + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_ICE_CHUNK + loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATK_PARTNER splitbgprio ANIM_ATTACKER + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER setalpha 12, 8 fadetobg BG_GHOST waitbgfadein - createsprite gShakeMonOrPlatformSpriteTemplate, ANIM_ATTACKER, 2, 4, 1, 180, 1 - createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 20, 0, 5 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 200, 96, 1, 120 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + createvisualtask AnimTask_GrudgeFlames, 3 + createsprite gBlackHoleEclipseHoleUserSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_ATTACKER, 0 + createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 20, 248, 4, 112 + createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 130, 160, 2, 104 + createsprite gBlackHoleEclipseBlueRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 160, 192, 0, 96 + createsprite gBlackHoleEclipseBlackRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0 delay 8 - createsprite gSuperpowerRockSpriteTemplate, ANIM_ATTACKER, 41, 60, 288, 3, 88 - delay 74 - panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - call BlizzardIceCrystals - call BlizzardIceCrystals - playsewithpan SE_M_BLIZZARD2, SOUND_PAN_TARGET + unloadspritegfx ANIM_TAG_SHADOW_BALL + unloadspritegfx ANIM_TAG_THIN_RING + unloadspritegfx ANIM_TAG_ICE_CHUNK + unloadspritegfx ANIM_TAG_HANDS_AND_FEET waitforvisualfinish - playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET + loadspritegfx ANIM_TAG_WISP_FIRE + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + call AstralBarrageFlames1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 50, 1 + call AstralBarrageFlames2 + call AstralBarrageFlames3 + call AstralBarrageFlames4 + call AstralBarrageFlames5 + waitforvisualfinish + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createspriteontargets gCurseGhostSpriteTemplate, ANIM_TARGET, 3, 2, 8, -5, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 8, 0, 16, 1 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 0 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 42 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 84 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 126 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 168 + createsprite gWillOWispFireSpriteTemplate, ANIM_TARGET, 2, 210 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER restorebg @@ -15659,6 +15749,76 @@ gBattleAnimMove_AstralBarrage:: blendoff delay 1 end +AstralBarrageFlames1: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames2: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames3: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames4: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return +AstralBarrageFlames5: + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, -30, -20 @;Top left + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, -30, 10, 20 @;Bottom left + delay 2 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, -30, -20 @;Top right + delay 2 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 3, 0 + createsprite gSpriteTemplate_InfernalParadeFlame, ANIM_TARGET, 2, 30, 10, 20 @;Bottom right + delay 2 + return @Credits to Skeli @@ -17723,6 +17883,7 @@ gBattleAnimMove_IvyCudgel:: end IvyCudgelFire: loadspritegfx ANIM_TAG_IVY_CUDGEL_FIRE + loadspritegfx ANIM_TAG_SMALL_EMBER createsprite gIvyCudgelFireSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17730,10 +17891,14 @@ IvyCudgelFire: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + call FireSpreadEffect + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET waitforvisualfinish end IvyCudgelRock: loadspritegfx ANIM_TAG_IVY_CUDGEL_ROCK + loadspritegfx ANIM_TAG_ROCKS createsprite gIvyCudgelRockSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17741,10 +17906,16 @@ IvyCudgelRock: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 waitforvisualfinish end IvyCudgelWater: loadspritegfx ANIM_TAG_IVY_CUDGEL_WATER + loadspritegfx ANIM_TAG_SPLASH createsprite gIvyCudgelWaterSpriteTemplate, ANIM_TARGET, 2 delay 60 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 3, 0, 12, 4 @@ -17752,6 +17923,8 @@ IvyCudgelWater: createvisualtask AnimTask_SquishTarget, 0x2 delay 6 call WoodHammerImpact + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createsprite gDiveWaterSplashSpriteTemplate, ANIM_TARGET, 3, 1 waitforvisualfinish end @@ -18409,30 +18582,46 @@ gBattleAnimMove_RevivalBlessing:: goto gBattleAnimMove_LunarBlessing gBattleAnimMove_TeraStarstorm:: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_STARSTORM loadspritegfx ANIM_TAG_YELLOW_STAR loadspritegfx ANIM_TAG_IMPACT fadetobg BG_COSMIC waitbgfadein + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, RGB_WHITE + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 + delay 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 20 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + delay 20 playsewithpan SE_FALL, SOUND_PAN_ATTACKER - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 - call TeraStarstormCreateBeam - delay 2 jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar goto TeraStarstormSingle TeraStarstormStellar: @@ -18440,67 +18629,86 @@ TeraStarstormStellar: TeraStarstormSingle: createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -16, 8, ANIM_TARGET, 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 delay 3 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 16, 8, ANIM_TARGET, 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 delay 2 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 0, ANIM_TARGET, 2 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 16, ANIM_TARGET, 2 waitforvisualfinish restorebg waitbgfadeout end TeraStarstormDouble: + loadspritegfx ANIM_TAG_EXPLOSION_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION_2, 0, 12, 12, RGB_WHITE createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -8, 0, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 2 @@ -18509,7 +18717,9 @@ TeraStarstormDouble: delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -16, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -16, 0, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 2 @@ -18518,7 +18728,9 @@ TeraStarstormDouble: delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 16, 8, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 16, 8, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 2 @@ -18527,21 +18739,33 @@ TeraStarstormDouble: delay 3 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 24, 0, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 24, 16, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, 24, 16, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -24, 16, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -24, 16, ANIM_DEF_PARTNER, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 delay 5 - playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 - createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -24, -8, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_DEF_PARTNER, 2, -24, -8, ANIM_DEF_PARTNER, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 3, 50, 1 + call ExpandingForceExplosionGeyser + delay 5 + call ExpandingForceExplosionGeyser + delay 5 waitforvisualfinish restorebg waitbgfadeout @@ -19078,7 +19302,7 @@ gBattleAnimMove_BlazingTorque:: call FireSpreadEffect createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 - waitforvisualfinish + @waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 @@ -19117,17 +19341,15 @@ gBattleAnimMove_WickedTorque:: playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, 0 createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 - delay 2 - createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 3, 10, 0, 0 - createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 - waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE + delay 2 + createsprite gFoulPlayRingTemplate, ANIM_ATTACKER, 3, 0, 0, 256, 0 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 @@ -19165,24 +19387,19 @@ gBattleAnimMove_NoxiousTorque:: createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 - delay 5 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -8, -44, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -46, -28, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20 - delay 5 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 0, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20 - createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -16, 44, 20 - delay 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 - waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + delay 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 0, 40, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 46, 9, 20 + delay 5 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -43, -12, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 16, -46, 20 + waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 @@ -19220,7 +19437,7 @@ gBattleAnimMove_CombatTorque:: delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 - waitforvisualfinish + @waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 @@ -19256,8 +19473,6 @@ gBattleAnimMove_MagicalTorque:: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 16, 16, RGB_WHITE createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 - delay 3 - waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 @@ -19268,11 +19483,11 @@ gBattleAnimMove_MagicalTorque:: delay 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 - waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + delay 3 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_WHITE waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 @@ -19287,9 +19502,1652 @@ gBattleAnimMove_MagicalTorque:: end gBattleAnimMove_TeraBlast:: + jumpifmovetypeequal TYPE_NORMAL, TeraBlastNormal + jumpifmovetypeequal TYPE_FIGHTING, TeraBlastFighting + jumpifmovetypeequal TYPE_FLYING, TeraBlastFlying + jumpifmovetypeequal TYPE_POISON, TeraBlastPoison + jumpifmovetypeequal TYPE_GROUND, TeraBlastGround + jumpifmovetypeequal TYPE_ROCK, TeraBlastRock + jumpifmovetypeequal TYPE_BUG, TeraBlastBug + jumpifmovetypeequal TYPE_GHOST, TeraBlastGhost + jumpifmovetypeequal TYPE_STEEL, TeraBlastSteel + jumpifmovetypeequal TYPE_FIRE, TeraBlastFire + jumpifmovetypeequal TYPE_WATER, TeraBlastWater + jumpifmovetypeequal TYPE_GRASS, TeraBlastGrass + jumpifmovetypeequal TYPE_ELECTRIC, TeraBlastElectric + jumpifmovetypeequal TYPE_PSYCHIC, TeraBlastPsychic + jumpifmovetypeequal TYPE_ICE, TeraBlastIce + jumpifmovetypeequal TYPE_DRAGON, TeraBlastDragon + jumpifmovetypeequal TYPE_DARK, TeraBlastDark + jumpifmovetypeequal TYPE_FAIRY, TeraBlastFairy + jumpifmovetypeequal TYPE_STELLAR, TeraBlastStellar + end +TeraBlastNormal: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 + waitforvisualfinish + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 1, 15, 0, 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 0, 4, 50, 1 + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 50, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 0, 11, RGB(25, 25, 25) + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + call HyperBeamOrbs + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 2, 11, 0, RGB(25, 25, 25) + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastFighting: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB(29, 24, 2) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 24, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -6, 18, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 16, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 21, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 20, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -32, 23, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 2 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 17, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -80, 16, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -96, 21, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 24, 0, 0, 10, 1, ANIM_FOOT_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -6, 18, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -64, 16, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 21, 0, 0, 10, 1, ANIM_FOOT_2, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -48, 20, 0, 0, 10, 1, ANIM_FIST_1, 1 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, -32, 23, 0, 0, 10, 1, ANIM_CHOP, 1 + delay 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_TARGET + waitbgfadein + call UnsetPsychicBg + waitforvisualfinish + end +TeraBlastPoison: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 2 + createsprite sPoisonSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_GUNK_SHOT + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_PURPLE + call PoisonBubblesEffect + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + call PoisonBubblesEffect + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 42, 27, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -27, 44, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, 39, -28, 20 + createsprite gSludgeBombHitParticleSpriteTemplate, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_DIG, SOUND_PAN_TARGET + delay 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + delay 0 + call UnsetSkyBg + end +TeraBlastFlying: + loadspritegfx ANIM_TAG_AIR_WAVE_2 + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 12, 12, RGB_WHITE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + delay 2 + createsprite gAirWaveSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_BLIZZARD2, SOUND_PAN_ATTACKER + waitforvisualfinish + call SetSkyBg + splitbgprio ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call TeraBlastFlyingBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 2, 0, 12, RGB_WHITE + call TeraBlastFlyingBeam + call TeraBlastFlyingBeam + delay 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + delay 0 + call UnsetSkyBg + end +TeraBlastRock: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB(29, 24, 2) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sRockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xF000, 0, 0, -1 + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_TARGET + call TeraBlastRock1 + delay 3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + call TeraBlastRock2 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastRock3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 2 + delay 3 + call TeraBlastRock4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + delay 3 + call TeraBlastRock1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastRock2 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + delay 3 + call TeraBlastRock3 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastBug: + loadspritegfx ANIM_TAG_HOLLOW_ORB + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_GREEN + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB_GREEN, 14, 0, 3 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + delay 2 + createsprite gDragonDanceOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + waitforvisualfinish + monbg ANIM_DEF_PARTNER + call SetBugBg + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30 + delay 1 + createsprite gMaxFlutterbyButterflySpriteTemplate, ANIM_ATTACKER, 2, 3, 0, -20 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + call UnsetBugBg + end +TeraBlastGround: + loadspritegfx ANIM_TAG_MUD_SAND + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(29, 24, 2) + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + delay 2 + createsprite sMudSandSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_FISSURE + waitbgfadeout + createvisualtask AnimTask_PositionFissureBgOnBattler, 5, ANIM_TARGET, 5, -1 + waitbgfadein + createvisualtask AnimTask_HorizontalShake, 3, ANIM_TARGET, 10, 50 + playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET + delay 40 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 3, 25, 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + delay 1 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + loopsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET 11, 3 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 2, 1, -27, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_TARGET, 66, 1, 0, 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 66, 0, 0, 4 + waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + end +TeraBlastGhost: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_GHOST + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 46, 1 + delay 6 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, -40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 0, 40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_PURPLE + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 0, -40, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, -20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, -20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, 20, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -20, 30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 20, -30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -20, -30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 30, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, -40, 0, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 2 + createsprite gGhostProjectileSpriteTemplate, ANIM_TARGET, 2, 40, 0, 16 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 6 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastSteel: + loadspritegfx ANIM_TAG_METAL_BALL + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_REALLY_BIG_ROCK + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROCKS, 0, 12, 12, RGB(25, 25, 25) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_REALLY_BIG_ROCK, 0, 12, 12, RGB(25, 25, 25) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(25, 25, 25) + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite sMetalBallSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + waitforvisualfinish + call SetSteelBeamBackground + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + createsprite gContinentalCrushGrowingRockSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call ContinentalCrushStockpileRocks + delay 30 + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, RGB_BLACK + waitforvisualfinish + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + createsprite gReallyBigRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastFire: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(31, 0, 0) + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + waitforvisualfinish + monbg ANIM_ATTACKER + setalpha 14, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 12, 0 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue TeraBlastFireOnPlayer + goto TeraBlastFireOnOpponent +TeraBlastFireOnOpponent: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastFireOnPlayer: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 12, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TeraBlastWater: + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_FIRE_PLUME + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FIRE_PLUME, 0, 12, 12, RGB_BLUE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_BLUE + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + delay 2 + createsprite gHydroPumpSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + waitforvisualfinish + fadetobg BG_WATER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_TARGET + call TeraBlastWater1 + delay 3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + call TeraBlastWater2 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastWater3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 2 + delay 3 + call TeraBlastWater4 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + delay 3 + call TeraBlastWater1 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -8, 16 @; For Meteor 4 + createvisualtask AnimTask_HorizontalShake, 5, 5, 2, 1 + delay 3 + call TeraBlastWater2 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 4, 2 + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 40, 16 @; For Meteor 1 + delay 3 + call TeraBlastWater3 + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + createsprite gDragonRageFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 21, 16 @; For Meteor 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastGrass: + loadspritegfx ANIM_TAG_LEAF + loadspritegfx ANIM_TAG_FLOWER + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_AIR_WAVE_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(0, 31, 0) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_AIR_WAVE_2, 0, 12, 12, RGB_GREEN + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite gBloomDoomPetalSpinSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_LEAF_STORM + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0A00, 0, 1, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call AeroblastBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1 + call AeroblastBeam + call AeroblastBeam + call AeroblastBeam + call AeroblastBeam + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastElectric: + loadspritegfx ANIM_TAG_SHOCK + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SHOCK_3 + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_YELLOW + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 2 + createsprite sCirclingShockSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_THUNDER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0xff00, 0, 1, -1 + waitbgfadein + loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 3, 10 + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createsprite gThunderboltOrbSpriteTemplate, ANIM_TARGET, 3, 44, 0, 0, 3 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 0, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 64, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 128, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 32, 44, 192, 40, 2, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 32, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 96, 40, 1, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 160, 40, 0, -32765 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0, 0, 16, 44, 224, 40, 2, -32765 + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 2, 2, RGB_BLACK + delay 6 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 6, RGB_BLACK + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 6, 0, RGB_BLACK + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastPsychic: + loadspritegfx ANIM_TAG_PINKVIO_ORB + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PINKVIO_ORB, 0, 12, 12, RGB_PURPLE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_PURPLE + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + delay 2 + createsprite gPinkVioletOrbSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_PSYCHIC + waitbgfadeout + createvisualtask AnimTask_SetPsychicBackground, 5 + waitbgfadein + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 30, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 30, ANIM_TARGET, 1 + waitforvisualfinish + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastIce: + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(12, 26, 31) @ light blue + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + delay 2 + createsprite sIceCrystalSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_ICE + waitbgfadein + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192 + delay 5 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 + delay 17 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1 + waitforvisualfinish + delay 15 + call IceCrystalEffectShort + delay 5 + call IceCrystalEffectShort + delay 5 + call IceCrystalEffectShort + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastDragon: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_EMBER, 0, 12, 12, RGB(10, 25, 31) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB(10, 25, 31) + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_FIRE_2 + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x1000, 0, 0, -1 + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue TeraBlastDragonOnPlayer + goto TeraBlastDragonOnOpponent +TeraBlastDragonOnOpponent: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + call FireSpreadBlast + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastDragonOnPlayer: + panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 43, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB(31, 0, 0) + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + call FireSpreadBlastOpponent + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastDark: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PURPLE_FLAME, 0, 12, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 12, 12, RGB_BLACK + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_BLACK + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 2 + createsprite gPurpleFlameSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_DARK + waitbgfadein + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1 + delay 6 + call TeraBlastFlyingBeam + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 50, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 2, 0, 12, RGB_BLACK + call TeraBlastFlyingBeam + call TeraBlastFlyingBeam + delay 8 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastFairy: + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_RED_HEART + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_MAGENTA + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 2 + createsprite sPinkHeartSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_TWINKLE_TACKLE + waitbgfadein + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 4, 4, 0, 12, RGB_MAGENTA + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + call TeraBlastFairyHearts + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 8, 8, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_TARGET, 1 + delay 32 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call TeraBlastFairyHearts + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + blendoff + call UnsetPsychicBg + end +TeraBlastStellar: + loadspritegfx ANIM_TAG_YELLOW_STAR + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_EXPLOSION, 0, 12, 12, RGB_WHITE + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 16 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 20 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + delay 2 + createsprite gYellowStarSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 24 + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + waitforvisualfinish + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + delay 3 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + playsewithpan SE_M_SWIFT, SOUND_PAN_TARGET + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 50, 1 + call EternabeamGeyser + delay 5 + call EternabeamGeyser + delay 5 + waitforvisualfinish + restorebg + waitbgfadeout + end + +FireSpreadBlast: + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 5, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -10, -5, 45 + delay 2 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 10, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -20, -10, 45 + delay 2 + return +FireSpreadBlastOpponent: + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0, 0, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5, 10, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -5, -10, 45 + delay 2 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 10, 20, 45 + createsprite gFireSpreadBlastSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, -10, -20, 45 + delay 2 + return + +TeraBlastFlyingBeam: + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + delay 2 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET + createsprite gTeraBlastFlyingSpriteTemplate, ANIM_TARGET, 2, 0, 0, 16 + return + +TeraBlastWater1: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 2 + return +TeraBlastWater2: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 2 + return +TeraBlastWater3: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 2 + return +TeraBlastWater4: + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 2 + createsprite gTeraBlastWaterSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 2 + return + +TeraBlastRock1: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -48, -64, 40, 32, 25 + delay 4 + return +TeraBlastRock2: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -112, -64, -8, 32, 25 + delay 4 + return +TeraBlastRock3: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, 24, 32, 25 + delay 4 + return +TeraBlastRock4: + createsprite gTeraBlastRockSpriteTemplate, ANIM_ATTACKER, 3, -80, -64, -8, 32, 25 + delay 4 + return + +TeraBlastFairyHearts: + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 + return + gBattleAnimMove_OrderUp:: + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_ENCORE, SOUND_PAN_ATTACKER + createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 6 + createvisualtask AnimTask_GetCommanderType, 2 + delay 25 + jumpreteq ANIM_ORDER_UP_NONE, OrderUpNone + jumpreteq ANIM_ORDER_UP_CURLY, OrderUpCurly + jumpreteq ANIM_ORDER_UP_DROOPY, OrderUpDroopy + jumpreteq ANIM_ORDER_UP_STRETCHY, OrderUpStretchy +OrderUpNone: + loadspritegfx ANIM_TAG_TATSUGIRI_CURLY + loadspritegfx ANIM_TAG_TATSUGIRI_DROOPY + loadspritegfx ANIM_TAG_TATSUGIRI_STRETCHY + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end +OrderUpCurly: + loadspritegfx ANIM_TAG_TATSUGIRI_CURLY + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriCurlySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end +OrderUpDroopy: + loadspritegfx ANIM_TAG_TATSUGIRI_DROOPY + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriDroopySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end +OrderUpStretchy: + loadspritegfx ANIM_TAG_TATSUGIRI_STRETCHY + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, -20, 12, 64, 50, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 0, 12, 64, 46, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 2 + createsprite gOrderUpTatsugiriStretchySpriteTemplate, ANIM_TARGET, 2, 20, 12, 64, 42, 0 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + end + gBattleAnimMove_MatchaGotcha:: - end @to do + loadspritegfx ANIM_TAG_POISON_BUBBLE + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0 + waitforvisualfinish + delay 10 + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 27, 2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, RGB_GREEN + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 2, 3 + waitforvisualfinish + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 18, 2 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 28, 10, 2, 4 + waitforvisualfinish + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 9, 4 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 32, 10, 4, 5 + waitforvisualfinish + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 + jumpifdoublebattle MatchaGotchaDouble + goto MatchaGotchaSingle + +MatchaGotchaSingle: + call MatchaGotchaProjectile + call MatchaGotchaProjectile + loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 8, 2 + call MatchaGotchaProjectile + call MatchaGotchaProjectile + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + delay 28 + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 0, 0) + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 2, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -5, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 20, 15, 55, FALSE + waitforvisualfinish + end + +MatchaGotchaDouble: + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + call MatchaGotchaDoubleProjectile + call MatchaGotchaDoubleProjectile + loopsewithpan SE_FALL, SOUND_PAN_ATTACKER, 8, 2 + call MatchaGotchaDoubleProjectile + call MatchaGotchaDoubleProjectile + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + waitforvisualfinish + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 2, 0, 12, RGB(31, 0, 0) + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 10, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -20, 15, 55, 2 + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 5, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -10, 15, 55, 2 + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, 0 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, 30, 15, 55, 2 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -10, -30, 15, 55, 2 + waitforvisualfinish + end + +MatchaGotchaProjectile: + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0 + delay 3 + return + +MatchaGotchaDoubleProjectile: + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0, 0 + createsprite gSludgeProjectileSpriteTemplate, ANIM_TARGET, 2, 20, 0, 60, 0, TRUE + delay 3 + return @@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@ gBattleAnimMove_None:: @@ -29761,7 +31619,6 @@ gBattleAnimGeneral_TeraCharge:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 call TeraChargeParticles playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER clearmonbg ANIM_ATK_PARTNER @@ -29778,14 +31635,36 @@ TeraChargeParticles: return gBattleAnimGeneral_TeraActivate:: + loadspritegfx ANIM_TAG_TERA_SYMBOL + loadspritegfx ANIM_TAG_SPARKLE_6 + 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 createvisualtask SoundTask_PlayNormalCry, 0 + createsprite gTeraSymbolSpriteTemplate ANIM_ATTACKER, 41, 0, 0, ANIM_ATTACKER + delay 2 + call TeraSpinEffect + call TeraSpinEffect + waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end +TeraSpinEffect: + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 528, 30, 13, 50, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 0, 480, 20, 16, -46, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 576, 20, 8, 42, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 15, 400, 25, 11, -42, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 512, 25, 16, 46, 0 + delay 2 + createsprite gTeraSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 464, 30, 15, -50, 0 + delay 2 + return + gBattleAnimGeneral_RestoreBg:: restorebg waitbgfadein diff --git a/graphics/battle_anims/sprites/tatsugiri_curly.png b/graphics/battle_anims/sprites/tatsugiri_curly.png new file mode 100644 index 0000000000000000000000000000000000000000..8642833f8f44cdfb156c4c9ea43ca6fe472fe45e GIT binary patch literal 1045 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy>?NMQuIw+_*x96+Z|^#t2ow@8 zag8Vm&QB{TPb^AhaQATm8lzB_TBKmCXHwX@!lvNA9*GX(gAxE3E>0+cFKm;axszd6A8aAoR?7eD^5YU%MZPf96VyMD)? zKYu`GjDpb+7>*%OcFRT_=r6`3Z+DmfOW8ji1#&VyT^vIy=DfY&D0D!9!#R*?V@CD= z-(oS%dmaA2(8`a|`1HM;@5hZ^b;cUT&CCI!z2a62v!=1jsCMMCUsEVIdM{zBP-yuw z?mg3YhKp;y>puD@x#(VMqWRq|jOE)>wmmp`?cX}Ll(W~qGd*-<3M$#RqZJggp00i_ I>zopr09Ar<7ytkO literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/tatsugiri_droopy.png b/graphics/battle_anims/sprites/tatsugiri_droopy.png new file mode 100644 index 0000000000000000000000000000000000000000..ae478dec5c8dd7024cb0b92047700f343eb8b783 GIT binary patch literal 1036 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy>?NMQuIw+_*x6(xGiNTj0~8W3 zag8Vm&QB{TPb^AhaQATm8lzB_TBKmCXHwX@!lvNA9*GX(gAxE3E>0+dQhDg5*2Pp-20A;;9WdDC9J__22V4v^MSFd72G zIs_^Y{kH{rkTJ>I-R1vM_D@HFoCHr7$B>FSZzmWEH5hQP>}+=V|38UwYv6`$C;0B> zawu$y_#gWootIs|&{Wuq_sUp51)yC~6`}TwbnKsc1_xSQt9=UyFpLipr?ZdoD q)eeU7TVjs*FQ{z&7REDc&2xr*TudyfN_^`;A?xYt=d#Wzp$P!>*k>F7 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/tatsugiri_stretchy.png b/graphics/battle_anims/sprites/tatsugiri_stretchy.png new file mode 100644 index 0000000000000000000000000000000000000000..650807db0e540e4b674f35b95c9dabfe9340242b GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy>?NMQuIw+_*x6(y*jtx!1BJv( zTq8~zxRIPgaA x(VHsOqgy+)XB~Qfgf;hrir(w>852#`J!cJJW!w~y7nKAGT2EI$mvv4FO#s?ySw~f%Kqsnkdxx+;uumfXKA1#-vI@VX8DM^ zg#Z6fJe=eA^vJa%6GSeF3BJ6bWNjx9wz*}}dX7^HB73FVdQ I&MBb@0Ktxb-T(jq literal 0 HcmV?d00001 diff --git a/include/battle_anim.h b/include/battle_anim.h index e62c170cc0..7cef5445da 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -93,6 +93,7 @@ void AnimWeatherBallUp(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite); void AnimSpinningSparkle(struct Sprite *sprite); void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y); +void SetToPartnerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y); void DestroySpriteAndMatrix(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets); @@ -230,6 +231,8 @@ void AnimMudSportDirt(struct Sprite *sprite); void AnimDirtScatter(struct Sprite *sprite); void AnimMudSportDirtRising(struct Sprite *sprite); void AnimDirtPlumeParticle(struct Sprite *); +void AnimBoneHitProjectile(struct Sprite *sprite); +extern const union AnimCmd *const sAnims_MudSlapMud[]; extern const union AffineAnimCmd *const gAffineAnims_SpinningBone[]; // battle_anim_throw.c @@ -268,6 +271,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite *sprite); void AnimTeraStarstormStars(struct Sprite *sprite); void AnimGrantingStars(struct Sprite *sprite); void AnimFollowMeFinger(struct Sprite *sprite); +void AnimPoisonJabProjectile(struct Sprite *sprite); extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; extern const union AnimCmd *const gPowerAbsorptionOrbAnimTable[]; extern const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[]; @@ -466,6 +470,7 @@ void AnimElectricity(struct Sprite *); void AnimTask_VoltSwitch(struct Sprite* sprite); extern const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[]; extern const union AffineAnimCmd *const gAffineAnims_FlashingSpark[]; +extern const union AnimCmd *const sAnims_CirclingElectricShock[]; extern const union AnimCmd *const gAnims_ThunderboltOrb[]; extern const union AnimCmd *const gAnims_ElectricPuff[]; extern const union AnimCmd *const gAnims_ElectricChargingParticles[]; @@ -490,6 +495,8 @@ extern const union AnimCmd *const gAnims_FlyingRock[]; extern const union AffineAnimCmd *const gAffineAnims_Whirlpool[]; extern const union AffineAnimCmd *const gAffineAnims_BasicRock[]; extern const union AnimCmd *const gAnims_FlyingRock[]; +extern const union AnimCmd *const sAnims_BasicRock[]; +void AnimRockTomb(struct Sprite *sprite); void AnimParticleInVortex(struct Sprite *sprite); void AnimFallingRock(struct Sprite *sprite); void AnimRaiseSprite(struct Sprite *sprite); @@ -557,6 +564,9 @@ void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPi extern const union AffineAnimCmd *const gSpriteAffineAnimTable_PrimalSymbol[]; extern const union AffineAnimCmd *const gSpriteAffineAnimTable_MegaSymbol[]; +// battle_anim_ice.c +void AnimIceBeamParticle(struct Sprite *sprite); + // battle_anim_bug.c void AnimTranslateStinger(struct Sprite *sprite); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c85dcc9fe7..3d514b1936 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -419,6 +419,10 @@ #define ANIM_TAG_PINKVIO_ORB (ANIM_SPRITES_START + 405) #define ANIM_TAG_STARSTORM (ANIM_SPRITES_START + 406) #define ANIM_TAG_SALT_PARTICLE (ANIM_SPRITES_START + 407) +#define ANIM_TAG_TERA_SYMBOL (ANIM_SPRITES_START + 408) +#define ANIM_TAG_TATSUGIRI_CURLY (ANIM_SPRITES_START + 409) +#define ANIM_TAG_TATSUGIRI_DROOPY (ANIM_SPRITES_START + 410) +#define ANIM_TAG_TATSUGIRI_STRETCHY (ANIM_SPRITES_START + 411) // battlers #define ANIM_ATTACKER 0 @@ -657,6 +661,12 @@ #define ANIM_SURF_PAL_MUDDY_WATER 1 #define ANIM_SURF_PAL_SLUDGE_WAVE 2 +// Order Up palettes for Commander +#define ANIM_ORDER_UP_NONE 0 +#define ANIM_ORDER_UP_CURLY 1 +#define ANIM_ORDER_UP_DROOPY 2 +#define ANIM_ORDER_UP_STRETCHY 3 + // Flags given to various functions to indicate which palettes to consider. // Handled by UnpackSelectedBattlePalettes #define F_PAL_BG (1 << 0) diff --git a/include/graphics.h b/include/graphics.h index 262afd5337..82bf2691eb 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2700,6 +2700,8 @@ extern const u32 gBattleAnimSpriteGfx_MegaParticles[]; extern const u16 gBattleAnimSpritePal_MegaParticles[]; extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; extern const u16 gBattleAnimSpritePal_MegaSymbol[]; +extern const u32 gBattleAnimSpriteGfx_TeraSymbol[]; +extern const u16 gBattleAnimSpritePal_TeraSymbol[]; extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; extern const u16 gBattleAnimSpritePal_FlashCannonBall[]; extern const u32 gBattleAnimSpriteGfx_WaterGun[]; @@ -2712,6 +2714,12 @@ extern const u32 gBattleAnimSpriteGfx_TeraCrystal[]; extern const u16 gBattleAnimSpritePal_TeraCrystal[]; extern const u32 gBattleAnimSpriteGfx_TeraShatter[]; extern const u16 gBattleAnimSpritePal_TeraShatter[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriCurly[]; +extern const u16 gBattleAnimSpritePal_TatsugiriCurly[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriDroopy[]; +extern const u16 gBattleAnimSpritePal_TatsugiriDroopy[]; +extern const u32 gBattleAnimSpriteGfx_TatsugiriStretchy[]; +extern const u16 gBattleAnimSpritePal_TatsugiriStretchy[]; // New Battle Anim Particles extern const u32 gBattleAnimSpriteGfx_AlphaStone[]; diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 12a75efa31..f8f2dcd0d0 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -257,6 +257,21 @@ const struct SpriteTemplate gPunishmentImpactSpriteTemplate = .callback = AnimPunishment, }; +// See AnimShadowBall in battle_anim_ghost.c for more specifics +// arg 0: duration step 1 (attacker -> center) +// arg 1: duration step 2 (spin center) +// arg 2: duration step 3 (center -> target) +const struct SpriteTemplate gDarkPulseSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_RING, + .paletteTag = ANIM_TAG_PURPLE_RING, + .oam = &gOamData_AffineDouble_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimShadowBall, +}; + // arg 0: x pixel offset // arg 1: y pixel offset // arg 2: Something diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index bc3b4a2c44..98530b4f0a 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -154,7 +154,6 @@ static void AnimDoubleTeam(struct Sprite *); static void AnimNightSlash(struct Sprite *); static void AnimRockPolishStreak(struct Sprite *); static void AnimRockPolishSparkle(struct Sprite *); -static void AnimPoisonJabProjectile(struct Sprite *); static void AnimNightSlash(struct Sprite *); static void AnimPluck(struct Sprite *); static void AnimAcrobaticsSlashes(struct Sprite *); @@ -5190,7 +5189,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - if (IsDoubleBattle()) + if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimAttacker, TRUE, &a, &b); } @@ -5202,7 +5201,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) } else { - if (IsDoubleBattle()) + if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &a, &b); } @@ -7450,7 +7449,7 @@ static void AnimRockPolishSparkle(struct Sprite *sprite) // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration -static void AnimPoisonJabProjectile(struct Sprite *sprite) +void AnimPoisonJabProjectile(struct Sprite *sprite) { s16 targetXPos; s16 targetYPos; diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 409244ccac..6efac4c79b 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1325,6 +1325,41 @@ const struct SpriteTemplate gTeraCrystalSpreadSpriteTemplate = .callback = AnimTask_TeraCrystalShatter, }; +// See AnimSpriteOnMonPos in battle_anim_mons.c for more specifics +// Reuses the Mega Symbol affine animation seen in Mega Evolution +// gBattleAnimArgs 0-3 used +// 0, 1 used for position +// 2, 3 as some control variables +const struct SpriteTemplate gTeraSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_TERA_SYMBOL, + .paletteTag = ANIM_TAG_TERA_SYMBOL, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_MegaSymbol, + .callback = AnimSpriteOnMonPos, +}; + +// Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb +// args[0] - initial x offset +// args[1] - initial y offset +// args[2] - y increment +// args[3] - duration +// args[4] - increments some sin parameter +// args[5] - fixed sin parameter +// args[6] - attacker or target +const struct SpriteTemplate gTeraSmokeSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_6, + .paletteTag = ANIM_TAG_SPARKLE_6, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex, +}; + const struct SpriteTemplate gPinkPetalVortexTemplate = { .tileTag = ANIM_TAG_PINK_PETAL, diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index 593f3830ba..269d582f3b 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -10,7 +10,7 @@ static void AnimLightning(struct Sprite *); static void AnimLightning_Step(struct Sprite *); static void AnimUnusedSpinningFist(struct Sprite *); static void AnimUnusedSpinningFist_Step(struct Sprite *); -static void AnimUnusedCirclingShock(struct Sprite *); +static void AnimCirclingElectricShock(struct Sprite *); static void AnimZapCannonSpark_Step(struct Sprite *); static void AnimThunderboltOrb(struct Sprite *); static void AnimThunderboltOrb_Step(struct Sprite *); @@ -83,7 +83,9 @@ static const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate = .callback = AnimUnusedSpinningFist, }; -static const union AnimCmd sAnim_UnusedCirclingShock[] = +// Previously an unused function named sAnim_CirclingElectricShock +// Now used for Tera Blast Electric +static const union AnimCmd sAnim_CirclingElectricShock[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), @@ -94,21 +96,24 @@ static const union AnimCmd sAnim_UnusedCirclingShock[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_UnusedCirclingShock[] = +// Previously an unused function named sAnims_UnusedCirclingShock +// Now used for Tera Blast Electric +const union AnimCmd *const sAnims_CirclingElectricShock[] = { - sAnim_UnusedCirclingShock, + sAnim_CirclingElectricShock, }; -// Unused -static const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate = +// Previously named sUnusedCirclingShockSpriteTemplate +// Still unused, but renamed for consistency +static const struct SpriteTemplate sCirclingElectricShockSpriteTemplate = { .tileTag = ANIM_TAG_SHOCK, .paletteTag = ANIM_TAG_SHOCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_UnusedCirclingShock, + .anims = sAnims_CirclingElectricShock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimUnusedCirclingShock, + .callback = AnimCirclingElectricShock, }; const struct SpriteTemplate gSparkElectricitySpriteTemplate = @@ -675,7 +680,7 @@ static void AnimUnusedSpinningFist_Step(struct Sprite *sprite) DestroySpriteAndMatrix(sprite); } -static void AnimUnusedCirclingShock(struct Sprite *sprite) +static void AnimCirclingElectricShock(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 276b8c8c07..5d34d47661 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -1296,6 +1296,12 @@ static void AnimWillOWispFire(struct Sprite *sprite) sprite->data[3] += 0xC0 * 2; sprite->data[4] += 0xA0; + if (IsDoubleBattle() + && !IsContest() + && IsBattlerAlive(BATTLE_PARTNER(gBattleAnimTarget)) + && GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + sprite->x2 = Sin(sprite->data[1], sprite->data[3] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[4] >> 8); diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index eb96414b55..1ba6fc0b62 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -7,7 +7,6 @@ #include "constants/rgb.h" static void AnimBonemerangProjectile(struct Sprite *); -static void AnimBoneHitProjectile(struct Sprite *); static void AnimDirtPlumeParticle_Step(struct Sprite *); static void AnimDigDirtMound(struct Sprite *); static void AnimBonemerangProjectile_Step(struct Sprite *); @@ -84,7 +83,7 @@ static const union AnimCmd sAnim_MudSlapMud[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_MudSlapMud[] = +const union AnimCmd *const sAnims_MudSlapMud[] = { sAnim_MudSlapMud, }; @@ -199,7 +198,7 @@ static void AnimBonemerangProjectile_End(struct Sprite *sprite) // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration -static void AnimBoneHitProjectile(struct Sprite *sprite) +void AnimBoneHitProjectile(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); if (!IsOnPlayerSide(gBattleAnimAttacker)) diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 8aa4ae2563..5b8c599c84 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -28,7 +28,6 @@ struct HailStruct { static void AnimUnusedIceCrystalThrow(struct Sprite *); static void AnimUnusedIceCrystalThrow_Step(struct Sprite *); static void AnimIcePunchSwirlingParticle(struct Sprite *); -static void AnimIceBeamParticle(struct Sprite *); static void AnimFlickerIceEffectParticle(struct Sprite *); static void AnimSwirlingSnowball(struct Sprite *); static void AnimSwirlingSnowball_Step2(struct Sprite *); @@ -703,7 +702,7 @@ static void AnimIcePunchSwirlingParticle(struct Sprite *sprite) // arg 2: target x offset // arg 3: target y offset // arg 4: duration -static void AnimIceBeamParticle(struct Sprite *sprite) +void AnimIceBeamParticle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 879f41f715..5b734e3926 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -777,6 +777,24 @@ void InitSpritePosToAnimAttackerPartner(struct Sprite *sprite, bool8 respectMonP sprite->y += gBattleAnimArgs[1]; } +void InitSpritePosToAnimBothTargets(struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + if (!respectMonPicOffsets) + { + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X); + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y); + } + else + { + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2); + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET); + } + sprite->x = sprite->x / 2; + sprite->y = sprite->y / 2; + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->y += gBattleAnimArgs[1]; +} + bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool8 respectMonPicOffsets) { u32 battler = GetAnimBattlerId(animBattlerId); @@ -1445,12 +1463,24 @@ void AnimSpriteOnMonPos(struct Sprite *sprite) else respectMonPicOffsets = FALSE; - if (gBattleAnimArgs[2] == 0) - InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); - else if (gBattleAnimArgs[2] == 1) - InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); - else if (gBattleAnimArgs[2] == 2) - InitSpritePosToAnimAttackerPartner(sprite, respectMonPicOffsets); + switch(gBattleAnimArgs[2]) + { + case 0: + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); + break; + case 1: + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); + break; + case 2: + InitSpritePosToAnimAttackerPartner(sprite, respectMonPicOffsets); + break; + case 3: + if(IsDoubleBattle()) + InitSpritePosToAnimBothTargets(sprite, respectMonPicOffsets); + else + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); + break; + } sprite->data[0]++; @@ -2180,6 +2210,37 @@ void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, *y = (battlerY + partnerY) / 2; } +void SetToPartnerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y) +{ + u8 xCoordType, yCoordType; + s16 returnX, returnY; + + if (!respectMonPicOffsets) + { + xCoordType = BATTLER_COORD_X; + yCoordType = BATTLER_COORD_Y; + } + else + { + xCoordType = BATTLER_COORD_X_2; + yCoordType = BATTLER_COORD_Y_PIC_OFFSET; + } + + if (IsDoubleBattle() && !IsContest() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + returnX = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), xCoordType); + returnY = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), yCoordType); + } + else + { + returnX = GetBattlerSpriteCoord(battler, xCoordType); + returnY = GetBattlerSpriteCoord(battler, yCoordType); + } + + *x = returnX; + *y = returnY; +} + u8 CreateInvisibleSpriteCopy(int battler, u8 spriteId, int species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 7a7d847d09..00281253fa 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -4740,7 +4740,7 @@ static const union AffineAnimCmd* const sSpriteAffineAnimTable_Flutterby[] = { const struct SpriteTemplate gSpriteTemplate_InfernalParadeFlame = { .tileTag = ANIM_TAG_PURPLE_FLAME, .paletteTag = ANIM_TAG_PURPLE_FLAME, - .oam = &gOamData_AffineDouble_ObjBlend_32x16, + .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gAnims_GrudgeFlame, .images = NULL, .affineAnims = sSpriteAffineAnimTable_Flutterby, @@ -5695,7 +5695,7 @@ const struct SpriteTemplate gBlackHoleEclipseBlueRingSpriteTemplate = const struct SpriteTemplate gBlackHoleEclipseBlackRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, - .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .paletteTag = ANIM_TAG_SHADOW_BALL, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -7312,6 +7312,287 @@ const struct SpriteTemplate gOmegaGeyserSpriteTemplate = .callback = SpriteCB_Geyser, }; +// Moves objects (ice crystals) in a wave-like behavior. Seen in Max Flutterby +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: wave amplitude +const struct SpriteTemplate gIceShardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineDouble_ObjBlend_8x8, + .anims = gAnims_IceCrystalSmall, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_Flutterby, + .callback = SpriteCB_MaxFlutterby +}; + +const struct SpriteTemplate gSpinningVineSpriteTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimBoneHitProjectile, +}; + +const struct SpriteTemplate gMaxFlutterbyButterflySpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_6, + .paletteTag = ANIM_TAG_SPARKLE_6, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_Flutterby, + .callback = SpriteCB_MaxFlutterby +}; + +const struct SpriteTemplate gReallyBigRockBlastRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_REALLY_BIG_ROCK, + .paletteTag = ANIM_TAG_REALLY_BIG_ROCK, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockBlastRock, +}; + +const struct SpriteTemplate gOrderUpTatsugiriCurlySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_CURLY, + .paletteTag = ANIM_TAG_TATSUGIRI_CURLY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +const struct SpriteTemplate gOrderUpTatsugiriDroopySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_DROOPY, + .paletteTag = ANIM_TAG_TATSUGIRI_DROOPY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +const struct SpriteTemplate gOrderUpTatsugiriStretchySpriteTemplate = +{ + .tileTag = ANIM_TAG_TATSUGIRI_STRETCHY, + .paletteTag = ANIM_TAG_TATSUGIRI_STRETCHY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DreepyMissilePlayer, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockTomb, +}; + +// Start of Tera Blast sprite templates +const struct SpriteTemplate gFireSpreadBlastSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_BasicFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimIceBeamParticle, +}; + +const struct SpriteTemplate gPurpleFlameSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_FLAME, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineOff_ObjBlend_16x32, + .anims = gAnims_GrudgeFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gAirWaveSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_AIR_WAVE_2, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gAffineAnims_AirWaveCrescent, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gPinkVioletOrbSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PINKVIO_ORB, + .paletteTag = ANIM_TAG_PINKVIO_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gHydroPumpSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sCirclingShockSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHOCK, + .paletteTag = ANIM_TAG_SHOCK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_CirclingElectricShock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sIceCrystalSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineDouble_ObjBlend_8x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sMudSandSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = sAnims_MudSlapMud, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sPoisonSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = &gAnims_PoisonProjectile[0], + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sRockSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlyingRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sMetalBallSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_METAL_BALL, + .paletteTag = ANIM_TAG_METAL_BALL, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate sPinkHeartSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_PINK_HEART, + .paletteTag = ANIM_TAG_PINK_HEART, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gDragonDanceOrbSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_HOLLOW_ORB, + .paletteTag = ANIM_TAG_HOLLOW_ORB, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gYellowStarSpiralOutwardSpriteTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_YELLOW_STAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward, +}; + +const struct SpriteTemplate gTeraBlastFlyingSpriteTemplate = +{ + .tileTag = ANIM_TAG_METAL_SOUND_WAVES, + .paletteTag = ANIM_TAG_METAL_SOUND_WAVES, + .oam = &gOamData_AffineDouble_ObjNormal_32x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = AnimShadowBall, +}; + +const struct SpriteTemplate gTeraBlastWaterSpriteTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDracoMeteorRock, +}; + +const struct SpriteTemplate gTeraBlastRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_BasicRock, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDracoMeteorRock, +}; + +const struct SpriteTemplate gGhostProjectileSpriteTemplate = +{ + .tileTag = ANIM_TAG_GHOSTLY_SPIRIT, + .paletteTag = ANIM_TAG_GHOSTLY_SPIRIT, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPoisonJabProjectile, +}; +// End of Tera Blast sprite templates + const union AnimCmd gSproutAnimCmds[] = { ANIMCMD_FRAME(96, 5), @@ -9148,6 +9429,18 @@ static void SpriteCB_DragonEnergyShot(struct Sprite* sprite) //arg 2: wave amplitude static void SpriteCB_MaxFlutterby(struct Sprite* sprite) { + s16 target_x; + s16 target_y; + if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) + { + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &target_x, &target_y); + } + else + { + target_x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + target_y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[0] = 0x10; //Speed delay @@ -9163,7 +9456,8 @@ static void SpriteCB_MaxFlutterbyStep1(struct Sprite* sprite) { if (!FuncIsActiveTask(AnimTask_DynamaxGrowthStep)) { - if (gAnimMoveIndex != MOVE_INFERNAL_PARADE) + if (gAnimMoveIndex != MOVE_INFERNAL_PARADE + && gAnimMoveIndex != MOVE_ASTRAL_BARRAGE) PlaySE(SE_M_SAND_ATTACK); StartSpriteAffineAnim(sprite, 1); @@ -9381,3 +9675,25 @@ const union AffineAnimCmd* const gSpriteAffineAnimTable_MegaSymbol[] = { sSpriteAffineAnim_MegaSymbol, }; + +// Used for determining which animation to use for Order Up +void AnimTask_GetCommanderType(u8 taskId) +{ + switch (gBattleStruct->commanderActive[gEffectBattler]) + { + case SPECIES_TATSUGIRI_CURLY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_CURLY; + break; + case SPECIES_TATSUGIRI_DROOPY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_DROOPY; + break; + case SPECIES_TATSUGIRI_STRETCHY: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_STRETCHY; + break; + default: + gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_NONE; + break; + } + + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index 39f30708c4..e47f032169 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -520,12 +520,44 @@ static void AnimSludgeProjectile(struct Sprite *sprite) { if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); + if (gBattleAnimArgs[4] && IsDoubleBattle()) + { + u32 targetPartner; + if (IsOnPlayerSide(gBattleAnimTarget)) + { + if (gBattleAnimTarget == 0) + targetPartner = 2; + else + targetPartner = 0; + } + else + { + if (gBattleAnimTarget == 1) + targetPartner = 3; + else + targetPartner = 1; + } + + if (IsBattlerAlive(gBattleAnimTarget) && !IsBattlerAlive(targetPartner)) + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_Y_PIC_OFFSET); + } + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = -30; InitAnimArcTranslation(sprite); @@ -600,7 +632,12 @@ static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite) static void AnimAcidPoisonDroplet(struct Sprite *sprite) { if (gBattleAnimArgs[5]) - SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + { + if (gBattleAnimArgs[5] == 1) + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + if (gBattleAnimArgs[5] == 2) + SetToPartnerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y); + } if (!IsOnPlayerSide(gBattleAnimAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 3408e797fc..23b244957c 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -11,7 +11,6 @@ static void AnimTask_Rollout_Step(u8 taskId); static void AnimRolloutParticle(struct Sprite *); -static void AnimRockTomb(struct Sprite *); static void AnimRockTomb_Step(struct Sprite *sprite); static void AnimRockScatter(struct Sprite *); static void AnimRockScatter_Step(struct Sprite *sprite); @@ -174,7 +173,7 @@ static const union AnimCmd sAnim_Rock_Smallest[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_BasicRock[] = +const union AnimCmd *const sAnims_BasicRock[] = { sAnim_Rock_Biggest, sAnim_Rock_Bigger, @@ -935,7 +934,7 @@ static u8 GetRolloutCounter(void) return retVal; } -static void AnimRockTomb(struct Sprite *sprite) +void AnimRockTomb(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 038f338cb2..236c7f6dfd 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1468,6 +1468,10 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, {gBattleAnimSpriteGfx_SaltParticle, 0x400, ANIM_TAG_SALT_PARTICLE}, + {gBattleAnimSpriteGfx_TeraSymbol, 0x0200, ANIM_TAG_TERA_SYMBOL}, + {gBattleAnimSpriteGfx_TatsugiriCurly, 0x200, ANIM_TAG_TATSUGIRI_CURLY}, + {gBattleAnimSpriteGfx_TatsugiriDroopy, 0x200, ANIM_TAG_TATSUGIRI_DROOPY}, + {gBattleAnimSpriteGfx_TatsugiriStretchy, 0x200, ANIM_TAG_TATSUGIRI_STRETCHY}, }; const struct SpritePalette gBattleAnimPaletteTable[] = @@ -1937,6 +1941,10 @@ const struct SpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, {gBattleAnimSpritePal_SaltParticle, ANIM_TAG_SALT_PARTICLE}, + {gBattleAnimSpritePal_TeraSymbol, ANIM_TAG_TERA_SYMBOL}, + {gBattleAnimSpritePal_TatsugiriCurly, ANIM_TAG_TATSUGIRI_CURLY}, + {gBattleAnimSpritePal_TatsugiriDroopy, ANIM_TAG_TATSUGIRI_DROOPY}, + {gBattleAnimSpritePal_TatsugiriStretchy, ANIM_TAG_TATSUGIRI_STRETCHY}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index 41aad50431..925e232dbe 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -43,6 +43,9 @@ const u16 gBattleAnimSpritePal_AlphaSymbol[] = INCBIN_U16("graphics/battle_anims const u32 gBattleAnimSpriteGfx_OmegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/omega_symbol.4bpp.smol"); const u16 gBattleAnimSpritePal_OmegaSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/omega_symbol.gbapal"); +const u32 gBattleAnimSpriteGfx_TeraSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/tera_symbol.4bpp.smol"); +const u16 gBattleAnimSpritePal_TeraSymbol[] = INCBIN_U16("graphics/battle_anims/sprites/tera_symbol.gbapal"); + const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.smol"); const u16 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U16("graphics/battle_anims/sprites/flash_cannon_ball.gbapal"); @@ -782,6 +785,15 @@ const u16 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U16("graphics/battle_anims/ const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.smol"); +const u32 gBattleAnimSpriteGfx_TatsugiriCurly[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_curly.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriCurly[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_curly.gbapal"); + +const u32 gBattleAnimSpriteGfx_TatsugiriDroopy[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_droopy.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriDroopy[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_droopy.gbapal"); + +const u32 gBattleAnimSpriteGfx_TatsugiriStretchy[] = INCBIN_U32("graphics/battle_anims/sprites/tatsugiri_stretchy.4bpp.smol"); +const u16 gBattleAnimSpritePal_TatsugiriStretchy[] = INCBIN_U16("graphics/battle_anims/sprites/tatsugiri_stretchy.gbapal"); + // Contest const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.smol"); const u16 gJPContestPal[] = INCBIN_U16("graphics/contest/japanese/palette.gbapal"); diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index 7bf0cabe2e..c929921d3f 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -1550,4 +1550,261 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla // Max Moves +// Tera Blast and all type variants +#define TERA_BLAST_PARAMETERS PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_NORMAL; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIGHTING; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FLYING; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_POISON; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GROUND; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ROCK; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_BUG; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GHOST; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STEEL; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_WATER; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIRE; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GRASS; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ELECTRIC; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_PSYCHIC; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ICE; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DRAGON; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DARK; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FAIRY; } \ + PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STELLAR; } + +SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (player to opponent)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(player, move, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (opponent to player)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(species) { TeraType(type); } + } WHEN { + TURN { MOVE(opponent, move, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { TeraType(type); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(species) { TeraType(type); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerLeft)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { TeraType(type); } + } WHEN { + TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + +DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerRight)") +{ + FORCE_MOVE_ANIM(TRUE); + u32 species, move, type; + TERA_BLAST_PARAMETERS; + GIVEN { + PLAYER(species) { Item(ITEM_FOCUS_SASH); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { TeraType(type); } + } WHEN { + TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + } THEN { + FORCE_MOVE_ANIM(FALSE); + if (gLoadFail) + DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + EXPECT_EQ(gLoadFail, FALSE); + } +} + #endif From a1e67572b60e72c951ac87337bcd56c8472a2e8d Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 11 Jul 2025 23:53:49 +0300 Subject: [PATCH 132/248] Replaces STATUS2 usage with volatiles in code (#7262) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- asm/macros/battle_script.inc | 46 +-- data/battle_scripts_1.s | 38 +- .../how_to_battle_script_command_macro.md | 2 +- include/battle.h | 2 +- include/battle_controllers.h | 4 +- include/battle_gfx_sfx_util.h | 2 +- include/battle_main.h | 2 +- include/battle_util.h | 5 +- include/constants/battle.h | 28 +- include/constants/battle_script_commands.h | 1 - include/item.h | 3 +- include/metaprogram.h | 84 +++-- include/pokemon.h | 4 +- src/battle_ai_main.c | 56 +-- src/battle_ai_switch_items.c | 21 +- src/battle_ai_util.c | 38 +- src/battle_controller_player.c | 2 +- src/battle_controllers.c | 20 +- src/battle_debug.c | 10 +- src/battle_dynamax.c | 4 +- src/battle_end_turn.c | 34 +- src/battle_gfx_sfx_util.c | 12 +- src/battle_main.c | 82 ++--- src/battle_message.c | 5 - src/battle_script_commands.c | 348 ++++++++---------- src/battle_terastal.c | 2 +- src/battle_util.c | 220 ++++++----- src/battle_util2.c | 4 +- src/battle_z_move.c | 4 +- src/data/moves_info.h | 2 +- src/item.c | 19 +- src/item_use.c | 25 +- src/pokemon.c | 2 +- src/recorded_battle.c | 2 +- test/battle/ability/shield_dust.c | 6 +- test/battle/gimmick/dynamax.c | 4 +- test/battle/hold_effect/berserk_gene.c | 6 +- test/battle/hold_effect/covert_cloak.c | 6 +- test/battle/item_effect/cure_status.c | 2 +- test/battle/move_effect/attract.c | 12 +- test/battle/move_effect/baton_pass.c | 2 +- test/battle/move_effect/captivate.c | 4 +- test/battle/move_effect_secondary/thrash.c | 2 +- test/battle/move_effect_secondary/trap_both.c | 4 +- .../battle/{status2 => volatiles}/confusion.c | 0 45 files changed, 583 insertions(+), 598 deletions(-) rename test/battle/{status2 => volatiles}/confusion.c (100%) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d9a7ca5fed..ba4b4619aa 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -596,27 +596,15 @@ .byte \notChosenMove .endm - .macro statusanimation battler:req + .macro statusanimation battler:req, status=0, isVolatile=FALSE .byte 0x64 .byte \battler - .endm - - .macro status2animation battler:req, status2:req - .byte 0x65 - .byte \battler - .4byte \status2 - .endm - - .macro setmoveeffect effect:req - sethword sMOVE_EFFECT, \effect - sethword sSAVED_MOVE_EFFECT, \effect - .endm - - .macro chosenstatusanimation battler:req, isStatus2:req, status:req - .byte 0x66 - .byte \battler - .byte \isStatus2 .4byte \status + .byte \isVolatile + .endm + + .macro volatileanimation battler:req, volatile:req + statusanimation \battler, \volatile, TRUE .endm .macro yesnobox @@ -979,8 +967,11 @@ .4byte \failInstr .endm - .macro setforesight + .macro setvolatile battler:req, volatile:req, value=TRUE .byte 0xb1 + .byte \battler + .byte \volatile + .byte \value .endm .macro trysetperishsong failInstr:req @@ -1041,10 +1032,6 @@ .byte 0xbe .endm - .macro setdefensecurlbit - .byte 0xbf - .endm - .macro recoverbasedonsunlight failInstr:req .byte 0xc0 .4byte \failInstr @@ -2094,10 +2081,6 @@ .4byte \failInstr .endm - .macro setpowder battler:req - various \battler, VARIOUS_SET_POWDER - .endm - .macro bringdownairbornebattler battler:req various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS .endm @@ -2353,12 +2336,9 @@ setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7 .endm - .macro chosenstatus1animation battler:req, status:req - chosenstatusanimation \battler, 0x0, \status - .endm - - .macro chosenstatus2animation battler:req, status:req - chosenstatusanimation \battler, 0x1, \status + .macro setmoveeffect effect:req + sethword sMOVE_EFFECT, \effect + sethword sSAVED_MOVE_EFFECT, \effect .endm .macro sethword dst:req, value:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f7d988026d..b51fe1ee26 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1329,7 +1329,7 @@ BattleScript_EffectPowder:: attackstring ppreduce jumpifvolatile BS_TARGET, VOLATILE_POWDER, BattleScript_ButItFailed - setpowder BS_TARGET + setvolatile BS_TARGET, VOLATILE_POWDER attackanimation waitanimation printstring STRINGID_COVEREDINPOWDER @@ -3929,7 +3929,7 @@ BattleScript_EffectForesight:: ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed - setforesight + setvolatile BS_TARGET, VOLATILE_FORESIGHT BattleScript_IdentifiedFoe: attackanimation waitanimation @@ -4026,7 +4026,7 @@ BattleScript_TryDestinyKnotTarget: infatuatewithbattler BS_TARGET, BS_ATTACKER playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - status2animation BS_TARGET, STATUS2_INFATUATION + volatileanimation BS_TARGET, VOLATILE_INFATUATION waitanimation printstring STRINGID_DESTINYKNOTACTIVATES waitmessage B_WAIT_TIME_LONG @@ -4038,7 +4038,7 @@ BattleScript_TryDestinyKnotAttacker: infatuatewithbattler BS_ATTACKER, BS_TARGET playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation - status2animation BS_ATTACKER, STATUS2_INFATUATION + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION waitanimation printstring STRINGID_DESTINYKNOTACTIVATES waitmessage B_WAIT_TIME_LONG @@ -4332,7 +4332,7 @@ BattleScript_EffectDefenseCurl:: attackcanceler attackstring ppreduce - setdefensecurlbit + setvolatile BS_TARGET, VOLATILE_DEFENSE_CURL setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString @@ -6866,7 +6866,7 @@ BattleScript_PrintUproarOverTurns:: end2 BattleScript_ThrashConfuses:: - chosenstatus2animation BS_ATTACKER, STATUS2_CONFUSION + volatileanimation BS_ATTACKER, VOLATILE_CONFUSION printstring STRINGID_PKMNFATIGUECONFUSION waitmessage B_WAIT_TIME_LONG end2 @@ -6874,7 +6874,7 @@ BattleScript_ThrashConfuses:: BattleScript_MoveUsedIsConfused:: printstring STRINGID_PKMNISCONFUSED waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_CONFUSION + volatileanimation BS_ATTACKER, VOLATILE_CONFUSION jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, FALSE, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: cancelmultiturnmoves BS_ATTACKER @@ -6900,7 +6900,7 @@ BattleScript_MoveUsedPowder:: ppreduce pause B_WAIT_TIME_SHORT cancelmultiturnmoves BS_ATTACKER - status2animation BS_ATTACKER, STATUS2_POWDER + volatileanimation BS_ATTACKER, VOLATILE_POWDER waitanimation effectivenesssound hitanimation BS_ATTACKER @@ -6938,7 +6938,7 @@ BattleScript_WrapEnds:: BattleScript_MoveUsedIsInLove:: printstring STRINGID_PKMNINLOVE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_INFATUATION + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION return BattleScript_MoveUsedIsInLoveCantAttack:: @@ -6949,13 +6949,13 @@ BattleScript_MoveUsedIsInLoveCantAttack:: BattleScript_NightmareTurnDmg:: printstring STRINGID_PKMNLOCKEDINNIGHTMARE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_NIGHTMARE + volatileanimation BS_ATTACKER, VOLATILE_NIGHTMARE goto BattleScript_DoTurnDmg BattleScript_CurseTurnDmg:: printstring STRINGID_PKMNAFFLICTEDBYCURSE waitmessage B_WAIT_TIME_LONG - status2animation BS_ATTACKER, STATUS2_CURSED + volatileanimation BS_ATTACKER, VOLATILE_CURSED goto BattleScript_DoTurnDmg BattleScript_TargetPRLZHeal:: @@ -7085,7 +7085,7 @@ BattleScript_MoveEffectWrap:: return BattleScript_MoveEffectConfusion:: - chosenstatus2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_CONFUSION printstring STRINGID_PKMNWASCONFUSED waitmessage B_WAIT_TIME_LONG return @@ -8195,7 +8195,7 @@ BattleScript_BanefulBunkerEffect:: BattleScript_CuteCharmActivates:: call BattleScript_AbilityPopUp - status2animation BS_ATTACKER, STATUS2_INFATUATION + volatileanimation BS_ATTACKER, VOLATILE_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage B_WAIT_TIME_LONG call BattleScript_TryDestinyKnotTarget @@ -9455,9 +9455,9 @@ BattleScript_EffectConfuseSide:: BattleScript_ConfuseSideLoop: jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement trysetconfusion BattleScript_ConfuseSideIncrement - status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_CONFUSION BattleScript_ConfuseSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNWASCONFUSED waitmessage B_WAIT_TIME_LONG BattleScript_ConfuseSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd @@ -9477,9 +9477,9 @@ BattleScript_EffectInfatuateSide:: BattleScript_InfatuateSideLoop: jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement trysetinfatuation BattleScript_InfatuateSideIncrement - status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION + volatileanimation BS_EFFECT_BATTLER, VOLATILE_INFATUATION BattleScript_InfatuateSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNFELLINLOVE waitmessage B_WAIT_TIME_LONG BattleScript_InfatuateSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd @@ -9495,7 +9495,7 @@ BattleScript_TormentSideLoop: jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement trysettorment BattleScript_TormentSideIncrement BattleScript_TormentSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_PKMNSUBJECTEDTOTORMENT waitmessage B_WAIT_TIME_LONG BattleScript_TormentSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd @@ -9516,7 +9516,7 @@ BattleScript_MeanLookSideLoop: jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement trysetescapeprevention BattleScript_MeanLookSideIncrement BattleScript_MeanLookSidePrintMessage: - printfromtable gStatus2StringIds + printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG BattleScript_MeanLookSideIncrement: jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd diff --git a/docs/tutorials/how_to_battle_script_command_macro.md b/docs/tutorials/how_to_battle_script_command_macro.md index 2bbf503fbe..afb9a15e89 100644 --- a/docs/tutorials/how_to_battle_script_command_macro.md +++ b/docs/tutorials/how_to_battle_script_command_macro.md @@ -35,7 +35,7 @@ void BS_TrySetOctolock(void) else { gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[battler].volatiles.escapePrevention = TRUE; gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/include/battle.h b/include/battle.h index cdeac89719..b537f779af 100644 --- a/include/battle.h +++ b/include/battle.h @@ -44,7 +44,7 @@ // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ - (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) \ + (!(gBattleMons[battler].volatiles.transformed) \ && !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot))) // Battle Actions diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 80c8c6ee38..d5166ce6f8 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -301,8 +301,8 @@ void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrde void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data); void BtlController_EmitHealthBarUpdate(u32 battler, u32 bufferId, u16 hpValue); void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expPoints); -void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2); -void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 status2, u32 status); +void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status); +void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 isVolatile, u32 status); void BtlController_EmitDataTransfer(u32 battler, u32 bufferId, u16 size, void *data); void BtlController_EmitTwoReturnValues(u32 battler, u32 bufferId, u8 ret8, u32 ret32); void BtlController_EmitChosenMonReturnValue(u32 battler, u32 bufferId, u8 partyId, u8 *battlePartyOrder); diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index c2cc901171..ae71eb5b50 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -7,7 +7,7 @@ u16 ChooseMoveAndTargetInBattlePalace(u32 battler); void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite); void SpriteCB_TrainerSlideIn(struct Sprite *sprite); void SpriteCB_TrainerSpawn(struct Sprite *sprite); -void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 status); +void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 status); bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument); void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId); bool8 IsBattleSEPlaying(u8 battler); diff --git a/include/battle_main.h b/include/battle_main.h index 23e030f6d3..6367f7e0f4 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -89,7 +89,7 @@ void SpriteCB_TrainerThrowObject(struct Sprite *sprite); void AnimSetCenterToCornerVecX(struct Sprite *sprite); void BeginBattleIntroDummy(void); void BeginBattleIntro(void); -void SwitchInClearSetData(u32 battler); +void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy); const u8* FaintClearSetData(u32 battler); void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(u32 battler); diff --git a/include/battle_util.h b/include/battle_util.h index 9eca2dacd7..8161e8d2d2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -392,9 +392,10 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); -u32 GetMonVolatile(u32 battler, enum Volatile volatile); -void SetMonVolatile(u32 battler, enum Volatile volatile, u32 newValue); +u32 GetMonVolatile(u32 battler, enum Volatile _volatile); +void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); +bool32 ItemHealMonVolatile(u32 battler, u16 itemId); void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); bool32 AreAnyHazardsOnSide(u32 side); diff --git a/include/constants/battle.h b/include/constants/battle.h index f0861ad43a..b87176ff7a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -142,23 +142,21 @@ enum VolatileFlags V_BATON_PASSABLE = (1 << 0), }; -// Volatile status ailments -// These are removed after exiting the battle or switching -/* Definitions with names e.g. "Confusion" are accessible in the debug menu - * Enum, Type, (Field name, (optional)bitSize), Flags, (optional)(Debug menu header, (optional)max. value) - */ +/* Volatile status ailments + * These are removed after exiting the battle or switching + * Enum, Type Type, max value, flags */ #define VOLATILE_DEFINITIONS(F) \ - F(VOLATILE_CONFUSION, confusionTurns, (u32, 3), V_BATON_PASSABLE) \ + F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \ F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ - F(VOLATILE_UPROAR, uproarTurns, (u32, 3)) \ + F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \ F(VOLATILE_TORMENT, torment, (u32, 1)) \ - F(VOLATILE_BIDE, bideTurns, (u32, 2)) \ - F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 2)) \ + F(VOLATILE_BIDE, bideTurns, (u32, 3)) \ + F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \ F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ F(VOLATILE_POWDER, powder, (u32, 1)) \ F(VOLATILE_UNUSED, padding, (u32, 1)) \ - F(VOLATILE_INFATUATION, infatuation, (u32, 4)) \ + F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \ F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ F(VOLATILE_RECHARGE, recharge, (u32, 1)) \ @@ -174,18 +172,22 @@ enum VolatileFlags F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) -/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeBitSize and debug parameters as input. */ -#define GET_VOLATILE_MAXIMUM(_typeBitSize, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeBitSize) -#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(MAX_BITS(FIRST(__VA_ARGS__)),) MAX_BITS((sizeof(_type) * 8))) +/* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ +#define GET_VOLATILE_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeMaxValue) +#define GET_VOLATILE_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(FIRST(__VA_ARGS__),) MAX_BITS((sizeof(_type) * 8))) #define UNPACK_VOLATILE_ENUMS(_enum, ...) _enum, enum Volatile { + VOLATILE_NONE, VOLATILE_DEFINITIONS(UNPACK_VOLATILE_ENUMS) /* Expands to VOLATILE_CONFUSION, VOLATILE_FLINCHED, etc. */ }; +// Helper macros +#define INFATUATED_WITH(battler) (battler + 1) + // Old flags #define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) #define STATUS2_CONFUSION_TURN(num) ((num) << 0) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 34497fc52e..b38d1cb9a6 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -149,7 +149,6 @@ enum CmdVarious VARIOUS_SET_AURORA_VEIL, VARIOUS_TRY_THIRD_TYPE, VARIOUS_ACUPRESSURE, - VARIOUS_SET_POWDER, VARIOUS_GRAVITY_ON_AIRBORNE_MONS, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS, VARIOUS_JUMP_IF_ROAR_FAILS, diff --git a/include/item.h b/include/item.h index 565784c85a..5fbb12ec43 100644 --- a/include/item.h +++ b/include/item.h @@ -2,6 +2,7 @@ #define GUARD_ITEM_H #include "constants/item.h" +#include "constants/item_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/tms_hms.h" @@ -187,7 +188,7 @@ u8 GetItemBattleUsage(u16 itemId); u32 GetItemSecondaryId(u32 itemId); u32 GetItemFlingPower(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); -u32 GetItemStatus2Mask(u16 itemId); +bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile); u32 GetItemSellPrice(u32 itemId); #endif // GUARD_ITEM_H diff --git a/include/metaprogram.h b/include/metaprogram.h index 47fa99af72..197ed0b756 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -120,42 +120,51 @@ #define DEFAULT_3(_default, ...) DEFAULT(_default __VA_OPT__(, THIRD(__VA_ARGS__))) #define DEFAULT_4(_default, ...) DEFAULT(_default __VA_OPT__(, FOURTH(__VA_ARGS__))) +/* Simply a lists numbers 0-31, allows for word-spanning macros */ +#define BITS_32(F, ...) \ + F(0, __VA_ARGS__) \ + F(1, __VA_ARGS__) \ + F(2, __VA_ARGS__) \ + F(3, __VA_ARGS__) \ + F(4, __VA_ARGS__) \ + F(5, __VA_ARGS__) \ + F(6, __VA_ARGS__) \ + F(7, __VA_ARGS__) \ + F(8, __VA_ARGS__) \ + F(9, __VA_ARGS__) \ + F(10, __VA_ARGS__) \ + F(11, __VA_ARGS__) \ + F(12, __VA_ARGS__) \ + F(13, __VA_ARGS__) \ + F(14, __VA_ARGS__) \ + F(15, __VA_ARGS__) \ + F(16, __VA_ARGS__) \ + F(17, __VA_ARGS__) \ + F(18, __VA_ARGS__) \ + F(19, __VA_ARGS__) \ + F(20, __VA_ARGS__) \ + F(21, __VA_ARGS__) \ + F(22, __VA_ARGS__) \ + F(23, __VA_ARGS__) \ + F(24, __VA_ARGS__) \ + F(25, __VA_ARGS__) \ + F(26, __VA_ARGS__) \ + F(27, __VA_ARGS__) \ + F(28, __VA_ARGS__) \ + F(29, __VA_ARGS__) \ + F(30, __VA_ARGS__) \ + F(31, __VA_ARGS__) + +/* Compares _n to 1 shifted by _b by _operation (==, <, > etc) */ +#define OP_BIT_SHIFT(_b, _n, _operation) (_n) _operation (1 << _b) ? _b : + /* (Credit to MGriffin) A rather monstrous way of finding the set bit in a word. Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1hm7B */ -#define BIT_INDEX(n) \ - (n) == (1 << 0) ? 0 : \ - (n) == (1 << 1) ? 1 : \ - (n) == (1 << 2) ? 2 : \ - (n) == (1 << 3) ? 3 : \ - (n) == (1 << 4) ? 4 : \ - (n) == (1 << 5) ? 5 : \ - (n) == (1 << 6) ? 6 : \ - (n) == (1 << 7) ? 7 : \ - (n) == (1 << 8) ? 8 : \ - (n) == (1 << 9) ? 9 : \ - (n) == (1 << 10) ? 10 : \ - (n) == (1 << 11) ? 11 : \ - (n) == (1 << 12) ? 12 : \ - (n) == (1 << 13) ? 13 : \ - (n) == (1 << 14) ? 14 : \ - (n) == (1 << 15) ? 15 : \ - (n) == (1 << 16) ? 16 : \ - (n) == (1 << 17) ? 17 : \ - (n) == (1 << 18) ? 18 : \ - (n) == (1 << 19) ? 19 : \ - (n) == (1 << 20) ? 20 : \ - (n) == (1 << 21) ? 21 : \ - (n) == (1 << 22) ? 22 : \ - (n) == (1 << 23) ? 23 : \ - (n) == (1 << 24) ? 24 : \ - (n) == (1 << 25) ? 25 : \ - (n) == (1 << 26) ? 26 : \ - (n) == (1 << 27) ? 27 : \ - (n) == (1 << 28) ? 28 : \ - (n) == (1 << 29) ? 29 : \ - (n) == (1 << 30) ? 30 : \ - (n) == (1 << 31) ? 31 : \ - *(u32 *)NULL +#define BIT_INDEX(_n) BITS_32(OP_BIT_SHIFT, _n, ==) *(u32 *)NULL + +/* (Credit to MGriffin) A way to find the minimum required number of bits to +store a number (max: 32). Sample: https://godbolt.org/z/xb4KdPMhT */ +#define BIT_SIZE(_n) (BITS_32(OP_BIT_SHIFT, _n, <) 32) #define COMPRESS_BITS_0 0, 1 #define COMPRESS_BITS_1 1, 1 @@ -167,11 +176,10 @@ Invalid input causes a compiler error. Sample: https://cexplore.karathan.at/z/x1 #define COMPRESS_BITS_7 7, 1 /* Will try and compress a set bit (or up to three sequential bits) into a single byte -Input must be of the form (upper << lower) where upper can be up to 3, lower up to 31 */ +Input must be of the form (upper << lower) where upper can be up to 7, lower up to 31 */ #define COMPRESS_BITS(_val) COMPRESS_BITS_STEP_2 _val -#define COMPRESS_BITS_STEP_2(_unpacked) COMPRESS_BITS_STEP_3(COMPRESS_BITS_## _unpacked) -#define COMPRESS_BITS_STEP_3(...) COMPRESS_BITS_STEP_4(__VA_ARGS__) -#define COMPRESS_BITS_STEP_4(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower))) +#define COMPRESS_BITS_STEP_2(_unpacked) INVOKE(COMPRESS_BITS_STEP_3, COMPRESS_BITS_## _unpacked) +#define COMPRESS_BITS_STEP_3(upper, lower) (((upper % 8) << 5) + (BIT_INDEX(lower))) /* Will read a compressed bit stored by COMPRESS_BIT into a single byte */ #define UNCOMPRESS_BITS(compressed) ((compressed >> 5) << (compressed & 0x1F)) diff --git a/include/pokemon.h b/include/pokemon.h index 1a6bb8c696..ac525624cc 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -310,8 +310,8 @@ enum { MON_SPR_GFX_MANAGERS_COUNT }; -#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeBitSize, ...) INVOKE(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeBitSize)); -#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:FIRST(__VA_ARGS__),) _fieldName) +#define UNPACK_VOLATILE_STRUCT(_enum, _fieldName, _typeMaxValue, ...) INVOKE(UNPACK_VOLATILE_STRUCT_, _fieldName, UNPACK_B(_typeMaxValue)); +#define UNPACK_VOLATILE_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:BIT_SIZE(FIRST(__VA_ARGS__)),) _fieldName) struct Volatiles { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 43d01dfa2e..3c582e3072 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1653,19 +1653,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // AI_CBM_HighRiskForDamage if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(-10); - if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + if (HasDamagingMove(battlerDef) && !(gBattleMons[battlerAtk].volatiles.substitute || IsBattlerIncapacitated(battlerDef, abilityDef) || gBattleMons[battlerDef].volatiles.infatuation || gBattleMons[battlerDef].volatiles.confusionTurns)) ADJUST_SCORE(-10); - if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !gBattleMons[battlerAtk].volatiles.substitute) ADJUST_SCORE(-10); if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); break; case EFFECT_COUNTER: case EFFECT_MIRROR_COAT: - if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION)) + if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) ADJUST_SCORE(-1); if ((predictedMove == MOVE_NONE || GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_STATUS || DoesSubstituteBlockMove(battlerAtk, BATTLE_PARTNER(battlerDef), predictedMove)) @@ -1717,7 +1719,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FOCUS_ENERGY: - if (gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (gBattleMons[battlerAtk].volatiles.dragonCheer || gBattleMons[battlerAtk].volatiles.focusEnergy) ADJUST_SCORE(-10); break; case EFFECT_CONFUSE: @@ -1727,7 +1729,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SUBSTITUTE: - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) + if (gBattleMons[battlerAtk].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 25) ADJUST_SCORE(-10); @@ -1737,7 +1739,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SHED_TAIL: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) + if (gBattleMons[battlerAtk].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 50) ADJUST_SCORE(-10); @@ -1808,7 +1810,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_NIGHTMARE: - if (gBattleMons[battlerDef].status2 & STATUS2_NIGHTMARE) + if (gBattleMons[battlerDef].volatiles.nightmare) ADJUST_SCORE(-10); else if (!AI_IsBattlerAsleepOrComatose(battlerDef)) ADJUST_SCORE(-8); @@ -1818,7 +1820,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CURSE: if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) { - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED + if (gBattleMons[battlerDef].volatiles.cursed || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] <= 50) @@ -1857,7 +1859,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // only one mon needs to set up Sticky Web break; case EFFECT_FORESIGHT: - if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) + if (gBattleMons[battlerDef].volatiles.foresight) ADJUST_SCORE(-10); else if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 || !(IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) @@ -1945,7 +1947,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_BATON_PASS: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE + else if (gBattleMons[battlerAtk].volatiles.substitute || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) || AnyStatIsRaised(battlerAtk)) break; @@ -2005,7 +2007,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_TORMENT: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (gBattleMons[battlerDef].status2 & STATUS2_TORMENT + else if (gBattleMons[battlerDef].volatiles.torment || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); @@ -2162,8 +2164,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-6); break; case EFFECT_TRANSFORM: - if (gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED - || (gBattleMons[battlerDef].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE))) //Leave out Illusion b/c AI is supposed to be fooled + if (gBattleMons[battlerAtk].volatiles.transformed + || gBattleMons[battlerDef].volatiles.transformed + || gBattleMons[battlerDef].volatiles.substitute) //Leave out Illusion b/c AI is supposed to be fooled ADJUST_SCORE(-10); break; case EFFECT_SPITE: @@ -2206,7 +2209,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_DESTINY_BOND: if (DoesDestinyBondFail(battlerAtk)) ADJUST_SCORE(-10); - if (gBattleMons[battlerDef].status2 & STATUS2_DESTINY_BOND) + if (gBattleMons[battlerDef].volatiles.destinyBond) ADJUST_SCORE(-10); else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); @@ -2703,7 +2706,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || MoveHasAdditionalEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) || IsZMove(instructedMove) || (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF) - || gBattleMons[battlerDef].status2 & STATUS2_MULTIPLETURNS + || gBattleMons[battlerDef].volatiles.multipleTurns || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); @@ -2975,7 +2978,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-7); break; case EFFECT_PERISH_SONG: - if (!(gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))) + if (!(gBattleMons[battlerDef].volatiles.escapePrevention || gBattleMons[battlerDef].volatiles.wrapped)) { if (IsTrappingMove(aiData->partnerMove) || predictedMove == MOVE_INGRAIN) ADJUST_SCORE(WEAK_EFFECT); @@ -3038,7 +3041,9 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_DRAGON_CHEER: - if (gBattleMons[battlerAtkPartner].status2 & STATUS2_FOCUS_ENERGY_ANY || !HasDamagingMove(battlerAtkPartner)) + if (gBattleMons[battlerAtkPartner].volatiles.dragonCheer + || gBattleMons[battlerAtkPartner].volatiles.focusEnergy + || !HasDamagingMove(battlerAtkPartner)) ADJUST_SCORE(-5); else if (atkPartnerHoldEffect == HOLD_EFFECT_SCOPE_LENS || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_DRAGON) @@ -4147,7 +4152,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_BATON_PASS: - if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE + if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].volatiles.substitute || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) || AnyStatIsRaised(battlerAtk))) ADJUST_SCORE(BEST_EFFECT); @@ -4411,7 +4416,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_DEFENSE_CURL: - if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) + if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !gBattleMons[battlerAtk].volatiles.defenseCurl) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; @@ -4456,7 +4461,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && BattlerWillFaintFromSecondaryDamage(battlerDef, aiData->abilities[battlerDef])) break; // Don't use if the attract won't have a change to activate if (gBattleMons[battlerDef].status1 & STATUS1_ANY - || (gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + || gBattleMons[battlerDef].volatiles.confusionTurns > 0 || (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef))) ADJUST_SCORE(GOOD_EFFECT); else @@ -5049,7 +5054,7 @@ case EFFECT_GUARD_SPLIT: break; case EFFECT_RAPID_SPIN: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) - || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)) + || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].volatiles.wrapped)) ADJUST_SCORE(GOOD_EFFECT); case EFFECT_SPECTRAL_THIEF: ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); @@ -5204,13 +5209,13 @@ case EFFECT_GUARD_SPLIT: score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); break; case MOVE_EFFECT_BUG_BITE: // And pluck - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES) ADJUST_SCORE(DECENT_EFFECT); break; case MOVE_EFFECT_INCINERATE: - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) ADJUST_SCORE(DECENT_EFFECT); @@ -5949,9 +5954,10 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(10); - if (HasDamagingMove(battlerDef) && !((gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE) + if (HasDamagingMove(battlerDef) && !(gBattleMons[battlerAtk].volatiles.substitute || IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0)) ADJUST_SCORE(10); } break; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 587b085500..ae01363a42 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -692,7 +692,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE && (B_ILLUMINATE_EFFECT >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) - && !(gBattleMons[battler].status2 & STATUS2_FORESIGHT) + && !gBattleMons[battler].volatiles.foresight && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) switchMon = FALSE; @@ -713,12 +713,12 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Cursed - if (gBattleMons[battler].status2 & STATUS2_CURSED + if (gBattleMons[battler].volatiles.cursed && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_CURSED, GetSwitchChance(SHOULD_SWITCH_CURSED)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Nightmare - if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE + if (gBattleMons[battler].volatiles.nightmare && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NIGHTMARE, GetSwitchChance(SHOULD_SWITCH_NIGHTMARE)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -729,7 +729,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) } // Infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION + if (gBattleMons[battler].volatiles.infatuation && !AiExpectsToFaintPlayer(battler) && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) @@ -1079,7 +1079,9 @@ bool32 ShouldSwitch(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[battler].volatiles.wrapped) + return FALSE; + if (gBattleMons[battler].volatiles.escapePrevention) return FALSE; if (gStatuses3[battler] & STATUS3_ROOTED) return FALSE; @@ -1228,7 +1230,9 @@ void ModifySwitchAfterMoveScoring(u32 battler) s32 i; s32 availableToSwitch; - if (gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[battler].volatiles.wrapped) + return; + if (gBattleMons[battler].volatiles.escapePrevention) return; if (gStatuses3[battler] & STATUS3_ROOTED) return; @@ -2405,7 +2409,7 @@ static bool32 ShouldUseItem(u32 battler) shouldUse = TRUE; if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) shouldUse = TRUE; - if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].status2 & STATUS2_CONFUSION) + if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0) shouldUse = TRUE; break; case EFFECT_ITEM_INCREASE_STAT: @@ -2417,7 +2421,8 @@ static bool32 ShouldUseItem(u32 battler) break; case EFFECT_ITEM_SET_FOCUS_ENERGY: if (!gDisableStructs[battler].isFirstTurn - || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY + || gBattleMons[battler].volatiles.dragonCheer + || gBattleMons[battler].volatiles.focusEnergy || AI_OpponentCanFaintAiWithMod(battler, 0)) break; shouldUse = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 48403d4e11..c9fb43c143 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -373,7 +373,9 @@ bool32 AI_CanBattlerEscape(u32 battler) bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) { - if (gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + if (gBattleMons[battlerDef].volatiles.wrapped) + return TRUE; + if (gBattleMons[battlerDef].volatiles.escapePrevention) return TRUE; if (gStatuses3[battlerDef] & (STATUS3_ROOTED | STATUS3_SKY_DROPPED)) return TRUE; @@ -1880,7 +1882,9 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) bool32 IsBattlerDamagedByStatus(u32 battler) { return gBattleMons[battler].status1 & STATUS1_DAMAGING - || gBattleMons[battler].status2 & (STATUS2_WRAPPED | STATUS2_NIGHTMARE | STATUS2_CURSED) + || gBattleMons[battler].volatiles.wrapped + || gBattleMons[battler].volatiles.nightmare + || gBattleMons[battler].volatiles.cursed || gStatuses3[battler] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED) || gStatuses4[battler] & (STATUS4_SALT_CURE) || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); @@ -2028,7 +2032,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += WEAK_EFFECT; if (gStatuses3[battlerDef] & STATUS3_ROOTED) tempScore += WEAK_EFFECT; - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED) + if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; break; case STAT_EVASION: @@ -2038,7 +2042,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += WEAK_EFFECT; if (gStatuses3[battlerDef] & STATUS3_ROOTED) tempScore += WEAK_EFFECT; - if (gBattleMons[battlerDef].status2 & STATUS2_CURSED) + if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; break; } @@ -2801,7 +2805,7 @@ static u32 GetLeechSeedDamage(u32 battlerId) static u32 GetNightmareDamage(u32 battlerId) { u32 damage = 0; - if ((gBattleMons[battlerId].status2 & STATUS2_NIGHTMARE) && gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerId].volatiles.nightmare && gBattleMons[battlerId].status1 & STATUS1_SLEEP) { damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) @@ -2813,7 +2817,7 @@ static u32 GetNightmareDamage(u32 battlerId) static u32 GetCurseDamage(u32 battlerId) { u32 damage = 0; - if (gBattleMons[battlerId].status2 & STATUS2_CURSED) + if (gBattleMons[battlerId].volatiles.cursed) { damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) @@ -2827,7 +2831,7 @@ static u32 GetTrapDamage(u32 battlerId) // ai has no knowledge about turns remaining u32 damage = 0; enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[gBattleStruct->wrappedBy[battlerId]]; - if (gBattleMons[battlerId].status2 & STATUS2_WRAPPED) + if (gBattleMons[battlerId].volatiles.wrapped) { if (holdEffect == HOLD_EFFECT_BINDING_BAND) damage = GetNonDynamaxMaxHP(battlerId) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); @@ -3233,7 +3237,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveWithEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; - if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) + if (gBattleMons[battler].volatiles.recharge || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) return TRUE; return FALSE; @@ -3372,7 +3376,7 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) { - if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + if (gBattleMons[battlerDef].volatiles.confusionTurns > 0 || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD @@ -3421,7 +3425,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION) + if (gBattleMons[battlerDef].volatiles.infatuation || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || defAbility == ABILITY_OBLIVIOUS || !AreBattlersOfOppositeGender(battlerAtk, battlerDef) @@ -3441,8 +3445,8 @@ u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbi } else if ((atkAbility == ABILITY_SERENE_GRACE || gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) || ((AI_IsFaster(battlerAtk, battlerDef, move)) && CanTargetFaintAi(battlerDef, battlerAtk))) { return 2; // good idea to flinch @@ -4357,8 +4361,8 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe || IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) || (HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY)) // filter out Fake Out - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + || gBattleMons[battlerDef].volatiles.infatuation + || gBattleMons[battlerDef].volatiles.confusionTurns > 0) ADJUST_SCORE_PTR(GOOD_EFFECT); else ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4396,7 +4400,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CURE_STATUS) { if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS - || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION + || gBattleMons[battlerDef].volatiles.infatuation || (gAiLogicData->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY))) ADJUST_SCORE_PTR(GOOD_EFFECT); else @@ -4801,9 +4805,9 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); - if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE && AI_IsFaster(battlerAtk, battlerDef, move)) + if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move)) ADJUST_SCORE_PTR(-10); - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[battlerDef].volatiles.substitute) ADJUST_SCORE_PTR(GOOD_EFFECT); if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 0147875995..751a2eca46 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1025,7 +1025,7 @@ void HandleMoveSwitching(u32 battler) gBattleMons[battler].pp[i] = moveInfo->currentPp[i]; } - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battler].volatiles.transformed)) { for (i = 0; i < MAX_MON_MOVES; i++) { diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 51f7e75d37..14b39bbb1f 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1043,24 +1043,20 @@ void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expP PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 6); } -void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2) +void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status) { gBattleResources->transferBuffer[0] = CONTROLLER_STATUSICONUPDATE; - gBattleResources->transferBuffer[1] = status1; - gBattleResources->transferBuffer[2] = (status1 & 0x0000FF00) >> 8; - gBattleResources->transferBuffer[3] = (status1 & 0x00FF0000) >> 16; - gBattleResources->transferBuffer[4] = (status1 & 0xFF000000) >> 24; - gBattleResources->transferBuffer[5] = status2; - gBattleResources->transferBuffer[6] = (status2 & 0x0000FF00) >> 8; - gBattleResources->transferBuffer[7] = (status2 & 0x00FF0000) >> 16; - gBattleResources->transferBuffer[8] = (status2 & 0xFF000000) >> 24; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 9); + gBattleResources->transferBuffer[1] = status; + gBattleResources->transferBuffer[2] = (status & 0x0000FF00) >> 8; + gBattleResources->transferBuffer[3] = (status & 0x00FF0000) >> 16; + gBattleResources->transferBuffer[4] = (status & 0xFF000000) >> 24; + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 5); } -void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 status2, u32 status) +void BtlController_EmitStatusAnimation(u32 battler, u32 bufferId, bool8 isVolatile, u32 status) { gBattleResources->transferBuffer[0] = CONTROLLER_STATUSANIMATION; - gBattleResources->transferBuffer[1] = status2; + gBattleResources->transferBuffer[1] = isVolatile; gBattleResources->transferBuffer[2] = status; gBattleResources->transferBuffer[3] = (status & 0x0000FF00) >> 8; gBattleResources->transferBuffer[4] = (status & 0x00FF0000) >> 16; diff --git a/src/battle_debug.c b/src/battle_debug.c index 30f3d6766b..cd3b3cd253 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1668,13 +1668,13 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) if (data->modifyArrows.currValue) { if (IsBattlerAlive(BATTLE_OPPOSITE(data->battlerId))) - gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_OPPOSITE(data->battlerId)); + gBattleMons[data->battlerId].volatiles.infatuation = INFATUATED_WITH(BATTLE_OPPOSITE(data->battlerId)); else - gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_PARTNER(BATTLE_OPPOSITE(data->battlerId))); + gBattleMons[data->battlerId].volatiles.infatuation = INFATUATED_WITH(BATTLE_PARTNER(BATTLE_OPPOSITE(data->battlerId))); } else { - gBattleMons[data->battlerId].status2 &= ~STATUS2_INFATUATION; + gBattleMons[data->battlerId].volatiles.infatuation = 0; } break; } @@ -2034,7 +2034,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.maxDigits = 1; data->modifyArrows.modifiedValPtr = NULL; data->modifyArrows.typeOfVal = VAR_IN_LOVE; - data->modifyArrows.currValue = (gBattleMons[data->battlerId].status2 & STATUS2_INFATUATION) != 0; + data->modifyArrows.currValue = gBattleMons[data->battlerId].volatiles.infatuation; } break; case LIST_ITEM_STATUS1: @@ -2046,7 +2046,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.currValue = GetMonVolatile(data->battlerId, data->currentSecondaryListItemId); data->modifyArrows.typeOfVal = VAL_VOLATILE; data->modifyArrows.minValue = 0; -#define UNPACK_VOLATILE_MAX_SIZE(_enum, _fieldName, _typeBitSize, ...) case _enum: data->modifyArrows.maxValue = min(MAX_u16, GET_VOLATILE_MAXIMUM(_typeBitSize)); break; +#define UNPACK_VOLATILE_MAX_SIZE(_enum, _fieldName, _typeMaxValue, ...) case _enum: data->modifyArrows.maxValue = min(MAX_u16, GET_VOLATILE_MAXIMUM(_typeMaxValue)); break; switch (data->currentSecondaryListItemId) { VOLATILE_DEFINITIONS(UNPACK_VOLATILE_MAX_SIZE) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index a34ecc21b3..c6e91742e8 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -181,14 +181,14 @@ void ActivateDynamax(u32 battler) gBattleStruct->dynamax.dynamaxTurns[battler] = gBattleTurnCounter + DYNAMAX_TURNS_COUNT; // Substitute is removed upon Dynamaxing. - gBattleMons[battler].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[battler].volatiles.substitute = FALSE; ClearBehindSubstituteBit(battler); // Choiced Moves are reset upon Dynamaxing. gBattleStruct->choicedMove[battler] = MOVE_NONE; // Try Gigantamax form change. - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) // Ditto cannot Gigantamax. + if (!gBattleMons[battler].volatiles.transformed) // Ditto cannot Gigantamax. TryBattleFormChange(battler, FORM_CHANGE_BATTLE_GIGANTAMAX); BattleScriptExecute(BattleScript_DynamaxBegins); diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index b63fd3938f..e56b383ba1 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -458,21 +458,21 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) gBattleStruct->eventBlockCounter++; break; case FIRST_EVENT_BLOCK_THRASH: - if (gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + if (gBattleMons[battler].volatiles.lockConfusionTurns && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) { - gBattleMons[battler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); + gBattleMons[battler].volatiles.lockConfusionTurns--; if (WasUnableToUseMove(battler)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); } - else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) && (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS)) + else if (!gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.multipleTurns) { - gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS; - if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) + gBattleMons[battler].volatiles.multipleTurns = FALSE; + if (!gBattleMons[battler].volatiles.confusionTurns) { gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; SetMoveEffect(battler, battler, TRUE, FALSE); - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].volatiles.confusionTurns) BattleScriptExecute(BattleScript_ThrashConfuses); effect = TRUE; } @@ -705,7 +705,7 @@ static bool32 HandleEndTurnNightmare(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gBattleMons[battler].status2 & STATUS2_NIGHTMARE + if (gBattleMons[battler].volatiles.nightmare && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { @@ -719,7 +719,7 @@ static bool32 HandleEndTurnNightmare(u32 battler) } else { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; } } @@ -732,7 +732,7 @@ static bool32 HandleEndTurnCurse(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gBattleMons[battler].status2 & STATUS2_CURSED + if (gBattleMons[battler].volatiles.cursed && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { @@ -752,7 +752,7 @@ static bool32 HandleEndTurnWrap(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gBattleMons[battler].status2 & STATUS2_WRAPPED && IsBattlerAlive(battler)) + if (gBattleMons[battler].volatiles.wrapped && IsBattlerAlive(battler)) { if (--gDisableStructs[battler].wrapTurns != 0) { @@ -773,7 +773,7 @@ static bool32 HandleEndTurnWrap(u32 battler) } else // broke free { - gBattleMons[battler].status2 &= ~STATUS2_WRAPPED; + gBattleMons[battler].volatiles.wrapped = FALSE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); BattleScriptExecute(BattleScript_WrapEnds); } @@ -867,7 +867,7 @@ static bool32 HandleEndTurnTorment(u32 battler) if (gDisableStructs[battler].tormentTimer == gBattleTurnCounter) { - gBattleMons[battler].status2 &= ~STATUS2_TORMENT; + gBattleMons[battler].volatiles.torment = FALSE; BattleScriptExecute(BattleScript_TormentEnds); effect = TRUE; } @@ -1349,7 +1349,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) switch (gBattleStruct->eventBlockCounter) { case THIRD_EVENT_BLOCK_UPROAR: - if (gBattleMons[battler].status2 & STATUS2_UPROAR) + if (gBattleMons[battler].volatiles.uproarTurns) { for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) { @@ -1357,7 +1357,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) && GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); @@ -1372,16 +1372,16 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) else { gBattlerAttacker = battler; - gBattleMons[battler].status2 -= STATUS2_UPROAR_TURN(1); // uproar timer goes down + gBattleMons[battler].volatiles.uproarTurns--; // uproar timer goes down if (WasUnableToUseMove(battler)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; } - else if (gBattleMons[battler].status2 & STATUS2_UPROAR) + else if (gBattleMons[battler].volatiles.uproarTurns) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; - gBattleMons[battler].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[battler].volatiles.multipleTurns = TRUE; } else { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index ca1b8fcb02..930419e3d9 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -459,10 +459,10 @@ static void SpriteCB_TrainerSlideVertical(struct Sprite *sprite) #undef sSpeedX -void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 status) +void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 status) { gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 1; - if (!isStatus2) + if (!isVolatile) { if (status == STATUS1_FREEZE || status == STATUS1_FROSTBITE) LaunchStatusAnimation(battler, B_ANIM_STATUS_FRZ); @@ -479,13 +479,13 @@ void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isStatus2, u32 statu } else { - if (status & STATUS2_INFATUATION) + if (status == VOLATILE_INFATUATION) LaunchStatusAnimation(battler, B_ANIM_STATUS_INFATUATION); - else if (status & STATUS2_CONFUSION) + else if (status == VOLATILE_CONFUSION) LaunchStatusAnimation(battler, B_ANIM_STATUS_CONFUSION); - else if (status & STATUS2_CURSED) + else if (status == VOLATILE_CURSED) LaunchStatusAnimation(battler, B_ANIM_STATUS_CURSED); - else if (status & STATUS2_NIGHTMARE) + else if (status == VOLATILE_NIGHTMARE) LaunchStatusAnimation(battler, B_ANIM_STATUS_NIGHTMARE); else // no animation gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; diff --git a/src/battle_main.c b/src/battle_main.c index 869720c680..22c27ea460 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3117,14 +3117,13 @@ static void BattleStartClearSetData(void) } } -#define UNPACK_VOLATILE_BATON_PASSABLES(_enum, _fieldName, _typeBitSize, ...) __VA_OPT__(if ((FIRST(__VA_ARGS__)) & V_BATON_PASSABLE) gBattleMons[battler].volatiles._fieldName = volatilesCopy._fieldName;) +#define UNPACK_VOLATILE_BATON_PASSABLES(_enum, _fieldName, _typeMaxValue, ...) __VA_OPT__(if ((FIRST(__VA_ARGS__)) & V_BATON_PASSABLE) gBattleMons[battler].volatiles._fieldName = volatilesCopy->_fieldName;) -void SwitchInClearSetData(u32 battler) +void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) { s32 i; enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); struct DisableStruct disableStructCopy = gDisableStructs[battler]; - struct Volatiles volatilesCopy = gBattleMons[battler].volatiles; ClearIllusionMon(battler); if (effect != EFFECT_BATON_PASS) @@ -3133,8 +3132,8 @@ void SwitchInClearSetData(u32 battler) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == battler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; + if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + gBattleMons[i].volatiles.escapePrevention = FALSE; if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == battler) { gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; @@ -3142,15 +3141,17 @@ void SwitchInClearSetData(u32 battler) } } } + + // Clear volatiles - reapply some if Baton Pass was used + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); if (effect == EFFECT_BATON_PASS) { // Transfer Baton Passable volatile statuses - memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); VOLATILE_DEFINITIONS(UNPACK_VOLATILE_BATON_PASSABLES) /* Expands to the following (compiler removes `if` statements): - * gBattleMons[battler].volatiles.confusionTurns = volatilesCopy.confusionTurns; - * gBattleMons[battler].volatiles.substitute = volatilesCopy.substitute; - * gBattleMons[battler].volatiles.escapePrevention = volatilesCopy.escapePrevention; + * gBattleMons[battler].volatiles.confusionTurns = volatilesCopy->confusionTurns; + * gBattleMons[battler].volatiles.substitute = volatilesCopy->substitute; + * gBattleMons[battler].volatiles.escapePrevention = volatilesCopy->escapePrevention; * ...etc */ gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED @@ -3172,17 +3173,16 @@ void SwitchInClearSetData(u32 battler) } else { - gBattleMons[battler].status2 = 0; gStatuses3[battler] = 0; gStatuses4[battler] = 0; } for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) - gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; + if (gBattleMons[i].volatiles.infatuation == INFATUATED_WITH(battler)) + gBattleMons[i].volatiles.infatuation = 0; + if (gBattleMons[i].volatiles.wrapped && gBattleStruct->wrappedBy[i] == battler) + gBattleMons[i].volatiles.wrapped = FALSE; if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; } @@ -3203,7 +3203,7 @@ void SwitchInClearSetData(u32 battler) } else if (effect == EFFECT_SHED_TAIL) { - gBattleMons[battler].status2 |= STATUS2_SUBSTITUTE; + gBattleMons[battler].volatiles.substitute = TRUE; gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; } @@ -3289,18 +3289,18 @@ const u8* FaintClearSetData(u32 battler) for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - gBattleMons[battler].status2 = 0; + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); gStatuses3[battler] &= STATUS3_GASTRO_ACID; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. gStatuses4[battler] = 0; for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == battler) - gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION; - if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(battler)) - gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battler); - if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && gBattleStruct->wrappedBy[i] == battler) - gBattleMons[i].status2 &= ~STATUS2_WRAPPED; + if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + gBattleMons[i].volatiles.escapePrevention = FALSE; + if (gBattleMons[i].volatiles.infatuation == INFATUATED_WITH(battler)) + gBattleMons[i].volatiles.infatuation = 0; + if (gBattleMons[i].volatiles.wrapped && gBattleStruct->wrappedBy[i] == battler) + gBattleMons[i].volatiles.wrapped = FALSE; if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; } @@ -3403,17 +3403,17 @@ const u8* FaintClearSetData(u32 battler) // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, // confuse them upon release and print "confused via fatigue" message and animation. - if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) + if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) { - gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; // If the released mon can be confused, do so. // Don't use CanBeConfused here, since it can cause issues in edge cases. if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO - || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + || gBattleMons[otherSkyDropper].volatiles.confusionTurns || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) { - gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; result = BattleScript_ThrashConfuses; } @@ -3476,7 +3476,7 @@ static void DoBattleIntro(void) gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp; - gBattleMons[battler].status2 = 0; + memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; #if TESTING @@ -3905,7 +3905,7 @@ static void TryDoEventsBeforeFirstTurn(void) for (i = 0; i < gBattlersCount; i++) { - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; + gBattleMons[i].volatiles.flinched = FALSE; // Record party slots of player's mons that appeared in battle if (!BattlerHasAi(i)) gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; @@ -3945,8 +3945,8 @@ static void HandleEndTurn_ContinueBattle(void) gBattleCommunication[i] = 0; for (i = 0; i < gBattlersCount; i++) { - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; - if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) + gBattleMons[i].volatiles.flinched = FALSE; + if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].volatiles.multipleTurns)) CancelMultiTurnMoves(i, SKY_DROP_IGNORE); } gBattleStruct->eventBlockCounter = 0; @@ -4003,8 +4003,8 @@ void BattleTurnPassed(void) gChosenMoveByBattler[i] = MOVE_NONE; gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; gStatuses4[i] &= ~STATUS4_ELECTRIFIED; - gBattleMons[i].status2 &= ~STATUS2_FLINCHED; - gBattleMons[i].status2 &= ~STATUS2_POWDER; + gBattleMons[i].volatiles.flinched = FALSE; + gBattleMons[i].volatiles.powder = FALSE; if (gBattleStruct->battlerState[i].stompingTantrumTimer > 0) gBattleStruct->battlerState[i].stompingTantrumTimer--; @@ -4192,8 +4192,8 @@ static void HandleTurnActionSelectionState(void) } else { - if (gBattleMons[battler].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[battler].status2 & STATUS2_RECHARGE) + if (gBattleMons[battler].volatiles.multipleTurns + || gBattleMons[battler].volatiles.recharge) { gChosenActionByBattler[battler] = B_ACTION_USE_MOVE; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; @@ -4347,8 +4347,8 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); - if (gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_RECHARGE) + if (gBattleMons[GetPartnerBattler(battler)].volatiles.multipleTurns + || gBattleMons[GetPartnerBattler(battler)].volatiles.recharge) { BtlController_EmitEndBounceEffect(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); @@ -4740,9 +4740,9 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h speed *= 2; else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivated)) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].volatiles.transformed) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivated)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivated)) + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].volatiles.transformed) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivated)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; else if (ability == ABILITY_UNBURDEN && gDisableStructs[battler].unburdenActive) speed *= 2; @@ -4762,7 +4762,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h speed /= 2; else if (holdEffect == HOLD_EFFECT_CHOICE_SCARF && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) speed = (speed * 150) / 100; - else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battler].species == SPECIES_DITTO && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battler].species == SPECIES_DITTO && !(gBattleMons[battler].volatiles.transformed)) speed *= 2; // various effects @@ -5108,13 +5108,13 @@ static void TurnValuesCleanUp(bool8 var0) { gDisableStructs[i].rechargeTimer--; if (gDisableStructs[i].rechargeTimer == 0) - gBattleMons[i].status2 &= ~STATUS2_RECHARGE; + gBattleMons[i].volatiles.recharge = FALSE; } gBattleStruct->battlerState[i].canPickupItem = FALSE; } if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[i].volatiles.substitute = FALSE; if (!(gStatuses3[i] & STATUS3_COMMANDER)) gBattleStruct->battlerState[i].commandingDondozo = FALSE; diff --git a/src/battle_message.c b/src/battle_message.c index 6be243ba51..9027d5a36e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1379,11 +1379,6 @@ const u16 gStatusConditionsStringIds[] = STRINGID_PKMNWASPOISONED, STRINGID_PKMNBADLYPOISONED, STRINGID_PKMNWASBURNED, STRINGID_PKMNWASPARALYZED, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNGOTFROSTBITE }; -const u16 gStatus2StringIds[] = -{ - STRINGID_PKMNWASCONFUSED, STRINGID_PKMNFELLINLOVE, STRINGID_TARGETCANTESCAPENOW, STRINGID_PKMNSUBJECTEDTOTORMENT -}; - const u16 gDamageNonTypesStartStringIds[] = { [B_MSG_TRAPPED_WITH_VINES] = STRINGID_TEAMTRAPPEDWITHVINES, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c0842af259..a50fb27956 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -449,8 +449,8 @@ static void Cmd_drawpartystatussummary(void); static void Cmd_hidepartystatussummary(void); static void Cmd_jumptocalledmove(void); static void Cmd_statusanimation(void); -static void Cmd_status2animation(void); -static void Cmd_chosenstatusanimation(void); +static void Cmd_unused_0x65(void); +static void Cmd_unused_0x66(void); static void Cmd_yesnobox(void); static void Cmd_cancelallactions(void); static void Cmd_setgravity(void); @@ -525,7 +525,7 @@ static void Cmd_tryspiteppreduce(void); static void Cmd_healpartystatus(void); static void Cmd_cursetarget(void); static void Cmd_trysetspikes(void); -static void Cmd_setforesight(void); +static void Cmd_setvolatile(void); static void Cmd_trysetperishsong(void); static void Cmd_handlerollout(void); static void Cmd_jumpifconfusedandstatmaxed(void); @@ -539,7 +539,7 @@ static void Cmd_tryrestorehpberry(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); -static void Cmd_setdefensecurlbit(void); +static void Cmd_unused_0xBF(void); static void Cmd_recoverbasedonsunlight(void); static void Cmd_setstickyweb(void); static void Cmd_selectfirstvalidtarget(void); @@ -708,8 +708,8 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_hidepartystatussummary, //0x62 Cmd_jumptocalledmove, //0x63 Cmd_statusanimation, //0x64 - Cmd_status2animation, //0x65 - Cmd_chosenstatusanimation, //0x66 + Cmd_unused_0x65, //0x65 + Cmd_unused_0x66, //0x66 Cmd_yesnobox, //0x67 Cmd_cancelallactions, //0x68 Cmd_setgravity, //0x69 @@ -784,7 +784,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_healpartystatus, //0xAE Cmd_cursetarget, //0xAF Cmd_trysetspikes, //0xB0 - Cmd_setforesight, //0xB1 + Cmd_setvolatile, //0xB1 Cmd_trysetperishsong, //0xB2 Cmd_handlerollout, //0xB3 Cmd_jumpifconfusedandstatmaxed, //0xB4 @@ -798,7 +798,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE - Cmd_setdefensecurlbit, //0xBF + Cmd_unused_0xBF, //0xBF Cmd_recoverbasedonsunlight, //0xC0 Cmd_setstickyweb, //0xC1 Cmd_selectfirstvalidtarget, //0xC2 @@ -1137,9 +1137,9 @@ u32 NumAffectedSpreadMoveTargets(void) u32 NumFaintedBattlersByAttacker(u32 battlerAtk) { - u32 numMonsFainted = 0; + u32 battler, numMonsFainted = 0; - for (u32 battler = 0; battler < gBattlersCount; battler++) + for (battler = 0; battler < gBattlersCount; battler++) { if (battler == battlerAtk) continue; @@ -1268,7 +1268,7 @@ static void Cmd_attackcanceler(void) if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT)) - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + && !(gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) { gBattlescriptCurrInstr = BattleScript_NoPPForMove; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; @@ -1279,7 +1279,7 @@ static void Cmd_attackcanceler(void) // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))) + && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) { gBattleStruct->noTargetPresent = TRUE; @@ -1289,7 +1289,7 @@ static void Cmd_attackcanceler(void) else gBattlescriptCurrInstr = BattleScript_FailedFromAtkString; - if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); return; } @@ -1354,7 +1354,8 @@ static void Cmd_attackcanceler(void) return; } - for (u32 i = 0; i < gBattlersCount; i++) + u32 i; + for (i = 0; i < gBattlersCount; i++) { if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && MoveCanBeSnatched(gCurrentMove)) { @@ -1382,7 +1383,7 @@ static void Cmd_attackcanceler(void) } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) && (effect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) && effect != EFFECT_SUCKER_PUNCH && effect != EFFECT_COUNTER && effect != EFFECT_UPPER_HAND) @@ -1504,13 +1505,14 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u } else { - u32 numTargets = 0; - u32 numMisses = 0; - u32 moveType = GetBattleMoveType(move); - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); + u32 battlerDef, + numTargets = 0, + numMisses = 0, + moveType = GetBattleMoveType(move), + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); bool32 calcSpreadMove = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(move); - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->calculatedSpreadMoveAccuracy) break; @@ -1624,7 +1626,7 @@ static void Cmd_ppreduce(void) if (gBattleControllerExecFlags) return; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns) gHitMarker |= HITMARKER_NO_PPDEDUCT; if (moveTarget == MOVE_TARGET_BOTH @@ -1739,8 +1741,8 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA } else { - critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0) - + 1 * ((gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) != 0) + critChance = 2 * (gBattleMons[battlerAtk].volatiles.focusEnergy != 0) + + 1 * (gBattleMons[battlerAtk].volatiles.dragonCheer != 0) + GetMoveCriticalHitStage(move) + GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk) + 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) @@ -1789,9 +1791,9 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec if (bonusCritStage > 0) critChance *= bonusCritStage; - if (gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) + if (gBattleMons[battlerAtk].volatiles.focusEnergy) critChance *= 4; - else if (gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) + else if (gBattleMons[battlerAtk].volatiles.dragonCheer) critChance *= 2; if (holdEffectCritStage > 0) @@ -1836,14 +1838,15 @@ static void Cmd_critcalc(void) { CMD_ARGS(); - u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker]; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker], + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), + abilityAtk = GetBattlerAbility(gBattlerAttacker), + battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); gPotentialItemEffectBattler = gBattlerAttacker; - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->calculatedDamageDone) break; @@ -2120,7 +2123,7 @@ static inline bool32 DoesBattlerNegateDamage(u32 battler) u32 species = gBattleMons[battler].species; u32 ability = GetBattlerAbility(battler); - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; if (ability == ABILITY_DISGUISE && species == SPECIES_MIMIKYU) return TRUE; @@ -2307,7 +2310,7 @@ static void Cmd_attackanimation(void) if (!(moveResultFlags & MOVE_RESULT_NO_EFFECT)) { u32 multihit; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[gBattlerTarget].volatiles.substitute) { multihit = gMultiHitCounter; } @@ -3138,20 +3141,20 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_CONFUSION: if (!CanBeConfused(gEffectBattler) - || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION + || gBattleMons[gEffectBattler].volatiles.confusionTurns || (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && !primary)) { gBattlescriptCurrInstr++; } else { - gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns + gBattleMons[gEffectBattler].volatiles.confusionTurns = ((Random()) % 4) + 2; // 2-5 turns // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. // Otherwise, do normal confusion script. if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) { - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; gBattlerAttacker = gEffectBattler; gBattlescriptCurrInstr = BattleScript_ThrashConfuses; } @@ -3179,14 +3182,14 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai gBattlescriptCurrInstr++; } } - else if (gBattleMons[gEffectBattler].status2 & STATUS2_FLINCHED) + else if (gBattleMons[gEffectBattler].volatiles.flinched) { gBattlescriptCurrInstr++; } else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber && !(GetActiveGimmick(gEffectBattler) == GIMMICK_DYNAMAX)) { - gBattleMons[gEffectBattler].status2 |= STATUS2_FLINCHED; + gBattleMons[gEffectBattler].volatiles.flinched = TRUE; gBattlescriptCurrInstr++; } else @@ -3195,11 +3198,11 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_UPROAR: - if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) + if (!gBattleMons[gEffectBattler].volatiles.uproarTurns) { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN(B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2); + gBattleMons[gEffectBattler].volatiles.uproarTurns = B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectUproar; @@ -3260,13 +3263,13 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_WRAP: - if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED) + if (gBattleMons[gEffectBattler].volatiles.wrapped) { gBattlescriptCurrInstr++; } else { - gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; + gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; else @@ -3401,13 +3404,13 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd break; - gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; + gBattleMons[gEffectBattler].volatiles.recharge = TRUE; gDisableStructs[gEffectBattler].rechargeTimer = 2; gLockedMoves[gEffectBattler] = gCurrentMove; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_RAGE: - gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE; + gBattleMons[gBattlerAttacker].volatiles.rage = TRUE; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_STEAL_ITEM: @@ -3440,15 +3443,15 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_PREVENT_ESCAPE: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; } gBattlescriptCurrInstr++; break; case MOVE_EFFECT_NIGHTMARE: - gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE; + gBattleMons[gBattlerTarget].volatiles.nightmare = TRUE; gBattlescriptCurrInstr++; break; case MOVE_EFFECT_ALL_STATS_UP: @@ -3484,15 +3487,15 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_THRASH: // Petal Dance doesn't lock mons that copy the move with Dancer - if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) + if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].volatiles.lockConfusionTurns) { gBattlescriptCurrInstr++; } else { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN(RandomUniform(RNG_RAMPAGE_TURNS, 2, 3)); + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = RandomUniform(RNG_RAMPAGE_TURNS, 2, 3); } break; case MOVE_EFFECT_CLEAR_SMOG: @@ -3597,19 +3600,19 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_TRAP_BOTH: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!(gBattleMons[gBattlerTarget].volatiles.escapePrevention || gBattleMons[gBattlerAttacker].volatiles.escapePrevention)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!gBattleMons[gBattlerAttacker].volatiles.escapePrevention) gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; + gBattleMons[gBattlerAttacker].volatiles.escapePrevention = TRUE; break; case MOVE_EFFECT_REMOVE_ARG_TYPE: { @@ -3893,7 +3896,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) - && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); MarkBattlerForControllerExec(gBattlerTarget); @@ -4128,9 +4131,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai { if (!IsBattlerAlly(battler, gBattlerTarget)) continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + if (!gBattleMons[battler].volatiles.wrapped) { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; + gBattleMons[battler].volatiles.wrapped = TRUE; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; else @@ -4539,12 +4542,12 @@ static void Cmd_jumpifstatus(void) static void Cmd_jumpifvolatile(void) { - CMD_ARGS(u8 battler, u8 volatileStatus, const u8 *jumpInstr); + CMD_ARGS(u8 battler, u8 _volatile, const u8 *jumpInstr); u8 battler = GetBattlerForBattleScript(cmd->battler); const u8 *jumpInstr = cmd->jumpInstr; - if (GetMonVolatile(battler, cmd->volatileStatus) && IsBattlerAlive(battler)) + if (GetMonVolatile(battler, cmd->_volatile) && IsBattlerAlive(battler)) gBattlescriptCurrInstr = jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -6119,7 +6122,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_RAGE: // rage check - if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE + if (gBattleMons[gBattlerTarget].volatiles.rage && IsBattlerAlive(gBattlerTarget) && gBattlerAttacker != gBattlerTarget && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) @@ -6313,7 +6316,7 @@ static void Cmd_moveend(void) for (i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[i].volatiles.substitute = FALSE; } gBattleScripting.moveendState++; break; @@ -6348,7 +6351,7 @@ static void Cmd_moveend(void) if (!IsOnPlayerSide(gBattlerAttacker)) UpdateStallMons(); if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) - || (gBattleMons[gBattlerAttacker].status2 & (STATUS2_FLINCHED)) + || (gBattleMons[gBattlerAttacker].volatiles.flinched) || gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility) gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; @@ -7050,7 +7053,7 @@ static void Cmd_moveend(void) if (B_RAMPAGE_CANCELLING >= GEN_5 && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT // And it is unusable - && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn + && gBattleMons[gBattlerAttacker].volatiles.lockConfusionTurns != 1) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it if (gBattleStruct->savedAttackerCount > 0) @@ -7320,10 +7323,9 @@ static void Cmd_switchindataupdate(void) { gBattleMons[battler].statStages[i] = oldData.statStages[i]; } - gBattleMons[battler].status2 = oldData.status2; } - SwitchInClearSetData(battler); + SwitchInClearSetData(battler, &oldData.volatiles); if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp @@ -7843,7 +7845,7 @@ static void UpdateSentMonFlags(u32 battler) static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) { - gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; + gBattleMons[battler].volatiles.destinyBond = FALSE; gHitMarker &= ~HITMARKER_DESTINYBOND; gBattleScripting.battler = battler; gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; @@ -8220,7 +8222,7 @@ static void Cmd_handlelearnnewmove(void) u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gBattlerPartyIndexes[battler] == monId - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { GiveMoveToBattleMon(&gBattleMons[battler], learnMove); } @@ -8228,7 +8230,7 @@ static void Cmd_handlelearnnewmove(void) { battler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); if (gBattlerPartyIndexes[battler] == monId - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { GiveMoveToBattleMon(&gBattleMons[battler], learnMove); } @@ -8643,58 +8645,29 @@ static void Cmd_jumptocalledmove(void) static void Cmd_statusanimation(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u32 status, bool8 isVolatile); if (gBattleControllerExecFlags == 0) { - u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 battler = GetBattlerForBattleScript(cmd->battler), + statusFlag = (cmd->isVolatile || cmd->status) ? cmd->status : gBattleMons[battler].status1; if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[battler].substituteHP == 0 && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, FALSE, gBattleMons[battler].status1); + BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, cmd->isVolatile, statusFlag); MarkBattlerForControllerExec(battler); } gBattlescriptCurrInstr = cmd->nextInstr; } } -static void Cmd_status2animation(void) +static void Cmd_unused_0x65(void) { - CMD_ARGS(u8 battler, u32 status2); - - if (gBattleControllerExecFlags == 0) - { - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 status2ToAnim = cmd->status2; - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) - { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, TRUE, gBattleMons[battler].status2 & status2ToAnim); - MarkBattlerForControllerExec(battler); - } - gBattlescriptCurrInstr = cmd->nextInstr; - } } -static void Cmd_chosenstatusanimation(void) +static void Cmd_unused_0x66(void) { - CMD_ARGS(u8 battler, bool8 isStatus2, u32 status); - - if (gBattleControllerExecFlags == 0) - { - u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 wantedStatus = cmd->status; - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) - && gDisableStructs[battler].substituteHP == 0 - && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) - { - BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, cmd->isStatus2, wantedStatus); - MarkBattlerForControllerExec(battler); - } - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_yesnobox(void) @@ -9454,13 +9427,13 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (gBattleMons[i].status2 & STATUS2_SUBSTITUTE) + if (gBattleMons[i].volatiles.substitute) { if (clear) { gBattlerTarget = i; gDisableStructs[i].substituteHP = 0; - gBattleMons[i].status2 &= ~STATUS2_SUBSTITUTE; + gBattleMons[i].volatiles.substitute = FALSE; BattleScriptCall(BattleScript_SubstituteFade); } gBattlerAttacker = saveBattler; @@ -9799,7 +9772,7 @@ static void Cmd_various(void) { VARIOUS_ARGS(u8 infatuateWith); gBattleScripting.battler = battler; - gBattleMons[battler].status2 |= STATUS2_INFATUATED_WITH(GetBattlerForBattleScript(cmd->infatuateWith)); + gBattleMons[battler].volatiles.infatuation = INFATUATED_WITH(GetBattlerForBattleScript(cmd->infatuateWith)); gBattlescriptCurrInstr = cmd->nextInstr; return; } @@ -9939,12 +9912,6 @@ static void Cmd_various(void) gStatuses3[battler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); break; } - case VARIOUS_SET_POWDER: - { - VARIOUS_ARGS(); - gBattleMons[battler].status2 |= STATUS2_POWDER; - break; - } case VARIOUS_ACUPRESSURE: { VARIOUS_ARGS(const u8 *failInstr); @@ -10953,10 +10920,10 @@ static void Cmd_various(void) gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; - // End any multiturn effects caused by the target except STATUS2_LOCK_CONFUSE - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_UPROAR); - gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE); + // End any multiturn effects caused by the target except VOLATILE_LOCK_CONFUSE + gBattleMons[gBattlerTarget].volatiles.multipleTurns = 0; + gBattleMons[gBattlerTarget].volatiles.uproarTurns= 0; + gBattleMons[gBattlerTarget].volatiles.bideTurns = 0; gDisableStructs[gBattlerTarget].rolloutTimer = 0; gDisableStructs[gBattlerTarget].furyCutterCounter = 0; @@ -10982,7 +10949,7 @@ static void Cmd_various(void) } // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. - if (gBattleMons[gBattlerTarget].status2 & STATUS2_LOCK_CONFUSE) + if (gBattleMons[gBattlerTarget].volatiles.lockConfusionTurns) gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; return; } @@ -10999,11 +10966,11 @@ static void Cmd_various(void) gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation - if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE && CanBeConfused(gEffectBattler)) + if (gBattleMons[gEffectBattler].volatiles.lockConfusionTurns && CanBeConfused(gEffectBattler)) { - gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; gBattlerAttacker = gEffectBattler; - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlescriptCurrInstr = BattleScript_ThrashConfuses; return; } @@ -11225,7 +11192,7 @@ static void Cmd_various(void) } else { - if (!(gBattleMons[battler].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!gBattleMons[battler].volatiles.escapePrevention) gDisableStructs[battler].noRetreat = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11235,9 +11202,9 @@ static void Cmd_various(void) { VARIOUS_ARGS(); // Check infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) + if (gBattleMons[battler].volatiles.infatuation) { - gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[battler].volatiles.infatuation = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); } @@ -11256,9 +11223,9 @@ static void Cmd_various(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED } // Check torment - if (gBattleMons[battler].status2 & STATUS2_TORMENT) + if (gBattleMons[battler].volatiles.torment == TRUE) { - gBattleMons[battler].status2 &= ~(STATUS2_TORMENT); + gBattleMons[battler].volatiles.torment = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; } // Check heal block @@ -11673,7 +11640,7 @@ bool8 UproarWakeUpCheck(u8 battler) for (i = 0; i < gBattlersCount; i++) { - if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || hasSoundproof) + if (!(gBattleMons[i].volatiles.uproarTurns) || hasSoundproof) continue; gBattleScripting.battler = i; @@ -12317,10 +12284,10 @@ static void Cmd_setbide(void) { CMD_ARGS(); - gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; gLockedMoves[gBattlerAttacker] = gCurrentMove; gBideDmg[gBattlerAttacker] = 0; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2); + gBattleMons[gBattlerAttacker].volatiles.bideTurns = 2; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12838,14 +12805,14 @@ static void Cmd_tryinfatuating(void) } else { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION + if (gBattleMons[gBattlerTarget].volatiles.infatuation || !AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); + gBattleMons[gBattlerTarget].volatiles.infatuation = INFATUATED_WITH(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -12865,7 +12832,7 @@ static void Cmd_updatestatusicon(void) { if (!(gAbsentBattlerFlags & (1u << battler))) { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); } } @@ -12876,7 +12843,7 @@ static void Cmd_updatestatusicon(void) battler = gBattlerAttacker; if (!(gAbsentBattlerFlags & (1u << battler))) { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); } if ((IsDoubleBattle())) @@ -12884,7 +12851,7 @@ static void Cmd_updatestatusicon(void) battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (!(gAbsentBattlerFlags & (1u << battler))) { - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); } } @@ -12893,7 +12860,7 @@ static void Cmd_updatestatusicon(void) else { battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1, gBattleMons[battler].status2); + BtlController_EmitStatusIconUpdate(battler, B_COMM_TO_CONTROLLER, gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12924,22 +12891,22 @@ static void Cmd_setfocusenergy(void) enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); if ((effect == EFFECT_DRAGON_CHEER && (!(IsDoubleBattle()) || (gAbsentBattlerFlags & (1u << battler)))) - || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + || gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } else if (effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) { - gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; + gBattleMons[battler].volatiles.dragonCheer = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } else { if (GetGenConfig(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3) - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].volatiles.focusEnergy = TRUE; else - gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; + gBattleMons[battler].volatiles.dragonCheer = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr = cmd->nextInstr; @@ -12951,7 +12918,7 @@ static void Cmd_transformdataexecution(void) gChosenMove = MOVE_UNAVAILABLE; gBattlescriptCurrInstr = cmd->nextInstr; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED + if (gBattleMons[gBattlerTarget].volatiles.transformed || gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER) { @@ -12964,7 +12931,7 @@ static void Cmd_transformdataexecution(void) u8 *battleMonAttacker, *battleMonTarget; u8 timesGotHit; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_TRANSFORMED; + gBattleMons[gBattlerAttacker].volatiles.transformed = TRUE; gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].disableTimer = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; @@ -13029,8 +12996,8 @@ static void Cmd_setsubstitute(void) if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; + gBattleMons[gBattlerAttacker].volatiles.substitute = TRUE; + gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; if (factor == 2) gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker] / 2; else @@ -13047,7 +13014,7 @@ static void Cmd_mimicattackcopy(void) CMD_ARGS(const u8 *failInstr); if ((IsMoveMimicBanned(gLastMoves[gBattlerTarget])) - || (gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) + || (gBattleMons[gBattlerAttacker].volatiles.transformed) || gLastMoves[gBattlerTarget] == MOVE_NONE || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) { @@ -13296,7 +13263,7 @@ static void Cmd_settypetorandomresistance(void) gBattlescriptCurrInstr = cmd->failInstr; } else if (gBattleMoveEffects[GetMoveEffect(gLastLandedMoves[gBattlerAttacker])].twoTurnEffect - && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS) + && gBattleMons[gLastHitBy[gBattlerAttacker]].volatiles.multipleTurns) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13422,7 +13389,7 @@ static void Cmd_copymovepermanently(void) gChosenMove = MOVE_UNAVAILABLE; - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) + if (!(gBattleMons[gBattlerAttacker].volatiles.transformed) && gLastPrintedMoves[gBattlerTarget] != MOVE_UNAVAILABLE && !IsMoveSketchBanned(gLastPrintedMoves[gBattlerTarget])) { @@ -13541,14 +13508,14 @@ static void Cmd_trysetdestinybond(void) } else { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND; + gBattleMons[gBattlerAttacker].volatiles.destinyBond = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } static void TrySetDestinyBondToHappen(void) { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND + if (gBattleMons[gBattlerTarget].volatiles.destinyBond && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) && !(gHitMarker & HITMARKER_GRUDGE)) { @@ -13629,7 +13596,7 @@ static void Cmd_tryspiteppreduce(void) // if (MOVE_IS_PERMANENT(gBattlerTarget, i)), but backwards if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) - && !(gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); MarkBattlerForControllerExec(gBattlerTarget); @@ -13672,7 +13639,7 @@ static void Cmd_healpartystatus(void) else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; gBattleMons[gBattlerAttacker].status1 = 0; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; } else { @@ -13688,7 +13655,7 @@ static void Cmd_healpartystatus(void) || !(isSoundMove && GetBattlerAbility(partner) == ABILITY_SOUNDPROOF)) { gBattleMons[partner].status1 = 0; - gBattleMons[partner].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[partner].volatiles.nightmare = FALSE; } else { @@ -13753,13 +13720,13 @@ static void Cmd_cursetarget(void) { CMD_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_CURSED) + if (gBattleMons[gBattlerTarget].volatiles.cursed) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED; + gBattleMons[gBattlerTarget].volatiles.cursed = TRUE; gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) gBattleStruct->moveDamage[gBattlerAttacker] = 1; @@ -13787,11 +13754,11 @@ static void Cmd_trysetspikes(void) } } -static void Cmd_setforesight(void) +static void Cmd_setvolatile(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, u8 _volatile, u8 value); - gBattleMons[gBattlerTarget].status2 |= STATUS2_FORESIGHT; + SetMonVolatile(GetBattlerForBattleScript(cmd->battler), cmd->_volatile, cmd->value); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -13835,16 +13802,16 @@ static void Cmd_handlerollout(void) } else { - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // First hit. + if (!(gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) // First hit. { gDisableStructs[gBattlerAttacker].rolloutTimer = 5; gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; - gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; gLockedMoves[gBattlerAttacker] = gCurrentMove; } if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // Last hit. { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; } gBattlescriptCurrInstr = cmd->nextInstr; @@ -13855,7 +13822,7 @@ static void Cmd_jumpifconfusedandstatmaxed(void) { CMD_ARGS(u8 stat, const u8 *jumpInstr); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION + if (gBattleMons[gBattlerTarget].volatiles.confusionTurns > 0 && !CompareStat(gBattlerTarget, cmd->stat, MAX_STAT_STAGE, CMP_LESS_THAN)) gBattlescriptCurrInstr = cmd->jumpInstr; // Fails if we're confused AND stat cannot be raised else @@ -14130,10 +14097,10 @@ static void Cmd_rapidspinfree(void) u8 atkSide = GetBattlerSide(gBattlerAttacker); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) + if (gBattleMons[gBattlerAttacker].volatiles.wrapped) { gBattleScripting.battler = gBattlerTarget; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_WRAPPED; + gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; gBattlerTarget = gBattleStruct->wrappedBy[gBattlerAttacker]; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); BattleScriptCall(BattleScript_WrapFree); @@ -14163,12 +14130,8 @@ static void Cmd_rapidspinfree(void) } } -static void Cmd_setdefensecurlbit(void) +static void Cmd_unused_0xBF(void) { - CMD_ARGS(); - - gBattleMons[gBattlerAttacker].status2 |= STATUS2_DEFENSE_CURL; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_recoverbasedonsunlight(void) @@ -14536,14 +14499,14 @@ static void Cmd_settorment(void) { CMD_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT + if (gBattleMons[gBattlerTarget].volatiles.torment == TRUE || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gBattleMons[gBattlerTarget].volatiles.torment = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15300,7 +15263,7 @@ static void Cmd_settypebasedhalvers(void) bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) { - if (!(gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE)) + if (!gBattleMons[battlerDef].volatiles.substitute) return FALSE; else if (MoveIgnoresSubstitute(move)) return FALSE; @@ -15313,7 +15276,7 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) bool32 DoesDisguiseBlockMove(u32 battler, u32 move) { if (!(gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - || gBattleMons[battler].status2 & STATUS2_TRANSFORMED + || gBattleMons[battler].volatiles.transformed || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_DAMAGE)) || gHitMarker & HITMARKER_IGNORE_DISGUISE || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) @@ -16881,34 +16844,23 @@ void BS_ItemCureStatus(void) { NATIVE_ARGS(const u8 *noStatusInstr); u32 battler = gBattlerAttacker; - u32 previousStatus2 = 0; bool32 statusChanged = FALSE; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); - // Heal Status2 conditions if battler is active. + // Heal volatile conditions if battler is active. if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) - { - previousStatus2 = gBattleMons[battler].status2; - gBattleMons[gBattlerAttacker].status2 &= ~GetItemStatus2Mask(gLastUsedItem); - } + statusChanged = ItemHealMonVolatile(battler, gLastUsedItem); else if (IsDoubleBattle() - && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) - { - battler = BATTLE_PARTNER(gBattlerAttacker); - previousStatus2 = gBattleMons[battler].status2; - gBattleMons[battler].status2 &= ~GetItemStatus2Mask(gLastUsedItem); - } - - if (previousStatus2 != gBattleMons[battler].status2) - statusChanged = TRUE; + && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + statusChanged = ItemHealMonVolatile(BATTLE_PARTNER(gBattlerAttacker), gLastUsedItem); // Heal Status1 conditions. if (!HealStatusConditions(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], GetItemStatus1Mask(gLastUsedItem), battler)) { statusChanged = TRUE; if (GetItemStatus1Mask(gLastUsedItem) & STATUS1_SLEEP) - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; - if (GetItemStatus2Mask(gLastUsedItem) & STATUS2_CONFUSION) + gBattleMons[battler].volatiles.nightmare = FALSE; + if (ItemHasVolatileFlag(gLastUsedItem, VOLATILE_CONFUSION)) gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; } @@ -17168,7 +17120,7 @@ void BS_TrySetOctolock(void) else { gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[battler].volatiles.escapePrevention = TRUE; gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17962,7 +17914,7 @@ void BS_CheckPokeFlute(void) if (GetBattlerAbility(i) != ABILITY_SOUNDPROOF) { gBattleMons[i].status1 &= ~STATUS1_SLEEP; - gBattleMons[i].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[i].volatiles.nightmare = FALSE; } } @@ -18243,8 +18195,7 @@ void BS_TrySetConfusion(void) if (CanBeConfused(gBattlerTarget)) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattleCommunication[MULTIUSE_STATE] = 1; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; @@ -18259,13 +18210,12 @@ void BS_TrySetInfatuation(void) { NATIVE_ARGS(const u8 *failInstr); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) + if (!gBattleMons[gBattlerTarget].volatiles.infatuation && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleMons[gBattlerTarget].volatiles.infatuation = INFATUATED_WITH(gBattlerAttacker); gBattleCommunication[MULTIUSE_STATE] = 2; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; @@ -18280,11 +18230,10 @@ void BS_TrySetEscapePrevention(void) { NATIVE_ARGS(const u8 *failInstr); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -18298,12 +18247,11 @@ void BS_TrySetTorment(void) { NATIVE_ARGS(const u8 *failInstr); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + if (!(gBattleMons[gBattlerTarget].volatiles.torment == TRUE) && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gBattleMons[gBattlerTarget].volatiles.torment = TRUE; gDisableStructs[gBattlerTarget].tormentTimer = gBattleTurnCounter + 3; // 3 turns excluding current turn - gBattleCommunication[MULTISTRING_CHOOSER] = 3; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 6984f3fc6c..8799dc7ab2 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -64,7 +64,7 @@ bool32 CanTerastallize(u32 battler) { enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) + if (gBattleMons[battler].volatiles.transformed && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; // Prevents Zigzagoon from terastalizing in vanilla. diff --git a/src/battle_util.c b/src/battle_util.c index d882f28fa4..088436c4c1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -412,7 +412,7 @@ void HandleAction_UseMove(void) gHitMarker |= HITMARKER_NO_PPDEDUCT; gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } - else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) + else if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns || gBattleMons[gBattlerAttacker].volatiles.recharge) { gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker]; } @@ -1056,18 +1056,18 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, // confuse them upon release and display "confused by fatigue" message & animation. // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. - if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && skyDropState != SKY_DROP_STATUS_YAWN) + if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns && skyDropState != SKY_DROP_STATUS_YAWN) { - gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. - if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION + if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 || IsAbilityAndRecord(otherSkyDropper, GetBattlerAbility(otherSkyDropper), ABILITY_OWN_TEMPO) || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status - gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; if (skyDropState == SKY_DROP_ATTACKCANCELLER_CHECK) { @@ -1094,7 +1094,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) } // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS - if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[battler] < 4) + if (!(gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) && gBattleStruct->skyDropTargets[battler] < 4) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_NO_TARGET; gBattleStruct->skyDropTargets[otherSkyDropper] = SKY_DROP_NO_TARGET; @@ -1106,18 +1106,18 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState) { const u8 *result = NULL; - gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); - gBattleMons[battler].status2 &= ~(STATUS2_BIDE); + gBattleMons[battler].volatiles.uproarTurns = 0; + gBattleMons[battler].volatiles.bideTurns = 0; if (B_RAMPAGE_CANCELLING < GEN_5) { - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); + gBattleMons[battler].volatiles.multipleTurns = 0; + gBattleMons[battler].volatiles.lockConfusionTurns = 0; } - else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) - || ((gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) > STATUS2_LOCK_CONFUSE_TURN(1))) + else if (!gBattleMons[battler].volatiles.lockConfusionTurns + || gBattleMons[battler].volatiles.lockConfusionTurns > 1) { - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[battler].volatiles.multipleTurns = 0; } // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. @@ -1341,7 +1341,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].status2 & STATUS2_TORMENT)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && move == gLastMoves[battler] && move != MOVE_STRUGGLE && (gBattleMons[battler].volatiles.torment == TRUE)) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1588,7 +1588,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_DISABLED && move == gDisableStructs[battler].disabledMove) unusableMoves |= 1u << i; // Torment - else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].status2 & STATUS2_TORMENT) + else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].volatiles.torment == TRUE) unusableMoves |= 1u << i; // Taunt else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IsBattleMoveStatus(move)) @@ -1849,8 +1849,8 @@ void TryClearRageAndFuryCutter(void) s32 i; for (i = 0; i < gBattlersCount; i++) { - if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) - gBattleMons[i].status2 &= ~STATUS2_RAGE; + if (gBattleMons[i].volatiles.rage && gChosenMoveByBattler[i] != MOVE_RAGE) + gBattleMons[i].volatiles.rage = FALSE; if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER) gDisableStructs[i].furyCutterCounter = 0; } @@ -1871,7 +1871,7 @@ static inline bool32 TryFormChangeBeforeMove(void) static inline bool32 TryActivatePowderStatus(u32 move) { u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER)) + if (!gBattleMons[gBattlerAttacker].volatiles.powder) return FALSE; if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) return TRUE; @@ -1890,7 +1890,7 @@ void SetAtkCancellerForCalledMove(void) static enum MoveCanceller CancellerFlags(void) { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND; + gBattleMons[gBattlerAttacker].volatiles.destinyBond = FALSE; gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; return MOVE_STEP_SUCCESS; @@ -1917,9 +1917,9 @@ static enum MoveCanceller CancellerSkyDrop(void) static enum MoveCanceller CancellerRecharge(void) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) + if (gBattleMons[gBattlerAttacker].volatiles.recharge) { - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE; + gBattleMons[gBattlerAttacker].volatiles.recharge = TRUE; gDisableStructs[gBattlerAttacker].rechargeTimer = 0; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; @@ -1937,7 +1937,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) { TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; BattleScriptCall(BattleScript_MoveUsedWokeUp); return MOVE_STEP_REMOVES_STATUS; @@ -1967,7 +1967,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) else { TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; BattleScriptCall(BattleScript_MoveUsedWokeUp); return MOVE_STEP_REMOVES_STATUS; @@ -2067,7 +2067,7 @@ static enum MoveCanceller CancellerTruant(void) static enum MoveCanceller CancellerFlinch(void) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) + if (gBattleMons[gBattlerAttacker].volatiles.flinched) { gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); @@ -2154,11 +2154,11 @@ static enum MoveCanceller CancellerConfused(void) if (gBattleStruct->isAtkCancelerForCalledMove) return MOVE_STEP_SUCCESS; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) { if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) - gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) + gBattleMons[gBattlerAttacker].volatiles.confusionTurns--; + if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) { // confusion dmg if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) @@ -2212,9 +2212,9 @@ static enum MoveCanceller CancellerParalysed(void) static enum MoveCanceller CancellerInfatuation(void) { - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].volatiles.infatuation) { - gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); + gBattleScripting.battler = gBattleMons[gBattlerAttacker].volatiles.infatuation - 1; if (!RandomPercentage(RNG_INFATUATION, 50)) { BattleScriptCall(BattleScript_MoveUsedIsInLove); @@ -2234,17 +2234,16 @@ static enum MoveCanceller CancellerInfatuation(void) static enum MoveCanceller CancellerBide(void) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + if (gBattleMons[gBattlerAttacker].volatiles.bideTurns) { - gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1); - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + if (--gBattleMons[gBattlerAttacker].volatiles.bideTurns) { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; } else { // This is removed in FRLG and Emerald for some reason - //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS; + //gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; if (gBideDmg[gBattlerAttacker]) { gCurrentMove = MOVE_BIDE; @@ -2978,7 +2977,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a case ABILITY_SOUNDPROOF: if (IsSoundMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + if (gBattleMons[battlerAtk].volatiles.multipleTurns) gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; } @@ -2986,7 +2985,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a case ABILITY_BULLETPROOF: if (IsBallisticMove(move)) { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + if (gBattleMons[battlerAtk].volatiles.multipleTurns) gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; } @@ -2996,7 +2995,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a case ABILITY_ARMOR_TAIL: if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) { - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + if (gBattleMons[battlerAtk].volatiles.multipleTurns) gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_DazzlingProtected; } @@ -3041,7 +3040,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (gBattleMons[battlerAtk].status2 & STATUS2_MULTIPLETURNS) + if (gBattleMons[battlerAtk].volatiles.multipleTurns) gHitMarker |= HITMARKER_NO_PPDEDUCT; battlerAbility = partnerDef; battleScriptBlocksMove = BattleScript_DazzlingProtected; @@ -3549,8 +3548,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gDisableStructs[battler].isFirstTurn == 2 && !gDisableStructs[battler].overwrittenAbility && IsBattlerAlive(diagonalBattler) - && !(gBattleMons[diagonalBattler].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE)) - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !gBattleMons[diagonalBattler].volatiles.substitute + && !gBattleMons[diagonalBattler].volatiles.transformed + && !gBattleMons[battler].volatiles.transformed && gBattleStruct->illusion[diagonalBattler].state != ILLUSION_ON && !(gStatuses3[diagonalBattler] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER)) { @@ -4124,7 +4124,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_ICE_FACE: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) && gBattleMons[battler].species == SPECIES_EISCUE_NOICE - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { // TODO: Convert this to a proper FORM_CHANGE type. gBattleMons[battler].species = SPECIES_EISCUE_ICE; @@ -4147,9 +4147,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleStruct->battlerState[battler].commandingDondozo = TRUE; gBattleStruct->commanderActive[partner] = gBattleMons[battler].species; gStatuses3[battler] |= STATUS3_COMMANDER; - if (gBattleMons[battler].status2 & STATUS2_CONFUSION + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION)) - gBattleMons[battler].status2 -= STATUS2_CONFUSION_TURN(1); + gBattleMons[battler].volatiles.confusionTurns--; BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(battler); BattleScriptPushCursorAndCallback(BattleScript_CommanderActivates); @@ -4245,7 +4245,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[battler].status1 = 0; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleScripting.battler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); @@ -4363,7 +4363,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_HUNGER_SWITCH: - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (!gBattleMons[battler].volatiles.transformed && GetActiveGimmick(battler) != GIMMICK_TERA && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_TURN_END)) { @@ -4728,13 +4728,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); + gBattleMons[gBattlerAttacker].volatiles.infatuation = INFATUATED_WITH(gBattlerTarget); BattleScriptCall(BattleScript_CuteCharmActivates); effect++; } @@ -5034,7 +5034,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_OWN_TEMPO: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].volatiles.confusionTurns > 0) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); effect = 2; @@ -5052,7 +5052,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gBattleMons[battler].status1 & STATUS1_SLEEP) { TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); effect = 1; } @@ -5074,7 +5074,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_OBLIVIOUS: - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) + if (gBattleMons[battler].volatiles.infatuation) effect = 3; else if (gDisableStructs[battler].tauntTimer != 0) effect = 4; @@ -5094,7 +5094,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 3: // get rid of infatuation - gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; + gBattleMons[battler].volatiles.infatuation = 0; BattleScriptCall(BattleScript_BattlerGotOverItsInfatuation); break; case 4: // get rid of taunt @@ -5215,7 +5215,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gDisableStructs[battler].weatherAbilityDone && battlerWeatherAffected && gBattleMons[battler].species == SPECIES_EISCUE_NOICE - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].volatiles.transformed)) { // TODO: Convert this to a proper FORM_CHANGE type. gBattleScripting.battler = battler; @@ -5229,7 +5229,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_PROTOSYNTHESIS: if (!gDisableStructs[battler].weatherAbilityDone && (gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect() - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !gBattleMons[battler].volatiles.transformed && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].weatherAbilityDone = TRUE; @@ -5258,7 +5258,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_QUARK_DRIVE: if (!gDisableStructs[battler].terrainAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !gBattleMons[battler].volatiles.transformed && !gDisableStructs[battler].boosterEnergyActivated) { gDisableStructs[battler].terrainAbilityDone = TRUE; @@ -5358,7 +5358,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS if (abilityCantBeSuppressed) { // Edge case: pokemon under the effect of gastro acid transforms into a pokemon with Comatose (Todo: verify how other unsuppressable abilities behave) - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED + if (gBattleMons[battler].volatiles.transformed && gStatuses3[battler] & STATUS3_GASTRO_ACID && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; @@ -5457,7 +5457,9 @@ bool32 CanBattlerEscape(u32 battler) // no ability check return TRUE; else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; - else if (gBattleMons[battler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + else if (gBattleMons[battler].volatiles.escapePrevention) + return FALSE; + else if (gBattleMons[battler].volatiles.wrapped) return FALSE; else if (gStatuses3[battler] & STATUS3_ROOTED) return FALSE; @@ -5793,7 +5795,7 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum Func bool32 CanBeConfused(u32 battler) { - if (gBattleMons[battler].status2 & STATUS2_CONFUSION + if (gBattleMons[battler].volatiles.confusionTurns > 0 || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) || IsAbilityAndRecord(battler, GetBattlerAbility(battler),ABILITY_OWN_TEMPO)) return FALSE; @@ -6137,9 +6139,9 @@ static bool32 GetMentalHerbEffect(u32 battler) bool32 ret = FALSE; // Check infatuation - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) + if (gBattleMons[battler].volatiles.infatuation) { - gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; + gBattleMons[battler].volatiles.infatuation = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); ret = TRUE; @@ -6163,9 +6165,9 @@ static bool32 GetMentalHerbEffect(u32 battler) ret = TRUE; } // Check torment - if (gBattleMons[battler].status2 & STATUS2_TORMENT) + if (gBattleMons[battler].volatiles.torment == TRUE) { - gBattleMons[battler].status2 &= ~STATUS2_TORMENT; + gBattleMons[battler].volatiles.torment = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; ret = TRUE; } @@ -6209,7 +6211,7 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID) { - if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) return ITEM_NO_EFFECT; if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) @@ -6368,14 +6370,14 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; BattleScriptCall(BattleScript_BerryCureSlpRet); effect = ITEM_STATUS_CHANGE; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION && !UnnerveOn(battler, gLastUsedItem)) + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !UnnerveOn(battler, gLastUsedItem)) { RemoveConfusionStatus(battler); BattleScriptCall(BattleScript_BerryCureConfusionRet); @@ -6392,14 +6394,14 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) } break; case HOLD_EFFECT_CURE_STATUS: - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) && !UnnerveOn(battler, gLastUsedItem)) + if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0) && !UnnerveOn(battler, gLastUsedItem)) { if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } @@ -6413,7 +6415,7 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].volatiles.confusionTurns > 0) StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); gBattleMons[battler].status1 = 0; @@ -6425,10 +6427,10 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) break; case HOLD_EFFECT_CRITICAL_UP: // lansat berry if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + && !(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].volatiles.focusEnergy = TRUE; gBattleScripting.battler = battler; gPotentialItemEffectBattler = battler; BattleScriptCall(BattleScript_BerryFocusEnergyRet); @@ -6453,7 +6455,7 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) u32 effect = ITEM_NO_EFFECT; u32 string = 0; - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) && !UnnerveOn(battler, gLastUsedItem)) + if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0) && !UnnerveOn(battler, gLastUsedItem)) { if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) { @@ -6462,7 +6464,7 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) } if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); string++; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); @@ -6482,7 +6484,7 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); string++; } - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].volatiles.confusionTurns > 0) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); string++; @@ -6585,10 +6587,10 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case HOLD_EFFECT_CRITICAL_UP: if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + && !(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].volatiles.focusEnergy = TRUE; gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); effect = ITEM_EFFECT_OTHER; @@ -6652,7 +6654,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); @@ -6808,10 +6810,10 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); break; case HOLD_EFFECT_CRITICAL_UP: - if (!(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (!(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) { - gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].volatiles.focusEnergy = TRUE; gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); effect = ITEM_EFFECT_OTHER; @@ -6862,14 +6864,14 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) { gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].volatiles.nightmare = FALSE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION && !UnnerveOn(battler, gLastUsedItem)) + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !UnnerveOn(battler, gLastUsedItem)) { RemoveConfusionStatus(battler); BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); @@ -7270,7 +7272,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) void ClearVariousBattlerFlags(u32 battler) { gDisableStructs[battler].furyCutterCounter = 0; - gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; + gBattleMons[battler].volatiles.destinyBond = FALSE; gStatuses3[battler] &= ~STATUS3_GRUDGE; gStatuses4[battler] &= ~ STATUS4_GLAIVE_RUSH; } @@ -7459,7 +7461,7 @@ u8 GetAttackerObedienceForAction() // is not obedient enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); if (moveEffect == EFFECT_RAGE) - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; + gBattleMons[gBattlerAttacker].volatiles.rage = FALSE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) return DISOBEYS_WHILE_ASLEEP; @@ -7485,7 +7487,7 @@ u8 GetAttackerObedienceForAction() // try putting asleep int i; for (i = 0; i < gBattlersCount; i++) - if (gBattleMons[i].status2 & STATUS2_UPROAR) + if (gBattleMons[i].volatiles.uproarTurns) break; if (i == gBattlersCount) return DISOBEYS_FALL_ASLEEP; @@ -7895,7 +7897,7 @@ u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer) u32 i; for (i = 1; i < (5 - rolloutTimer); i++) basePower *= 2; - if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL) + if (gBattleMons[battlerAtk].volatiles.defenseCurl) basePower *= 2; return basePower; } @@ -8431,7 +8433,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) u8 defHighestStat = GetHighestStatId(battlerDef); if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivated) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battlerDef].volatiles.transformed)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; @@ -8440,7 +8442,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) u8 defHighestStat = GetHighestStatId(battlerDef); if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivated) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battlerDef].volatiles.transformed)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; @@ -8683,7 +8685,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_PROTOSYNTHESIS: - if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battlerAtk].volatiles.transformed)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivated) @@ -8694,7 +8696,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) } break; case ABILITY_QUARK_DRIVE: - if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battlerAtk].volatiles.transformed)) { u32 atkHighestStat = GetHighestStatId(battlerAtk); if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivated) @@ -8919,7 +8921,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_METAL_POWDER: - if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) + if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].volatiles.transformed)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_EVIOLITE: @@ -9521,7 +9523,7 @@ static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *m if (ctx->updateFlags) RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_RING_TARGET); } - else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[ctx->battlerDef].status2 & STATUS2_FORESIGHT && mod == UQ_4_12(0.0)) + else if ((ctx->moveType == TYPE_FIGHTING || ctx->moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[ctx->battlerDef].volatiles.foresight && mod == UQ_4_12(0.0)) { mod = UQ_4_12(1.0); } @@ -9964,7 +9966,7 @@ void ActivateUltraBurst(u32 battler) bool32 IsBattlerMegaEvolved(u32 battler) { // While Transform does copy stats and visuals, it shouldn't be counted as true Mega Evolution. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; return (gSpeciesInfo[gBattleMons[battler].species].isMegaEvolution); } @@ -9972,7 +9974,7 @@ bool32 IsBattlerMegaEvolved(u32 battler) bool32 IsBattlerPrimalReverted(u32 battler) { // While Transform does copy stats and visuals, it shouldn't be counted as true Primal Revesion. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; return (gSpeciesInfo[gBattleMons[battler].species].isPrimalReversion); } @@ -9980,7 +9982,7 @@ bool32 IsBattlerPrimalReverted(u32 battler) bool32 IsBattlerUltraBursted(u32 battler) { // While Transform does copy stats and visuals, it shouldn't be counted as true Ultra Burst. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; return (gSpeciesInfo[gBattleMons[battler].species].isUltraBurst); } @@ -9988,7 +9990,7 @@ bool32 IsBattlerUltraBursted(u32 battler) bool32 IsBattlerInTeraForm(u32 battler) { // While Transform does copy stats and visuals, it shouldn't be counted as a true Tera Form. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + if (gBattleMons[battler].volatiles.transformed) return FALSE; return (gSpeciesInfo[gBattleMons[battler].species].isTeraForm); } @@ -10106,7 +10108,7 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) bool32 CanBattlerFormChange(u32 battler, enum FormChanges method) { // Can't change form if transformed. - if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED + if (gBattleMons[battler].volatiles.transformed && B_TRANSFORM_FORM_CHANGES >= GEN_5) return FALSE; // Mega Evolved and Ultra Bursted Pokémon should always revert to normal upon fainting or ending the battle. @@ -10856,7 +10858,7 @@ void RecalcBattlerStats(u32 battler, struct Pokemon *mon, bool32 isDynamaxing) void RemoveConfusionStatus(u32 battler) { - gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].volatiles.confusionTurns = 0; gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; } @@ -11415,7 +11417,7 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) return FALSE; } -#define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeBitSize, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; +#define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeMaxValue, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; // Gets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred @@ -11433,7 +11435,7 @@ u32 GetMonVolatile(u32 battler, enum Volatile _volatile) } } -#define UNPACK_VOLATILE_SETTERS(_enum, _fieldName, _typeBitSize, ...) case _enum: gBattleMons[battler].volatiles._fieldName = min(GET_VOLATILE_MAXIMUM(_typeBitSize), newValue); break; +#define UNPACK_VOLATILE_SETTERS(_enum, _fieldName, _typeMaxValue, ...) case _enum: gBattleMons[battler].volatiles._fieldName = min(GET_VOLATILE_MAXIMUM(_typeMaxValue), newValue); break; // Sets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred @@ -11452,6 +11454,30 @@ void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue) } } +bool32 ItemHealMonVolatile(u32 battler, u16 itemId) +{ + bool32 statusChanged = FALSE; + const u8 *effect = GetItemEffect(itemId); + if (effect[3] & ITEM3_STATUS_ALL) + { + statusChanged = (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0); + gBattleMons[battler].volatiles.infatuation = 0; + gBattleMons[battler].volatiles.confusionTurns = 0; + } + else if (effect[0] & ITEM0_INFATUATION) + { + statusChanged = !!gBattleMons[battler].volatiles.infatuation; + gBattleMons[battler].volatiles.infatuation = 0; + } + else if (effect[3] & ITEM3_CONFUSION) + { + statusChanged = gBattleMons[battler].volatiles.confusionTurns > 0; + gBattleMons[battler].volatiles.confusionTurns = 0; + } + + return statusChanged; +} + // Hazards are added to a queue and applied based in order (FIFO) void PushHazardTypeToQueue(u32 side, enum Hazards hazardType) { @@ -11634,7 +11660,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (defAbility == ABILITY_UNAWARE) accStage = DEFAULT_STAT_STAGE; - if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + if (gBattleMons[battlerDef].volatiles.foresight || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) buff = accStage; else buff = accStage + DEFAULT_STAT_STAGE - evasionStage; diff --git a/src/battle_util2.c b/src/battle_util2.c index ba8db66f5d..3a05e5ac13 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -133,7 +133,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) { // Wake up from Uproar gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; @@ -162,7 +162,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) else { // Wake up - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; BattleScriptCall(BattleScript_MoveUsedWokeUp); effect = 2; diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 4f33ff5a17..638e9ef901 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -486,9 +486,9 @@ void SetZEffect(void) break; } case Z_EFFECT_BOOST_CRITS: - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY_ANY)) + if (!(gBattleMons[gBattlerAttacker].volatiles.dragonCheer || gBattleMons[gBattlerAttacker].volatiles.focusEnergy)) { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[gBattlerAttacker].volatiles.focusEnergy = TRUE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_BOOST_CRITS; BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_ZEffectPrintString; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 465d3c0153..5dba4cb657 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -3108,7 +3108,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, - .argument = { .status = STATUS2_FOCUS_ENERGY }, + .argument = { .status = VOLATILE_FOCUS_ENERGY }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .snatchAffected = TRUE, diff --git a/src/item.c b/src/item.c index 45a3dfe421..52d52923ca 100644 --- a/src/item.c +++ b/src/item.c @@ -958,17 +958,18 @@ u32 GetItemStatus1Mask(u16 itemId) return 0; } -u32 GetItemStatus2Mask(u16 itemId) +bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile _volatile) { const u8 *effect = GetItemEffect(itemId); - if (effect[3] & ITEM3_STATUS_ALL) - return STATUS2_INFATUATION | STATUS2_CONFUSION; - else if (effect[0] & ITEM0_INFATUATION) - return STATUS2_INFATUATION; - else if (effect[3] & ITEM3_CONFUSION) - return STATUS2_CONFUSION; - else - return 0; + switch (_volatile) + { + case VOLATILE_CONFUSION: + return (effect[3] & ITEM3_STATUS_ALL) || (effect[3] & ITEM3_CONFUSION); + case VOLATILE_INFATUATION: + return (effect[3] & ITEM3_STATUS_ALL) || (effect[0] & ITEM0_INFATUATION); + default: + return FALSE; + } } u32 GetItemSellPrice(u32 itemId) diff --git a/src/item_use.c b/src/item_use.c index 9df366e595..ace6aaccf6 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1191,12 +1191,25 @@ void ItemUseInBattle_PartyMenuChooseMove(u8 taskId) ItemUseInBattle_ShowPartyMenu(taskId); } -static bool32 SelectedMonHasStatus2(u16 itemId) +static bool32 IteamHealsMonVolatile(u32 battler, u16 itemId) +{ + const u8 *effect = GetItemEffect(itemId); + if (effect[3] & ITEM3_STATUS_ALL) + return (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0); + else if (effect[0] & ITEM0_INFATUATION) + return gBattleMons[battler].volatiles.infatuation; + else if (effect[3] & ITEM3_CONFUSION) + return gBattleMons[battler].volatiles.confusionTurns > 0; + + return FALSE; +} + +static bool32 SelectedMonHasVolatile(u16 itemId) { if (gPartyMenu.slotId == 0) - return gBattleMons[0].status2 & GetItemStatus2Mask(itemId); + return IteamHealsMonVolatile(0, itemId); else if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI) && gPartyMenu.slotId == 1) - return gBattleMons[2].status2 & GetItemStatus2Mask(itemId); + return IteamHealsMonVolatile(2, itemId); return FALSE; } @@ -1224,7 +1237,7 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) cannotUse = TRUE; break; case EFFECT_ITEM_SET_FOCUS_ENERGY: - if (gBattleMons[gBattlerInMenuId].status2 & STATUS2_FOCUS_ENERGY_ANY) + if (gBattleMons[gBattlerInMenuId].volatiles.dragonCheer || gBattleMons[gBattlerInMenuId].volatiles.focusEnergy) cannotUse = TRUE; break; case EFFECT_ITEM_SET_MIST: @@ -1272,13 +1285,13 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) break; case EFFECT_ITEM_CURE_STATUS: if (!((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || SelectedMonHasStatus2(itemId))) + || SelectedMonHasVolatile(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_HEAL_AND_CURE_STATUS: if ((hp == 0 || hp == GetMonData(mon, MON_DATA_MAX_HP)) && !((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || SelectedMonHasStatus2(itemId))) + || SelectedMonHasVolatile(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_REVIVE: diff --git a/src/pokemon.c b/src/pokemon.c index 91524ae97d..85ef8a2fc9 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3693,7 +3693,7 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) for (i = 0; i < NUM_BATTLE_STATS; i++) dst->statStages[i] = DEFAULT_STAT_STAGE; - dst->status2 = 0; + memset(&dst->volatiles, 0, sizeof(struct Volatiles)); } void CopyPartyMonToBattleData(u32 battler, u32 partyIndex) diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 2d9556311f..500a83e888 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -756,7 +756,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) gDisableStructs[battler].mimickedMoves |= mimickedMoveSlots[j] << j; } - if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battler].volatiles.transformed)) { struct Pokemon *mon = GetBattlerMon(battler); for (j = 0; j < MAX_MON_MOVES; j++) diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index da6bbf87df..828e596525 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Shield Dust blocks secondary effects") MESSAGE("The opposing Vivillon was prevented from healing!"); } } THEN { // Can't find good way to test trapping - EXPECT(!(opponent->status2 & STATUS2_ESCAPE_PREVENTION)); + EXPECT(!opponent->volatiles.escapePrevention); } } @@ -78,8 +78,8 @@ SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } } diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 220eaa362c..f9fb2e0081 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1221,7 +1221,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Terror traps both opponents") MESSAGE("The opposing Wobbuffet can no longer escape!"); MESSAGE("The opposing Wobbuffet can no longer escape!"); } THEN { // Can't find good way to test trapping - EXPECT(opponentLeft->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponentLeft->volatiles.escapePrevention); } } @@ -1238,7 +1238,7 @@ SINGLE_BATTLE_TEST("Dynamax: Baton Pass passes G-Max Terror's escape prevention ANIMATION(ANIM_TYPE_MOVE, MOVE_G_MAX_TERROR, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent); } THEN { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); } } diff --git a/test/battle/hold_effect/berserk_gene.c b/test/battle/hold_effect/berserk_gene.c index 640198c992..bbeb356701 100644 --- a/test/battle/hold_effect/berserk_gene.c +++ b/test/battle/hold_effect/berserk_gene.c @@ -217,7 +217,7 @@ SINGLE_BATTLE_TEST("Berserk Gene causes infinite confusion") // check if bit is } } -SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 status2) +SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 confusionTurns) { u32 turns; PARAMETRIZE { turns = 1; } @@ -231,9 +231,9 @@ SINGLE_BATTLE_TEST("Berserk Gene causes confusion timer to not tick down", u32 s TURN {} } } THEN { - results[i].status2 = player->status2; + results[i].confusionTurns = player->volatiles.confusionTurns; } FINALLY { - EXPECT_EQ(results[0].status2, results[1].status2); + EXPECT_EQ(results[0].confusionTurns, results[1].confusionTurns); } } diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index 90593e7cc5..0b3d0c2ed6 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Covert Cloak blocks secondary effects") MESSAGE("The opposing Wobbuffet was prevented from healing!"); } } THEN { // Can't find good way to test trapping - EXPECT(!(opponent->status2 & STATUS2_ESCAPE_PREVENTION)); + EXPECT(!opponent->volatiles.escapePrevention); } } @@ -82,8 +82,8 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } } diff --git a/test/battle/item_effect/cure_status.c b/test/battle/item_effect/cure_status.c index 6f7d403c43..919b4539af 100644 --- a/test/battle/item_effect/cure_status.c +++ b/test/battle/item_effect/cure_status.c @@ -389,6 +389,6 @@ SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler } SCENE { MESSAGE("Wobbuffet had its status healed!"); } THEN { - EXPECT_EQ(player->status2, STATUS1_NONE); // because we dont have STATUS2_NONE + EXPECT(player->volatiles.confusionTurns == 0); } } diff --git a/test/battle/move_effect/attract.c b/test/battle/move_effect/attract.c index be30483358..2964b7b611 100644 --- a/test/battle/move_effect/attract.c +++ b/test/battle/move_effect/attract.c @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Attract causes the target to become infatuated with the user ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Nidoking fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Attract ignores type immunity") ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Misdreavus fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Attract bypasses Substitute") ANIMATION(ANIM_TYPE_MOVE, MOVE_ATTRACT, player); MESSAGE("The opposing Nidoking fell in love!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Attract fails if the target is already infatuated") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(opponent->status2 & STATUS2_INFATUATION); + EXPECT(opponent->volatiles.infatuation); } } @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Attract fails when used on a Pokémon of the same gender") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } @@ -100,6 +100,6 @@ SINGLE_BATTLE_TEST("Attract fails when used on a genderless Pokémon") MESSAGE("Nidoqueen used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } diff --git a/test/battle/move_effect/baton_pass.c b/test/battle/move_effect/baton_pass.c index cb6530ae89..5cb1ac4c05 100644 --- a/test/battle/move_effect/baton_pass.c +++ b/test/battle/move_effect/baton_pass.c @@ -37,7 +37,7 @@ TO_DO_BATTLE_TEST("Baton Pass doesn't pass ability changes"); // // Move these to the corresponding effect files. // -TO_DO_BATTLE_TEST("Baton Pass passes confusion status"); // test/battle/status2/confusion.c +TO_DO_BATTLE_TEST("Baton Pass passes confusion status"); // test/battle/volatiles/confusion.c TO_DO_BATTLE_TEST("Baton Pass passes Fairy lock's escape prevention effect"); // test/battle/move_effect/fairy_lock.c TO_DO_BATTLE_TEST("Baton Pass passes Focus Energy's effect"); // test/battle/move_effect/focus_energy.c diff --git a/test/battle/move_effect/captivate.c b/test/battle/move_effect/captivate.c index 224e6bef07..27790b8461 100644 --- a/test/battle/move_effect/captivate.c +++ b/test/battle/move_effect/captivate.c @@ -92,7 +92,7 @@ SINGLE_BATTLE_TEST("Attract fails when used by a genderless Pokémon") MESSAGE("Starmie used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } @@ -107,6 +107,6 @@ SINGLE_BATTLE_TEST("Attract fails if both the user and the target are genderless MESSAGE("Starmie used Attract!"); MESSAGE("But it failed!"); } THEN { - EXPECT(!(opponent->status2 & STATUS2_INFATUATION)); + EXPECT(!(opponent->volatiles.infatuation)); } } diff --git a/test/battle/move_effect_secondary/thrash.c b/test/battle/move_effect_secondary/thrash.c index 83a49554d7..e7f573d1ed 100644 --- a/test/battle/move_effect_secondary/thrash.c +++ b/test/battle/move_effect_secondary/thrash.c @@ -114,6 +114,6 @@ SINGLE_BATTLE_TEST("Petal Dance does not lock mons that copy the move with Dance ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, opponent); // How do you actually test locking? - EXPECT(!(opponent->status2 & STATUS2_MULTIPLETURNS)); + EXPECT(!(opponent->volatiles.multipleTurns)); } } diff --git a/test/battle/move_effect_secondary/trap_both.c b/test/battle/move_effect_secondary/trap_both.c index ec06b25c30..76d572dad9 100644 --- a/test/battle/move_effect_secondary/trap_both.c +++ b/test/battle/move_effect_secondary/trap_both.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Jaw Lock traps both opponents") ANIMATION(ANIM_TYPE_MOVE, MOVE_JAW_LOCK, player); MESSAGE("Neither Pokémon can run away!"); } THEN { // Can't find good way to test trapping - EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); - EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(opponent->volatiles.escapePrevention); + EXPECT(player->volatiles.escapePrevention); } } diff --git a/test/battle/status2/confusion.c b/test/battle/volatiles/confusion.c similarity index 100% rename from test/battle/status2/confusion.c rename to test/battle/volatiles/confusion.c From 4e0a8167be5bfd9ef2d96a3ca34db27f4edf503b Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 00:37:11 -0400 Subject: [PATCH 133/248] Test works? I think? --- test/battle/ai/ai_assume_powerful_status.c | 36 ++++++---------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/test/battle/ai/ai_assume_powerful_status.c b/test/battle/ai/ai_assume_powerful_status.c index 7c1f08f352..1fd16adcf4 100644 --- a/test/battle/ai/ai_assume_powerful_status.c +++ b/test/battle/ai/ai_assume_powerful_status.c @@ -8,11 +8,8 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_POWERFUL_STATUS correctly records assumed PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS); PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_LOW_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS); - u32 aiFlag = 0; - PARAMETRIZE { aiFlag = AI_FLAG_ASSUME_POWERFUL_STATUS; } - PARAMETRIZE { aiFlag = 0; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiFlag); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_POWERFUL_STATUS); PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_COURT_CHANGE, MOVE_FAKE_OUT); } PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HAIL, MOVE_SHED_TAIL, MOVE_THUNDERBOLT); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -20,29 +17,14 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_POWERFUL_STATUS correctly records assumed } WHEN { TURN { MOVE(playerLeft, MOVE_TACKLE, target:opponentLeft); MOVE(playerRight, MOVE_THUNDERBOLT, target:opponentRight); } } THEN { - if (aiFlag == AI_FLAG_ASSUME_POWERFUL_STATUS) - { - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_COURT_CHANGE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FAKE_OUT); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_COURT_CHANGE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FAKE_OUT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_HAIL); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_SHED_TAIL); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); - } - else if (aiFlag == 0) - { - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_NONE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_NONE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_NONE); - - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_NONE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_NONE); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); - EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); - } + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][0], MOVE_HAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][1], MOVE_SHED_TAIL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][2], MOVE_THUNDERBOLT); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); } } From 3defa242826df1e8b35bbf81efab194b0f1cfda6 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 00:41:14 -0400 Subject: [PATCH 134/248] Adding other healing move effects. --- src/battle_ai_util.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index f09fe2d132..9f8d6c94ea 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -290,12 +290,18 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_HEALING_WISH: case EFFECT_LIFE_DEW: case EFFECT_MEMENTO: + case EFFECT_MOONLIGHT: + case EFFECT_MORNING_SUN: case EFFECT_PARTING_SHOT: case EFFECT_PROTECT: case EFFECT_REST: case EFFECT_RESTORE_HP: case EFFECT_ROAR: + case EFFECT_ROOST: + case EFFECT_SHORE_UP: case EFFECT_SLEEP_TALK: + case EFFECT_SOFTBOILED: + case EFFECT_SYNTHESIS: case EFFECT_TAUNT: case EFFECT_TAILWIND: case EFFECT_TELEPORT: From 96274c772d8c446cd399b38bf96a26eb5d79da10 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 00:42:46 -0400 Subject: [PATCH 135/248] Also adding Helping Hand. --- src/battle_ai_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9f8d6c94ea..2c7c850d1e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -288,6 +288,7 @@ bool32 ShouldRecordStatusMove(u32 move) case EFFECT_HAZE: case EFFECT_HEAL_BELL: case EFFECT_HEALING_WISH: + case EFFECT_HELPING_HAND: case EFFECT_LIFE_DEW: case EFFECT_MEMENTO: case EFFECT_MOONLIGHT: From c7b8787f59738d6d887cb4f81495cd0a3fc1d42a Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 00:55:52 -0400 Subject: [PATCH 136/248] Better description in the documentation. --- docs/tutorials/ai_flags.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index 9f39090b65..6b8a2e941f 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -148,8 +148,9 @@ AI has full knowledge of player moves, abilities, and hold items, and can use th A significantly more restricted version of `AI_FLAG_OMNISCIENT`, the AI only knows the player's STAB moves, as their existence would be reasonable to assume in almost any case. ## `AI_FLAG_ASSUME_POWERFUL_STATUS` -A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know if the player has certain iconic status moves, plus also Fake Out and fixed percentage moves like Super Fang. +A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know if the player has certain strong status moves, plus also Fake Out and fixed percentage moves like Super Fang. The intention is so that if the AI has a counterplay implemented, it will seem to have guessed if the player's pokemon has a move, without giving the AI perfect information. For example, with Omniscient set, the AI will not put a pokemon to sleep if it has Sleep Talk; with neither Assume Powerful Status nor Omniscient set, the AI will always assume the pokemon does not have Sleep Talk. +Percentages for the three groupings (high odds, medium odds, and low odds) are defined in `include/config/ai.h` under `ASSUME_POWERFUL_STATUS_HIGH_ODDS`, `ASSUME_POWERFUL_STATUS_MEDIUM_ODDS`, and `ASSUME_POWERFUL_STATUS_LOW_ODDS`. Moves are sorted in `src/battle_ai_util.c` within `ShouldRecordStatusMove()` ## `AI_FLAG_SMART_MON_CHOICES` Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled. From 9ccb1fbc3a528b001a8f79394e5642d8fb3a8089 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 01:01:18 -0400 Subject: [PATCH 137/248] Lowering the default odds to 90%, 70%, and 40%. --- include/config/ai.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index be091649af..8a97430d4b 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -77,9 +77,9 @@ #define ASSUME_STAB_SEES_ABILITY FALSE // Flag also gives omniscience for player's ability. Can use AI_FLAG_WEIGH_ABILITY_PREDICTION instead for smarter prediction without omniscience. // AI_FLAG_ASSUME_POWERFUL_STATUS settings -#define ASSUME_POWERFUL_STATUS_HIGH_ODDS 95 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore -#define ASSUME_POWERFUL_STATUS_MEDIUM_ODDS 75 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect -#define ASSUME_POWERFUL_STATUS_LOW_ODDS 50 // Chance for AI to see niche moves a pokemon may have but probably won't, like Trick Room or Speed Swap +#define ASSUME_POWERFUL_STATUS_HIGH_ODDS 90 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore +#define ASSUME_POWERFUL_STATUS_MEDIUM_ODDS 70 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect +#define ASSUME_POWERFUL_STATUS_LOW_ODDS 40 // Chance for AI to see niche moves a pokemon may have but probably won't, like Trick Room or Speed Swap // AI_FLAG_SMART_SWITCHING settings #define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise From c9ec896312f60274254e0610002ae26fd2c15045 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 12 Jul 2025 12:38:06 -0400 Subject: [PATCH 138/248] Refactor battle environment (#4891) --- data/battle_anim_scripts.s | 2 +- include/battle_environment.h | 17 + include/battle_setup.h | 2 +- include/config/battle.h | 2 +- include/constants/battle.h | 15 +- include/constants/form_change_types.h | 4 +- include/pokemon_sprite_visualizer.h | 2 +- src/battle_bg.c | 465 ++++--------------------- src/battle_script_commands.c | 166 +-------- src/battle_setup.c | 2 +- src/data/battle_environment.h | 434 +++++++++++++++++++++++ src/data/graphics/battle_environment.h | 38 -- src/debug.c | 22 +- src/pokemon_sprite_visualizer.c | 32 +- 14 files changed, 584 insertions(+), 619 deletions(-) create mode 100644 include/battle_environment.h create mode 100644 src/data/battle_environment.h diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8b504a37f9..08753aac8a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -27586,7 +27586,7 @@ gBattleAnimMove_RazorLeaf:: end gBattleAnimMove_NaturePower:: - @ No actual animation, uses the animation of a move from sNaturePowerMoves instead + @ No actual animation, uses the animation of a move from gBattleEnvironmentInfo.naturePower instead gBattleAnimMove_AncientPower:: loadspritegfx ANIM_TAG_ROCKS diff --git a/include/battle_environment.h b/include/battle_environment.h new file mode 100644 index 0000000000..e9435aa454 --- /dev/null +++ b/include/battle_environment.h @@ -0,0 +1,17 @@ +#ifndef GUARD_BATTLE_ENVIRONMENT_H +#define GUARD_BATTLE_ENVIRONMENT_H + +#include "constants/battle.h" +#include "battle_bg.h" + +struct BattleEnvironment { + u8 name[26]; + u16 naturePower; + u16 secretPowerEffect; + u8 camouflageType; + struct BattleBackground background; +}; + +extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT]; + +#endif // GUARD_BATTLE_ENVIRONMENT_H diff --git a/include/battle_setup.h b/include/battle_setup.h index 7cddc06725..aa01178d8d 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -60,7 +60,7 @@ void BattleSetup_StartLatiBattle(void); void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); -enum BattleEnvironment BattleSetup_GetEnvironmentId(void); +enum BattleEnvironments BattleSetup_GetEnvironmentId(void); u8 GetWildBattleTransition(void); u8 GetTrainerBattleTransition(void); u8 GetSpecialBattleTransition(s32 id); diff --git a/include/config/battle.h b/include/config/battle.h index 06373f2c19..a58b174b46 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -262,7 +262,7 @@ #define B_TERRAIN_TYPE_BOOST GEN_LATEST // In Gen8, damage is boosted by 30% instead of 50%. #define B_SECRET_POWER_EFFECT GEN_LATEST // Secret Power's effects change depending on terrain and generation. See MOVE_EFFECT_SECRET_POWER's case in `SetMoveEffect`. #define B_SECRET_POWER_ANIMATION GEN_LATEST // Secret Power's animations change depending on terrain and generation. -#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See sNaturePowerMoves. +#define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See gBattleEnvironmentInfo. #define B_CAMOUFLAGE_TYPES GEN_LATEST // Camouflage changes the user to different types depending on terrain and generation. See sTerrainToType. #define B_NEW_TERRAIN_BACKGROUNDS FALSE // If set to TRUE, uses new terrain backgrounds for Electric, Misty, Grassy and Psychic Terrain. diff --git a/include/constants/battle.h b/include/constants/battle.h index b87176ff7a..28b39117ff 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -531,7 +531,7 @@ enum MoveEffects #define MOVE_EFFECT_CONTINUE 0x8000 // Battle environment defines for gBattleEnvironment. -enum BattleEnvironment +enum BattleEnvironments { BATTLE_ENVIRONMENT_GRASS, BATTLE_ENVIRONMENT_LONG_GRASS, @@ -543,6 +543,19 @@ enum BattleEnvironment BATTLE_ENVIRONMENT_CAVE, BATTLE_ENVIRONMENT_BUILDING, BATTLE_ENVIRONMENT_PLAIN, + BATTLE_ENVIRONMENT_FRONTIER, + BATTLE_ENVIRONMENT_GYM, + BATTLE_ENVIRONMENT_LEADER, + BATTLE_ENVIRONMENT_MAGMA, + BATTLE_ENVIRONMENT_AQUA, + BATTLE_ENVIRONMENT_SIDNEY, + BATTLE_ENVIRONMENT_PHOEBE, + BATTLE_ENVIRONMENT_GLACIA, + BATTLE_ENVIRONMENT_DRAKE, + BATTLE_ENVIRONMENT_CHAMPION, + BATTLE_ENVIRONMENT_GROUDON, + BATTLE_ENVIRONMENT_KYOGRE, + BATTLE_ENVIRONMENT_RAYQUAZA, // New battle environments are used for Secret Power but not fully implemented. BATTLE_ENVIRONMENT_SOARING, BATTLE_ENVIRONMENT_SKY_PILLAR, diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index a1c4c5bc45..10de5f785f 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -61,8 +61,8 @@ enum FormChanges // param2: a move that will be replaced, optional // param3: a new move to replace it with, optional FORM_CHANGE_END_BATTLE, - // Form change that activates at the end of a battle based on the terrain if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE. - // param1: battle terrain to check. + // Form change that activates at the end of a battle based on the environment if it participated in the battle and hasn't fainted. Takes priority over FORM_CHANGE_END_BATTLE. + // param1: battle environment to check. FORM_CHANGE_END_BATTLE_ENVIRONMENT, // Form change that activates when the Pokémon is switched out in battle. // param1: ability to check, optional diff --git a/include/pokemon_sprite_visualizer.h b/include/pokemon_sprite_visualizer.h index fdd53d2ce8..4205c6dc20 100644 --- a/include/pokemon_sprite_visualizer.h +++ b/include/pokemon_sprite_visualizer.h @@ -81,7 +81,7 @@ struct PokemonSpriteVisualizer u8 animIdBack; u8 animIdFront; u8 battleBgType; - u8 battleTerrain; + u8 battleEnvironment; u8 currentSubmenu; u8 submenuYpos[3]; }; diff --git a/src/battle_bg.c b/src/battle_bg.c index 6de96168f7..11a28ea2fa 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -5,6 +5,7 @@ #include "battle_main.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_environment.h" #include "bg.h" #include "data.h" #include "decompress.h" @@ -26,6 +27,7 @@ #include "constants/trainers.h" #include "constants/battle_anim.h" #include "constants/battle_partner.h" +#include "data/battle_environment.h" // .rodata @@ -609,98 +611,75 @@ const struct WindowTemplate *const gBattleWindowTemplates[] = [B_WIN_TYPE_ARENA] = sBattleArenaWindowTemplates, }; -const struct BattleBackground sBattleEnvironmentTable[] = +// If current map scene equals any of the values in sMapBattleSceneMapping, +// use its battle terrain value. Otherwise, use the default. +static u8 GetBattleEnvironmentByMapScene(u8 mapBattleScene) { - [BATTLE_ENVIRONMENT_GRASS] = + int i; + for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++) { - .tileset = gBattleEnvironmentTiles_TallGrass, - .tilemap = gBattleEnvironmentTilemap_TallGrass, - .entryTileset = gBattleEnvironmentAnimTiles_TallGrass, - .entryTilemap = gBattleEnvironmentAnimTilemap_TallGrass, - .palette = gBattleEnvironmentPalette_TallGrass, - }, + if (mapBattleScene == sMapBattleSceneMapping[i].mapScene) + return sMapBattleSceneMapping[i].battleEnvironment; + } + return BATTLE_ENVIRONMENT_PLAIN; +} - [BATTLE_ENVIRONMENT_LONG_GRASS] = - { - .tileset = gBattleEnvironmentTiles_LongGrass, - .tilemap = gBattleEnvironmentTilemap_LongGrass, - .entryTileset = gBattleEnvironmentAnimTiles_LongGrass, - .entryTilemap = gBattleEnvironmentAnimTilemap_LongGrass, - .palette = gBattleEnvironmentPalette_LongGrass, - }, +// Loads the initial battle terrain. +static void LoadBattleEnvironmentGfx(u16 terrain) +{ + if (terrain >= NELEMS(gBattleEnvironmentInfo)) + terrain = BATTLE_ENVIRONMENT_PLAIN; // If higher than the number of entries in gBattleEnvironmentInfo, use the default. + // Copy to bg3 + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tileset, (void *)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.tilemap, (void *)(BG_SCREEN_ADDR(26))); + LoadPalette(gBattleEnvironmentInfo[terrain].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); +} - [BATTLE_ENVIRONMENT_SAND] = - { - .tileset = gBattleEnvironmentTiles_Sand, - .tilemap = gBattleEnvironmentTilemap_Sand, - .entryTileset = gBattleEnvironmentAnimTiles_Sand, - .entryTilemap = gBattleEnvironmentAnimTilemap_Sand, - .palette = gBattleEnvironmentPalette_Sand, - }, +// Loads the entry associated with the battle terrain. +// This can be the grass moving on the screen at the start of a wild encounter in tall grass. +static void LoadBattleEnvironmentEntryGfx(u16 terrain) +{ + if (terrain >= NELEMS(gBattleEnvironmentInfo)) + terrain = BATTLE_ENVIRONMENT_PLAIN; + // Copy to bg1 + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTileset, (void *)BG_CHAR_ADDR(1)); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[terrain].background.entryTilemap, (void *)BG_SCREEN_ADDR(28)); +} - [BATTLE_ENVIRONMENT_UNDERWATER] = - { - .tileset = gBattleEnvironmentTiles_Underwater, - .tilemap = gBattleEnvironmentTilemap_Underwater, - .entryTileset = gBattleEnvironmentAnimTiles_Underwater, - .entryTilemap = gBattleEnvironmentAnimTilemap_Underwater, - .palette = gBattleEnvironmentPalette_Underwater, - }, +static u8 GetBattleEnvironmentOverride(void) +{ + u8 battleScene = GetCurrentMapBattleScene(); - [BATTLE_ENVIRONMENT_WATER] = + if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) + return BATTLE_ENVIRONMENT_FRONTIER; + else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - .tileset = gBattleEnvironmentTiles_Water, - .tilemap = gBattleEnvironmentTilemap_Water, - .entryTileset = gBattleEnvironmentAnimTiles_Water, - .entryTilemap = gBattleEnvironmentAnimTilemap_Water, - .palette = gBattleEnvironmentPalette_Water, - }, + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + { + case SPECIES_GROUDON: + return BATTLE_ENVIRONMENT_GROUDON; + case SPECIES_KYOGRE: + return BATTLE_ENVIRONMENT_KYOGRE; + case SPECIES_RAYQUAZA: + return BATTLE_ENVIRONMENT_RAYQUAZA; + default: + return gBattleEnvironment; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); + if (trainerClass == TRAINER_CLASS_LEADER) + return BATTLE_ENVIRONMENT_LEADER; + else if (trainerClass == TRAINER_CLASS_CHAMPION) + return BATTLE_ENVIRONMENT_CHAMPION; + } - [BATTLE_ENVIRONMENT_POND] = - { - .tileset = gBattleEnvironmentTiles_PondWater, - .tilemap = gBattleEnvironmentTilemap_PondWater, - .entryTileset = gBattleEnvironmentAnimTiles_PondWater, - .entryTilemap = gBattleEnvironmentAnimTilemap_PondWater, - .palette = gBattleEnvironmentPalette_PondWater, - }, + if (battleScene == MAP_BATTLE_SCENE_NORMAL) + return gBattleEnvironment; - [BATTLE_ENVIRONMENT_MOUNTAIN] = - { - .tileset = gBattleEnvironmentTiles_Rock, - .tilemap = gBattleEnvironmentTilemap_Rock, - .entryTileset = gBattleEnvironmentAnimTiles_Rock, - .entryTilemap = gBattleEnvironmentAnimTilemap_Rock, - .palette = gBattleEnvironmentPalette_Rock, - }, - - [BATTLE_ENVIRONMENT_CAVE] = - { - .tileset = gBattleEnvironmentTiles_Cave, - .tilemap = gBattleEnvironmentTilemap_Cave, - .entryTileset = gBattleEnvironmentAnimTiles_Cave, - .entryTilemap = gBattleEnvironmentAnimTilemap_Cave, - .palette = gBattleEnvironmentPalette_Cave, - }, - - [BATTLE_ENVIRONMENT_BUILDING] = - { - .tileset = gBattleEnvironmentTiles_Building, - .tilemap = gBattleEnvironmentTilemap_Building, - .entryTileset = gBattleEnvironmentAnimTiles_Building, - .entryTilemap = gBattleEnvironmentAnimTilemap_Building, - .palette = gBattleEnvironmentPalette_Building, - }, - - [BATTLE_ENVIRONMENT_PLAIN] = - { - .tileset = gBattleEnvironmentTiles_Building, - .tilemap = gBattleEnvironmentTilemap_Building, - .entryTileset = gBattleEnvironmentAnimTiles_Building, - .entryTilemap = gBattleEnvironmentAnimTilemap_Building, - .palette = gBattleEnvironmentPalette_Plain, - }, -}; + return GetBattleEnvironmentByMapScene(battleScene); +} void BattleInitBgsAndWindows(void) { @@ -751,109 +730,7 @@ void LoadBattleMenuWindowGfx(void) void DrawMainBattleBackground(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) - { - case SPECIES_GROUDON: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case SPECIES_KYOGRE: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Water, (void*)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case SPECIES_RAYQUAZA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Rayquaza, (void*)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - default: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - return; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - return; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GYM: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_MAGMA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_AQUA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_SIDNEY: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_PHOEBE: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GLACIA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_DRAKE: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_FRONTIER: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } + LoadBattleEnvironmentGfx(GetBattleEnvironmentOverride()); } void LoadBattleTextboxAndBackground(void) @@ -1147,8 +1024,7 @@ void DrawBattleEntryBackground(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); } else { @@ -1167,20 +1043,17 @@ void DrawBattleEntryBackground(void) switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) { case SPECIES_GROUDON: - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Cave, (void*)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Cave, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_CAVE); break; case SPECIES_KYOGRE: - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Underwater, (void*)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Underwater, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_UNDERWATER); break; case SPECIES_RAYQUAZA: - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Rayquaza, (void*)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Rayquaza, (void*)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_RAYQUAZA); break; default: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTileset, (void *)(BG_CHAR_ADDR(1))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[gBattleEnvironment].background.entryTilemap, (void *)(BG_SCREEN_ADDR(28))); break; } } @@ -1191,27 +1064,23 @@ void DrawBattleEntryBackground(void) enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (trainerClass == TRAINER_CLASS_LEADER) { - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); return; } else if (trainerClass == TRAINER_CLASS_CHAMPION) { - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); return; } } if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL) { - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTileset, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].entryTilemap, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); } else { - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); } } } @@ -1233,195 +1102,13 @@ bool8 LoadChosenBattleElement(u8 caseId) LoadPalette(gBattleTextboxPalette, BG_PLTT_ID(0), 2 * PLTT_SIZE_4BPP); break; case 3: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) - { - case SPECIES_GROUDON: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Cave, (void*)(BG_CHAR_ADDR(2))); - break; - case SPECIES_KYOGRE: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void*)(BG_SCREEN_ADDR(2))); - break; - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tileset, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_GYM: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_MAGMA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_AQUA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_SIDNEY: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_PHOEBE: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_GLACIA: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_DRAKE: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Stadium, (void *)(BG_CHAR_ADDR(2))); - break; - case MAP_BATTLE_SCENE_FRONTIER: - DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void *)(BG_CHAR_ADDR(2))); - break; - } - } + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tileset, (void *)(BG_CHAR_ADDR(2))); break; case 4: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Cave, (void*)(BG_SCREEN_ADDR(26))); - else - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Water, (void *)(BG_SCREEN_ADDR(26))); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[gBattleEnvironment].tilemap, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_GYM: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_MAGMA: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_AQUA: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_SIDNEY: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_PHOEBE: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_GLACIA: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_DRAKE: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Stadium, (void *)(BG_SCREEN_ADDR(26))); - break; - case MAP_BATTLE_SCENE_FRONTIER: - DecompressDataWithHeaderVram(gBattleEnvironmentTilemap_Building, (void *)(BG_SCREEN_ADDR(26))); - break; - } - } + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.tilemap, (void *)(BG_SCREEN_ADDR(26))); break; case 5: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) - { - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) - { - if (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) == SPECIES_GROUDON) - LoadPalette(gBattleEnvironmentPalette_Groudon, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - else - LoadPalette(gBattleEnvironmentPalette_Kyogre, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - enum TrainerClassID trainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); - if (trainerClass == TRAINER_CLASS_LEADER) - { - LoadPalette(gBattleEnvironmentPalette_BuildingLeader, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LoadPalette(gBattleEnvironmentPalette_StadiumWallace, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } - - switch (GetCurrentMapBattleScene()) - { - default: - case MAP_BATTLE_SCENE_NORMAL: - LoadPalette(sBattleEnvironmentTable[gBattleEnvironment].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GYM: - LoadPalette(gBattleEnvironmentPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_MAGMA: - LoadPalette(gBattleEnvironmentPalette_StadiumMagma, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_AQUA: - LoadPalette(gBattleEnvironmentPalette_StadiumAqua, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LoadPalette(gBattleEnvironmentPalette_StadiumSidney, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LoadPalette(gBattleEnvironmentPalette_StadiumPhoebe, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_GLACIA: - LoadPalette(gBattleEnvironmentPalette_StadiumGlacia, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_DRAKE: - LoadPalette(gBattleEnvironmentPalette_StadiumDrake, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - case MAP_BATTLE_SCENE_FRONTIER: - LoadPalette(gBattleEnvironmentPalette_Frontier, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); - break; - } - } + LoadPalette(gBattleEnvironmentInfo[GetBattleEnvironmentOverride()].background.palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case 6: LoadBattleMenuWindowGfx(); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7824a354bf..26144cecd1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5,6 +5,7 @@ #include "battle_ai_main.h" #include "battle_ai_util.h" #include "battle_scripts.h" +#include "battle_environment.h" #include "battle_z_move.h" #include "item.h" #include "util.h" @@ -938,78 +939,6 @@ static const u16 sFinalStrikeOnlyEffects[] = MOVE_EFFECT_WRAP, }; -static const u16 sNaturePowerMoves[BATTLE_ENVIRONMENT_COUNT] = -{ -#if B_NATURE_POWER_MOVES >= GEN_7 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_ICE_BEAM, -#elif B_NATURE_POWER_MOVES == GEN_6 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_ENERGY_BALL, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTH_POWER, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_FROST_BREATH, -#elif B_NATURE_POWER_MOVES == GEN_5 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#elif B_NATURE_POWER_MOVES == GEN_4 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_SEED_BOMB, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_POND] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#else // Gen 1-3 - [BATTLE_ENVIRONMENT_GRASS] = MOVE_STUN_SPORE, - [BATTLE_ENVIRONMENT_LONG_GRASS] = MOVE_RAZOR_LEAF, - [BATTLE_ENVIRONMENT_SAND] = MOVE_EARTHQUAKE, - [BATTLE_ENVIRONMENT_WATER] = MOVE_SURF, - [BATTLE_ENVIRONMENT_POND] = MOVE_BUBBLE_BEAM, - [BATTLE_ENVIRONMENT_MOUNTAIN] = MOVE_ROCK_SLIDE, - [BATTLE_ENVIRONMENT_CAVE] = MOVE_SHADOW_BALL, - [BATTLE_ENVIRONMENT_BUILDING] = MOVE_SWIFT, - [BATTLE_ENVIRONMENT_PLAIN] = MOVE_SWIFT, - [BATTLE_ENVIRONMENT_SNOW] = MOVE_BLIZZARD, -#endif - [BATTLE_ENVIRONMENT_UNDERWATER] = MOVE_HYDRO_PUMP, - [BATTLE_ENVIRONMENT_SOARING] = MOVE_AIR_SLASH, - [BATTLE_ENVIRONMENT_SKY_PILLAR] = MOVE_AIR_SLASH, - [BATTLE_ENVIRONMENT_BURIAL_GROUND] = MOVE_SHADOW_BALL, - [BATTLE_ENVIRONMENT_PUDDLE] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_MARSH] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_SWAMP] = MOVE_MUD_BOMB, - [BATTLE_ENVIRONMENT_ICE] = MOVE_ICE_BEAM, - [BATTLE_ENVIRONMENT_VOLCANO] = MOVE_LAVA_PLUME, - [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = MOVE_TRI_ATTACK, - [BATTLE_ENVIRONMENT_SPACE] = MOVE_DRACO_METEOR, - [BATTLE_ENVIRONMENT_ULTRA_SPACE] = MOVE_PSYSHOCK, -}; - #define _ 0 static const struct PickupItem sPickupTable[] = @@ -1048,32 +977,6 @@ static const struct PickupItem sPickupTable[] = #undef _ -static const u8 sEnvironmentToType[BATTLE_ENVIRONMENT_COUNT] = -{ - [BATTLE_ENVIRONMENT_GRASS] = TYPE_GRASS, - [BATTLE_ENVIRONMENT_LONG_GRASS] = TYPE_GRASS, - [BATTLE_ENVIRONMENT_SAND] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_UNDERWATER] = TYPE_WATER, - [BATTLE_ENVIRONMENT_WATER] = TYPE_WATER, - [BATTLE_ENVIRONMENT_POND] = TYPE_WATER, - [BATTLE_ENVIRONMENT_CAVE] = TYPE_ROCK, - [BATTLE_ENVIRONMENT_BUILDING] = TYPE_NORMAL, - [BATTLE_ENVIRONMENT_SOARING] = TYPE_FLYING, - [BATTLE_ENVIRONMENT_SKY_PILLAR] = TYPE_FLYING, - [BATTLE_ENVIRONMENT_BURIAL_GROUND] = TYPE_GHOST, - [BATTLE_ENVIRONMENT_PUDDLE] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_MARSH] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_SWAMP] = TYPE_GROUND, - [BATTLE_ENVIRONMENT_SNOW] = TYPE_ICE, - [BATTLE_ENVIRONMENT_ICE] = TYPE_ICE, - [BATTLE_ENVIRONMENT_VOLCANO] = TYPE_FIRE, - [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = TYPE_NORMAL, - [BATTLE_ENVIRONMENT_SPACE] = TYPE_DRAGON, - [BATTLE_ENVIRONMENT_ULTRA_SPACE] = TYPE_PSYCHIC, - [BATTLE_ENVIRONMENT_MOUNTAIN] = (B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK), - [BATTLE_ENVIRONMENT_PLAIN] = (B_CAMOUFLAGE_TYPES >= GEN_4 ? TYPE_GROUND : TYPE_NORMAL), -}; - static bool32 NoTargetPresent(u8 battler, u32 move) { if (!IsBattlerAlive(gBattlerTarget)) @@ -3703,64 +3606,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } } else - { - switch (gBattleEnvironment) - { - case BATTLE_ENVIRONMENT_GRASS: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); - break; - case BATTLE_ENVIRONMENT_UNDERWATER: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); - break; - case BATTLE_ENVIRONMENT_POND: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); - break; - case BATTLE_ENVIRONMENT_MOUNTAIN: - if (B_SECRET_POWER_EFFECT >= GEN_5) - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - else if (B_SECRET_POWER_EFFECT >= GEN_4) - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - else - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; - break; - case BATTLE_ENVIRONMENT_PUDDLE: - gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); - break; - case BATTLE_ENVIRONMENT_LONG_GRASS: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case BATTLE_ENVIRONMENT_SAND: - gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; - break; - case BATTLE_ENVIRONMENT_WATER: - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; - break; - case BATTLE_ENVIRONMENT_CAVE: - case BATTLE_ENVIRONMENT_BURIAL_GROUND: - case BATTLE_ENVIRONMENT_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - break; - case BATTLE_ENVIRONMENT_SOARING: - case BATTLE_ENVIRONMENT_SKY_PILLAR: - case BATTLE_ENVIRONMENT_MARSH: - case BATTLE_ENVIRONMENT_SWAMP: - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - case BATTLE_ENVIRONMENT_SNOW: - case BATTLE_ENVIRONMENT_ICE: - gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE; - break; - case BATTLE_ENVIRONMENT_VOLCANO: - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - break; - case BATTLE_ENVIRONMENT_ULTRA_SPACE: - gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; - break; - default: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } + gBattleScripting.moveEffect = gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect; SetMoveEffect(battler, effectBattler, primary, certain); break; case MOVE_EFFECT_PSYCHIC_NOISE: @@ -14483,7 +14329,7 @@ static void Cmd_callenvironmentattack(void) u32 GetNaturePowerMove(u32 battler) { - u32 move = sNaturePowerMoves[gBattleEnvironment]; + u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) move = MOVE_MOONBLAST; else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) @@ -14492,7 +14338,7 @@ u32 GetNaturePowerMove(u32 battler) move = MOVE_ENERGY_BALL; else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) move = MOVE_PSYCHIC; - else if (sNaturePowerMoves[gBattleEnvironment] == MOVE_NONE) + else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE) move = MOVE_TRI_ATTACK; if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE) @@ -15359,7 +15205,7 @@ static void Cmd_tryrecycleitem(void) bool32 CanCamouflage(u8 battler) { - if (IS_BATTLER_OF_TYPE(battler, sEnvironmentToType[gBattleEnvironment])) + if (IS_BATTLER_OF_TYPE(battler, gBattleEnvironmentInfo[gBattleEnvironment].camouflageType)) return FALSE; return TRUE; } @@ -15384,7 +15230,7 @@ static void Cmd_settypetoenvironment(void) environmentType = TYPE_PSYCHIC; break; default: - environmentType = sEnvironmentToType[gBattleEnvironment]; + environmentType = gBattleEnvironmentInfo[gBattleEnvironment].camouflageType; break; } diff --git a/src/battle_setup.c b/src/battle_setup.c index 0074eebf38..0860d5511a 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -621,7 +621,7 @@ static void CB2_EndScriptedWildBattle(void) } } -enum BattleEnvironment BattleSetup_GetEnvironmentId(void) +enum BattleEnvironments BattleSetup_GetEnvironmentId(void) { u16 tileBehavior; s16 x, y; diff --git a/src/data/battle_environment.h b/src/data/battle_environment.h new file mode 100644 index 0000000000..1773e6ced3 --- /dev/null +++ b/src/data/battle_environment.h @@ -0,0 +1,434 @@ +const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM"); + +const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal"); +const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM"); + +const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal"); + +const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol"); +const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles +const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM"); + +#define ENVIRONMENT_BACKGROUND(background) \ +{ \ + .tileset = gBattleEnvironmentTiles_##background, \ + .tilemap = gBattleEnvironmentTilemap_##background, \ + .entryTileset = gBattleEnvironmentAnimTiles_##background, \ + .entryTilemap = gBattleEnvironmentAnimTilemap_##background, \ + .palette = gBattleEnvironmentPalette_##background, \ +} + +const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT] = +{ + [BATTLE_ENVIRONMENT_GRASS] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_ENERGY_BALL, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_SEED_BOMB, + #else + .naturePower = MOVE_STUN_SPORE, + #endif + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON, + .camouflageType = TYPE_GRASS, + .background = ENVIRONMENT_BACKGROUND(TallGrass), + }, + + [BATTLE_ENVIRONMENT_LONG_GRASS] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_ENERGY_BALL, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_SEED_BOMB, + #else + .naturePower = MOVE_RAZOR_LEAF, + #endif + .secretPowerEffect = MOVE_EFFECT_SLEEP, + .camouflageType = TYPE_GRASS, + .background = ENVIRONMENT_BACKGROUND(LongGrass), + }, + + [BATTLE_ENVIRONMENT_SAND] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_6 ? MOVE_EARTH_POWER : MOVE_EARTHQUAKE, + .secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1, + .camouflageType = TYPE_GROUND, + .background = ENVIRONMENT_BACKGROUND(Sand), + }, + + [BATTLE_ENVIRONMENT_UNDERWATER] = + { + .naturePower = MOVE_HYDRO_PUMP, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(Underwater), + }, + + [BATTLE_ENVIRONMENT_WATER] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_SURF, + .secretPowerEffect = MOVE_EFFECT_ATK_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(Water), + }, + + [BATTLE_ENVIRONMENT_POND] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_HYDRO_PUMP : MOVE_BUBBLE_BEAM, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_WATER, + .background = ENVIRONMENT_BACKGROUND(PondWater), + }, + + [BATTLE_ENVIRONMENT_MOUNTAIN] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_EARTH_POWER, + #elif B_NATURE_POWER_MOVES >= GEN_5 + .naturePower = MOVE_EARTHQUAKE, + #else + .naturePower = MOVE_ROCK_SLIDE, + #endif + #if B_SECRET_POWER_EFFECT >= GEN_5 + .secretPowerEffect = MOVE_EFFECT_ACC_MINUS_1, + #elif B_SECRET_POWER_EFFECT >= GEN_4 + .secretPowerEffect = MOVE_EFFECT_FLINCH, + #else + .secretPowerEffect = MOVE_EFFECT_CONFUSION, + #endif + .camouflageType = B_CAMOUFLAGE_TYPES >= GEN_5 ? TYPE_GROUND : TYPE_ROCK, + .background = ENVIRONMENT_BACKGROUND(Rock), + }, + + [BATTLE_ENVIRONMENT_CAVE] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_EARTH_POWER, + #elif B_NATURE_POWER_MOVES >= GEN_5 + .naturePower = MOVE_EARTHQUAKE, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_ROCK_SLIDE, + #else + .naturePower = MOVE_SHADOW_BALL, + #endif + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_ROCK, + .background = ENVIRONMENT_BACKGROUND(Cave), + }, + + [BATTLE_ENVIRONMENT_BUILDING] = + { + .naturePower = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, + .secretPowerEffect = MOVE_EFFECT_PARALYSIS, + .camouflageType = TYPE_NORMAL, + .background = ENVIRONMENT_BACKGROUND(Building), + }, + + [BATTLE_ENVIRONMENT_PLAIN] = + { + #if B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_TRI_ATTACK, + #elif B_NATURE_POWER_MOVES >= GEN_4 + .naturePower = MOVE_EARTHQUAKE, + #else + .naturePower = MOVE_SWIFT, + #endif + .secretPowerEffect = MOVE_EFFECT_PARALYSIS, + .camouflageType = B_CAMOUFLAGE_TYPES >= GEN_4 ? TYPE_GROUND : TYPE_NORMAL, + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_Plain, + }, + }, + + [BATTLE_ENVIRONMENT_FRONTIER] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_Frontier, + }, + }, + + [BATTLE_ENVIRONMENT_GYM] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_BuildingGym, + }, + }, + + [BATTLE_ENVIRONMENT_LEADER] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Building, + .tilemap = gBattleEnvironmentTilemap_Building, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_BuildingLeader, + }, + }, + + [BATTLE_ENVIRONMENT_MAGMA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumMagma, + }, + }, + + [BATTLE_ENVIRONMENT_AQUA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumAqua, + }, + }, + + [BATTLE_ENVIRONMENT_SIDNEY] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumSidney, + }, + }, + + [BATTLE_ENVIRONMENT_PHOEBE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumPhoebe, + }, + }, + + [BATTLE_ENVIRONMENT_GLACIA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumGlacia, + }, + }, + + [BATTLE_ENVIRONMENT_DRAKE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumDrake, + }, + }, + + [BATTLE_ENVIRONMENT_CHAMPION] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Stadium, + .tilemap = gBattleEnvironmentTilemap_Stadium, + .entryTileset = gBattleEnvironmentAnimTiles_Building, + .entryTilemap = gBattleEnvironmentAnimTilemap_Building, + .palette = gBattleEnvironmentPalette_StadiumWallace, + }, + }, + + [BATTLE_ENVIRONMENT_GROUDON] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Cave, + .tilemap = gBattleEnvironmentTilemap_Cave, + .entryTileset = gBattleEnvironmentAnimTiles_Cave, + .entryTilemap = gBattleEnvironmentAnimTilemap_Cave, + .palette = gBattleEnvironmentPalette_Groudon, + }, + }, + + [BATTLE_ENVIRONMENT_KYOGRE] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Water, + .tilemap = gBattleEnvironmentTilemap_Water, + .entryTileset = gBattleEnvironmentAnimTiles_Underwater, + .entryTilemap = gBattleEnvironmentAnimTilemap_Underwater, + .palette = gBattleEnvironmentPalette_Kyogre, + }, + }, + + [BATTLE_ENVIRONMENT_RAYQUAZA] = + { + .background = + { + .tileset = gBattleEnvironmentTiles_Rayquaza, + .tilemap = gBattleEnvironmentTilemap_Rayquaza, + .entryTileset = gBattleEnvironmentAnimTiles_Rayquaza, + .entryTilemap = gBattleEnvironmentAnimTilemap_Rayquaza, + .palette = gBattleEnvironmentPalette_Rayquaza, + }, + }, + + [BATTLE_ENVIRONMENT_SOARING] = + { + .naturePower = MOVE_AIR_SLASH, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_FLYING, + }, + + [BATTLE_ENVIRONMENT_SKY_PILLAR] = + { + .naturePower = MOVE_AIR_SLASH, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_FLYING, + }, + + [BATTLE_ENVIRONMENT_BURIAL_GROUND] = + { + .naturePower = MOVE_SHADOW_BALL, + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_GHOST, + }, + + [BATTLE_ENVIRONMENT_PUDDLE] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_MARSH] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_SWAMP] = + { + .naturePower = MOVE_MUD_BOMB, + .secretPowerEffect = MOVE_EFFECT_SPD_MINUS_1, + .camouflageType = TYPE_GROUND, + }, + + [BATTLE_ENVIRONMENT_SNOW] = + { + #if B_NATURE_POWER_MOVES >= GEN_7 + .naturePower = MOVE_ICE_BEAM, + #elif B_NATURE_POWER_MOVES >= GEN_6 + .naturePower = MOVE_FROST_BREATH, + #else + .naturePower = MOVE_BLIZZARD, + #endif + .secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .camouflageType = TYPE_ICE, + }, + + [BATTLE_ENVIRONMENT_ICE] = + { + .naturePower = MOVE_ICE_BEAM, + .secretPowerEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .camouflageType = TYPE_ICE, + }, + + [BATTLE_ENVIRONMENT_VOLCANO] = + { + .naturePower = MOVE_LAVA_PLUME, + .secretPowerEffect = MOVE_EFFECT_BURN, + .camouflageType = TYPE_FIRE, + }, + + [BATTLE_ENVIRONMENT_DISTORTION_WORLD] = + { + .naturePower = MOVE_TRI_ATTACK, + .secretPowerEffect = MOVE_EFFECT_PARALYSIS, + .camouflageType = TYPE_NORMAL, + }, + + [BATTLE_ENVIRONMENT_SPACE] = + { + .naturePower = MOVE_DRACO_METEOR, + .secretPowerEffect = MOVE_EFFECT_FLINCH, + .camouflageType = TYPE_DRAGON, + }, + + [BATTLE_ENVIRONMENT_ULTRA_SPACE] = + { + .naturePower = MOVE_PSYSHOCK, + .secretPowerEffect = MOVE_EFFECT_DEF_MINUS_1, + .camouflageType = TYPE_PSYCHIC, + }, +}; + +static const struct { + u8 mapScene; + u8 battleEnvironment; +} sMapBattleSceneMapping[] = { + {MAP_BATTLE_SCENE_GYM, BATTLE_ENVIRONMENT_GYM}, + {MAP_BATTLE_SCENE_MAGMA, BATTLE_ENVIRONMENT_MAGMA}, + {MAP_BATTLE_SCENE_AQUA, BATTLE_ENVIRONMENT_AQUA}, + {MAP_BATTLE_SCENE_SIDNEY, BATTLE_ENVIRONMENT_SIDNEY}, + {MAP_BATTLE_SCENE_PHOEBE, BATTLE_ENVIRONMENT_PHOEBE}, + {MAP_BATTLE_SCENE_GLACIA, BATTLE_ENVIRONMENT_GLACIA}, + {MAP_BATTLE_SCENE_DRAKE, BATTLE_ENVIRONMENT_DRAKE}, + {MAP_BATTLE_SCENE_FRONTIER, BATTLE_ENVIRONMENT_FRONTIER} +}; diff --git a/src/data/graphics/battle_environment.h b/src/data/graphics/battle_environment.h index d220611c6d..4d271ea82d 100644 --- a/src/data/graphics/battle_environment.h +++ b/src/data/graphics/battle_environment.h @@ -1,41 +1,3 @@ -const u32 gBattleEnvironmentTiles_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_TallGrass[] = INCBIN_U16("graphics/battle_environment/tall_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_TallGrass[] = INCBIN_U32("graphics/battle_environment/tall_grass/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_LongGrass[] = INCBIN_U16("graphics/battle_environment/long_grass/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_LongGrass[] = INCBIN_U32("graphics/battle_environment/long_grass/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_Sand[] = INCBIN_U32("graphics/battle_environment/sand/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Sand[] = INCBIN_U16("graphics/battle_environment/sand/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Sand[] = INCBIN_U32("graphics/battle_environment/sand/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Underwater[] = INCBIN_U16("graphics/battle_environment/underwater/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Underwater[] = INCBIN_U32("graphics/battle_environment/underwater/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_Water[] = INCBIN_U32("graphics/battle_environment/water/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Water[] = INCBIN_U16("graphics/battle_environment/water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Water[] = INCBIN_U32("graphics/battle_environment/water/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_PondWater[] = INCBIN_U16("graphics/battle_environment/pond_water/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_PondWater[] = INCBIN_U32("graphics/battle_environment/pond_water/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_Rock[] = INCBIN_U32("graphics/battle_environment/rock/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Rock[] = INCBIN_U16("graphics/battle_environment/rock/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Rock[] = INCBIN_U32("graphics/battle_environment/rock/map.bin.smolTM"); - -const u32 gBattleEnvironmentTiles_Cave[] = INCBIN_U32("graphics/battle_environment/cave/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Cave[] = INCBIN_U16("graphics/battle_environment/cave/palette.gbapal"); -const u32 gBattleEnvironmentTilemap_Cave[] = INCBIN_U32("graphics/battle_environment/cave/map.bin.smolTM"); - -const u16 gBattleEnvironmentPalette_Plain[] = INCBIN_U16("graphics/battle_environment/plain/palette.gbapal"); - -const u32 gBattleEnvironmentTiles_Building[] = INCBIN_U32("graphics/battle_environment/building/tiles.4bpp.smol"); -const u16 gBattleEnvironmentPalette_Frontier[] = INCBIN_U16("graphics/battle_environment/stadium/battle_frontier.gbapal"); // this is also used for link battles -const u32 gBattleEnvironmentTilemap_Building[] = INCBIN_U32("graphics/battle_environment/building/map.bin.smolTM"); - const u32 gBattleEnvironmentTiles_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/tiles.4bpp.smol"); const u32 gBattleEnvironmentTilemap_Stadium[] = INCBIN_U32("graphics/battle_environment/stadium/map.bin.smolTM"); diff --git a/src/debug.c b/src/debug.c index ba91351b98..a14b0ebe53 100644 --- a/src/debug.c +++ b/src/debug.c @@ -141,18 +141,18 @@ enum DebugBattleAIFlags DEBUG_BATTLE_1_MENU_ITEM_CONTINUE, }; -enum DebugBattleTerrain +enum DebugBattleEnvironment { - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_0, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_1, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_2, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_3, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_4, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_5, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_6, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_7, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_8, - DEBUG_BATTLE_2_MENU_ITEM_TERRAIN_9, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_0, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_1, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_2, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_3, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_4, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_5, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_6, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_7, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_8, + DEBUG_BATTLE_2_MENU_ITEM_ENVIRONMENT_9, }; // ******************************* diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index 6984290f13..a5f36a0db6 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -3,6 +3,7 @@ #include "battle.h" #include "battle_anim.h" #include "battle_gfx_sfx_util.h" +#include "battle_environment.h" #include "bg.h" #include "data.h" #include "decompress.h" @@ -42,7 +43,7 @@ #include "constants/rgb.h" #include "constants/songs.h" -extern const struct BattleBackground sBattleEnvironmentTable[]; +extern const struct BattleEnvironment gBattleEnvironmentInfo[BATTLE_ENVIRONMENT_COUNT]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadowsSized; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; @@ -385,6 +386,7 @@ const u8 gBattleBackgroundNames[][30] = [MAP_BATTLE_SCENE_KYOGRE] = _("KYOGRE "), [MAP_BATTLE_SCENE_RAYQUAZA] = _("RAYQUAZA "), }; + const u8 gBattleBackgroundTerrainNames[][26] = { [BATTLE_ENVIRONMENT_GRASS] = _("NORMAL - GRASS "), @@ -398,6 +400,7 @@ const u8 gBattleBackgroundTerrainNames[][26] = [BATTLE_ENVIRONMENT_BUILDING] = _("NORMAL - BUILDING "), [BATTLE_ENVIRONMENT_PLAIN] = _("NORMAL - PLAIN "), }; + const u8 sShadowSizeLabels[][4] = { [SHADOW_SIZE_S] = _(" S"), @@ -405,6 +408,7 @@ const u8 sShadowSizeLabels[][4] = [SHADOW_SIZE_L] = _(" L"), [SHADOW_SIZE_XL_BATTLE_ONLY] = _(" XL"), }; + //Function declarations static void PrintDigitChars(struct PokemonSpriteVisualizer *data); static void SetUpModifyArrows(struct PokemonSpriteVisualizer *data); @@ -921,15 +925,15 @@ static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer } //Battle background functions -static void LoadBattleBg(u8 battleBgType, enum BattleEnvironment battleEnvironment) +static void LoadBattleBg(u8 battleBgType, enum BattleEnvironments battleEnvironment) { switch (battleBgType) { default: case MAP_BATTLE_SCENE_NORMAL: - DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tileset, (void*)(BG_CHAR_ADDR(2))); - DecompressDataWithHeaderVram(sBattleEnvironmentTable[battleEnvironment].tilemap, (void*)(BG_SCREEN_ADDR(26))); - LoadPalette(sBattleEnvironmentTable[battleEnvironment].palette, 0x20, 0x60); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tileset, (void*)(BG_CHAR_ADDR(2))); + DecompressDataWithHeaderVram(gBattleEnvironmentInfo[battleEnvironment].background.tilemap, (void*)(BG_SCREEN_ADDR(26))); + LoadPalette(gBattleEnvironmentInfo[battleEnvironment].background.palette, 0x20, 0x60); break; case MAP_BATTLE_SCENE_GYM: DecompressDataWithHeaderVram(gBattleEnvironmentTiles_Building, (void*)(BG_CHAR_ADDR(2))); @@ -998,6 +1002,7 @@ static void LoadBattleBg(u8 battleBgType, enum BattleEnvironment battleEnvironme break; } } + static void PrintBattleBgName(u8 taskId) { struct PokemonSpriteVisualizer *data = GetStructPtr(taskId); @@ -1005,11 +1010,12 @@ static void PrintBattleBgName(u8 taskId) u8 text[30+1]; if (data->battleBgType == 0) - StringCopy(text, gBattleBackgroundTerrainNames[data->battleTerrain]); + StringCopy(text, gBattleBackgroundTerrainNames[data->battleEnvironment]); else StringCopy(text, gBattleBackgroundNames[data->battleBgType]); AddTextPrinterParameterized(WIN_BOTTOM_RIGHT, fontId, text, 0, 24, 0, NULL); } + static void UpdateBattleBg(u8 taskId, bool8 increment) { struct PokemonSpriteVisualizer *data = GetStructPtr(taskId); @@ -1018,17 +1024,17 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) { if (increment) { - if (data->battleTerrain == BATTLE_ENVIRONMENT_PLAIN) + if (data->battleEnvironment == BATTLE_ENVIRONMENT_PLAIN) data->battleBgType += 1; else - data->battleTerrain += 1; + data->battleEnvironment += 1; } else { - if (data->battleTerrain == BATTLE_ENVIRONMENT_GRASS) + if (data->battleEnvironment == BATTLE_ENVIRONMENT_GRASS) data->battleBgType = MAP_BATTLE_SCENE_RAYQUAZA; else - data->battleTerrain -= 1; + data->battleEnvironment -= 1; } } else if (data->battleBgType == MAP_BATTLE_SCENE_GYM) @@ -1038,7 +1044,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) else { data->battleBgType = MAP_BATTLE_SCENE_NORMAL; - data->battleTerrain = BATTLE_ENVIRONMENT_PLAIN; + data->battleEnvironment = BATTLE_ENVIRONMENT_PLAIN; } } else if (data->battleBgType == MAP_BATTLE_SCENE_RAYQUAZA) @@ -1046,7 +1052,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) if (increment) { data->battleBgType = MAP_BATTLE_SCENE_NORMAL; - data->battleTerrain = BATTLE_ENVIRONMENT_GRASS; + data->battleEnvironment = BATTLE_ENVIRONMENT_GRASS; } else data->battleBgType -= 1; @@ -1061,7 +1067,7 @@ static void UpdateBattleBg(u8 taskId, bool8 increment) PrintBattleBgName(taskId); - LoadBattleBg(data->battleBgType, data->battleTerrain); + LoadBattleBg(data->battleBgType, data->battleEnvironment); } // ******************************* From 14dbbf63d454073dbb198b941cc3566168c89f11 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 12 Jul 2025 22:03:36 +0200 Subject: [PATCH 139/248] Remove competitive syntax config (#7154) Co-authored-by: Hedara --- .gitignore | 4 + Makefile | 6 +- include/config/general.h | 1 - src/data/battle_partners.h | 105 - src/data/debug_trainers.h | 132 - src/data/trainers.h | 42180 -------------------------------- test/battle/trainer_control.h | 792 - trainer_rules.mk | 10 + 8 files changed, 15 insertions(+), 43215 deletions(-) delete mode 100644 src/data/battle_partners.h delete mode 100644 src/data/debug_trainers.h delete mode 100644 src/data/trainers.h delete mode 100644 test/battle/trainer_control.h create mode 100644 trainer_rules.mk diff --git a/.gitignore b/.gitignore index 8cc8ba9ed9..2d699f8e98 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,10 @@ prefabs.json src/data/map_group_count.h include/constants/heal_locations.h tools/trainerproc/trainerproc +src/data/battle_partners.h +src/data/trainers.h +src/data/debug_trainers.h +test/battle/trainer_control.h tools/compresSmol/compresSmol tools/compresSmol/compresSmolTilemap *.Identifier diff --git a/Makefile b/Makefile index 7456a9073b..dd1c0f2c92 100644 --- a/Makefile +++ b/Makefile @@ -351,6 +351,7 @@ include map_data_rules.mk include spritesheet_rules.mk include json_data_rules.mk include audio_rules.mk +include trainer_rules.mk # NOTE: Tools must have been built prior (FIXME) # so you can't really call this rule directly @@ -380,11 +381,6 @@ clean-generated: @rm -f $(ALL_LEARNABLES_JSON) @echo "rm -f " -COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/gba/defines.h -imacros include/config/general.h | tail -n1) -ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) -%.h: %.party ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - -endif - $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member $(C_BUILDDIR)/agb_flash.o: override CFLAGS += -fno-toplevel-reorder diff --git a/include/config/general.h b/include/config/general.h index db01fd22f9..7eabc2e26f 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -70,7 +70,6 @@ #define EXPANSION_INTRO TRUE // If TRUE, a custom RHH intro will play after the vanilla copyright screen. #define SUMMARY_SCREEN_NATURE_COLORS TRUE // If TRUE, nature-based stat boosts and reductions will be red and blue in the summary screen. #define HQ_RANDOM TRUE // If TRUE, replaces the default RNG with an implementation of SFC32 RNG. May break code that relies on RNG. -#define COMPETITIVE_PARTY_SYNTAX TRUE // If TRUE, parties are defined in "competitive syntax". #define AUTO_SCROLL_TEXT FALSE // If TRUE, text will automatically scroll to the next line after NUM_FRAMES_AUTO_SCROLL_DELAY. Players can still press A_BUTTON or B_BUTTON to scroll on their own. #define NUM_FRAMES_AUTO_SCROLL_DELAY 49 #define PHONEMES_SHARED FALSE // If TRUE, bard phonemes all reference the same sound (sound/direct_sound_samples/phonemes/shared.bin) to save ROM space. diff --git a/src/data/battle_partners.h b/src/data/battle_partners.h deleted file mode 100644 index 34e30ea083..0000000000 --- a/src/data/battle_partners.h +++ /dev/null @@ -1,105 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/battle_partners.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'src/data/battle_partners.h' to remove #line markers. -// - -#line 1 "src/data/battle_partners.party" - -#line 1 - [DIFFICULTY_NORMAL][PARTNER_NONE] = - { -#line 3 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 4 - .trainerPic = TRAINER_BACK_PIC_BRENDAN, - .encounterMusic_gender = -#line 6 - TRAINER_ENCOUNTER_MUSIC_MALE, - .partySize = 0, - .party = (const struct TrainerMon[]) - { - }, - }, -#line 8 - [DIFFICULTY_NORMAL][PARTNER_STEVEN] = - { -#line 9 - .trainerName = _("STEVEN"), -#line 10 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 11 - .trainerPic = TRAINER_BACK_PIC_STEVEN, - .encounterMusic_gender = -#line 13 - TRAINER_ENCOUNTER_MUSIC_MALE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 15 - .species = SPECIES_METANG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 19 - .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), -#line 18 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 17 - .lvl = 42, -#line 16 - .nature = NATURE_BRAVE, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 20 - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_METAL_CLAW, - }, - }, - { -#line 25 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 29 - .ev = TRAINER_PARTY_EVS(252, 0, 0, 0, 6, 252), -#line 28 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 27 - .lvl = 43, -#line 26 - .nature = NATURE_IMPISH, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 30 - MOVE_TOXIC, - MOVE_AERIAL_ACE, - MOVE_PROTECT, - MOVE_STEEL_WING, - }, - }, - { -#line 35 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 39 - .ev = TRAINER_PARTY_EVS(0, 252, 0, 0, 252, 6), -#line 38 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 37 - .lvl = 44, -#line 36 - .nature = NATURE_ADAMANT, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 40 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_SOLAR_BEAM, - MOVE_DRAGON_CLAW, - }, - }, - }, - }, diff --git a/src/data/debug_trainers.h b/src/data/debug_trainers.h deleted file mode 100644 index 0ec683e296..0000000000 --- a/src/data/debug_trainers.h +++ /dev/null @@ -1,132 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/debug_trainers.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'src/data/debug_trainers.h' to remove #line markers. -// - -#line 1 "src/data/debug_trainers.party" - -#line 14 - [DIFFICULTY_NORMAL][DEBUG_TRAINER_PLAYER] = - { -#line 15 - .trainerName = _("Player"), -#line 16 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 17 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 19 - TRAINER_ENCOUNTER_MUSIC_MALE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 21 - .nickname = COMPOUND_STRING("Buffie"), -#line 21 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 25 - .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), -#line 24 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 23 - .lvl = 100, -#line 22 - .nature = NATURE_BRAVE, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 26 - MOVE_EARTHQUAKE, - MOVE_FLAMETHROWER, - MOVE_CELEBRATE, - MOVE_CELEBRATE, - }, - }, - }, - }, -#line 31 - [DIFFICULTY_NORMAL][DEBUG_TRAINER_AI] = - { -#line 32 - .trainerName = _("Debugger"), -#line 33 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 35 - .trainerPic = TRAINER_PIC_STEVEN, - .encounterMusic_gender = -#line 37 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 34 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 39 - .species = SPECIES_METANG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 43 - .ev = TRAINER_PARTY_EVS(0, 252, 252, 0, 6, 0), -#line 42 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 41 - .lvl = 42, -#line 40 - .nature = NATURE_BRAVE, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 44 - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_METAL_CLAW, - }, - }, - { -#line 49 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 53 - .ev = TRAINER_PARTY_EVS(252, 0, 0, 0, 6, 252), -#line 52 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 51 - .lvl = 43, -#line 50 - .nature = NATURE_IMPISH, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 54 - MOVE_TOXIC, - MOVE_AERIAL_ACE, - MOVE_PROTECT, - MOVE_STEEL_WING, - }, - }, - { -#line 59 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 63 - .ev = TRAINER_PARTY_EVS(0, 252, 0, 0, 252, 6), -#line 62 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 61 - .lvl = 44, -#line 60 - .nature = NATURE_ADAMANT, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 64 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_SOLAR_BEAM, - MOVE_DRAGON_CLAW, - }, - }, - }, - }, diff --git a/src/data/trainers.h b/src/data/trainers.h deleted file mode 100644 index 44cb25be75..0000000000 --- a/src/data/trainers.h +++ /dev/null @@ -1,42180 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from src/data/trainers.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'src/data/trainers.h' to remove #line markers. -// - -#line 1 "src/data/trainers.party" - -#line 76 - [DIFFICULTY_NORMAL][TRAINER_NONE] = - { -#line 78 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 79 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 81 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 82 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 0, - .party = (const struct TrainerMon[]) - { - }, - }, -#line 84 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_1] = - { -#line 85 - .trainerName = _("SAWYER"), -#line 86 - .trainerClass = TRAINER_CLASS_HIKER, -#line 87 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 89 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 90 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 91 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 93 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 95 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 94 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 97 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_1] = - { -#line 98 - .trainerName = _("GRUNT"), -#line 99 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 100 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 102 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 103 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 104 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 106 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 108 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 107 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 110 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_2] = - { -#line 111 - .trainerName = _("GRUNT"), -#line 112 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 113 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 115 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 116 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 117 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 119 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 121 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 120 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 123 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 125 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 124 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 127 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_3] = - { -#line 128 - .trainerName = _("GRUNT"), -#line 129 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 130 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 132 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 136 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 138 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 137 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 140 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_4] = - { -#line 141 - .trainerName = _("GRUNT"), -#line 142 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 143 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 145 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 146 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 147 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 149 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 151 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 150 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 153 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_1] = - { -#line 154 - .trainerName = _("GRUNT"), -#line 155 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 156 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 158 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 159 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 160 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 162 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 164 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 163 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 166 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_2] = - { -#line 167 - .trainerName = _("GRUNT"), -#line 168 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 169 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 171 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 175 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 177 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 176 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 179 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_3] = - { -#line 180 - .trainerName = _("GRUNT"), -#line 181 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 182 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 184 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 185 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 186 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 188 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 189 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 192 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_1] = - { -#line 193 - .trainerName = _("GABRIELLE"), -#line 194 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 195 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 196 -F_TRAINER_FEMALE | -#line 197 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 201 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 202 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 205 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 206 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 209 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 211 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 210 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 213 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 215 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 214 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 217 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 219 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 218 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 221 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 223 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 222 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 225 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_PETALBURG_WOODS] = - { -#line 226 - .trainerName = _("GRUNT"), -#line 227 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 228 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 230 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 234 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 236 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 235 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 238 - [DIFFICULTY_NORMAL][TRAINER_MARCEL] = - { -#line 239 - .trainerName = _("MARCEL"), -#line 240 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 241 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 243 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 244 - .items = { ITEM_HYPER_POTION }, -#line 245 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 246 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 248 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 250 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 249 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 252 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 254 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 253 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 256 - [DIFFICULTY_NORMAL][TRAINER_ALBERTO] = - { -#line 257 - .trainerName = _("ALBERTO"), -#line 258 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 259 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 261 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 265 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 267 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 266 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 269 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 271 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 270 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 273 - [DIFFICULTY_NORMAL][TRAINER_ED] = - { -#line 274 - .trainerName = _("ED"), -#line 275 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 276 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 278 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 280 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 282 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 284 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 283 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 286 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 288 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 287 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 290 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_4] = - { -#line 291 - .trainerName = _("GRUNT"), -#line 292 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 293 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 294 -F_TRAINER_FEMALE | -#line 295 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 296 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 297 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 299 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 301 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 300 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 303 - [DIFFICULTY_NORMAL][TRAINER_DECLAN] = - { -#line 304 - .trainerName = _("DECLAN"), -#line 305 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 306 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 308 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 309 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 310 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 312 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 314 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 313 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 316 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_RUSTURF_TUNNEL] = - { -#line 317 - .trainerName = _("GRUNT"), -#line 318 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 319 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 321 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 322 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 323 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 325 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 327 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 326 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 329 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_1] = - { -#line 330 - .trainerName = _("GRUNT"), -#line 331 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 332 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 334 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 336 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 338 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 340 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 339 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 342 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 344 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 343 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 346 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_2] = - { -#line 347 - .trainerName = _("GRUNT"), -#line 348 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 349 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 351 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 352 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 353 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 355 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 357 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 356 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 359 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 361 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 360 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 363 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_3] = - { -#line 364 - .trainerName = _("GRUNT"), -#line 365 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 366 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 368 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 369 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 370 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 372 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 374 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 373 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 376 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 378 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 377 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 380 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 382 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 381 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 384 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_1] = - { -#line 385 - .trainerName = _("GRUNT"), -#line 386 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 387 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 389 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 390 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 391 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 393 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 395 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 394 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 397 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MUSEUM_2] = - { -#line 398 - .trainerName = _("GRUNT"), -#line 399 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 400 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 402 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 403 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 404 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 406 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 408 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 407 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 410 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 412 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 411 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 414 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_1] = - { -#line 415 - .trainerName = _("GRUNT"), -#line 416 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 417 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 419 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 420 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 421 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 423 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 425 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 424 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 427 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_1] = - { -#line 428 - .trainerName = _("GRUNT"), -#line 429 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 430 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 432 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 433 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 434 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 436 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 438 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 437 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 440 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_2] = - { -#line 441 - .trainerName = _("GRUNT"), -#line 442 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 443 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 445 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 446 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 447 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 449 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 451 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 450 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 453 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_3] = - { -#line 454 - .trainerName = _("GRUNT"), -#line 455 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 456 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 458 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 459 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 460 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 462 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 464 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 463 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 466 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 468 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 467 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 470 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_4] = - { -#line 471 - .trainerName = _("GRUNT"), -#line 472 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 473 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 474 -F_TRAINER_FEMALE | -#line 475 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 476 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 477 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 479 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 481 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 480 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 483 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_5] = - { -#line 484 - .trainerName = _("GRUNT"), -#line 485 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 486 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 487 -F_TRAINER_FEMALE | -#line 488 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 489 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 490 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 492 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 494 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 493 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 496 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_6] = - { -#line 497 - .trainerName = _("GRUNT"), -#line 498 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 499 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 500 -F_TRAINER_FEMALE | -#line 501 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 502 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 503 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 505 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 507 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 506 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 509 - [DIFFICULTY_NORMAL][TRAINER_FREDRICK] = - { -#line 510 - .trainerName = _("FREDRICK"), -#line 511 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 512 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 514 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 515 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 516 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 518 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 520 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 519 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 522 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 524 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 523 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 526 - [DIFFICULTY_NORMAL][TRAINER_MATT] = - { -#line 527 - .trainerName = _("MATT"), -#line 528 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 529 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, - .encounterMusic_gender = -#line 531 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 532 - .items = { ITEM_SUPER_POTION }, -#line 533 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 534 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 536 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 538 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 537 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 540 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 542 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 541 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 544 - [DIFFICULTY_NORMAL][TRAINER_ZANDER] = - { -#line 545 - .trainerName = _("ZANDER"), -#line 546 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 547 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 549 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 550 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 551 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 553 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 555 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 554 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 557 - [DIFFICULTY_NORMAL][TRAINER_SHELLY_WEATHER_INSTITUTE] = - { -#line 558 - .trainerName = _("SHELLY"), -#line 559 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 560 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = -#line 561 -F_TRAINER_FEMALE | -#line 562 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 563 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 564 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 566 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 568 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 567 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 570 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 572 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 571 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 574 - [DIFFICULTY_NORMAL][TRAINER_SHELLY_SEAFLOOR_CAVERN] = - { -#line 575 - .trainerName = _("SHELLY"), -#line 576 - .trainerClass = TRAINER_CLASS_AQUA_ADMIN, -#line 577 - .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, - .encounterMusic_gender = -#line 578 -F_TRAINER_FEMALE | -#line 579 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 580 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 581 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 583 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 585 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 584 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 587 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 589 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 588 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 591 - [DIFFICULTY_NORMAL][TRAINER_ARCHIE] = - { -#line 592 - .trainerName = _("ARCHIE"), -#line 593 - .trainerClass = TRAINER_CLASS_AQUA_LEADER, -#line 594 - .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, - .encounterMusic_gender = -#line 596 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 597 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 598 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 599 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 601 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 603 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 602 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 605 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 607 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 606 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 609 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 611 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 610 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 613 - [DIFFICULTY_NORMAL][TRAINER_LEAH] = - { -#line 614 - .trainerName = _("LEAH"), -#line 615 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 616 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 617 -F_TRAINER_FEMALE | -#line 618 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 620 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 622 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 623 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 626 - [DIFFICULTY_NORMAL][TRAINER_DAISY] = - { -#line 627 - .trainerName = _("DAISY"), -#line 628 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 629 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 630 -F_TRAINER_FEMALE | -#line 631 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 632 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 633 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 635 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 637 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 636 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 639 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 641 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 640 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 643 - [DIFFICULTY_NORMAL][TRAINER_ROSE_1] = - { -#line 644 - .trainerName = _("ROSE"), -#line 645 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 646 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 647 -F_TRAINER_FEMALE | -#line 648 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 649 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 650 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 652 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 654 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 653 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 656 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 658 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 657 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 660 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 662 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 661 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 664 - [DIFFICULTY_NORMAL][TRAINER_FELIX] = - { -#line 665 - .trainerName = _("FELIX"), -#line 666 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 667 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 669 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 670 - .items = { ITEM_FULL_RESTORE }, -#line 671 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 672 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 674 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 676 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 675 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 677 - MOVE_PSYCHIC, - }, - }, - { -#line 679 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 681 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 680 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 682 - MOVE_SKILL_SWAP, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 685 - [DIFFICULTY_NORMAL][TRAINER_VIOLET] = - { -#line 686 - .trainerName = _("VIOLET"), -#line 687 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 688 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 689 -F_TRAINER_FEMALE | -#line 690 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 691 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 692 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 694 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 696 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 695 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 698 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 700 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 699 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 702 - [DIFFICULTY_NORMAL][TRAINER_ROSE_2] = - { -#line 703 - .trainerName = _("ROSE"), -#line 704 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 705 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 706 -F_TRAINER_FEMALE | -#line 707 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 708 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 709 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 711 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 713 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 712 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 715 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 717 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 716 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 719 - [DIFFICULTY_NORMAL][TRAINER_ROSE_3] = - { -#line 720 - .trainerName = _("ROSE"), -#line 721 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 722 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 723 -F_TRAINER_FEMALE | -#line 724 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 725 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 726 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 728 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 730 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 729 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 732 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 734 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 733 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 736 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 738 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 737 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 740 - [DIFFICULTY_NORMAL][TRAINER_ROSE_4] = - { -#line 741 - .trainerName = _("ROSE"), -#line 742 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 743 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 744 -F_TRAINER_FEMALE | -#line 745 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 746 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 747 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 749 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 751 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 750 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 753 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 755 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 754 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 757 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 759 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 758 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 761 - [DIFFICULTY_NORMAL][TRAINER_ROSE_5] = - { -#line 762 - .trainerName = _("ROSE"), -#line 763 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 764 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 765 -F_TRAINER_FEMALE | -#line 766 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 767 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 768 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 770 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 772 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 771 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 774 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 776 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 775 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 778 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 780 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 779 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 782 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_1] = - { -#line 783 - .trainerName = _("DUSTY"), -#line 784 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 785 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 787 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 788 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 789 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 791 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 793 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 792 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 794 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 799 - [DIFFICULTY_NORMAL][TRAINER_CHIP] = - { -#line 800 - .trainerName = _("CHIP"), -#line 801 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 802 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 804 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 805 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 806 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 808 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 810 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 809 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 811 - MOVE_PSYBEAM, - MOVE_SELF_DESTRUCT, - MOVE_SANDSTORM, - MOVE_ANCIENT_POWER, - }, - }, - { -#line 816 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 818 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 817 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 819 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - { -#line 824 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 826 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 825 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 827 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 832 - [DIFFICULTY_NORMAL][TRAINER_FOSTER] = - { -#line 833 - .trainerName = _("FOSTER"), -#line 834 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 835 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 837 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 838 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 841 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 843 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 842 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 844 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - { -#line 849 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 851 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 850 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 852 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 857 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_2] = - { -#line 858 - .trainerName = _("DUSTY"), -#line 859 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 860 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 862 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 863 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 864 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 866 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 868 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 867 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 869 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 874 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_3] = - { -#line 875 - .trainerName = _("DUSTY"), -#line 876 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 877 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 879 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 880 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 881 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 883 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 885 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 884 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 886 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 891 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_4] = - { -#line 892 - .trainerName = _("DUSTY"), -#line 893 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 894 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 896 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 897 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 898 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 900 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 902 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 901 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 903 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 908 - [DIFFICULTY_NORMAL][TRAINER_DUSTY_5] = - { -#line 909 - .trainerName = _("DUSTY"), -#line 910 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 911 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 913 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 914 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 915 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 917 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 919 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 918 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 920 - MOVE_DIG, - MOVE_SLASH, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - }, - }, - }, - }, -#line 925 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_1] = - { -#line 926 - .trainerName = _("GABBY & TY"), -#line 927 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 928 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 930 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 931 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 932 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 934 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 936 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 935 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 938 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 940 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 939 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 942 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_2] = - { -#line 943 - .trainerName = _("GABBY & TY"), -#line 944 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 945 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 947 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 948 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 949 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 951 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 953 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 952 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 955 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 957 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 956 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 959 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_3] = - { -#line 960 - .trainerName = _("GABBY & TY"), -#line 961 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 962 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 964 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 965 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 966 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 968 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 970 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 969 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 972 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 974 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 973 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 976 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_4] = - { -#line 977 - .trainerName = _("GABBY & TY"), -#line 978 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 979 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 981 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 982 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 983 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 985 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 987 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 986 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 989 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 991 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 990 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 993 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_5] = - { -#line 994 - .trainerName = _("GABBY & TY"), -#line 995 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 996 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 998 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 999 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 1000 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1002 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1004 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1003 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1006 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1008 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1007 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1010 - [DIFFICULTY_NORMAL][TRAINER_GABBY_AND_TY_6] = - { -#line 1011 - .trainerName = _("GABBY & TY"), -#line 1012 - .trainerClass = TRAINER_CLASS_INTERVIEWER, -#line 1013 - .trainerPic = TRAINER_PIC_INTERVIEWER, - .encounterMusic_gender = -#line 1015 - TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, -#line 1016 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 1017 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1019 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1021 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1020 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1022 - MOVE_SONIC_BOOM, - MOVE_THUNDER_WAVE, - MOVE_METAL_SOUND, - MOVE_THUNDERBOLT, - }, - }, - { -#line 1027 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1029 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 1028 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1030 - MOVE_ASTONISH, - MOVE_STOMP, - MOVE_SUPERSONIC, - MOVE_HYPER_VOICE, - }, - }, - }, - }, -#line 1035 - [DIFFICULTY_NORMAL][TRAINER_LOLA_1] = - { -#line 1036 - .trainerName = _("LOLA"), -#line 1037 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1038 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1039 -F_TRAINER_FEMALE | -#line 1040 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1041 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1042 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1044 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1046 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1045 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1048 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1050 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1049 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1052 - [DIFFICULTY_NORMAL][TRAINER_AUSTINA] = - { -#line 1053 - .trainerName = _("AUSTINA"), -#line 1054 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1055 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1056 -F_TRAINER_FEMALE | -#line 1057 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1058 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1059 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1061 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1063 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1062 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1065 - [DIFFICULTY_NORMAL][TRAINER_GWEN] = - { -#line 1066 - .trainerName = _("GWEN"), -#line 1067 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1068 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1069 -F_TRAINER_FEMALE | -#line 1070 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1071 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1072 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1074 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1076 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1075 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1078 - [DIFFICULTY_NORMAL][TRAINER_LOLA_2] = - { -#line 1079 - .trainerName = _("LOLA"), -#line 1080 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1081 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1082 -F_TRAINER_FEMALE | -#line 1083 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1087 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1089 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1088 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1091 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1093 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1092 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1095 - [DIFFICULTY_NORMAL][TRAINER_LOLA_3] = - { -#line 1096 - .trainerName = _("LOLA"), -#line 1097 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1098 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1099 -F_TRAINER_FEMALE | -#line 1100 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1104 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1106 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1105 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1108 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1110 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1109 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1112 - [DIFFICULTY_NORMAL][TRAINER_LOLA_4] = - { -#line 1113 - .trainerName = _("LOLA"), -#line 1114 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1115 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1116 -F_TRAINER_FEMALE | -#line 1117 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1118 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1119 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1121 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1123 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1122 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1125 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1127 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1126 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1129 - [DIFFICULTY_NORMAL][TRAINER_LOLA_5] = - { -#line 1130 - .trainerName = _("LOLA"), -#line 1131 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 1132 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 1133 -F_TRAINER_FEMALE | -#line 1134 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1135 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1136 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1138 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1140 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1139 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1142 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1144 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1143 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1146 - [DIFFICULTY_NORMAL][TRAINER_RICKY_1] = - { -#line 1147 - .trainerName = _("RICKY"), -#line 1148 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1149 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1151 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1152 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1153 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1155 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1157 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1156 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1158 - MOVE_SAND_ATTACK, - MOVE_HEADBUTT, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1163 - [DIFFICULTY_NORMAL][TRAINER_SIMON] = - { -#line 1164 - .trainerName = _("SIMON"), -#line 1165 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1166 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1168 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1169 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1170 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1172 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1174 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1173 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1176 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1178 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1177 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1180 - [DIFFICULTY_NORMAL][TRAINER_CHARLIE] = - { -#line 1181 - .trainerName = _("CHARLIE"), -#line 1182 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1183 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1185 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1186 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1187 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1189 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1191 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1190 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1193 - [DIFFICULTY_NORMAL][TRAINER_RICKY_2] = - { -#line 1194 - .trainerName = _("RICKY"), -#line 1195 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1196 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1198 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1199 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1200 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1202 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1204 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 1203 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1205 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1210 - [DIFFICULTY_NORMAL][TRAINER_RICKY_3] = - { -#line 1211 - .trainerName = _("RICKY"), -#line 1212 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1213 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1215 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1216 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1217 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1219 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1221 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 1220 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1222 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1227 - [DIFFICULTY_NORMAL][TRAINER_RICKY_4] = - { -#line 1228 - .trainerName = _("RICKY"), -#line 1229 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1230 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1232 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1233 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1234 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1236 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1238 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 1237 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1239 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1244 - [DIFFICULTY_NORMAL][TRAINER_RICKY_5] = - { -#line 1245 - .trainerName = _("RICKY"), -#line 1246 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 1247 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 1249 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 1250 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1251 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1253 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1255 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 1254 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1256 - MOVE_SAND_ATTACK, - MOVE_PIN_MISSILE, - MOVE_TAIL_WHIP, - MOVE_SURF, - }, - }, - }, - }, -#line 1261 - [DIFFICULTY_NORMAL][TRAINER_RANDALL] = - { -#line 1262 - .trainerName = _("RANDALL"), -#line 1263 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1264 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1266 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1267 - .items = { ITEM_HYPER_POTION }, -#line 1268 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1269 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1271 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1273 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1272 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1274 - MOVE_QUICK_ATTACK, - MOVE_AGILITY, - MOVE_WING_ATTACK, - }, - }, - }, - }, -#line 1278 - [DIFFICULTY_NORMAL][TRAINER_PARKER] = - { -#line 1279 - .trainerName = _("PARKER"), -#line 1280 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1281 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1283 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1284 - .items = { ITEM_HYPER_POTION }, -#line 1285 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1286 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1288 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1290 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1289 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1291 - MOVE_TEETER_DANCE, - MOVE_DIZZY_PUNCH, - MOVE_FOCUS_PUNCH, - }, - }, - }, - }, -#line 1295 - [DIFFICULTY_NORMAL][TRAINER_GEORGE] = - { -#line 1296 - .trainerName = _("GEORGE"), -#line 1297 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1298 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1300 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1301 - .items = { ITEM_HYPER_POTION }, -#line 1302 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1303 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1305 - .species = SPECIES_SLAKOTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1305 - .heldItem = ITEM_SITRUS_BERRY, -#line 1307 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1306 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1308 - MOVE_SLACK_OFF, - MOVE_COUNTER, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 1312 - [DIFFICULTY_NORMAL][TRAINER_BERKE] = - { -#line 1313 - .trainerName = _("BERKE"), -#line 1314 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1315 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1317 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1318 - .items = { ITEM_HYPER_POTION }, -#line 1319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1320 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1322 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1324 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1323 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1325 - MOVE_FOCUS_ENERGY, - MOVE_SLASH, - }, - }, - }, - }, -#line 1328 - [DIFFICULTY_NORMAL][TRAINER_BRAXTON] = - { -#line 1329 - .trainerName = _("BRAXTON"), -#line 1330 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1331 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1333 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1334 - .items = { ITEM_HYPER_POTION }, -#line 1335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1336 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 1338 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1340 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1339 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1341 - MOVE_FOCUS_ENERGY, - MOVE_QUICK_ATTACK, - MOVE_WING_ATTACK, - MOVE_ENDEAVOR, - }, - }, - { -#line 1346 - .species = SPECIES_TRAPINCH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1348 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1347 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1349 - MOVE_BITE, - MOVE_DIG, - MOVE_FEINT_ATTACK, - MOVE_SAND_TOMB, - }, - }, - { -#line 1354 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1356 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1355 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1357 - MOVE_ROLLOUT, - MOVE_WHIRLPOOL, - MOVE_ASTONISH, - MOVE_WATER_PULSE, - }, - }, - { -#line 1362 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1364 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1363 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1365 - MOVE_THUNDERBOLT, - MOVE_SUPERSONIC, - MOVE_THUNDER_WAVE, - MOVE_SONIC_BOOM, - }, - }, - { -#line 1370 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1372 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1371 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1373 - MOVE_GIGA_DRAIN, - MOVE_FEINT_ATTACK, - MOVE_DOUBLE_TEAM, - MOVE_SWAGGER, - }, - }, - }, - }, -#line 1378 - [DIFFICULTY_NORMAL][TRAINER_VINCENT] = - { -#line 1379 - .trainerName = _("VINCENT"), -#line 1380 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1381 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1383 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1384 - .items = { ITEM_FULL_RESTORE }, -#line 1385 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1386 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1388 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1390 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1389 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1392 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1394 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1393 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1396 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1398 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1397 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1400 - [DIFFICULTY_NORMAL][TRAINER_LEROY] = - { -#line 1401 - .trainerName = _("LEROY"), -#line 1402 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1403 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1405 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1406 - .items = { ITEM_FULL_RESTORE }, -#line 1407 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1408 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1410 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1412 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1411 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1414 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1416 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1415 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1418 - [DIFFICULTY_NORMAL][TRAINER_WILTON_1] = - { -#line 1419 - .trainerName = _("WILTON"), -#line 1420 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1421 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1423 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1424 - .items = { ITEM_SUPER_POTION }, -#line 1425 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1426 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1428 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1430 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1429 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1432 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1434 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1433 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1436 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1438 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1437 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1440 - [DIFFICULTY_NORMAL][TRAINER_EDGAR] = - { -#line 1441 - .trainerName = _("EDGAR"), -#line 1442 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1443 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1445 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1446 - .items = { ITEM_FULL_RESTORE }, -#line 1447 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1448 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1450 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1452 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1451 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1454 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1456 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1455 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1458 - [DIFFICULTY_NORMAL][TRAINER_ALBERT] = - { -#line 1459 - .trainerName = _("ALBERT"), -#line 1460 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1461 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1463 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1464 - .items = { ITEM_FULL_RESTORE }, -#line 1465 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1466 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1468 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1470 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1469 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1472 - .species = SPECIES_MUK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1474 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1473 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1476 - [DIFFICULTY_NORMAL][TRAINER_SAMUEL] = - { -#line 1477 - .trainerName = _("SAMUEL"), -#line 1478 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1479 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1481 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1482 - .items = { ITEM_FULL_RESTORE }, -#line 1483 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1484 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1486 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1488 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1487 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1490 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1492 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1491 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1494 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1496 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1495 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1498 - [DIFFICULTY_NORMAL][TRAINER_VITO] = - { -#line 1499 - .trainerName = _("VITO"), -#line 1500 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1501 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1503 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1504 - .items = { ITEM_FULL_RESTORE }, -#line 1505 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1506 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 1508 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1510 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1509 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1512 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1514 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1513 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1516 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1518 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1517 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1520 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1522 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1521 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1524 - [DIFFICULTY_NORMAL][TRAINER_OWEN] = - { -#line 1525 - .trainerName = _("OWEN"), -#line 1526 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1527 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1529 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1530 - .items = { ITEM_FULL_RESTORE }, -#line 1531 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1532 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1534 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1536 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1535 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1538 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1540 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1539 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1542 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1544 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1543 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1546 - [DIFFICULTY_NORMAL][TRAINER_WILTON_2] = - { -#line 1547 - .trainerName = _("WILTON"), -#line 1548 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1549 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1551 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1552 - .items = { ITEM_HYPER_POTION }, -#line 1553 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1554 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1556 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1558 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1557 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1560 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1562 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1561 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1564 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1566 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1565 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1568 - [DIFFICULTY_NORMAL][TRAINER_WILTON_3] = - { -#line 1569 - .trainerName = _("WILTON"), -#line 1570 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1571 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1573 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1574 - .items = { ITEM_HYPER_POTION }, -#line 1575 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1576 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1578 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1580 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1579 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1582 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1584 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1583 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1586 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1588 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1587 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1590 - [DIFFICULTY_NORMAL][TRAINER_WILTON_4] = - { -#line 1591 - .trainerName = _("WILTON"), -#line 1592 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1593 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1595 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1596 - .items = { ITEM_FULL_RESTORE }, -#line 1597 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1598 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1600 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1602 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1601 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1604 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1606 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1605 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1608 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1610 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1609 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1612 - [DIFFICULTY_NORMAL][TRAINER_WILTON_5] = - { -#line 1613 - .trainerName = _("WILTON"), -#line 1614 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1615 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1617 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1618 - .items = { ITEM_FULL_RESTORE }, -#line 1619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1620 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1622 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1624 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1623 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1626 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1628 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1627 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1630 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1632 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1631 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1634 - [DIFFICULTY_NORMAL][TRAINER_WARREN] = - { -#line 1635 - .trainerName = _("WARREN"), -#line 1636 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1637 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 1639 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1640 - .items = { ITEM_FULL_RESTORE }, -#line 1641 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1642 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1644 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1646 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1645 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1648 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1650 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1649 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1652 - [DIFFICULTY_NORMAL][TRAINER_MARY] = - { -#line 1653 - .trainerName = _("MARY"), -#line 1654 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1655 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1656 -F_TRAINER_FEMALE | -#line 1657 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1658 - .items = { ITEM_HYPER_POTION }, -#line 1659 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1660 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1662 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1664 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1663 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1665 - MOVE_FEINT_ATTACK, - MOVE_SHOCK_WAVE, - }, - }, - }, - }, -#line 1668 - [DIFFICULTY_NORMAL][TRAINER_ALEXIA] = - { -#line 1669 - .trainerName = _("ALEXIA"), -#line 1670 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1671 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1672 -F_TRAINER_FEMALE | -#line 1673 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1674 - .items = { ITEM_HYPER_POTION }, -#line 1675 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1676 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1678 - .species = SPECIES_WIGGLYTUFF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1680 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1679 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1681 - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 1685 - [DIFFICULTY_NORMAL][TRAINER_JODY] = - { -#line 1686 - .trainerName = _("JODY"), -#line 1687 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1688 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1689 -F_TRAINER_FEMALE | -#line 1690 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1691 - .items = { ITEM_HYPER_POTION }, -#line 1692 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1693 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1695 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1697 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 1696 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1698 - MOVE_SWORDS_DANCE, - MOVE_SLASH, - }, - }, - }, - }, -#line 1701 - [DIFFICULTY_NORMAL][TRAINER_WENDY] = - { -#line 1702 - .trainerName = _("WENDY"), -#line 1703 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1704 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1705 -F_TRAINER_FEMALE | -#line 1706 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1707 - .items = { ITEM_FULL_RESTORE }, -#line 1708 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1709 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1711 - .species = SPECIES_MAWILE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1713 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1712 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1714 - MOVE_BATON_PASS, - MOVE_FEINT_ATTACK, - MOVE_FAKE_TEARS, - MOVE_BITE, - }, - }, - { -#line 1719 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1721 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1720 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1722 - MOVE_MEGA_DRAIN, - MOVE_MAGICAL_LEAF, - MOVE_GRASS_WHISTLE, - MOVE_LEECH_SEED, - }, - }, - { -#line 1727 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1729 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1728 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 1730 - MOVE_FLY, - MOVE_WATER_GUN, - MOVE_MIST, - MOVE_PROTECT, - }, - }, - }, - }, -#line 1735 - [DIFFICULTY_NORMAL][TRAINER_KEIRA] = - { -#line 1736 - .trainerName = _("KEIRA"), -#line 1737 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1738 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1739 -F_TRAINER_FEMALE | -#line 1740 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1741 - .items = { ITEM_FULL_RESTORE }, -#line 1742 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1743 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1745 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1747 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1746 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1749 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1751 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1750 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1753 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_1] = - { -#line 1754 - .trainerName = _("BROOKE"), -#line 1755 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1756 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1757 -F_TRAINER_FEMALE | -#line 1758 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1759 - .items = { ITEM_SUPER_POTION }, -#line 1760 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1761 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1763 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1765 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1764 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1767 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1769 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1768 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1771 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1773 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1772 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1775 - [DIFFICULTY_NORMAL][TRAINER_JENNIFER] = - { -#line 1776 - .trainerName = _("JENNIFER"), -#line 1777 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1778 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1779 -F_TRAINER_FEMALE | -#line 1780 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1781 - .items = { ITEM_FULL_RESTORE }, -#line 1782 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1783 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1785 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1787 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 1786 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1789 - [DIFFICULTY_NORMAL][TRAINER_HOPE] = - { -#line 1790 - .trainerName = _("HOPE"), -#line 1791 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1792 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1793 -F_TRAINER_FEMALE | -#line 1794 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1795 - .items = { ITEM_FULL_RESTORE }, -#line 1796 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1797 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1799 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1801 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1800 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1803 - [DIFFICULTY_NORMAL][TRAINER_SHANNON] = - { -#line 1804 - .trainerName = _("SHANNON"), -#line 1805 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1806 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1807 -F_TRAINER_FEMALE | -#line 1808 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1809 - .items = { ITEM_FULL_RESTORE }, -#line 1810 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1811 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 1813 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1815 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1814 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1817 - [DIFFICULTY_NORMAL][TRAINER_MICHELLE] = - { -#line 1818 - .trainerName = _("MICHELLE"), -#line 1819 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1820 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1821 -F_TRAINER_FEMALE | -#line 1822 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1823 - .items = { ITEM_FULL_RESTORE }, -#line 1824 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1825 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1827 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1829 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1828 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1831 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1833 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1832 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1835 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1837 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1836 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1839 - [DIFFICULTY_NORMAL][TRAINER_CAROLINE] = - { -#line 1840 - .trainerName = _("CAROLINE"), -#line 1841 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1842 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1843 -F_TRAINER_FEMALE | -#line 1844 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1845 - .items = { ITEM_FULL_RESTORE }, -#line 1846 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1847 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1849 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1851 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1850 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1853 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1855 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1854 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1857 - [DIFFICULTY_NORMAL][TRAINER_JULIE] = - { -#line 1858 - .trainerName = _("JULIE"), -#line 1859 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1860 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1861 -F_TRAINER_FEMALE | -#line 1862 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1863 - .items = { ITEM_FULL_RESTORE }, -#line 1864 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1865 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1867 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1869 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1868 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1871 - .species = SPECIES_NINETALES, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1873 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1872 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1875 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1877 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 1876 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1879 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_2] = - { -#line 1880 - .trainerName = _("BROOKE"), -#line 1881 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1882 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1883 -F_TRAINER_FEMALE | -#line 1884 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1885 - .items = { ITEM_HYPER_POTION }, -#line 1886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1887 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1889 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1891 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1890 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1893 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1895 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1894 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1897 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1899 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 1898 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1901 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_3] = - { -#line 1902 - .trainerName = _("BROOKE"), -#line 1903 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1904 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1905 -F_TRAINER_FEMALE | -#line 1906 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1907 - .items = { ITEM_HYPER_POTION }, -#line 1908 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1909 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1911 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1913 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1912 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1915 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1917 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1916 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1919 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1921 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 1920 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1923 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_4] = - { -#line 1924 - .trainerName = _("BROOKE"), -#line 1925 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1926 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1927 -F_TRAINER_FEMALE | -#line 1928 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1929 - .items = { ITEM_FULL_RESTORE }, -#line 1930 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1931 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1933 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1935 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1934 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1937 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1939 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1938 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1941 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1943 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 1942 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1945 - [DIFFICULTY_NORMAL][TRAINER_BROOKE_5] = - { -#line 1946 - .trainerName = _("BROOKE"), -#line 1947 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 1948 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 1949 -F_TRAINER_FEMALE | -#line 1950 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 1951 - .items = { ITEM_FULL_RESTORE }, -#line 1952 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1953 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 1955 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1957 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1956 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1959 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1961 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1960 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1963 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1965 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 1964 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1967 - [DIFFICULTY_NORMAL][TRAINER_PATRICIA] = - { -#line 1968 - .trainerName = _("PATRICIA"), -#line 1969 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1970 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 1971 -F_TRAINER_FEMALE | -#line 1972 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1973 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1974 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1976 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1978 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1977 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1980 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1981 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 1984 - [DIFFICULTY_NORMAL][TRAINER_KINDRA] = - { -#line 1985 - .trainerName = _("KINDRA"), -#line 1986 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 1987 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 1988 -F_TRAINER_FEMALE | -#line 1989 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 1990 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 1991 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 1993 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1995 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1994 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 1997 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 1999 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 1998 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2001 - [DIFFICULTY_NORMAL][TRAINER_TAMMY] = - { -#line 2002 - .trainerName = _("TAMMY"), -#line 2003 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2004 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2005 -F_TRAINER_FEMALE | -#line 2006 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2007 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2008 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2010 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2012 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2011 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2014 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2016 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2015 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2018 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_1] = - { -#line 2019 - .trainerName = _("VALERIE"), -#line 2020 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2021 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2022 -F_TRAINER_FEMALE | -#line 2023 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2024 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2025 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2027 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2029 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2028 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2031 - [DIFFICULTY_NORMAL][TRAINER_TASHA] = - { -#line 2032 - .trainerName = _("TASHA"), -#line 2033 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2034 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2035 -F_TRAINER_FEMALE | -#line 2036 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2037 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2038 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2040 - .species = SPECIES_SHUPPET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2042 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 2041 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2044 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_2] = - { -#line 2045 - .trainerName = _("VALERIE"), -#line 2046 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2047 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2048 -F_TRAINER_FEMALE | -#line 2049 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2050 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2051 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2053 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2055 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2054 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2057 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2059 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2058 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2061 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_3] = - { -#line 2062 - .trainerName = _("VALERIE"), -#line 2063 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2064 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2065 -F_TRAINER_FEMALE | -#line 2066 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2067 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2068 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2070 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2072 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2071 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2074 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2076 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2075 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2078 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_4] = - { -#line 2079 - .trainerName = _("VALERIE"), -#line 2080 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2081 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2082 -F_TRAINER_FEMALE | -#line 2083 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2087 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2089 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2088 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2091 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2093 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2092 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2095 - [DIFFICULTY_NORMAL][TRAINER_VALERIE_5] = - { -#line 2096 - .trainerName = _("VALERIE"), -#line 2097 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 2098 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 2099 -F_TRAINER_FEMALE | -#line 2100 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2104 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2106 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2105 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2108 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2110 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2109 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2112 - .species = SPECIES_GRUMPIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2114 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2113 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2116 - [DIFFICULTY_NORMAL][TRAINER_CINDY_1] = - { -#line 2117 - .trainerName = _("CINDY"), -#line 2118 - .trainerClass = TRAINER_CLASS_LADY, -#line 2119 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2120 -F_TRAINER_FEMALE | -#line 2121 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2122 - .items = { ITEM_FULL_RESTORE }, -#line 2123 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2124 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2126 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2126 - .heldItem = ITEM_NUGGET, -#line 2128 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2127 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2130 - [DIFFICULTY_NORMAL][TRAINER_DAPHNE] = - { -#line 2131 - .trainerName = _("DAPHNE"), -#line 2132 - .trainerClass = TRAINER_CLASS_LADY, -#line 2133 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2134 -F_TRAINER_FEMALE | -#line 2135 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2136 - .items = { ITEM_FULL_RESTORE }, -#line 2137 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2138 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2140 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2140 - .heldItem = ITEM_NUGGET, -#line 2142 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2141 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2143 - MOVE_ATTRACT, - MOVE_SWEET_KISS, - MOVE_FLAIL, - MOVE_WATER_PULSE, - }, - }, - { -#line 2148 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2148 - .heldItem = ITEM_NUGGET, -#line 2150 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2149 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2151 - MOVE_ATTRACT, - MOVE_SAFEGUARD, - MOVE_TAKE_DOWN, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 2156 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_2] = - { -#line 2157 - .trainerName = _("GRUNT"), -#line 2158 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2159 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 2161 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2162 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2163 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2165 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2167 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2166 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2169 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2171 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2170 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2173 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2175 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2174 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2177 - [DIFFICULTY_NORMAL][TRAINER_CINDY_2] = - { -#line 2178 - .trainerName = _("CINDY"), -#line 2179 - .trainerClass = TRAINER_CLASS_LADY, -#line 2180 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2181 -F_TRAINER_FEMALE | -#line 2182 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2183 - .items = { ITEM_FULL_RESTORE }, -#line 2184 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2185 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2187 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2187 - .heldItem = ITEM_NUGGET, -#line 2189 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2188 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2190 - MOVE_TACKLE, - MOVE_TAIL_WHIP, - }, - }, - }, - }, -#line 2193 - [DIFFICULTY_NORMAL][TRAINER_BRIANNA] = - { -#line 2194 - .trainerName = _("BRIANNA"), -#line 2195 - .trainerClass = TRAINER_CLASS_LADY, -#line 2196 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2197 -F_TRAINER_FEMALE | -#line 2198 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2199 - .items = { ITEM_FULL_RESTORE }, -#line 2200 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2201 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2203 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2203 - .heldItem = ITEM_NUGGET, -#line 2205 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2204 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2207 - [DIFFICULTY_NORMAL][TRAINER_NAOMI] = - { -#line 2208 - .trainerName = _("NAOMI"), -#line 2209 - .trainerClass = TRAINER_CLASS_LADY, -#line 2210 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2211 -F_TRAINER_FEMALE | -#line 2212 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2213 - .items = { ITEM_FULL_RESTORE }, -#line 2214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2217 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2217 - .heldItem = ITEM_NUGGET, -#line 2219 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2218 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2221 - [DIFFICULTY_NORMAL][TRAINER_CINDY_3] = - { -#line 2222 - .trainerName = _("CINDY"), -#line 2223 - .trainerClass = TRAINER_CLASS_LADY, -#line 2224 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2225 -F_TRAINER_FEMALE | -#line 2226 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2227 - .items = { ITEM_FULL_RESTORE }, -#line 2228 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2229 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2231 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2231 - .heldItem = ITEM_NUGGET, -#line 2233 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2232 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2235 - [DIFFICULTY_NORMAL][TRAINER_CINDY_4] = - { -#line 2236 - .trainerName = _("CINDY"), -#line 2237 - .trainerClass = TRAINER_CLASS_LADY, -#line 2238 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2239 -F_TRAINER_FEMALE | -#line 2240 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2241 - .items = { ITEM_FULL_RESTORE }, -#line 2242 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2243 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2245 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2245 - .heldItem = ITEM_NUGGET, -#line 2247 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2246 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2249 - [DIFFICULTY_NORMAL][TRAINER_CINDY_5] = - { -#line 2250 - .trainerName = _("CINDY"), -#line 2251 - .trainerClass = TRAINER_CLASS_LADY, -#line 2252 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2253 -F_TRAINER_FEMALE | -#line 2254 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2255 - .items = { ITEM_FULL_RESTORE }, -#line 2256 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2257 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2259 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2259 - .heldItem = ITEM_NUGGET, -#line 2261 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2260 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2263 - [DIFFICULTY_NORMAL][TRAINER_CINDY_6] = - { -#line 2264 - .trainerName = _("CINDY"), -#line 2265 - .trainerClass = TRAINER_CLASS_LADY, -#line 2266 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 2267 -F_TRAINER_FEMALE | -#line 2268 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2269 - .items = { ITEM_FULL_RESTORE }, -#line 2270 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2271 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2273 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2273 - .heldItem = ITEM_NUGGET, -#line 2275 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2274 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2276 - MOVE_FURY_SWIPES, - MOVE_MUD_SPORT, - MOVE_ODOR_SLEUTH, - MOVE_SAND_ATTACK, - }, - }, - }, - }, -#line 2281 - [DIFFICULTY_NORMAL][TRAINER_MELISSA] = - { -#line 2282 - .trainerName = _("MELISSA"), -#line 2283 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2284 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2285 -F_TRAINER_FEMALE | -#line 2286 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2287 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2288 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2290 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2292 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2291 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2294 - [DIFFICULTY_NORMAL][TRAINER_SHEILA] = - { -#line 2295 - .trainerName = _("SHEILA"), -#line 2296 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2297 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2298 -F_TRAINER_FEMALE | -#line 2299 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2300 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2301 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2303 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2305 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2304 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2307 - [DIFFICULTY_NORMAL][TRAINER_SHIRLEY] = - { -#line 2308 - .trainerName = _("SHIRLEY"), -#line 2309 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2310 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2311 -F_TRAINER_FEMALE | -#line 2312 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2313 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2314 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2316 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2318 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2317 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2320 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_1] = - { -#line 2321 - .trainerName = _("JESSICA"), -#line 2322 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2323 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2324 -F_TRAINER_FEMALE | -#line 2325 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2326 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2327 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2329 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2331 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2330 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2332 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2337 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2339 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2338 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2340 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2345 - [DIFFICULTY_NORMAL][TRAINER_CONNIE] = - { -#line 2346 - .trainerName = _("CONNIE"), -#line 2347 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2348 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2349 -F_TRAINER_FEMALE | -#line 2350 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2351 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2352 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2354 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2356 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2355 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2358 - [DIFFICULTY_NORMAL][TRAINER_BRIDGET] = - { -#line 2359 - .trainerName = _("BRIDGET"), -#line 2360 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2361 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2362 -F_TRAINER_FEMALE | -#line 2363 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2364 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2365 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2367 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2369 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 2368 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2371 - [DIFFICULTY_NORMAL][TRAINER_OLIVIA] = - { -#line 2372 - .trainerName = _("OLIVIA"), -#line 2373 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2374 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2375 -F_TRAINER_FEMALE | -#line 2376 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2377 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2378 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2380 - .species = SPECIES_CLAMPERL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2382 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2381 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2383 - MOVE_IRON_DEFENSE, - MOVE_WHIRLPOOL, - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - }, - }, - { -#line 2388 - .species = SPECIES_CORPHISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2390 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2389 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2391 - MOVE_TAUNT, - MOVE_CRABHAMMER, - MOVE_WATER_PULSE, - }, - }, - { -#line 2395 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2397 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2396 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2398 - MOVE_UPROAR, - MOVE_FURY_SWIPES, - MOVE_FAKE_OUT, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 2403 - [DIFFICULTY_NORMAL][TRAINER_TIFFANY] = - { -#line 2404 - .trainerName = _("TIFFANY"), -#line 2405 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2406 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2407 -F_TRAINER_FEMALE | -#line 2408 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2409 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2410 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2412 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2414 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2413 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2416 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2418 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 2417 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2420 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_2] = - { -#line 2421 - .trainerName = _("JESSICA"), -#line 2422 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2423 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2424 -F_TRAINER_FEMALE | -#line 2425 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2427 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2429 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2431 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2430 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2432 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2437 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2439 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2438 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2440 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2445 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_3] = - { -#line 2446 - .trainerName = _("JESSICA"), -#line 2447 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2448 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2449 -F_TRAINER_FEMALE | -#line 2450 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2451 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2452 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2454 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2456 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2455 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2457 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2462 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2464 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2463 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2465 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2470 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_4] = - { -#line 2471 - .trainerName = _("JESSICA"), -#line 2472 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2473 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2474 -F_TRAINER_FEMALE | -#line 2475 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2476 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2477 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2479 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2481 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2480 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2482 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2487 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2489 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2488 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2490 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2495 - [DIFFICULTY_NORMAL][TRAINER_JESSICA_5] = - { -#line 2496 - .trainerName = _("JESSICA"), -#line 2497 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2498 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2499 -F_TRAINER_FEMALE | -#line 2500 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2501 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2502 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2504 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2506 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2505 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2507 - MOVE_BIND, - MOVE_LICK, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 2512 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2514 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2513 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2515 - MOVE_POISON_TAIL, - MOVE_SCREECH, - MOVE_GLARE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 2520 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_1] = - { -#line 2521 - .trainerName = _("WINSTON"), -#line 2522 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2523 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2525 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2526 - .items = { ITEM_FULL_RESTORE }, -#line 2527 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2528 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2530 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2530 - .heldItem = ITEM_NUGGET, -#line 2532 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2531 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2534 - [DIFFICULTY_NORMAL][TRAINER_MOLLIE] = - { -#line 2535 - .trainerName = _("MOLLIE"), -#line 2536 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 2537 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 2538 -F_TRAINER_FEMALE | -#line 2539 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 2540 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2541 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2543 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2545 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2544 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2547 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2549 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 2548 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2551 - [DIFFICULTY_NORMAL][TRAINER_GARRET] = - { -#line 2552 - .trainerName = _("GARRET"), -#line 2553 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2554 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2556 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2557 - .items = { ITEM_FULL_RESTORE }, -#line 2558 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2559 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2561 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2561 - .heldItem = ITEM_NUGGET, -#line 2563 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2562 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2565 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_2] = - { -#line 2566 - .trainerName = _("WINSTON"), -#line 2567 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2568 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2570 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2571 - .items = { ITEM_FULL_RESTORE }, -#line 2572 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2573 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2575 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2575 - .heldItem = ITEM_NUGGET, -#line 2577 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2576 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2579 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_3] = - { -#line 2580 - .trainerName = _("WINSTON"), -#line 2581 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2582 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2584 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2585 - .items = { ITEM_FULL_RESTORE }, -#line 2586 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2587 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2589 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2589 - .heldItem = ITEM_NUGGET, -#line 2591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2590 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2593 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_4] = - { -#line 2594 - .trainerName = _("WINSTON"), -#line 2595 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2596 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2598 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2599 - .items = { ITEM_FULL_RESTORE }, -#line 2600 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2601 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2603 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2603 - .heldItem = ITEM_NUGGET, -#line 2605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2604 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2607 - [DIFFICULTY_NORMAL][TRAINER_WINSTON_5] = - { -#line 2608 - .trainerName = _("WINSTON"), -#line 2609 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 2610 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 2612 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 2613 - .items = { ITEM_FULL_RESTORE }, -#line 2614 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2615 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2617 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2617 - .heldItem = ITEM_NUGGET, -#line 2619 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2618 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 2620 - MOVE_FURY_SWIPES, - MOVE_MUD_SPORT, - MOVE_ODOR_SLEUTH, - MOVE_SAND_ATTACK, - }, - }, - }, - }, -#line 2625 - [DIFFICULTY_NORMAL][TRAINER_STEVE_1] = - { -#line 2626 - .trainerName = _("STEVE"), -#line 2627 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2628 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2630 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2631 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2632 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2634 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2636 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2635 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2638 - [DIFFICULTY_NORMAL][TRAINER_THALIA_1] = - { -#line 2639 - .trainerName = _("THALIA"), -#line 2640 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 2641 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 2642 -F_TRAINER_FEMALE | -#line 2643 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 2644 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2645 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2647 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2649 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2648 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2651 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2653 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2652 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2655 - [DIFFICULTY_NORMAL][TRAINER_MARK] = - { -#line 2656 - .trainerName = _("MARK"), -#line 2657 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2658 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2660 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2661 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2662 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2664 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2666 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2665 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2668 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_1] = - { -#line 2669 - .trainerName = _("GRUNT"), -#line 2670 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 2671 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 2672 -F_TRAINER_FEMALE | -#line 2673 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 2674 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2675 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2677 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2679 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2678 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2681 - [DIFFICULTY_NORMAL][TRAINER_STEVE_2] = - { -#line 2682 - .trainerName = _("STEVE"), -#line 2683 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2684 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2686 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2687 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2688 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2690 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2692 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2691 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2694 - [DIFFICULTY_NORMAL][TRAINER_STEVE_3] = - { -#line 2695 - .trainerName = _("STEVE"), -#line 2696 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2697 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2699 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2700 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2701 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2703 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2705 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2704 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2707 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2709 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 2708 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2711 - [DIFFICULTY_NORMAL][TRAINER_STEVE_4] = - { -#line 2712 - .trainerName = _("STEVE"), -#line 2713 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2714 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2716 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2717 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2718 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2720 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2722 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2721 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2724 - .species = SPECIES_RHYHORN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2726 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 2725 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2728 - [DIFFICULTY_NORMAL][TRAINER_STEVE_5] = - { -#line 2729 - .trainerName = _("STEVE"), -#line 2730 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 2731 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 2733 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 2734 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2735 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2737 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2739 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2738 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2741 - .species = SPECIES_RHYDON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2743 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 2742 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2745 - [DIFFICULTY_NORMAL][TRAINER_LUIS] = - { -#line 2746 - .trainerName = _("LUIS"), -#line 2747 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2748 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2750 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2751 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2752 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2754 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2756 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2755 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2758 - [DIFFICULTY_NORMAL][TRAINER_DOMINIK] = - { -#line 2759 - .trainerName = _("DOMINIK"), -#line 2760 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2761 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2763 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2764 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2765 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2767 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2769 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2768 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2771 - [DIFFICULTY_NORMAL][TRAINER_DOUGLAS] = - { -#line 2772 - .trainerName = _("DOUGLAS"), -#line 2773 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2774 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2776 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2777 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2778 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2780 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2782 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2781 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2784 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2786 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2785 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2788 - [DIFFICULTY_NORMAL][TRAINER_DARRIN] = - { -#line 2789 - .trainerName = _("DARRIN"), -#line 2790 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2791 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2793 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2794 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2795 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2797 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2799 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2798 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2801 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2803 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2802 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2805 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2807 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 2806 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2809 - [DIFFICULTY_NORMAL][TRAINER_TONY_1] = - { -#line 2810 - .trainerName = _("TONY"), -#line 2811 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2812 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2814 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2815 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2816 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2818 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2820 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2819 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2822 - [DIFFICULTY_NORMAL][TRAINER_JEROME] = - { -#line 2823 - .trainerName = _("JEROME"), -#line 2824 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2825 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2827 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2828 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2829 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2831 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2833 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2832 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2835 - [DIFFICULTY_NORMAL][TRAINER_MATTHEW] = - { -#line 2836 - .trainerName = _("MATTHEW"), -#line 2837 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2838 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2840 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2841 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2842 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2844 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2846 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2845 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2848 - [DIFFICULTY_NORMAL][TRAINER_DAVID] = - { -#line 2849 - .trainerName = _("DAVID"), -#line 2850 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2851 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2853 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2854 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2855 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2857 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2859 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2858 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2861 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2863 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2862 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2865 - [DIFFICULTY_NORMAL][TRAINER_SPENCER] = - { -#line 2866 - .trainerName = _("SPENCER"), -#line 2867 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2868 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2870 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2871 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2872 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2874 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2876 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2875 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2878 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2880 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2879 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2882 - [DIFFICULTY_NORMAL][TRAINER_ROLAND] = - { -#line 2883 - .trainerName = _("ROLAND"), -#line 2884 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2885 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2887 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2888 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2889 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2891 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2893 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2892 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2895 - [DIFFICULTY_NORMAL][TRAINER_NOLEN] = - { -#line 2896 - .trainerName = _("NOLEN"), -#line 2897 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2898 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2900 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2901 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2902 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2904 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2906 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2905 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2908 - [DIFFICULTY_NORMAL][TRAINER_STAN] = - { -#line 2909 - .trainerName = _("STAN"), -#line 2910 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2911 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2913 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2914 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2915 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2917 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2919 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2918 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2921 - [DIFFICULTY_NORMAL][TRAINER_BARRY] = - { -#line 2922 - .trainerName = _("BARRY"), -#line 2923 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2924 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2926 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2927 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2928 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2930 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2932 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2931 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2934 - [DIFFICULTY_NORMAL][TRAINER_DEAN] = - { -#line 2935 - .trainerName = _("DEAN"), -#line 2936 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2937 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2939 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2940 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2941 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 2943 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2945 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2944 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2947 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2949 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2948 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2951 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2953 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2952 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2955 - [DIFFICULTY_NORMAL][TRAINER_RODNEY] = - { -#line 2956 - .trainerName = _("RODNEY"), -#line 2957 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2958 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2960 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2961 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2962 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2964 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2966 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2965 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2968 - [DIFFICULTY_NORMAL][TRAINER_RICHARD] = - { -#line 2969 - .trainerName = _("RICHARD"), -#line 2970 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2971 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2973 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2974 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2975 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 2977 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2979 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2978 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2981 - [DIFFICULTY_NORMAL][TRAINER_HERMAN] = - { -#line 2982 - .trainerName = _("HERMAN"), -#line 2983 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 2984 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 2986 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 2987 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 2988 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 2990 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2992 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2991 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 2994 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 2996 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 2995 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 2998 - [DIFFICULTY_NORMAL][TRAINER_SANTIAGO] = - { -#line 2999 - .trainerName = _("SANTIAGO"), -#line 3000 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3001 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3003 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3004 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3005 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3007 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3009 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3008 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3011 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3013 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3012 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3015 - [DIFFICULTY_NORMAL][TRAINER_GILBERT] = - { -#line 3016 - .trainerName = _("GILBERT"), -#line 3017 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3018 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3020 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3021 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3022 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3024 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3026 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3025 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3028 - [DIFFICULTY_NORMAL][TRAINER_FRANKLIN] = - { -#line 3029 - .trainerName = _("FRANKLIN"), -#line 3030 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3031 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3033 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3034 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3035 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3037 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3039 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3038 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3041 - [DIFFICULTY_NORMAL][TRAINER_KEVIN] = - { -#line 3042 - .trainerName = _("KEVIN"), -#line 3043 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3044 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3046 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3047 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3048 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3050 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3052 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3051 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3054 - [DIFFICULTY_NORMAL][TRAINER_JACK] = - { -#line 3055 - .trainerName = _("JACK"), -#line 3056 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3057 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3059 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3060 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3061 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3063 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3065 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3064 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3067 - [DIFFICULTY_NORMAL][TRAINER_DUDLEY] = - { -#line 3068 - .trainerName = _("DUDLEY"), -#line 3069 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3070 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3072 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3073 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3074 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3076 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3078 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3077 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3080 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3082 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3081 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3084 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3086 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3085 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3088 - [DIFFICULTY_NORMAL][TRAINER_CHAD] = - { -#line 3089 - .trainerName = _("CHAD"), -#line 3090 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3091 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3093 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3094 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3095 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3097 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3099 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3098 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3101 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3103 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3102 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3105 - [DIFFICULTY_NORMAL][TRAINER_TONY_2] = - { -#line 3106 - .trainerName = _("TONY"), -#line 3107 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3108 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3110 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3111 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3112 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3114 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3116 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3115 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3118 - [DIFFICULTY_NORMAL][TRAINER_TONY_3] = - { -#line 3119 - .trainerName = _("TONY"), -#line 3120 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3121 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3123 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3124 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3125 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3127 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3129 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3128 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3131 - [DIFFICULTY_NORMAL][TRAINER_TONY_4] = - { -#line 3132 - .trainerName = _("TONY"), -#line 3133 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3134 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3136 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3137 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3138 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3140 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3142 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3141 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3144 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3146 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3145 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3148 - [DIFFICULTY_NORMAL][TRAINER_TONY_5] = - { -#line 3149 - .trainerName = _("TONY"), -#line 3150 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 3151 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 3153 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 3154 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3155 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3157 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3159 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3158 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3161 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3163 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3162 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3165 - [DIFFICULTY_NORMAL][TRAINER_TAKAO] = - { -#line 3166 - .trainerName = _("TAKAO"), -#line 3167 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3168 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3170 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3171 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3172 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3174 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3176 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3175 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3178 - [DIFFICULTY_NORMAL][TRAINER_HITOSHI] = - { -#line 3179 - .trainerName = _("HITOSHI"), -#line 3180 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3181 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3183 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3184 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3185 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3187 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3189 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 3188 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3191 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3193 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 3192 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3195 - [DIFFICULTY_NORMAL][TRAINER_KIYO] = - { -#line 3196 - .trainerName = _("KIYO"), -#line 3197 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3198 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3200 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3201 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3202 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3204 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3206 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3205 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3208 - [DIFFICULTY_NORMAL][TRAINER_KOICHI] = - { -#line 3209 - .trainerName = _("KOICHI"), -#line 3210 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3211 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3213 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3217 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3219 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3218 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3221 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3223 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3222 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3225 - [DIFFICULTY_NORMAL][TRAINER_NOB_1] = - { -#line 3226 - .trainerName = _("NOB"), -#line 3227 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3228 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3230 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3234 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3236 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3235 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3238 - [DIFFICULTY_NORMAL][TRAINER_NOB_2] = - { -#line 3239 - .trainerName = _("NOB"), -#line 3240 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3241 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3243 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3244 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3245 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3247 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3249 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 3248 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3251 - [DIFFICULTY_NORMAL][TRAINER_NOB_3] = - { -#line 3252 - .trainerName = _("NOB"), -#line 3253 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3254 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3256 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3257 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3258 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3260 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3262 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3261 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3264 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3266 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3265 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3268 - [DIFFICULTY_NORMAL][TRAINER_NOB_4] = - { -#line 3269 - .trainerName = _("NOB"), -#line 3270 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3271 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3273 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3274 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3275 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3277 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3279 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3278 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3281 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3283 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3282 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3285 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3287 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 3286 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3289 - [DIFFICULTY_NORMAL][TRAINER_NOB_5] = - { -#line 3290 - .trainerName = _("NOB"), -#line 3291 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3292 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3294 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3295 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3296 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 3298 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3300 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3299 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3302 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3304 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3303 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3306 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3308 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3307 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3310 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3310 - .heldItem = ITEM_BLACK_BELT, -#line 3312 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 3311 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3314 - [DIFFICULTY_NORMAL][TRAINER_YUJI] = - { -#line 3315 - .trainerName = _("YUJI"), -#line 3316 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3317 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3319 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3320 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3321 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3323 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3325 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3324 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3327 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3329 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3328 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3331 - [DIFFICULTY_NORMAL][TRAINER_DAISUKE] = - { -#line 3332 - .trainerName = _("DAISUKE"), -#line 3333 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3334 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3336 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3337 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3338 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3340 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3342 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3341 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3344 - [DIFFICULTY_NORMAL][TRAINER_ATSUSHI] = - { -#line 3345 - .trainerName = _("ATSUSHI"), -#line 3346 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 3347 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 3349 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3353 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3355 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3354 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3357 - [DIFFICULTY_NORMAL][TRAINER_KIRK] = - { -#line 3358 - .trainerName = _("KIRK"), -#line 3359 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3360 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3362 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3363 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3364 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3366 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3368 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3367 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3369 - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - MOVE_SPARK, - MOVE_LEER, - }, - }, - { -#line 3374 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3376 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3375 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3377 - MOVE_CHARGE, - MOVE_SHOCK_WAVE, - MOVE_SCREECH, - }, - }, - }, - }, -#line 3381 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_7] = - { -#line 3382 - .trainerName = _("GRUNT"), -#line 3383 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3384 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 3385 -F_TRAINER_FEMALE | -#line 3386 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3387 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3388 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3390 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3392 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3391 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3394 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3396 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3395 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3398 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_AQUA_HIDEOUT_8] = - { -#line 3399 - .trainerName = _("GRUNT"), -#line 3400 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 3401 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 3403 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 3404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3407 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3408 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3411 - [DIFFICULTY_NORMAL][TRAINER_SHAWN] = - { -#line 3412 - .trainerName = _("SHAWN"), -#line 3413 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3414 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3416 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3417 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3418 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3420 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3422 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3421 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3424 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3426 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3425 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3428 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_1] = - { -#line 3429 - .trainerName = _("FERNANDO"), -#line 3430 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3431 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3433 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3434 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3435 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3437 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3439 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3438 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3441 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3443 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3442 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3445 - [DIFFICULTY_NORMAL][TRAINER_DALTON_1] = - { -#line 3446 - .trainerName = _("DALTON"), -#line 3447 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3448 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3450 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3451 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3452 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3454 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3456 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3455 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3458 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3459 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3462 - [DIFFICULTY_NORMAL][TRAINER_DALTON_2] = - { -#line 3463 - .trainerName = _("DALTON"), -#line 3464 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3465 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3467 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3471 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3473 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3472 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3475 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3477 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3476 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3479 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3481 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3480 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3483 - [DIFFICULTY_NORMAL][TRAINER_DALTON_3] = - { -#line 3484 - .trainerName = _("DALTON"), -#line 3485 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3486 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3488 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3489 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3490 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3492 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3494 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3493 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3496 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3498 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3497 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3500 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3502 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3501 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3504 - [DIFFICULTY_NORMAL][TRAINER_DALTON_4] = - { -#line 3505 - .trainerName = _("DALTON"), -#line 3506 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3507 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3509 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3510 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3511 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3513 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3515 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3514 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3517 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3519 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3518 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3521 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3523 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3522 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3525 - [DIFFICULTY_NORMAL][TRAINER_DALTON_5] = - { -#line 3526 - .trainerName = _("DALTON"), -#line 3527 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 3528 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 3530 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 3531 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3532 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3534 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3536 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3535 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3538 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3540 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3539 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3542 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3544 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3543 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3546 - [DIFFICULTY_NORMAL][TRAINER_COLE] = - { -#line 3547 - .trainerName = _("COLE"), -#line 3548 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3549 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3551 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3552 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3553 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3555 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3557 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3556 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3559 - [DIFFICULTY_NORMAL][TRAINER_JEFF] = - { -#line 3560 - .trainerName = _("JEFF"), -#line 3561 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3562 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3564 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3565 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3566 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3568 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3570 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3569 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3572 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3574 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3573 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3576 - [DIFFICULTY_NORMAL][TRAINER_AXLE] = - { -#line 3577 - .trainerName = _("AXLE"), -#line 3578 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3579 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3581 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3585 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3587 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3586 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3589 - [DIFFICULTY_NORMAL][TRAINER_JACE] = - { -#line 3590 - .trainerName = _("JACE"), -#line 3591 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3592 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3594 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3595 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3596 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3598 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3600 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3599 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3602 - [DIFFICULTY_NORMAL][TRAINER_KEEGAN] = - { -#line 3603 - .trainerName = _("KEEGAN"), -#line 3604 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3605 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3607 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3608 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3609 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3611 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3613 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 3612 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3615 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_1] = - { -#line 3616 - .trainerName = _("BERNIE"), -#line 3617 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3618 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3620 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3621 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3622 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3624 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3626 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3625 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3628 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3630 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3629 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3632 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_2] = - { -#line 3633 - .trainerName = _("BERNIE"), -#line 3634 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3635 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3637 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3638 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3639 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3641 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3643 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3642 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3645 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3647 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3646 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3649 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_3] = - { -#line 3650 - .trainerName = _("BERNIE"), -#line 3651 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3652 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3654 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3655 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3656 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3658 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3660 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3659 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3662 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3664 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3663 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3666 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_4] = - { -#line 3667 - .trainerName = _("BERNIE"), -#line 3668 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3669 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3671 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3672 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3673 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3675 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3677 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3676 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3679 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3681 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3680 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3683 - [DIFFICULTY_NORMAL][TRAINER_BERNIE_5] = - { -#line 3684 - .trainerName = _("BERNIE"), -#line 3685 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 3686 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 3688 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 3689 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3690 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3692 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3694 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3693 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3696 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3698 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3697 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3700 - [DIFFICULTY_NORMAL][TRAINER_DREW] = - { -#line 3701 - .trainerName = _("DREW"), -#line 3702 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3703 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3705 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3706 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3707 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3709 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3711 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3710 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3712 - MOVE_DIG, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - }, - }, - }, - }, -#line 3717 - [DIFFICULTY_NORMAL][TRAINER_BEAU] = - { -#line 3718 - .trainerName = _("BEAU"), -#line 3719 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3720 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3722 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3723 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3724 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3726 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3728 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3727 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3729 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - { -#line 3734 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3736 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3735 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3737 - MOVE_POISON_STING, - MOVE_SAND_ATTACK, - MOVE_SCRATCH, - MOVE_DIG, - }, - }, - { -#line 3742 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3744 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3743 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 3745 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 3750 - [DIFFICULTY_NORMAL][TRAINER_LARRY] = - { -#line 3751 - .trainerName = _("LARRY"), -#line 3752 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3753 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3755 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3759 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3761 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3760 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3763 - [DIFFICULTY_NORMAL][TRAINER_SHANE] = - { -#line 3764 - .trainerName = _("SHANE"), -#line 3765 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3766 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3768 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3772 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3774 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3773 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3776 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3778 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3777 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3780 - [DIFFICULTY_NORMAL][TRAINER_JUSTIN] = - { -#line 3781 - .trainerName = _("JUSTIN"), -#line 3782 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3783 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3785 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3786 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3787 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3789 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3791 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3790 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3793 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_1] = - { -#line 3794 - .trainerName = _("ETHAN"), -#line 3795 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3796 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3798 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3799 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3800 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3802 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3804 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3803 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3806 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3808 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3807 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3810 - [DIFFICULTY_NORMAL][TRAINER_AUTUMN] = - { -#line 3811 - .trainerName = _("AUTUMN"), -#line 3812 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 3813 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 3814 -F_TRAINER_FEMALE | -#line 3815 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 3816 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3817 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3819 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3821 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3820 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3823 - [DIFFICULTY_NORMAL][TRAINER_TRAVIS] = - { -#line 3824 - .trainerName = _("TRAVIS"), -#line 3825 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3826 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3828 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3829 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3830 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3832 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3834 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3833 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3836 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_2] = - { -#line 3837 - .trainerName = _("ETHAN"), -#line 3838 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3839 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3841 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3842 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3843 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3845 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3847 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3846 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3849 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3851 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 3850 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3853 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_3] = - { -#line 3854 - .trainerName = _("ETHAN"), -#line 3855 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3856 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3858 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3860 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3862 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3864 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3863 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3866 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3868 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 3867 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3870 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_4] = - { -#line 3871 - .trainerName = _("ETHAN"), -#line 3872 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3873 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3875 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3876 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3877 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3879 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3881 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3880 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3883 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3885 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3884 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3887 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3889 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 3888 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3891 - [DIFFICULTY_NORMAL][TRAINER_ETHAN_5] = - { -#line 3892 - .trainerName = _("ETHAN"), -#line 3893 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 3894 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 3896 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 3897 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3898 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3900 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3902 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3901 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3904 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3906 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3905 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3908 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3910 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 3909 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3912 - [DIFFICULTY_NORMAL][TRAINER_BRENT] = - { -#line 3913 - .trainerName = _("BRENT"), -#line 3914 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3915 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3917 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3918 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3919 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 3921 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3923 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3922 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3925 - [DIFFICULTY_NORMAL][TRAINER_DONALD] = - { -#line 3926 - .trainerName = _("DONALD"), -#line 3927 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3928 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3930 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3931 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3932 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3934 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3936 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3935 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3938 - .species = SPECIES_SILCOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3940 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3939 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3942 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3944 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3943 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3946 - [DIFFICULTY_NORMAL][TRAINER_TAYLOR] = - { -#line 3947 - .trainerName = _("TAYLOR"), -#line 3948 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3949 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3951 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3952 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3953 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3955 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3957 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3956 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3959 - .species = SPECIES_CASCOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3961 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3960 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3963 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3965 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 3964 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3967 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_1] = - { -#line 3968 - .trainerName = _("JEFFREY"), -#line 3969 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3970 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3972 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3973 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3974 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 3976 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3978 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3977 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3980 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3981 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 3984 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3986 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 3985 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 3988 - [DIFFICULTY_NORMAL][TRAINER_DEREK] = - { -#line 3989 - .trainerName = _("DEREK"), -#line 3990 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 3991 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 3993 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 3994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 3995 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 3997 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 3999 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 3998 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4001 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4003 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 4002 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4005 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_2] = - { -#line 4006 - .trainerName = _("JEFFREY"), -#line 4007 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4008 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4010 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4014 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4016 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4015 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4018 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4020 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4019 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4022 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4024 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4023 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4026 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_3] = - { -#line 4027 - .trainerName = _("JEFFREY"), -#line 4028 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4029 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4031 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4033 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4035 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4036 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4039 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4041 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4040 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4043 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4045 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4044 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4047 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_4] = - { -#line 4048 - .trainerName = _("JEFFREY"), -#line 4049 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4050 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4052 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4056 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4058 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4057 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4060 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4062 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4061 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4064 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4066 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4065 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4068 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4070 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4069 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4072 - [DIFFICULTY_NORMAL][TRAINER_JEFFREY_5] = - { -#line 4073 - .trainerName = _("JEFFREY"), -#line 4074 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 4075 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 4077 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 4078 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4079 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4081 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4083 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4082 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4085 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4087 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4086 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4089 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4091 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4090 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4093 - .species = SPECIES_MASQUERAIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4093 - .heldItem = ITEM_SILVER_POWDER, -#line 4095 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4094 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4097 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4099 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4098 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4101 - [DIFFICULTY_NORMAL][TRAINER_EDWARD] = - { -#line 4102 - .trainerName = _("EDWARD"), -#line 4103 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4104 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4106 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4107 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4108 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4110 - .species = SPECIES_ABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4112 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4111 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4113 - MOVE_HIDDEN_POWER, - }, - }, - }, - }, -#line 4115 - [DIFFICULTY_NORMAL][TRAINER_PRESTON] = - { -#line 4116 - .trainerName = _("PRESTON"), -#line 4117 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4118 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4120 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4121 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4122 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4124 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4126 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4125 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4128 - [DIFFICULTY_NORMAL][TRAINER_VIRGIL] = - { -#line 4129 - .trainerName = _("VIRGIL"), -#line 4130 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4131 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4133 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4134 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4135 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4137 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4139 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4138 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4141 - [DIFFICULTY_NORMAL][TRAINER_BLAKE] = - { -#line 4142 - .trainerName = _("BLAKE"), -#line 4143 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4144 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4146 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4147 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4148 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4150 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4152 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4151 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4154 - [DIFFICULTY_NORMAL][TRAINER_WILLIAM] = - { -#line 4155 - .trainerName = _("WILLIAM"), -#line 4156 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4157 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4159 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4160 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4161 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4163 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4165 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4164 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4167 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4169 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4168 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4171 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4173 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4172 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4175 - [DIFFICULTY_NORMAL][TRAINER_JOSHUA] = - { -#line 4176 - .trainerName = _("JOSHUA"), -#line 4177 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4178 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4180 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4181 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4182 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4184 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4186 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4185 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4188 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4189 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4192 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_1] = - { -#line 4193 - .trainerName = _("CAMERON"), -#line 4194 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4195 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4197 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4201 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4202 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4205 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_2] = - { -#line 4206 - .trainerName = _("CAMERON"), -#line 4207 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4208 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4210 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4211 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4212 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4214 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4216 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4215 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4218 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4220 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4219 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4222 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_3] = - { -#line 4223 - .trainerName = _("CAMERON"), -#line 4224 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4225 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4227 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4228 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4229 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4231 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4233 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4232 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4235 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4237 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4236 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4239 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_4] = - { -#line 4240 - .trainerName = _("CAMERON"), -#line 4241 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4242 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4244 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4245 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4246 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4248 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4250 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4249 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4252 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4254 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4253 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4256 - [DIFFICULTY_NORMAL][TRAINER_CAMERON_5] = - { -#line 4257 - .trainerName = _("CAMERON"), -#line 4258 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4259 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 4261 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4265 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4267 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4266 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4269 - .species = SPECIES_ALAKAZAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4271 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4270 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4273 - [DIFFICULTY_NORMAL][TRAINER_JACLYN] = - { -#line 4274 - .trainerName = _("JACLYN"), -#line 4275 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4276 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4277 -F_TRAINER_FEMALE | -#line 4278 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4280 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4282 - .species = SPECIES_ABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4284 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4283 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4285 - MOVE_HIDDEN_POWER, - }, - }, - }, - }, -#line 4287 - [DIFFICULTY_NORMAL][TRAINER_HANNAH] = - { -#line 4288 - .trainerName = _("HANNAH"), -#line 4289 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4290 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4291 -F_TRAINER_FEMALE | -#line 4292 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4293 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4294 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4296 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4298 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4297 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4300 - [DIFFICULTY_NORMAL][TRAINER_SAMANTHA] = - { -#line 4301 - .trainerName = _("SAMANTHA"), -#line 4302 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4303 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4304 -F_TRAINER_FEMALE | -#line 4305 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4306 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4307 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4309 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4311 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4310 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4313 - [DIFFICULTY_NORMAL][TRAINER_MAURA] = - { -#line 4314 - .trainerName = _("MAURA"), -#line 4315 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4316 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4317 -F_TRAINER_FEMALE | -#line 4318 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4320 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4322 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4324 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4323 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4326 - [DIFFICULTY_NORMAL][TRAINER_KAYLA] = - { -#line 4327 - .trainerName = _("KAYLA"), -#line 4328 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4329 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4330 -F_TRAINER_FEMALE | -#line 4331 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4333 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4335 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4337 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4336 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4339 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4340 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4343 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4345 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4344 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4347 - [DIFFICULTY_NORMAL][TRAINER_ALEXIS] = - { -#line 4348 - .trainerName = _("ALEXIS"), -#line 4349 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4350 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4351 -F_TRAINER_FEMALE | -#line 4352 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4353 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4354 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4356 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4358 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4357 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4360 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4362 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4361 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4364 - [DIFFICULTY_NORMAL][TRAINER_JACKI_1] = - { -#line 4365 - .trainerName = _("JACKI"), -#line 4366 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4367 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4368 -F_TRAINER_FEMALE | -#line 4369 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4370 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4371 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4373 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4375 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4374 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4377 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4379 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4378 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4381 - [DIFFICULTY_NORMAL][TRAINER_JACKI_2] = - { -#line 4382 - .trainerName = _("JACKI"), -#line 4383 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4384 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4385 -F_TRAINER_FEMALE | -#line 4386 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4387 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4388 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4390 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4392 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4391 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4394 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4396 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4398 - [DIFFICULTY_NORMAL][TRAINER_JACKI_3] = - { -#line 4399 - .trainerName = _("JACKI"), -#line 4400 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4401 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4402 -F_TRAINER_FEMALE | -#line 4403 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4407 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4409 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4408 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4411 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4413 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4412 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4415 - [DIFFICULTY_NORMAL][TRAINER_JACKI_4] = - { -#line 4416 - .trainerName = _("JACKI"), -#line 4417 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4418 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4419 -F_TRAINER_FEMALE | -#line 4420 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4421 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4422 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4424 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4426 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4425 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4428 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4430 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4429 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4432 - [DIFFICULTY_NORMAL][TRAINER_JACKI_5] = - { -#line 4433 - .trainerName = _("JACKI"), -#line 4434 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 4435 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 4436 -F_TRAINER_FEMALE | -#line 4437 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 4438 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4439 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4441 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4443 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4442 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4445 - .species = SPECIES_ALAKAZAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4447 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4446 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4449 - [DIFFICULTY_NORMAL][TRAINER_WALTER_1] = - { -#line 4450 - .trainerName = _("WALTER"), -#line 4451 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4452 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4454 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4455 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4456 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4458 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4459 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4462 - [DIFFICULTY_NORMAL][TRAINER_MICAH] = - { -#line 4463 - .trainerName = _("MICAH"), -#line 4464 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4465 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4467 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4471 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4472 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 4475 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4477 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4476 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4479 - [DIFFICULTY_NORMAL][TRAINER_THOMAS] = - { -#line 4480 - .trainerName = _("THOMAS"), -#line 4481 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4482 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4484 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4485 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4486 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4488 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4490 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 4489 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4492 - [DIFFICULTY_NORMAL][TRAINER_WALTER_2] = - { -#line 4493 - .trainerName = _("WALTER"), -#line 4494 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4495 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4497 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4498 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4499 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 4501 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4503 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 4502 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 4505 - [DIFFICULTY_NORMAL][TRAINER_WALTER_3] = - { -#line 4506 - .trainerName = _("WALTER"), -#line 4507 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4508 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4510 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4514 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4516 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4515 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4517 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4522 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4524 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 4523 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4525 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - MOVE_ROAR, - }, - }, - }, - }, -#line 4530 - [DIFFICULTY_NORMAL][TRAINER_WALTER_4] = - { -#line 4531 - .trainerName = _("WALTER"), -#line 4532 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4533 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4535 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 4539 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4541 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4540 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4542 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4547 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4549 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 4548 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4550 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - }, - }, - }, - }, -#line 4554 - [DIFFICULTY_NORMAL][TRAINER_WALTER_5] = - { -#line 4555 - .trainerName = _("WALTER"), -#line 4556 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 4557 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 4559 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 4560 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4561 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4563 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4565 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4564 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4566 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_ODOR_SLEUTH, - MOVE_FURY_SWIPES, - }, - }, - { -#line 4571 - .species = SPECIES_GOLDUCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4573 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4572 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4574 - MOVE_FURY_SWIPES, - MOVE_DISABLE, - MOVE_CONFUSION, - MOVE_PSYCH_UP, - }, - }, - { -#line 4579 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4581 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 4580 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4582 - MOVE_QUICK_ATTACK, - MOVE_SPARK, - MOVE_ODOR_SLEUTH, - MOVE_ROAR, - }, - }, - }, - }, -#line 4587 - [DIFFICULTY_NORMAL][TRAINER_SIDNEY] = - { -#line 4588 - .trainerName = _("SIDNEY"), -#line 4589 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4590 - .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, - .encounterMusic_gender = -#line 4592 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4593 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4594 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4595 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_FORCE_SETUP_FIRST_TURN, -#line 4596 - .mugshotColor = MUGSHOT_COLOR_PURPLE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4598 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4600 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4599 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4601 - MOVE_ROAR, - MOVE_DOUBLE_EDGE, - MOVE_SAND_ATTACK, - MOVE_CRUNCH, - }, - }, - { -#line 4606 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4608 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4607 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4609 - MOVE_TORMENT, - MOVE_DOUBLE_TEAM, - MOVE_SWAGGER, - MOVE_EXTRASENSORY, - }, - }, - { -#line 4614 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4616 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4615 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4617 - MOVE_LEECH_SEED, - MOVE_FEINT_ATTACK, - MOVE_NEEDLE_ARM, - MOVE_COTTON_SPORE, - }, - }, - { -#line 4622 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4624 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4623 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4625 - MOVE_SURF, - MOVE_SWORDS_DANCE, - MOVE_STRENGTH, - MOVE_FACADE, - }, - }, - { -#line 4630 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4630 - .heldItem = ITEM_SITRUS_BERRY, -#line 4632 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4631 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4633 - MOVE_AERIAL_ACE, - MOVE_ROCK_SLIDE, - MOVE_SWORDS_DANCE, - MOVE_SLASH, - }, - }, - }, - }, -#line 4638 - [DIFFICULTY_NORMAL][TRAINER_PHOEBE] = - { -#line 4639 - .trainerName = _("PHOEBE"), -#line 4640 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4641 - .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, - .encounterMusic_gender = -#line 4642 -F_TRAINER_FEMALE | -#line 4643 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4644 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4645 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4646 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4647 - .mugshotColor = MUGSHOT_COLOR_GREEN, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4649 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4651 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4650 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4652 - MOVE_SHADOW_PUNCH, - MOVE_CONFUSE_RAY, - MOVE_CURSE, - MOVE_PROTECT, - }, - }, - { -#line 4657 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4659 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4658 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4660 - MOVE_SHADOW_BALL, - MOVE_GRUDGE, - MOVE_WILL_O_WISP, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4665 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4667 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4666 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4668 - MOVE_SHADOW_BALL, - MOVE_DOUBLE_TEAM, - MOVE_NIGHT_SHADE, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4673 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4675 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4674 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4676 - MOVE_SHADOW_BALL, - MOVE_PSYCHIC, - MOVE_THUNDERBOLT, - MOVE_FACADE, - }, - }, - { -#line 4681 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4681 - .heldItem = ITEM_SITRUS_BERRY, -#line 4683 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4682 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4684 - MOVE_SHADOW_BALL, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 4689 - [DIFFICULTY_NORMAL][TRAINER_GLACIA] = - { -#line 4690 - .trainerName = _("GLACIA"), -#line 4691 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4692 - .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, - .encounterMusic_gender = -#line 4693 -F_TRAINER_FEMALE | -#line 4694 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4695 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4696 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4697 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4698 - .mugshotColor = MUGSHOT_COLOR_PINK, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4700 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4702 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4701 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4703 - MOVE_ENCORE, - MOVE_BODY_SLAM, - MOVE_HAIL, - MOVE_ICE_BALL, - }, - }, - { -#line 4708 - .species = SPECIES_GLALIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4710 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4709 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4711 - MOVE_LIGHT_SCREEN, - MOVE_CRUNCH, - MOVE_ICY_WIND, - MOVE_ICE_BEAM, - }, - }, - { -#line 4716 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4718 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4717 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4719 - MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, - MOVE_HAIL, - MOVE_BLIZZARD, - }, - }, - { -#line 4724 - .species = SPECIES_GLALIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4726 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4725 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4727 - MOVE_SHADOW_BALL, - MOVE_EXPLOSION, - MOVE_HAIL, - MOVE_ICE_BEAM, - }, - }, - { -#line 4732 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4732 - .heldItem = ITEM_SITRUS_BERRY, -#line 4734 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4733 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4735 - MOVE_SURF, - MOVE_BODY_SLAM, - MOVE_ICE_BEAM, - MOVE_SHEER_COLD, - }, - }, - }, - }, -#line 4740 - [DIFFICULTY_NORMAL][TRAINER_DRAKE] = - { -#line 4741 - .trainerName = _("DRAKE"), -#line 4742 - .trainerClass = TRAINER_CLASS_ELITE_FOUR, -#line 4743 - .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, - .encounterMusic_gender = -#line 4745 - TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, -#line 4746 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 4747 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4748 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 4749 - .mugshotColor = MUGSHOT_COLOR_BLUE, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4751 - .species = SPECIES_SHELGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4753 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4752 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4754 - MOVE_ROCK_TOMB, - MOVE_DRAGON_CLAW, - MOVE_PROTECT, - MOVE_DOUBLE_EDGE, - }, - }, - { -#line 4759 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4761 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4760 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4762 - MOVE_DOUBLE_EDGE, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - MOVE_AERIAL_ACE, - }, - }, - { -#line 4767 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4769 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4768 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4770 - MOVE_SMOKESCREEN, - MOVE_DRAGON_DANCE, - MOVE_SURF, - MOVE_BODY_SLAM, - }, - }, - { -#line 4775 - .species = SPECIES_FLYGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4777 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4776 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4778 - MOVE_FLAMETHROWER, - MOVE_CRUNCH, - MOVE_DRAGON_BREATH, - MOVE_EARTHQUAKE, - }, - }, - { -#line 4783 - .species = SPECIES_SALAMENCE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4783 - .heldItem = ITEM_SITRUS_BERRY, -#line 4785 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 4784 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4786 - MOVE_FLAMETHROWER, - MOVE_DRAGON_CLAW, - MOVE_ROCK_SLIDE, - MOVE_CRUNCH, - }, - }, - }, - }, -#line 4791 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_1] = - { -#line 4792 - .trainerName = _("ROXANNE"), -#line 4793 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4794 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 4795 -F_TRAINER_FEMALE | -#line 4796 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4797 - .items = { ITEM_POTION, ITEM_POTION }, -#line 4798 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4799 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4801 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4803 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4802 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4804 - MOVE_TACKLE, - MOVE_DEFENSE_CURL, - MOVE_ROCK_THROW, - MOVE_ROCK_TOMB, - }, - }, - { -#line 4809 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4811 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4810 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4812 - MOVE_TACKLE, - MOVE_DEFENSE_CURL, - MOVE_ROCK_THROW, - MOVE_ROCK_TOMB, - }, - }, - { -#line 4817 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4817 - .heldItem = ITEM_ORAN_BERRY, -#line 4819 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4818 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4820 - MOVE_BLOCK, - MOVE_HARDEN, - MOVE_TACKLE, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 4825 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_1] = - { -#line 4826 - .trainerName = _("BRAWLY"), -#line 4827 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4828 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 4830 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4831 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4832 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4833 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 4835 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4837 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4836 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4838 - MOVE_KARATE_CHOP, - MOVE_LOW_KICK, - MOVE_SEISMIC_TOSS, - MOVE_BULK_UP, - }, - }, - { -#line 4843 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4845 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 4844 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4846 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_BULK_UP, - }, - }, - { -#line 4851 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4851 - .heldItem = ITEM_SITRUS_BERRY, -#line 4853 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4852 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4854 - MOVE_ARM_THRUST, - MOVE_VITAL_THROW, - MOVE_REVERSAL, - MOVE_BULK_UP, - }, - }, - }, - }, -#line 4859 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_1] = - { -#line 4860 - .trainerName = _("WATTSON"), -#line 4861 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4862 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 4864 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4865 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 4866 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4867 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4869 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4871 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4870 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4872 - MOVE_ROLLOUT, - MOVE_SPARK, - MOVE_SELF_DESTRUCT, - MOVE_SHOCK_WAVE, - }, - }, - { -#line 4877 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4879 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4878 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4880 - MOVE_SHOCK_WAVE, - MOVE_LEER, - MOVE_QUICK_ATTACK, - MOVE_HOWL, - }, - }, - { -#line 4885 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4887 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 4886 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4888 - MOVE_SUPERSONIC, - MOVE_SHOCK_WAVE, - MOVE_THUNDER_WAVE, - MOVE_SONIC_BOOM, - }, - }, - { -#line 4893 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4893 - .heldItem = ITEM_SITRUS_BERRY, -#line 4895 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4894 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4896 - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - MOVE_SHOCK_WAVE, - MOVE_HOWL, - }, - }, - }, - }, -#line 4901 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_1] = - { -#line 4902 - .trainerName = _("FLANNERY"), -#line 4903 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4904 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 4905 -F_TRAINER_FEMALE | -#line 4906 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4907 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4908 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4909 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4911 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4913 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4912 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4914 - MOVE_OVERHEAT, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - { -#line 4919 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4921 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4920 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4922 - MOVE_OVERHEAT, - MOVE_SMOG, - MOVE_LIGHT_SCREEN, - MOVE_SUNNY_DAY, - }, - }, - { -#line 4927 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4929 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4928 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4930 - MOVE_OVERHEAT, - MOVE_TACKLE, - MOVE_SUNNY_DAY, - MOVE_ATTRACT, - }, - }, - { -#line 4935 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4935 - .heldItem = ITEM_WHITE_HERB, -#line 4937 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4936 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4938 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 4943 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_1] = - { -#line 4944 - .trainerName = _("NORMAN"), -#line 4945 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4946 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 4948 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 4949 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4950 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4951 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 4953 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4955 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4954 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4956 - MOVE_TEETER_DANCE, - MOVE_PSYBEAM, - MOVE_FACADE, - MOVE_ENCORE, - }, - }, - { -#line 4961 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4963 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4962 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4964 - MOVE_SLASH, - MOVE_FACADE, - MOVE_ENCORE, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 4969 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4971 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 4970 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4972 - MOVE_SLASH, - MOVE_BELLY_DRUM, - MOVE_FACADE, - MOVE_HEADBUTT, - }, - }, - { -#line 4977 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4977 - .heldItem = ITEM_SITRUS_BERRY, -#line 4979 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 4978 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4980 - MOVE_COUNTER, - MOVE_YAWN, - MOVE_FACADE, - MOVE_FEINT_ATTACK, - }, - }, - }, - }, -#line 4985 - [DIFFICULTY_NORMAL][TRAINER_WINONA_1] = - { -#line 4986 - .trainerName = _("WINONA"), -#line 4987 - .trainerClass = TRAINER_CLASS_LEADER, -#line 4988 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 4989 -F_TRAINER_FEMALE | -#line 4990 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 4991 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 4992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 4993 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 4995 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 4997 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 4996 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 4998 - MOVE_PERISH_SONG, - MOVE_MIRROR_MOVE, - MOVE_SAFEGUARD, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5003 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5005 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5004 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5006 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_SYNTHESIS, - }, - }, - { -#line 5011 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5013 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5012 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5014 - MOVE_WATER_GUN, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5019 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5021 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5020 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5022 - MOVE_SAND_ATTACK, - MOVE_FURY_ATTACK, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 5027 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5027 - .heldItem = ITEM_ORAN_BERRY, -#line 5029 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 5028 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5030 - MOVE_EARTHQUAKE, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - MOVE_AERIAL_ACE, - }, - }, - }, - }, -#line 5035 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_1] = - { -#line 5036 - .trainerName = _("TATE&LIZA"), -#line 5037 - .trainerClass = TRAINER_CLASS_LEADER, -#line 5038 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 5040 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 5041 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 5042 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5043 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 5045 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5047 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5046 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5048 - MOVE_EARTHQUAKE, - MOVE_ANCIENT_POWER, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 5053 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5055 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5054 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5056 - MOVE_PSYCHIC, - MOVE_SUNNY_DAY, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 5061 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5061 - .heldItem = ITEM_SITRUS_BERRY, -#line 5063 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5062 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5064 - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - MOVE_HYPNOSIS, - MOVE_CALM_MIND, - }, - }, - { -#line 5069 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5069 - .heldItem = ITEM_SITRUS_BERRY, -#line 5071 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5070 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5072 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 5077 - [DIFFICULTY_NORMAL][TRAINER_JUAN_1] = - { -#line 5078 - .trainerName = _("JUAN"), -#line 5079 - .trainerClass = TRAINER_CLASS_LEADER, -#line 5080 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 5082 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5083 - .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, -#line 5084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5085 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 5087 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5089 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5088 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5090 - MOVE_WATER_PULSE, - MOVE_ATTRACT, - MOVE_SWEET_KISS, - MOVE_FLAIL, - }, - }, - { -#line 5095 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5097 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5096 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5098 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_AMNESIA, - MOVE_EARTHQUAKE, - }, - }, - { -#line 5103 - .species = SPECIES_SEALEO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5105 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5104 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5106 - MOVE_ENCORE, - MOVE_BODY_SLAM, - MOVE_AURORA_BEAM, - MOVE_WATER_PULSE, - }, - }, - { -#line 5111 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5113 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5112 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5114 - MOVE_WATER_PULSE, - MOVE_CRABHAMMER, - MOVE_TAUNT, - MOVE_LEER, - }, - }, - { -#line 5119 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5119 - .heldItem = ITEM_CHESTO_BERRY, -#line 5121 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 5120 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5122 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 5127 - [DIFFICULTY_NORMAL][TRAINER_JERRY_1] = - { -#line 5128 - .trainerName = _("JERRY"), -#line 5129 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5130 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5132 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5136 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5138 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5137 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5140 - [DIFFICULTY_NORMAL][TRAINER_TED] = - { -#line 5141 - .trainerName = _("TED"), -#line 5142 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5143 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5145 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5146 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5147 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5149 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5151 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5150 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5153 - [DIFFICULTY_NORMAL][TRAINER_PAUL] = - { -#line 5154 - .trainerName = _("PAUL"), -#line 5155 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5156 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5158 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5159 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5160 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5162 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5164 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5163 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5166 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5168 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5167 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5170 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5172 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5171 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5174 - [DIFFICULTY_NORMAL][TRAINER_JERRY_2] = - { -#line 5175 - .trainerName = _("JERRY"), -#line 5176 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5177 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5179 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5180 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5181 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5183 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5185 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5184 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5187 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5189 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5188 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5191 - [DIFFICULTY_NORMAL][TRAINER_JERRY_3] = - { -#line 5192 - .trainerName = _("JERRY"), -#line 5193 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5194 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5196 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5197 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5198 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5200 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5202 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5201 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5204 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5206 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5205 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5208 - [DIFFICULTY_NORMAL][TRAINER_JERRY_4] = - { -#line 5209 - .trainerName = _("JERRY"), -#line 5210 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5211 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5213 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5214 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5215 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5217 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5219 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5218 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5221 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5223 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5222 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5225 - [DIFFICULTY_NORMAL][TRAINER_JERRY_5] = - { -#line 5226 - .trainerName = _("JERRY"), -#line 5227 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5228 - .trainerPic = TRAINER_PIC_SCHOOL_KID_M, - .encounterMusic_gender = -#line 5230 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5231 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5232 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5234 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5236 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5235 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5238 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5240 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5239 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5242 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5244 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5243 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5246 - [DIFFICULTY_NORMAL][TRAINER_KAREN_1] = - { -#line 5247 - .trainerName = _("KAREN"), -#line 5248 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5249 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5250 -F_TRAINER_FEMALE | -#line 5251 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5252 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5253 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5255 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5257 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5256 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5259 - [DIFFICULTY_NORMAL][TRAINER_GEORGIA] = - { -#line 5260 - .trainerName = _("GEORGIA"), -#line 5261 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5262 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5263 -F_TRAINER_FEMALE | -#line 5264 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5265 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5266 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5268 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5270 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5269 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5272 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5274 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5273 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5276 - [DIFFICULTY_NORMAL][TRAINER_KAREN_2] = - { -#line 5277 - .trainerName = _("KAREN"), -#line 5278 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5279 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5280 -F_TRAINER_FEMALE | -#line 5281 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5282 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5283 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5285 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5287 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5286 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5289 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5291 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5290 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5293 - [DIFFICULTY_NORMAL][TRAINER_KAREN_3] = - { -#line 5294 - .trainerName = _("KAREN"), -#line 5295 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5296 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5297 -F_TRAINER_FEMALE | -#line 5298 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5299 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5300 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5302 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5304 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5303 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5306 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5308 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5307 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5310 - [DIFFICULTY_NORMAL][TRAINER_KAREN_4] = - { -#line 5311 - .trainerName = _("KAREN"), -#line 5312 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5313 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5314 -F_TRAINER_FEMALE | -#line 5315 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5316 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5317 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5319 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5321 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5320 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5323 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5325 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5324 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5327 - [DIFFICULTY_NORMAL][TRAINER_KAREN_5] = - { -#line 5328 - .trainerName = _("KAREN"), -#line 5329 - .trainerClass = TRAINER_CLASS_SCHOOL_KID, -#line 5330 - .trainerPic = TRAINER_PIC_SCHOOL_KID_F, - .encounterMusic_gender = -#line 5331 -F_TRAINER_FEMALE | -#line 5332 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 5333 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5334 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5336 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5338 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5337 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5340 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5342 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5341 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5344 - [DIFFICULTY_NORMAL][TRAINER_KATE_AND_JOY] = - { -#line 5345 - .trainerName = _("KATE & JOY"), -#line 5346 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5347 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5349 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5350 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5353 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5354 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5356 - MOVE_HYPNOSIS, - MOVE_PSYBEAM, - MOVE_DIZZY_PUNCH, - MOVE_TEETER_DANCE, - }, - }, - { -#line 5361 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5362 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5364 - MOVE_FOCUS_PUNCH, - MOVE_YAWN, - MOVE_SLACK_OFF, - MOVE_FEINT_ATTACK, - }, - }, - }, - }, -#line 5369 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_1] = - { -#line 5370 - .trainerName = _("ANNA & MEG"), -#line 5371 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5372 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5374 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5375 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5376 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5378 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5379 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5381 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5386 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5388 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5387 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5389 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5393 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_2] = - { -#line 5394 - .trainerName = _("ANNA & MEG"), -#line 5395 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5396 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5398 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5399 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5400 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5402 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5404 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5403 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5405 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5410 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5412 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5411 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5413 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5417 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_3] = - { -#line 5418 - .trainerName = _("ANNA & MEG"), -#line 5419 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5420 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5422 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5423 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5424 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5426 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5428 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5427 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5429 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5434 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5436 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5435 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5437 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5441 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_4] = - { -#line 5442 - .trainerName = _("ANNA & MEG"), -#line 5443 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5444 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5446 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5447 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5448 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5450 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5452 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5451 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5453 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5458 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5460 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5459 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5461 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5465 - [DIFFICULTY_NORMAL][TRAINER_ANNA_AND_MEG_5] = - { -#line 5466 - .trainerName = _("ANNA & MEG"), -#line 5467 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 5468 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 5470 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5471 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 5472 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5474 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5476 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5475 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5477 - MOVE_GROWL, - MOVE_TAIL_WHIP, - MOVE_HEADBUTT, - MOVE_ODOR_SLEUTH, - }, - }, - { -#line 5482 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5484 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5483 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5485 - MOVE_TACKLE, - MOVE_FOCUS_ENERGY, - MOVE_ARM_THRUST, - }, - }, - }, - }, -#line 5489 - [DIFFICULTY_NORMAL][TRAINER_VICTOR] = - { -#line 5490 - .trainerName = _("VICTOR"), -#line 5491 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5492 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5494 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5495 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5496 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5498 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5498 - .heldItem = ITEM_ORAN_BERRY, -#line 5500 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5499 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5502 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5502 - .heldItem = ITEM_ORAN_BERRY, -#line 5504 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5503 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5506 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_1] = - { -#line 5507 - .trainerName = _("MIGUEL"), -#line 5508 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5509 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5511 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5512 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5513 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5515 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5515 - .heldItem = ITEM_ORAN_BERRY, -#line 5517 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5516 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5519 - [DIFFICULTY_NORMAL][TRAINER_COLTON] = - { -#line 5520 - .trainerName = _("COLTON"), -#line 5521 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5522 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5524 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5525 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5526 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 5528 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5528 - .heldItem = ITEM_ORAN_BERRY, -#line 5530 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5529 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5531 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5536 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5536 - .heldItem = ITEM_ORAN_BERRY, -#line 5538 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5537 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5539 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5544 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5544 - .heldItem = ITEM_ORAN_BERRY, -#line 5546 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5545 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5547 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5552 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5552 - .heldItem = ITEM_ORAN_BERRY, -#line 5554 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5553 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5555 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5560 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5560 - .heldItem = ITEM_ORAN_BERRY, -#line 5562 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5561 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5563 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - { -#line 5568 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5568 - .heldItem = ITEM_ORAN_BERRY, -#line 5570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5569 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5571 - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - MOVE_HEAL_BELL, - }, - }, - }, - }, -#line 5576 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_2] = - { -#line 5577 - .trainerName = _("MIGUEL"), -#line 5578 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5579 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5581 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5585 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5585 - .heldItem = ITEM_ORAN_BERRY, -#line 5587 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5586 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5589 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_3] = - { -#line 5590 - .trainerName = _("MIGUEL"), -#line 5591 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5592 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5594 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5595 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5596 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5598 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5598 - .heldItem = ITEM_ORAN_BERRY, -#line 5600 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5599 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5602 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_4] = - { -#line 5603 - .trainerName = _("MIGUEL"), -#line 5604 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5605 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5607 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5608 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5609 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5611 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5611 - .heldItem = ITEM_ORAN_BERRY, -#line 5613 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5612 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5615 - [DIFFICULTY_NORMAL][TRAINER_MIGUEL_5] = - { -#line 5616 - .trainerName = _("MIGUEL"), -#line 5617 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5618 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 5620 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5621 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5622 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5624 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5624 - .heldItem = ITEM_SITRUS_BERRY, -#line 5626 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5625 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5628 - [DIFFICULTY_NORMAL][TRAINER_VICTORIA] = - { -#line 5629 - .trainerName = _("VICTORIA"), -#line 5630 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5631 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5632 -F_TRAINER_FEMALE | -#line 5633 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5634 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5635 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5637 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5637 - .heldItem = ITEM_ORAN_BERRY, -#line 5639 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 5638 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5641 - [DIFFICULTY_NORMAL][TRAINER_VANESSA] = - { -#line 5642 - .trainerName = _("VANESSA"), -#line 5643 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5644 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5645 -F_TRAINER_FEMALE | -#line 5646 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5647 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5648 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5650 - .species = SPECIES_PIKACHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5650 - .heldItem = ITEM_ORAN_BERRY, -#line 5652 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5651 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5654 - [DIFFICULTY_NORMAL][TRAINER_BETHANY] = - { -#line 5655 - .trainerName = _("BETHANY"), -#line 5656 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5657 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5658 -F_TRAINER_FEMALE | -#line 5659 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5660 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5661 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 5663 - .species = SPECIES_AZURILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5663 - .heldItem = ITEM_ORAN_BERRY, -#line 5665 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5664 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5667 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5667 - .heldItem = ITEM_ORAN_BERRY, -#line 5669 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5668 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5671 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5671 - .heldItem = ITEM_ORAN_BERRY, -#line 5673 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5672 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5675 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_1] = - { -#line 5676 - .trainerName = _("ISABEL"), -#line 5677 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5678 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5679 -F_TRAINER_FEMALE | -#line 5680 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5681 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5682 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5684 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5684 - .heldItem = ITEM_ORAN_BERRY, -#line 5686 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5685 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5688 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5688 - .heldItem = ITEM_ORAN_BERRY, -#line 5690 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5689 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5692 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_2] = - { -#line 5693 - .trainerName = _("ISABEL"), -#line 5694 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5695 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5696 -F_TRAINER_FEMALE | -#line 5697 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5698 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5699 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5701 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5701 - .heldItem = ITEM_ORAN_BERRY, -#line 5703 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5702 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5705 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5705 - .heldItem = ITEM_ORAN_BERRY, -#line 5707 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 5706 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5709 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_3] = - { -#line 5710 - .trainerName = _("ISABEL"), -#line 5711 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5712 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5713 -F_TRAINER_FEMALE | -#line 5714 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5715 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5716 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5718 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5718 - .heldItem = ITEM_ORAN_BERRY, -#line 5720 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5719 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5722 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5722 - .heldItem = ITEM_ORAN_BERRY, -#line 5724 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 5723 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5726 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_4] = - { -#line 5727 - .trainerName = _("ISABEL"), -#line 5728 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5729 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5730 -F_TRAINER_FEMALE | -#line 5731 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5732 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5733 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5735 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5735 - .heldItem = ITEM_ORAN_BERRY, -#line 5737 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5736 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5739 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5739 - .heldItem = ITEM_ORAN_BERRY, -#line 5741 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 5740 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5743 - [DIFFICULTY_NORMAL][TRAINER_ISABEL_5] = - { -#line 5744 - .trainerName = _("ISABEL"), -#line 5745 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 5746 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 5747 -F_TRAINER_FEMALE | -#line 5748 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 5749 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5750 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5752 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5752 - .heldItem = ITEM_SITRUS_BERRY, -#line 5754 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5753 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5756 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5756 - .heldItem = ITEM_SITRUS_BERRY, -#line 5758 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 5757 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5760 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_1] = - { -#line 5761 - .trainerName = _("TIMOTHY"), -#line 5762 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5763 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5765 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5766 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5767 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5769 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5771 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5770 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5773 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_2] = - { -#line 5774 - .trainerName = _("TIMOTHY"), -#line 5775 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5776 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5778 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5779 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5780 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5782 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5784 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5783 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5785 - MOVE_ARM_THRUST, - MOVE_KNOCK_OFF, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5790 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_3] = - { -#line 5791 - .trainerName = _("TIMOTHY"), -#line 5792 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5793 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5795 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5796 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5797 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5799 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5801 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5800 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5802 - MOVE_ARM_THRUST, - MOVE_KNOCK_OFF, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5807 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_4] = - { -#line 5808 - .trainerName = _("TIMOTHY"), -#line 5809 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5810 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5812 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5813 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5814 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5816 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5818 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5817 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5819 - MOVE_ARM_THRUST, - MOVE_BELLY_DRUM, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5824 - [DIFFICULTY_NORMAL][TRAINER_TIMOTHY_5] = - { -#line 5825 - .trainerName = _("TIMOTHY"), -#line 5826 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5827 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 5829 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5830 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5831 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5833 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5835 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5834 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5836 - MOVE_ARM_THRUST, - MOVE_BELLY_DRUM, - MOVE_SAND_ATTACK, - MOVE_DIG, - }, - }, - }, - }, -#line 5841 - [DIFFICULTY_NORMAL][TRAINER_VICKY] = - { -#line 5842 - .trainerName = _("VICKY"), -#line 5843 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 5844 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5845 -F_TRAINER_FEMALE | -#line 5846 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5848 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5850 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5852 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5851 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5853 - MOVE_HIGH_JUMP_KICK, - MOVE_MEDITATE, - MOVE_CONFUSION, - MOVE_DETECT, - }, - }, - }, - }, -#line 5858 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_1] = - { -#line 5859 - .trainerName = _("SHELBY"), -#line 5860 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5861 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5862 -F_TRAINER_FEMALE | -#line 5863 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5864 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5865 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5867 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5869 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5868 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5871 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5873 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 5872 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5875 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_2] = - { -#line 5876 - .trainerName = _("SHELBY"), -#line 5877 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5878 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5879 -F_TRAINER_FEMALE | -#line 5880 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5881 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5882 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5884 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5886 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5885 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5888 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5890 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 5889 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5892 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_3] = - { -#line 5893 - .trainerName = _("SHELBY"), -#line 5894 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5895 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5896 -F_TRAINER_FEMALE | -#line 5897 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5898 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5899 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5901 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5903 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5902 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5905 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5907 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 5906 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5909 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_4] = - { -#line 5910 - .trainerName = _("SHELBY"), -#line 5911 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5912 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5913 -F_TRAINER_FEMALE | -#line 5914 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5915 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5916 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5918 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5920 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5919 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5922 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5924 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 5923 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5926 - [DIFFICULTY_NORMAL][TRAINER_SHELBY_5] = - { -#line 5927 - .trainerName = _("SHELBY"), -#line 5928 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 5929 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 5930 -F_TRAINER_FEMALE | -#line 5931 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 5932 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5933 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5935 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5937 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5936 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5939 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5941 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 5940 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5943 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_1] = - { -#line 5944 - .trainerName = _("CALVIN"), -#line 5945 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5946 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5948 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5949 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5950 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5952 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5954 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5953 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5956 - [DIFFICULTY_NORMAL][TRAINER_BILLY] = - { -#line 5957 - .trainerName = _("BILLY"), -#line 5958 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5959 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5962 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5963 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5965 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5966 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 5969 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5971 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 5970 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 5973 - [DIFFICULTY_NORMAL][TRAINER_JOSH] = - { -#line 5974 - .trainerName = _("JOSH"), -#line 5975 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5976 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5978 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5979 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5980 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 5982 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5984 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 5983 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 5985 - MOVE_TACKLE, - }, - }, - }, - }, -#line 5987 - [DIFFICULTY_NORMAL][TRAINER_TOMMY] = - { -#line 5988 - .trainerName = _("TOMMY"), -#line 5989 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 5990 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 5992 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 5993 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 5994 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 5996 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 5998 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 5997 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6000 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6002 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 6001 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6004 - [DIFFICULTY_NORMAL][TRAINER_JOEY] = - { -#line 6005 - .trainerName = _("JOEY"), -#line 6006 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6007 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6009 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6013 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6015 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6014 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6017 - [DIFFICULTY_NORMAL][TRAINER_BEN] = - { -#line 6018 - .trainerName = _("BEN"), -#line 6019 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6020 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6022 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6023 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6024 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6026 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6028 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 6027 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6029 - MOVE_HEADBUTT, - MOVE_SAND_ATTACK, - MOVE_GROWL, - MOVE_THUNDERBOLT, - }, - }, - { -#line 6034 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6036 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 6035 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6037 - MOVE_AMNESIA, - MOVE_SLUDGE, - MOVE_YAWN, - MOVE_POUND, - }, - }, - }, - }, -#line 6042 - [DIFFICULTY_NORMAL][TRAINER_QUINCY] = - { -#line 6043 - .trainerName = _("QUINCY"), -#line 6044 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 6045 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 6047 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 6048 - .items = { ITEM_FULL_RESTORE }, -#line 6049 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6050 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6052 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6054 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6053 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6055 - MOVE_ATTRACT, - MOVE_ICE_BEAM, - MOVE_THUNDERBOLT, - MOVE_FLAMETHROWER, - }, - }, - { -#line 6060 - .species = SPECIES_DUSCLOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6062 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6061 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6063 - MOVE_SKILL_SWAP, - MOVE_PROTECT, - MOVE_WILL_O_WISP, - MOVE_TOXIC, - }, - }, - }, - }, -#line 6068 - [DIFFICULTY_NORMAL][TRAINER_KATELYNN] = - { -#line 6069 - .trainerName = _("KATELYNN"), -#line 6070 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 6071 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 6072 -F_TRAINER_FEMALE | -#line 6073 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 6074 - .items = { ITEM_FULL_RESTORE }, -#line 6075 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6076 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6078 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6080 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6079 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6081 - MOVE_SKILL_SWAP, - MOVE_PSYCHIC, - MOVE_THUNDERBOLT, - MOVE_CALM_MIND, - }, - }, - { -#line 6086 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6088 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 6087 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6089 - MOVE_EARTHQUAKE, - MOVE_SHADOW_BALL, - MOVE_AERIAL_ACE, - MOVE_BRICK_BREAK, - }, - }, - }, - }, -#line 6094 - [DIFFICULTY_NORMAL][TRAINER_JAYLEN] = - { -#line 6095 - .trainerName = _("JAYLEN"), -#line 6096 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6097 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6099 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6100 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6101 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6103 - .species = SPECIES_TRAPINCH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6105 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6104 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6107 - [DIFFICULTY_NORMAL][TRAINER_DILLON] = - { -#line 6108 - .trainerName = _("DILLON"), -#line 6109 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6110 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6112 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6113 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6114 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6116 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6118 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6117 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6120 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_2] = - { -#line 6121 - .trainerName = _("CALVIN"), -#line 6122 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6123 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6125 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6126 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6127 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6129 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6131 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6130 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6133 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_3] = - { -#line 6134 - .trainerName = _("CALVIN"), -#line 6135 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6136 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6138 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6139 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6140 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6142 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6144 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6143 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6146 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6148 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6147 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6150 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_4] = - { -#line 6151 - .trainerName = _("CALVIN"), -#line 6152 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6153 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6155 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6156 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6157 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6159 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6161 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6160 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6163 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6165 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6164 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6167 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6169 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6168 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6171 - [DIFFICULTY_NORMAL][TRAINER_CALVIN_5] = - { -#line 6172 - .trainerName = _("CALVIN"), -#line 6173 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6174 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6176 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6177 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6178 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6180 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6182 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6181 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6184 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6186 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6185 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6188 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6190 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6189 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6192 - [DIFFICULTY_NORMAL][TRAINER_EDDIE] = - { -#line 6193 - .trainerName = _("EDDIE"), -#line 6194 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6195 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6197 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6198 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6199 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6201 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6203 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6202 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6205 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6206 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6209 - [DIFFICULTY_NORMAL][TRAINER_ALLEN] = - { -#line 6210 - .trainerName = _("ALLEN"), -#line 6211 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6212 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6214 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6215 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6216 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6218 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6220 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6219 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6222 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6224 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6223 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6226 - [DIFFICULTY_NORMAL][TRAINER_TIMMY] = - { -#line 6227 - .trainerName = _("TIMMY"), -#line 6228 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6229 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6231 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6232 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6233 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6235 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6237 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6236 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6239 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6241 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6240 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6243 - [DIFFICULTY_NORMAL][TRAINER_WALLACE] = - { -#line 6244 - .trainerName = _("WALLACE"), -#line 6245 - .trainerClass = TRAINER_CLASS_CHAMPION, -#line 6246 - .trainerPic = TRAINER_PIC_CHAMPION_WALLACE, - .encounterMusic_gender = -#line 6248 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6249 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 6250 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6251 - .aiFlags = AI_FLAG_BASIC_TRAINER, -#line 6252 - .mugshotColor = MUGSHOT_COLOR_YELLOW, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 6254 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6256 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6255 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6257 - MOVE_RAIN_DANCE, - MOVE_WATER_SPOUT, - MOVE_DOUBLE_EDGE, - MOVE_BLIZZARD, - }, - }, - { -#line 6262 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6264 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6263 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6265 - MOVE_TOXIC, - MOVE_HYDRO_PUMP, - MOVE_SLUDGE_BOMB, - MOVE_ICE_BEAM, - }, - }, - { -#line 6270 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6272 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6271 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6273 - MOVE_GIGA_DRAIN, - MOVE_SURF, - MOVE_LEECH_SEED, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 6278 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6280 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6279 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6281 - MOVE_EARTHQUAKE, - MOVE_SURF, - MOVE_AMNESIA, - MOVE_HYPER_BEAM, - }, - }, - { -#line 6286 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6288 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6287 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6289 - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - MOVE_HYPER_BEAM, - MOVE_SURF, - }, - }, - { -#line 6294 - .species = SPECIES_MILOTIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6294 - .heldItem = ITEM_SITRUS_BERRY, -#line 6296 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 6295 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 6297 - MOVE_RECOVER, - MOVE_SURF, - MOVE_ICE_BEAM, - MOVE_TOXIC, - }, - }, - }, - }, -#line 6302 - [DIFFICULTY_NORMAL][TRAINER_ANDREW] = - { -#line 6303 - .trainerName = _("ANDREW"), -#line 6304 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6305 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6307 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6308 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6309 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6311 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6313 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6312 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6315 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6317 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6316 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6319 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6321 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6320 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6323 - [DIFFICULTY_NORMAL][TRAINER_IVAN] = - { -#line 6324 - .trainerName = _("IVAN"), -#line 6325 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6326 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6328 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6329 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6330 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6332 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6334 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6333 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6336 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6338 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6337 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6340 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6341 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6344 - [DIFFICULTY_NORMAL][TRAINER_CLAUDE] = - { -#line 6345 - .trainerName = _("CLAUDE"), -#line 6346 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6347 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6349 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6353 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6354 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6357 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6359 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6358 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6361 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6362 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6365 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_1] = - { -#line 6366 - .trainerName = _("ELLIOT"), -#line 6367 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6368 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6370 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6371 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6372 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6374 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6376 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6375 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6378 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6379 - .lvl = 7, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6382 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6384 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6383 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6386 - [DIFFICULTY_NORMAL][TRAINER_NED] = - { -#line 6387 - .trainerName = _("NED"), -#line 6388 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6389 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6391 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6392 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6393 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6395 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6397 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6396 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6399 - [DIFFICULTY_NORMAL][TRAINER_DALE] = - { -#line 6400 - .trainerName = _("DALE"), -#line 6401 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6402 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6404 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6405 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6406 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6408 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6410 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6409 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6412 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6414 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6413 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6416 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6418 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6417 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6420 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6422 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6421 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6424 - [DIFFICULTY_NORMAL][TRAINER_NOLAN] = - { -#line 6425 - .trainerName = _("NOLAN"), -#line 6426 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6427 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6429 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6430 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6431 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6433 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6435 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6434 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6437 - [DIFFICULTY_NORMAL][TRAINER_BARNY] = - { -#line 6438 - .trainerName = _("BARNY"), -#line 6439 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6440 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6442 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6443 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6444 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6446 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6448 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6447 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6450 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6451 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6454 - [DIFFICULTY_NORMAL][TRAINER_WADE] = - { -#line 6455 - .trainerName = _("WADE"), -#line 6456 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6457 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6459 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6460 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6461 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6463 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6465 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6464 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6467 - [DIFFICULTY_NORMAL][TRAINER_CARTER] = - { -#line 6468 - .trainerName = _("CARTER"), -#line 6469 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6470 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6472 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6473 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6474 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6476 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6478 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6477 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6480 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6482 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6481 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6484 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_2] = - { -#line 6485 - .trainerName = _("ELLIOT"), -#line 6486 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6487 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6489 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6490 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6491 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6493 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6495 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6494 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6497 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6499 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6498 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6501 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6503 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6502 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6505 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_3] = - { -#line 6506 - .trainerName = _("ELLIOT"), -#line 6507 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6508 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6510 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6514 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6516 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6515 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6518 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6520 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6519 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6522 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6524 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6523 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6526 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6528 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6527 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6530 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_4] = - { -#line 6531 - .trainerName = _("ELLIOT"), -#line 6532 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6533 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6535 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6539 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6541 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6540 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6543 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6545 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6544 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6547 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6549 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6548 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6551 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6553 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6552 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6555 - [DIFFICULTY_NORMAL][TRAINER_ELLIOT_5] = - { -#line 6556 - .trainerName = _("ELLIOT"), -#line 6557 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6558 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6560 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6561 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6562 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 6564 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6566 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6565 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6568 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6570 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6569 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6572 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6574 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6573 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6576 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6578 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6577 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6580 - [DIFFICULTY_NORMAL][TRAINER_RONALD] = - { -#line 6581 - .trainerName = _("RONALD"), -#line 6582 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 6583 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 6585 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 6586 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6587 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 6589 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6590 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6593 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6595 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6594 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6597 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6599 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6598 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6601 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6603 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6602 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6605 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6607 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6606 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6609 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6611 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6610 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6613 - [DIFFICULTY_NORMAL][TRAINER_JACOB] = - { -#line 6614 - .trainerName = _("JACOB"), -#line 6615 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6616 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6618 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6619 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6620 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6622 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6624 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6623 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6626 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6628 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6627 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6630 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6632 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 6631 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6634 - [DIFFICULTY_NORMAL][TRAINER_ANTHONY] = - { -#line 6635 - .trainerName = _("ANTHONY"), -#line 6636 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6637 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6639 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6640 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6641 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6643 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6645 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6644 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6647 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6649 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6648 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6651 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_1] = - { -#line 6652 - .trainerName = _("BENJAMIN"), -#line 6653 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6654 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6656 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6657 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6658 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6660 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6662 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6661 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6664 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_2] = - { -#line 6665 - .trainerName = _("BENJAMIN"), -#line 6666 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6667 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6669 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6670 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6671 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6673 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6675 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6674 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6677 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_3] = - { -#line 6678 - .trainerName = _("BENJAMIN"), -#line 6679 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6680 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6682 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6683 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6684 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6686 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6688 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6687 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6690 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_4] = - { -#line 6691 - .trainerName = _("BENJAMIN"), -#line 6692 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6693 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6695 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6696 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6697 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6699 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6701 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6700 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6703 - [DIFFICULTY_NORMAL][TRAINER_BENJAMIN_5] = - { -#line 6704 - .trainerName = _("BENJAMIN"), -#line 6705 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6706 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6708 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6710 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6712 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6714 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6713 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6716 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_1] = - { -#line 6717 - .trainerName = _("ABIGAIL"), -#line 6718 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6719 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6720 -F_TRAINER_FEMALE | -#line 6721 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6722 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6723 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6725 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6727 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6726 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6729 - [DIFFICULTY_NORMAL][TRAINER_JASMINE] = - { -#line 6730 - .trainerName = _("JASMINE"), -#line 6731 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6732 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6733 -F_TRAINER_FEMALE | -#line 6734 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6735 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6736 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 6738 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6740 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6739 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6742 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6744 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 6743 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6746 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6748 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6747 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6750 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_2] = - { -#line 6751 - .trainerName = _("ABIGAIL"), -#line 6752 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6753 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6754 -F_TRAINER_FEMALE | -#line 6755 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6759 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6761 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6760 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6763 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_3] = - { -#line 6764 - .trainerName = _("ABIGAIL"), -#line 6765 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6766 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6767 -F_TRAINER_FEMALE | -#line 6768 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6772 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6774 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6773 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6776 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_4] = - { -#line 6777 - .trainerName = _("ABIGAIL"), -#line 6778 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6779 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6780 -F_TRAINER_FEMALE | -#line 6781 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6782 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6783 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6785 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6787 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6786 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6789 - [DIFFICULTY_NORMAL][TRAINER_ABIGAIL_5] = - { -#line 6790 - .trainerName = _("ABIGAIL"), -#line 6791 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6792 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6793 -F_TRAINER_FEMALE | -#line 6794 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6795 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6796 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6798 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6800 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6799 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6802 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_1] = - { -#line 6803 - .trainerName = _("DYLAN"), -#line 6804 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6805 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6807 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6808 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6809 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6811 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6813 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6812 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6815 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_2] = - { -#line 6816 - .trainerName = _("DYLAN"), -#line 6817 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6818 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6820 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6821 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6822 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6824 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6826 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6825 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6828 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_3] = - { -#line 6829 - .trainerName = _("DYLAN"), -#line 6830 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6831 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6833 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6834 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6835 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6837 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6839 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6838 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6841 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_4] = - { -#line 6842 - .trainerName = _("DYLAN"), -#line 6843 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6844 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6846 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6848 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6850 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6852 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6851 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6854 - [DIFFICULTY_NORMAL][TRAINER_DYLAN_5] = - { -#line 6855 - .trainerName = _("DYLAN"), -#line 6856 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6857 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6859 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6860 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6861 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6863 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6865 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6864 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6867 - [DIFFICULTY_NORMAL][TRAINER_MARIA_1] = - { -#line 6868 - .trainerName = _("MARIA"), -#line 6869 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6870 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6871 -F_TRAINER_FEMALE | -#line 6872 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6873 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6874 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6876 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6878 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6877 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6880 - [DIFFICULTY_NORMAL][TRAINER_MARIA_2] = - { -#line 6881 - .trainerName = _("MARIA"), -#line 6882 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6883 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6884 -F_TRAINER_FEMALE | -#line 6885 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6887 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6889 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6891 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 6890 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6893 - [DIFFICULTY_NORMAL][TRAINER_MARIA_3] = - { -#line 6894 - .trainerName = _("MARIA"), -#line 6895 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6896 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6897 -F_TRAINER_FEMALE | -#line 6898 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6899 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6900 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6902 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6904 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 6903 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6906 - [DIFFICULTY_NORMAL][TRAINER_MARIA_4] = - { -#line 6907 - .trainerName = _("MARIA"), -#line 6908 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6909 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6910 -F_TRAINER_FEMALE | -#line 6911 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6912 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6913 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6915 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6917 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 6916 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6919 - [DIFFICULTY_NORMAL][TRAINER_MARIA_5] = - { -#line 6920 - .trainerName = _("MARIA"), -#line 6921 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6922 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 6923 -F_TRAINER_FEMALE | -#line 6924 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 6925 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6926 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6928 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6930 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 6929 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6932 - [DIFFICULTY_NORMAL][TRAINER_CAMDEN] = - { -#line 6933 - .trainerName = _("CAMDEN"), -#line 6934 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6935 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6937 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6938 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6939 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6941 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6943 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6942 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6945 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6947 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6946 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6949 - [DIFFICULTY_NORMAL][TRAINER_DEMETRIUS] = - { -#line 6950 - .trainerName = _("DEMETRIUS"), -#line 6951 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 6952 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 6954 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 6955 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6956 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6958 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6960 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6959 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6962 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6963 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6966 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_1] = - { -#line 6967 - .trainerName = _("ISAIAH"), -#line 6968 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6969 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6971 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6972 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6973 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 6975 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6977 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6976 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6979 - [DIFFICULTY_NORMAL][TRAINER_PABLO_1] = - { -#line 6980 - .trainerName = _("PABLO"), -#line 6981 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6982 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 6984 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 6985 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 6986 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 6988 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6990 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6989 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 6992 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 6994 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 6993 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 6996 - [DIFFICULTY_NORMAL][TRAINER_CHASE] = - { -#line 6997 - .trainerName = _("CHASE"), -#line 6998 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 6999 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7001 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7002 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7003 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7005 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7007 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7006 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7009 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7011 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 7010 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7013 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_2] = - { -#line 7014 - .trainerName = _("ISAIAH"), -#line 7015 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7016 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7018 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7019 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7020 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7022 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7024 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7023 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7026 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_3] = - { -#line 7027 - .trainerName = _("ISAIAH"), -#line 7028 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7029 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7031 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7033 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7035 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7036 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7039 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_4] = - { -#line 7040 - .trainerName = _("ISAIAH"), -#line 7041 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7042 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7044 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7045 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7046 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7048 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7050 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7049 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7052 - [DIFFICULTY_NORMAL][TRAINER_ISAIAH_5] = - { -#line 7053 - .trainerName = _("ISAIAH"), -#line 7054 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7055 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 7057 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7058 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7059 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7061 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7063 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7062 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7065 - [DIFFICULTY_NORMAL][TRAINER_ISOBEL] = - { -#line 7066 - .trainerName = _("ISOBEL"), -#line 7067 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7068 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7069 -F_TRAINER_FEMALE | -#line 7070 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7071 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7072 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7074 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7076 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7075 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7078 - [DIFFICULTY_NORMAL][TRAINER_DONNY] = - { -#line 7079 - .trainerName = _("DONNY"), -#line 7080 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7081 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7082 -F_TRAINER_FEMALE | -#line 7083 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7084 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7085 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7087 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7089 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7088 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7091 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7093 - .iv = TRAINER_PARTY_IVS(19, 19, 19, 19, 19, 19), -#line 7092 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7095 - [DIFFICULTY_NORMAL][TRAINER_TALIA] = - { -#line 7096 - .trainerName = _("TALIA"), -#line 7097 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7098 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7099 -F_TRAINER_FEMALE | -#line 7100 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7101 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7102 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7104 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7106 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7105 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7108 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_1] = - { -#line 7109 - .trainerName = _("KATELYN"), -#line 7110 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7111 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7112 -F_TRAINER_FEMALE | -#line 7113 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7114 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7115 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7117 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7119 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7118 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7121 - [DIFFICULTY_NORMAL][TRAINER_ALLISON] = - { -#line 7122 - .trainerName = _("ALLISON"), -#line 7123 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7124 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7125 -F_TRAINER_FEMALE | -#line 7126 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7127 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7128 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7130 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7132 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7131 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7134 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7136 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 7135 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7138 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_2] = - { -#line 7139 - .trainerName = _("KATELYN"), -#line 7140 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7141 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7142 -F_TRAINER_FEMALE | -#line 7143 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7144 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7145 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7147 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7149 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7148 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7151 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_3] = - { -#line 7152 - .trainerName = _("KATELYN"), -#line 7153 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7154 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7155 -F_TRAINER_FEMALE | -#line 7156 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7157 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7158 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7160 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7162 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7161 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7164 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_4] = - { -#line 7165 - .trainerName = _("KATELYN"), -#line 7166 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7167 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7168 -F_TRAINER_FEMALE | -#line 7169 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7170 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7171 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7173 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7175 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7174 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7177 - [DIFFICULTY_NORMAL][TRAINER_KATELYN_5] = - { -#line 7178 - .trainerName = _("KATELYN"), -#line 7179 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 7180 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 7181 -F_TRAINER_FEMALE | -#line 7182 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 7183 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7184 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7186 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7188 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7187 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7190 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_1] = - { -#line 7191 - .trainerName = _("NICOLAS"), -#line 7192 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7193 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7195 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7196 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7197 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7199 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7201 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7200 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7203 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7205 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7204 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7207 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_2] = - { -#line 7208 - .trainerName = _("NICOLAS"), -#line 7209 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7210 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7212 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7213 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7214 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7216 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7218 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7217 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7220 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7222 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7221 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7224 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_3] = - { -#line 7225 - .trainerName = _("NICOLAS"), -#line 7226 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7227 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7229 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7230 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7231 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7233 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7235 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7234 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7237 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7239 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7238 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7241 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_4] = - { -#line 7242 - .trainerName = _("NICOLAS"), -#line 7243 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7244 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7246 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7247 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7248 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7250 - .species = SPECIES_BAGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7252 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7251 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7254 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7256 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7255 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7258 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7260 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7259 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7262 - [DIFFICULTY_NORMAL][TRAINER_NICOLAS_5] = - { -#line 7263 - .trainerName = _("NICOLAS"), -#line 7264 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7265 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7267 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7268 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7269 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7271 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7273 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7272 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7275 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7277 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7276 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7279 - .species = SPECIES_SHELGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7279 - .heldItem = ITEM_DRAGON_FANG, -#line 7281 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7280 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7283 - [DIFFICULTY_NORMAL][TRAINER_AARON] = - { -#line 7284 - .trainerName = _("AARON"), -#line 7285 - .trainerClass = TRAINER_CLASS_DRAGON_TAMER, -#line 7286 - .trainerPic = TRAINER_PIC_DRAGON_TAMER, - .encounterMusic_gender = -#line 7288 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7289 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7290 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7292 - .species = SPECIES_BAGON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7294 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 7293 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7295 - MOVE_DRAGON_BREATH, - MOVE_HEADBUTT, - MOVE_FOCUS_ENERGY, - MOVE_EMBER, - }, - }, - }, - }, -#line 7300 - [DIFFICULTY_NORMAL][TRAINER_PERRY] = - { -#line 7301 - .trainerName = _("PERRY"), -#line 7302 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7303 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7305 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7306 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7307 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7309 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7311 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7310 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7313 - [DIFFICULTY_NORMAL][TRAINER_HUGH] = - { -#line 7314 - .trainerName = _("HUGH"), -#line 7315 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7316 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7318 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7319 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7320 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7322 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7324 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7323 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7326 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7328 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7327 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7330 - [DIFFICULTY_NORMAL][TRAINER_PHIL] = - { -#line 7331 - .trainerName = _("PHIL"), -#line 7332 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7333 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7335 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7336 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7337 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7339 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7340 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7343 - [DIFFICULTY_NORMAL][TRAINER_JARED] = - { -#line 7344 - .trainerName = _("JARED"), -#line 7345 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7346 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7348 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7349 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7350 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7352 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7354 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7353 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7356 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7358 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7357 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7360 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7362 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7361 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7364 - [DIFFICULTY_NORMAL][TRAINER_HUMBERTO] = - { -#line 7365 - .trainerName = _("HUMBERTO"), -#line 7366 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7367 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7369 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7370 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7371 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7373 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7375 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 7374 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7377 - [DIFFICULTY_NORMAL][TRAINER_PRESLEY] = - { -#line 7378 - .trainerName = _("PRESLEY"), -#line 7379 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7380 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7382 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7383 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7384 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7386 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7388 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7387 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7390 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7392 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7391 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7394 - [DIFFICULTY_NORMAL][TRAINER_EDWARDO] = - { -#line 7395 - .trainerName = _("EDWARDO"), -#line 7396 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7397 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7399 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7400 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7401 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7403 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7405 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7404 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7407 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7409 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7408 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7411 - [DIFFICULTY_NORMAL][TRAINER_COLIN] = - { -#line 7412 - .trainerName = _("COLIN"), -#line 7413 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7414 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7416 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7417 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7418 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7420 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7422 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7421 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7424 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7426 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7425 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7428 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_1] = - { -#line 7429 - .trainerName = _("ROBERT"), -#line 7430 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7431 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7433 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7434 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7435 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7437 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7439 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7438 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7441 - [DIFFICULTY_NORMAL][TRAINER_BENNY] = - { -#line 7442 - .trainerName = _("BENNY"), -#line 7443 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7444 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7446 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7447 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7448 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7450 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7451 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7454 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7456 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7455 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7458 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7459 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7462 - [DIFFICULTY_NORMAL][TRAINER_CHESTER] = - { -#line 7463 - .trainerName = _("CHESTER"), -#line 7464 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7465 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7467 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7471 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7472 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7475 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7477 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7476 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7479 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_2] = - { -#line 7480 - .trainerName = _("ROBERT"), -#line 7481 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7482 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7484 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7485 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7486 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7488 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7490 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7489 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7492 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7494 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 7493 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7496 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_3] = - { -#line 7497 - .trainerName = _("ROBERT"), -#line 7498 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7499 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7501 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7502 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7503 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7505 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7507 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7506 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7509 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7511 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7510 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7513 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_4] = - { -#line 7514 - .trainerName = _("ROBERT"), -#line 7515 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7516 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7518 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7519 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7520 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7522 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7524 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7523 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7526 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7528 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7527 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7530 - [DIFFICULTY_NORMAL][TRAINER_ROBERT_5] = - { -#line 7531 - .trainerName = _("ROBERT"), -#line 7532 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7533 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7535 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7536 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7537 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7539 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7541 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7540 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7543 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7545 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7544 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7547 - [DIFFICULTY_NORMAL][TRAINER_ALEX] = - { -#line 7548 - .trainerName = _("ALEX"), -#line 7549 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7550 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7552 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7553 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7554 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7556 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7558 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7557 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7560 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7562 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7561 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7564 - [DIFFICULTY_NORMAL][TRAINER_BECK] = - { -#line 7565 - .trainerName = _("BECK"), -#line 7566 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 7567 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 7569 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7570 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7571 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7573 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7575 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7574 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7577 - [DIFFICULTY_NORMAL][TRAINER_YASU] = - { -#line 7578 - .trainerName = _("YASU"), -#line 7579 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7580 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7582 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7583 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7584 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7586 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7588 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7587 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7590 - [DIFFICULTY_NORMAL][TRAINER_TAKASHI] = - { -#line 7591 - .trainerName = _("TAKASHI"), -#line 7592 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7593 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7595 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7596 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7597 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7599 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7601 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7600 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7603 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7604 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7607 - [DIFFICULTY_NORMAL][TRAINER_DIANNE] = - { -#line 7608 - .trainerName = _("DIANNE"), -#line 7609 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 7610 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 7611 -F_TRAINER_FEMALE | -#line 7612 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 7613 - .items = { ITEM_FULL_RESTORE }, -#line 7614 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7616 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7618 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7617 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7619 - MOVE_SKILL_SWAP, - MOVE_EARTHQUAKE, - }, - }, - { -#line 7622 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7623 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7625 - MOVE_THUNDERBOLT, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 7628 - [DIFFICULTY_NORMAL][TRAINER_JANI] = - { -#line 7629 - .trainerName = _("JANI"), -#line 7630 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 7631 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 7632 -F_TRAINER_FEMALE | -#line 7633 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 7634 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7636 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7637 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7640 - [DIFFICULTY_NORMAL][TRAINER_LAO_1] = - { -#line 7641 - .trainerName = _("LAO"), -#line 7642 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7643 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7645 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7646 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 7648 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7650 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7649 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7651 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SMOG, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7656 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7658 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7657 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7659 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SMOG, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7664 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7666 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7665 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7667 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - }, - }, -#line 7672 - [DIFFICULTY_NORMAL][TRAINER_LUNG] = - { -#line 7673 - .trainerName = _("LUNG"), -#line 7674 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7675 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7677 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7678 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7680 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7682 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7681 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7684 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7686 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7685 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7688 - [DIFFICULTY_NORMAL][TRAINER_LAO_2] = - { -#line 7689 - .trainerName = _("LAO"), -#line 7690 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7691 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7693 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7694 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7696 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7698 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7697 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7699 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7704 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7706 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7705 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7707 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7711 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7713 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7712 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7714 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7719 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7721 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7720 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7722 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7725 - [DIFFICULTY_NORMAL][TRAINER_LAO_3] = - { -#line 7726 - .trainerName = _("LAO"), -#line 7727 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7728 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7730 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7731 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7733 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7735 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7734 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7736 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7741 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7743 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7742 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7744 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7749 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7751 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7750 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7752 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7756 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7758 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 7757 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7759 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7762 - [DIFFICULTY_NORMAL][TRAINER_LAO_4] = - { -#line 7763 - .trainerName = _("LAO"), -#line 7764 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7765 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7767 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7768 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7770 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7772 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7771 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7773 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7777 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7779 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7778 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7780 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7784 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7786 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7785 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7787 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7791 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7793 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 7792 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7794 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7797 - [DIFFICULTY_NORMAL][TRAINER_LAO_5] = - { -#line 7798 - .trainerName = _("LAO"), -#line 7799 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 7800 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 7802 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 7803 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 7805 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7807 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7806 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7808 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - { -#line 7812 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7814 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7813 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7815 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7820 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7822 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7821 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7823 - MOVE_POISON_GAS, - MOVE_TACKLE, - MOVE_SLUDGE, - MOVE_SELF_DESTRUCT, - }, - }, - { -#line 7828 - .species = SPECIES_WEEZING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7828 - .heldItem = ITEM_SMOKE_BALL, -#line 7830 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 7829 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7831 - MOVE_TACKLE, - MOVE_SLUDGE, - }, - }, - }, - }, -#line 7834 - [DIFFICULTY_NORMAL][TRAINER_JOCELYN] = - { -#line 7835 - .trainerName = _("JOCELYN"), -#line 7836 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7837 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7838 -F_TRAINER_FEMALE | -#line 7839 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7840 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7843 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7845 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7844 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7847 - [DIFFICULTY_NORMAL][TRAINER_LAURA] = - { -#line 7848 - .trainerName = _("LAURA"), -#line 7849 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7850 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7851 -F_TRAINER_FEMALE | -#line 7852 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7853 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7854 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7856 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7858 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 7857 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7860 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_1] = - { -#line 7861 - .trainerName = _("CYNDY"), -#line 7862 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7863 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7864 -F_TRAINER_FEMALE | -#line 7865 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7866 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7867 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7869 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7871 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7870 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7873 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7875 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7874 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7877 - [DIFFICULTY_NORMAL][TRAINER_CORA] = - { -#line 7878 - .trainerName = _("CORA"), -#line 7879 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7880 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7881 -F_TRAINER_FEMALE | -#line 7882 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7883 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7884 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7886 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7888 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7887 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7890 - [DIFFICULTY_NORMAL][TRAINER_PAULA] = - { -#line 7891 - .trainerName = _("PAULA"), -#line 7892 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7893 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7894 -F_TRAINER_FEMALE | -#line 7895 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7896 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7897 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7899 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7901 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 7900 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7903 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_2] = - { -#line 7904 - .trainerName = _("CYNDY"), -#line 7905 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7906 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7907 -F_TRAINER_FEMALE | -#line 7908 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7909 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7910 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7912 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7914 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7913 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7916 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7918 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 7917 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7920 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_3] = - { -#line 7921 - .trainerName = _("CYNDY"), -#line 7922 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7923 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7924 -F_TRAINER_FEMALE | -#line 7925 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7926 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7927 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7929 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7931 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7930 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7933 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7935 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 7934 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7937 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_4] = - { -#line 7938 - .trainerName = _("CYNDY"), -#line 7939 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7940 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7941 -F_TRAINER_FEMALE | -#line 7942 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7943 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7944 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7946 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7948 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7947 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7950 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7952 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 7951 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7954 - [DIFFICULTY_NORMAL][TRAINER_CYNDY_5] = - { -#line 7955 - .trainerName = _("CYNDY"), -#line 7956 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 7957 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 7958 -F_TRAINER_FEMALE | -#line 7959 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 7960 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7961 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7963 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7965 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7964 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 7967 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7969 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 7968 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 7971 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_1] = - { -#line 7972 - .trainerName = _("MADELINE"), -#line 7973 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7974 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 7975 -F_TRAINER_FEMALE | -#line 7976 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7977 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7978 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 7980 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7982 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7981 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 7983 - MOVE_EMBER, - MOVE_TACKLE, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 7988 - [DIFFICULTY_NORMAL][TRAINER_CLARISSA] = - { -#line 7989 - .trainerName = _("CLARISSA"), -#line 7990 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 7991 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 7992 -F_TRAINER_FEMALE | -#line 7993 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 7994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 7995 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 7997 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 7999 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 7998 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8001 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8003 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8002 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8005 - [DIFFICULTY_NORMAL][TRAINER_ANGELICA] = - { -#line 8006 - .trainerName = _("ANGELICA"), -#line 8007 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8008 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8009 -F_TRAINER_FEMALE | -#line 8010 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8014 - .species = SPECIES_CASTFORM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8016 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 8015 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8017 - MOVE_RAIN_DANCE, - MOVE_WEATHER_BALL, - MOVE_THUNDER, - MOVE_WATER_PULSE, - }, - }, - }, - }, -#line 8022 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_2] = - { -#line 8023 - .trainerName = _("MADELINE"), -#line 8024 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8025 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8026 -F_TRAINER_FEMALE | -#line 8027 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8028 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8029 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8031 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8033 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8032 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8034 - MOVE_EMBER, - MOVE_TACKLE, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8039 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_3] = - { -#line 8040 - .trainerName = _("MADELINE"), -#line 8041 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8042 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8043 -F_TRAINER_FEMALE | -#line 8044 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8045 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8046 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8048 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8050 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8049 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8051 - MOVE_EMBER, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8056 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_4] = - { -#line 8057 - .trainerName = _("MADELINE"), -#line 8058 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8059 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8060 -F_TRAINER_FEMALE | -#line 8061 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8062 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8063 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8065 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8067 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8066 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8068 - MOVE_LEECH_SEED, - MOVE_MEGA_DRAIN, - MOVE_GRASS_WHISTLE, - MOVE_SUNNY_DAY, - }, - }, - { -#line 8073 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8075 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8074 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8076 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_MAGNITUDE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8081 - [DIFFICULTY_NORMAL][TRAINER_MADELINE_5] = - { -#line 8082 - .trainerName = _("MADELINE"), -#line 8083 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 8084 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 8085 -F_TRAINER_FEMALE | -#line 8086 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 8087 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8088 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8090 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8092 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8091 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8093 - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - }, - }, - { -#line 8098 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8100 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8099 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8101 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_EARTHQUAKE, - MOVE_SUNNY_DAY, - }, - }, - }, - }, -#line 8106 - [DIFFICULTY_NORMAL][TRAINER_BEVERLY] = - { -#line 8107 - .trainerName = _("BEVERLY"), -#line 8108 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8109 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8110 -F_TRAINER_FEMALE | -#line 8111 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8112 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8113 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8115 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8117 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8116 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8119 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8121 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8120 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8123 - [DIFFICULTY_NORMAL][TRAINER_IMANI] = - { -#line 8124 - .trainerName = _("IMANI"), -#line 8125 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8126 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8127 -F_TRAINER_FEMALE | -#line 8128 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8129 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8130 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8132 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8134 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8133 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8136 - [DIFFICULTY_NORMAL][TRAINER_KYLA] = - { -#line 8137 - .trainerName = _("KYLA"), -#line 8138 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8139 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8140 -F_TRAINER_FEMALE | -#line 8141 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8142 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8143 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8145 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8147 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8146 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8149 - [DIFFICULTY_NORMAL][TRAINER_DENISE] = - { -#line 8150 - .trainerName = _("DENISE"), -#line 8151 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8152 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8153 -F_TRAINER_FEMALE | -#line 8154 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8156 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8158 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8160 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8159 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8162 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8164 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8163 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8166 - [DIFFICULTY_NORMAL][TRAINER_BETH] = - { -#line 8167 - .trainerName = _("BETH"), -#line 8168 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8169 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8170 -F_TRAINER_FEMALE | -#line 8171 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8175 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8177 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8176 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8179 - [DIFFICULTY_NORMAL][TRAINER_TARA] = - { -#line 8180 - .trainerName = _("TARA"), -#line 8181 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8182 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8183 -F_TRAINER_FEMALE | -#line 8184 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8185 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8186 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8188 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8190 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8189 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8192 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8194 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8193 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8196 - [DIFFICULTY_NORMAL][TRAINER_MISSY] = - { -#line 8197 - .trainerName = _("MISSY"), -#line 8198 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8199 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8200 -F_TRAINER_FEMALE | -#line 8201 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8202 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8203 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8205 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8207 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8206 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8209 - [DIFFICULTY_NORMAL][TRAINER_ALICE] = - { -#line 8210 - .trainerName = _("ALICE"), -#line 8211 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8212 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8213 -F_TRAINER_FEMALE | -#line 8214 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8215 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8216 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8218 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8220 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8219 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8222 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8224 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8223 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8226 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8228 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8227 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8230 - [DIFFICULTY_NORMAL][TRAINER_JENNY_1] = - { -#line 8231 - .trainerName = _("JENNY"), -#line 8232 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8233 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8234 -F_TRAINER_FEMALE | -#line 8235 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8236 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8237 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8239 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8241 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8240 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8243 - [DIFFICULTY_NORMAL][TRAINER_GRACE] = - { -#line 8244 - .trainerName = _("GRACE"), -#line 8245 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8246 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8247 -F_TRAINER_FEMALE | -#line 8248 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8249 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8250 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8252 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8254 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8253 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8256 - [DIFFICULTY_NORMAL][TRAINER_TANYA] = - { -#line 8257 - .trainerName = _("TANYA"), -#line 8258 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8259 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8260 -F_TRAINER_FEMALE | -#line 8261 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8262 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8263 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8265 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8267 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8266 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8269 - [DIFFICULTY_NORMAL][TRAINER_SHARON] = - { -#line 8270 - .trainerName = _("SHARON"), -#line 8271 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8272 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8273 -F_TRAINER_FEMALE | -#line 8274 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8275 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8276 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8278 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8280 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8279 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8282 - [DIFFICULTY_NORMAL][TRAINER_NIKKI] = - { -#line 8283 - .trainerName = _("NIKKI"), -#line 8284 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8285 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8286 -F_TRAINER_FEMALE | -#line 8287 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8288 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8289 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8291 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8293 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8292 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8295 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8297 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8296 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8299 - [DIFFICULTY_NORMAL][TRAINER_BRENDA] = - { -#line 8300 - .trainerName = _("BRENDA"), -#line 8301 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8302 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8303 -F_TRAINER_FEMALE | -#line 8304 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8305 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8306 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8308 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8310 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8309 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8312 - [DIFFICULTY_NORMAL][TRAINER_KATIE] = - { -#line 8313 - .trainerName = _("KATIE"), -#line 8314 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8315 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8316 -F_TRAINER_FEMALE | -#line 8317 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8318 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8319 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8321 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8323 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8322 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8325 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8327 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8326 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8329 - [DIFFICULTY_NORMAL][TRAINER_SUSIE] = - { -#line 8330 - .trainerName = _("SUSIE"), -#line 8331 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8332 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8333 -F_TRAINER_FEMALE | -#line 8334 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8335 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8336 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8338 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8340 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8339 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8342 - [DIFFICULTY_NORMAL][TRAINER_KARA] = - { -#line 8343 - .trainerName = _("KARA"), -#line 8344 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8345 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8346 -F_TRAINER_FEMALE | -#line 8347 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8348 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8349 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8351 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8353 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8352 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8355 - [DIFFICULTY_NORMAL][TRAINER_DANA] = - { -#line 8356 - .trainerName = _("DANA"), -#line 8357 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8358 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8359 -F_TRAINER_FEMALE | -#line 8360 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8361 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8362 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8364 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8366 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8365 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8368 - [DIFFICULTY_NORMAL][TRAINER_SIENNA] = - { -#line 8369 - .trainerName = _("SIENNA"), -#line 8370 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8371 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8372 -F_TRAINER_FEMALE | -#line 8373 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8374 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8375 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8377 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8379 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8378 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8381 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8383 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8382 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8385 - [DIFFICULTY_NORMAL][TRAINER_DEBRA] = - { -#line 8386 - .trainerName = _("DEBRA"), -#line 8387 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8388 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8389 -F_TRAINER_FEMALE | -#line 8390 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8391 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8392 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8394 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8396 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8398 - [DIFFICULTY_NORMAL][TRAINER_LINDA] = - { -#line 8399 - .trainerName = _("LINDA"), -#line 8400 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8401 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8402 -F_TRAINER_FEMALE | -#line 8403 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8407 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8408 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8411 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8413 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8412 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8415 - [DIFFICULTY_NORMAL][TRAINER_KAYLEE] = - { -#line 8416 - .trainerName = _("KAYLEE"), -#line 8417 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8418 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8419 -F_TRAINER_FEMALE | -#line 8420 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8421 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8422 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8424 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8426 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8425 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8428 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8430 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8429 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8432 - [DIFFICULTY_NORMAL][TRAINER_LAUREL] = - { -#line 8433 - .trainerName = _("LAUREL"), -#line 8434 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8435 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8436 -F_TRAINER_FEMALE | -#line 8437 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8438 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8439 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8441 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8443 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8442 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8445 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8447 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8446 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8449 - [DIFFICULTY_NORMAL][TRAINER_CARLEE] = - { -#line 8450 - .trainerName = _("CARLEE"), -#line 8451 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8452 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8453 -F_TRAINER_FEMALE | -#line 8454 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8455 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8456 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8458 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8460 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8459 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8462 - [DIFFICULTY_NORMAL][TRAINER_JENNY_2] = - { -#line 8463 - .trainerName = _("JENNY"), -#line 8464 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8465 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8466 -F_TRAINER_FEMALE | -#line 8467 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8468 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8469 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8471 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8473 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8472 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8475 - [DIFFICULTY_NORMAL][TRAINER_JENNY_3] = - { -#line 8476 - .trainerName = _("JENNY"), -#line 8477 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8478 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8479 -F_TRAINER_FEMALE | -#line 8480 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8481 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8482 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8484 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8486 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8485 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8488 - [DIFFICULTY_NORMAL][TRAINER_JENNY_4] = - { -#line 8489 - .trainerName = _("JENNY"), -#line 8490 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8491 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8492 -F_TRAINER_FEMALE | -#line 8493 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8494 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8495 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8497 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8499 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8498 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8501 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8503 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8502 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8505 - [DIFFICULTY_NORMAL][TRAINER_JENNY_5] = - { -#line 8506 - .trainerName = _("JENNY"), -#line 8507 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 8508 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 8509 -F_TRAINER_FEMALE | -#line 8510 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 8511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8514 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8516 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8515 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8518 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8520 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8519 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8522 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8524 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8523 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8526 - [DIFFICULTY_NORMAL][TRAINER_HEIDI] = - { -#line 8527 - .trainerName = _("HEIDI"), -#line 8528 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8529 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8530 -F_TRAINER_FEMALE | -#line 8531 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8532 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8533 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8535 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8537 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8536 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8538 - MOVE_DIG, - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - }, - }, - { -#line 8543 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8545 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8544 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8546 - MOVE_RAPID_SPIN, - MOVE_MUD_SLAP, - MOVE_PSYBEAM, - MOVE_ROCK_TOMB, - }, - }, - }, - }, -#line 8551 - [DIFFICULTY_NORMAL][TRAINER_BECKY] = - { -#line 8552 - .trainerName = _("BECKY"), -#line 8553 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8554 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8555 -F_TRAINER_FEMALE | -#line 8556 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8557 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8558 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8560 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8562 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8561 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8563 - MOVE_SAND_ATTACK, - MOVE_POISON_STING, - MOVE_SLASH, - MOVE_DIG, - }, - }, - { -#line 8568 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8569 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8571 - MOVE_ROLLOUT, - MOVE_BUBBLE_BEAM, - MOVE_TAIL_WHIP, - MOVE_DEFENSE_CURL, - }, - }, - }, - }, -#line 8576 - [DIFFICULTY_NORMAL][TRAINER_CAROL] = - { -#line 8577 - .trainerName = _("CAROL"), -#line 8578 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8579 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8580 -F_TRAINER_FEMALE | -#line 8581 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8585 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8587 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8586 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8589 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8591 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8590 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8593 - [DIFFICULTY_NORMAL][TRAINER_NANCY] = - { -#line 8594 - .trainerName = _("NANCY"), -#line 8595 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8596 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8597 -F_TRAINER_FEMALE | -#line 8598 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8600 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8602 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8604 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8603 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8606 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8608 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8607 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8610 - [DIFFICULTY_NORMAL][TRAINER_MARTHA] = - { -#line 8611 - .trainerName = _("MARTHA"), -#line 8612 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8613 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8614 -F_TRAINER_FEMALE | -#line 8615 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8619 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8621 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8620 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8623 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8625 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8624 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8627 - [DIFFICULTY_NORMAL][TRAINER_DIANA_1] = - { -#line 8628 - .trainerName = _("DIANA"), -#line 8629 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8630 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8631 -F_TRAINER_FEMALE | -#line 8632 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8633 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8634 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8636 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8637 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8640 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8642 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8641 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8644 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8646 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8645 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8648 - [DIFFICULTY_NORMAL][TRAINER_CEDRIC] = - { -#line 8649 - .trainerName = _("CEDRIC"), -#line 8650 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 8651 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 8653 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 8654 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8655 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8657 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8659 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8658 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8660 - MOVE_DESTINY_BOND, - MOVE_SAFEGUARD, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - }, - }, - }, - }, -#line 8665 - [DIFFICULTY_NORMAL][TRAINER_IRENE] = - { -#line 8666 - .trainerName = _("IRENE"), -#line 8667 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8668 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8669 -F_TRAINER_FEMALE | -#line 8670 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8671 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8672 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8674 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8676 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8675 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8678 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8680 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8679 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8682 - [DIFFICULTY_NORMAL][TRAINER_DIANA_2] = - { -#line 8683 - .trainerName = _("DIANA"), -#line 8684 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8685 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8686 -F_TRAINER_FEMALE | -#line 8687 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8688 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8689 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8691 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8693 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8692 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8695 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8697 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8696 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8699 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8701 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8700 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8703 - [DIFFICULTY_NORMAL][TRAINER_DIANA_3] = - { -#line 8704 - .trainerName = _("DIANA"), -#line 8705 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8706 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8707 -F_TRAINER_FEMALE | -#line 8708 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8710 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8712 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8714 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8713 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8716 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8718 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8717 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8720 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8722 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8721 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8724 - [DIFFICULTY_NORMAL][TRAINER_DIANA_4] = - { -#line 8725 - .trainerName = _("DIANA"), -#line 8726 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8727 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8728 -F_TRAINER_FEMALE | -#line 8729 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8731 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8733 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8735 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8734 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8737 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8739 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8738 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8741 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8743 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8742 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8745 - [DIFFICULTY_NORMAL][TRAINER_DIANA_5] = - { -#line 8746 - .trainerName = _("DIANA"), -#line 8747 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 8748 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 8749 -F_TRAINER_FEMALE | -#line 8750 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 8751 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8752 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8754 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8756 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8755 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8758 - .species = SPECIES_VILEPLUME, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8760 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8759 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8762 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8764 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8763 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8766 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_1] = - { -#line 8767 - .trainerName = _("AMY & LIV"), -#line 8768 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8769 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8771 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8772 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8773 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8775 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8777 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8776 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8779 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8781 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8780 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8783 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_2] = - { -#line 8784 - .trainerName = _("AMY & LIV"), -#line 8785 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8786 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8788 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8789 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8790 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8792 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8794 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8793 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8796 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8798 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8797 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8800 - [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_1] = - { -#line 8801 - .trainerName = _("GINA & MIA"), -#line 8802 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8803 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8805 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8806 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8807 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8809 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8811 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8810 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8813 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8815 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8814 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8817 - [DIFFICULTY_NORMAL][TRAINER_MIU_AND_YUKI] = - { -#line 8818 - .trainerName = _("MIU & YUKI"), -#line 8819 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8820 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8822 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8823 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8824 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8826 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8828 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8827 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8830 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8832 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8831 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8834 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_3] = - { -#line 8835 - .trainerName = _("AMY & LIV"), -#line 8836 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8837 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8839 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8840 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8843 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8845 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8844 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8847 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8849 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8848 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8851 - [DIFFICULTY_NORMAL][TRAINER_GINA_AND_MIA_2] = - { -#line 8852 - .trainerName = _("GINA & MIA"), -#line 8853 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8854 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8856 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8857 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8858 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8860 - .species = SPECIES_DUSKULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8862 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8861 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8863 - MOVE_NIGHT_SHADE, - MOVE_DISABLE, - }, - }, - { -#line 8866 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8868 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8867 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8869 - MOVE_ABSORB, - MOVE_LEECH_SEED, - }, - }, - }, - }, -#line 8872 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_4] = - { -#line 8873 - .trainerName = _("AMY & LIV"), -#line 8874 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8875 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8877 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8878 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8879 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8881 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8883 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8882 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8885 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8887 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 8886 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8889 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_5] = - { -#line 8890 - .trainerName = _("AMY & LIV"), -#line 8891 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8892 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8894 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8895 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8896 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8898 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8900 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8899 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8901 - MOVE_SPARK, - MOVE_CHARGE, - MOVE_FAKE_TEARS, - MOVE_HELPING_HAND, - }, - }, - { -#line 8906 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8908 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 8907 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8909 - MOVE_SPARK, - MOVE_CHARGE, - MOVE_CHARM, - MOVE_HELPING_HAND, - }, - }, - }, - }, -#line 8914 - [DIFFICULTY_NORMAL][TRAINER_AMY_AND_LIV_6] = - { -#line 8915 - .trainerName = _("AMY & LIV"), -#line 8916 - .trainerClass = TRAINER_CLASS_TWINS, -#line 8917 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 8919 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 8920 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 8921 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8923 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8925 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8924 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8926 - MOVE_THUNDER, - MOVE_CHARGE, - MOVE_FAKE_TEARS, - MOVE_HELPING_HAND, - }, - }, - { -#line 8931 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8933 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 8932 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 8934 - MOVE_THUNDER, - MOVE_CHARGE, - MOVE_CHARM, - MOVE_HELPING_HAND, - }, - }, - }, - }, -#line 8939 - [DIFFICULTY_NORMAL][TRAINER_HUEY] = - { -#line 8940 - .trainerName = _("HUEY"), -#line 8941 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8942 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8944 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8945 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8946 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8948 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8950 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8949 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8952 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8954 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 8953 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8956 - [DIFFICULTY_NORMAL][TRAINER_EDMOND] = - { -#line 8957 - .trainerName = _("EDMOND"), -#line 8958 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8959 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8962 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8963 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 8965 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8966 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8969 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_1] = - { -#line 8970 - .trainerName = _("ERNEST"), -#line 8971 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8972 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8974 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8975 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8976 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 8978 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8980 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8979 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8982 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8984 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8983 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 8986 - [DIFFICULTY_NORMAL][TRAINER_DWAYNE] = - { -#line 8987 - .trainerName = _("DWAYNE"), -#line 8988 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 8989 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 8991 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 8992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 8993 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 8995 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 8997 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 8996 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 8999 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9001 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9000 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9003 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9005 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9004 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9007 - [DIFFICULTY_NORMAL][TRAINER_PHILLIP] = - { -#line 9008 - .trainerName = _("PHILLIP"), -#line 9009 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9010 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9012 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9013 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9014 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9016 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9018 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9017 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9020 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9022 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9021 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9024 - [DIFFICULTY_NORMAL][TRAINER_LEONARD] = - { -#line 9025 - .trainerName = _("LEONARD"), -#line 9026 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9027 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9029 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9030 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9031 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9033 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9035 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9034 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9037 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9039 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9038 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9041 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9043 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9042 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9045 - [DIFFICULTY_NORMAL][TRAINER_DUNCAN] = - { -#line 9046 - .trainerName = _("DUNCAN"), -#line 9047 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9048 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9050 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9051 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9052 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9054 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9056 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9055 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9058 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9060 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9059 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9062 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_2] = - { -#line 9063 - .trainerName = _("ERNEST"), -#line 9064 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9065 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9067 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9068 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9069 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9071 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9073 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9072 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9075 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9077 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9076 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9079 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9081 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9080 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9083 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_3] = - { -#line 9084 - .trainerName = _("ERNEST"), -#line 9085 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9086 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9088 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9089 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9090 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9092 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9094 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9093 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9096 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9098 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9097 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9100 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9102 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9101 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9104 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_4] = - { -#line 9105 - .trainerName = _("ERNEST"), -#line 9106 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9107 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9109 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9110 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9111 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9113 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9115 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9114 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9117 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9119 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9118 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9121 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9123 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9122 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9125 - [DIFFICULTY_NORMAL][TRAINER_ERNEST_5] = - { -#line 9126 - .trainerName = _("ERNEST"), -#line 9127 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9128 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9130 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9131 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9132 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9134 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9136 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9135 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9138 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9140 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9139 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9142 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9144 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 9143 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9146 - [DIFFICULTY_NORMAL][TRAINER_ELI] = - { -#line 9147 - .trainerName = _("ELI"), -#line 9148 - .trainerClass = TRAINER_CLASS_HIKER, -#line 9149 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 9151 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 9152 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9153 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9155 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9157 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9156 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9159 - [DIFFICULTY_NORMAL][TRAINER_ANNIKA] = - { -#line 9160 - .trainerName = _("ANNIKA"), -#line 9161 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 9162 - .trainerPic = TRAINER_PIC_POKEFAN_F, - .encounterMusic_gender = -#line 9163 -F_TRAINER_FEMALE | -#line 9164 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 9165 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9166 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9168 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9168 - .heldItem = ITEM_ORAN_BERRY, -#line 9170 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9169 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9171 - MOVE_FLAIL, - MOVE_WATER_PULSE, - MOVE_RETURN, - MOVE_ATTRACT, - }, - }, - { -#line 9176 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9176 - .heldItem = ITEM_ORAN_BERRY, -#line 9178 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9177 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9179 - MOVE_FLAIL, - MOVE_WATER_PULSE, - MOVE_RETURN, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 9184 - [DIFFICULTY_NORMAL][TRAINER_JAZMYN] = - { -#line 9185 - .trainerName = _("JAZMYN"), -#line 9186 - .trainerClass = TRAINER_CLASS_COOLTRAINER_2, -#line 9187 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 9188 -F_TRAINER_FEMALE | -#line 9189 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9190 - .items = { ITEM_HYPER_POTION }, -#line 9191 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9192 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9194 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9196 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9195 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9198 - [DIFFICULTY_NORMAL][TRAINER_JONAS] = - { -#line 9199 - .trainerName = _("JONAS"), -#line 9200 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 9201 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 9203 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9204 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9205 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9207 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9209 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9208 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9210 - MOVE_TOXIC, - MOVE_THUNDER, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE_BOMB, - }, - }, - }, - }, -#line 9215 - [DIFFICULTY_NORMAL][TRAINER_KAYLEY] = - { -#line 9216 - .trainerName = _("KAYLEY"), -#line 9217 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 9218 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 9219 -F_TRAINER_FEMALE | -#line 9220 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9221 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9222 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9224 - .species = SPECIES_CASTFORM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9226 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9225 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9227 - MOVE_SUNNY_DAY, - MOVE_WEATHER_BALL, - MOVE_FLAMETHROWER, - MOVE_SOLAR_BEAM, - }, - }, - }, - }, -#line 9232 - [DIFFICULTY_NORMAL][TRAINER_AURON] = - { -#line 9233 - .trainerName = _("AURON"), -#line 9234 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 9235 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 9237 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9238 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9239 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9241 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9243 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9242 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9245 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9247 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9246 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9249 - [DIFFICULTY_NORMAL][TRAINER_KELVIN] = - { -#line 9250 - .trainerName = _("KELVIN"), -#line 9251 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9252 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9254 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9258 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9260 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9259 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9262 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9264 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9263 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9266 - [DIFFICULTY_NORMAL][TRAINER_MARLEY] = - { -#line 9267 - .trainerName = _("MARLEY"), -#line 9268 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9269 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 9270 -F_TRAINER_FEMALE | -#line 9271 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9272 - .items = { ITEM_HYPER_POTION }, -#line 9273 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9274 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9276 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9278 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 9277 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9279 - MOVE_BITE, - MOVE_ROAR, - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - }, - }, - }, - }, -#line 9284 - [DIFFICULTY_NORMAL][TRAINER_REYNA] = - { -#line 9285 - .trainerName = _("REYNA"), -#line 9286 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 9287 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 9288 -F_TRAINER_FEMALE | -#line 9289 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9290 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9291 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9293 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9295 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9294 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9297 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9299 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 9298 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9301 - [DIFFICULTY_NORMAL][TRAINER_HUDSON] = - { -#line 9302 - .trainerName = _("HUDSON"), -#line 9303 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 9304 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 9306 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9307 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9308 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9310 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9312 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9311 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9314 - [DIFFICULTY_NORMAL][TRAINER_CONOR] = - { -#line 9315 - .trainerName = _("CONOR"), -#line 9316 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 9317 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 9319 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 9320 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9321 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9323 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9325 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9324 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9327 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9329 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 9328 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9331 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_1] = - { -#line 9332 - .trainerName = _("EDWIN"), -#line 9333 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9334 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9336 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9337 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9338 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9340 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9341 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9344 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9346 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9345 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9348 - [DIFFICULTY_NORMAL][TRAINER_HECTOR] = - { -#line 9349 - .trainerName = _("HECTOR"), -#line 9350 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9351 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9353 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9355 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9357 - .species = SPECIES_ZANGOOSE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9359 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9358 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9361 - .species = SPECIES_SEVIPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9363 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9362 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9365 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MOSSDEEP] = - { -#line 9366 - .trainerName = _("TABITHA"), -#line 9367 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 9368 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 9370 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 9371 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9372 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9374 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9376 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9375 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9378 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9380 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9379 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9382 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9384 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9383 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9386 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_2] = - { -#line 9387 - .trainerName = _("EDWIN"), -#line 9388 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9389 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9391 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9392 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9393 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9395 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9397 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9396 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9399 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9401 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9400 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9403 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_3] = - { -#line 9404 - .trainerName = _("EDWIN"), -#line 9405 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9406 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9408 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9409 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9410 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9412 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9414 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9413 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9416 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9418 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9417 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9420 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_4] = - { -#line 9421 - .trainerName = _("EDWIN"), -#line 9422 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9423 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9425 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9427 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9429 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9431 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9430 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9433 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9435 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9434 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9437 - [DIFFICULTY_NORMAL][TRAINER_EDWIN_5] = - { -#line 9438 - .trainerName = _("EDWIN"), -#line 9439 - .trainerClass = TRAINER_CLASS_COLLECTOR, -#line 9440 - .trainerPic = TRAINER_PIC_COLLECTOR, - .encounterMusic_gender = -#line 9442 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 9443 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9444 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9446 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9448 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9447 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9450 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9452 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9451 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9454 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_1] = - { -#line 9455 - .trainerName = _("WALLY"), -#line 9456 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9457 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 9459 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9460 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 9461 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9462 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 9464 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9466 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9465 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9467 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 9472 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9474 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9473 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9475 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 9480 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9482 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9481 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9483 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 9488 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9490 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9489 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9491 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 9496 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9498 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 9497 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9499 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 9504 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_MUDKIP] = - { -#line 9505 - .trainerName = _("BRENDAN"), -#line 9506 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9507 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9509 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9510 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9511 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9513 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9515 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9514 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9517 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_MUDKIP] = - { -#line 9518 - .trainerName = _("BRENDAN"), -#line 9519 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9520 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9522 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9523 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9524 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9526 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9528 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9527 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9530 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9532 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9531 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9534 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9536 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9535 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9538 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_MUDKIP] = - { -#line 9539 - .trainerName = _("BRENDAN"), -#line 9540 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9541 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9543 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9544 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9545 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9547 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9549 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9548 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9551 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9553 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9552 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9555 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9557 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9556 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9559 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TREECKO] = - { -#line 9560 - .trainerName = _("BRENDAN"), -#line 9561 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9562 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9564 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9565 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9566 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9568 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9570 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9569 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9572 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TREECKO] = - { -#line 9573 - .trainerName = _("BRENDAN"), -#line 9574 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9575 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9577 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9578 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9579 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9581 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9583 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9582 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9585 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9587 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9586 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9589 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9591 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9590 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9593 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TREECKO] = - { -#line 9594 - .trainerName = _("BRENDAN"), -#line 9595 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9596 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9598 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9600 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9602 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9604 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9603 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9606 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9608 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9607 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9610 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9612 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9611 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9614 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_103_TORCHIC] = - { -#line 9615 - .trainerName = _("BRENDAN"), -#line 9616 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9617 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9619 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9620 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9621 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9623 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9625 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9624 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9627 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_110_TORCHIC] = - { -#line 9628 - .trainerName = _("BRENDAN"), -#line 9629 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9630 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9632 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9633 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9634 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9636 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9638 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9637 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9640 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9642 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9641 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9644 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9646 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9645 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9648 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_ROUTE_119_TORCHIC] = - { -#line 9649 - .trainerName = _("BRENDAN"), -#line 9650 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9651 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 9653 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9654 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9655 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9657 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9659 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9658 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9661 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9663 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9662 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9665 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9667 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9666 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9669 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_MUDKIP] = - { -#line 9670 - .trainerName = _("MAY"), -#line 9671 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9672 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9673 -F_TRAINER_FEMALE | -#line 9674 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9675 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9676 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9678 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9680 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9679 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9682 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_MUDKIP] = - { -#line 9683 - .trainerName = _("MAY"), -#line 9684 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9685 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9686 -F_TRAINER_FEMALE | -#line 9687 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9688 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9689 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9691 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9693 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9692 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9695 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9697 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9696 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9699 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9701 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9700 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9703 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_MUDKIP] = - { -#line 9704 - .trainerName = _("MAY"), -#line 9705 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9706 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9707 -F_TRAINER_FEMALE | -#line 9708 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9709 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9710 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9712 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9714 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9713 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9716 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9718 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9717 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9720 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9722 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9721 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9724 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TREECKO] = - { -#line 9725 - .trainerName = _("MAY"), -#line 9726 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9727 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9728 -F_TRAINER_FEMALE | -#line 9729 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9731 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9733 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9735 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9734 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9737 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TREECKO] = - { -#line 9738 - .trainerName = _("MAY"), -#line 9739 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9740 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9741 -F_TRAINER_FEMALE | -#line 9742 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9743 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9744 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9746 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9748 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9747 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9750 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9752 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9751 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9754 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9756 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9755 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9758 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TREECKO] = - { -#line 9759 - .trainerName = _("MAY"), -#line 9760 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9761 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9762 -F_TRAINER_FEMALE | -#line 9763 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9764 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9765 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9767 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9769 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9768 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9771 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9773 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9772 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9775 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9777 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9776 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9779 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_103_TORCHIC] = - { -#line 9780 - .trainerName = _("MAY"), -#line 9781 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9782 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9783 -F_TRAINER_FEMALE | -#line 9784 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9785 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9786 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9788 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9790 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9789 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9792 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_110_TORCHIC] = - { -#line 9793 - .trainerName = _("MAY"), -#line 9794 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9795 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9796 -F_TRAINER_FEMALE | -#line 9797 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9798 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9799 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9801 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9803 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9802 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9805 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9807 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 9806 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9809 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9811 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9810 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9813 - [DIFFICULTY_NORMAL][TRAINER_MAY_ROUTE_119_TORCHIC] = - { -#line 9814 - .trainerName = _("MAY"), -#line 9815 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 9816 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 9817 -F_TRAINER_FEMALE | -#line 9818 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 9819 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9820 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9822 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9824 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9823 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9826 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9828 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 9827 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9830 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9832 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 9831 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9834 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_1] = - { -#line 9835 - .trainerName = _("ISAAC"), -#line 9836 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9837 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9839 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9840 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9841 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9843 - .species = SPECIES_WHISMUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9845 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9844 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9847 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9849 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9848 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9851 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9853 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9852 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9855 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9857 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9856 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9859 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9861 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9860 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9863 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9865 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9864 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9867 - [DIFFICULTY_NORMAL][TRAINER_DAVIS] = - { -#line 9868 - .trainerName = _("DAVIS"), -#line 9869 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 9870 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 9872 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9873 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9874 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 9876 - .species = SPECIES_PINSIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9878 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9877 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9880 - [DIFFICULTY_NORMAL][TRAINER_MITCHELL] = - { -#line 9881 - .trainerName = _("MITCHELL"), -#line 9882 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 9883 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 9885 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 9886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9887 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 9889 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9891 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9890 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9892 - MOVE_EXPLOSION, - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_PSYCHIC, - }, - }, - { -#line 9897 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9899 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 9898 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 9900 - MOVE_EXPLOSION, - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 9905 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_2] = - { -#line 9906 - .trainerName = _("ISAAC"), -#line 9907 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9908 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9910 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9911 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9912 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9914 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9916 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9915 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9918 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9920 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9919 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9922 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9924 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9923 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9926 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9928 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9927 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9930 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9932 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9931 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9934 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9936 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 9935 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9938 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_3] = - { -#line 9939 - .trainerName = _("ISAAC"), -#line 9940 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9941 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9943 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9944 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9945 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9947 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9949 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9948 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9951 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9953 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9952 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9955 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9957 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9956 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9959 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9961 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9960 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9963 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9965 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9964 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9967 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9969 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 9968 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 9971 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_4] = - { -#line 9972 - .trainerName = _("ISAAC"), -#line 9973 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 9974 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 9976 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 9977 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 9978 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 9980 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9982 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9981 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9984 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9986 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9985 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9988 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9990 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9989 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9992 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9994 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9993 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 9996 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 9998 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 9997 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10000 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10002 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10001 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10004 - [DIFFICULTY_NORMAL][TRAINER_ISAAC_5] = - { -#line 10005 - .trainerName = _("ISAAC"), -#line 10006 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10007 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 10009 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10013 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10015 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10014 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10017 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10019 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10018 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10021 - .species = SPECIES_LAIRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10023 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10022 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10025 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10027 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10026 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10029 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10031 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10030 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10033 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10035 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10034 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10037 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_1] = - { -#line 10038 - .trainerName = _("LYDIA"), -#line 10039 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10040 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10041 -F_TRAINER_FEMALE | -#line 10042 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10043 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10044 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10046 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10048 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10047 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10050 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10052 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10051 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10054 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10056 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10055 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10058 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10060 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10059 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10062 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10064 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10063 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10066 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10068 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10067 - .lvl = 11, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10070 - [DIFFICULTY_NORMAL][TRAINER_HALLE] = - { -#line 10071 - .trainerName = _("HALLE"), -#line 10072 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10073 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 10074 -F_TRAINER_FEMALE | -#line 10075 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10076 - .items = { ITEM_FULL_RESTORE }, -#line 10077 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10078 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10080 - .species = SPECIES_SABLEYE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10082 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10081 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10084 - .species = SPECIES_ABSOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10086 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10085 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10088 - [DIFFICULTY_NORMAL][TRAINER_GARRISON] = - { -#line 10089 - .trainerName = _("GARRISON"), -#line 10090 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 10091 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 10093 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10094 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10095 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10097 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10099 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10098 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10101 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_2] = - { -#line 10102 - .trainerName = _("LYDIA"), -#line 10103 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10104 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10105 -F_TRAINER_FEMALE | -#line 10106 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10107 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10108 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10110 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10112 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10111 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10114 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10116 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10115 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10118 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10120 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10119 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10122 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10124 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10123 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10126 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10128 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10127 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10130 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10132 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 10131 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10134 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_3] = - { -#line 10135 - .trainerName = _("LYDIA"), -#line 10136 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10137 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10138 -F_TRAINER_FEMALE | -#line 10139 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10140 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10141 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10143 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10145 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10144 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10147 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10149 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10148 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10151 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10153 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10152 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10155 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10157 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10156 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10159 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10161 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10160 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10163 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10165 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 10164 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10167 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_4] = - { -#line 10168 - .trainerName = _("LYDIA"), -#line 10169 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10170 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10171 -F_TRAINER_FEMALE | -#line 10172 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10173 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10174 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10176 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10178 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10177 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10180 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10182 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10181 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10184 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10186 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10185 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10188 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10190 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10189 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10192 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10194 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10193 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10196 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10198 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10197 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10200 - [DIFFICULTY_NORMAL][TRAINER_LYDIA_5] = - { -#line 10201 - .trainerName = _("LYDIA"), -#line 10202 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 10203 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 10204 -F_TRAINER_FEMALE | -#line 10205 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10206 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10207 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 10209 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10211 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10210 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10213 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10215 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10214 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10217 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10219 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10218 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10221 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10223 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10222 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10225 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10227 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10226 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10229 - .species = SPECIES_SEAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10231 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 10230 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10233 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_1] = - { -#line 10234 - .trainerName = _("JACKSON"), -#line 10235 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10236 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10238 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10239 - .items = { ITEM_FULL_RESTORE }, -#line 10240 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10241 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10243 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10245 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10244 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10247 - [DIFFICULTY_NORMAL][TRAINER_LORENZO] = - { -#line 10248 - .trainerName = _("LORENZO"), -#line 10249 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10250 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10252 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10253 - .items = { ITEM_FULL_RESTORE }, -#line 10254 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10255 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 10257 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10259 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10258 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10261 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10263 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10262 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10265 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10267 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10266 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10269 - [DIFFICULTY_NORMAL][TRAINER_SEBASTIAN] = - { -#line 10270 - .trainerName = _("SEBASTIAN"), -#line 10271 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10272 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10274 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10275 - .items = { ITEM_FULL_RESTORE }, -#line 10276 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10277 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10279 - .species = SPECIES_CACTURNE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10281 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10280 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10283 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_2] = - { -#line 10284 - .trainerName = _("JACKSON"), -#line 10285 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10286 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10288 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10289 - .items = { ITEM_FULL_RESTORE }, -#line 10290 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10291 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10293 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10295 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10294 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10297 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_3] = - { -#line 10298 - .trainerName = _("JACKSON"), -#line 10299 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10300 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10302 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10303 - .items = { ITEM_FULL_RESTORE }, -#line 10304 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10305 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10307 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10309 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10308 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10311 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_4] = - { -#line 10312 - .trainerName = _("JACKSON"), -#line 10313 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10314 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10316 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10317 - .items = { ITEM_FULL_RESTORE }, -#line 10318 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10319 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10321 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10323 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10322 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10325 - [DIFFICULTY_NORMAL][TRAINER_JACKSON_5] = - { -#line 10326 - .trainerName = _("JACKSON"), -#line 10327 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10328 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, - .encounterMusic_gender = -#line 10330 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10331 - .items = { ITEM_FULL_RESTORE }, -#line 10332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10333 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10335 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10337 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10336 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10339 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10341 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10340 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10343 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_1] = - { -#line 10344 - .trainerName = _("CATHERINE"), -#line 10345 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10346 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10347 -F_TRAINER_FEMALE | -#line 10348 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10349 - .items = { ITEM_FULL_RESTORE }, -#line 10350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10353 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10355 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10354 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10357 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10359 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10358 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10361 - [DIFFICULTY_NORMAL][TRAINER_JENNA] = - { -#line 10362 - .trainerName = _("JENNA"), -#line 10363 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10364 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10365 -F_TRAINER_FEMALE | -#line 10366 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10367 - .items = { ITEM_FULL_RESTORE }, -#line 10368 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10369 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 10371 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10373 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10372 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10375 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10377 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10376 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10379 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10381 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10380 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10383 - [DIFFICULTY_NORMAL][TRAINER_SOPHIA] = - { -#line 10384 - .trainerName = _("SOPHIA"), -#line 10385 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10386 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10387 -F_TRAINER_FEMALE | -#line 10388 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10389 - .items = { ITEM_FULL_RESTORE }, -#line 10390 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10391 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10393 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10395 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10394 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10397 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10399 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10398 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10401 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_2] = - { -#line 10402 - .trainerName = _("CATHERINE"), -#line 10403 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10404 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10405 -F_TRAINER_FEMALE | -#line 10406 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10407 - .items = { ITEM_FULL_RESTORE }, -#line 10408 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10409 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10411 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10413 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10412 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10415 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10417 - .iv = TRAINER_PARTY_IVS(7, 7, 7, 7, 7, 7), -#line 10416 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10419 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_3] = - { -#line 10420 - .trainerName = _("CATHERINE"), -#line 10421 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10422 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10423 -F_TRAINER_FEMALE | -#line 10424 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10425 - .items = { ITEM_FULL_RESTORE }, -#line 10426 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10427 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10429 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10431 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10430 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10433 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10435 - .iv = TRAINER_PARTY_IVS(8, 8, 8, 8, 8, 8), -#line 10434 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10437 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_4] = - { -#line 10438 - .trainerName = _("CATHERINE"), -#line 10439 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10440 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10441 -F_TRAINER_FEMALE | -#line 10442 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10443 - .items = { ITEM_FULL_RESTORE }, -#line 10444 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10445 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10447 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10449 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10448 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10451 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10453 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 10452 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10455 - [DIFFICULTY_NORMAL][TRAINER_CATHERINE_5] = - { -#line 10456 - .trainerName = _("CATHERINE"), -#line 10457 - .trainerClass = TRAINER_CLASS_PKMN_RANGER, -#line 10458 - .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, - .encounterMusic_gender = -#line 10459 -F_TRAINER_FEMALE | -#line 10460 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10461 - .items = { ITEM_FULL_RESTORE }, -#line 10462 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10463 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10465 - .species = SPECIES_BELLOSSOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10467 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10466 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10469 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10471 - .iv = TRAINER_PARTY_IVS(10, 10, 10, 10, 10, 10), -#line 10470 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10473 - [DIFFICULTY_NORMAL][TRAINER_JULIO] = - { -#line 10474 - .trainerName = _("JULIO"), -#line 10475 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10476 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, - .encounterMusic_gender = -#line 10478 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10479 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10480 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10482 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10484 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10483 - .lvl = 21, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10486 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SEAFLOOR_CAVERN_5] = - { -#line 10487 - .trainerName = _("GRUNT"), -#line 10488 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10489 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, - .encounterMusic_gender = -#line 10491 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10492 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10493 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10495 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10497 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10496 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10499 - .species = SPECIES_GOLBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10501 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10500 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10503 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_UNUSED] = - { -#line 10504 - .trainerName = _("GRUNT"), -#line 10505 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10506 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10507 -F_TRAINER_FEMALE | -#line 10508 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10509 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10510 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10512 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10514 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10513 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10516 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10518 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10517 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10520 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_PYRE_4] = - { -#line 10521 - .trainerName = _("GRUNT"), -#line 10522 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10523 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10524 -F_TRAINER_FEMALE | -#line 10525 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10526 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10527 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10529 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10531 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10530 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10533 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10535 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10534 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10537 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_JAGGED_PASS] = - { -#line 10538 - .trainerName = _("GRUNT"), -#line 10539 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10540 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10542 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10543 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10544 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10546 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10548 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10547 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10550 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10552 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10551 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10554 - [DIFFICULTY_NORMAL][TRAINER_MARC] = - { -#line 10555 - .trainerName = _("MARC"), -#line 10556 - .trainerClass = TRAINER_CLASS_HIKER, -#line 10557 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 10559 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 10560 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10561 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10563 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10565 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 10564 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10567 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10569 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 10568 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10571 - [DIFFICULTY_NORMAL][TRAINER_BRENDEN] = - { -#line 10572 - .trainerName = _("BRENDEN"), -#line 10573 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 10574 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 10576 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10577 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10578 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10580 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10582 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10581 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10584 - [DIFFICULTY_NORMAL][TRAINER_LILITH] = - { -#line 10585 - .trainerName = _("LILITH"), -#line 10586 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 10587 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 10588 -F_TRAINER_FEMALE | -#line 10589 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10590 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10591 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10593 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10595 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 10594 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10597 - [DIFFICULTY_NORMAL][TRAINER_CRISTIAN] = - { -#line 10598 - .trainerName = _("CRISTIAN"), -#line 10599 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 10600 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 10602 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10603 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10604 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10606 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10608 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 10607 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10610 - [DIFFICULTY_NORMAL][TRAINER_SYLVIA] = - { -#line 10611 - .trainerName = _("SYLVIA"), -#line 10612 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 10613 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 10614 -F_TRAINER_FEMALE | -#line 10615 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 10616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10619 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10621 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10620 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10623 - [DIFFICULTY_NORMAL][TRAINER_LEONARDO] = - { -#line 10624 - .trainerName = _("LEONARDO"), -#line 10625 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10626 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10628 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10629 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10630 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10632 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10634 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10633 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10636 - [DIFFICULTY_NORMAL][TRAINER_ATHENA] = - { -#line 10637 - .trainerName = _("ATHENA"), -#line 10638 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10639 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 10640 -F_TRAINER_FEMALE | -#line 10641 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10642 - .items = { ITEM_HYPER_POTION }, -#line 10643 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10644 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10646 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10648 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10647 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10649 - MOVE_THUNDER, - MOVE_THUNDER_WAVE, - MOVE_QUICK_ATTACK, - }, - }, - { -#line 10653 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10655 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10654 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 10656 - MOVE_SURF, - MOVE_THIEF, - }, - }, - }, - }, -#line 10659 - [DIFFICULTY_NORMAL][TRAINER_HARRISON] = - { -#line 10660 - .trainerName = _("HARRISON"), -#line 10661 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10662 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10664 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10665 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10666 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10668 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10670 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10669 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10672 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MT_CHIMNEY_2] = - { -#line 10673 - .trainerName = _("GRUNT"), -#line 10674 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10675 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10677 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10678 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10679 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10681 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10683 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10682 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10685 - [DIFFICULTY_NORMAL][TRAINER_CLARENCE] = - { -#line 10686 - .trainerName = _("CLARENCE"), -#line 10687 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 10688 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 10690 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10691 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10692 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10694 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10696 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10695 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10698 - [DIFFICULTY_NORMAL][TRAINER_TERRY] = - { -#line 10699 - .trainerName = _("TERRY"), -#line 10700 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10701 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10702 -F_TRAINER_FEMALE | -#line 10703 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10704 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10705 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10707 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10709 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10708 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10711 - [DIFFICULTY_NORMAL][TRAINER_NATE] = - { -#line 10712 - .trainerName = _("NATE"), -#line 10713 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 10714 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 10716 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 10717 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10718 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10720 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10722 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10721 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10724 - [DIFFICULTY_NORMAL][TRAINER_KATHLEEN] = - { -#line 10725 - .trainerName = _("KATHLEEN"), -#line 10726 - .trainerClass = TRAINER_CLASS_HEX_MANIAC, -#line 10727 - .trainerPic = TRAINER_PIC_HEX_MANIAC, - .encounterMusic_gender = -#line 10728 -F_TRAINER_FEMALE | -#line 10729 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 10730 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10731 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10733 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10735 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 10734 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10737 - [DIFFICULTY_NORMAL][TRAINER_CLIFFORD] = - { -#line 10738 - .trainerName = _("CLIFFORD"), -#line 10739 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 10740 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 10742 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 10743 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10744 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10746 - .species = SPECIES_GIRAFARIG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10748 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10747 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10750 - [DIFFICULTY_NORMAL][TRAINER_NICHOLAS] = - { -#line 10751 - .trainerName = _("NICHOLAS"), -#line 10752 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10753 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 10755 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10756 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10757 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10759 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10761 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10760 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10763 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_3] = - { -#line 10764 - .trainerName = _("GRUNT"), -#line 10765 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10766 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 10767 -F_TRAINER_FEMALE | -#line 10768 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10769 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10770 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10772 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10774 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10773 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10776 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10778 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10777 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10780 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_4] = - { -#line 10781 - .trainerName = _("GRUNT"), -#line 10782 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10783 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10785 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10786 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10787 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10789 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10791 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10790 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10793 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_5] = - { -#line 10794 - .trainerName = _("GRUNT"), -#line 10795 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10796 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10798 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10799 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10800 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10802 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10804 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10803 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10806 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_6] = - { -#line 10807 - .trainerName = _("GRUNT"), -#line 10808 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10809 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10811 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10812 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10813 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10815 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10817 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10816 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10819 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_SPACE_CENTER_7] = - { -#line 10820 - .trainerName = _("GRUNT"), -#line 10821 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 10822 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 10824 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10825 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10826 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10828 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10830 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10829 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10832 - [DIFFICULTY_NORMAL][TRAINER_MACEY] = - { -#line 10833 - .trainerName = _("MACEY"), -#line 10834 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 10835 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 10836 -F_TRAINER_FEMALE | -#line 10837 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10838 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10841 - .species = SPECIES_NATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10843 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10842 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10845 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TREECKO] = - { -#line 10846 - .trainerName = _("BRENDAN"), -#line 10847 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10848 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10850 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10851 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10852 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10854 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10856 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10855 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10858 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10860 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10859 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10862 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_MUDKIP] = - { -#line 10863 - .trainerName = _("BRENDAN"), -#line 10864 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10865 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10867 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10868 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10869 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10871 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10873 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10872 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10875 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10877 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10876 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10879 - [DIFFICULTY_NORMAL][TRAINER_PAXTON] = - { -#line 10880 - .trainerName = _("PAXTON"), -#line 10881 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 10882 - .trainerPic = TRAINER_PIC_EXPERT_M, - .encounterMusic_gender = -#line 10884 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 10885 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10886 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10888 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10890 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10889 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10892 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10894 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10893 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10896 - [DIFFICULTY_NORMAL][TRAINER_ISABELLA] = - { -#line 10897 - .trainerName = _("ISABELLA"), -#line 10898 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 10899 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, - .encounterMusic_gender = -#line 10900 -F_TRAINER_FEMALE | -#line 10901 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 10902 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10903 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 10905 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10907 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10906 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10909 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_WEATHER_INST_5] = - { -#line 10910 - .trainerName = _("GRUNT"), -#line 10911 - .trainerClass = TRAINER_CLASS_TEAM_AQUA, -#line 10912 - .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, - .encounterMusic_gender = -#line 10913 -F_TRAINER_FEMALE | -#line 10914 - TRAINER_ENCOUNTER_MUSIC_AQUA, -#line 10915 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10916 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10918 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10920 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10919 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10922 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10924 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10923 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10926 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MT_CHIMNEY] = - { -#line 10927 - .trainerName = _("TABITHA"), -#line 10928 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 10929 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 10931 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 10932 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10933 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 10935 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10937 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10936 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10939 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10941 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10940 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10943 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10945 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10944 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10947 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10949 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10948 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10951 - [DIFFICULTY_NORMAL][TRAINER_JONATHAN] = - { -#line 10952 - .trainerName = _("JONATHAN"), -#line 10953 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 10954 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 10956 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 10957 - .items = { ITEM_HYPER_POTION }, -#line 10958 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10959 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10961 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10963 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10962 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10965 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10967 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 10966 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10969 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_RUSTBORO_TORCHIC] = - { -#line 10970 - .trainerName = _("BRENDAN"), -#line 10971 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10972 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 10974 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 10975 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10976 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10978 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10980 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10979 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10982 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10984 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 10983 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 10986 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_MUDKIP] = - { -#line 10987 - .trainerName = _("MAY"), -#line 10988 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 10989 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 10990 -F_TRAINER_FEMALE | -#line 10991 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 10992 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 10993 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 10995 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 10997 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 10996 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 10999 - .species = SPECIES_TREECKO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11001 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11000 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11003 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MAGMA_HIDEOUT] = - { -#line 11004 - .trainerName = _("MAXIE"), -#line 11005 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 11006 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 11008 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 11009 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 11010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11011 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11013 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11015 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11014 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11017 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11019 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11018 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11021 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11023 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11022 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11025 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MT_CHIMNEY] = - { -#line 11026 - .trainerName = _("MAXIE"), -#line 11027 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 11028 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 11030 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 11031 - .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, -#line 11032 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11033 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11035 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11037 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11036 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11039 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11041 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11040 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11043 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11045 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 11044 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11047 - [DIFFICULTY_NORMAL][TRAINER_TIANA] = - { -#line 11048 - .trainerName = _("TIANA"), -#line 11049 - .trainerClass = TRAINER_CLASS_LASS, -#line 11050 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11051 -F_TRAINER_FEMALE | -#line 11052 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11056 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11058 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11057 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11060 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11062 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11061 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11064 - [DIFFICULTY_NORMAL][TRAINER_HALEY_1] = - { -#line 11065 - .trainerName = _("HALEY"), -#line 11066 - .trainerClass = TRAINER_CLASS_LASS, -#line 11067 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11068 -F_TRAINER_FEMALE | -#line 11069 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11070 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11071 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11073 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11075 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11074 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11077 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11079 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11078 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11081 - [DIFFICULTY_NORMAL][TRAINER_JANICE] = - { -#line 11082 - .trainerName = _("JANICE"), -#line 11083 - .trainerClass = TRAINER_CLASS_LASS, -#line 11084 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11085 -F_TRAINER_FEMALE | -#line 11086 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11087 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11088 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11090 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11092 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11091 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11094 - [DIFFICULTY_NORMAL][TRAINER_VIVI] = - { -#line 11095 - .trainerName = _("VIVI"), -#line 11096 - .trainerClass = TRAINER_CLASS_WINSTRATE, -#line 11097 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11098 -F_TRAINER_FEMALE | -#line 11099 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11100 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11101 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11103 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11105 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11104 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11107 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11109 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11108 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11111 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11113 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11112 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11115 - [DIFFICULTY_NORMAL][TRAINER_HALEY_2] = - { -#line 11116 - .trainerName = _("HALEY"), -#line 11117 - .trainerClass = TRAINER_CLASS_LASS, -#line 11118 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11119 -F_TRAINER_FEMALE | -#line 11120 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11121 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11122 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11124 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11126 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11125 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11128 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11130 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11129 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11132 - [DIFFICULTY_NORMAL][TRAINER_HALEY_3] = - { -#line 11133 - .trainerName = _("HALEY"), -#line 11134 - .trainerClass = TRAINER_CLASS_LASS, -#line 11135 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11136 -F_TRAINER_FEMALE | -#line 11137 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11138 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11139 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11141 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11143 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11142 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11145 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11147 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11146 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11149 - [DIFFICULTY_NORMAL][TRAINER_HALEY_4] = - { -#line 11150 - .trainerName = _("HALEY"), -#line 11151 - .trainerClass = TRAINER_CLASS_LASS, -#line 11152 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11153 -F_TRAINER_FEMALE | -#line 11154 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11156 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11158 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11160 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11159 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11162 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11164 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11163 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11166 - [DIFFICULTY_NORMAL][TRAINER_HALEY_5] = - { -#line 11167 - .trainerName = _("HALEY"), -#line 11168 - .trainerClass = TRAINER_CLASS_LASS, -#line 11169 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11170 -F_TRAINER_FEMALE | -#line 11171 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11172 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11173 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11175 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11177 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11176 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11179 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11181 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11180 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11183 - .species = SPECIES_BRELOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11185 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11184 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11187 - [DIFFICULTY_NORMAL][TRAINER_SALLY] = - { -#line 11188 - .trainerName = _("SALLY"), -#line 11189 - .trainerClass = TRAINER_CLASS_LASS, -#line 11190 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11191 -F_TRAINER_FEMALE | -#line 11192 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11193 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11194 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11196 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11198 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11197 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11200 - [DIFFICULTY_NORMAL][TRAINER_ROBIN] = - { -#line 11201 - .trainerName = _("ROBIN"), -#line 11202 - .trainerClass = TRAINER_CLASS_LASS, -#line 11203 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11204 -F_TRAINER_FEMALE | -#line 11205 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11206 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11207 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11209 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11211 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11210 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11213 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11215 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11214 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11217 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11219 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11218 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11221 - [DIFFICULTY_NORMAL][TRAINER_ANDREA] = - { -#line 11222 - .trainerName = _("ANDREA"), -#line 11223 - .trainerClass = TRAINER_CLASS_LASS, -#line 11224 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11225 -F_TRAINER_FEMALE | -#line 11226 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11227 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11228 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11230 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11232 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11231 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11234 - [DIFFICULTY_NORMAL][TRAINER_CRISSY] = - { -#line 11235 - .trainerName = _("CRISSY"), -#line 11236 - .trainerClass = TRAINER_CLASS_LASS, -#line 11237 - .trainerPic = TRAINER_PIC_LASS, - .encounterMusic_gender = -#line 11238 -F_TRAINER_FEMALE | -#line 11239 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11240 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11241 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11243 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11245 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11244 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11247 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11249 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11248 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11251 - [DIFFICULTY_NORMAL][TRAINER_RICK] = - { -#line 11252 - .trainerName = _("RICK"), -#line 11253 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11254 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11256 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11257 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11258 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11260 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11262 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11261 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11264 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11266 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11265 - .lvl = 4, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11268 - [DIFFICULTY_NORMAL][TRAINER_LYLE] = - { -#line 11269 - .trainerName = _("LYLE"), -#line 11270 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11271 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11273 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11274 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11275 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11277 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11279 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11278 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11281 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11283 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11282 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11285 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11287 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11286 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11289 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11291 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11290 - .lvl = 3, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11293 - [DIFFICULTY_NORMAL][TRAINER_JOSE] = - { -#line 11294 - .trainerName = _("JOSE"), -#line 11295 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11296 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11298 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11299 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11300 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11302 - .species = SPECIES_WURMPLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11304 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11303 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11306 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11308 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 11307 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11310 - [DIFFICULTY_NORMAL][TRAINER_DOUG] = - { -#line 11311 - .trainerName = _("DOUG"), -#line 11312 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11313 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11315 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11316 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11317 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11319 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11321 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11320 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11323 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11325 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11324 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11327 - [DIFFICULTY_NORMAL][TRAINER_GREG] = - { -#line 11328 - .trainerName = _("GREG"), -#line 11329 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11330 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11332 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11333 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11334 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11336 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11338 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11337 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11340 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11342 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11341 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11344 - [DIFFICULTY_NORMAL][TRAINER_KENT] = - { -#line 11345 - .trainerName = _("KENT"), -#line 11346 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11347 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11349 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11350 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11351 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11353 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11355 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11354 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11357 - [DIFFICULTY_NORMAL][TRAINER_JAMES_1] = - { -#line 11358 - .trainerName = _("JAMES"), -#line 11359 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11360 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11362 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11363 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11364 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11366 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11368 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11367 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11370 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11372 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11371 - .lvl = 6, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11374 - [DIFFICULTY_NORMAL][TRAINER_JAMES_2] = - { -#line 11375 - .trainerName = _("JAMES"), -#line 11376 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11377 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11379 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11380 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11381 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11383 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11385 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11384 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11387 - [DIFFICULTY_NORMAL][TRAINER_JAMES_3] = - { -#line 11388 - .trainerName = _("JAMES"), -#line 11389 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11390 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11392 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11393 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11394 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11396 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11398 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11397 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11400 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11402 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11401 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11404 - [DIFFICULTY_NORMAL][TRAINER_JAMES_4] = - { -#line 11405 - .trainerName = _("JAMES"), -#line 11406 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11407 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11409 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11410 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11411 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11413 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11415 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11414 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11417 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11419 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11418 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11421 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11423 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11422 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11425 - [DIFFICULTY_NORMAL][TRAINER_JAMES_5] = - { -#line 11426 - .trainerName = _("JAMES"), -#line 11427 - .trainerClass = TRAINER_CLASS_BUG_CATCHER, -#line 11428 - .trainerPic = TRAINER_PIC_BUG_CATCHER, - .encounterMusic_gender = -#line 11430 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 11431 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11432 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11434 - .species = SPECIES_SURSKIT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11436 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11435 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11438 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11440 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11439 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11442 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11444 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11443 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11446 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11448 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11447 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11450 - [DIFFICULTY_NORMAL][TRAINER_BRICE] = - { -#line 11451 - .trainerName = _("BRICE"), -#line 11452 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11453 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11455 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11456 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11457 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11459 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11461 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11460 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11463 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11465 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11464 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11467 - [DIFFICULTY_NORMAL][TRAINER_TRENT_1] = - { -#line 11468 - .trainerName = _("TRENT"), -#line 11469 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11470 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11472 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11473 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11474 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11476 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11478 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11477 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11480 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11482 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11481 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11484 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11486 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11485 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11488 - [DIFFICULTY_NORMAL][TRAINER_LENNY] = - { -#line 11489 - .trainerName = _("LENNY"), -#line 11490 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11491 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11493 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11494 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11495 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11497 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11499 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11498 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11501 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11503 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11502 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11505 - [DIFFICULTY_NORMAL][TRAINER_LUCAS_1] = - { -#line 11506 - .trainerName = _("LUCAS"), -#line 11507 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11508 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11510 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11511 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11512 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11514 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11516 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11515 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11518 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11520 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11519 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11522 - [DIFFICULTY_NORMAL][TRAINER_ALAN] = - { -#line 11523 - .trainerName = _("ALAN"), -#line 11524 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11525 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11527 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11528 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11529 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11531 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11533 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11532 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11535 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11537 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11536 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11539 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11541 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11540 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11543 - [DIFFICULTY_NORMAL][TRAINER_CLARK] = - { -#line 11544 - .trainerName = _("CLARK"), -#line 11545 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11546 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11548 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11549 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11550 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11552 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11554 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11553 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11556 - [DIFFICULTY_NORMAL][TRAINER_ERIC] = - { -#line 11557 - .trainerName = _("ERIC"), -#line 11558 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11559 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11561 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11562 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11563 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11565 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11567 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11566 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11569 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11571 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11570 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11573 - [DIFFICULTY_NORMAL][TRAINER_LUCAS_2] = - { -#line 11574 - .trainerName = _("LUCAS"), -#line 11575 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11576 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11578 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11579 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11580 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11582 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11584 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11583 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11585 - MOVE_SPLASH, - MOVE_WATER_GUN, - }, - }, - }, - }, -#line 11588 - [DIFFICULTY_NORMAL][TRAINER_MIKE_1] = - { -#line 11589 - .trainerName = _("MIKE"), -#line 11590 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11591 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11593 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11594 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11595 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11597 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11599 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11598 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11600 - MOVE_GUST, - MOVE_GROWL, - }, - }, - { -#line 11603 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11605 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11604 - .lvl = 10, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11606 - MOVE_BITE, - MOVE_SCARY_FACE, - }, - }, - }, - }, -#line 11609 - [DIFFICULTY_NORMAL][TRAINER_MIKE_2] = - { -#line 11610 - .trainerName = _("MIKE"), -#line 11611 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11612 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11614 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11615 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11616 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 11618 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11620 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11619 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11622 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11624 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11623 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11626 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11628 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11627 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11630 - [DIFFICULTY_NORMAL][TRAINER_TRENT_2] = - { -#line 11631 - .trainerName = _("TRENT"), -#line 11632 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11633 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11635 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11636 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11637 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11639 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11641 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11640 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11643 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11645 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11644 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11647 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11649 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11648 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11651 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11653 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11652 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11655 - [DIFFICULTY_NORMAL][TRAINER_TRENT_3] = - { -#line 11656 - .trainerName = _("TRENT"), -#line 11657 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11658 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11660 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11661 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11662 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11664 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11666 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11665 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11668 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11670 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11669 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11672 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11674 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11673 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11676 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11678 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11677 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11680 - [DIFFICULTY_NORMAL][TRAINER_TRENT_4] = - { -#line 11681 - .trainerName = _("TRENT"), -#line 11682 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11683 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11685 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11686 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11687 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11689 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11691 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11690 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11693 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11695 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11694 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11697 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11699 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11698 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11701 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11703 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11702 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11705 - [DIFFICULTY_NORMAL][TRAINER_TRENT_5] = - { -#line 11706 - .trainerName = _("TRENT"), -#line 11707 - .trainerClass = TRAINER_CLASS_HIKER, -#line 11708 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 11710 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 11711 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11712 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 11714 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11716 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11715 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11718 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11720 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11719 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11722 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11724 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11723 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11726 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11728 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11727 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11730 - [DIFFICULTY_NORMAL][TRAINER_DEZ_AND_LUKE] = - { -#line 11731 - .trainerName = _("DEZ & LUKE"), -#line 11732 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11733 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11735 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11736 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11737 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11739 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11741 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11740 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11743 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11745 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11744 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11747 - [DIFFICULTY_NORMAL][TRAINER_LEA_AND_JED] = - { -#line 11748 - .trainerName = _("LEA & JED"), -#line 11749 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11750 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11752 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11753 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11754 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11756 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11758 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11757 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11760 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11762 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11761 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11764 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_1] = - { -#line 11765 - .trainerName = _("KIRA & DAN"), -#line 11766 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11767 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11769 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11770 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11771 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11773 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11775 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11774 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11777 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11779 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11778 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11781 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_2] = - { -#line 11782 - .trainerName = _("KIRA & DAN"), -#line 11783 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11784 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11786 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11787 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11788 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11790 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11792 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11791 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11794 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11796 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 11795 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11798 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_3] = - { -#line 11799 - .trainerName = _("KIRA & DAN"), -#line 11800 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11801 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11803 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11804 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11805 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11807 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11809 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11808 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11811 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11813 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 11812 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11815 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_4] = - { -#line 11816 - .trainerName = _("KIRA & DAN"), -#line 11817 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11818 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11820 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11821 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11822 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11824 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11826 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11825 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11828 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11830 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 11829 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11832 - [DIFFICULTY_NORMAL][TRAINER_KIRA_AND_DAN_5] = - { -#line 11833 - .trainerName = _("KIRA & DAN"), -#line 11834 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 11835 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 11837 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 11838 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 11839 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11841 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11843 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11842 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 11845 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11847 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 11846 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11849 - [DIFFICULTY_NORMAL][TRAINER_JOHANNA] = - { -#line 11850 - .trainerName = _("JOHANNA"), -#line 11851 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 11852 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 11853 -F_TRAINER_FEMALE | -#line 11854 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 11855 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11856 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11858 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11860 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11859 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 11862 - [DIFFICULTY_NORMAL][TRAINER_GERALD] = - { -#line 11863 - .trainerName = _("GERALD"), -#line 11864 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 11865 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 11867 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 11868 - .items = { ITEM_HYPER_POTION }, -#line 11869 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11870 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11872 - .species = SPECIES_KECLEON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11874 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11873 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11875 - MOVE_FLAMETHROWER, - MOVE_FURY_SWIPES, - MOVE_FEINT_ATTACK, - MOVE_BIND, - }, - }, - }, - }, -#line 11880 - [DIFFICULTY_NORMAL][TRAINER_VIVIAN] = - { -#line 11881 - .trainerName = _("VIVIAN"), -#line 11882 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11883 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 11884 -F_TRAINER_FEMALE | -#line 11885 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11886 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11887 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11889 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11891 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11890 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11892 - MOVE_BIDE, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_THUNDER_PUNCH, - }, - }, - { -#line 11897 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11899 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11898 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11900 - MOVE_THUNDER_PUNCH, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_MEDITATE, - }, - }, - }, - }, -#line 11905 - [DIFFICULTY_NORMAL][TRAINER_DANIELLE] = - { -#line 11906 - .trainerName = _("DANIELLE"), -#line 11907 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 11908 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 11909 -F_TRAINER_FEMALE | -#line 11910 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 11911 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11912 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 11914 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11916 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 11915 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11917 - MOVE_BIDE, - MOVE_DETECT, - MOVE_CONFUSION, - MOVE_FIRE_PUNCH, - }, - }, - }, - }, -#line 11922 - [DIFFICULTY_NORMAL][TRAINER_HIDEO] = - { -#line 11923 - .trainerName = _("HIDEO"), -#line 11924 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11925 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11927 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11928 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11929 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11931 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11933 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11932 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11934 - MOVE_TACKLE, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - { -#line 11939 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11941 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11940 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11942 - MOVE_TACKLE, - MOVE_POISON_GAS, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - }, - }, -#line 11947 - [DIFFICULTY_NORMAL][TRAINER_KEIGO] = - { -#line 11948 - .trainerName = _("KEIGO"), -#line 11949 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11950 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11952 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11953 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11954 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11956 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11958 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11957 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11959 - MOVE_POISON_GAS, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - { -#line 11964 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11966 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11965 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11967 - MOVE_SAND_ATTACK, - MOVE_DOUBLE_TEAM, - MOVE_FURY_CUTTER, - MOVE_SWORDS_DANCE, - }, - }, - }, - }, -#line 11972 - [DIFFICULTY_NORMAL][TRAINER_RILEY] = - { -#line 11973 - .trainerName = _("RILEY"), -#line 11974 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 11975 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 11977 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 11978 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 11979 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 11981 - .species = SPECIES_NINCADA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11983 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11982 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11984 - MOVE_LEECH_LIFE, - MOVE_FURY_SWIPES, - MOVE_MIND_READER, - MOVE_DIG, - }, - }, - { -#line 11989 - .species = SPECIES_KOFFING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 11991 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 11990 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 11992 - MOVE_TACKLE, - MOVE_SELF_DESTRUCT, - MOVE_SLUDGE, - MOVE_SMOKESCREEN, - }, - }, - }, - }, -#line 11997 - [DIFFICULTY_NORMAL][TRAINER_FLINT] = - { -#line 11998 - .trainerName = _("FLINT"), -#line 11999 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 12000 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 12002 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12003 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12004 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12006 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12008 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12007 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12010 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12012 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12011 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12014 - [DIFFICULTY_NORMAL][TRAINER_ASHLEY] = - { -#line 12015 - .trainerName = _("ASHLEY"), -#line 12016 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 12017 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 12018 -F_TRAINER_FEMALE | -#line 12019 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12020 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12021 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12023 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12025 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12024 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12027 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12029 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12028 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12031 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12033 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12032 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12035 - [DIFFICULTY_NORMAL][TRAINER_WALLY_MAUVILLE] = - { -#line 12036 - .trainerName = _("WALLY"), -#line 12037 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12038 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12040 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12041 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12042 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12044 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12046 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 12045 - .lvl = 16, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12048 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_2] = - { -#line 12049 - .trainerName = _("WALLY"), -#line 12050 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12051 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12053 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12054 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12055 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12056 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12058 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12060 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12059 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12061 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12066 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12068 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12067 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12069 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12074 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12076 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12075 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12077 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12082 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12084 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12083 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12085 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12090 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12092 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12091 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12093 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12098 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_3] = - { -#line 12099 - .trainerName = _("WALLY"), -#line 12100 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12101 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12104 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12105 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12106 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12108 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12110 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12109 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12111 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12116 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12118 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12117 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12119 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12124 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12126 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12125 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12127 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12132 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12134 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12133 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12135 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12140 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12142 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12141 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12143 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12148 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_4] = - { -#line 12149 - .trainerName = _("WALLY"), -#line 12150 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12151 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12153 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12154 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12155 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12156 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12158 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12160 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12159 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12161 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12166 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12168 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12167 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12169 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12174 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12176 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12175 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12177 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12182 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12184 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12183 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12185 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12190 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12192 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12191 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12193 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12198 - [DIFFICULTY_NORMAL][TRAINER_WALLY_VR_5] = - { -#line 12199 - .trainerName = _("WALLY"), -#line 12200 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12201 - .trainerPic = TRAINER_PIC_WALLY, - .encounterMusic_gender = -#line 12203 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12204 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 12205 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12206 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 12208 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12210 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12209 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12211 - MOVE_AERIAL_ACE, - MOVE_SAFEGUARD, - MOVE_DRAGON_BREATH, - MOVE_DRAGON_DANCE, - }, - }, - { -#line 12216 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12218 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12217 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12219 - MOVE_SING, - MOVE_ASSIST, - MOVE_CHARM, - MOVE_FEINT_ATTACK, - }, - }, - { -#line 12224 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12226 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12225 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12227 - MOVE_MAGICAL_LEAF, - MOVE_LEECH_SEED, - MOVE_GIGA_DRAIN, - MOVE_TOXIC, - }, - }, - { -#line 12232 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12234 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12233 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12235 - MOVE_SUPERSONIC, - MOVE_THUNDERBOLT, - MOVE_TRI_ATTACK, - MOVE_SCREECH, - }, - }, - { -#line 12240 - .species = SPECIES_GARDEVOIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12242 - .iv = TRAINER_PARTY_IVS(30, 30, 30, 30, 30, 30), -#line 12241 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12243 - MOVE_DOUBLE_TEAM, - MOVE_CALM_MIND, - MOVE_PSYCHIC, - MOVE_FUTURE_SIGHT, - }, - }, - }, - }, -#line 12248 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_MUDKIP] = - { -#line 12249 - .trainerName = _("BRENDAN"), -#line 12250 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12251 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12253 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12254 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12255 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12257 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12259 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12258 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12261 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12263 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12262 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12265 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12267 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12266 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12269 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12271 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12270 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12273 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TREECKO] = - { -#line 12274 - .trainerName = _("BRENDAN"), -#line 12275 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12276 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12278 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12279 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12280 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12282 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12284 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12283 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12286 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12288 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12287 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12290 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12292 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12291 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12294 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12296 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12295 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12298 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_LILYCOVE_TORCHIC] = - { -#line 12299 - .trainerName = _("BRENDAN"), -#line 12300 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12301 - .trainerPic = TRAINER_PIC_BRENDAN, - .encounterMusic_gender = -#line 12303 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 12304 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12305 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12307 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12309 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12308 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12311 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12313 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12312 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12315 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12317 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12316 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12319 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12321 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12320 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12323 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_MUDKIP] = - { -#line 12324 - .trainerName = _("MAY"), -#line 12325 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12326 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12327 -F_TRAINER_FEMALE | -#line 12328 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12329 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12330 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12332 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12334 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12333 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12336 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12338 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12337 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12340 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12342 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12341 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12344 - .species = SPECIES_GROVYLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12346 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12345 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12348 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TREECKO] = - { -#line 12349 - .trainerName = _("MAY"), -#line 12350 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12351 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12352 -F_TRAINER_FEMALE | -#line 12353 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12355 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12357 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12359 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12358 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12361 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12363 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12362 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12365 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12367 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12366 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12369 - .species = SPECIES_COMBUSKEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12371 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12370 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12373 - [DIFFICULTY_NORMAL][TRAINER_MAY_LILYCOVE_TORCHIC] = - { -#line 12374 - .trainerName = _("MAY"), -#line 12375 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 12376 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 12377 -F_TRAINER_FEMALE | -#line 12378 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12379 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12380 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12382 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12384 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12383 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12386 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12388 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12387 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12390 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12392 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 12391 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12394 - .species = SPECIES_MARSHTOMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12396 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12395 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12398 - [DIFFICULTY_NORMAL][TRAINER_JONAH] = - { -#line 12399 - .trainerName = _("JONAH"), -#line 12400 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12401 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12403 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12404 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12405 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12407 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12409 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12408 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12411 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12413 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12412 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12415 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12417 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12416 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12419 - [DIFFICULTY_NORMAL][TRAINER_HENRY] = - { -#line 12420 - .trainerName = _("HENRY"), -#line 12421 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12422 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12424 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12425 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12426 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12428 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12430 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12429 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12432 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12434 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12433 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12436 - [DIFFICULTY_NORMAL][TRAINER_ROGER] = - { -#line 12437 - .trainerName = _("ROGER"), -#line 12438 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12439 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12441 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12442 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12443 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12445 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12447 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12446 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12449 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12451 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12450 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12453 - .species = SPECIES_GYARADOS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12455 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12454 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12457 - [DIFFICULTY_NORMAL][TRAINER_ALEXA] = - { -#line 12458 - .trainerName = _("ALEXA"), -#line 12459 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12460 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 12461 -F_TRAINER_FEMALE | -#line 12462 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12463 - .items = { ITEM_FULL_RESTORE }, -#line 12464 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12465 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12467 - .species = SPECIES_GLOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12469 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12468 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12471 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12473 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12472 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12475 - [DIFFICULTY_NORMAL][TRAINER_RUBEN] = - { -#line 12476 - .trainerName = _("RUBEN"), -#line 12477 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 12478 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 12480 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12481 - .items = { ITEM_HYPER_POTION }, -#line 12482 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12483 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12485 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12487 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12486 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12489 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12491 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 12490 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12493 - [DIFFICULTY_NORMAL][TRAINER_KOJI_1] = - { -#line 12494 - .trainerName = _("KOJI"), -#line 12495 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 12496 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 12498 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12499 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12500 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12502 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12504 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12503 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12506 - [DIFFICULTY_NORMAL][TRAINER_WAYNE] = - { -#line 12507 - .trainerName = _("WAYNE"), -#line 12508 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12509 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12511 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12512 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12513 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 12515 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12517 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12516 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12519 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12521 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12520 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12523 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12525 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12524 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12527 - [DIFFICULTY_NORMAL][TRAINER_AIDAN] = - { -#line 12528 - .trainerName = _("AIDAN"), -#line 12529 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 12530 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 12532 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 12533 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12534 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12536 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12538 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12537 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12540 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12542 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12541 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12544 - [DIFFICULTY_NORMAL][TRAINER_REED] = - { -#line 12545 - .trainerName = _("REED"), -#line 12546 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 12547 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 12549 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12550 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12551 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12553 - .species = SPECIES_SPHEAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12555 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12554 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12557 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12559 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12558 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12561 - [DIFFICULTY_NORMAL][TRAINER_TISHA] = - { -#line 12562 - .trainerName = _("TISHA"), -#line 12563 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 12564 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 12565 -F_TRAINER_FEMALE | -#line 12566 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12567 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12568 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12570 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12572 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12571 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12574 - [DIFFICULTY_NORMAL][TRAINER_TORI_AND_TIA] = - { -#line 12575 - .trainerName = _("TORI & TIA"), -#line 12576 - .trainerClass = TRAINER_CLASS_TWINS, -#line 12577 - .trainerPic = TRAINER_PIC_TWINS, - .encounterMusic_gender = -#line 12579 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12580 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12581 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12583 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12585 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12584 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12587 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12589 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12588 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12591 - [DIFFICULTY_NORMAL][TRAINER_KIM_AND_IRIS] = - { -#line 12592 - .trainerName = _("KIM & IRIS"), -#line 12593 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12594 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 12596 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12597 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12598 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12600 - .species = SPECIES_SWABLU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12602 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12601 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12603 - MOVE_SING, - MOVE_FURY_ATTACK, - MOVE_SAFEGUARD, - MOVE_AERIAL_ACE, - }, - }, - { -#line 12608 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12610 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12609 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12611 - MOVE_FLAMETHROWER, - MOVE_TAKE_DOWN, - MOVE_REST, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 12616 - [DIFFICULTY_NORMAL][TRAINER_TYRA_AND_IVY] = - { -#line 12617 - .trainerName = _("TYRA & IVY"), -#line 12618 - .trainerClass = TRAINER_CLASS_SR_AND_JR, -#line 12619 - .trainerPic = TRAINER_PIC_SR_AND_JR, - .encounterMusic_gender = -#line 12621 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 12622 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12623 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12625 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12627 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12626 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12628 - MOVE_GROWTH, - MOVE_STUN_SPORE, - MOVE_MEGA_DRAIN, - MOVE_LEECH_SEED, - }, - }, - { -#line 12633 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12635 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12634 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12636 - MOVE_DEFENSE_CURL, - MOVE_ROLLOUT, - MOVE_MUD_SPORT, - MOVE_ROCK_THROW, - }, - }, - }, - }, -#line 12641 - [DIFFICULTY_NORMAL][TRAINER_MEL_AND_PAUL] = - { -#line 12642 - .trainerName = _("MEL & PAUL"), -#line 12643 - .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, -#line 12644 - .trainerPic = TRAINER_PIC_YOUNG_COUPLE, - .encounterMusic_gender = -#line 12646 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12647 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12648 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12650 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12652 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12651 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12653 - MOVE_GUST, - MOVE_PSYBEAM, - MOVE_TOXIC, - MOVE_PROTECT, - }, - }, - { -#line 12658 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12660 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12659 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12661 - MOVE_GUST, - MOVE_MEGA_DRAIN, - MOVE_ATTRACT, - MOVE_STUN_SPORE, - }, - }, - }, - }, -#line 12666 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_1] = - { -#line 12667 - .trainerName = _("JOHN & JAY"), -#line 12668 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12669 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12671 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12672 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12673 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12675 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12677 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12676 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12678 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12683 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12685 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 12684 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12686 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12691 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_2] = - { -#line 12692 - .trainerName = _("JOHN & JAY"), -#line 12693 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12694 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12696 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12697 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12698 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12700 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12702 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12701 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12703 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12708 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12710 - .iv = TRAINER_PARTY_IVS(25, 25, 25, 25, 25, 25), -#line 12709 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12711 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12716 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_3] = - { -#line 12717 - .trainerName = _("JOHN & JAY"), -#line 12718 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12719 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12721 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12722 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12723 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12725 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12727 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12726 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12728 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12733 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12735 - .iv = TRAINER_PARTY_IVS(26, 26, 26, 26, 26, 26), -#line 12734 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12736 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12741 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_4] = - { -#line 12742 - .trainerName = _("JOHN & JAY"), -#line 12743 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12744 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12746 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12747 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12748 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12750 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12752 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12751 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12753 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12758 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12760 - .iv = TRAINER_PARTY_IVS(27, 27, 27, 27, 27, 27), -#line 12759 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12761 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12766 - [DIFFICULTY_NORMAL][TRAINER_JOHN_AND_JAY_5] = - { -#line 12767 - .trainerName = _("JOHN & JAY"), -#line 12768 - .trainerClass = TRAINER_CLASS_OLD_COUPLE, -#line 12769 - .trainerPic = TRAINER_PIC_OLD_COUPLE, - .encounterMusic_gender = -#line 12771 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 12772 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12773 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12775 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12777 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12776 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12778 - MOVE_PSYCHIC, - MOVE_FIRE_PUNCH, - MOVE_PSYCH_UP, - MOVE_PROTECT, - }, - }, - { -#line 12783 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12785 - .iv = TRAINER_PARTY_IVS(29, 29, 29, 29, 29, 29), -#line 12784 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 12786 - MOVE_FOCUS_PUNCH, - MOVE_ROCK_TOMB, - MOVE_REST, - MOVE_BELLY_DRUM, - }, - }, - }, - }, -#line 12791 - [DIFFICULTY_NORMAL][TRAINER_RELI_AND_IAN] = - { -#line 12792 - .trainerName = _("RELI & IAN"), -#line 12793 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12794 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12796 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12797 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12798 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12800 - .species = SPECIES_AZUMARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12802 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12801 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12804 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12806 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12805 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12808 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_1] = - { -#line 12809 - .trainerName = _("LILA & ROY"), -#line 12810 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12811 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12813 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12814 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12815 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12817 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12819 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12818 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12821 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12823 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12822 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12825 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_2] = - { -#line 12826 - .trainerName = _("LILA & ROY"), -#line 12827 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12828 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12830 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12831 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12832 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12834 - .species = SPECIES_CHINCHOU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12836 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12835 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12838 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12840 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12839 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12842 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_3] = - { -#line 12843 - .trainerName = _("LILA & ROY"), -#line 12844 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12845 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12847 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12848 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12849 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12851 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12853 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12852 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12855 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12857 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12856 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12859 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_4] = - { -#line 12860 - .trainerName = _("LILA & ROY"), -#line 12861 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12862 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12864 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12865 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12866 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12868 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12870 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12869 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12872 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12874 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12873 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12876 - [DIFFICULTY_NORMAL][TRAINER_LILA_AND_ROY_5] = - { -#line 12877 - .trainerName = _("LILA & ROY"), -#line 12878 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12879 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12881 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12882 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12883 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12885 - .species = SPECIES_LANTURN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12887 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12886 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12889 - .species = SPECIES_SHARPEDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12891 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12890 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12893 - [DIFFICULTY_NORMAL][TRAINER_LISA_AND_RAY] = - { -#line 12894 - .trainerName = _("LISA & RAY"), -#line 12895 - .trainerClass = TRAINER_CLASS_SIS_AND_BRO, -#line 12896 - .trainerPic = TRAINER_PIC_SIS_AND_BRO, - .encounterMusic_gender = -#line 12898 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 12899 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 12900 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12902 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12904 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12903 - .lvl = 27, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12906 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12908 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12907 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12910 - [DIFFICULTY_NORMAL][TRAINER_CHRIS] = - { -#line 12911 - .trainerName = _("CHRIS"), -#line 12912 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12913 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12915 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12916 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12917 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 12919 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12921 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12920 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12923 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12925 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12924 - .lvl = 20, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12927 - .species = SPECIES_FEEBAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12929 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12928 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12931 - .species = SPECIES_CARVANHA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12933 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12932 - .lvl = 23, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12935 - [DIFFICULTY_NORMAL][TRAINER_DAWSON] = - { -#line 12936 - .trainerName = _("DAWSON"), -#line 12937 - .trainerClass = TRAINER_CLASS_RICH_BOY, -#line 12938 - .trainerPic = TRAINER_PIC_RICH_BOY, - .encounterMusic_gender = -#line 12940 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 12941 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12942 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12944 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12944 - .heldItem = ITEM_NUGGET, -#line 12946 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12945 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12948 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12950 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12949 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12952 - [DIFFICULTY_NORMAL][TRAINER_SARAH] = - { -#line 12953 - .trainerName = _("SARAH"), -#line 12954 - .trainerClass = TRAINER_CLASS_LADY, -#line 12955 - .trainerPic = TRAINER_PIC_LADY, - .encounterMusic_gender = -#line 12956 -F_TRAINER_FEMALE | -#line 12957 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 12958 - .items = { ITEM_FULL_RESTORE }, -#line 12959 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12960 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 12962 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12963 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 12966 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12966 - .heldItem = ITEM_NUGGET, -#line 12968 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12967 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12970 - [DIFFICULTY_NORMAL][TRAINER_DARIAN] = - { -#line 12971 - .trainerName = _("DARIAN"), -#line 12972 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 12973 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 12975 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 12976 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12977 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12979 - .species = SPECIES_MAGIKARP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12981 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12980 - .lvl = 9, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12983 - [DIFFICULTY_NORMAL][TRAINER_HAILEY] = - { -#line 12984 - .trainerName = _("HAILEY"), -#line 12985 - .trainerClass = TRAINER_CLASS_TUBER_F, -#line 12986 - .trainerPic = TRAINER_PIC_TUBER_F, - .encounterMusic_gender = -#line 12987 -F_TRAINER_FEMALE | -#line 12988 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 12989 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 12990 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 12992 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 12994 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 12993 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 12996 - [DIFFICULTY_NORMAL][TRAINER_CHANDLER] = - { -#line 12997 - .trainerName = _("CHANDLER"), -#line 12998 - .trainerClass = TRAINER_CLASS_TUBER_M, -#line 12999 - .trainerPic = TRAINER_PIC_TUBER_M, - .encounterMusic_gender = -#line 13001 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13002 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13003 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13005 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13007 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13006 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13009 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13011 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13010 - .lvl = 12, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13013 - [DIFFICULTY_NORMAL][TRAINER_KALEB] = - { -#line 13014 - .trainerName = _("KALEB"), -#line 13015 - .trainerClass = TRAINER_CLASS_POKEFAN, -#line 13016 - .trainerPic = TRAINER_PIC_POKEFAN_M, - .encounterMusic_gender = -#line 13018 - TRAINER_ENCOUNTER_MUSIC_TWINS, -#line 13019 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13020 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13022 - .species = SPECIES_MINUN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13022 - .heldItem = ITEM_ORAN_BERRY, -#line 13024 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13023 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13026 - .species = SPECIES_PLUSLE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13026 - .heldItem = ITEM_ORAN_BERRY, -#line 13028 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13027 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13030 - [DIFFICULTY_NORMAL][TRAINER_JOSEPH] = - { -#line 13031 - .trainerName = _("JOSEPH"), -#line 13032 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13033 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13035 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13036 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13037 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13039 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13041 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13040 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13043 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13045 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13044 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13047 - [DIFFICULTY_NORMAL][TRAINER_ALYSSA] = - { -#line 13048 - .trainerName = _("ALYSSA"), -#line 13049 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13050 - .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13051 -F_TRAINER_FEMALE | -#line 13052 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13053 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13054 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13056 - .species = SPECIES_MAGNEMITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13058 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13057 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13060 - [DIFFICULTY_NORMAL][TRAINER_MARCOS] = - { -#line 13061 - .trainerName = _("MARCOS"), -#line 13062 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13063 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13065 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13066 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13067 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13069 - .species = SPECIES_VOLTORB, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13071 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13070 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13073 - [DIFFICULTY_NORMAL][TRAINER_RHETT] = - { -#line 13074 - .trainerName = _("RHETT"), -#line 13075 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 13076 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 13078 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13079 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13080 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13082 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13084 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13083 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13086 - [DIFFICULTY_NORMAL][TRAINER_TYRON] = - { -#line 13087 - .trainerName = _("TYRON"), -#line 13088 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13089 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13091 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13092 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13093 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13095 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13097 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13096 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13099 - [DIFFICULTY_NORMAL][TRAINER_CELINA] = - { -#line 13100 - .trainerName = _("CELINA"), -#line 13101 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13102 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 13103 -F_TRAINER_FEMALE | -#line 13104 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13105 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13106 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13108 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13110 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13109 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13112 - [DIFFICULTY_NORMAL][TRAINER_BIANCA] = - { -#line 13113 - .trainerName = _("BIANCA"), -#line 13114 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13115 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13116 -F_TRAINER_FEMALE | -#line 13117 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13118 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13119 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13121 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13123 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13122 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13125 - [DIFFICULTY_NORMAL][TRAINER_HAYDEN] = - { -#line 13126 - .trainerName = _("HAYDEN"), -#line 13127 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13128 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13130 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13131 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13132 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13134 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13136 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13135 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13138 - [DIFFICULTY_NORMAL][TRAINER_SOPHIE] = - { -#line 13139 - .trainerName = _("SOPHIE"), -#line 13140 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13141 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13142 -F_TRAINER_FEMALE | -#line 13143 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13144 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13145 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13147 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13149 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13148 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13151 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13153 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13152 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13155 - [DIFFICULTY_NORMAL][TRAINER_COBY] = - { -#line 13156 - .trainerName = _("COBY"), -#line 13157 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13158 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13160 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13161 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13162 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13164 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13166 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13165 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13168 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13170 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13169 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13172 - [DIFFICULTY_NORMAL][TRAINER_LAWRENCE] = - { -#line 13173 - .trainerName = _("LAWRENCE"), -#line 13174 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13175 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13177 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13178 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13179 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13181 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13183 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13182 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13185 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13187 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13186 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13189 - [DIFFICULTY_NORMAL][TRAINER_WYATT] = - { -#line 13190 - .trainerName = _("WYATT"), -#line 13191 - .trainerClass = TRAINER_CLASS_POKEMANIAC, -#line 13192 - .trainerPic = TRAINER_PIC_POKEMANIAC, - .encounterMusic_gender = -#line 13194 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13195 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13196 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13198 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13200 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13199 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13202 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13204 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13203 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13206 - [DIFFICULTY_NORMAL][TRAINER_ANGELINA] = - { -#line 13207 - .trainerName = _("ANGELINA"), -#line 13208 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13209 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13210 -F_TRAINER_FEMALE | -#line 13211 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13212 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13213 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13215 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13217 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13216 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13219 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13221 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13220 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13223 - [DIFFICULTY_NORMAL][TRAINER_KAI] = - { -#line 13224 - .trainerName = _("KAI"), -#line 13225 - .trainerClass = TRAINER_CLASS_FISHERMAN, -#line 13226 - .trainerPic = TRAINER_PIC_FISHERMAN, - .encounterMusic_gender = -#line 13228 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13229 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13230 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13232 - .species = SPECIES_BARBOACH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13234 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13233 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13236 - [DIFFICULTY_NORMAL][TRAINER_CHARLOTTE] = - { -#line 13237 - .trainerName = _("CHARLOTTE"), -#line 13238 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13239 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13240 -F_TRAINER_FEMALE | -#line 13241 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13242 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13243 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13245 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13247 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13246 - .lvl = 19, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13249 - [DIFFICULTY_NORMAL][TRAINER_DEANDRE] = - { -#line 13250 - .trainerName = _("DEANDRE"), -#line 13251 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13252 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 13254 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13258 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13260 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13259 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13262 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13264 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13263 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13266 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13268 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13267 - .lvl = 14, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13270 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_1] = - { -#line 13271 - .trainerName = _("GRUNT"), -#line 13272 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13273 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13275 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13276 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13277 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13279 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13281 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13280 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13283 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_2] = - { -#line 13284 - .trainerName = _("GRUNT"), -#line 13285 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13286 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13288 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13289 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13290 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13292 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13294 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13293 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13296 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_3] = - { -#line 13297 - .trainerName = _("GRUNT"), -#line 13298 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13299 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13301 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13302 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13303 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13305 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13307 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13306 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13309 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_4] = - { -#line 13310 - .trainerName = _("GRUNT"), -#line 13311 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13312 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13314 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13315 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13316 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13318 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13320 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13319 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13322 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13324 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13323 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13326 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_5] = - { -#line 13327 - .trainerName = _("GRUNT"), -#line 13328 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13329 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13331 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13332 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13333 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13335 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13337 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13336 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13339 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13341 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13340 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13343 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_6] = - { -#line 13344 - .trainerName = _("GRUNT"), -#line 13345 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13346 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13348 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13349 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13350 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13352 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13354 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13353 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13356 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_7] = - { -#line 13357 - .trainerName = _("GRUNT"), -#line 13358 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13359 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13361 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13362 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13363 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13365 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13367 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13366 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13369 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_8] = - { -#line 13370 - .trainerName = _("GRUNT"), -#line 13371 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13372 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13374 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13375 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13376 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13378 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13380 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13379 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13382 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_9] = - { -#line 13383 - .trainerName = _("GRUNT"), -#line 13384 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13385 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13387 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13388 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13389 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13391 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13393 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13392 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13395 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_10] = - { -#line 13396 - .trainerName = _("GRUNT"), -#line 13397 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13398 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13400 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13401 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13402 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13404 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13406 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13405 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13408 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_11] = - { -#line 13409 - .trainerName = _("GRUNT"), -#line 13410 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13411 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13413 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13414 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13415 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13417 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13419 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13418 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13421 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_12] = - { -#line 13422 - .trainerName = _("GRUNT"), -#line 13423 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13424 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13426 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13427 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13428 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13430 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13432 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13431 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13434 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_13] = - { -#line 13435 - .trainerName = _("GRUNT"), -#line 13436 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13437 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, - .encounterMusic_gender = -#line 13439 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13440 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13441 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13443 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13445 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13444 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13447 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_14] = - { -#line 13448 - .trainerName = _("GRUNT"), -#line 13449 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13450 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13451 -F_TRAINER_FEMALE | -#line 13452 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13453 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13454 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13456 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13458 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13457 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13460 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_15] = - { -#line 13461 - .trainerName = _("GRUNT"), -#line 13462 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13463 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13464 -F_TRAINER_FEMALE | -#line 13465 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13466 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13467 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13469 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13471 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13470 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13473 - [DIFFICULTY_NORMAL][TRAINER_GRUNT_MAGMA_HIDEOUT_16] = - { -#line 13474 - .trainerName = _("GRUNT"), -#line 13475 - .trainerClass = TRAINER_CLASS_TEAM_MAGMA, -#line 13476 - .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, - .encounterMusic_gender = -#line 13477 -F_TRAINER_FEMALE | -#line 13478 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13479 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13480 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13482 - .species = SPECIES_BALTOY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13484 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13483 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13486 - [DIFFICULTY_NORMAL][TRAINER_TABITHA_MAGMA_HIDEOUT] = - { -#line 13487 - .trainerName = _("TABITHA"), -#line 13488 - .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, -#line 13489 - .trainerPic = TRAINER_PIC_MAGMA_ADMIN, - .encounterMusic_gender = -#line 13491 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13492 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13493 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 13495 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13497 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13496 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13499 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13501 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13500 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13503 - .species = SPECIES_ZUBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13505 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13504 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13507 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13509 - .iv = TRAINER_PARTY_IVS(9, 9, 9, 9, 9, 9), -#line 13508 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13511 - [DIFFICULTY_NORMAL][TRAINER_DARCY] = - { -#line 13512 - .trainerName = _("DARCY"), -#line 13513 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13514 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 13515 -F_TRAINER_FEMALE | -#line 13516 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13517 - .items = { ITEM_HYPER_POTION }, -#line 13518 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13519 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13521 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13523 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13522 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13525 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13527 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13526 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13529 - [DIFFICULTY_NORMAL][TRAINER_MAXIE_MOSSDEEP] = - { -#line 13530 - .trainerName = _("MAXIE"), -#line 13531 - .trainerClass = TRAINER_CLASS_MAGMA_LEADER, -#line 13532 - .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, - .encounterMusic_gender = -#line 13534 - TRAINER_ENCOUNTER_MUSIC_MAGMA, -#line 13535 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13536 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13538 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13540 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13539 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13542 - .species = SPECIES_CROBAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13544 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13543 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13546 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13548 - .iv = TRAINER_PARTY_IVS(18, 18, 18, 18, 18, 18), -#line 13547 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13550 - [DIFFICULTY_NORMAL][TRAINER_PETE] = - { -#line 13551 - .trainerName = _("PETE"), -#line 13552 - .trainerClass = TRAINER_CLASS_SWIMMER_M, -#line 13553 - .trainerPic = TRAINER_PIC_SWIMMER_M, - .encounterMusic_gender = -#line 13555 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13556 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13557 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13559 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13561 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13560 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13563 - [DIFFICULTY_NORMAL][TRAINER_ISABELLE] = - { -#line 13564 - .trainerName = _("ISABELLE"), -#line 13565 - .trainerClass = TRAINER_CLASS_SWIMMER_F, -#line 13566 - .trainerPic = TRAINER_PIC_SWIMMER_F, - .encounterMusic_gender = -#line 13567 -F_TRAINER_FEMALE | -#line 13568 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13569 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13570 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13572 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13574 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13573 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13576 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_1] = - { -#line 13577 - .trainerName = _("ANDRES"), -#line 13578 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13579 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13581 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13582 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13583 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13585 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13587 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13586 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13589 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13591 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13590 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13593 - [DIFFICULTY_NORMAL][TRAINER_JOSUE] = - { -#line 13594 - .trainerName = _("JOSUE"), -#line 13595 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13596 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13598 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13599 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13600 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13602 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13604 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13603 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13606 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13608 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13607 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13610 - [DIFFICULTY_NORMAL][TRAINER_CAMRON] = - { -#line 13611 - .trainerName = _("CAMRON"), -#line 13612 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13613 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 13615 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 13616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13619 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13621 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13620 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13623 - [DIFFICULTY_NORMAL][TRAINER_CORY_1] = - { -#line 13624 - .trainerName = _("CORY"), -#line 13625 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 13626 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 13628 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13629 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13630 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13632 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13634 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13633 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13636 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13638 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13637 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13640 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13642 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13641 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13644 - [DIFFICULTY_NORMAL][TRAINER_CAROLINA] = - { -#line 13645 - .trainerName = _("CAROLINA"), -#line 13646 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13647 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 13648 -F_TRAINER_FEMALE | -#line 13649 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13650 - .items = { ITEM_HYPER_POTION }, -#line 13651 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13652 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 13654 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13656 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13655 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13658 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13660 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13659 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13662 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13664 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 13663 - .lvl = 24, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13666 - [DIFFICULTY_NORMAL][TRAINER_ELIJAH] = - { -#line 13667 - .trainerName = _("ELIJAH"), -#line 13668 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 13669 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 13671 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13672 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13673 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13675 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13677 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13676 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13679 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13681 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13680 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13683 - [DIFFICULTY_NORMAL][TRAINER_CELIA] = - { -#line 13684 - .trainerName = _("CELIA"), -#line 13685 - .trainerClass = TRAINER_CLASS_PICNICKER, -#line 13686 - .trainerPic = TRAINER_PIC_PICNICKER, - .encounterMusic_gender = -#line 13687 -F_TRAINER_FEMALE | -#line 13688 - TRAINER_ENCOUNTER_MUSIC_GIRL, -#line 13689 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13690 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13692 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13694 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13693 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13696 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13698 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13697 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13700 - [DIFFICULTY_NORMAL][TRAINER_BRYAN] = - { -#line 13701 - .trainerName = _("BRYAN"), -#line 13702 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 13703 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 13705 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13706 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13707 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13709 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13711 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13710 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13713 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13715 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13714 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13717 - [DIFFICULTY_NORMAL][TRAINER_BRANDEN] = - { -#line 13718 - .trainerName = _("BRANDEN"), -#line 13719 - .trainerClass = TRAINER_CLASS_CAMPER, -#line 13720 - .trainerPic = TRAINER_PIC_CAMPER, - .encounterMusic_gender = -#line 13722 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13723 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13724 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13726 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13728 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13727 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13730 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13732 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13731 - .lvl = 22, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13734 - [DIFFICULTY_NORMAL][TRAINER_BRYANT] = - { -#line 13735 - .trainerName = _("BRYANT"), -#line 13736 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13737 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13739 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13740 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13741 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13743 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13745 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13744 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13747 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13749 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13748 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13751 - [DIFFICULTY_NORMAL][TRAINER_SHAYLA] = - { -#line 13752 - .trainerName = _("SHAYLA"), -#line 13753 - .trainerClass = TRAINER_CLASS_AROMA_LADY, -#line 13754 - .trainerPic = TRAINER_PIC_AROMA_LADY, - .encounterMusic_gender = -#line 13755 -F_TRAINER_FEMALE | -#line 13756 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13757 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13758 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13760 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13762 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13761 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13764 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13766 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13765 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13768 - [DIFFICULTY_NORMAL][TRAINER_KYRA] = - { -#line 13769 - .trainerName = _("KYRA"), -#line 13770 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13771 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13772 -F_TRAINER_FEMALE | -#line 13773 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13774 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13775 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13777 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13779 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13778 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13781 - .species = SPECIES_DODRIO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13783 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13782 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13785 - [DIFFICULTY_NORMAL][TRAINER_JAIDEN] = - { -#line 13786 - .trainerName = _("JAIDEN"), -#line 13787 - .trainerClass = TRAINER_CLASS_NINJA_BOY, -#line 13788 - .trainerPic = TRAINER_PIC_NINJA_BOY, - .encounterMusic_gender = -#line 13790 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 13791 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13792 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13794 - .species = SPECIES_NINJASK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13796 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13795 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13798 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13800 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13799 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13802 - [DIFFICULTY_NORMAL][TRAINER_ALIX] = - { -#line 13803 - .trainerName = _("ALIX"), -#line 13804 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13805 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13806 -F_TRAINER_FEMALE | -#line 13807 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13808 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13809 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13811 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13813 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13812 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13815 - .species = SPECIES_KIRLIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13817 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13816 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13819 - [DIFFICULTY_NORMAL][TRAINER_HELENE] = - { -#line 13820 - .trainerName = _("HELENE"), -#line 13821 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13822 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 13823 -F_TRAINER_FEMALE | -#line 13824 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13825 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13826 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13828 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13830 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13829 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13832 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13834 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13833 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13836 - [DIFFICULTY_NORMAL][TRAINER_MARLENE] = - { -#line 13837 - .trainerName = _("MARLENE"), -#line 13838 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13839 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13840 -F_TRAINER_FEMALE | -#line 13841 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13842 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13843 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13845 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13847 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13846 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13849 - .species = SPECIES_SPOINK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13851 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13850 - .lvl = 18, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13853 - [DIFFICULTY_NORMAL][TRAINER_DEVAN] = - { -#line 13854 - .trainerName = _("DEVAN"), -#line 13855 - .trainerClass = TRAINER_CLASS_HIKER, -#line 13856 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 13858 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13860 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13862 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13864 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13863 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13866 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13868 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13867 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13870 - [DIFFICULTY_NORMAL][TRAINER_JOHNSON] = - { -#line 13871 - .trainerName = _("JOHNSON"), -#line 13872 - .trainerClass = TRAINER_CLASS_YOUNGSTER, -#line 13873 - .trainerPic = TRAINER_PIC_YOUNGSTER, - .encounterMusic_gender = -#line 13875 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 13876 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13877 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13879 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13881 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13880 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13883 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13885 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13884 - .lvl = 8, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13887 - [DIFFICULTY_NORMAL][TRAINER_MELINA] = - { -#line 13888 - .trainerName = _("MELINA"), -#line 13889 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 13890 - .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, - .encounterMusic_gender = -#line 13891 -F_TRAINER_FEMALE | -#line 13892 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13893 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13894 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13896 - .species = SPECIES_DODUO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13898 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13897 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13900 - [DIFFICULTY_NORMAL][TRAINER_BRANDI] = - { -#line 13901 - .trainerName = _("BRANDI"), -#line 13902 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 13903 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 13904 -F_TRAINER_FEMALE | -#line 13905 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13906 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13907 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13909 - .species = SPECIES_RALTS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13911 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13910 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13913 - [DIFFICULTY_NORMAL][TRAINER_AISHA] = - { -#line 13914 - .trainerName = _("AISHA"), -#line 13915 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 13916 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 13917 -F_TRAINER_FEMALE | -#line 13918 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13919 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13920 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13922 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13924 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13923 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13926 - [DIFFICULTY_NORMAL][TRAINER_MAKAYLA] = - { -#line 13927 - .trainerName = _("MAKAYLA"), -#line 13928 - .trainerClass = TRAINER_CLASS_EXPERT, -#line 13929 - .trainerPic = TRAINER_PIC_EXPERT_F, - .encounterMusic_gender = -#line 13930 -F_TRAINER_FEMALE | -#line 13931 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13932 - .items = { ITEM_HYPER_POTION }, -#line 13933 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13934 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13936 - .species = SPECIES_ROSELIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13938 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13937 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13940 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13942 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13941 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13944 - [DIFFICULTY_NORMAL][TRAINER_FABIAN] = - { -#line 13945 - .trainerName = _("FABIAN"), -#line 13946 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 13947 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 13949 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 13950 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13951 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13953 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13955 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13954 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13957 - [DIFFICULTY_NORMAL][TRAINER_DAYTON] = - { -#line 13958 - .trainerName = _("DAYTON"), -#line 13959 - .trainerClass = TRAINER_CLASS_KINDLER, -#line 13960 - .trainerPic = TRAINER_PIC_KINDLER, - .encounterMusic_gender = -#line 13962 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 13963 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13964 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 13966 - .species = SPECIES_SLUGMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13968 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13967 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 13970 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13972 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13971 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13974 - [DIFFICULTY_NORMAL][TRAINER_RACHEL] = - { -#line 13975 - .trainerName = _("RACHEL"), -#line 13976 - .trainerClass = TRAINER_CLASS_PARASOL_LADY, -#line 13977 - .trainerPic = TRAINER_PIC_PARASOL_LADY, - .encounterMusic_gender = -#line 13978 -F_TRAINER_FEMALE | -#line 13979 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 13980 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13981 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13983 - .species = SPECIES_GOLDEEN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13985 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 13984 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 13987 - [DIFFICULTY_NORMAL][TRAINER_LEONEL] = - { -#line 13988 - .trainerName = _("LEONEL"), -#line 13989 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 13990 - .trainerPic = TRAINER_PIC_COOLTRAINER_M, - .encounterMusic_gender = -#line 13992 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 13993 - .items = { ITEM_HYPER_POTION }, -#line 13994 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 13995 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 13997 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 13999 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 13998 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14000 - MOVE_THUNDER, - MOVE_QUICK_ATTACK, - MOVE_THUNDER_WAVE, - }, - }, - }, - }, -#line 14004 - [DIFFICULTY_NORMAL][TRAINER_CALLIE] = - { -#line 14005 - .trainerName = _("CALLIE"), -#line 14006 - .trainerClass = TRAINER_CLASS_BATTLE_GIRL, -#line 14007 - .trainerPic = TRAINER_PIC_BATTLE_GIRL, - .encounterMusic_gender = -#line 14008 -F_TRAINER_FEMALE | -#line 14009 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 14010 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14011 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14013 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14015 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14014 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14017 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14019 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14018 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14021 - [DIFFICULTY_NORMAL][TRAINER_CALE] = - { -#line 14022 - .trainerName = _("CALE"), -#line 14023 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 14024 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 14026 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 14027 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14028 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14030 - .species = SPECIES_DUSTOX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14032 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14031 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14034 - .species = SPECIES_BEAUTIFLY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14036 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 14035 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14038 - [DIFFICULTY_NORMAL][TRAINER_MYLES] = - { -#line 14039 - .trainerName = _("MYLES"), -#line 14040 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 14041 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, - .encounterMusic_gender = -#line 14043 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14044 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14045 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14047 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14049 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14048 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14051 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14053 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14052 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14055 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14057 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14056 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14059 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14061 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14060 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14063 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14065 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14064 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14067 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14069 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14068 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14071 - [DIFFICULTY_NORMAL][TRAINER_PAT] = - { -#line 14072 - .trainerName = _("PAT"), -#line 14073 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 14074 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 14075 -F_TRAINER_FEMALE | -#line 14076 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14077 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14078 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14080 - .species = SPECIES_POOCHYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14082 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14081 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14084 - .species = SPECIES_SHROOMISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14086 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14085 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14088 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14090 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14089 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14092 - .species = SPECIES_MARILL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14094 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14093 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14096 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14098 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14097 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14100 - .species = SPECIES_GULPIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14102 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 14101 - .lvl = 25, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14104 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_1] = - { -#line 14105 - .trainerName = _("CRISTIN"), -#line 14106 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 14107 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 14108 -F_TRAINER_FEMALE | -#line 14109 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 14110 - .items = { ITEM_HYPER_POTION }, -#line 14111 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14112 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14114 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14116 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14115 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14118 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14120 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 14119 - .lvl = 29, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14122 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TREECKO] = - { -#line 14123 - .trainerName = _("MAY"), -#line 14124 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 14125 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 14126 -F_TRAINER_FEMALE | -#line 14127 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14128 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14129 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14131 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14133 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14132 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14135 - .species = SPECIES_TORCHIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14137 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14136 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14139 - [DIFFICULTY_NORMAL][TRAINER_MAY_RUSTBORO_TORCHIC] = - { -#line 14140 - .trainerName = _("MAY"), -#line 14141 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 14142 - .trainerPic = TRAINER_PIC_MAY, - .encounterMusic_gender = -#line 14143 -F_TRAINER_FEMALE | -#line 14144 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14145 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 14146 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 14148 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14150 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 14149 - .lvl = 13, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 14152 - .species = SPECIES_MUDKIP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14154 - .iv = TRAINER_PARTY_IVS(6, 6, 6, 6, 6, 6), -#line 14153 - .lvl = 15, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 14156 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_2] = - { -#line 14157 - .trainerName = _("ROXANNE"), -#line 14158 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14159 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14160 -F_TRAINER_FEMALE | -#line 14161 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14162 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14163 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14164 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14166 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14168 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14167 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14169 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_MAGNITUDE, - MOVE_EXPLOSION, - }, - }, - { -#line 14174 - .species = SPECIES_KABUTO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14174 - .heldItem = ITEM_SITRUS_BERRY, -#line 14176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14175 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14177 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14182 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14184 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14183 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14185 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14190 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14190 - .heldItem = ITEM_SITRUS_BERRY, -#line 14192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14191 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14193 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14198 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_3] = - { -#line 14199 - .trainerName = _("ROXANNE"), -#line 14200 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14201 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14202 -F_TRAINER_FEMALE | -#line 14203 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14204 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14205 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14206 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14208 - .species = SPECIES_OMANYTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14210 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14209 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14211 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14216 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14218 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14217 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14219 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_MAGNITUDE, - MOVE_EXPLOSION, - }, - }, - { -#line 14224 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14224 - .heldItem = ITEM_SITRUS_BERRY, -#line 14226 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14225 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14227 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14232 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14234 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14233 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14235 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14240 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14240 - .heldItem = ITEM_SITRUS_BERRY, -#line 14242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14241 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14243 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14248 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_4] = - { -#line 14249 - .trainerName = _("ROXANNE"), -#line 14250 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14251 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14252 -F_TRAINER_FEMALE | -#line 14253 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14254 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14255 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14256 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14258 - .species = SPECIES_OMASTAR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14260 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14259 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14261 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14266 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14268 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14267 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14269 - MOVE_PROTECT, - MOVE_ROLLOUT, - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - }, - }, - { -#line 14274 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14274 - .heldItem = ITEM_SITRUS_BERRY, -#line 14276 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14275 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14277 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14282 - .species = SPECIES_ONIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14284 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14283 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14285 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14290 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14290 - .heldItem = ITEM_SITRUS_BERRY, -#line 14292 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14291 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14293 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14298 - [DIFFICULTY_NORMAL][TRAINER_ROXANNE_5] = - { -#line 14299 - .trainerName = _("ROXANNE"), -#line 14300 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14301 - .trainerPic = TRAINER_PIC_LEADER_ROXANNE, - .encounterMusic_gender = -#line 14302 -F_TRAINER_FEMALE | -#line 14303 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14304 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14305 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14306 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14308 - .species = SPECIES_AERODACTYL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14310 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14309 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14311 - MOVE_ROCK_SLIDE, - MOVE_HYPER_BEAM, - MOVE_SUPERSONIC, - MOVE_PROTECT, - }, - }, - { -#line 14316 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14318 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14317 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14319 - MOVE_FOCUS_PUNCH, - MOVE_ROLLOUT, - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - }, - }, - { -#line 14324 - .species = SPECIES_OMASTAR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14326 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14325 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14327 - MOVE_PROTECT, - MOVE_ICE_BEAM, - MOVE_ROCK_SLIDE, - MOVE_SURF, - }, - }, - { -#line 14332 - .species = SPECIES_KABUTOPS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14332 - .heldItem = ITEM_SITRUS_BERRY, -#line 14334 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14333 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14335 - MOVE_SWORDS_DANCE, - MOVE_ICE_BEAM, - MOVE_SURF, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14340 - .species = SPECIES_STEELIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14342 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14341 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14343 - MOVE_IRON_TAIL, - MOVE_EXPLOSION, - MOVE_ROAR, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14348 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14348 - .heldItem = ITEM_SITRUS_BERRY, -#line 14350 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14349 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14351 - MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, - MOVE_PROTECT, - MOVE_ROCK_SLIDE, - }, - }, - }, - }, -#line 14356 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_2] = - { -#line 14357 - .trainerName = _("BRAWLY"), -#line 14358 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14359 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14361 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14362 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14363 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14364 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14366 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14366 - .heldItem = ITEM_SITRUS_BERRY, -#line 14368 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14367 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14369 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14374 - .species = SPECIES_MEDITITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14376 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14375 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14377 - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14382 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14384 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14383 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14385 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14390 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14390 - .heldItem = ITEM_SITRUS_BERRY, -#line 14392 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14391 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14393 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14398 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_3] = - { -#line 14399 - .trainerName = _("BRAWLY"), -#line 14400 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14401 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14403 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14404 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14405 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14406 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14408 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14408 - .heldItem = ITEM_SITRUS_BERRY, -#line 14410 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14409 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14411 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14416 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14418 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14417 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14419 - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14424 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14426 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14425 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14427 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14432 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14432 - .heldItem = ITEM_SITRUS_BERRY, -#line 14434 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14433 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14435 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14440 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_4] = - { -#line 14441 - .trainerName = _("BRAWLY"), -#line 14442 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14443 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14445 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14446 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14447 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14448 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14450 - .species = SPECIES_HITMONCHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14452 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14451 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14453 - MOVE_SKY_UPPERCUT, - MOVE_PROTECT, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - }, - }, - { -#line 14458 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14458 - .heldItem = ITEM_SITRUS_BERRY, -#line 14460 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14459 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14461 - MOVE_KARATE_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14466 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14468 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14467 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14469 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_PSYCHIC, - }, - }, - { -#line 14474 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14476 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14475 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14477 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14482 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14482 - .heldItem = ITEM_SITRUS_BERRY, -#line 14484 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14483 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14485 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14490 - [DIFFICULTY_NORMAL][TRAINER_BRAWLY_5] = - { -#line 14491 - .trainerName = _("BRAWLY"), -#line 14492 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14493 - .trainerPic = TRAINER_PIC_LEADER_BRAWLY, - .encounterMusic_gender = -#line 14495 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14496 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14497 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14498 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14500 - .species = SPECIES_HITMONLEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14502 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14501 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14503 - MOVE_MEGA_KICK, - MOVE_FOCUS_PUNCH, - MOVE_EARTHQUAKE, - MOVE_BULK_UP, - }, - }, - { -#line 14508 - .species = SPECIES_HITMONCHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14510 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14509 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14511 - MOVE_SKY_UPPERCUT, - MOVE_PROTECT, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - }, - }, - { -#line 14516 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14516 - .heldItem = ITEM_SITRUS_BERRY, -#line 14518 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14517 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14519 - MOVE_CROSS_CHOP, - MOVE_ROCK_SLIDE, - MOVE_FOCUS_PUNCH, - MOVE_BULK_UP, - }, - }, - { -#line 14524 - .species = SPECIES_MEDICHAM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14526 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14525 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14527 - MOVE_FOCUS_PUNCH, - MOVE_LIGHT_SCREEN, - MOVE_REFLECT, - MOVE_PSYCHIC, - }, - }, - { -#line 14532 - .species = SPECIES_HITMONTOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14534 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14533 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14535 - MOVE_PURSUIT, - MOVE_COUNTER, - MOVE_PROTECT, - MOVE_TRIPLE_KICK, - }, - }, - { -#line 14540 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14540 - .heldItem = ITEM_SITRUS_BERRY, -#line 14542 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14541 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14543 - MOVE_FAKE_OUT, - MOVE_FOCUS_PUNCH, - MOVE_BELLY_DRUM, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 14548 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_2] = - { -#line 14549 - .trainerName = _("WATTSON"), -#line 14550 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14551 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14553 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14554 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14555 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14556 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14558 - .species = SPECIES_MAREEP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14560 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14559 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14561 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14566 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14568 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14567 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14569 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14574 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14574 - .heldItem = ITEM_SITRUS_BERRY, -#line 14576 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14575 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14577 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14582 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14582 - .heldItem = ITEM_SITRUS_BERRY, -#line 14584 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14583 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14585 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14590 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_3] = - { -#line 14591 - .trainerName = _("WATTSON"), -#line 14592 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14593 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14595 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14596 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14597 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14598 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14600 - .species = SPECIES_PIKACHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14602 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14601 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14603 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_SHOCK_WAVE, - }, - }, - { -#line 14608 - .species = SPECIES_FLAAFFY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14610 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14609 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14611 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14616 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14618 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14617 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14619 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14624 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14624 - .heldItem = ITEM_SITRUS_BERRY, -#line 14626 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14625 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14627 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14632 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14632 - .heldItem = ITEM_SITRUS_BERRY, -#line 14634 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14633 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14635 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14640 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_4] = - { -#line 14641 - .trainerName = _("WATTSON"), -#line 14642 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14643 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14645 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14646 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14647 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14648 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14650 - .species = SPECIES_RAICHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14652 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14651 - .lvl = 44, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14653 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - }, - }, - { -#line 14658 - .species = SPECIES_AMPHAROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14660 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14659 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14661 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14666 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14668 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14667 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14669 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14674 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14674 - .heldItem = ITEM_SITRUS_BERRY, -#line 14676 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14675 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14677 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14682 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14682 - .heldItem = ITEM_SITRUS_BERRY, -#line 14684 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14683 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14685 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14690 - [DIFFICULTY_NORMAL][TRAINER_WATTSON_5] = - { -#line 14691 - .trainerName = _("WATTSON"), -#line 14692 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14693 - .trainerPic = TRAINER_PIC_LEADER_WATTSON, - .encounterMusic_gender = -#line 14695 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14696 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14697 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14698 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14700 - .species = SPECIES_ELECTABUZZ, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14702 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14701 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14703 - MOVE_SWIFT, - MOVE_FOCUS_PUNCH, - MOVE_THUNDER_PUNCH, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14708 - .species = SPECIES_RAICHU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14710 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14709 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14711 - MOVE_THUNDER, - MOVE_SLAM, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - }, - }, - { -#line 14716 - .species = SPECIES_AMPHAROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14718 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14717 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14719 - MOVE_THUNDER, - MOVE_PROTECT, - MOVE_THUNDER_WAVE, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 14724 - .species = SPECIES_ELECTRODE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14726 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14725 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14727 - MOVE_ROLLOUT, - MOVE_THUNDER, - MOVE_EXPLOSION, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14732 - .species = SPECIES_MAGNETON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14732 - .heldItem = ITEM_SITRUS_BERRY, -#line 14734 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14733 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14735 - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_THUNDER, - MOVE_RAIN_DANCE, - }, - }, - { -#line 14740 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14740 - .heldItem = ITEM_SITRUS_BERRY, -#line 14742 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14741 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14743 - MOVE_BITE, - MOVE_THUNDER_WAVE, - MOVE_THUNDER, - MOVE_PROTECT, - }, - }, - }, - }, -#line 14748 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_2] = - { -#line 14749 - .trainerName = _("FLANNERY"), -#line 14750 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14751 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14752 -F_TRAINER_FEMALE | -#line 14753 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14754 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14755 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14756 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14758 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14758 - .heldItem = ITEM_WHITE_HERB, -#line 14760 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14759 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14761 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14766 - .species = SPECIES_PONYTA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14768 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14767 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14769 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14774 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14774 - .heldItem = ITEM_WHITE_HERB, -#line 14776 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14775 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14777 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14782 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14782 - .heldItem = ITEM_WHITE_HERB, -#line 14784 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14783 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14785 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14790 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_3] = - { -#line 14791 - .trainerName = _("FLANNERY"), -#line 14792 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14793 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14794 -F_TRAINER_FEMALE | -#line 14795 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14796 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14797 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14798 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 14800 - .species = SPECIES_GROWLITHE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14802 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14801 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14803 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_ROAR, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14808 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14808 - .heldItem = ITEM_WHITE_HERB, -#line 14810 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14809 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14811 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14816 - .species = SPECIES_PONYTA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14818 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14817 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14819 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14824 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14824 - .heldItem = ITEM_WHITE_HERB, -#line 14826 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14825 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14827 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14832 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14832 - .heldItem = ITEM_WHITE_HERB, -#line 14834 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14833 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14835 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14840 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_4] = - { -#line 14841 - .trainerName = _("FLANNERY"), -#line 14842 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14843 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14844 -F_TRAINER_FEMALE | -#line 14845 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14846 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14847 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14848 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14850 - .species = SPECIES_HOUNDOUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14852 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14851 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14853 - MOVE_ROAR, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14858 - .species = SPECIES_GROWLITHE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14860 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14859 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14861 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_SUNNY_DAY, - MOVE_ROAR, - }, - }, - { -#line 14866 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14866 - .heldItem = ITEM_WHITE_HERB, -#line 14868 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14867 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14869 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14874 - .species = SPECIES_RAPIDASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14876 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14875 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14877 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14882 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14882 - .heldItem = ITEM_WHITE_HERB, -#line 14884 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14883 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14885 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14890 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14890 - .heldItem = ITEM_WHITE_HERB, -#line 14892 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14891 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14893 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14898 - [DIFFICULTY_NORMAL][TRAINER_FLANNERY_5] = - { -#line 14899 - .trainerName = _("FLANNERY"), -#line 14900 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14901 - .trainerPic = TRAINER_PIC_LEADER_FLANNERY, - .encounterMusic_gender = -#line 14902 -F_TRAINER_FEMALE | -#line 14903 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 14904 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14905 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14906 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 14908 - .species = SPECIES_ARCANINE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14910 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14909 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14911 - MOVE_HELPING_HAND, - MOVE_FLAMETHROWER, - MOVE_SUNNY_DAY, - MOVE_ROAR, - }, - }, - { -#line 14916 - .species = SPECIES_MAGCARGO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14916 - .heldItem = ITEM_WHITE_HERB, -#line 14918 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14917 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14919 - MOVE_OVERHEAT, - MOVE_ATTRACT, - MOVE_LIGHT_SCREEN, - MOVE_ROCK_SLIDE, - }, - }, - { -#line 14924 - .species = SPECIES_HOUNDOOM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14926 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14925 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14927 - MOVE_ROAR, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_SUNNY_DAY, - }, - }, - { -#line 14932 - .species = SPECIES_RAPIDASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14934 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14933 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14935 - MOVE_FLAMETHROWER, - MOVE_ATTRACT, - MOVE_SOLAR_BEAM, - MOVE_BOUNCE, - }, - }, - { -#line 14940 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14940 - .heldItem = ITEM_WHITE_HERB, -#line 14942 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14941 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14943 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EARTHQUAKE, - MOVE_ATTRACT, - }, - }, - { -#line 14948 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14948 - .heldItem = ITEM_WHITE_HERB, -#line 14950 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14949 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14951 - MOVE_OVERHEAT, - MOVE_SUNNY_DAY, - MOVE_EXPLOSION, - MOVE_ATTRACT, - }, - }, - }, - }, -#line 14956 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_2] = - { -#line 14957 - .trainerName = _("NORMAN"), -#line 14958 - .trainerClass = TRAINER_CLASS_LEADER, -#line 14959 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 14961 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 14962 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 14963 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 14964 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 14966 - .species = SPECIES_CHANSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14968 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14967 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14969 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 14974 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14974 - .heldItem = ITEM_SITRUS_BERRY, -#line 14976 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14975 - .lvl = 42, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14977 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 14982 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14984 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14983 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14985 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 14990 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 14990 - .heldItem = ITEM_SITRUS_BERRY, -#line 14992 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 14991 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 14993 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 14998 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_3] = - { -#line 14999 - .trainerName = _("NORMAN"), -#line 15000 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15001 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15003 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15004 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15005 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15006 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15008 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15008 - .heldItem = ITEM_SITRUS_BERRY, -#line 15010 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15009 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15011 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15016 - .species = SPECIES_CHANSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15018 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15017 - .lvl = 47, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15019 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15024 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15026 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15025 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15027 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15032 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15034 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15033 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15035 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15040 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15040 - .heldItem = ITEM_SITRUS_BERRY, -#line 15042 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15041 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15043 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15048 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_4] = - { -#line 15049 - .trainerName = _("NORMAN"), -#line 15050 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15051 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15053 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15054 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15055 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15056 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15058 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15058 - .heldItem = ITEM_SITRUS_BERRY, -#line 15060 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15059 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15061 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15066 - .species = SPECIES_BLISSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15068 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15067 - .lvl = 52, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15069 - MOVE_LIGHT_SCREEN, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15074 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15076 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15075 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15077 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15082 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15084 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15083 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15085 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15090 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15090 - .heldItem = ITEM_SITRUS_BERRY, -#line 15092 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15091 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15093 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15098 - [DIFFICULTY_NORMAL][TRAINER_NORMAN_5] = - { -#line 15099 - .trainerName = _("NORMAN"), -#line 15100 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15101 - .trainerPic = TRAINER_PIC_LEADER_NORMAN, - .encounterMusic_gender = -#line 15103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15104 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15105 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15106 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15108 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15108 - .heldItem = ITEM_SITRUS_BERRY, -#line 15110 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15109 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15111 - MOVE_BLIZZARD, - MOVE_SHADOW_BALL, - MOVE_DOUBLE_EDGE, - MOVE_FIRE_BLAST, - }, - }, - { -#line 15116 - .species = SPECIES_BLISSEY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15118 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15117 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15119 - MOVE_PROTECT, - MOVE_SING, - MOVE_SKILL_SWAP, - MOVE_FOCUS_PUNCH, - }, - }, - { -#line 15124 - .species = SPECIES_KANGASKHAN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15126 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15125 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15127 - MOVE_FAKE_OUT, - MOVE_DIZZY_PUNCH, - MOVE_ENDURE, - MOVE_REVERSAL, - }, - }, - { -#line 15132 - .species = SPECIES_TAUROS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15134 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15133 - .lvl = 57, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15135 - MOVE_TAKE_DOWN, - MOVE_PROTECT, - MOVE_FIRE_BLAST, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15140 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15142 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15141 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15143 - MOVE_TEETER_DANCE, - MOVE_SKILL_SWAP, - MOVE_FACADE, - MOVE_HYPNOSIS, - }, - }, - { -#line 15148 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15148 - .heldItem = ITEM_SITRUS_BERRY, -#line 15150 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15149 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15151 - MOVE_HYPER_BEAM, - MOVE_FLAMETHROWER, - MOVE_THUNDERBOLT, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15156 - [DIFFICULTY_NORMAL][TRAINER_WINONA_2] = - { -#line 15157 - .trainerName = _("WINONA"), -#line 15158 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15159 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15160 -F_TRAINER_FEMALE | -#line 15161 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15162 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15163 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15164 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15166 - .species = SPECIES_DRATINI, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15166 - .heldItem = ITEM_SITRUS_BERRY, -#line 15168 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15167 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15169 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15174 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15175 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15177 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15182 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15184 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15183 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15185 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15190 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15191 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15193 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15198 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15198 - .heldItem = ITEM_CHESTO_BERRY, -#line 15200 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15199 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15201 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15206 - [DIFFICULTY_NORMAL][TRAINER_WINONA_3] = - { -#line 15207 - .trainerName = _("WINONA"), -#line 15208 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15209 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15210 -F_TRAINER_FEMALE | -#line 15211 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15212 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15213 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15214 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15216 - .species = SPECIES_HOOTHOOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15218 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15217 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15219 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15224 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15226 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15225 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15227 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15232 - .species = SPECIES_DRAGONAIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15232 - .heldItem = ITEM_SITRUS_BERRY, -#line 15234 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15233 - .lvl = 45, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15235 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15240 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15241 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15243 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15248 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15250 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15249 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15251 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15256 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15256 - .heldItem = ITEM_CHESTO_BERRY, -#line 15258 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15257 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15259 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15264 - [DIFFICULTY_NORMAL][TRAINER_WINONA_4] = - { -#line 15265 - .trainerName = _("WINONA"), -#line 15266 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15267 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15268 -F_TRAINER_FEMALE | -#line 15269 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15270 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15271 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15272 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15274 - .species = SPECIES_NOCTOWL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15276 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15275 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15277 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15282 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15284 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15283 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15285 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15290 - .species = SPECIES_DRAGONAIR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15290 - .heldItem = ITEM_SITRUS_BERRY, -#line 15292 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15291 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15293 - MOVE_THUNDER_WAVE, - MOVE_THUNDERBOLT, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15298 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15300 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15299 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15301 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15306 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15308 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15307 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15309 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15314 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15314 - .heldItem = ITEM_CHESTO_BERRY, -#line 15316 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15315 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15317 - MOVE_AERIAL_ACE, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15322 - [DIFFICULTY_NORMAL][TRAINER_WINONA_5] = - { -#line 15323 - .trainerName = _("WINONA"), -#line 15324 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15325 - .trainerPic = TRAINER_PIC_LEADER_WINONA, - .encounterMusic_gender = -#line 15326 -F_TRAINER_FEMALE | -#line 15327 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15328 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15329 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15330 - .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15332 - .species = SPECIES_NOCTOWL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15334 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15333 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15335 - MOVE_HYPNOSIS, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_DREAM_EATER, - }, - }, - { -#line 15340 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15342 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15341 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15343 - MOVE_SUNNY_DAY, - MOVE_AERIAL_ACE, - MOVE_SOLAR_BEAM, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15348 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15350 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15349 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15351 - MOVE_SURF, - MOVE_SUPERSONIC, - MOVE_PROTECT, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15356 - .species = SPECIES_DRAGONITE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15356 - .heldItem = ITEM_SITRUS_BERRY, -#line 15358 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15357 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15359 - MOVE_HYPER_BEAM, - MOVE_THUNDERBOLT, - MOVE_EARTHQUAKE, - MOVE_ICE_BEAM, - }, - }, - { -#line 15364 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15366 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15365 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15367 - MOVE_WHIRLWIND, - MOVE_SPIKES, - MOVE_STEEL_WING, - MOVE_AERIAL_ACE, - }, - }, - { -#line 15372 - .species = SPECIES_ALTARIA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15372 - .heldItem = ITEM_CHESTO_BERRY, -#line 15374 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15373 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15375 - MOVE_SKY_ATTACK, - MOVE_REST, - MOVE_DRAGON_DANCE, - MOVE_EARTHQUAKE, - }, - }, - }, - }, -#line 15380 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_2] = - { -#line 15381 - .trainerName = _("TATE&LIZA"), -#line 15382 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15383 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15385 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15386 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15387 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15388 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15390 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15392 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15391 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15393 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15398 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15400 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15399 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15401 - MOVE_EARTHQUAKE, - MOVE_ANCIENT_POWER, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15406 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15406 - .heldItem = ITEM_CHESTO_BERRY, -#line 15408 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15407 - .lvl = 49, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15409 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15414 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15414 - .heldItem = ITEM_CHESTO_BERRY, -#line 15416 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15415 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15417 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15422 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15422 - .heldItem = ITEM_SITRUS_BERRY, -#line 15424 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15423 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15425 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15430 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_3] = - { -#line 15431 - .trainerName = _("TATE&LIZA"), -#line 15432 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15433 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15435 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15436 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15437 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15438 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15440 - .species = SPECIES_DROWZEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15442 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15441 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15443 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15448 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15450 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15449 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15451 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15456 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15458 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15457 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15459 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15464 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15464 - .heldItem = ITEM_CHESTO_BERRY, -#line 15466 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15465 - .lvl = 54, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15467 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15472 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15472 - .heldItem = ITEM_CHESTO_BERRY, -#line 15474 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15473 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15475 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15480 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15480 - .heldItem = ITEM_SITRUS_BERRY, -#line 15482 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15481 - .lvl = 55, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15483 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15488 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_4] = - { -#line 15489 - .trainerName = _("TATE&LIZA"), -#line 15490 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15491 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15493 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15494 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15495 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15496 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15498 - .species = SPECIES_HYPNO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15500 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15499 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15501 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15506 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15508 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15507 - .lvl = 59, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15509 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15514 - .species = SPECIES_SLOWPOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15516 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15515 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15517 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15522 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15522 - .heldItem = ITEM_CHESTO_BERRY, -#line 15524 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15523 - .lvl = 59, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15525 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15530 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15530 - .heldItem = ITEM_CHESTO_BERRY, -#line 15532 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15531 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15533 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15538 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15538 - .heldItem = ITEM_SITRUS_BERRY, -#line 15540 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15539 - .lvl = 60, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15541 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15546 - [DIFFICULTY_NORMAL][TRAINER_TATE_AND_LIZA_5] = - { -#line 15547 - .trainerName = _("TATE&LIZA"), -#line 15548 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15549 - .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, - .encounterMusic_gender = -#line 15551 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 15552 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15553 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15554 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15556 - .species = SPECIES_HYPNO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15558 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15557 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15559 - MOVE_HYPNOSIS, - MOVE_DREAM_EATER, - MOVE_HEADBUTT, - MOVE_PROTECT, - }, - }, - { -#line 15564 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15566 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15565 - .lvl = 64, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15567 - MOVE_EARTHQUAKE, - MOVE_EXPLOSION, - MOVE_PSYCHIC, - MOVE_LIGHT_SCREEN, - }, - }, - { -#line 15572 - .species = SPECIES_SLOWKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15574 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15573 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15575 - MOVE_YAWN, - MOVE_PSYCHIC, - MOVE_CALM_MIND, - MOVE_PROTECT, - }, - }, - { -#line 15580 - .species = SPECIES_XATU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15580 - .heldItem = ITEM_CHESTO_BERRY, -#line 15582 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15581 - .lvl = 64, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15583 - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CONFUSE_RAY, - MOVE_CALM_MIND, - }, - }, - { -#line 15588 - .species = SPECIES_LUNATONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15588 - .heldItem = ITEM_CHESTO_BERRY, -#line 15590 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15589 - .lvl = 65, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15591 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_CALM_MIND, - }, - }, - { -#line 15596 - .species = SPECIES_SOLROCK, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15596 - .heldItem = ITEM_SITRUS_BERRY, -#line 15598 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15597 - .lvl = 65, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15599 - MOVE_SUNNY_DAY, - MOVE_SOLAR_BEAM, - MOVE_PSYCHIC, - MOVE_FLAMETHROWER, - }, - }, - }, - }, -#line 15604 - [DIFFICULTY_NORMAL][TRAINER_JUAN_2] = - { -#line 15605 - .trainerName = _("JUAN"), -#line 15606 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15607 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15609 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15610 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15611 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15612 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15614 - .species = SPECIES_POLIWAG, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15616 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15615 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15617 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15622 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15624 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15623 - .lvl = 46, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15625 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15630 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15632 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15631 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15633 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15638 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15638 - .heldItem = ITEM_CHESTO_BERRY, -#line 15640 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15639 - .lvl = 48, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15641 - MOVE_REST, - MOVE_CRABHAMMER, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15646 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15646 - .heldItem = ITEM_CHESTO_BERRY, -#line 15648 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15647 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15649 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15654 - [DIFFICULTY_NORMAL][TRAINER_JUAN_3] = - { -#line 15655 - .trainerName = _("JUAN"), -#line 15656 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15657 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15659 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15660 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15661 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15662 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 5, - .party = (const struct TrainerMon[]) - { - { -#line 15664 - .species = SPECIES_POLIWHIRL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15666 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15665 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15667 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15672 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15674 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15673 - .lvl = 51, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15675 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15680 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15682 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15681 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15683 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15688 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15688 - .heldItem = ITEM_CHESTO_BERRY, -#line 15690 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15689 - .lvl = 53, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15691 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15696 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15696 - .heldItem = ITEM_CHESTO_BERRY, -#line 15698 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15697 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15699 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15704 - [DIFFICULTY_NORMAL][TRAINER_JUAN_4] = - { -#line 15705 - .trainerName = _("JUAN"), -#line 15706 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15707 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15709 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15710 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15711 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15712 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15714 - .species = SPECIES_LAPRAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15716 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15715 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15717 - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - MOVE_ICE_BEAM, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15722 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15724 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15723 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15725 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15730 - .species = SPECIES_POLIWHIRL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15732 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15731 - .lvl = 56, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15733 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_PROTECT, - MOVE_HYDRO_PUMP, - }, - }, - { -#line 15738 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15740 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15739 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15741 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_ICE_BEAM, - }, - }, - { -#line 15746 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15746 - .heldItem = ITEM_CHESTO_BERRY, -#line 15748 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15747 - .lvl = 58, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15749 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15754 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15754 - .heldItem = ITEM_CHESTO_BERRY, -#line 15756 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15755 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15757 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15762 - [DIFFICULTY_NORMAL][TRAINER_JUAN_5] = - { -#line 15763 - .trainerName = _("JUAN"), -#line 15764 - .trainerClass = TRAINER_CLASS_LEADER, -#line 15765 - .trainerPic = TRAINER_PIC_LEADER_JUAN, - .encounterMusic_gender = -#line 15767 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15768 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15769 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 15770 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15772 - .species = SPECIES_LAPRAS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15774 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15773 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15775 - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - MOVE_ICE_BEAM, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15780 - .species = SPECIES_WHISCASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15782 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15781 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15783 - MOVE_RAIN_DANCE, - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_FISSURE, - }, - }, - { -#line 15788 - .species = SPECIES_POLITOED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15790 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15789 - .lvl = 61, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15791 - MOVE_HYPNOSIS, - MOVE_RAIN_DANCE, - MOVE_HYDRO_PUMP, - MOVE_PERISH_SONG, - }, - }, - { -#line 15796 - .species = SPECIES_WALREIN, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15798 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15797 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15799 - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_PROTECT, - MOVE_SHEER_COLD, - }, - }, - { -#line 15804 - .species = SPECIES_CRAWDAUNT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15804 - .heldItem = ITEM_CHESTO_BERRY, -#line 15806 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15805 - .lvl = 63, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15807 - MOVE_REST, - MOVE_GUILLOTINE, - MOVE_TAUNT, - MOVE_DOUBLE_TEAM, - }, - }, - { -#line 15812 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15812 - .heldItem = ITEM_CHESTO_BERRY, -#line 15814 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15813 - .lvl = 66, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15815 - MOVE_WATER_PULSE, - MOVE_DOUBLE_TEAM, - MOVE_ICE_BEAM, - MOVE_REST, - }, - }, - }, - }, -#line 15820 - [DIFFICULTY_NORMAL][TRAINER_ANGELO] = - { -#line 15821 - .trainerName = _("ANGELO"), -#line 15822 - .trainerClass = TRAINER_CLASS_BUG_MANIAC, -#line 15823 - .trainerPic = TRAINER_PIC_BUG_MANIAC, - .encounterMusic_gender = -#line 15825 - TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, -#line 15826 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15827 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 15829 - .species = SPECIES_ILLUMISE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15831 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15830 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15832 - MOVE_SHOCK_WAVE, - MOVE_QUICK_ATTACK, - MOVE_CHARM, - }, - }, - { -#line 15836 - .species = SPECIES_VOLBEAT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15838 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 15837 - .lvl = 17, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15839 - MOVE_SHOCK_WAVE, - MOVE_QUICK_ATTACK, - MOVE_CONFUSE_RAY, - }, - }, - }, - }, -#line 15843 - [DIFFICULTY_NORMAL][TRAINER_DARIUS] = - { -#line 15844 - .trainerName = _("DARIUS"), -#line 15845 - .trainerClass = TRAINER_CLASS_BIRD_KEEPER, -#line 15846 - .trainerPic = TRAINER_PIC_BIRD_KEEPER, - .encounterMusic_gender = -#line 15848 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 15849 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15850 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15852 - .species = SPECIES_TROPIUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15854 - .iv = TRAINER_PARTY_IVS(24, 24, 24, 24, 24, 24), -#line 15853 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15856 - [DIFFICULTY_NORMAL][TRAINER_STEVEN] = - { -#line 15857 - .trainerName = _("STEVEN"), -#line 15858 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 15859 - .trainerPic = TRAINER_PIC_STEVEN, - .encounterMusic_gender = -#line 15861 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15862 - .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, -#line 15863 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15864 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 15866 - .species = SPECIES_SKARMORY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15868 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15867 - .lvl = 77, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15869 - MOVE_TOXIC, - MOVE_AERIAL_ACE, - MOVE_SPIKES, - MOVE_STEEL_WING, - }, - }, - { -#line 15874 - .species = SPECIES_CLAYDOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15876 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15875 - .lvl = 75, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15877 - MOVE_REFLECT, - MOVE_LIGHT_SCREEN, - MOVE_ANCIENT_POWER, - MOVE_EARTHQUAKE, - }, - }, - { -#line 15882 - .species = SPECIES_AGGRON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15884 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15883 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15885 - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_SOLAR_BEAM, - MOVE_DRAGON_CLAW, - }, - }, - { -#line 15890 - .species = SPECIES_CRADILY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15892 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15891 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15893 - MOVE_GIGA_DRAIN, - MOVE_ANCIENT_POWER, - MOVE_INGRAIN, - MOVE_CONFUSE_RAY, - }, - }, - { -#line 15898 - .species = SPECIES_ARMALDO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15900 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15899 - .lvl = 76, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15901 - MOVE_WATER_PULSE, - MOVE_ANCIENT_POWER, - MOVE_AERIAL_ACE, - MOVE_SLASH, - }, - }, - { -#line 15906 - .species = SPECIES_METAGROSS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15906 - .heldItem = ITEM_SITRUS_BERRY, -#line 15908 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 15907 - .lvl = 78, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - .moves = { -#line 15909 - MOVE_EARTHQUAKE, - MOVE_PSYCHIC, - MOVE_METEOR_MASH, - MOVE_SHADOW_BALL, - }, - }, - }, - }, -#line 15914 - [DIFFICULTY_NORMAL][TRAINER_ANABEL] = - { -#line 15915 - .trainerName = _("ANABEL"), -#line 15916 - .trainerClass = TRAINER_CLASS_SALON_MAIDEN, -#line 15917 - .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, - .encounterMusic_gender = -#line 15918 -F_TRAINER_FEMALE | -#line 15919 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15920 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15921 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15923 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15925 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15924 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15927 - [DIFFICULTY_NORMAL][TRAINER_TUCKER] = - { -#line 15928 - .trainerName = _("TUCKER"), -#line 15929 - .trainerClass = TRAINER_CLASS_DOME_ACE, -#line 15930 - .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, - .encounterMusic_gender = -#line 15932 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15933 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15934 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15936 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15938 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15937 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15940 - [DIFFICULTY_NORMAL][TRAINER_SPENSER] = - { -#line 15941 - .trainerName = _("SPENSER"), -#line 15942 - .trainerClass = TRAINER_CLASS_PALACE_MAVEN, -#line 15943 - .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, - .encounterMusic_gender = -#line 15945 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15946 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15947 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15949 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15951 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15950 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15953 - [DIFFICULTY_NORMAL][TRAINER_GRETA] = - { -#line 15954 - .trainerName = _("GRETA"), -#line 15955 - .trainerClass = TRAINER_CLASS_ARENA_TYCOON, -#line 15956 - .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, - .encounterMusic_gender = -#line 15957 -F_TRAINER_FEMALE | -#line 15958 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15959 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15960 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15962 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15964 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15963 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15966 - [DIFFICULTY_NORMAL][TRAINER_NOLAND] = - { -#line 15967 - .trainerName = _("NOLAND"), -#line 15968 - .trainerClass = TRAINER_CLASS_FACTORY_HEAD, -#line 15969 - .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, - .encounterMusic_gender = -#line 15971 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15972 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15973 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15975 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15977 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15976 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15979 - [DIFFICULTY_NORMAL][TRAINER_LUCY] = - { -#line 15980 - .trainerName = _("LUCY"), -#line 15981 - .trainerClass = TRAINER_CLASS_PIKE_QUEEN, -#line 15982 - .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, - .encounterMusic_gender = -#line 15983 -F_TRAINER_FEMALE | -#line 15984 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15985 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15986 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 15988 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 15990 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 15989 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 15992 - [DIFFICULTY_NORMAL][TRAINER_BRANDON] = - { -#line 15993 - .trainerName = _("BRANDON"), -#line 15994 - .trainerClass = TRAINER_CLASS_PYRAMID_KING, -#line 15995 - .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, - .encounterMusic_gender = -#line 15997 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 15998 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 15999 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16001 - .species = SPECIES_BELDUM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16003 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16002 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16005 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_2] = - { -#line 16006 - .trainerName = _("ANDRES"), -#line 16007 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16008 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16010 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16011 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16012 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16014 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16016 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16015 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16018 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16020 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16019 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16022 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_3] = - { -#line 16023 - .trainerName = _("ANDRES"), -#line 16024 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16025 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16027 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16028 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16029 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16031 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16033 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16032 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16035 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16037 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16036 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16039 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16041 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16040 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16043 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_4] = - { -#line 16044 - .trainerName = _("ANDRES"), -#line 16045 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16046 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16048 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16049 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16050 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16052 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16054 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16053 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16056 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16058 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16057 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16060 - .species = SPECIES_SANDSHREW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16062 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16061 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16064 - [DIFFICULTY_NORMAL][TRAINER_ANDRES_5] = - { -#line 16065 - .trainerName = _("ANDRES"), -#line 16066 - .trainerClass = TRAINER_CLASS_RUIN_MANIAC, -#line 16067 - .trainerPic = TRAINER_PIC_RUIN_MANIAC, - .encounterMusic_gender = -#line 16069 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16070 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16071 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16073 - .species = SPECIES_NOSEPASS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16075 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16074 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16077 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16079 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16078 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16081 - .species = SPECIES_SANDSLASH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16083 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16082 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16085 - [DIFFICULTY_NORMAL][TRAINER_CORY_2] = - { -#line 16086 - .trainerName = _("CORY"), -#line 16087 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16088 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16090 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16091 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16092 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16094 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16096 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16095 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16098 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16100 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16099 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16102 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16104 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16103 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16106 - [DIFFICULTY_NORMAL][TRAINER_CORY_3] = - { -#line 16107 - .trainerName = _("CORY"), -#line 16108 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16109 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16111 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16112 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16113 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16115 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16117 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16116 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16119 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16121 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16120 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16123 - .species = SPECIES_TENTACOOL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16125 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16124 - .lvl = 32, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16127 - [DIFFICULTY_NORMAL][TRAINER_CORY_4] = - { -#line 16128 - .trainerName = _("CORY"), -#line 16129 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16130 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16132 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16133 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16134 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16136 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16138 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16137 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16140 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16142 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16141 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16144 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16146 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16145 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16148 - [DIFFICULTY_NORMAL][TRAINER_CORY_5] = - { -#line 16149 - .trainerName = _("CORY"), -#line 16150 - .trainerClass = TRAINER_CLASS_SAILOR, -#line 16151 - .trainerPic = TRAINER_PIC_SAILOR, - .encounterMusic_gender = -#line 16153 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16154 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16155 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16157 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16159 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16158 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16161 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16163 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16162 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16165 - .species = SPECIES_TENTACRUEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16167 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16166 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16169 - [DIFFICULTY_NORMAL][TRAINER_PABLO_2] = - { -#line 16170 - .trainerName = _("PABLO"), -#line 16171 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16172 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16174 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16175 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16176 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16178 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16180 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16179 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16182 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16184 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16183 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16186 - [DIFFICULTY_NORMAL][TRAINER_PABLO_3] = - { -#line 16187 - .trainerName = _("PABLO"), -#line 16188 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16189 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16191 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16192 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16193 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16195 - .species = SPECIES_WINGULL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16197 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16196 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16199 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16201 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16200 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16203 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16205 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16204 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16207 - [DIFFICULTY_NORMAL][TRAINER_PABLO_4] = - { -#line 16208 - .trainerName = _("PABLO"), -#line 16209 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16210 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16212 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16213 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16214 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16216 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16218 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16217 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16220 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16222 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16221 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16224 - .species = SPECIES_STARYU, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16226 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16225 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16228 - [DIFFICULTY_NORMAL][TRAINER_PABLO_5] = - { -#line 16229 - .trainerName = _("PABLO"), -#line 16230 - .trainerClass = TRAINER_CLASS_TRIATHLETE, -#line 16231 - .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, - .encounterMusic_gender = -#line 16233 - TRAINER_ENCOUNTER_MUSIC_SWIMMER, -#line 16234 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16235 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16237 - .species = SPECIES_PELIPPER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16239 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16238 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16241 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16243 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16242 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16245 - .species = SPECIES_STARMIE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16247 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16246 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16249 - [DIFFICULTY_NORMAL][TRAINER_KOJI_2] = - { -#line 16250 - .trainerName = _("KOJI"), -#line 16251 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16252 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16254 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16255 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16256 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16258 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16260 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16259 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16262 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16264 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16263 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16266 - [DIFFICULTY_NORMAL][TRAINER_KOJI_3] = - { -#line 16267 - .trainerName = _("KOJI"), -#line 16268 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16269 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16271 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16272 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16273 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16275 - .species = SPECIES_MAKUHITA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16277 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16276 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16279 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16281 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16280 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16283 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16285 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16284 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16287 - [DIFFICULTY_NORMAL][TRAINER_KOJI_4] = - { -#line 16288 - .trainerName = _("KOJI"), -#line 16289 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16290 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16292 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16293 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16294 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16296 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16298 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16297 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16300 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16302 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16301 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16304 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16306 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16305 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16308 - [DIFFICULTY_NORMAL][TRAINER_KOJI_5] = - { -#line 16309 - .trainerName = _("KOJI"), -#line 16310 - .trainerClass = TRAINER_CLASS_BLACK_BELT, -#line 16311 - .trainerPic = TRAINER_PIC_BLACK_BELT, - .encounterMusic_gender = -#line 16313 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16314 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16315 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16317 - .species = SPECIES_HARIYAMA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16319 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16318 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16321 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16323 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16322 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16325 - .species = SPECIES_MACHAMP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16327 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16326 - .lvl = 43, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16329 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_2] = - { -#line 16330 - .trainerName = _("CRISTIN"), -#line 16331 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16332 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16333 -F_TRAINER_FEMALE | -#line 16334 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16335 - .items = { ITEM_HYPER_POTION }, -#line 16336 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16337 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16339 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16341 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16340 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16343 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16345 - .iv = TRAINER_PARTY_IVS(13, 13, 13, 13, 13, 13), -#line 16344 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16347 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_3] = - { -#line 16348 - .trainerName = _("CRISTIN"), -#line 16349 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16350 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16351 -F_TRAINER_FEMALE | -#line 16352 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16353 - .items = { ITEM_HYPER_POTION }, -#line 16354 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16355 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16357 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16359 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16358 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16361 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16363 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16362 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16365 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16367 - .iv = TRAINER_PARTY_IVS(14, 14, 14, 14, 14, 14), -#line 16366 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16369 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_4] = - { -#line 16370 - .trainerName = _("CRISTIN"), -#line 16371 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16372 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16373 -F_TRAINER_FEMALE | -#line 16374 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16375 - .items = { ITEM_HYPER_POTION }, -#line 16376 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16377 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16379 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16381 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16380 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16383 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16385 - .iv = TRAINER_PARTY_IVS(15, 15, 15, 15, 15, 15), -#line 16384 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16387 - .species = SPECIES_VIGOROTH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16389 - .iv = TRAINER_PARTY_IVS(12, 12, 12, 12, 12, 12), -#line 16388 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16391 - [DIFFICULTY_NORMAL][TRAINER_CRISTIN_5] = - { -#line 16392 - .trainerName = _("CRISTIN"), -#line 16393 - .trainerClass = TRAINER_CLASS_COOLTRAINER, -#line 16394 - .trainerPic = TRAINER_PIC_COOLTRAINER_F, - .encounterMusic_gender = -#line 16395 -F_TRAINER_FEMALE | -#line 16396 - TRAINER_ENCOUNTER_MUSIC_COOL, -#line 16397 - .items = { ITEM_HYPER_POTION }, -#line 16398 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16399 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16401 - .species = SPECIES_SPINDA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16403 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16402 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16405 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16407 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16406 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16409 - .species = SPECIES_SLAKING, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16411 - .iv = TRAINER_PARTY_IVS(17, 17, 17, 17, 17, 17), -#line 16410 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16413 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_2] = - { -#line 16414 - .trainerName = _("FERNANDO"), -#line 16415 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16416 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16418 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16419 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16420 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16422 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16424 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16423 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16426 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16428 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16427 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16430 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16432 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16431 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16434 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_3] = - { -#line 16435 - .trainerName = _("FERNANDO"), -#line 16436 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16437 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16439 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16440 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16441 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16443 - .species = SPECIES_ELECTRIKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16445 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16444 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16447 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16449 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16448 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16451 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16453 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16452 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16455 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_4] = - { -#line 16456 - .trainerName = _("FERNANDO"), -#line 16457 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16458 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16460 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16461 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16462 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16464 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16466 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16465 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16468 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16470 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16469 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16472 - .species = SPECIES_LOUDRED, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16474 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16473 - .lvl = 39, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16476 - [DIFFICULTY_NORMAL][TRAINER_FERNANDO_5] = - { -#line 16477 - .trainerName = _("FERNANDO"), -#line 16478 - .trainerClass = TRAINER_CLASS_GUITARIST, -#line 16479 - .trainerPic = TRAINER_PIC_GUITARIST, - .encounterMusic_gender = -#line 16481 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16482 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16483 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16485 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16487 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16486 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16489 - .species = SPECIES_MANECTRIC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16491 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16490 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16493 - .species = SPECIES_EXPLOUD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16495 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16494 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16497 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_2] = - { -#line 16498 - .trainerName = _("SAWYER"), -#line 16499 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16500 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16502 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16503 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16504 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16506 - .species = SPECIES_GEODUDE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16508 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16507 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16510 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16512 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16511 - .lvl = 26, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16514 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_3] = - { -#line 16515 - .trainerName = _("SAWYER"), -#line 16516 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16517 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16519 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16520 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16521 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16523 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16525 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16524 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16527 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16529 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16528 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16531 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16533 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16532 - .lvl = 28, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16535 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_4] = - { -#line 16536 - .trainerName = _("SAWYER"), -#line 16537 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16538 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16540 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16541 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16542 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16544 - .species = SPECIES_MACHOP, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16546 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16545 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16548 - .species = SPECIES_NUMEL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16550 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16549 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16552 - .species = SPECIES_GRAVELER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16554 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16553 - .lvl = 30, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16556 - [DIFFICULTY_NORMAL][TRAINER_SAWYER_5] = - { -#line 16557 - .trainerName = _("SAWYER"), -#line 16558 - .trainerClass = TRAINER_CLASS_HIKER, -#line 16559 - .trainerPic = TRAINER_PIC_HIKER, - .encounterMusic_gender = -#line 16561 - TRAINER_ENCOUNTER_MUSIC_HIKER, -#line 16562 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16563 - .aiFlags = AI_FLAG_BASIC_TRAINER, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16565 - .species = SPECIES_MACHOKE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16567 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16566 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16569 - .species = SPECIES_CAMERUPT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16571 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16570 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16573 - .species = SPECIES_GOLEM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16575 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16574 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16577 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_2] = - { -#line 16578 - .trainerName = _("GABRIELLE"), -#line 16579 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16580 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16581 -F_TRAINER_FEMALE | -#line 16582 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16583 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16584 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16586 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16588 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16587 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16590 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16592 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16591 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16594 - .species = SPECIES_ZIGZAGOON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16596 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16595 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16598 - .species = SPECIES_LOTAD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16600 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16599 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16602 - .species = SPECIES_SEEDOT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16604 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16603 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16606 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16608 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16607 - .lvl = 31, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16610 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_3] = - { -#line 16611 - .trainerName = _("GABRIELLE"), -#line 16612 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16613 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16614 -F_TRAINER_FEMALE | -#line 16615 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16616 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16617 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16619 - .species = SPECIES_SKITTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16621 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16620 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16623 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16625 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16624 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16627 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16629 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16628 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16631 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16633 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16632 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16635 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16637 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16636 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16639 - .species = SPECIES_TAILLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16641 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16640 - .lvl = 33, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16643 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_4] = - { -#line 16644 - .trainerName = _("GABRIELLE"), -#line 16645 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16646 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16647 -F_TRAINER_FEMALE | -#line 16648 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16649 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16650 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16652 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16654 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16653 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16656 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16658 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16657 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16660 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16662 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16661 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16664 - .species = SPECIES_LOMBRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16666 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16665 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16668 - .species = SPECIES_NUZLEAF, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16670 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16669 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16672 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16674 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16673 - .lvl = 35, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16676 - [DIFFICULTY_NORMAL][TRAINER_GABRIELLE_5] = - { -#line 16677 - .trainerName = _("GABRIELLE"), -#line 16678 - .trainerClass = TRAINER_CLASS_PKMN_BREEDER, -#line 16679 - .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, - .encounterMusic_gender = -#line 16680 -F_TRAINER_FEMALE | -#line 16681 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16682 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16683 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 16685 - .species = SPECIES_DELCATTY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16687 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16686 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16689 - .species = SPECIES_MIGHTYENA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16691 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16690 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16693 - .species = SPECIES_LINOONE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16695 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16694 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16697 - .species = SPECIES_LUDICOLO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16699 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16698 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16701 - .species = SPECIES_SHIFTRY, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16703 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16702 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16705 - .species = SPECIES_SWELLOW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16707 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16706 - .lvl = 37, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16709 - [DIFFICULTY_NORMAL][TRAINER_THALIA_2] = - { -#line 16710 - .trainerName = _("THALIA"), -#line 16711 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16712 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16713 -F_TRAINER_FEMALE | -#line 16714 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16715 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16716 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16718 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16720 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16719 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16722 - .species = SPECIES_HORSEA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16724 - .iv = TRAINER_PARTY_IVS(1, 1, 1, 1, 1, 1), -#line 16723 - .lvl = 34, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16726 - [DIFFICULTY_NORMAL][TRAINER_THALIA_3] = - { -#line 16727 - .trainerName = _("THALIA"), -#line 16728 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16729 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16730 -F_TRAINER_FEMALE | -#line 16731 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16732 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16733 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16735 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16737 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16736 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16739 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16741 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16740 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16743 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16745 - .iv = TRAINER_PARTY_IVS(2, 2, 2, 2, 2, 2), -#line 16744 - .lvl = 36, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16747 - [DIFFICULTY_NORMAL][TRAINER_THALIA_4] = - { -#line 16748 - .trainerName = _("THALIA"), -#line 16749 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16750 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16751 -F_TRAINER_FEMALE | -#line 16752 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16753 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16754 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16756 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16758 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16757 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16760 - .species = SPECIES_WAILMER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16762 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16761 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16764 - .species = SPECIES_SEADRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16766 - .iv = TRAINER_PARTY_IVS(3, 3, 3, 3, 3, 3), -#line 16765 - .lvl = 38, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16768 - [DIFFICULTY_NORMAL][TRAINER_THALIA_5] = - { -#line 16769 - .trainerName = _("THALIA"), -#line 16770 - .trainerClass = TRAINER_CLASS_BEAUTY, -#line 16771 - .trainerPic = TRAINER_PIC_BEAUTY, - .encounterMusic_gender = -#line 16772 -F_TRAINER_FEMALE | -#line 16773 - TRAINER_ENCOUNTER_MUSIC_FEMALE, -#line 16774 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 16775 - .aiFlags = AI_FLAG_CHECK_BAD_MOVE, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 16777 - .species = SPECIES_LUVDISC, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16779 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16778 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16781 - .species = SPECIES_WAILORD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16783 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16782 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16785 - .species = SPECIES_KINGDRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16787 - .iv = TRAINER_PARTY_IVS(4, 4, 4, 4, 4, 4), -#line 16786 - .lvl = 40, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16789 - [DIFFICULTY_NORMAL][TRAINER_MARIELA] = - { -#line 16790 - .trainerName = _("MARIELA"), -#line 16791 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16792 - .trainerPic = TRAINER_PIC_PSYCHIC_F, - .encounterMusic_gender = -#line 16793 -F_TRAINER_FEMALE | -#line 16794 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16795 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16797 - .species = SPECIES_CHIMECHO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16799 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16798 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16801 - [DIFFICULTY_NORMAL][TRAINER_ALVARO] = - { -#line 16802 - .trainerName = _("ALVARO"), -#line 16803 - .trainerClass = TRAINER_CLASS_PSYCHIC, -#line 16804 - .trainerPic = TRAINER_PIC_PSYCHIC_M, - .encounterMusic_gender = -#line 16806 - TRAINER_ENCOUNTER_MUSIC_INTENSE, -#line 16807 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 16809 - .species = SPECIES_BANETTE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16811 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16810 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 16813 - .species = SPECIES_KADABRA, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16815 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16814 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16817 - [DIFFICULTY_NORMAL][TRAINER_EVERETT] = - { -#line 16818 - .trainerName = _("EVERETT"), -#line 16819 - .trainerClass = TRAINER_CLASS_GENTLEMAN, -#line 16820 - .trainerPic = TRAINER_PIC_GENTLEMAN, - .encounterMusic_gender = -#line 16822 - TRAINER_ENCOUNTER_MUSIC_RICH, -#line 16823 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16825 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16827 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16826 - .lvl = 41, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16829 - [DIFFICULTY_NORMAL][TRAINER_RED] = - { -#line 16830 - .trainerName = _("RED"), -#line 16831 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 16832 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 16834 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16835 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16837 - .species = SPECIES_CHARMANDER, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16839 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16838 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16841 - [DIFFICULTY_NORMAL][TRAINER_LEAF] = - { -#line 16842 - .trainerName = _("LEAF"), -#line 16843 - .trainerClass = TRAINER_CLASS_RIVAL, -#line 16844 - .trainerPic = TRAINER_PIC_LEAF, - .encounterMusic_gender = -#line 16845 -F_TRAINER_FEMALE | -#line 16846 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16847 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16849 - .species = SPECIES_BULBASAUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16851 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16850 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16853 - [DIFFICULTY_NORMAL][TRAINER_BRENDAN_PLACEHOLDER] = - { -#line 16854 - .trainerName = _("BRENDAN"), -#line 16855 - .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16856 - .trainerPic = TRAINER_PIC_RS_BRENDAN, - .encounterMusic_gender = -#line 16858 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16859 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16861 - .species = SPECIES_GROUDON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16863 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16862 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 16865 - [DIFFICULTY_NORMAL][TRAINER_MAY_PLACEHOLDER] = - { -#line 16866 - .trainerName = _("MAY"), -#line 16867 - .trainerClass = TRAINER_CLASS_RS_PROTAG, -#line 16868 - .trainerPic = TRAINER_PIC_RS_MAY, - .encounterMusic_gender = -#line 16869 -F_TRAINER_FEMALE | -#line 16870 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 16871 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 16873 - .species = SPECIES_KYOGRE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 16875 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 16874 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, diff --git a/test/battle/trainer_control.h b/test/battle/trainer_control.h deleted file mode 100644 index 482e7a0a6e..0000000000 --- a/test/battle/trainer_control.h +++ /dev/null @@ -1,792 +0,0 @@ -// -// DO NOT MODIFY THIS FILE! It is auto-generated from test/battle/trainer_control.party -// -// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE -// in include/config/general.h and remove this notice. -// Use sed -i '/^#line/d' 'test/battle/trainer_control.h' to remove #line markers. -// - -#line 1 "test/battle/trainer_control.party" - -#line 1 - [DIFFICULTY_NORMAL][0] = - { -#line 2 - .trainerName = _("Test1"), -#line 3 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 4 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 6 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 7 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 9 - .nickname = COMPOUND_STRING("Bubbles"), -#line 9 - .species = SPECIES_WOBBUFFET, -#line 9 - .gender = TRAINER_MON_FEMALE, -#line 9 - .heldItem = ITEM_ASSAULT_VEST, -#line 14 - .ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0), -#line 13 - .iv = TRAINER_PARTY_IVS(25, 26, 27, 28, 29, 30), -#line 12 - .ability = ABILITY_TELEPATHY, -#line 11 - .lvl = 67, -#line 17 - .ball = ITEM_MASTER_BALL, -#line 15 - .friendship = 42, -#line 10 - .nature = NATURE_HASTY, -#line 16 - .isShiny = TRUE, -#line 18 - .dynamaxLevel = 5, - .shouldUseDynamax = TRUE, - .moves = { -#line 19 - MOVE_AIR_SLASH, - MOVE_BARRIER, - MOVE_SOLAR_BEAM, - MOVE_EXPLOSION, - }, - }, - { -#line 24 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 27 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 26 - .ability = ABILITY_SHADOW_TAG, -#line 25 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 29 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 31 - .iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0), -#line 30 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 33 -#line 40 - [DIFFICULTY_NORMAL][1] = - { -#line 34 - .trainerName = _("Test2"), -#line 35 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 36 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 38 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 39 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 42 - .species = SPECIES_MEWTWO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 44 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 43 - .lvl = 5, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 45 -#line 52 - [DIFFICULTY_NORMAL][2] = - { -#line 46 - .trainerName = _("Test2"), -#line 47 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 48 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 50 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 51 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 54 - .species = SPECIES_MEWTWO, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 56 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 55 - .lvl = 50, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 57 -#line 64 - [DIFFICULTY_EASY][2] = - { -#line 58 - .trainerName = _("Test2"), -#line 59 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 60 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 62 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 63 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 66 - .species = SPECIES_METAPOD, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 68 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 67 - .lvl = 1, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 69 -#line 76 - [DIFFICULTY_HARD][2] = - { -#line 70 - .trainerName = _("Test2"), -#line 71 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 72 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 74 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 75 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, - .partySize = 1, - .party = (const struct TrainerMon[]) - { - { -#line 78 - .species = SPECIES_ARCEUS, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 80 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 79 - .lvl = 99, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 81 - [DIFFICULTY_NORMAL][3] = - { -#line 82 - .trainerName = _("Test3"), -#line 83 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 84 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 86 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 87 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 88 - .partySize = 1, - .poolSize = 4, - .party = (const struct TrainerMon[]) - { - { -#line 90 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 91 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 91 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 92 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 93 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 93 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 94 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 95 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 95 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 96 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 97 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 97 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 98 - [DIFFICULTY_NORMAL][4] = - { -#line 99 - .trainerName = _("Test4"), -#line 100 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 101 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 103 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 104 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 105 - .partySize = 3, - .poolSize = 6, - .party = (const struct TrainerMon[]) - { - { -#line 107 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 108 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 108 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 109 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 111 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 111 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 110 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 112 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 114 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 114 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 113 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 115 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 116 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 116 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 117 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 119 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 119 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 118 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 120 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 122 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 122 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 121 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 123 - [DIFFICULTY_NORMAL][5] = - { -#line 124 - .trainerName = _("Test5"), -#line 125 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 126 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 128 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 129 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 131 - .poolRuleIndex = POOL_RULESET_WEATHER_DOUBLES, -#line 130 - .partySize = 3, - .poolSize = 10, - .party = (const struct TrainerMon[]) - { - { -#line 133 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 135 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 135 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 134 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 136 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 138 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 138 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 137 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 139 - .species = SPECIES_VULPIX, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 141 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 141 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 140 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, - }, - { -#line 142 - .species = SPECIES_BULBASAUR, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 144 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 144 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 143 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, - }, - { -#line 145 - .species = SPECIES_TORKOAL, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 147 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 147 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 146 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER, - }, - { -#line 148 - .species = SPECIES_CHERRIM, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 150 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 150 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 149 - .tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_ABUSER, - }, - { -#line 151 - .species = SPECIES_MEW, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 153 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 153 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 152 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 154 - .species = SPECIES_ARON, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 156 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 156 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 155 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 157 - .species = SPECIES_ODDISH, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 158 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 158 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 159 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 160 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 160 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 161 - [DIFFICULTY_NORMAL][6] = - { -#line 162 - .trainerName = _("Test6"), -#line 163 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 164 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 166 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 167 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 169 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 168 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 171 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 173 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 173 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 172 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 174 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 176 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 176 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 175 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 177 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 179 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 179 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 178 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 180 - [DIFFICULTY_NORMAL][7] = - { -#line 181 - .trainerName = _("Test1"), -#line 182 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 183 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 185 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 186 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 188 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 189 - .poolPruneIndex = POOL_PRUNE_TEST, -#line 187 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 191 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 192 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 192 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 193 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 195 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 195 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 194 - .tags = MON_POOL_TAG_LEAD, - }, - { -#line 196 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 197 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 197 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 198 - [DIFFICULTY_NORMAL][8] = - { -#line 199 - .trainerName = _("Test1"), -#line 200 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 201 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 203 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 204 - .battleType = TRAINER_BATTLE_TYPE_SINGLES, -#line 206 - .poolRuleIndex = POOL_RULESET_BASIC, -#line 207 - .poolPickIndex = POOL_PICK_LOWEST, -#line 205 - .partySize = 2, - .poolSize = 3, - .party = (const struct TrainerMon[]) - { - { -#line 209 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 211 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 211 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 210 - .tags = MON_POOL_TAG_ACE, - }, - { -#line 212 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 213 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 213 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 214 - .species = SPECIES_EEVEE, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 216 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 216 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, -#line 215 - .tags = MON_POOL_TAG_LEAD, - }, - }, - }, -#line 217 - [DIFFICULTY_NORMAL][9] = - { -#line 218 - .trainerName = _("Test9"), -#line 219 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 220 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 222 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 223 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 224 - .partySize = 2, - .poolSize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 226 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 227 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 227 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 228 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 229 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 229 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, -#line 230 - [DIFFICULTY_NORMAL][10] = - { -#line 231 - .trainerName = _("Test10"), -#line 232 - .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, -#line 233 - .trainerPic = TRAINER_PIC_RED, - .encounterMusic_gender = -#line 235 - TRAINER_ENCOUNTER_MUSIC_MALE, -#line 236 - .battleType = TRAINER_BATTLE_TYPE_DOUBLES, -#line 237 - .partySize = 2, - .poolSize = 2, - .party = (const struct TrainerMon[]) - { - { -#line 239 - .species = SPECIES_WYNAUT, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 240 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 240 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - { -#line 241 - .species = SPECIES_WOBBUFFET, - .gender = TRAINER_MON_RANDOM_GENDER, -#line 242 - .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), -#line 242 - .lvl = 100, - .nature = NATURE_HARDY, - .dynamaxLevel = MAX_DYNAMAX_LEVEL, - }, - }, - }, diff --git a/trainer_rules.mk b/trainer_rules.mk new file mode 100644 index 0000000000..c5df373a1e --- /dev/null +++ b/trainer_rules.mk @@ -0,0 +1,10 @@ +# party files are run through trainerproc, which is a tool that converts party data to an output file +# matching the current trainer .h formatting + +AUTO_GEN_TARGETS += src/data/trainers.h +AUTO_GEN_TARGETS += src/data/battle_partners.h +AUTO_GEN_TARGETS += test/battle/trainer_control.h +AUTO_GEN_TARGETS += src/data/debug_trainers.h + +%.h: %.party + $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - From f6b0a1584157f2acefc08876b2e400b165feb2f6 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 12 Jul 2025 18:50:08 -0400 Subject: [PATCH 140/248] Renaming to AI_ASSUME_STATUS_MOVES and making a config for universal status move guessing + disabling the custom tuning. --- docs/tutorials/ai_flags.md | 8 +- include/config/ai.h | 11 +- include/constants/battle_ai.h | 2 +- include/random.h | 11 +- src/battle_ai_util.c | 140 +++++++----------- ...rful_status.c => ai_assume_status_moves.c} | 29 +++- 6 files changed, 98 insertions(+), 103 deletions(-) rename test/battle/ai/{ai_assume_powerful_status.c => ai_assume_status_moves.c} (53%) diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index 6b8a2e941f..98657210d9 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -147,10 +147,12 @@ AI has full knowledge of player moves, abilities, and hold items, and can use th ## `AI_FLAG_ASSUME_STAB` A significantly more restricted version of `AI_FLAG_OMNISCIENT`, the AI only knows the player's STAB moves, as their existence would be reasonable to assume in almost any case. -## `AI_FLAG_ASSUME_POWERFUL_STATUS` -A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know if the player has certain strong status moves, plus also Fake Out and fixed percentage moves like Super Fang. The intention is so that if the AI has a counterplay implemented, it will seem to have guessed if the player's pokemon has a move, without giving the AI perfect information. For example, with Omniscient set, the AI will not put a pokemon to sleep if it has Sleep Talk; with neither Assume Powerful Status nor Omniscient set, the AI will always assume the pokemon does not have Sleep Talk. +## `AI_FLAG_ASSUME_STATUS_MOVES` +A more restricted version of `AI_FLAG_OMNISCIENT`. The AI has a _chance_ to know what status moves the player has, plus additionally Fake Out and fixed percentage moves like Super Fang. The intention is so that if the AI has a counterplay implemented, it will seem to have guessed if the player's pokemon has a move, without giving the AI perfect information. For example, with Omniscient set, the AI will not usually put a pokemon to sleep if it has Sleep Talk; with neither Assume Powerful Status nor Omniscient set, the AI will always assume the pokemon does not have Sleep Talk. -Percentages for the three groupings (high odds, medium odds, and low odds) are defined in `include/config/ai.h` under `ASSUME_POWERFUL_STATUS_HIGH_ODDS`, `ASSUME_POWERFUL_STATUS_MEDIUM_ODDS`, and `ASSUME_POWERFUL_STATUS_LOW_ODDS`. Moves are sorted in `src/battle_ai_util.c` within `ShouldRecordStatusMove()` +By default, there are three groups of higher likelihood status moves defined in `include/config/ai.h` under `ASSUME_STATUS_HIGH_ODDS`, `ASSUME_STATUS_MEDIUM_ODDS`, and `ASSUME_STATUS_LOW_ODDS`. Moves are sorted in `src/battle_ai_util.c` within `ShouldRecordStatusMove()`. + +Any move that is not special cased is then potentially caught by `ASSUME_ALL_STATUS_ODDS`. ## `AI_FLAG_SMART_MON_CHOICES` Affects what the AI chooses to send out after a switch. AI will make smarter decisions when choosing which mon to send out mid-battle and after a KO, which are handled separately. Automatically included when `AI_FLAG_SMART_SWITCHING` is enabled. diff --git a/include/config/ai.h b/include/config/ai.h index 8a97430d4b..44d2f3236d 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -76,10 +76,13 @@ // AI_FLAG_ASSUME_STAB settings #define ASSUME_STAB_SEES_ABILITY FALSE // Flag also gives omniscience for player's ability. Can use AI_FLAG_WEIGH_ABILITY_PREDICTION instead for smarter prediction without omniscience. -// AI_FLAG_ASSUME_POWERFUL_STATUS settings -#define ASSUME_POWERFUL_STATUS_HIGH_ODDS 90 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore -#define ASSUME_POWERFUL_STATUS_MEDIUM_ODDS 70 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect -#define ASSUME_POWERFUL_STATUS_LOW_ODDS 40 // Chance for AI to see niche moves a pokemon may have but probably won't, like Trick Room or Speed Swap +// AI_FLAG_ASSUME_STATUS_MOVES settings +#define ASSUME_STATUS_MOVES_HAS_TUNING TRUE // Flag has varying rates for different kinds of status move. + // Setting to false also means it will not alert on Fake Out or Super Fang. +#define ASSUME_STATUS_HIGH_ODDS 90 // Chance for AI to see extremely likely moves for a pokemon to have, like Spore +#define ASSUME_STATUS_MEDIUM_ODDS 70 // Chance for AI to see moderately likely moves for a pokemon to have, like Protect +#define ASSUME_STATUS_LOW_ODDS 40 // Chance for AI to see niche moves a pokemon may have but probably won't, like Entrainment +#define ASSUME_ALL_STATUS_ODDS 25 // Chance for the AI to see any kind of status move. // AI_FLAG_SMART_SWITCHING settings #define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index fa2a96ee5d..db386be4b0 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -34,7 +34,7 @@ #define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT #define AI_FLAG_SMART_TERA (1 << 27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). #define AI_FLAG_ASSUME_STAB (1 << 28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. -#define AI_FLAG_ASSUME_POWERFUL_STATUS (1 << 29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ASSUME_STATUS_MOVES (1 << 29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. #define AI_FLAG_COUNT 30 diff --git a/include/random.h b/include/random.h index df749312fd..130fb32e69 100644 --- a/include/random.h +++ b/include/random.h @@ -202,11 +202,12 @@ enum RandomTag RNG_AI_BOOST_INTO_HAZE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, - RNG_AI_ASSUME_POWERFUL_STATUS_SLEEP, - RNG_AI_ASSUME_POWERFUL_STATUS_NONVOLATILE, - RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS, - RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, - RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS, + RNG_AI_ASSUME_STATUS_SLEEP, + RNG_AI_ASSUME_STATUS_NONVOLATILE, + RNG_AI_ASSUME_STATUS_HIGH_ODDS, + RNG_AI_ASSUME_STATUS_MEDIUM_ODDS, + RNG_AI_ASSUME_STATUS_LOW_ODDS, + RNG_AI_ASSUME_ALL_STATUS, }; #define RandomWeighted(tag, ...) \ diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 2c7c850d1e..c14dddacf5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -143,8 +143,8 @@ bool32 IsAiBattlerAssumingStab() bool32 IsAiBattlerAssumingPowerfulStatus() { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_POWERFUL_STATUS - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_POWERFUL_STATUS) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STATUS_MOVES + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STATUS_MOVES) return TRUE; return FALSE; @@ -260,92 +260,62 @@ void SaveBattlerData(u32 battlerId) bool32 ShouldRecordStatusMove(u32 move) { - switch (GetMoveEffect(move)) + if (ASSUME_STATUS_MOVES_HAS_TUNING) { - // variable odds by additional effect - case EFFECT_NON_VOLATILE_STATUS: - if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP && RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_SLEEP, ASSUME_POWERFUL_STATUS_HIGH_ODDS)) - return TRUE; - else if (RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_NONVOLATILE, ASSUME_POWERFUL_STATUS_MEDIUM_ODDS)) - return TRUE; - break; - // High odds - case EFFECT_AURORA_VEIL: - case EFFECT_CHILLY_RECEPTION: - case EFFECT_CONVERSION: - case EFFECT_FIRST_TURN_ONLY: - case EFFECT_FOLLOW_ME: - case EFFECT_INSTRUCT: - case EFFECT_JUNGLE_HEALING: - case EFFECT_REVIVAL_BLESSING: - case EFFECT_SHED_TAIL: - case EFFECT_STICKY_WEB: - return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS, ASSUME_POWERFUL_STATUS_HIGH_ODDS); - // Medium odds - case EFFECT_AFTER_YOU: - case EFFECT_DEFOG: - case EFFECT_ENCORE: - case EFFECT_HAZE: - case EFFECT_HEAL_BELL: - case EFFECT_HEALING_WISH: - case EFFECT_HELPING_HAND: - case EFFECT_LIFE_DEW: - case EFFECT_MEMENTO: - case EFFECT_MOONLIGHT: - case EFFECT_MORNING_SUN: - case EFFECT_PARTING_SHOT: - case EFFECT_PROTECT: - case EFFECT_REST: - case EFFECT_RESTORE_HP: - case EFFECT_ROAR: - case EFFECT_ROOST: - case EFFECT_SHORE_UP: - case EFFECT_SLEEP_TALK: - case EFFECT_SOFTBOILED: - case EFFECT_SYNTHESIS: - case EFFECT_TAUNT: - case EFFECT_TAILWIND: - case EFFECT_TELEPORT: - case EFFECT_TRICK: - // defoggables / screens and hazards - case EFFECT_LIGHT_SCREEN: - case EFFECT_REFLECT: - case EFFECT_SPIKES: - case EFFECT_STEALTH_ROCK: - case EFFECT_TOXIC_SPIKES: - // field status - case EFFECT_HAIL: - case EFFECT_RAIN_DANCE: - case EFFECT_SANDSTORM: - case EFFECT_SNOWSCAPE: - case EFFECT_SUNNY_DAY: - case EFFECT_TRICK_ROOM: - case EFFECT_ELECTRIC_TERRAIN: - case EFFECT_GRASSY_TERRAIN: - case EFFECT_MISTY_TERRAIN: - case EFFECT_PSYCHIC_TERRAIN: - return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, ASSUME_POWERFUL_STATUS_MEDIUM_ODDS); - // Low odds - case EFFECT_COURT_CHANGE: - case EFFECT_DOODLE: - case EFFECT_ENTRAINMENT: - case EFFECT_FIXED_PERCENT_DAMAGE: - case EFFECT_GASTRO_ACID: - case EFFECT_GUARD_SPLIT: - case EFFECT_IMPRISON: - case EFFECT_PERISH_SONG: - case EFFECT_POWER_SPLIT: - case EFFECT_QUASH: - case EFFECT_ROLE_PLAY: - case EFFECT_SKILL_SWAP: - case EFFECT_SPEED_SWAP: - case EFFECT_WORRY_SEED: - return RandomPercentage(RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS, ASSUME_POWERFUL_STATUS_LOW_ODDS); - default: - break; + switch (GetMoveEffect(move)) + { + // variable odds by additional effect + case EFFECT_NON_VOLATILE_STATUS: + if (GetMoveNonVolatileStatus(move) == MOVE_EFFECT_SLEEP && RandomPercentage(RNG_AI_ASSUME_STATUS_SLEEP, ASSUME_STATUS_HIGH_ODDS)) + return TRUE; + else if (RandomPercentage(RNG_AI_ASSUME_STATUS_NONVOLATILE, ASSUME_STATUS_MEDIUM_ODDS)) + return TRUE; + break; + // High odds + case EFFECT_AURORA_VEIL: + case EFFECT_CHILLY_RECEPTION: + case EFFECT_FIRST_TURN_ONLY: + case EFFECT_FOLLOW_ME: + case EFFECT_INSTRUCT: + case EFFECT_JUNGLE_HEALING: + case EFFECT_SHED_TAIL: + return RandomPercentage(RNG_AI_ASSUME_STATUS_HIGH_ODDS, ASSUME_STATUS_HIGH_ODDS); + // Medium odds + case EFFECT_AFTER_YOU: + case EFFECT_DOODLE: + case EFFECT_ENCORE: + case EFFECT_HAZE: + case EFFECT_PARTING_SHOT: + case EFFECT_PROTECT: + case EFFECT_REST: + case EFFECT_ROAR: + case EFFECT_ROOST: + case EFFECT_SLEEP_TALK: + case EFFECT_TAUNT: + case EFFECT_TAILWIND: + case EFFECT_TRICK: + case EFFECT_TRICK_ROOM: + // defoggables / screens and hazards + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_SPIKES: + case EFFECT_STEALTH_ROCK: + case EFFECT_STICKY_WEB: + case EFFECT_TOXIC_SPIKES: + return RandomPercentage(RNG_AI_ASSUME_STATUS_MEDIUM_ODDS, ASSUME_STATUS_MEDIUM_ODDS); + // Low odds + case EFFECT_ENTRAINMENT: + case EFFECT_FIXED_PERCENT_DAMAGE: + case EFFECT_GASTRO_ACID: + case EFFECT_IMPRISON: + case EFFECT_TELEPORT: + return RandomPercentage(RNG_AI_ASSUME_STATUS_LOW_ODDS, ASSUME_STATUS_LOW_ODDS); + default: + break; + } } - return FALSE; + return RandomPercentage(RNG_AI_ASSUME_ALL_STATUS, ASSUME_ALL_STATUS_ODDS) && IsBattleMoveStatus(move); } static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) diff --git a/test/battle/ai/ai_assume_powerful_status.c b/test/battle/ai/ai_assume_status_moves.c similarity index 53% rename from test/battle/ai/ai_assume_powerful_status.c rename to test/battle/ai/ai_assume_status_moves.c index 1fd16adcf4..8fbaf01101 100644 --- a/test/battle/ai/ai_assume_powerful_status.c +++ b/test/battle/ai/ai_assume_status_moves.c @@ -2,14 +2,15 @@ #include "test/battle.h" #include "battle_ai_util.h" -AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_POWERFUL_STATUS correctly records assumed status moves") +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_STATUS_MOVES correctly records assumed status moves") { - PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_HIGH_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_HIGH_ODDS); - PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_MEDIUM_ODDS); - PASSES_RANDOMLY(ASSUME_POWERFUL_STATUS_LOW_ODDS, 100, RNG_AI_ASSUME_POWERFUL_STATUS_LOW_ODDS); + PASSES_RANDOMLY(ASSUME_STATUS_HIGH_ODDS, 100, RNG_AI_ASSUME_STATUS_HIGH_ODDS); + PASSES_RANDOMLY(ASSUME_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_STATUS_MEDIUM_ODDS); + PASSES_RANDOMLY(ASSUME_STATUS_LOW_ODDS, 100, RNG_AI_ASSUME_STATUS_LOW_ODDS); + PASSES_RANDOMLY(ASSUME_ALL_STATUS_ODDS, 100, RNG_AI_ASSUME_ALL_STATUS); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_POWERFUL_STATUS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_STATUS_MOVES); PLAYER(SPECIES_TYPHLOSION) { Moves(MOVE_TACKLE, MOVE_COURT_CHANGE, MOVE_FAKE_OUT); } PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HAIL, MOVE_SHED_TAIL, MOVE_THUNDERBOLT); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE); } @@ -28,3 +29,21 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ASSUME_POWERFUL_STATUS correctly records assumed EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_RIGHT][3], MOVE_NONE); } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_ASSUME_STATUS_MOVES changes behavior") +{ + if (ASSUME_STATUS_MOVES_HAS_TUNING) + PASSES_RANDOMLY(ASSUME_STATUS_MEDIUM_ODDS, 100, RNG_AI_ASSUME_STATUS_MEDIUM_ODDS); + else + PASSES_RANDOMLY(ASSUME_ALL_STATUS_ODDS, 100, RNG_AI_ASSUME_ALL_STATUS); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ASSUME_STATUS_MOVES); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_REST, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_WORRY_SEED, MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_WORRY_SEED); } + } +} + + From 165e7502bc38232b769e306bab5f63e9663273b0 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Sun, 13 Jul 2025 16:21:37 +0200 Subject: [PATCH 141/248] Instant Win option in Battle Debug --- include/battle_main.h | 1 + src/battle_debug.c | 10 ++++++++++ src/battle_main.c | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/include/battle_main.h b/include/battle_main.h index 6367f7e0f4..bf8e88fc5d 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -116,6 +116,7 @@ u32 GeneratePersonalityForGender(u32 gender, u32 species); void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon *partyEntry); bool32 CanPlayerForfeitNormalTrainerBattle(void); bool32 DidPlayerForfeitNormalTrainerBattle(void); +void BattleDebug_WonBattle(void); extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/src/battle_debug.c b/src/battle_debug.c index cd3b3cd253..e746ee619d 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -114,6 +114,7 @@ enum LIST_ITEM_AI_INFO, LIST_ITEM_AI_PARTY, LIST_ITEM_VARIOUS, + LIST_ITEM_INSTANT_WIN, LIST_ITEM_COUNT }; @@ -376,6 +377,7 @@ static const struct ListMenuItem sMainListItems[] = {COMPOUND_STRING("AI Info"), LIST_ITEM_AI_INFO}, {COMPOUND_STRING("AI Party"), LIST_ITEM_AI_PARTY}, {COMPOUND_STRING("Various"), LIST_ITEM_VARIOUS}, + {COMPOUND_STRING("Instant Win"), LIST_ITEM_INSTANT_WIN}, }; static const struct ListMenuItem sStatsListItems[] = @@ -1243,6 +1245,13 @@ static void Task_DebugMenuProcessInput(u8 taskId) SwitchToAiPartyView(taskId); return; } + else if (listItemId == LIST_ITEM_INSTANT_WIN && JOY_NEW(A_BUTTON)) + { + BattleDebug_WonBattle(); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_DebugMenuFadeOut; + return; + } data->currentMainListItemId = listItemId; // Create the secondary menu list. @@ -1445,6 +1454,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) listTemplate.items = sSideStatusListItems; itemsCount = ARRAY_COUNT(sSideStatusListItems); break; + case LIST_ITEM_INSTANT_WIN: case LIST_ITEM_AI_MOVES_PTS: case LIST_ITEM_AI_INFO: return; diff --git a/src/battle_main.c b/src/battle_main.c index 22c27ea460..eeb9cd5065 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6142,3 +6142,10 @@ bool32 DidPlayerForfeitNormalTrainerBattle(void) return (gBattleOutcome == B_OUTCOME_FORFEITED); } + +// Wins the battle instantly. Used in the battle debug with LIST_ITEM_INSTANT_WIN +void BattleDebug_WonBattle(void) +{ + gBattleOutcome |= B_OUTCOME_WON; + gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; +} \ No newline at end of file From 819e7d9c03721f90dc5de5dc43537cc7e79e0cb2 Mon Sep 17 00:00:00 2001 From: Pawkkie Date: Sun, 13 Jul 2025 14:16:22 -0400 Subject: [PATCH 142/248] Fix failing test --- test/battle/ai/ai_switching.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 8a1070b42c..0aae647030 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -714,7 +714,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if it has PARAMETRIZE { hp = 10; } GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH, MOVE_YAWN); } OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH); HP(hp); MaxHP(30); } OPPONENT(SPECIES_SLAKOTH) { Level(1); Moves(MOVE_HEADBUTT); } From 688ec0023eb3fbc83da9c41ba4fa967da3211904 Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Mon, 14 Jul 2025 01:47:14 +0700 Subject: [PATCH 143/248] battle intro: fix issues with follower slide-in and wild shiny mon (#7325) --- src/battle_controllers.c | 10 ++++------ src/pokeball.c | 5 ++++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 47bb0b37ee..8706cc9e06 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2237,9 +2237,7 @@ void BtlController_HandleLoadMonSprite(u32 battler) SetBattlerShadowSpriteCallback(battler, species); - if (IsControllerOpponent(battler) - && IsControllerLinkOpponent(battler) - && IsControllerRecordedOpponent(battler)) + if (IsControllerOpponent(battler) || IsControllerLinkOpponent(battler) || IsControllerRecordedOpponent(battler)) gBattlerControllerFuncs[battler] = TryShinyAnimAfterMonAnim; else gBattlerControllerFuncs[battler] = WaitForMonAnimAfterLoad; @@ -2919,14 +2917,14 @@ void TrySetBattlerShadowSpriteCallback(u32 battler) void TryShinyAnimAfterMonAnim(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[battler]].x2 == 0) + if (gSprites[gBattlerSpriteIds[battler]].x2 == 0) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) { TryShinyAnimation(battler, GetBattlerMon(battler)); } - else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) + + if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; diff --git a/src/pokeball.c b/src/pokeball.c index d77d49797d..5608de9647 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -1080,8 +1080,11 @@ static void HandleBallAnimEnd(struct Sprite *sprite) AnimateSprite(&gSprites[gBattlerSpriteIds[battler]]); gSprites[gBattlerSpriteIds[battler]].data[1] = 0x1000; } + else + { + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + } - gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; if (gSprites[gBattlerSpriteIds[battler]].affineAnimEnded) From 5c2980b906582edd564c75b8fdc583b7b584deeb Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 13 Jul 2025 16:31:19 -0400 Subject: [PATCH 144/248] AI assumes Magnitude / Present damage (#7334) --- src/battle_ai_util.c | 4 ++++ test/battle/ai/ai.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c9fb43c143..7f3b6b74e2 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -783,6 +783,10 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u SetDynamicMoveCategory(battlerAtk, battlerDef, move); SetTypeBeforeUsingMove(move, battlerAtk); + // We can set those globals because they are going to get rerolled on attack execution + gBattleStruct->magnitudeBasePower = 70; + gBattleStruct->presentBasePower = 80; + struct DamageContext ctx; ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 4f06680c8e..d9d0782b0d 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -897,3 +897,18 @@ AI_SINGLE_BATTLE_TEST("Move scoring comparison properly awards bonus point to be TURN { EXPECT_MOVE(opponent, MOVE_WATER_SPOUT); } } } + +AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_MAGNITUDE) == EFFECT_MAGNITUDE); + ASSUME(GetMoveType(MOVE_MAGNITUDE) == TYPE_GROUND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_GEODUDE) { Level(15); Moves(MOVE_DEFENSE_CURL, MOVE_MAGNITUDE); } + OPPONENT(SPECIES_TYRUNT) { Level(13); Moves(MOVE_BITE, MOVE_THUNDER_FANG, MOVE_ROCK_TOMB); } + OPPONENT(SPECIES_ZUBAT) { Level(14); Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_MAGNITUDE); EXPECT_SWITCH(opponent, 1); } + } +} From f0da7c1707f5973bf15dc44760f451a7c843e4f2 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sun, 13 Jul 2025 22:00:00 -0400 Subject: [PATCH 145/248] Renaming Powerful status functions. --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 6 +++--- src/battle_ai_util.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 1e03090dde..059809d6a5 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -61,7 +61,7 @@ bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); bool32 IsAiBattlerAware(u32 battlerId); bool32 IsAiBattlerAssumingStab(void); -bool32 IsAiBattlerAssumingPowerfulStatus(void); +bool32 IsAiBattlerAssumingStatusMoves(void); bool32 ShouldRecordStatusMove(u32 move); void ClearBattlerMoveHistory(u32 battlerId); void RecordLastUsedMoveBy(u32 battlerId, u32 move); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a14ebd4c1a..a659c6befa 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -544,7 +544,7 @@ void RecordMovesBasedOnStab(u32 battler) } } -void RecordPowerfulStatusMoves(u32 battler) +void RecordStatusMoves(u32 battler) { u32 i; for (i = 0; i < MAX_MON_MOVES; i++) @@ -571,8 +571,8 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) if (IsAiBattlerAssumingStab()) RecordMovesBasedOnStab(battler); - if (IsAiBattlerAssumingPowerfulStatus()) - RecordPowerfulStatusMoves(battler); + if (IsAiBattlerAssumingStatusMoves()) + RecordStatusMoves(battler); } #define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c14dddacf5..77aabccb11 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -141,7 +141,7 @@ bool32 IsAiBattlerAssumingStab() return FALSE; } -bool32 IsAiBattlerAssumingPowerfulStatus() +bool32 IsAiBattlerAssumingStatusMoves() { if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STATUS_MOVES || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STATUS_MOVES) From b62e4924a3220ce5a913b599b5d97a409eaae198 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Mon, 14 Jul 2025 06:08:14 -0500 Subject: [PATCH 146/248] Turn `OW_FRLG_WHITEOUT` into `OW_WHITEOUT_CUTSCENE` and make it generational (#6962) --- include/config/overworld.h | 2 +- src/field_screen_effect.c | 24 ++++++++++++------------ src/overworld.c | 8 ++++---- src/strings.c | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/config/overworld.h b/include/config/overworld.h index fa87da4d83..b1f107ce63 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -9,7 +9,7 @@ #define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all. #define OW_DOUBLE_APPROACH_WITH_ONE_MON FALSE // If enabled, you can be spotted by two trainers at the same time even if you only have one eligible Pokémon in your party. #define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last. -#define OW_FRLG_WHITEOUT FALSE // If enabled, shows an additional whiteout message and post whiteout event script with healing NPC. +#define OW_WHITEOUT_CUTSCENE GEN_LATEST // In Gen4+, whiting out shows an additional message and post whiteout event script cutscene with a healing NPC. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.) #define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt. // Item Obtain Description Box diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 44ef4dd286..fde3036730 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1384,10 +1384,10 @@ static bool32 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u32 x, u32 } enum { - FRLG_WHITEOUT_ENTER_MSG_SCREEN, - FRLG_WHITEOUT_PRINT_MSG, - FRLG_WHITEOUT_LEAVE_MSG_SCREEN, - FRLG_WHITEOUT_HEAL_SCRIPT, + WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN, + WHITEOUT_CUTSCENE_PRINT_MSG, + WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN, + WHITEOUT_CUTSCENE_HEAL_SCRIPT, }; static const u8 *GenerateRecoveryMessage(u8 taskId) @@ -1411,7 +1411,7 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId) switch (gTasks[taskId].tState) { - case FRLG_WHITEOUT_ENTER_MSG_SCREEN: + case WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN: windowId = AddWindow(&sWindowTemplate_WhiteoutText); gTasks[taskId].tWindowId = windowId; Menu_LoadStdPalAt(BG_PLTT_ID(15)); @@ -1420,28 +1420,28 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId) CopyWindowToVram(windowId, COPYWIN_FULL); gTasks[taskId].tIsPlayerHouse = IsLastHealLocationPlayerHouse(); - gTasks[taskId].tState = FRLG_WHITEOUT_PRINT_MSG; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_PRINT_MSG; break; - case FRLG_WHITEOUT_PRINT_MSG: + case WHITEOUT_CUTSCENE_PRINT_MSG: { const u8 *recoveryMessage = GenerateRecoveryMessage(taskId); if (PrintWhiteOutRecoveryMessage(taskId, recoveryMessage, 2, 8)) { ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH); - gTasks[taskId].tState = FRLG_WHITEOUT_LEAVE_MSG_SCREEN; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN; } break; } - case FRLG_WHITEOUT_LEAVE_MSG_SCREEN: + case WHITEOUT_CUTSCENE_LEAVE_MSG_SCREEN: windowId = gTasks[taskId].tWindowId; ClearWindowTilemap(windowId); CopyWindowToVram(windowId, COPYWIN_MAP); RemoveWindow(windowId); FadeInFromBlack(); - gTasks[taskId].tState = FRLG_WHITEOUT_HEAL_SCRIPT; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_HEAL_SCRIPT; break; - case FRLG_WHITEOUT_HEAL_SCRIPT: + case WHITEOUT_CUTSCENE_HEAL_SCRIPT: if (WaitForWeatherFadeIn() == TRUE) { DestroyTask(taskId); @@ -1461,7 +1461,7 @@ void FieldCB_RushInjuredPokemonToCenter(void) LockPlayerFieldControls(); FillPalBufferBlack(); taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10); - gTasks[taskId].tState = FRLG_WHITEOUT_ENTER_MSG_SCREEN; + gTasks[taskId].tState = WHITEOUT_CUTSCENE_ENTER_MSG_SCREEN; } static void GetStairsMovementDirection(u32 metatileBehavior, s16 *speedX, s16 *speedY) diff --git a/src/overworld.c b/src/overworld.c index 9dac585f62..7fb339966b 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -707,16 +707,16 @@ void SetWarpDestinationToHealLocation(u8 healLocationId) SetWarpDestination(healLocation->mapGroup, healLocation->mapNum, WARP_ID_NONE, healLocation->x, healLocation->y); } -static bool32 IsFRLGWhiteout(void) +static bool32 IsWhiteoutCutscene(void) { - if (!OW_FRLG_WHITEOUT) + if (OW_WHITEOUT_CUTSCENE < GEN_4) return FALSE; return GetHealNpcLocalId(GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation)) > 0; } void SetWarpDestinationToLastHealLocation(void) { - if (IsFRLGWhiteout()) + if (IsWhiteoutCutscene()) SetWhiteoutRespawnWarpAndHealerNPC(&sWarpDestination); else sWarpDestination = gSaveBlock1Ptr->lastHealLocation; @@ -1810,7 +1810,7 @@ void CB2_WhiteOut(void) ResetInitialPlayerAvatarState(); ScriptContext_Init(); UnlockPlayerFieldControls(); - if (IsFRLGWhiteout()) + if (IsWhiteoutCutscene()) gFieldCallback = FieldCB_RushInjuredPokemonToCenter; else gFieldCallback = FieldCB_WarpExitFadeFromBlack; diff --git a/src/strings.c b/src/strings.c index 4846bea8ed..fd92b31e92 100644 --- a/src/strings.c +++ b/src/strings.c @@ -809,8 +809,8 @@ const u8 gText_ThankYou[] = _("THANK YOU"); const u8 gText_ByeBye[] = _("BYE-BYE!"); const u8 gText_PlayerScurriedToCenter[] = _("{PLAYER} scurried to a POKéMON CENTER,\nprotecting the exhausted and fainted\nPOKéMON from further harm…\p"); const u8 gText_PlayerScurriedBackHome[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKéMON from\nfurther harm…\p"); -const u8 gText_PlayerRegroupCenter[] = _("{PLAYER} went running back to a POKéMON CENTER\nto regroup and reconsider their battle\lstrategy…\p"); -const u8 gText_PlayerRegroupHome[] = _("{PLAYER} went running back home to regroup\nand reconsider their battle strategy…\p"); +const u8 gText_PlayerRegroupCenter[] = _("{PLAYER} scurried to a POKéMON CENTER,\nto regroup and reconsider the battle\nstrategy…\p"); +const u8 gText_PlayerRegroupHome[] = _("{PLAYER} scurried back home, to regroup\nand reconsider the battle strategy…\p"); const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); const u8 gText_NicknameHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); ALIGNED(4) const u8 gText_ReadyPickBerry[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); From d5c1d3322cc2712f2e7c21e45f43f931c100a364 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:52:44 +0200 Subject: [PATCH 147/248] Fixes Status overwrites and Effect Spore wrong func args (#7340) --- include/battle.h | 3 ++- src/battle_script_commands.c | 6 +++-- src/battle_util.c | 30 ++++++++++++++-------- test/battle/ability/effect_spore.c | 19 ++++++++++++++ test/battle/move_effect/protect.c | 40 ++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/include/battle.h b/include/battle.h index b537f779af..17da0add57 100644 --- a/include/battle.h +++ b/include/battle.h @@ -658,7 +658,8 @@ struct BattleStruct u8 anyMonHasTransformed:1; // Only used in battle_tv.c u8 multipleSwitchInState:2; u8 multipleSwitchInCursor:3; - u8 padding1:2; + u8 sleepClauseNotBlocked:1; + u8 padding1:1; u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; void (*savedCallback)(void); u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 26144cecd1..533c25171f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5864,7 +5864,8 @@ static void Cmd_moveend(void) } break; case PROTECT_BANEFUL_BUNKER: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_POISON; @@ -5874,7 +5875,8 @@ static void Cmd_moveend(void) } break; case PROTECT_BURNING_BULWARK: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) { gEffectBattler = gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 82a139cb26..da9dae3113 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4624,9 +4624,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_EFFECT_SPORE: { - u32 ability = GetBattlerAbility(gBattlerAttacker); + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6) - && ability != ABILITY_OVERCOAT + && abilityAtk != ABILITY_OVERCOAT && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) { u32 poison, paralysis, sleep; @@ -4653,7 +4653,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBeSlept(gBattlerAttacker, gBattlerTarget, ability, NOT_BLOCKED_BY_SLEEP_CLAUSE) + && CanBeSlept(gBattlerTarget, gBattlerAttacker, abilityAtk, NOT_BLOCKED_BY_SLEEP_CLAUSE) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) { if (IsSleepClauseEnabled()) @@ -4672,11 +4672,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker)) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, abilityAtk) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -4691,11 +4692,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, abilityAtk) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5498,9 +5500,13 @@ bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag) bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause) { - if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause) + if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause != NOT_BLOCKED_BY_SLEEP_CLAUSE) return FALSE; + if (isBlockedBySleepClause == NOT_BLOCKED_BY_SLEEP_CLAUSE) + gBattleStruct->sleepClauseNotBlocked = TRUE; + + bool32 effect = FALSE; if (CanSetNonVolatileStatus( battlerAtk, battlerDef, @@ -5508,8 +5514,10 @@ bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClau abilityDef, MOVE_EFFECT_SLEEP, // also covers yawn CHECK_TRIGGER)) - return TRUE; - return FALSE; + effect = TRUE; + + gBattleStruct->sleepClauseNotBlocked = FALSE; + return effect; } bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef) @@ -5665,7 +5673,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_CantMakeAsleep; } - else if (CanSleepDueToSleepClause(battlerAtk, battlerDef, option)) + else if (!gBattleStruct->sleepClauseNotBlocked && CanSleepDueToSleepClause(battlerAtk, battlerDef, option)) { battleScript = BattleScript_SleepClauseBlocked; } diff --git a/test/battle/ability/effect_spore.c b/test/battle/ability/effect_spore.c index 57f5399b53..912c311ca7 100644 --- a/test/battle/ability/effect_spore.c +++ b/test/battle/ability/effect_spore.c @@ -88,3 +88,22 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time") STATUS_ICON(player, sleep: TRUE); } } + +SINGLE_BATTLE_TEST("Effect Spore will check if it can inflict status onto attacker, not itself") +{ + PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + GIVEN { + ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BRELOOM) { Status1(STATUS1_BURN); Ability(ABILITY_EFFECT_SPORE); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + TURN {} + } SCENE { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("The opposing Breloom's Effect Spore made Wobbuffet sleep!"); + STATUS_ICON(player, sleep: TRUE); + } +} diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 75efb2faa6..111cb3ca42 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -194,6 +194,26 @@ SINGLE_BATTLE_TEST("Protect: Baneful Bunker poisons pokemon for moves making con } } +SINGLE_BATTLE_TEST("Protect: Baneful Bunker can't poison pokemon if they are already statused") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_NUZZLE); } + TURN { MOVE(opponent, MOVE_BANEFUL_BUNKER); MOVE(player, MOVE_SCRATCH); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BANEFUL_BUNKER, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + STATUS_ICON(player, STATUS1_POISON); + } + } +} + SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns pokemon for moves making contact") { u16 usedMove = MOVE_NONE; @@ -226,6 +246,26 @@ SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns pokemon for moves making cont } } +SINGLE_BATTLE_TEST("Protect: Burning Bulwark can't burn pokemon if they are already statused") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_NUZZLE); } + TURN { MOVE(opponent, MOVE_BURNING_BULWARK); MOVE(player, MOVE_SCRATCH); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURNING_BULWARK, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent); + STATUS_ICON(player, STATUS1_BURN); + } + } +} + SINGLE_BATTLE_TEST("Protect: Recoil damage is not applied if target was protected") { u32 j, k; From 64f9d6a24ecd8e47b6707ff495769e9745ee2ba3 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:13:30 -0400 Subject: [PATCH 148/248] Fix AI resisted move scoring (#7350) --- src/battle_ai_main.c | 23 ----------------------- test/battle/ai/ai.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2b6094c925..95c94eb455 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1118,30 +1118,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } if (effectiveness == UQ_4_12(0.0)) - { RETURN_SCORE_MINUS(20); - } - else if (effectiveness < UQ_4_12(0.5)) - { - switch (moveEffect) - { - case EFFECT_FIXED_HP_DAMAGE: - case EFFECT_LEVEL_DAMAGE: - case EFFECT_PSYWAVE: - case EFFECT_OHKO: - case EFFECT_SHEER_COLD: - case EFFECT_BIDE: - case EFFECT_FIXED_PERCENT_DAMAGE: - case EFFECT_ENDEAVOR: - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: - case EFFECT_METAL_BURST: - case EFFECT_FINAL_GAMBIT: - break; - default: - RETURN_SCORE_MINUS(10); - } - } if (DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)) abilityDef = ABILITY_NONE; diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index d9d0782b0d..7eb06dd5d4 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -912,3 +912,14 @@ AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage") TURN { MOVE(player, MOVE_MAGNITUDE); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); }; + OPPONENT(SPECIES_GLOOM) { Moves(MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_LEECH_SEED, MOVE_SYNTHESIS); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); EXPECT_MOVE(opponent, MOVE_MEGA_DRAIN);} + } +} From 0406caa687b03c2bf70acfaf7f36459f0b17dcf8 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:05:08 -0400 Subject: [PATCH 149/248] Improve AI's setup logic (#7345) --- src/battle_ai_util.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ test/battle/ai/ai.c | 22 +++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 625ea3a9e1..b9e90ee4fd 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1443,6 +1443,26 @@ bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) return FALSE; } +// Can battler KO the target ignoring any Endure effects (Sturdy, Focus Sash, etc.) +bool32 CanBattlerKOTargetIgnoringSturdy(u32 battlerAtk, u32 battlerDef) +{ + struct AiLogicData *aiData = gAiLogicData; + s32 moveIndex, dmg; + u16 *moves = GetMovesArray(battlerAtk); + u32 moveLimitations = aiData->moveLimitations[battlerAtk]; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; + dmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, AI_ATTACKING, aiData); + + if (gBattleMons[battlerDef].hp <= dmg && CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) + return TRUE; + } + return FALSE; +} + bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) { u32 indexSlot = GetMoveSlot(GetMovesArray(battlerDef), move); @@ -4220,6 +4240,35 @@ bool32 IsRecycleEncouragedItem(u32 item) return FALSE; } +bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiIsFaster) +{ + s32 i; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] == MOVE_NONE || moves[i] == MOVE_UNAVAILABLE) + continue; + if (noOfHitsToFaint <= 2) + { + if (GetMovePriority(moves[i]) > 0) + return TRUE; + + switch (gMovesInfo[moves[i]].additionalEffects[i].moveEffect) + { + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + { + if(aiIsFaster) + return TRUE; + } + } + } + } + + return FALSE; +} + static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statId, bool32 considerContrary) { enum AIScore tempScore = NO_INCREASE; @@ -4268,6 +4317,14 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) return NO_INCREASE; + // Don't increase stats if AI could KO target through Sturdy effect, as otherwise it always 2HKOs + if (CanBattlerKOTargetIgnoringSturdy(battlerAtk, battlerDef)) + return NO_INCREASE; + + // Don't increase stats if player has a move that can change the KO threshold + if (HasMoveThatChangesKOThreshold(battlerDef, noOfHitsToFaint, aiIsFaster)) + return NO_INCREASE; + // Predicting switch if (IsBattlerPredictedToSwitch(battlerDef)) { diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 7eb06dd5d4..5202afe606 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -923,3 +923,25 @@ AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move") TURN { MOVE(player, MOVE_ABSORB); EXPECT_MOVE(opponent, MOVE_MEGA_DRAIN);} } } + +AI_SINGLE_BATTLE_TEST("AI won't setup if it can KO through Sturdy effect") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_SKARMORY) { Ability(ABILITY_STURDY); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_MOLTRES) { Moves(MOVE_FIRE_BLAST, MOVE_AGILITY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_FIRE_BLAST); } + } +} + +AI_SINGLE_BATTLE_TEST("AI won't setup if otherwise good scenario is changed by the presence of priority") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_FLOATZEL) { Speed(2); Moves(MOVE_AQUA_JET, MOVE_SURF); } + OPPONENT(SPECIES_DONPHAN) { Speed(5); Moves(MOVE_BULK_UP, MOVE_EARTHQUAKE); } + } WHEN { + TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_EARTHQUAKE); } + } +} From 65a63fb9f0845775e4d368817297b96ff7415cd3 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:30:51 -0400 Subject: [PATCH 150/248] Improve AI's ShouldRecover (#7342) --- include/battle_ai_util.h | 4 +-- include/config/ai.h | 2 ++ include/random.h | 1 + src/battle_ai_main.c | 27 ++++++++++++------ src/battle_ai_util.c | 61 +++++++++++++++++++++++++++++++--------- test/battle/ai/ai.c | 39 +++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 23 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index f4bd20d3d8..d4a66f2028 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -93,7 +93,7 @@ bool32 AI_CanBattlerEscape(u32 battler); bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef); s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 moveConsidered); bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk); -u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk); +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk); u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext); bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); @@ -115,7 +115,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex); u32 GetBattlerSideSpeedAverage(u32 battler); bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, enum DamageCalcContext calcContext); +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex); bool32 IsRecycleEncouragedItem(u32 item); diff --git a/include/config/ai.h b/include/config/ai.h index 44d2f3236d..ec359c646d 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -56,6 +56,8 @@ // AI move scoring #define STATUS_MOVE_FOCUS_PUNCH_CHANCE 50 // Chance the AI will use a status move if the player's best move is Focus Punch #define BOOST_INTO_HAZE_CHANCE 0 // Chance the AI will use a stat boosting move if the player has used Haze +#define SHOULD_RECOVER_CHANCE 50 // Chance the AI will give recovery moves score increase if less than ENABLE_RECOVERY_THRESHOLD and in no immediate danger +#define ENABLE_RECOVERY_THRESHOLD 60 // HP percentage beneath which SHOULD_RECOVER_CHANCE is active // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit diff --git a/include/random.h b/include/random.h index 130fb32e69..65e48e1b86 100644 --- a/include/random.h +++ b/include/random.h @@ -200,6 +200,7 @@ enum RandomTag RNG_AI_PREDICT_MOVE, RNG_AI_STATUS_FOCUS_PUNCH, RNG_AI_BOOST_INTO_HAZE, + RNG_AI_SHOULD_RECOVER, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, RNG_AI_ASSUME_STATUS_SLEEP, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 95c94eb455..5586934eea 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3897,11 +3897,22 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_DREAM_EATER: - case EFFECT_STRENGTH_SAP: case EFFECT_AQUA_RING: if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); break; + case EFFECT_STRENGTH_SAP: + u32 atkStat = gBattleMons[battlerDef].attack; + u32 atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; + atkStat *= gStatStageRatios[atkStage][0]; + atkStat /= gStatStageRatios[atkStage][1]; + u32 healPercent = atkStat * 100 / gBattleMons[battlerAtk].maxHP; + if (ShouldRecover(battlerAtk, battlerDef, move, healPercent)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) + ADJUST_SCORE(WEAK_EFFECT); + } case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: @@ -4054,7 +4065,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; } - if (ShouldRecover(battlerAtk, battlerDef, move, healPercent, AI_DEFENDING)) + if (ShouldRecover(battlerAtk, battlerDef, move, healPercent)) ADJUST_SCORE(DECENT_EFFECT); } break; @@ -4064,7 +4075,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if (ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING)) + if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_LIGHT_SCREEN: @@ -4082,7 +4093,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { break; } - else if (ShouldRecover(battlerAtk, battlerDef, move, 100, AI_DEFENDING)) + else if (ShouldRecover(battlerAtk, battlerDef, move, 100)) { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_SLP || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_STATUS @@ -5044,9 +5055,9 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SHORE_UP: - if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67, AI_DEFENDING)) + if ((AI_GetWeather() & B_WEATHER_SANDSTORM) && ShouldRecover(battlerAtk, battlerDef, move, 67)) ADJUST_SCORE(DECENT_EFFECT); - else if (ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING)) + else if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_ENDEAVOR: @@ -5072,8 +5083,8 @@ case EFFECT_GUARD_SPLIT: //case EFFECT_SKY_DROP //break; case EFFECT_JUNGLE_HEALING: - if (ShouldRecover(battlerAtk, battlerDef, move, 25, AI_DEFENDING) - || ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25, AI_DEFENDING) + if (ShouldRecover(battlerAtk, battlerDef, move, 25) + || ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25) || gBattleMons[battlerAtk].status1 & STATUS1_ANY || gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) ADJUST_SCORE(GOOD_EFFECT); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b9e90ee4fd..ff81162d52 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1349,7 +1349,7 @@ bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) return FALSE; } -u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk) +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk) { u32 i; u32 currNumberOfHits; @@ -1367,6 +1367,32 @@ u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk) return leastNumberOfHits; } +u32 NoOfHitsForTargetToFaintBattlerWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod) +{ + u32 i; + u32 currNumberOfHits; + u32 leastNumberOfHits = UNKNOWN_NO_OF_HITS; + u32 hpCheck = gBattleMons[battlerAtk].hp + hpMod; + u32 damageDealt = 0; + + if (hpCheck > gBattleMons[battlerAtk].maxHP) + hpCheck = gBattleMons[battlerAtk].maxHP; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + damageDealt = AI_GetDamage(battlerDef, battlerAtk, i, AI_DEFENDING, gAiLogicData); + if (damageDealt == 0) + continue; + currNumberOfHits = hpCheck / (damageDealt + 1) + 1; + if (currNumberOfHits != 0) + { + if (currNumberOfHits < leastNumberOfHits) + leastNumberOfHits = currNumberOfHits; + } + } + return leastNumberOfHits; +} + u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { struct AiLogicData *aiData = gAiLogicData; @@ -3710,21 +3736,30 @@ bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) return FALSE; } -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, enum DamageCalcContext calcContext) +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) { - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) + u32 maxHP = gBattleMons[battlerAtk].maxHP; + u32 healAmount = (healPercent * maxHP) / 100; + if (healAmount > maxHP) + healAmount = maxHP; + if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + healAmount = 0; + if (AI_IsFaster(battlerAtk, battlerDef, move)) { - // using item or user going first - s32 damage = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); - s32 healAmount = (healPercent * damage) / 100; - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) - healAmount = 0; - if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) return TRUE; // target can faint attacker unless they heal - else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < 60 && (Random() % 3)) - return TRUE; // target can't faint attacker at all, attacker health is about half, 2/3rds rate of encouraging healing + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < ENABLE_RECOVERY_THRESHOLD && RandomPercentage(RNG_AI_SHOULD_RECOVER, SHOULD_RECOVER_CHANCE)) + return TRUE; // target can't faint attacker at all, generally safe + } + else + { + if (!CanTargetFaintAi(battlerDef, battlerAtk) + && GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < healAmount + && NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk) < NoOfHitsForTargetToFaintBattlerWithMod(battlerDef, battlerAtk, healAmount)) + return TRUE; // target can't faint attacker and is dealing less damage than we're healing + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < ENABLE_RECOVERY_THRESHOLD && RandomPercentage(RNG_AI_SHOULD_RECOVER, SHOULD_RECOVER_CHANCE)) + return TRUE; // target can't faint attacker at all, generally safe } return FALSE; } @@ -3972,7 +4007,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) switch (GetMoveEffect(move)) { case EFFECT_WISH: - return ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING); // Switch recovery isn't good idea in doubles + return ShouldRecover(battlerAtk, battlerDef, move, 50); // Switch recovery isn't good idea in doubles case EFFECT_HEAL_BELL: if (hasStatus) return TRUE; @@ -4272,7 +4307,7 @@ bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiI static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statId, bool32 considerContrary) { enum AIScore tempScore = NO_INCREASE; - u32 noOfHitsToFaint = NoOfHitsForTargetToFaintAI(battlerDef, battlerAtk); + u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk); u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, TRUE); u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 5202afe606..bd827fe5a8 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -945,3 +945,42 @@ AI_SINGLE_BATTLE_TEST("AI won't setup if otherwise good scenario is changed by t TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_EARTHQUAKE); } } } + +AI_SINGLE_BATTLE_TEST("AI will use Recovery move if it outheals your damage and outspeeds") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(2); Moves(MOVE_HEADBUTT); } + OPPONENT(SPECIES_GASTRODON) { Speed(5); Moves(MOVE_SCALD, MOVE_RECOVER); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); EXPECT_MOVE(opponent, MOVE_RECOVER); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will use recovery move if it outheals your damage and is outsped") +{ + u32 aiMove = MOVE_NONE; + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + PARAMETRIZE{ aiMove = MOVE_RECOVER; } + PARAMETRIZE{ aiMove = MOVE_STRENGTH_SAP; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(5); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_GASTRODON) { Speed(2); Moves(MOVE_SCALD, aiMove); HP(200); MaxHP(400); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, aiMove); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will use recovery move if is in no immediate danger beneath an HP threshold") +{ + PASSES_RANDOMLY(SHOULD_RECOVER_CHANCE, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_LINOONE) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_GASTRODON) { Speed(5); Moves(MOVE_SCALD, MOVE_RECOVER); HP(200); MaxHP(400); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_RECOVER); } + } +} From 05b1db8cc64ca1fbef534511602e5f0e31062e97 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 18 Jul 2025 16:57:57 +0200 Subject: [PATCH 151/248] `trainerproc` copy other trainer party (#7251) --- docs/tutorials/how_to_trainer_party_pool.md | 5 +++ include/data.h | 1 + src/battle_main.c | 19 ++++++++- tools/trainerproc/main.c | 43 +++++++++++++++++---- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/docs/tutorials/how_to_trainer_party_pool.md b/docs/tutorials/how_to_trainer_party_pool.md index e0e7639de3..e111ba957e 100644 --- a/docs/tutorials/how_to_trainer_party_pool.md +++ b/docs/tutorials/how_to_trainer_party_pool.md @@ -52,6 +52,11 @@ By default, only `DefaultPickFunction` and `PickLowest` are implemente - `Pool Prune` (`.poolPruneIndex`) controls if members in the pool should be removed before party members are picked from the pool. By default, only `POOL_PRUNE_NONE`, which doesn't remove anything from the pool, and `POOL_PRUNE_TEST`, which removes Wobbuffet from the pool, are implemented. Must be an `enum` value in `enum PoolPruneOptions`. +## Pool copy +The `Copy Pool` option can be used to have the trainer use the party or pool from a different trainer. +If you for example want some other trainer to have the same team/pool as Tiana, you'd use `Copy Pool: TRAINER_TIANA`. +If `Party Size` isn't defined for the current trainer, it will inherit from the copied trainer. + ## Example pool ``` === TRAINER_TIANA === diff --git a/include/data.h b/include/data.h index 003d669f8e..ffa1a4cba0 100644 --- a/include/data.h +++ b/include/data.h @@ -105,6 +105,7 @@ struct Trainer /*0x22*/ u8 poolRuleIndex; /*0x23*/ u8 poolPickIndex; /*0x24*/ u8 poolPruneIndex; + /*0x25*/ u16 overrideTrainer; }; struct TrainerClass diff --git a/src/battle_main.c b/src/battle_main.c index 7ba11811f6..8c4ba46261 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2026,7 +2026,24 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir u8 retVal; if (trainerNum == TRAINER_SECRET_BASE) return 0; - retVal = CreateNPCTrainerPartyFromTrainer(party, GetTrainerStructFromId(trainerNum), firstTrainer, gBattleTypeFlags); + if (GetTrainerStructFromId(trainerNum)->overrideTrainer) + { + struct Trainer tempTrainer; + memcpy(&tempTrainer, GetTrainerStructFromId(trainerNum), sizeof(struct Trainer)); + const struct Trainer *origTrainer = GetTrainerStructFromId(tempTrainer.overrideTrainer); + + tempTrainer.party = origTrainer->party; + + tempTrainer.poolSize = origTrainer->poolSize; + if (tempTrainer.partySize == 0) + tempTrainer.partySize = origTrainer->partySize; + + retVal = CreateNPCTrainerPartyFromTrainer(party, (const struct Trainer *)(&tempTrainer), firstTrainer, gBattleTypeFlags); + } + else + { + retVal = CreateNPCTrainerPartyFromTrainer(party, GetTrainerStructFromId(trainerNum), firstTrainer, gBattleTypeFlags); + } return retVal; } diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 98ca8884fd..dc812cb153 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -150,6 +150,9 @@ struct Trainer struct String pool_prune; int pool_prune_line; + struct String copy_pool; + int copy_pool_line; + struct String macro; int macro_line; }; @@ -1283,6 +1286,13 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->pool_prune_line = value.location.line; trainer->pool_prune = token_string(&value); } + else if (is_literal_token(&key, "Copy Pool")) + { + if (trainer->copy_pool_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Copy Pool'"); + trainer->copy_pool_line = value.location.line; + trainer->copy_pool = token_string(&value); + } else if (is_literal_token(&key, "Macro")) { if (trainer->macro_line) @@ -1317,7 +1327,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct while (match_empty_line(p)) {} if (!parse_pokemon_header(p, &nickname, &species, &gender, &item)) { - if (i > 0 || ends_with(trainer->id, "_NONE")) + if (i > 0 || ends_with(trainer->id, "_NONE") || !is_empty_string(trainer->copy_pool)) break; if (!p->error) set_parse_error(p, p->location, "expected nickname or species"); @@ -1331,6 +1341,12 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } trainer->pokemon_n++; + if (!is_empty_string(trainer->copy_pool)) + { + set_show_parse_error(p, p->location, "trainer is set to copy mons from other trainer, but defines their own party"); + } + + pokemon->nickname = token_string(&nickname); pokemon->species = token_string(&species); if (is_empty_token(&gender)) @@ -1529,7 +1545,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } } - if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n) + if (trainer->party_size_line && trainer->party_size > trainer->pokemon_n && is_empty_string(trainer->copy_pool)) { set_show_parse_error(p, p->location, "partySize larger than supplied pool"); } @@ -1863,6 +1879,13 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } + if (!is_empty_string(trainer->copy_pool)) + { + fprintf(f, "#line %d\n", trainer->copy_pool_line); + fprintf(f, " .overrideTrainer = "); + fprint_string(f, trainer->copy_pool); + fprintf(f, ",\n"); + } if (trainer->macro_line) { fprintf(f, "#line %d\n", trainer->macro_line); @@ -1875,18 +1898,21 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par { fprintf(f, "#line %d\n", trainer->party_size_line); fprintf(f, " .partySize = %d,\n", trainer->party_size); - fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); - fprintf(f, " .party = (const struct TrainerMon[])\n"); - fprintf(f, " {\n"); + if (is_empty_string(trainer->copy_pool)) + { + fprintf(f, " .poolSize = %d,\n", trainer->pokemon_n); + fprintf(f, " .party = (const struct TrainerMon[])\n"); + fprintf(f, " {\n"); + } } - else + else if (is_empty_string(trainer->copy_pool)) { fprintf(f, " .partySize = %d,\n", trainer->pokemon_n); fprintf(f, " .party = (const struct TrainerMon[])\n"); fprintf(f, " {\n"); } - for (int j = 0; j < trainer->pokemon_n; j++) + for (int j = 0; j < trainer->pokemon_n && is_empty_string(trainer->copy_pool); j++) { struct Pokemon *pokemon = &trainer->pokemon[j]; fprintf(f, " {\n"); @@ -2049,7 +2075,8 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, " },\n"); } - fprintf(f, " },\n"); + if (is_empty_string(trainer->copy_pool)) + fprintf(f, " },\n"); fprintf(f, " },\n"); } } From 71d40cc3f1c200b2f67d47ecb3319b7858541969 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 18 Jul 2025 19:12:37 +0200 Subject: [PATCH 152/248] Convert various to callnatives (#7355) --- asm/macros/battle_script.inc | 1059 ++++--- data/battle_scripts_1.s | 194 +- data/battle_scripts_2.s | 4 +- include/constants/battle_script_commands.h | 117 +- src/battle_script_commands.c | 3231 ++++++++++---------- 5 files changed, 2256 insertions(+), 2349 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ba4b4619aa..c906938b93 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1806,499 +1806,6 @@ .4byte \jumpInstr .endm -@ various command changed to more readable macros - .macro cancelmultiturnmoves battler:req - various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES - .endm - - .macro getifcantrunfrombattle battler:req - various \battler, VARIOUS_IS_RUNNING_IMPOSSIBLE - .endm - - .macro getmovetarget battler:req - various \battler, VARIOUS_GET_MOVE_TARGET - .endm - - .macro getbattlerfainted battler:req - various \battler, VARIOUS_GET_BATTLER_FAINTED - .endm - - .macro resetswitchinabilitybits battler:req - various \battler, VARIOUS_RESET_SWITCH_IN_ABILITY_BITS - .endm - - .macro updatechoicemoveonlvlup battler:req - various \battler, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP - .endm - - .macro resetplayerfainted - various BS_ATTACKER, VARIOUS_RESET_PLAYER_FAINTED - .endm - - .macro palaceflavortext battler:req - various \battler, VARIOUS_PALACE_FLAVOR_TEXT - .endm - - .macro arenajudgmentwindow - various BS_ATTACKER, VARIOUS_ARENA_JUDGMENT_WINDOW - .endm - - .macro arenaopponentmonlost - various BS_ATTACKER, VARIOUS_ARENA_OPPONENT_MON_LOST - .endm - - .macro arenaplayermonlost - various BS_ATTACKER, VARIOUS_ARENA_PLAYER_MON_LOST - .endm - - .macro arenabothmonlost - various BS_ATTACKER, VARIOUS_ARENA_BOTH_MONS_LOST - .endm - - .macro forfeityesnobox battler:req - various \battler, VARIOUS_EMIT_YESNOBOX - .endm - - .macro arenadrawreftextbox - various BS_ATTACKER, VARIOUS_DRAW_ARENA_REF_TEXT_BOX - .endm - - .macro arenaerasereftextbox - various BS_ATTACKER, VARIOUS_ERASE_ARENA_REF_TEXT_BOX - .endm - - .macro arenajudgmentstring id:req - various \id, VARIOUS_ARENA_JUDGMENT_STRING - .endm - - .macro arenawaitmessage id:req - various \id, VARIOUS_ARENA_WAIT_STRING - .endm - - .macro waitcry battler:req - various \battler, VARIOUS_WAIT_CRY - .endm - - .macro returnopponentmon1toball battler:req - various \battler, VARIOUS_RETURN_OPPONENT_MON1 - .endm - - .macro returnopponentmon2toball battler:req - various \battler, VARIOUS_RETURN_OPPONENT_MON2 - .endm - - .macro volumedown - various BS_ATTACKER, VARIOUS_VOLUME_DOWN - .endm - - .macro volumeup - various BS_ATTACKER, VARIOUS_VOLUME_UP - .endm - - .macro setalreadystatusedmoveattempt battler:req - various \battler, VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT - .endm - - .macro palacetryescapestatus battler:req - various \battler, VARIOUS_PALACE_TRY_ESCAPE_STATUS - .endm - - .macro setoutcomeonteleport battler:req - various \battler, VARIOUS_SET_TELEPORT_OUTCOME - .endm - - .macro playtrainerdefeatbgm battler:req - various \battler, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC - .endm - - .macro stattextbuffer battler:req - various \battler, VARIOUS_STAT_TEXT_BUFFER - .endm - - .macro switchinabilities battler:req - various \battler, VARIOUS_SWITCHIN_ABILITIES - .endm - - .macro instanthpdrop battler:req - various \battler, VARIOUS_INSTANT_HP_DROP - .endm - - .macro clearstatus battler:req - various \battler, VARIOUS_CLEAR_STATUS - .endm - - .macro restorepp battler:req - various \battler, VARIOUS_RESTORE_PP - .endm - - .macro tryactivatereceiver battler:req - various \battler, VARIOUS_TRY_ACTIVATE_RECEIVER - .endm - - .macro tryactivatesoulheart - various BS_ATTACKER, VARIOUS_TRY_ACTIVATE_SOULHEART - .endm - - .macro playmoveanimation battler:req, move:req - various \battler, VARIOUS_PLAY_MOVE_ANIMATION - .2byte \move - .endm - - .macro setluckychant battler:req, failInstr:req - various \battler VARIOUS_SET_LUCKY_CHANT - .4byte \failInstr - .endm - - .macro suckerpunchcheck failInstr:req - various BS_ATTACKER, VARIOUS_SUCKER_PUNCH_CHECK - .4byte \failInstr - .endm - - .macro setabilitysimple battler:req, failInstr:req - various \battler VARIOUS_SET_SIMPLE_BEAM - .4byte \failInstr - .endm - - .macro tryentrainment failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ENTRAINMENT - .4byte \failInstr - .endm - - .macro setlastusedability battler:req - various \battler, VARIOUS_SET_LAST_USED_ABILITY - .endm - - .macro tryafteryou failInstr:req - various BS_ATTACKER, VARIOUS_AFTER_YOU - .4byte \failInstr - .endm - - .macro trybestow failInstr:req - various BS_ATTACKER, VARIOUS_BESTOW - .4byte \failInstr - .endm - - .macro invertstatstages battler:req - various \battler, VARIOUS_INVERT_STAT_STAGES - .endm - - .macro trymefirst failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ME_FIRST - .4byte \failInstr - .endm - - .macro jumpifbattleend jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END - .4byte \jumpInstr - .endm - - .macro tryelectrify failInstr:req - various BS_ATTACKER, VARIOUS_TRY_ELECTRIFY - .4byte \failInstr - .endm - - .macro trysoak failInstr:req - various BS_ATTACKER, VARIOUS_TRY_SOAK - .4byte \failInstr - .endm - - .macro handleformchange battler:req, case:req - various \battler, VARIOUS_HANDLE_FORM_CHANGE - .byte \case - .endm - - .macro jumpifcantuselastresort battler:req, jumpInstr:req - various \battler, VARIOUS_TRY_LAST_RESORT - .4byte \jumpInstr - .endm - - .macro tryautotomize battler:req, failInstr:req - various \battler, VARIOUS_TRY_AUTOTOMIZE - .4byte \failInstr - .endm - - .macro jumpifcantusesynchronoise jumpInstr:req - various BS_ATTACKER, VARIOUS_TRY_SYNCHRONOISE - .4byte \jumpInstr - .endm - - .macro showabilitypopup battler:req - various \battler, VARIOUS_ABILITY_POPUP - .endm - - .macro updateabilitypopup battler:req - various \battler, VARIOUS_UPDATE_ABILITY_POPUP - .endm - - .macro jumpiftargetally jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY - .4byte \jumpInstr - .endm - - .macro trypsychoshift failInstr:req sleepClauseFailInstr:req - various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT - .4byte \failInstr - .4byte \sleepClauseFailInstr - .endm - - .macro curestatus battler:req - various \battler, VARIOUS_CURE_STATUS - .endm - - .macro powertrick battler:req - various \battler, VARIOUS_POWER_TRICK - .endm - - .macro jumpifnotgrounded battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED - .4byte \jumpInstr - .endm - - .macro handletrainerslidemsg battler:req, case:req - various \battler, VARIOUS_HANDLE_TRAINER_SLIDE_MSG - .byte \case - .endm - - .macro trytrainerslidefirstdownmsg battler:req - various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF - .endm - - .macro trytrainerslidelastonmsg battler:req - various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON - .endm - - .macro setauroraveil battler:req - various \battler, VARIOUS_SET_AURORA_VEIL - .endm - - .macro trysetthirdtype battler:req, failInstr:req - various \battler, VARIOUS_TRY_THIRD_TYPE - .4byte \failInstr - .endm - - .macro tryaccupressure battler:req, failInstr:req - various \battler, VARIOUS_ACUPRESSURE - .4byte \failInstr - .endm - - .macro bringdownairbornebattler battler:req - various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS - .endm - - .macro checkgrassyterrainheal battler:req, failInstr:req - various \battler, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS - .4byte \failInstr - .endm - - .macro jumpifnotberry battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_BERRY - .4byte \jumpInstr - .endm - - .macro jumpifroarfails jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_ROAR_FAILS - .4byte \jumpInstr - .endm - - .macro tryinstruct failInstr:req - various BS_ATTACKER, VARIOUS_TRY_INSTRUCT - .4byte \failInstr - .endm - - .macro settracedability battler:req - various \battler, VARIOUS_TRACE_ABILITY - .endm - - .macro updatenick battler:req - various \battler, VARIOUS_UPDATE_NICK - .endm - - .macro tryillusionoff battler:req - various \battler, VARIOUS_TRY_ILLUSION_OFF - .endm - - .macro spriteignore0hp value:req - various BS_ATTACKER, VARIOUS_SET_SPRITEIGNORE0HP - .byte \value - .endm - - .macro getstatvalue battler:req, stat:req - various \battler, VARIOUS_GET_STAT_VALUE - .byte \stat - .endm - - .macro jumpiffullhp battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_FULL_HP - .4byte \jumpInstr - .endm - - .macro losetype battler:req, type:req - various \battler, VARIOUS_LOSE_TYPE - .byte \type - .endm - - .macro tryfriskmsg battler:req - various \battler, VARIOUS_TRY_FRISK - .endm - - .macro jumpifshieldsdown battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED - .4byte \jumpInstr - .endm - - .macro trysetfairylock failInstr:req - various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK - .4byte \failInstr - .endm - - .macro jumpifnoally battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NO_ALLY - .4byte \jumpInstr - .endm - - .macro jumpifholdeffect battler:req, holdEffect:req, jumpInstr:req, equal=TRUE - various \battler, VARIOUS_JUMP_IF_HOLD_EFFECT - .byte \holdEffect - .4byte \jumpInstr - .byte \equal - .endm - - .macro jumpifnoholdeffect battler:req, holdEffect:req, jumpInstr:req - jumpifholdeffect \battler, \holdEffect, \jumpInstr, FALSE - .endm - - .macro infatuatewithbattler battler:req, infatuateWith:req - various \battler, VARIOUS_INFATUATE_WITH_BATTLER - .byte \infatuateWith - .endm - - .macro setlastuseditem battler:req - various \battler, VARIOUS_SET_LAST_USED_ITEM - .endm - - .macro jumpifabsent battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_ABSENT - .4byte \jumpInstr - .endm - - .macro destroyabilitypopup - various BS_ABILITY_BATTLER, VARIOUS_DESTROY_ABILITY_POPUP - .endm - - .macro gettotemboost jumpInstr:req - various BS_ATTACKER, VARIOUS_TOTEM_BOOST - .4byte \jumpInstr - .endm - - .macro consumeberry battler:req, fromBattler:req - various \battler, VARIOUS_CONSUME_BERRY - .byte \fromBattler - .endm - - .macro activateitemeffects battler:req - various \battler, VARIOUS_MOVEEND_ITEM_EFFECTS - .endm - - .macro pickpocketsteal - various 0, VARIOUS_PICKPOCKET - .endm - - .macro doterrainseed battler:req, failInstr:req - various \battler, VARIOUS_TERRAIN_SEED - .4byte \failInstr - .endm - - .macro makeinvisible battler:req - various \battler, VARIOUS_MAKE_INVISIBLE - .endm - - .macro tryroomservice battler:req, failInstr:req - various \battler, VARIOUS_ROOM_SERVICE - .4byte \failInstr - .endm - - .macro jumpifpranksterblocked battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_PRANKSTER_BLOCKED - .4byte \jumpInstr - .endm - - .macro jumpifteamhealthy battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_TEAM_HEALTHY - .4byte \jumpInstr - .endm - - .macro tryhealquarterhealth battler:req, failInstr:req - various \battler, VARIOUS_TRY_HEAL_QUARTER_HP - .4byte \failInstr - .endm - - .macro trytoclearprimalweather - various BS_ATTACKER, VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER - .endm - - .macro setattackertostickywebuser - various BS_TARGET, VARIOUS_SET_ATTACKER_STICKY_WEB_USER - .endm - - .macro getrototillertargets failInstr:req - various BS_ATTACKER, VARIOUS_GET_ROTOTILLER_TARGETS - .4byte \failInstr - .endm - - .macro jumpifnotrototilleraffected battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED - .4byte \jumpInstr - .endm - - .macro jumpifcantreverttoprimal jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL - .4byte \jumpInstr - .endm - - .macro jumpifweatheraffected battler:req, flags:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_WEATHER_AFFECTED - .4byte \flags - .4byte \jumpInstr - .endm - - .macro jumpifspecies battler:req, species:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_SPECIES - .2byte \species - .4byte \jumpInstr - .endm - - .macro tryendneutralizinggas battler:req - various \battler, VARIOUS_TRY_END_NEUTRALIZING_GAS - .endm - - .macro trynoretreat battler:req, failInstr:req - various \battler, VARIOUS_TRY_NO_RETREAT - .4byte \failInstr - .endm - - .macro checkpoltergeist battler:req, failInstr:req - various \battler, VARIOUS_CHECK_POLTERGEIST - .4byte \failInstr - .endm - - .macro cutonethirdhpraisestats failInstr:req - various BS_ATTACKER, VARIOUS_CUT_1_3_HP_RAISE_STATS - .4byte \failInstr - .endm - - .macro curecertainstatuses battler:req - various \battler, VARIOUS_CURE_CERTAIN_STATUSES - .endm - - .macro tryresetnegativestatstages battler:req - various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES - .endm - - .macro jumpiflastuseditemberry jumpInstr:req - various BS_ATTACKER, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY - .4byte \jumpInstr - .endm - .macro jumpiflastuseditemholdeffect holdEffect:req, secondaryId:req, jumpInstr:req callnative BS_JumpIfLastUsedItemHoldEffect .byte \holdEffect @@ -2306,18 +1813,6 @@ .4byte \jumpInstr .endm - .macro savebattleritem battler:req - various \battler, VARIOUS_SAVE_BATTLER_ITEM - .endm - - .macro restorebattleritem battler:req - various \battler, VARIOUS_RESTORE_BATTLER_ITEM - .endm - - .macro battleritemtolastuseditem battler:req - various \battler, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM - .endm - .macro swapsidestatuses callnative BS_CourtChangeSwapSideStatuses .endm @@ -2446,6 +1941,526 @@ .4byte \jumpInstr .endm + .macro jumpifroarfails jumpInstr:req + callnative BS_JumpIfRoarFails + .4byte \jumpInstr + .endm + + .macro jumpifabsent battler:req, jumpInstr:req + callnative BS_JumpIfAbsent + .byte \battler + .4byte \jumpInstr + .endm + + .macro jumpifnoholdeffect battler:req, holdEffect:req, jumpInstr:req + jumpifholdeffect \battler, \holdEffect, \jumpInstr, FALSE + .endm + + .macro jumpifholdeffect battler:req, holdEffect:req, jumpInstr:req, equal:req + callnative BS_JumpIfHoldEffect + .byte \battler + .byte \holdEffect + .4byte \jumpInstr + .byte \equal + .endm + + .macro jumpifnoally battler:req, jumpInstr:req + callnative BS_JumpIfNoAlly + .byte \battler + .4byte \jumpInstr + .endm + + .macro infatuatewithbattler battler:req, infatuateWith:req + callnative BS_InfatuateWithBattler + .byte \battler + .byte \infatuateWith + .endm + + .macro setlastuseditem battler:req + callnative BS_SetLastUsedItem + .byte \battler + .endm + + .macro trysetfairylock failInstr:req + callnative BS_TrySetFairyLock + .4byte \failInstr + .endm + + .macro getstatvalue stat:req + callnative BS_GetStatValue + .byte \stat + .endm + + .macro jumpiffullhp battler:req, jumpInstr:req + callnative BS_JumpIfFullHp + .byte \battler + .4byte \jumpInstr + .endm + + .macro tryfriskmessage + callnative BS_TryFriskMessage + .endm + + .macro settracedability battler:req + callnative BS_SetTracedAbility + .byte \battler + .endm + + .macro tryillusionoff battler:req + callnative BS_TryIllusionOff + .byte \battler + .endm + + .macro setspriteignore0hp ignore0HP:req + callnative BS_SetSpriteIgnore0Hp + .byte \ignore0HP + .endm + + .macro updatenick + callnative BS_UpdateNick + .endm + + .macro jumpifnotberry battler:req, jumpInstr:req + callnative BS_JumpIfNotBerry + .byte \battler + .4byte \jumpInstr + .endm + + .macro gravityonairbornemons + callnative BS_GravityOnAirborneMons + .endm + + .macro tryacupressure failInstr:req + callnative BS_TryAcupressure + .4byte \failInstr + .endm + + .macro cancelmultiturnmoves + callnative BS_CancelMultiTurnMoves + .endm + + .macro isrunningimpossible + callnative BS_IsRunningImpossible + .endm + + .macro getmovetarget + callnative BS_GetMoveTarget + .endm + + @ Will jump to script pointer if the specified battler has or has not fainted. + .macro jumpiffainted battler:req, value:req, ptr:req + getbattlerfainted \battler + jumpifbyte CMP_EQUAL, gBattleCommunication, \value, \ptr + .endm + + .macro getbattlerfainted battler:req + callnative BS_GetBattlerFainted + .byte \battler + .endm + + .macro resetswitchinabilitybits + callnative BS_ResetSwitchInAbilityBits + .endm + + .macro updatechoicemoveonlvlup + callnative BS_UpdateChoiceMoveOnLvlUp + .endm + + .macro resetplayerfainted + callnative BS_ResetPlayerFainted + .endm + + .macro palaceflavortext + callnative BS_PalaceFlavorText + .endm + + .macro arenajudgmentwindow + callnative BS_ArenaJudgmentWindow + .endm + + .macro arenaopponentmonlost + callnative BS_ArenaOpponentMonLost + .endm + + .macro arenaplayermonlost + callnative BS_ArenaPlayerMonLost + .endm + + .macro arenabothmonslost + callnative BS_ArenaBothMonsLost + .endm + + .macro forfeityesnobox + callnative BS_ForfeitYesNoBox + .endm + + .macro drawarenareftextbox + callnative BS_DrawArenaRefTextBox + .endm + + .macro erasearenareftextbox + callnative BS_EraseArenaRefTextBox + .endm + + .macro arenajudgmentstring id:req + callnative BS_ArenaJudgmentString + .byte \id + .endm + + .macro arenawaitmessage id:req + callnative BS_ArenaWaitMessage + .byte \id + .endm + + .macro waitcry + callnative BS_WaitCry + .endm + + .macro returnopponentmon1toball + callnative BS_ReturnOpponentMon1ToBall + .endm + + .macro returnopponentmon2toball + callnative BS_ReturnOpponentMon2ToBall + .endm + + .macro volumedown + callnative BS_VolumeDown + .endm + + .macro volumeup + callnative BS_VolumeUp + .endm + + .macro setalreadystatusedmoveattempt + callnative BS_SetAlreadyStatusedMoveAttempt + .endm + + .macro palacetryescapestatus + callnative BS_PalaceTryEscapeStatus + .endm + + .macro setteleportoutcome battler:req + callnative BS_SetTeleportOutcome + .byte \battler + .endm + + .macro playtrainerdefeatedmusic + callnative BS_PlayTrainerDefeatedMusic + .endm + + .macro stattextbuffer + callnative BS_StatTextBuffer + .endm + + .macro switchinabilities battler:req + callnative BS_SwitchinAbilities + .byte \battler + .endm + + .macro instanthpdrop + callnative BS_InstantHpDrop + .endm + + .macro clearstatus + callnative BS_ClearStatus + .endm + + .macro restoremovepp + callnative BS_RestoreMovePp + .endm + + .macro tryactivatereceiver battler:req + callnative BS_TryActivateReceiver + .byte \battler + .endm + + .macro tryactivatesoulheart + callnative BS_TryActivateSoulheart + .endm + + .macro playmoveanimation move:req + callnative BS_PlayMoveAnimation + .2byte \move + .endm + + .macro setluckychant failInstr:req + callnative BS_SetLuckyChant + .4byte \failInstr + .endm + + .macro suckerpunchcheck failInstr:req + callnative BS_SuckerPunchCheck + .4byte \failInstr + .endm + + .macro setsimplebeam failInstr:req + callnative BS_SetSimpleBeam + .4byte \failInstr + .endm + + .macro tryentrainment failInstr:req + callnative BS_TryEntrainment + .4byte \failInstr + .endm + + .macro setlastusedability + callnative BS_SetLastUsedAbility + .endm + + .macro invertstatstages + callnative BS_InvertStatStages + .endm + + .macro trymefirst failInstr:req + callnative BS_TryMeFirst + .4byte \failInstr + .endm + + .macro tryelectrify failInstr:req + callnative BS_TryElectrify + .4byte \failInstr + .endm + + .macro trysoak failInstr:req + callnative BS_TrySoak + .4byte \failInstr + .endm + + .macro handleformchange battler:req, case_:req + callnative BS_HandleFormChange + .byte \battler + .byte \case_ + .endm + + .macro trylastresort failInstr:req + callnative BS_TryLastResort + .4byte \failInstr + .endm + + .macro tryautotomize failInstr:req + callnative BS_TryAutotomize + .4byte \failInstr + .endm + + .macro tryinstruct failInstr:req + callnative BS_TryInstruct + .4byte \failInstr + .endm + + .macro showabilitypopup + callnative BS_ShowAbilityPopup + .endm + + .macro updateabilitypopup + callnative BS_UpdateAbilityPopup + .endm + + .macro jumpiftargetally jumpInstr:req + callnative BS_JumpIfTargetAlly + .4byte \jumpInstr + .endm + + .macro trypsychoshift failInstr:req sleepClauseFailInstr:req + callnative BS_TryPsychoShift + .4byte \failInstr + .4byte \sleepClauseFailInstr + .endm + + .macro curestatus battler:req + callnative BS_CureStatus + .byte \battler + .endm + + .macro powertrick + callnative BS_PowerTrick + .endm + + .macro tryafteryou failInstr:req + callnative BS_TryAfterYou + .4byte \failInstr + .endm + + .macro trybestow failInstr:req + callnative BS_TryBestow + .4byte \failInstr + .endm + + .macro handletrainerslidemsg battler:req, case_:req + callnative BS_HandleTrainerSlideMsg + .byte \battler + .byte \case_ + .endm + + .macro trytrainerslidemsgfirstoff battler:req + callnative BS_TryTrainerSlideMsgFirstOff + .byte \battler + .endm + + .macro trytrainerslidemsglaston battler:req + callnative BS_TryTrainerSlideMsgLastOn + .byte \battler + .endm + + .macro setauroraveil + callnative BS_SetAuroraVeil + .endm + + .macro trythirdtype failInstr:req + callnative BS_TryThirdType + .4byte \failInstr + .endm + + .macro destroyabilitypopup + callnative BS_DestroyAbilityPopup + .endm + + .macro gettotemboost jumpInstr:req + callnative BS_GetTotemBoost + .4byte \jumpInstr + .endm + + .macro activateitemeffects + callnative BS_ActivateItemEffects + .endm + + .macro tryroomservice battler:req, failInstr:req + callnative BS_TryRoomService + .byte \battler + .4byte \failInstr + .endm + + .macro tryterrainseed battler:req, failInstr:req + callnative BS_TryTerrainSeed + .byte \battler + .4byte \failInstr + .endm + + .macro makeinvisible battler:req + callnative BS_MakeInvisible + .byte \battler + .endm + + .macro jumpifteamhealthy jumpInstr:req + callnative BS_JumpIfTeamHealthy + .4byte \jumpInstr + .endm + + .macro tryhealquarterhealth battler:req, failInstr:req + callnative BS_TryHealQuarterHealth + .byte \battler + .4byte \failInstr + .endm + + .macro jumpifunder200 jumpInstr:req + callnative BS_JumpIfUnder200 + .4byte \jumpInstr + .endm + + .macro setskydrop + callnative BS_SetSkyDrop + .endm + + .macro clearskydrop failInstr:req + callnative BS_ClearSkyDrop + .4byte \failInstr + .endm + + .macro skydropyawn + callnative BS_SkyDropYawn + .endm + + .macro jumpifpranksterblocked jumpInstr:req + callnative BS_JumpIfPranksterBlocked + .4byte \jumpInstr + .endm + + .macro trytoclearprimalweather + callnative BS_TryToClearPrimalWeather + .endm + + .macro tryendneutralizinggas + callnative BS_TryEndNeutralizingGas + .endm + + .macro getrototillertargets failInstr:req + callnative BS_GetRototillerTargets + .4byte \failInstr + .endm + + .macro jumpifnotrototilleraffected jumpInstr:req + callnative BS_JumpIfNotRototillerAffected + .4byte \jumpInstr + .endm + + .macro consumeberry battler:req, fromBattler:req + callnative BS_ConsumeBerry + .byte \battler + .byte \fromBattler + .endm + + .macro jumpifweatheraffected flags:req, jumpInstr:req + callnative BS_JumpIfWeatherAffected + .2byte \flags + .4byte \jumpInstr + .endm + + .macro jumpifspecies species:req, jumpInstr:req + callnative BS_JumpIfSpecies + .2byte \species + .4byte \jumpInstr + .endm + + .macro jumpifleafguardprotected battler:req, jumpInstr:req + callnative BS_JumpIfLeafGuardProtected + .byte \battler + .4byte \jumpInstr + .endm + + .macro setattackertostickywebuser + callnative BS_SetAttackerToStickyWebUser + .endm + + .macro cutonethirdhpandraisestats failInstr:req + callnative BS_CutOneThirdHpAndRaiseStats + .4byte \failInstr + .endm + + .macro checkpoltergeist failInstr:req + callnative BS_CheckPoltergeist + .4byte \failInstr + .endm + + .macro trynoretreat failInstr:req + callnative BS_TryNoRetreat + .4byte \failInstr + .endm + + .macro curecertainstatuses + callnative BS_CureCertainStatuses + .endm + + .macro tryresetnegativestatstages + callnative BS_TryResetNegativeStatStages + .endm + + .macro jumpiflastuseditemberry jumpInstr:req + callnative BS_JumpIfLastUsedItemBerry + .4byte \jumpInstr + .endm + + .macro savebattleritem + callnative BS_SaveBattlerItem + .endm + + .macro restorebattleritem + callnative BS_RestoreBattlerItem + .endm + + .macro battleritemtolastuseditem + callnative BS_BattlerItemToLastUsedItem + .endm + .macro setallytonexttarget jumpInstr:req jumpifbyte CMP_GREATER_THAN, gBattlerTarget, 0x1, 1f addbyte gBattlerTarget, 0x2 @@ -2464,40 +2479,12 @@ goto \jumpInstr .endm - .macro jumpifleafguardprotected battler:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED - .4byte \jumpInstr - .endm - .macro jumpifsafeguard jumpInstr:req jumpifability BS_ATTACKER, ABILITY_INFILTRATOR, 1f jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpInstr 1: .endm - @ Will jump to script pointer if the target weighs less than 200 kg, or 441 lbs. - .macro jumpifunder200 battler:req, failInstr:req - various \battler, VARIOUS_JUMP_IF_UNDER_200 - .4byte \failInstr - .endm - - @ Sets the sky drop status and does all other necessary operations - .macro setskydrop - various 0, VARIOUS_SET_SKY_DROP - .endm - - @ Clears the sky drop status and does all other necessary operations. - @ If the target fainted in before this script is called, it goes to the given script. - .macro clearskydrop failInstr:req - various 0, VARIOUS_CLEAR_SKY_DROP - .4byte \failInstr - .endm - - @ Accounts for if the target of Sky Drop was in confuse_lock when the attacker falls asleep due to Yawn. - .macro skydropyawn - various 0, VARIOUS_SKY_DROP_YAWN - .endm - @ Tries to increase or decrease a battler's stat's stat stage by a specified amount. If impossible, jumps to \script. .macro modifybattlerstatstage battler:req, stat:req, mode:req, amount:req, script:req, animation:req, customString @@ -2528,12 +2515,6 @@ waitmessage B_WAIT_TIME_LONG .endm - @ Will jump to script pointer if the specified battler has or has not fainted. - .macro jumpiffainted battler:req, value:req, ptr:req - getbattlerfainted \battler - jumpifbyte CMP_EQUAL, gBattleCommunication, \value, \ptr - .endm - .macro flushtextbox printstring STRINGID_EMPTYSTRING3 waitmessage 1 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 695535ab4f..d0a8d640ef 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -621,7 +621,7 @@ BattleScript_AffectionBasedStatus_HealFrostbiteString: printstring STRINGID_ATTACKERHEALEDITSFROSTBITE BattleScript_AffectionBasedStatusHeal_Continue: waitmessage B_WAIT_TIME_LONG - clearstatus BS_ATTACKER + clearstatus waitstate updatestatusicon BS_ATTACKER waitstate @@ -677,7 +677,7 @@ BattleScript_EffectSkyDrop:: attackstring jumpifsubstituteblocks BattleScript_ButItFailed jumpiftargetally BattleScript_ButItFailed - jumpifunder200 BS_TARGET, BattleScript_SkyDropWork + jumpifunder200 BattleScript_SkyDropWork pause B_WAIT_TIME_SHORT printstring STRINGID_TARGETTOOHEAVY waitmessage B_WAIT_TIME_LONG @@ -753,14 +753,14 @@ BattleScript_EffectFling:: jumpiflastuseditemholdeffect HOLD_EFFECT_WHITE_HERB, 0, BattleScript_FlingWhiteHerb goto BattleScript_FlingEnd BattleScript_EffectFlingConsumeBerry: - savebattleritem BS_TARGET - battleritemtolastuseditem BS_TARGET + savebattleritem + battleritemtolastuseditem setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries orword gHitMarker, HITMARKER_DISABLE_ANIMATION consumeberry BS_TARGET, TRUE bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 - restorebattleritem BS_TARGET + restorebattleritem BattleScript_FlingEnd: tryfaintmon BS_TARGET trysymbiosis BS_ATTACKER @@ -785,7 +785,7 @@ BattleScript_FlingLightBall: seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PARALYSIS goto BattleScript_FlingEnd BattleScript_FlingMentalHerb: - curecertainstatuses BS_TARGET + curecertainstatuses savetarget copybyte gBattlerAttacker, gBattlerTarget playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL @@ -801,7 +801,7 @@ BattleScript_FlingToxicOrb: seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_TOXIC goto BattleScript_FlingEnd BattleScript_FlingWhiteHerb: - tryresetnegativestatstages BS_TARGET + tryresetnegativestatstages swapattackerwithtarget printstring STRINGID_PKMNSTATUSNORMAL waitmessage B_WAIT_TIME_MED @@ -815,15 +815,15 @@ BattleScript_FlingMissed: goto BattleScript_MoveMissedPause BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit + jumpifspecies SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit + jumpifspecies SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit goto BattleScript_PokemonCantUseTheMove BattleScript_EffectClangorousSoul:: attackcanceler attackstring ppreduce - cutonethirdhpraisestats BattleScript_ButItFailed + cutonethirdhpandraisestats BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE attackanimation waitanimation @@ -863,7 +863,7 @@ BattleScript_EffectPoltergeist:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - checkpoltergeist BS_TARGET, BattleScript_ButItFailed + checkpoltergeist BattleScript_ButItFailed printstring STRINGID_ABOUTTOUSEPOLTERGEIST waitmessage B_WAIT_TIME_LONG goto BattleScript_HitFromCritCalc @@ -892,7 +892,7 @@ BattleScript_EffectNoRetreat:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - trynoretreat BS_TARGET, BattleScript_ButItFailed + trynoretreat BattleScript_ButItFailed attackanimation waitanimation call BattleScript_AllStatsUp @@ -908,8 +908,8 @@ BattleScript_BothCanNoLongerEscape:: return BattleScript_EffectHyperspaceFury:: - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit - jumpifspecies BS_ATTACKER, SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt + jumpifspecies SPECIES_HOOPA_UNBOUND, BattleScript_EffectHit + jumpifspecies SPECIES_HOOPA_CONFINED, BattleScript_ButHoopaCantUseIt goto BattleScript_PokemonCantUseTheMove BattleScript_ButHoopaCantUseIt: @@ -1024,7 +1024,7 @@ BattleScript_EffectJungleHealing:: attackcanceler attackstring ppreduce - jumpifteamhealthy BS_ATTACKER, BattleScript_ButItFailed + jumpifteamhealthy BattleScript_ButItFailed attackanimation waitanimation copybyte gBattlerTarget, gBattlerAttacker @@ -1170,7 +1170,7 @@ BattleScript_EffectStrengthSap:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_StrengthSapTryLower: - getstatvalue BS_TARGET, STAT_ATK + getstatvalue STAT_ATK jumpiffullhp BS_ATTACKER, BattleScript_StrengthSapMustLower BattleScript_StrengthSapAnimation: attackanimation @@ -1274,7 +1274,7 @@ BattleScript_VCreateStatLossRet: BattleScript_SpectralThiefSteal:: setbyte sB_ANIM_TURN, 1 - playmoveanimation BS_ATTACKER, MOVE_SPECTRAL_THIEF + playmoveanimation MOVE_SPECTRAL_THIEF waitanimation setbyte sB_ANIM_TURN, 0 printstring STRINGID_SPECTRALTHIEFSTEAL @@ -1440,7 +1440,7 @@ BattleScript_EffectAcupressure:: BattleScript_EffectAcupressureTry: attackstring ppreduce - tryaccupressure BS_TARGET, BattleScript_ButItFailed + tryacupressure BattleScript_ButItFailed attackanimation waitanimation statbuffchange BS_TARGET, STAT_CHANGE_CERTAIN, BattleScript_MoveEnd @@ -1458,7 +1458,7 @@ BattleScript_EffectThirdType:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - trysetthirdtype BS_TARGET, BattleScript_ButItFailed + trythirdtype BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_THIRDTYPEADDED @@ -1516,7 +1516,7 @@ BattleScript_RototillerLoop: jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_RototillerCheckAffected jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats BattleScript_RototillerCheckAffected: - jumpifnotrototilleraffected BS_TARGET, BattleScript_RototillerNoEffect + jumpifnotrototilleraffected BattleScript_RototillerNoEffect setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk @@ -1588,7 +1588,7 @@ BattleScript_EffectPowerTrick:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - powertrick BS_ATTACKER + powertrick attackanimation waitanimation printstring STRINGID_PKMNSWITCHEDATKANDDEF @@ -1723,7 +1723,7 @@ BattleScript_AutotomizePrintString:: waitmessage B_WAIT_TIME_LONG BattleScript_AutotomizeWeightLoss:: jumpifmovehadnoeffect BattleScript_MoveEnd - tryautotomize BS_ATTACKER, BattleScript_MoveEnd + tryautotomize BattleScript_MoveEnd printstring STRINGID_BECAMENIMBLE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1877,7 +1877,7 @@ BattleScript_EffectLastResort:: attackcanceler attackstring ppreduce - jumpifcantuselastresort BS_ATTACKER, BattleScript_ButItFailed + trylastresort BattleScript_ButItFailed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc @@ -1890,7 +1890,7 @@ BattleScript_EffectGrowth:: BattleScript_GrowthDoMoveAnim:: attackanimation waitanimation - jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthAtk2 + jumpifweatheraffected B_WEATHER_SUN, BattleScript_GrowthAtk2 setstatchanger STAT_ATK, 1, FALSE goto BattleScript_GrowthAtk BattleScript_GrowthAtk2: @@ -1901,7 +1901,7 @@ BattleScript_GrowthAtk: printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: - jumpifweatheraffected BS_ATTACKER, B_WEATHER_SUN, BattleScript_GrowthSpAtk2 + jumpifweatheraffected B_WEATHER_SUN, BattleScript_GrowthSpAtk2 setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_GrowthSpAtk BattleScript_GrowthSpAtk2: @@ -2156,7 +2156,7 @@ BattleScript_EffectTopsyTurvy:: BattleScript_EffectTopsyTurvyWorks: attackanimation waitanimation - invertstatstages BS_TARGET + invertstatstages printstring STRINGID_TOPSYTURVYSWITCHEDSTATS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -2210,7 +2210,7 @@ BattleScript_EffectEntrainment:: tryentrainment BattleScript_ButItFailed attackanimation waitanimation - setlastusedability BS_TARGET + setlastusedability printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -2220,7 +2220,7 @@ BattleScript_EffectSimpleBeam:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - setabilitysimple BS_TARGET, BattleScript_ButItFailed + setsimplebeam BattleScript_ButItFailed attackanimation waitanimation .if B_ABILITY_POP_UP == TRUE @@ -2233,7 +2233,7 @@ BattleScript_EffectSimpleBeam:: trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectSuckerPunch:: @@ -2246,7 +2246,7 @@ BattleScript_EffectLuckyChant:: attackcanceler attackstring ppreduce - setluckychant BS_ATTACKER, BattleScript_ButItFailed + setluckychant BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_SHIELDEDFROMCRITICALHITS @@ -2271,7 +2271,7 @@ BattleScript_EffectHealingWish:: ppreduce attackanimation waitanimation - instanthpdrop BS_ATTACKER + instanthpdrop setatkhptozero tryfaintmon BS_ATTACKER storehealingwish BS_ATTACKER @@ -2299,7 +2299,7 @@ BattleScript_HealingWishActivates:: goto BattleScript_EffectHealingWishRestore BattleScript_LunarDanceActivates:: setbyte cMULTISTRING_CHOOSER, 1 - restorepp BS_ATTACKER + restoremovepp BattleScript_EffectHealingWishRestore: printfromtable gHealingWishStringIds waitmessage B_WAIT_TIME_LONG @@ -2309,7 +2309,7 @@ BattleScript_EffectHealingWishRestore: manipulatedamage DMG_CHANGE_SIGN healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - clearstatus BS_ATTACKER + clearstatus waitstate updatestatusicon BS_ATTACKER waitstate @@ -2335,7 +2335,7 @@ BattleScript_EffectWorrySeed:: trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectPowerSplit:: @@ -2467,7 +2467,7 @@ BattleScript_EffectGastroAcid:: trytoclearprimalweather tryrevertweatherform flushtextbox - tryendneutralizinggas BS_TARGET + tryendneutralizinggas goto BattleScript_MoveEnd BattleScript_EffectToxicSpikes:: @@ -2614,7 +2614,7 @@ BattleScript_GravityLoop: jumpifstatus3 BS_TARGET, STATUS3_ON_AIR | STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop goto BattleScript_GravityLoopEnd BattleScript_GravityLoopDrop: - bringdownairbornebattler BS_TARGET + gravityonairbornemons printstring STRINGID_GRAVITYGROUNDING waitmessage B_WAIT_TIME_LONG BattleScript_GravityLoopEnd: @@ -2742,7 +2742,7 @@ BattleScript_MoveMissed:: BattleScript_EffectDarkVoid:: .if B_DARK_VOID_FAIL >= GEN_7 - jumpifspecies BS_ATTACKER, SPECIES_DARKRAI, BattleScript_EffectNonVolatileStatus + jumpifspecies SPECIES_DARKRAI, BattleScript_EffectNonVolatileStatus goto BattleScript_PokemonCantUseTheMove .endif @@ -2831,7 +2831,7 @@ BattleScript_InsomniaProtects: goto BattleScript_MoveEnd BattleScript_AlreadyAsleep:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP waitmessage B_WAIT_TIME_LONG @@ -3158,7 +3158,7 @@ BattleScript_RestoreHp: goto BattleScript_MoveEnd BattleScript_AlreadyPoisoned:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_LONG printstring STRINGID_PKMNALREADYPOISONED waitmessage B_WAIT_TIME_LONG @@ -3175,7 +3175,7 @@ BattleScript_EffectAuroraVeil:: attackcanceler attackstring ppreduce - setauroraveil BS_ATTACKER + setauroraveil goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectLightScreen:: @@ -3213,7 +3213,7 @@ BattleScript_RestCantSleep:: goto BattleScript_MoveEnd BattleScript_RestIsAlreadyAsleep:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYASLEEP2 waitmessage B_WAIT_TIME_LONG @@ -3293,7 +3293,7 @@ BattleScript_EffectConfuse:: goto BattleScript_MoveEnd BattleScript_AlreadyConfused:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYCONFUSED waitmessage B_WAIT_TIME_LONG @@ -3395,7 +3395,7 @@ BattleScript_VoltAbsorbHeal: goto BattleScript_MoveHPDrain BattleScript_AlreadyParalyzed:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNISALREADYPARALYZED waitmessage B_WAIT_TIME_LONG @@ -3414,7 +3414,7 @@ BattleScript_EffectTwoTurnsAttack:: tryfiretwoturnmovewithoutcharging BS_ATTACKER, BattleScript_EffectHit @ e.g. Solar Beam call BattleScript_FirstChargingTurn tryfiretwoturnmoveaftercharging BS_ATTACKER, BattleScript_TwoTurnMovesSecondTurn @ e.g. Electro Shot - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates + jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates, TRUE goto BattleScript_MoveEnd BattleScript_EffectGeomancy:: @@ -3515,7 +3515,7 @@ BattleScript_SubstituteString:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_AlreadyHasSubstitute:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNHASSUBSTITUTE waitmessage B_WAIT_TIME_LONG @@ -3870,7 +3870,7 @@ BattleScript_CurseEnd:: goto BattleScript_MoveEnd BattleScript_GhostCurse:: jumpifbytenotequal gBattlerAttacker, gBattlerTarget, BattleScript_DoGhostCurse - getmovetarget BS_ATTACKER + getmovetarget BattleScript_DoGhostCurse:: attackcanceler attackstring @@ -3944,7 +3944,7 @@ BattleScript_EffectPerishSong:: setbyte gBattlerTarget, 0 BattleScript_PerishSongLoop:: jumpifblockedbysoundproof BS_TARGET, BattleScript_PerishSongBlocked - jumpifpranksterblocked BS_TARGET, BattleScript_PerishSongNotAffected + jumpifpranksterblocked BattleScript_PerishSongNotAffected BattleScript_PerishSongLoopIncrement:: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_PerishSongLoop @@ -4269,14 +4269,14 @@ BattleScript_EffectTeleport:: attackcanceler attackstring ppreduce - getifcantrunfrombattle BS_ATTACKER + isrunningimpossible jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FORBIDDEN, BattleScript_ButItFailed jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FAILURE, BattleScript_PrintAbilityMadeIneffective attackanimation waitanimation printstring STRINGID_PKMNFLEDFROMBATTLE waitmessage B_WAIT_TIME_LONG - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER goto BattleScript_MoveEnd BattleScript_EffectBeatUp:: @@ -4557,7 +4557,7 @@ BattleScript_EffectNonVolatileStatus:: goto BattleScript_MoveEnd BattleScript_AlreadyBurned:: - setalreadystatusedmoveattempt BS_ATTACKER + setalreadystatusedmoveattempt pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNALREADYHASBURN waitmessage B_WAIT_TIME_LONG @@ -5074,7 +5074,7 @@ BattleScript_FaintAttacker:: cleareffectsonfaint BS_ATTACKER tryactivatesoulheart tryactivatereceiver BS_ATTACKER - trytrainerslidefirstdownmsg BS_ATTACKER + trytrainerslidemsgfirstoff BS_ATTACKER return BattleScript_FaintTarget:: @@ -5088,7 +5088,7 @@ BattleScript_FaintTarget:: cleareffectsonfaint BS_TARGET tryactivatesoulheart tryactivatereceiver BS_TARGET - trytrainerslidefirstdownmsg BS_TARGET + trytrainerslidemsgfirstoff BS_TARGET return BattleScript_GiveExp:: @@ -5134,7 +5134,7 @@ BattleScript_FaintedMonTryChoose: jumpifbyte CMP_EQUAL, gBattleCommunication, PARTY_SIZE, BattleScript_FaintedMonSendOutNew @ Switch Pokémon before opponent atknameinbuff1 - resetswitchinabilitybits BS_ATTACKER + resetswitchinabilitybits hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON switchoutabilities BS_ATTACKER @@ -5164,7 +5164,7 @@ BattleScript_FaintedMonSendOutNew: switchinanim BS_FAINTED, FALSE, FALSE waitstate resetplayerfainted - trytrainerslidelastonmsg BS_FAINTED + trytrainerslidemsglaston BS_FAINTED jumpifbytenotequal sSHIFT_SWITCHED, sZero, BattleScript_FaintedMonShiftSwitched BattleScript_FaintedMonSendOutNewEnd: switchineffects BS_FAINTED @@ -5264,9 +5264,9 @@ BattleScript_CheckDomeDrew:: jumpifbyte CMP_EQUAL, gBattleOutcome, B_OUTCOME_DREW, BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintTrainersWinText:: jumpifnotbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostPrintWhiteOut - returnopponentmon1toball BS_ATTACKER + returnopponentmon1toball waitstate - returnopponentmon2toball BS_ATTACKER + returnopponentmon2toball waitstate trainerslidein BS_OPPONENT1 waitstate @@ -5283,9 +5283,9 @@ BattleScript_LocalBattleLostEnd_:: end2 BattleScript_FrontierLinkBattleLost:: - returnopponentmon1toball BS_ATTACKER + returnopponentmon1toball waitstate - returnopponentmon2toball BS_ATTACKER + returnopponentmon2toball waitstate trainerslidein BS_OPPONENT1 waitstate @@ -5312,7 +5312,7 @@ BattleScript_LinkBattleWonOrLostWaitEnd:: end2 BattleScript_TowerLinkBattleWon:: - playtrainerdefeatbgm BS_ATTACKER + playtrainerdefeatedmusic printstring STRINGID_BATTLEEND waitmessage B_WAIT_TIME_LONG trainerslidein BS_OPPONENT1 @@ -5456,7 +5456,7 @@ BattleScript_LearnedNewMove:: fanfare MUS_LEVEL_UP printstring STRINGID_PKMNLEARNEDMOVE waitmessage B_WAIT_TIME_LONG - updatechoicemoveonlvlup BS_ATTACKER + updatechoicemoveonlvlup goto BattleScript_TryLearnMoveLoop BattleScript_LearnMoveReturn:: return @@ -5691,7 +5691,7 @@ BattleScript_RoarSuccessSwitch_Ret: BattleScript_RoarSuccessEndBattle:: call BattleScript_RoarSuccessRet setbyte sSWITCH_CASE, B_SWITCH_NORMAL - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER finishaction BattleScript_RoarSuccessRet: @@ -6661,12 +6661,12 @@ BattleScript_IllusionOffEnd3:: end3 BattleScript_IllusionOff:: - spriteignore0hp TRUE + setspriteignore0hp TRUE playanimation BS_SCRIPTING, B_ANIM_ILLUSION_OFF waitanimation - updatenick BS_SCRIPTING + updatenick waitstate - spriteignore0hp FALSE + setspriteignore0hp FALSE printstring STRINGID_ILLUSIONWOREOFF waitmessage B_WAIT_TIME_LONG return @@ -6814,7 +6814,7 @@ BattleScript_MoveUsedIsParalyzed:: printstring STRINGID_PKMNISPARALYZED waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves goto BattleScript_MoveEnd BattleScript_PowderMoveNoEffect:: @@ -6831,7 +6831,7 @@ BattleScript_PowderMoveNoEffectPrint: printstring STRINGID_ITDOESNTAFFECT BattleScript_PowderMoveNoEffectWaitMsg: waitmessage B_WAIT_TIME_LONG - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd @@ -6849,7 +6849,7 @@ BattleScript_TryActivateSteadFast: call BattleScript_AbilityPopUp statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd setbyte gBattleCommunication STAT_SPEED - stattextbuffer BS_ATTACKER + stattextbuffer printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveUsedFlinchedEnd @@ -6871,7 +6871,7 @@ BattleScript_MoveUsedIsConfused:: volatileanimation BS_ATTACKER, VOLATILE_CONFUSION jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, FALSE, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves adjustdamage printstring STRINGID_ITHURTCONFUSION waitmessage B_WAIT_TIME_LONG @@ -6893,7 +6893,7 @@ BattleScript_MoveUsedPowder:: attackstring ppreduce pause B_WAIT_TIME_SHORT - cancelmultiturnmoves BS_ATTACKER + cancelmultiturnmoves volatileanimation BS_ATTACKER, VOLATILE_POWDER waitanimation effectivenesssound @@ -7146,7 +7146,7 @@ BattleScript_AbilityPopUpTarget:: BattleScript_AbilityPopUp:: tryactivateabilityshield BS_ABILITY_BATTLER .if B_ABILITY_POP_UP == TRUE - showabilitypopup BS_ABILITY_BATTLER + showabilitypopup pause B_WAIT_TIME_SHORT .endif recordability BS_ABILITY_BATTLER @@ -7159,10 +7159,10 @@ BattleScript_AbilityPopUpScripting: BattleScript_AbilityPopUpOverwriteThenNormal: setbyte sFIXED_ABILITY_POPUP, TRUE - showabilitypopup BS_ABILITY_BATTLER + showabilitypopup pause B_WAIT_TIME_SHORT sethword sABILITY_OVERWRITE, 0 - updateabilitypopup BS_ABILITY_BATTLER + updateabilitypopup pause B_WAIT_TIME_SHORT recordability BS_ABILITY_BATTLER destroyabilitypopup @@ -7229,7 +7229,7 @@ BattleScript_EmergencyExitWild:: .endif playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation - setoutcomeonteleport BS_SCRIPTING + setteleportoutcome BS_SCRIPTING finishaction return @@ -7260,7 +7260,7 @@ BattleScript_EmergencyExitWildEnd2:: pause B_WAIT_TIME_LONG playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN waitanimation - setoutcomeonteleport BS_ATTACKER + setteleportoutcome BS_ATTACKER finishaction end2 @@ -7667,7 +7667,7 @@ BattleScript_ActivateTerrainEffects: setbyte gBattlerAttacker, 0 BattleScript_ActivateTerrainSeed: copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 - doterrainseed BS_TARGET, BattleScript_ActivateTerrainAbility + tryterrainseed BS_TARGET, BattleScript_ActivateTerrainAbility removeitem BS_TARGET BattleScript_ActivateTerrainAbility: activateterrainchangeabilities BS_TARGET @@ -8118,7 +8118,7 @@ BattleScript_FriskActivates:: saveattacker savetarget copybyte gBattlerAttacker, sBATTLER - tryfriskmsg BS_SCRIPTING + tryfriskmessage restoreattacker restoretarget end3 @@ -8126,7 +8126,7 @@ BattleScript_FriskActivates:: BattleScript_ImposterActivates:: call BattleScript_AbilityPopUp transformdataexecution - playmoveanimation BS_ATTACKER, MOVE_TRANSFORM + playmoveanimation MOVE_TRANSFORM waitanimation printstring STRINGID_IMPOSTERTRANSFORM waitmessage B_WAIT_TIME_LONG @@ -8298,7 +8298,7 @@ BattleScript_MoveUsedLoafingAround:: @ Skip ahead if not the Battle Palace message jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER, BattleScript_MoveUsedLoafingAroundMsg setbyte gBattleCommunication, 0 - palacetryescapestatus BS_ATTACKER + palacetryescapestatus setbyte cMULTISTRING_CHOOSER, B_MSG_INCAPABLE_OF_POWER BattleScript_MoveUsedLoafingAroundMsg:: printfromtable gInobedientStringIds @@ -8669,7 +8669,7 @@ BattleScript_FlushMessageBox:: BattleScript_PalacePrintFlavorText:: setbyte gBattleCommunication + 1, 0 BattleScript_PalaceTryBattlerFlavorText:: - palaceflavortext BS_ATTACKER @ BS_ATTACKER here overwritten by gBattleCommunication + 1 + palaceflavortext jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, TRUE, BattleScript_PalaceEndFlavorText printfromtable gBattlePalaceFlavorTextTable waitmessage B_WAIT_TIME_LONG @@ -8681,16 +8681,16 @@ BattleScript_PalaceEndFlavorText:: end2 BattleScript_ArenaTurnBeginning:: - waitcry BS_ATTACKER + waitcry volumedown playse SE_ARENA_TIMEUP1 pause 8 playse SE_ARENA_TIMEUP1 - arenadrawreftextbox + drawarenareftextbox arenajudgmentstring B_MSG_REF_COMMENCE_BATTLE arenawaitmessage B_MSG_REF_COMMENCE_BATTLE pause B_WAIT_TIME_LONG - arenaerasereftextbox + erasearenareftextbox volumeup end2 @@ -8704,7 +8704,7 @@ BattleScript_ArenaDoJudgment:: pause 8 playse SE_ARENA_TIMEUP1 pause B_WAIT_TIME_LONG - arenadrawreftextbox + drawarenareftextbox arenajudgmentstring B_MSG_REF_THATS_IT arenawaitmessage B_MSG_REF_THATS_IT pause B_WAIT_TIME_LONG @@ -8727,11 +8727,11 @@ BattleScript_ArenaDoJudgment:: arenajudgmentstring B_MSG_REF_PLAYER_WON arenawaitmessage B_MSG_REF_PLAYER_WON arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_DEFEATEDOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG playfaintcry BS_OPPONENT1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_OPPONENT1 cleareffectsonfaint BS_OPPONENT1 arenaopponentmonlost @@ -8741,11 +8741,11 @@ BattleScript_ArenaJudgmentPlayerLoses: arenajudgmentstring B_MSG_REF_OPPONENT_WON arenawaitmessage B_MSG_REF_OPPONENT_WON arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_LOSTTOOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG playfaintcry BS_PLAYER1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_PLAYER1 cleareffectsonfaint BS_PLAYER1 arenaplayermonlost @@ -8755,23 +8755,23 @@ BattleScript_ArenaJudgmentDraw: arenajudgmentstring B_MSG_REF_DRAW arenawaitmessage B_MSG_REF_DRAW arenajudgmentwindow - arenaerasereftextbox + erasearenareftextbox printstring STRINGID_TIEDOPPONENTBYREFEREE waitmessage B_WAIT_TIME_LONG playfaintcry BS_PLAYER1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_PLAYER1 cleareffectsonfaint BS_PLAYER1 playfaintcry BS_OPPONENT1 - waitcry BS_ATTACKER + waitcry dofaintanimation BS_OPPONENT1 cleareffectsonfaint BS_OPPONENT1 - arenabothmonlost + arenabothmonslost end2 BattleScript_AskIfWantsToForfeitMatch:: printselectionstring STRINGID_QUESTIONFORFEITMATCH - forfeityesnobox BS_ATTACKER + forfeityesnobox endselectionscript BattleScript_PrintPlayerForfeited:: @@ -9074,7 +9074,7 @@ BattleScript_Pickpocket:: swapattackerwithtarget call BattleScript_ItemSteal swapattackerwithtarget - activateitemeffects BS_TARGET + activateitemeffects return BattleScript_PickpocketPrevented: @@ -9536,7 +9536,7 @@ BattleScript_RaiseCritAlliesEnd: goto BattleScript_MoveEnd BattleScript_EffectHealOneSixthAllies:: - jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + jumpifteamhealthy BattleScript_MoveEnd savetarget copybyte gBattlerTarget, gBattlerAttacker BattleScript_HealOneSixthAlliesLoop: @@ -9617,11 +9617,11 @@ BattleScript_DynamaxEnds:: BattleScript_DynamaxEnds_Ret:: flushtextbox - spriteignore0hp TRUE + setspriteignore0hp TRUE updatedynamax playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - spriteignore0hp FALSE + setspriteignore0hp FALSE pause B_WAIT_TIME_SHORT return @@ -9720,7 +9720,7 @@ BattleScript_SleepClausePreventsEnd:: BattleScript_QuestionForfeitBattle:: printselectionstring STRINGID_QUESTIONFORFEITBATTLE - forfeityesnobox BS_ATTACKER + forfeityesnobox endselectionscript BattleScript_ForfeitBattleGaveMoney:: diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 004b4ca8ab..0e0f43893e 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -131,7 +131,7 @@ BattleScript_PokeFluteEnd:: BattleScript_ItemSetMist:: call BattleScript_UseItemMessage setmist - playmoveanimation BS_ATTACKER, MOVE_MIST + playmoveanimation MOVE_MIST waitanimation printfromtable gMistUsedStringIds waitmessage B_WAIT_TIME_LONG @@ -142,7 +142,7 @@ BattleScript_ItemSetFocusEnergy:: jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_ATTACKER - playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY + playmoveanimation MOVE_FOCUS_ENERGY waitanimation copybyte sBATTLER, gBattlerAttacker printstring STRINGID_PKMNUSEDXTOGETPUMPED diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 02f0bc2813..2d50ec1e4f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -88,123 +88,10 @@ #define CMP_COMMON_BITS 4 #define CMP_NO_COMMON_BITS 5 +// Veriouses have been deprecated but the enum and function will be supported for one more release cycle enum CmdVarious { - VARIOUS_CANCEL_MULTI_TURN_MOVES, - VARIOUS_IS_RUNNING_IMPOSSIBLE, - VARIOUS_GET_MOVE_TARGET, - VARIOUS_GET_BATTLER_FAINTED, - VARIOUS_RESET_SWITCH_IN_ABILITY_BITS, - VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP, - VARIOUS_RESET_PLAYER_FAINTED, - VARIOUS_PALACE_FLAVOR_TEXT, - VARIOUS_ARENA_JUDGMENT_WINDOW, - VARIOUS_ARENA_OPPONENT_MON_LOST, - VARIOUS_ARENA_PLAYER_MON_LOST, - VARIOUS_ARENA_BOTH_MONS_LOST, - VARIOUS_EMIT_YESNOBOX, - VARIOUS_DRAW_ARENA_REF_TEXT_BOX, - VARIOUS_ERASE_ARENA_REF_TEXT_BOX, - VARIOUS_ARENA_JUDGMENT_STRING, - VARIOUS_ARENA_WAIT_STRING, - VARIOUS_WAIT_CRY, - VARIOUS_RETURN_OPPONENT_MON1, - VARIOUS_RETURN_OPPONENT_MON2, - VARIOUS_VOLUME_DOWN, - VARIOUS_VOLUME_UP, - VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT, - VARIOUS_PALACE_TRY_ESCAPE_STATUS, - VARIOUS_SET_TELEPORT_OUTCOME, - VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC, - VARIOUS_STAT_TEXT_BUFFER, - VARIOUS_SWITCHIN_ABILITIES, - VARIOUS_INSTANT_HP_DROP, - VARIOUS_CLEAR_STATUS, - VARIOUS_RESTORE_PP, - VARIOUS_PLAY_MOVE_ANIMATION, - VARIOUS_SET_LUCKY_CHANT, - VARIOUS_SUCKER_PUNCH_CHECK, - VARIOUS_SET_SIMPLE_BEAM, - VARIOUS_TRY_ENTRAINMENT, - VARIOUS_SET_LAST_USED_ABILITY, - VARIOUS_INVERT_STAT_STAGES, - VARIOUS_TRY_ME_FIRST, - VARIOUS_JUMP_IF_BATTLE_END, - VARIOUS_TRY_ELECTRIFY, - VARIOUS_TRY_SOAK, - VARIOUS_TRY_LAST_RESORT, - VARIOUS_TRY_AUTOTOMIZE, - VARIOUS_ABILITY_POPUP, - VARIOUS_JUMP_IF_TARGET_ALLY, - VARIOUS_TRY_SYNCHRONOISE, - VARIOUS_PSYCHO_SHIFT, - VARIOUS_CURE_STATUS, - VARIOUS_POWER_TRICK, - VARIOUS_AFTER_YOU, - VARIOUS_BESTOW, - VARIOUS_JUMP_IF_NOT_GROUNDED, - VARIOUS_HANDLE_TRAINER_SLIDE_MSG, - VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF, - VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON, - VARIOUS_SET_AURORA_VEIL, - VARIOUS_TRY_THIRD_TYPE, - VARIOUS_ACUPRESSURE, - VARIOUS_GRAVITY_ON_AIRBORNE_MONS, - VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS, - VARIOUS_JUMP_IF_ROAR_FAILS, - VARIOUS_TRY_INSTRUCT, - VARIOUS_JUMP_IF_NOT_BERRY, - VARIOUS_TRACE_ABILITY, - VARIOUS_UPDATE_NICK, - VARIOUS_TRY_ILLUSION_OFF, - VARIOUS_SET_SPRITEIGNORE0HP, - VARIOUS_HANDLE_FORM_CHANGE, - VARIOUS_GET_STAT_VALUE, - VARIOUS_JUMP_IF_FULL_HP, - VARIOUS_LOSE_TYPE, - VARIOUS_TRY_ACTIVATE_SOULHEART, - VARIOUS_TRY_ACTIVATE_RECEIVER, - VARIOUS_TRY_FRISK, - VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED, - VARIOUS_TRY_FAIRY_LOCK, - VARIOUS_JUMP_IF_NO_ALLY, - VARIOUS_JUMP_IF_HOLD_EFFECT, - VARIOUS_INFATUATE_WITH_BATTLER, - VARIOUS_SET_LAST_USED_ITEM, - VARIOUS_JUMP_IF_ABSENT, - VARIOUS_DESTROY_ABILITY_POPUP, - VARIOUS_TOTEM_BOOST, - VARIOUS_MOVEEND_ITEM_EFFECTS, - VARIOUS_TERRAIN_SEED, - VARIOUS_MAKE_INVISIBLE, - VARIOUS_ROOM_SERVICE, - VARIOUS_JUMP_IF_TEAM_HEALTHY, - VARIOUS_TRY_HEAL_QUARTER_HP, - VARIOUS_JUMP_IF_PRANKSTER_BLOCKED, - VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER, - VARIOUS_GET_ROTOTILLER_TARGETS, - VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED, - VARIOUS_CONSUME_BERRY, - VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL, - VARIOUS_JUMP_IF_SPECIES, - VARIOUS_UPDATE_ABILITY_POPUP, - VARIOUS_JUMP_IF_WEATHER_AFFECTED, - VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED, - VARIOUS_SET_ATTACKER_STICKY_WEB_USER, - VARIOUS_TRY_NO_RETREAT, - VARIOUS_CHECK_POLTERGEIST, - VARIOUS_CUT_1_3_HP_RAISE_STATS, - VARIOUS_TRY_END_NEUTRALIZING_GAS, - VARIOUS_JUMP_IF_UNDER_200, - VARIOUS_SET_SKY_DROP, - VARIOUS_CLEAR_SKY_DROP, - VARIOUS_SKY_DROP_YAWN, - VARIOUS_CURE_CERTAIN_STATUSES, - VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES, - VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY, - VARIOUS_SAVE_BATTLER_ITEM, - VARIOUS_RESTORE_BATTLER_ITEM, - VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM, + VARIOUS_NONE, }; // Cmd_manipulatedamage diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 533c25171f..7f816f1f37 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6716,7 +6716,7 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.battler = battler; - + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || IsOnPlayerSide(battler)) BattleScriptCall(BattleScript_EmergencyExit); else @@ -9562,1608 +9562,14 @@ static bool32 ChangeOrderTargetAfterAttacker(void) return TRUE; } +// will be deprecated next release cycle static void Cmd_various(void) { CMD_ARGS(u8 battler, u8 id); - struct Pokemon *mon; - s32 i; - u8 data[10]; - u32 battler, bits; - enum CmdVarious variousId = cmd->id; - if (gBattleControllerExecFlags) return; - battler = GetBattlerForBattleScript(cmd->battler); - - switch (variousId) - { - // Roar will fail in a double wild battle when used by the player against one of the two alive wild mons. - // Also when an opposing wild mon uses it againt its partner. - // Also when B_FLAG_NO_RUNNING is enabled. - case VARIOUS_JUMP_IF_ROAR_FAILS: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (WILD_DOUBLE_BATTLE - && IsOnPlayerSide(gBattlerAttacker) - && !IsOnPlayerSide(gBattlerTarget) - && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else if (WILD_DOUBLE_BATTLE - && !IsOnPlayerSide(gBattlerAttacker) - && !IsOnPlayerSide(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else if (FlagGet(B_FLAG_NO_RUNNING)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_ABSENT: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlive(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsShieldsDownProtected(battler, GetBattlerAbility(battler))) - { - gBattlerAbility = battler; - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_HOLD_EFFECT: - { - VARIOUS_ARGS(u8 holdEffect, const u8 *jumpInstr, u8 equal); - if ((GetBattlerHoldEffect(battler, TRUE) == cmd->holdEffect) == cmd->equal) - { - if (cmd->equal) - gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - if (!cmd->equal) - gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_NO_ALLY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlive(BATTLE_PARTNER(battler))) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_INFATUATE_WITH_BATTLER: - { - VARIOUS_ARGS(u8 infatuateWith); - gBattleScripting.battler = battler; - gBattleMons[battler].volatiles.infatuation = INFATUATED_WITH(GetBattlerForBattleScript(cmd->infatuateWith)); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_LAST_USED_ITEM: - { - VARIOUS_ARGS(); - gLastUsedItem = gBattleMons[battler].item; - break; - } - case VARIOUS_TRY_FAIRY_LOCK: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; - gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_GET_STAT_VALUE: - { - VARIOUS_ARGS(u8 stat); - i = cmd->stat; - gBattleStruct->moveDamage[gBattlerAttacker] = *(u16 *)(&gBattleMons[battler].attack) + (i - 1); - gBattleStruct->moveDamage[gBattlerAttacker] *= gStatStageRatios[gBattleMons[battler].statStages[i]][0]; - gBattleStruct->moveDamage[gBattlerAttacker] /= gStatStageRatios[gBattleMons[battler].statStages[i]][1]; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_FULL_HP: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsBattlerAtMaxHp(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_FRISK: - { - VARIOUS_ARGS(); - while (gBattleStruct->friskedBattler < gBattlersCount) - { - gBattlerTarget = gBattleStruct->friskedBattler++; - if (!IsBattlerAlly(battler, gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && gBattleMons[gBattlerTarget].item != ITEM_NONE) - { - gLastUsedItem = gBattleMons[gBattlerTarget].item; - RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); - // If Frisk identifies two mons' items, show the pop-up only once. - if (gBattleStruct->friskedAbility) - { - BattleScriptCall(BattleScript_FriskMsg); - } - else - { - gBattleStruct->friskedAbility = TRUE; - BattleScriptCall(BattleScript_FriskMsgWithPopup); - } - return; - } - } - gBattleStruct->friskedBattler = 0; - gBattleStruct->friskedAbility = FALSE; - break; - } - case VARIOUS_TRACE_ABILITY: - { - VARIOUS_ARGS(); - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; - break; - } - case VARIOUS_TRY_ILLUSION_OFF: - { - VARIOUS_ARGS(); - if (TryClearIllusion(battler, ABILITYEFFECT_MOVE_END)) - return; - break; - } - case VARIOUS_SET_SPRITEIGNORE0HP: - { - VARIOUS_ARGS(bool8 ignore0HP); - gBattleStruct->spriteIgnore0Hp = cmd->ignore0HP; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_UPDATE_NICK: - { - VARIOUS_ARGS(); - mon = GetBattlerMon(battler); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_NICK); - break; - } - case VARIOUS_JUMP_IF_NOT_BERRY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - return; - } - case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS: - { - VARIOUS_ARGS(const u8 *failInstr); - if ((gStatuses3[battler] & (STATUS3_SEMI_INVULNERABLE | STATUS3_HEAL_BLOCK)) - || IsBattlerAtMaxHp(battler) - || !gBattleMons[battler].hp - || !(IsBattlerGrounded(battler))) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: - { - VARIOUS_ARGS(); - // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. - if (gStatuses3[battler] & STATUS3_ON_AIR && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - CancelMultiTurnMoves(battler, SKY_DROP_GRAVITY_ON_AIRBORNE); - - gStatuses3[battler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); - break; - } - case VARIOUS_ACUPRESSURE: - { - VARIOUS_ARGS(const u8 *failInstr); - bits = 0; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) - { - if (CompareStat(battler, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - bits |= 1u << i; - } - if (bits) - { - u32 statId; - do - { - statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; - } while (!(bits & (1u << statId))); - - SET_STATCHANGER(statId, 2, FALSE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_CANCEL_MULTI_TURN_MOVES: - { - VARIOUS_ARGS(); - const u8 *result; - result = CancelMultiTurnMoves(battler, SKY_DROP_CANCEL_MULTI_TURN_MOVES); - if (result) - { - gBattlescriptCurrInstr = result; - return; - } - break; - } - case VARIOUS_IS_RUNNING_IMPOSSIBLE: - { - VARIOUS_ARGS(); - gBattleCommunication[0] = IsRunningFromBattleImpossible(battler); - break; - } - case VARIOUS_GET_MOVE_TARGET: - { - VARIOUS_ARGS(); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - break; - } - case VARIOUS_GET_BATTLER_FAINTED: - { - VARIOUS_ARGS(); - if (gHitMarker & HITMARKER_FAINTED(battler)) - gBattleCommunication[0] = TRUE; - else - gBattleCommunication[0] = FALSE; - break; - } - case VARIOUS_RESET_SWITCH_IN_ABILITY_BITS: - { - VARIOUS_ARGS(); - gSpecialStatuses[battler].switchInAbilityDone = FALSE; - break; - } - case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: - { - VARIOUS_ARGS(); - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) - { - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) - battler = 0; - else - battler = 2; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[battler].moves[i] == gBattleStruct->choicedMove[battler]) - break; - } - if (i == MAX_MON_MOVES) - gBattleStruct->choicedMove[battler] = MOVE_NONE; - } - break; - } - case VARIOUS_RESET_PLAYER_FAINTED: - { - VARIOUS_ARGS(); - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) - && gBattleTypeFlags & BATTLE_TYPE_TRAINER - && IsBattlerAlive(B_POSITION_PLAYER_LEFT) - && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) - { - gHitMarker &= ~HITMARKER_PLAYER_FAINTED; - } - break; - } - case VARIOUS_PALACE_FLAVOR_TEXT: - { - VARIOUS_ARGS(); - // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") - gBattleCommunication[0] = FALSE; // whether or not msg should be printed - gBattleScripting.battler = battler = gBattleCommunication[1]; - if (!(gBattleStruct->palaceFlags & (1u << battler)) - && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp - && IsBattlerAlive(battler) - && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) - { - gBattleStruct->palaceFlags |= 1u << battler; - gBattleCommunication[0] = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = gNaturesInfo[GetNatureFromPersonality(gBattleMons[battler].personality)].battlePalaceFlavorText; - } - break; - } - case VARIOUS_ARENA_JUDGMENT_WINDOW: - { - VARIOUS_ARGS(); - - i = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]); - - // BattleArena_ShowJudgmentWindow's last state was an intermediate step. - // Return without advancing the current instruction so that it will be called again. - if (i == ARENA_RESULT_RUNNING) - return; - - gBattleCommunication[1] = i; - break; - } - case VARIOUS_ARENA_OPPONENT_MON_LOST: - { - VARIOUS_ARGS(); - gBattleMons[1].hp = 0; - gHitMarker |= HITMARKER_FAINTED(1); - gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; - gDisableStructs[1].truantSwitchInHack = 1; - break; - } - case VARIOUS_ARENA_PLAYER_MON_LOST: - { - VARIOUS_ARGS(); - gBattleMons[0].hp = 0; - gHitMarker |= HITMARKER_FAINTED(0); - gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; - gDisableStructs[0].truantSwitchInHack = 1; - break; - } - case VARIOUS_ARENA_BOTH_MONS_LOST: - { - VARIOUS_ARGS(); - gBattleMons[0].hp = 0; - gBattleMons[1].hp = 0; - gHitMarker |= HITMARKER_FAINTED(0); - gHitMarker |= HITMARKER_FAINTED(1); - gHitMarker |= HITMARKER_PLAYER_FAINTED; - gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[0]; - gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[1]; - gDisableStructs[0].truantSwitchInHack = 1; - gDisableStructs[1].truantSwitchInHack = 1; - break; - } - case VARIOUS_EMIT_YESNOBOX: - { - VARIOUS_ARGS(); - BtlController_EmitYesNoBox(battler, B_COMM_TO_CONTROLLER); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_DRAW_ARENA_REF_TEXT_BOX: - { - VARIOUS_ARGS(); - DrawArenaRefereeTextBox(); - break; - } - case VARIOUS_ERASE_ARENA_REF_TEXT_BOX: - { - VARIOUS_ARGS(); - EraseArenaRefereeTextBox(); - break; - } - case VARIOUS_ARENA_JUDGMENT_STRING: - { - CMD_ARGS(u8 id, u8 _); - BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[cmd->id]); - BattlePutTextOnWindow(gDisplayedStringBattle, ARENA_WIN_JUDGMENT_TEXT); - break; - } - case VARIOUS_ARENA_WAIT_STRING: - { - VARIOUS_ARGS(); - if (IsTextPrinterActive(ARENA_WIN_JUDGMENT_TEXT)) - return; - break; - } - case VARIOUS_WAIT_CRY: - { - VARIOUS_ARGS(); - if (!IsCryFinished()) - return; - break; - } - case VARIOUS_RETURN_OPPONENT_MON1: - { - VARIOUS_ARGS(); - battler = 1; - if (IsBattlerAlive(battler)) - { - BtlController_EmitReturnMonToBall(battler, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(battler); - } - break; - } - case VARIOUS_RETURN_OPPONENT_MON2: - { - VARIOUS_ARGS(); - if (gBattlersCount > 3) - { - battler = 3; - if (IsBattlerAlive(battler)) - { - BtlController_EmitReturnMonToBall(battler, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(battler); - } - } - break; - } - case VARIOUS_VOLUME_DOWN: - { - VARIOUS_ARGS(); - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x55); - break; - } - case VARIOUS_VOLUME_UP: - { - VARIOUS_ARGS(); - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - break; - } - case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT: - { - VARIOUS_ARGS(); - gBattleStruct->battlerState[battler].alreadyStatusedMoveAttempt = TRUE; - break; - } - case VARIOUS_PALACE_TRY_ESCAPE_STATUS: - { - VARIOUS_ARGS(); - if (BattlePalace_TryEscapeStatus(battler)) - return; - break; - } - case VARIOUS_SET_TELEPORT_OUTCOME: - { - VARIOUS_ARGS(); - // Don't end the battle if one of the wild mons teleported from the wild double battle - // and its partner is still alive. - if (!IsOnPlayerSide(battler) && IsBattlerAlive(BATTLE_PARTNER(battler))) - { - gAbsentBattlerFlags |= 1u << battler; - gHitMarker |= HITMARKER_FAINTED(battler); - gBattleMons[battler].hp = 0; - SetMonData(GetBattlerMon(battler), MON_DATA_HP, &gBattleMons[battler].hp); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - FaintClearSetData(battler); - } - else if (IsOnPlayerSide(battler)) - { - gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; - } - else - { - gBattleOutcome = B_OUTCOME_MON_TELEPORTED; - } - break; - } - case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - { - VARIOUS_ARGS(); - BtlController_EmitPlayFanfareOrBGM(battler, B_COMM_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_STAT_TEXT_BUFFER: - { - VARIOUS_ARGS(); - PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleCommunication[0]); - break; - } - case VARIOUS_SWITCHIN_ABILITIES: - { - VARIOUS_ARGS(); - gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); - return; - } - case VARIOUS_INSTANT_HP_DROP: - { - VARIOUS_ARGS(); - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_CLEAR_STATUS: - { - VARIOUS_ARGS(); - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_RESTORE_PP: - { - VARIOUS_ARGS(); - for (i = 0; i < 4; i++) - { - gBattleMons[battler].pp[i] = CalculatePPWithBonus(gBattleMons[battler].moves[i], gBattleMons[battler].ppBonuses, i); - data[i] = gBattleMons[battler].pp[i]; - } - data[i] = gBattleMons[battler].ppBonuses; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability - { - VARIOUS_ARGS(); - gBattlerAbility = BATTLE_PARTNER(battler); - i = GetBattlerAbility(gBattlerAbility); - if (IsBattlerAlive(gBattlerAbility) - && (i == ABILITY_RECEIVER || i == ABILITY_POWER_OF_ALCHEMY) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD - && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) - { - gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_ReceiverActivates; - return; - } - break; - } - case VARIOUS_TRY_ACTIVATE_SOULHEART: - { - VARIOUS_ARGS(); - while (gBattleStruct->soulheartBattlerId < gBattlersCount) - { - gBattleScripting.battler = gBattleStruct->soulheartBattlerId++; - if (GetBattlerAbility(gBattleScripting.battler) == ABILITY_SOUL_HEART - && IsBattlerAlive(gBattleScripting.battler) - && !NoAliveMonsForEitherParty() - && CompareStat(gBattleScripting.battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - BattleScriptCall(BattleScript_ScriptingAbilityStatRaise); - return; - } - } - gBattleStruct->soulheartBattlerId = 0; - break; - } - case VARIOUS_PLAY_MOVE_ANIMATION: - { - VARIOUS_ARGS(u16 move); - BtlController_EmitMoveAnimation(battler, B_COMM_TO_CONTROLLER, cmd->move, gBattleScripting.animTurn, 0, 0, gBattleMons[battler].friendship, &gDisableStructs[battler], gMultiHitCounter); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_LUCKY_CHANT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (!(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_LUCKY_CHANT)) - { - gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_LUCKY_CHANT; - gSideTimers[GetBattlerSide(battler)].luckyChantTimer = gBattleTurnCounter + 5; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_SUCKER_PUNCH_CHECK: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gProtectStructs[gBattlerTarget].protected == PROTECT_OBSTRUCT) - gBattlescriptCurrInstr = cmd->failInstr; - else if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else if (IsBattleMoveStatus(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]) && !gProtectStructs[gBattlerTarget].noValidMoves) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_SIMPLE_BEAM: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten - || gBattleMons[gBattlerTarget].ability == ABILITY_SIMPLE) - { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) - { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) - gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; - - gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_SIMPLE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_ENTRAINMENT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeCopied - || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten) - { - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) - { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability - || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; - gBattlescriptCurrInstr = cmd->nextInstr; - } - } - return; - } - case VARIOUS_SET_LAST_USED_ABILITY: - { - VARIOUS_ARGS(); - gLastUsedAbility = gBattleMons[battler].ability; - break; - } - case VARIOUS_INVERT_STAT_STAGES: - { - VARIOUS_ARGS(); - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) // Negative becomes positive. - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE + (DEFAULT_STAT_STAGE - gBattleMons[battler].statStages[i]); - else if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) // Positive becomes negative. - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE - (gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE); - } - break; - } - case VARIOUS_TRY_ME_FIRST: - { - VARIOUS_ARGS(const u8 *failInstr); - u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; - if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) - || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else - { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - gCalledMove = GetTypeBasedZMove(move); - } - else - { - gCalledMove = move; - } - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_BATTLE_END: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (NoAliveMonsForEitherParty()) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_ELECTRIFY: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gStatuses4[gBattlerTarget] |= STATUS4_ELECTRIFIED; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_SOAK: - { - VARIOUS_ARGS(const u8 *failInstr); - u32 types[3]; - GetBattlerTypes(gBattlerTarget, FALSE, types); - u32 typeToSet = GetMoveArgType(gCurrentMove); - if ((types[0] == typeToSet && types[1] == typeToSet) - || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - SET_BATTLER_TYPE(gBattlerTarget, typeToSet); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, typeToSet); - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_HANDLE_FORM_CHANGE: - { - VARIOUS_ARGS(u8 case_); - mon = GetBattlerMon(battler); - - // Change species. - if (cmd->case_ == 0) - { - /* What was the idea here? - if (!gBattleTextBuff1) - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battler].species); - */ - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); - MarkBattlerForControllerExec(battler); - } - // Change stats. - else if (cmd->case_ == 1) - { - RecalcBattlerStats(battler, mon, FALSE); - } - // Update healthbox. - else - { - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); - } - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_LAST_RESORT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (CanUseLastResort(battler)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; - return; - } - case VARIOUS_TRY_AUTOTOMIZE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerWeight(battler) > 1) - { - gDisableStructs[battler].autotomizeCount++; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_TRY_INSTRUCT: - { - VARIOUS_ARGS(const u8 *failInstr); - u16 move = gLastPrintedMoves[gBattlerTarget]; - if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) - || IsMoveInstructBanned(move) - || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect - || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) - || IsZMove(move) - || IsMaxMove(move)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; - gCalledMove = move; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerTarget].moves[i] == gCalledMove) - { - gCurrMovePos = i; - i = 4; - break; - } - } - if (i != 4 || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) - gBattlescriptCurrInstr = cmd->failInstr; - else - { - gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gBattlerPartyIndexes[battler]); - gBattlescriptCurrInstr = cmd->nextInstr; - } - } - return; - } - case VARIOUS_ABILITY_POPUP: - { - VARIOUS_ARGS(); - CreateAbilityPopUp(battler, gBattleMons[battler].ability, (IsDoubleBattle()) != 0); - break; - } - case VARIOUS_UPDATE_ABILITY_POPUP: - { - VARIOUS_ARGS(); - UpdateAbilityPopup(battler); - break; - } - case VARIOUS_JUMP_IF_TARGET_ALLY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - return; - } - case VARIOUS_TRY_SYNCHRONOISE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (!DoBattlersShareType(gBattlerAttacker, gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_LOSE_TYPE: - { - VARIOUS_ARGS(u8 type); - RemoveBattlerType(battler, cmd->type); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_PSYCHO_SHIFT: - { - VARIOUS_ARGS(const u8 *failInstr, const u8 *sleepClauseFailInstr); - u32 targetAbility = GetBattlerAbility(gBattlerTarget); - // Psycho shift works - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_TOXIC_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) && CanBeBurned(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && CanBeParalyzed(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerAttacker, gBattlerTarget, targetAbility, BLOCKED_BY_SLEEP_CLAUSE)) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE) && CanBeFrozen(gBattlerAttacker, gBattlerTarget, targetAbility)) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - else if (IsSleepClauseActiveForSide(GetBattlerSide(battler))) - { - gBattlescriptCurrInstr = cmd->sleepClauseFailInstr; - return; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - return; - } - gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; - battler = gBattlerTarget; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; - TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); - return; - } - case VARIOUS_CURE_STATUS: - { - VARIOUS_ARGS(); - - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_POWER_TRICK: - { - VARIOUS_ARGS(); - gStatuses3[battler] ^= STATUS3_POWER_TRICK; - SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, i); - break; - } - case VARIOUS_AFTER_YOU: - { - VARIOUS_ARGS(const u8 *failInstr); - if (ChangeOrderTargetAfterAttacker()) - { - gSpecialStatuses[gBattlerTarget].afterYou = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_BESTOW: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerAttacker].item == ITEM_NONE - || gBattleMons[gBattlerTarget].item != ITEM_NONE - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) - || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - BestowItem(gBattlerAttacker, gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_NOT_GROUNDED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (!IsBattlerGrounded(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_HANDLE_TRAINER_SLIDE_MSG: - { - VARIOUS_ARGS(u8 case_); - if (cmd->case_ == PRINT_SLIDE_MESSAGE) - { - BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, STRINGID_TRAINERSLIDE); - MarkBattlerForControllerExec(battler); - } - else if (cmd->case_ == RESTORE_BATTLER_SLIDE_CONTROL) - { - if (IsBattlerAlive(battler)) - { - SetBattlerShadowSpriteCallback(battler, gBattleMons[battler].species); - BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); - } - i = BATTLE_PARTNER(battler); - if (IsBattlerAlive(i)) - { - SetBattlerShadowSpriteCallback(i, gBattleMons[i].species); - BattleLoadMonSpriteGfx(GetBattlerMon(i), i); - } - } - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF: - { - VARIOUS_ARGS(); - if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN))) - { - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (i == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - return; - } - break; - } - case VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON: - { - VARIOUS_ARGS(); - if ((i = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_SWITCHIN))) - { - gBattleScripting.battler = battler; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (i == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); - return; - } - break; - } - case VARIOUS_SET_AURORA_VEIL: - { - VARIOUS_ARGS(); - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_AURORA_VEIL - || !(HasWeatherEffect() && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else - { - gSideStatuses[GetBattlerSide(battler)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 5; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - } - break; - } - case VARIOUS_TRY_THIRD_TYPE: - { - VARIOUS_ARGS(const u8 *failInstr); - u32 type = GetMoveArgType(gCurrentMove); - if (IS_BATTLER_OF_TYPE(battler, type) || GetActiveGimmick(battler) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleMons[battler].types[2] = type; - PREPARE_TYPE_BUFFER(gBattleTextBuff1, type); - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_DESTROY_ABILITY_POPUP: - { - VARIOUS_ARGS(); - for (u32 i = 0; i < gBattlersCount; i++) - { - DestroyAbilityPopUp(i); - } - break; - } - case VARIOUS_TOTEM_BOOST: - { - VARIOUS_ARGS(const u8 *jumpInstr); - battler = gBattlerAttacker; - if (gQueuedStatBoosts[battler].stats == 0) - { - gBattlescriptCurrInstr = cmd->nextInstr; // stats done, exit - } - else - { - for (i = 0; i < (NUM_BATTLE_STATS - 1); i++) - { - if (gQueuedStatBoosts[battler].stats & (1 << i)) - { - if (gQueuedStatBoosts[battler].statChanges[i] <= -1) - SET_STATCHANGER(i + 1, abs(gQueuedStatBoosts[battler].statChanges[i]), TRUE); - else - SET_STATCHANGER(i + 1, gQueuedStatBoosts[battler].statChanges[i], FALSE); - - gQueuedStatBoosts[battler].stats &= ~(1 << i); - gBattleScripting.battler = battler; - gBattlerTarget = battler; - if (gQueuedStatBoosts[battler].stats & 0x80) - { - gQueuedStatBoosts[battler].stats &= ~0x80; // set 'aura flared to life' flag - gBattlescriptCurrInstr = BattleScript_TotemFlaredToLife; - } - else - { - gBattlescriptCurrInstr = cmd->jumpInstr; // do boost - } - return; - } - } - gBattlescriptCurrInstr = cmd->nextInstr; // exit if loop failed (failsafe) - } - return; - } - case VARIOUS_MOVEEND_ITEM_EFFECTS: - { - VARIOUS_ARGS(); - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) - return; - break; - } - case VARIOUS_ROOM_SERVICE: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) - { - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_TERRAIN_SEED: - { - VARIOUS_ARGS(const u8 *failInstr); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SEEDS) - { - enum ItemEffect effect = ITEM_NO_EFFECT; - u16 item = gBattleMons[battler].item; - switch (GetBattlerHoldEffectParam(battler)) - { - case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); - break; - } - - if (effect != ITEM_NO_EFFECT) - return; - } - gBattlescriptCurrInstr = cmd->failInstr; - return; - } - case VARIOUS_MAKE_INVISIBLE: - { - VARIOUS_ARGS(); - if (gBattleControllerExecFlags) - break; - - BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); - MarkBattlerForControllerExec(battler); - break; - } - case VARIOUS_JUMP_IF_TEAM_HEALTHY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if ((IsDoubleBattle()) && IsBattlerAlive(BATTLE_PARTNER(battler))) - { - u8 partner = BATTLE_PARTNER(battler); - if ((gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) - && (gBattleMons[partner].hp == gBattleMons[partner].maxHP && !(gBattleMons[partner].status1 & STATUS1_ANY))) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - else // single battle - { - if (gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_HEAL_QUARTER_HP: - { - VARIOUS_ARGS(const u8 *failInstr); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - - if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal - return; - } - case VARIOUS_JUMP_IF_UNDER_200: - { - VARIOUS_ARGS(const u8 *jumpInstr); - // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail. - if (GetBattlerWeight(gBattlerTarget) < 2000) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SET_SKY_DROP: - { - VARIOUS_ARGS(); - gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. - This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if - the target of a Sky Drop faints while in the air.*/ - gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; - gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; - - // End any multiturn effects caused by the target except VOLATILE_LOCK_CONFUSE - gBattleMons[gBattlerTarget].volatiles.multipleTurns = 0; - gBattleMons[gBattlerTarget].volatiles.uproarTurns= 0; - gBattleMons[gBattlerTarget].volatiles.bideTurns = 0; - gDisableStructs[gBattlerTarget].rolloutTimer = 0; - gDisableStructs[gBattlerTarget].furyCutterCounter = 0; - - // End any Follow Me/Rage Powder effects caused by the target - if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) - gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; - - break; - } - case VARIOUS_CLEAR_SKY_DROP: - { - VARIOUS_ARGS(const u8 *failInstr); - // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. - // If so, make the move fail. If not, clear all of the statuses and continue the move. - if (gBattleStruct->skyDropTargets[gBattlerAttacker] == SKY_DROP_NO_TARGET) - gBattlescriptCurrInstr = cmd->failInstr; - else - { - gBattleStruct->skyDropTargets[gBattlerAttacker] = SKY_DROP_NO_TARGET; - gBattleStruct->skyDropTargets[gBattlerTarget] = SKY_DROP_NO_TARGET; - gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); - gBattlescriptCurrInstr = cmd->nextInstr; - } - - // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. - if (gBattleMons[gBattlerTarget].volatiles.lockConfusionTurns) - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; - return; - } - case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data. - { - VARIOUS_ARGS(); - if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED)) - { - // Set the target of Sky Drop as gEffectBattler - gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; - - // Clear skyDropTargets data - gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = SKY_DROP_NO_TARGET; - gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; - - // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation - if (gBattleMons[gEffectBattler].volatiles.lockConfusionTurns && CanBeConfused(gEffectBattler)) - { - gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; - gBattlerAttacker = gEffectBattler; - gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - return; - } - } - break; - } - case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (BlocksPrankster(gCurrentMove, gBattlerAttacker, battler, TRUE)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER: - { - bool8 shouldNotClear = FALSE; - - for (i = 0; i < gBattlersCount; i++) - { - u32 ability = GetBattlerAbility(i); - if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL) - || (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL) - || (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS)) - && IsBattlerAlive(i)) - shouldNotClear = TRUE; - } - if (gBattleWeather & B_WEATHER_SUN_PRIMAL && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_SUN_PRIMAL; - PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - else if (gBattleWeather & B_WEATHER_RAIN_PRIMAL && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_RAIN_PRIMAL; - PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - else if (gBattleWeather & B_WEATHER_STRONG_WINDS && !shouldNotClear) - { - gBattleWeather &= ~B_WEATHER_STRONG_WINDS; - PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, battler); - gBattleCommunication[MSG_DISPLAY] = 1; - } - break; - } - case VARIOUS_TRY_END_NEUTRALIZING_GAS: - { - VARIOUS_ARGS(); - if (gSpecialStatuses[battler].neutralizingGasRemoved) - { - gSpecialStatuses[battler].neutralizingGasRemoved = FALSE; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - return; - } - break; - } - case VARIOUS_GET_ROTOTILLER_TARGETS: - { - VARIOUS_ARGS(const u8 *failInstr); - // Gets the battlers to be affected by rototiller. If there are none, print 'But it failed!' - { - u32 count = 0; - for (i = 0; i < gBattlersCount; i++) - { - gSpecialStatuses[i].rototillerAffected = FALSE; - if (IsRototillerAffected(i)) - { - gSpecialStatuses[i].rototillerAffected = TRUE; - count++; - } - } - - if (count == 0) - gBattlescriptCurrInstr = cmd->failInstr; // Rototiller fails - else - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (gSpecialStatuses[battler].rototillerAffected) - { - gSpecialStatuses[battler].rototillerAffected = FALSE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->jumpInstr; // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET - } - return; - } - case VARIOUS_CONSUME_BERRY: - { - VARIOUS_ARGS(bool8 fromBattler); - if (gBattleScripting.overrideBerryRequirements == 2) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - if (cmd->fromBattler) - gLastUsedItem = gBattleMons[battler].item; - - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; - gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID - if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler)) - return; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) == gBattleMons[battler].species) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_WEATHER_AFFECTED: - { - VARIOUS_ARGS(u32 flags, const u8 *jumpInstr); - u32 flags = cmd->flags; - if (IsBattlerWeatherAffected(battler, flags)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_SPECIES: - { - VARIOUS_ARGS(u16 species, const u8 *jumpInstr); - if (gBattleMons[battler].species == cmd->species) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) - { - gBattlerAbility = battler; - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_SET_ATTACKER_STICKY_WEB_USER: - { - VARIOUS_ARGS(); - // For Mirror Armor: "If the Pokémon with this Ability is affected by Sticky Web, the effect is reflected back to the Pokémon which set it up. - // If Pokémon which set up Sticky Web is not on the field, no Pokémon have their Speed lowered." - gBattlerAttacker = gBattlerTarget; // Initialize 'fail' condition - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - if (gSideTimers[GetBattlerSide(battler)].stickyWebBattlerId != 0xFF) - gBattlerAttacker = gSideTimers[GetBattlerSide(battler)].stickyWebBattlerId; - break; - } - case VARIOUS_CUT_1_3_HP_RAISE_STATS: - { - VARIOUS_ARGS(const u8 *failInstr); - - bool8 atLeastOneStatBoosted = FALSE; - u16 hpFraction = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); - - for (i = 1; i < NUM_STATS; i++) - { - if (CompareStat(gBattlerAttacker, i, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - atLeastOneStatBoosted = TRUE; - break; - } - } - if (atLeastOneStatBoosted && gBattleMons[gBattlerAttacker].hp > hpFraction) - { - gBattleStruct->moveDamage[gBattlerAttacker] = hpFraction; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - return; - } - case VARIOUS_CHECK_POLTERGEIST: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gBattleMons[battler].item == ITEM_NONE - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || GetBattlerAbility(battler) == ABILITY_KLUTZ) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battler].item); - gLastUsedItem = gBattleMons[battler].item; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_TRY_NO_RETREAT: - { - VARIOUS_ARGS(const u8 *failInstr); - if (gDisableStructs[battler].noRetreat) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (!gBattleMons[battler].volatiles.escapePrevention) - gDisableStructs[battler].noRetreat = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - return; - } - case VARIOUS_CURE_CERTAIN_STATUSES: - { - VARIOUS_ARGS(); - // Check infatuation - if (gBattleMons[battler].volatiles.infatuation) - { - gBattleMons[battler].volatiles.infatuation = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - } - // Check taunt - if (gDisableStructs[battler].tauntTimer != 0) - { - gDisableStructs[battler].tauntTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - } - // Check encore - if (gDisableStructs[battler].encoreTimer != 0) - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED - } - // Check torment - if (gBattleMons[battler].volatiles.torment == TRUE) - { - gBattleMons[battler].volatiles.torment = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; - } - // Check heal block - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) - { - gStatuses3[battler] &= ~(STATUS3_HEAL_BLOCK); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; - } - // Check disable - if (gDisableStructs[battler].disableTimer != 0) - { - gDisableStructs[battler].disableTimer = 0; - gDisableStructs[battler].disabledMove = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; - } - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES: - { - VARIOUS_ARGS(); - battler = gBattlerTarget; - for (i = 0; i < NUM_BATTLE_STATS; i++) - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY: - { - VARIOUS_ARGS(const u8 *jumpInstr); - if (GetItemPocket(gLastUsedItem) == POCKET_BERRIES) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - case VARIOUS_SAVE_BATTLER_ITEM: - { - VARIOUS_ARGS(); - gBattleHistory->heldItems[battler] = gBattleMons[battler].item; - break; - } - case VARIOUS_RESTORE_BATTLER_ITEM: - { - VARIOUS_ARGS(); - gBattleMons[battler].item = gBattleHistory->heldItems[battler]; - break; - } - case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM: - { - VARIOUS_ARGS(); - gBattleMons[battler].item = gLastUsedItem; - break; - } - } // End of switch (cmd->id) - gBattlescriptCurrInstr = cmd->nextInstr; } @@ -18351,3 +16757,1636 @@ void BS_TrySynchronoise(void) else gBattlescriptCurrInstr = cmd->jumpInstr; } + +void BS_JumpIfRoarFails(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (WILD_DOUBLE_BATTLE + && IsOnPlayerSide(gBattlerAttacker) + && !IsOnPlayerSide(gBattlerTarget) + && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (WILD_DOUBLE_BATTLE + && !IsOnPlayerSide(gBattlerAttacker) + && !IsOnPlayerSide(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else if (FlagGet(B_FLAG_NO_RUNNING)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfAbsent(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (!IsBattlerAlive(GetBattlerForBattleScript(cmd->battler))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfHoldEffect(void) +{ + NATIVE_ARGS(u8 battler, u8 holdEffect, const u8 *jumpInstr, u8 equal); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if ((GetBattlerHoldEffect(battler, TRUE) == cmd->holdEffect) == cmd->equal) + { + if (cmd->equal) + gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM + gBattlescriptCurrInstr = cmd->jumpInstr; + } + else + { + if (!cmd->equal) + gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_JumpIfNoAlly(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 partner = BATTLE_PARTNER(GetBattlerForBattleScript(cmd->battler)); + if (!IsBattlerAlive(partner)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_InfatuateWithBattler(void) +{ + NATIVE_ARGS(u8 battler, u8 infatuateWith); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleScripting.battler = battler; + gBattleMons[battler].volatiles.infatuation = INFATUATED_WITH(GetBattlerForBattleScript(cmd->infatuateWith)); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetLastUsedItem(void) +{ + NATIVE_ARGS(u8 battler); + gLastUsedItem = gBattleMons[GetBattlerForBattleScript(cmd->battler)].item; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TrySetFairyLock(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; + gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_GetStatValue(void) +{ + NATIVE_ARGS(u8 stat); + u32 stat = cmd->stat; + gBattleStruct->moveDamage[gBattlerAttacker] = *(u16 *)(&gBattleMons[gBattlerTarget].attack) + (stat - 1); + gBattleStruct->moveDamage[gBattlerAttacker] *= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][0]; + gBattleStruct->moveDamage[gBattlerAttacker] /= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][1]; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfFullHp(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (IsBattlerAtMaxHp(GetBattlerForBattleScript(cmd->battler))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryFriskMessage(void) +{ + NATIVE_ARGS(); + while (gBattleStruct->friskedBattler < gBattlersCount) + { + gBattlerTarget = gBattleStruct->friskedBattler++; + if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattleMons[gBattlerTarget].item != ITEM_NONE) + { + gLastUsedItem = gBattleMons[gBattlerTarget].item; + RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); + // If Frisk identifies two mons' items, show the pop-up only once. + if (gBattleStruct->friskedAbility) + { + BattleScriptCall(BattleScript_FriskMsg); + } + else + { + gBattleStruct->friskedAbility = TRUE; + BattleScriptCall(BattleScript_FriskMsgWithPopup); + } + return; + } + } + gBattleStruct->friskedBattler = 0; + gBattleStruct->friskedAbility = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetTracedAbility(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryIllusionOff(void) +{ + NATIVE_ARGS(u8 battler); + if (TryClearIllusion(GetBattlerForBattleScript(cmd->battler), ABILITYEFFECT_MOVE_END)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetSpriteIgnore0Hp(void) +{ + NATIVE_ARGS(bool8 ignore0HP); + gBattleStruct->spriteIgnore0Hp = cmd->ignore0HP; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_UpdateNick(void) +{ + NATIVE_ARGS(); + u32 battler = gBattleScripting.battler; + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_NICK); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfNotBerry(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + if (GetItemPocket(gBattleMons[GetBattlerForBattleScript(cmd->battler)].item) == POCKET_BERRIES) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->jumpInstr; +} + +void BS_GravityOnAirborneMons(void) +{ + NATIVE_ARGS(); + // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. + if (gStatuses3[gBattlerTarget] & STATUS3_ON_AIR && !(gStatuses3[gBattlerTarget] & STATUS3_SKY_DROPPED)) + CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_GRAVITY_ON_AIRBORNE); + + gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryAcupressure(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 bits = 0; + for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + { + if (CompareStat(gBattlerTarget, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) + bits |= 1u << stat; + } + if (bits) + { + u32 statId; + do + { + statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; + } while (!(bits & (1u << statId))); + + SET_STATCHANGER(statId, 2, FALSE); + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_CancelMultiTurnMoves(void) +{ + NATIVE_ARGS(); + const u8 *result = CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_CANCEL_MULTI_TURN_MOVES); + if (result) + gBattlescriptCurrInstr = result; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_IsRunningImpossible(void) +{ + NATIVE_ARGS(); + gBattleCommunication[0] = IsRunningFromBattleImpossible(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_GetMoveTarget(void) +{ + NATIVE_ARGS(); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_GetBattlerFainted(void) +{ + NATIVE_ARGS(u8 battler); + if (gHitMarker & HITMARKER_FAINTED(GetBattlerForBattleScript(cmd->battler))) + gBattleCommunication[0] = TRUE; + else + gBattleCommunication[0] = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ResetSwitchInAbilityBits(void) +{ + NATIVE_ARGS(); + gSpecialStatuses[gBattlerAttacker].switchInAbilityDone = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_UpdateChoiceMoveOnLvlUp(void) +{ + NATIVE_ARGS(); + if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) + { + u32 battler; + if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) + battler = 0; + else + battler = 2; + + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (gBattleMons[battler].moves[moveIndex] == gBattleStruct->choicedMove[battler]) + break; + } + if (moveIndex == MAX_MON_MOVES) + gBattleStruct->choicedMove[battler] = MOVE_NONE; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ResetPlayerFainted(void) +{ + NATIVE_ARGS(); + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE)) + && gBattleTypeFlags & BATTLE_TYPE_TRAINER + && IsBattlerAlive(B_POSITION_PLAYER_LEFT) + && IsBattlerAlive(B_POSITION_OPPONENT_LEFT)) + { + gHitMarker &= ~HITMARKER_PLAYER_FAINTED; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PalaceFlavorText(void) +{ + NATIVE_ARGS(); + // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") + u32 battler; + gBattleCommunication[0] = FALSE; // whether or not msg should be printed + gBattleScripting.battler = battler = gBattleCommunication[1]; + if (!(gBattleStruct->palaceFlags & (1u << battler)) + && gBattleMons[battler].maxHP / 2 >= gBattleMons[battler].hp + && IsBattlerAlive(battler) + && !(gBattleMons[battler].status1 & STATUS1_SLEEP)) + { + gBattleStruct->palaceFlags |= 1u << battler; + gBattleCommunication[0] = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = gNaturesInfo[GetNatureFromPersonality(gBattleMons[battler].personality)].battlePalaceFlavorText; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ArenaJudgmentWindow(void) +{ + NATIVE_ARGS(); + u32 judgmentWindow = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]); + + // BattleArena_ShowJudgmentWindow's last state was an intermediate step. + // Return without advancing the current instruction so that it will be called again. + if (judgmentWindow == ARENA_RESULT_RUNNING) + return; + + gBattleCommunication[1] = judgmentWindow; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static void SetArenMonLostValues(u32 battler) +{ + gBattleMons[battler].hp = 0; + gHitMarker |= HITMARKER_FAINTED(battler); + gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[battler]; + gDisableStructs[battler].truantSwitchInHack = TRUE; +} + +#define playerMon 0 +#define opponentMon 1 +void BS_ArenaOpponentMonLost(void) +{ + NATIVE_ARGS(); + SetArenMonLostValues(opponentMon); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ArenaPlayerMonLost(void) +{ + NATIVE_ARGS(); + SetArenMonLostValues(playerMon); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ArenaBothMonsLost(void) +{ + NATIVE_ARGS(); + SetArenMonLostValues(playerMon); + SetArenMonLostValues(opponentMon); + gBattlescriptCurrInstr = cmd->nextInstr; +} +#undef playerMon +#undef opponentMon + +void BS_ForfeitYesNoBox(void) +{ + NATIVE_ARGS(); + BtlController_EmitYesNoBox(gBattlerAttacker, B_COMM_TO_CONTROLLER); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_DrawArenaRefTextBox(void) +{ + NATIVE_ARGS(); + DrawArenaRefereeTextBox(); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_EraseArenaRefTextBox(void) +{ + NATIVE_ARGS(); + EraseArenaRefereeTextBox(); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ArenaJudgmentString(void) +{ + CMD_ARGS(u8 id); + BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[cmd->id]); + BattlePutTextOnWindow(gDisplayedStringBattle, ARENA_WIN_JUDGMENT_TEXT); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// Argument passed but no use +void BS_ArenaWaitMessage(void) +{ + NATIVE_ARGS(); + if (IsTextPrinterActive(ARENA_WIN_JUDGMENT_TEXT)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_WaitCry(void) +{ + NATIVE_ARGS(); + if (!IsCryFinished()) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +#define opponentFirstBattler 1 +#define opponentSecondBattler 3 +void BS_ReturnOpponentMon1ToBall(void) +{ + NATIVE_ARGS(); + if (IsBattlerAlive(opponentFirstBattler)) + { + BtlController_EmitReturnMonToBall(opponentFirstBattler, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(opponentFirstBattler); + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ReturnOpponentMon2ToBall(void) +{ + NATIVE_ARGS(); + if (gBattlersCount > opponentSecondBattler) + { + if (IsBattlerAlive(opponentSecondBattler)) + { + BtlController_EmitReturnMonToBall(opponentSecondBattler, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(opponentSecondBattler); + } + } + gBattlescriptCurrInstr = cmd->nextInstr; +} +#undef opponentFirstBattler +#undef opponentSecondBattler + +void BS_VolumeDown(void) +{ + NATIVE_ARGS(); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x55); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_VolumeUp(void) +{ + NATIVE_ARGS(); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetAlreadyStatusedMoveAttempt(void) +{ + NATIVE_ARGS(); + gBattleStruct->battlerState[gBattlerAttacker].alreadyStatusedMoveAttempt = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PalaceTryEscapeStatus(void) +{ + NATIVE_ARGS(); + if (BattlePalace_TryEscapeStatus(gBattlerAttacker)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetTeleportOutcome(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + // Don't end the battle if one of the wild mons teleported from the wild double battle + // and its partner is still alive. + if (!IsOnPlayerSide(battler) && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + gAbsentBattlerFlags |= 1u << battler; + gHitMarker |= HITMARKER_FAINTED(battler); + gBattleMons[battler].hp = 0; + SetMonData(GetBattlerMon(battler), MON_DATA_HP, &gBattleMons[battler].hp); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); + FaintClearSetData(battler); + } + else if (IsOnPlayerSide(battler)) + { + gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; + } + else + { + gBattleOutcome = B_OUTCOME_MON_TELEPORTED; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PlayTrainerDefeatedMusic(void) +{ + NATIVE_ARGS(); + BtlController_EmitPlayFanfareOrBGM(gBattlerAttacker, B_COMM_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_StatTextBuffer(void) +{ + NATIVE_ARGS(); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleCommunication[0]); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SwitchinAbilities(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlescriptCurrInstr = cmd->nextInstr; + AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); +} + +void BS_InstantHpDrop(void) +{ + NATIVE_ARGS(); + BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ClearStatus(void) +{ + NATIVE_ARGS(); + gBattleMons[gBattlerAttacker].status1 = 0; + BtlController_EmitSetMonData( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + sizeof(gBattleMons[gBattlerAttacker].status1), + &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +// NEW BATCH + +void BS_RestoreMovePp(void) +{ + NATIVE_ARGS(); + u32 moveIndex; + u32 data[MAX_MON_MOVES + 1]; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + gBattleMons[gBattlerAttacker].pp[moveIndex] = CalculatePPWithBonus(gBattleMons[gBattlerAttacker].moves[moveIndex], gBattleMons[gBattlerAttacker].ppBonuses, moveIndex); + data[moveIndex] = gBattleMons[gBattlerAttacker].pp[moveIndex]; + } + data[moveIndex] = gBattleMons[gBattlerAttacker].ppBonuses; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryActivateReceiver(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlerAbility = BATTLE_PARTNER(battler); + u32 partnerAbility = GetBattlerAbility(gBattlerAbility); + if (IsBattlerAlive(gBattlerAbility) + && (partnerAbility == ABILITY_RECEIVER || partnerAbility == ABILITY_POWER_OF_ALCHEMY) + && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD + && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) + { + gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_ReceiverActivates; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryActivateSoulheart(void) +{ + NATIVE_ARGS(); + while (gBattleStruct->soulheartBattlerId < gBattlersCount) + { + gBattleScripting.battler = gBattleStruct->soulheartBattlerId++; + if (GetBattlerAbility(gBattleScripting.battler) == ABILITY_SOUL_HEART + && IsBattlerAlive(gBattleScripting.battler) + && !NoAliveMonsForEitherParty() + && CompareStat(gBattleScripting.battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); + BattleScriptCall(BattleScript_ScriptingAbilityStatRaise); + return; + } + } + gBattleStruct->soulheartBattlerId = 0; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PlayMoveAnimation(void) +{ + NATIVE_ARGS(u16 move); + BtlController_EmitMoveAnimation( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + cmd->move, + gBattleScripting.animTurn, + 0, + 0, + gBattleMons[gBattlerAttacker].friendship, + &gDisableStructs[gBattlerAttacker], + gMultiHitCounter); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetLuckyChant(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 side = GetBattlerSide(gBattlerAttacker); + if (!(gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT)) + { + gSideStatuses[side] |= SIDE_STATUS_LUCKY_CHANT; + gSideTimers[side].luckyChantTimer = gBattleTurnCounter + 5; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_SuckerPunchCheck(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gProtectStructs[gBattlerTarget].protected == PROTECT_OBSTRUCT) + gBattlescriptCurrInstr = cmd->failInstr; + else if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->failInstr; + else if (IsBattleMoveStatus(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]) && !gProtectStructs[gBattlerTarget].noValidMoves) + gBattlescriptCurrInstr = cmd->failInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetSimpleBeam(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten + || gBattleMons[gBattlerTarget].ability == ABILITY_SIMPLE) + { + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) + gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; + + gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_SIMPLE; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryEntrainment(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeCopied + || gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeOverwritten) + { + RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability + || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattlescriptCurrInstr = cmd->nextInstr; + } + } +} + +void BS_SetLastUsedAbility(void) +{ + NATIVE_ARGS(); + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_InvertStatStages(void) +{ + NATIVE_ARGS(); + for (u32 i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gBattlerTarget].statStages[i] < DEFAULT_STAT_STAGE) // Negative becomes positive. + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE + (DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[i]); + else if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE) // Positive becomes negative. + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE - (gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE); + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryMeFirst(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; + if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) + || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) + { + gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; + gCalledMove = GetTypeBasedZMove(move); + } + else + { + gCalledMove = move; + } + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryElectrify(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gStatuses4[gBattlerTarget] |= STATUS4_ELECTRIFIED; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TrySoak(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 types[3]; + GetBattlerTypes(gBattlerTarget, FALSE, types); + u32 typeToSet = GetMoveArgType(gCurrentMove); + if ((types[0] == typeToSet && types[1] == typeToSet) + || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + SET_BATTLER_TYPE(gBattlerTarget, typeToSet); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, typeToSet); + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_HandleFormChange(void) +{ + NATIVE_ARGS(u8 battler, u8 case_); + u32 battler = GetBattlerForBattleScript(cmd->battler); + struct Pokemon *mon = GetBattlerMon(battler); + + if (cmd->case_ == 0) // Change species. + { + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_SPECIES_BATTLE, 1u << gBattlerPartyIndexes[battler], sizeof(gBattleMons[battler].species), &gBattleMons[battler].species); + MarkBattlerForControllerExec(battler); + } + else if (cmd->case_ == 1) // Change stats. + { + RecalcBattlerStats(battler, mon, FALSE); + } + else // Update healthbox. + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_ALL); + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryLastResort(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (CanUseLastResort(gBattlerAttacker)) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->failInstr; +} + +void BS_TryAutotomize(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (GetBattlerWeight(gBattlerAttacker) > 1) + { + gDisableStructs[gBattlerAttacker].autotomizeCount++; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TryInstruct(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16 move = gLastPrintedMoves[gBattlerTarget]; + if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) + || IsMoveInstructBanned(move) + || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect + || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + || IsZMove(move) + || IsMaxMove(move)) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gSpecialStatuses[gBattlerTarget].instructedChosenTarget = gBattleStruct->moveTarget[gBattlerTarget] | 0x4; + gCalledMove = move; + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (gBattleMons[gBattlerTarget].moves[moveIndex] == gCalledMove) + { + gCurrMovePos = moveIndex; + moveIndex = 4; + break; + } + } + if (moveIndex != 4 || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); + gBattlescriptCurrInstr = cmd->nextInstr; + } + } +} + +void BS_ShowAbilityPopup(void) +{ + NATIVE_ARGS(); + CreateAbilityPopUp(gBattlerAbility, gBattleMons[gBattlerAbility].ability, (IsDoubleBattle()) != 0); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_UpdateAbilityPopup(void) +{ + NATIVE_ARGS(); + UpdateAbilityPopup(gBattlerAbility); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfTargetAlly(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + gBattlescriptCurrInstr = cmd->nextInstr; + else + gBattlescriptCurrInstr = cmd->jumpInstr; +} + +void BS_TryPsychoShift(void) +{ + NATIVE_ARGS(const u8 *failInstr, const u8 *sleepClauseFailInstr); + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + // Psycho shift works + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_TOXIC_POISON) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) && CanBeBurned(gBattlerAttacker, gBattlerTarget, targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && CanBeParalyzed(gBattlerAttacker, gBattlerTarget, targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) && CanBeSlept(gBattlerAttacker, gBattlerTarget, targetAbility, BLOCKED_BY_SLEEP_CLAUSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + } + else if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE) && CanBeFrozen(gBattlerAttacker, gBattlerTarget, targetAbility)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + else if (IsSleepClauseActiveForSide(GetBattlerSide(gBattlerTarget))) + { + gBattlescriptCurrInstr = cmd->sleepClauseFailInstr; + return; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + return; + } + gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; + BtlController_EmitSetMonData( + gBattlerTarget, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + sizeof(gBattleMons[gBattlerTarget].status1), + &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_CureStatus(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + + gBattleMons[battler].status1 = 0; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_PowerTrick(void) +{ + NATIVE_ARGS(); + u32 temp; + gStatuses3[gBattlerAttacker] ^= STATUS3_POWER_TRICK; + SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerAttacker].defense, temp); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryAfterYou(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (ChangeOrderTargetAfterAttacker()) + { + gSpecialStatuses[gBattlerTarget].afterYou = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TryBestow(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gBattleMons[gBattlerAttacker].item == ITEM_NONE + || gBattleMons[gBattlerTarget].item != ITEM_NONE + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) + || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + BestowItem(gBattlerAttacker, gBattlerTarget); + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_HandleTrainerSlideMsg(void) +{ + NATIVE_ARGS(u8 battler, u8 case_); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (cmd->case_ == PRINT_SLIDE_MESSAGE) + { + BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, STRINGID_TRAINERSLIDE); + MarkBattlerForControllerExec(battler); + } + else if (cmd->case_ == RESTORE_BATTLER_SLIDE_CONTROL) + { + if (IsBattlerAlive(battler)) + { + SetBattlerShadowSpriteCallback(battler, gBattleMons[battler].species); + BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler); + } + u32 partner = BATTLE_PARTNER(battler); + if (IsBattlerAlive(partner)) + { + SetBattlerShadowSpriteCallback(partner, gBattleMons[partner].species); + BattleLoadMonSpriteGfx(GetBattlerMon(partner), partner); + } + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryTrainerSlideMsgFirstOff(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 shouldDoTrainerSlide = 0; + if ((shouldDoTrainerSlide = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN))) + { + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryTrainerSlideMsgLastOn(void) +{ + NATIVE_ARGS(u8 battler); + u32 shouldDoTrainerSlide = 0; + u32 battler = GetBattlerForBattleScript(cmd->battler); + if ((shouldDoTrainerSlide = ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_SWITCHIN))) + { + gBattleScripting.battler = battler; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +// Potential bug with failing message and missed result on wrong battler +void BS_SetAuroraVeil(void) +{ + NATIVE_ARGS(); + u32 side = GetBattlerSide(gBattlerAttacker); + if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL + || !(HasWeatherEffect() && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + { + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideStatuses[side] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; + + if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryThirdType(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 type = GetMoveArgType(gCurrentMove); + if (IS_BATTLER_OF_TYPE(gBattlerTarget, type) || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleMons[gBattlerTarget].types[2] = type; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, type); + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_DestroyAbilityPopup(void) +{ + NATIVE_ARGS(); + for (u32 battler = 0; battler < gBattlersCount; battler++) + DestroyAbilityPopUp(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_GetTotemBoost(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + u32 battler = gBattlerAttacker; + if (gQueuedStatBoosts[battler].stats == 0) + { + gBattlescriptCurrInstr = cmd->nextInstr; // stats done, exit + } + else + { + for (u32 i = 0; i < (NUM_BATTLE_STATS - 1); i++) + { + if (gQueuedStatBoosts[battler].stats & (1 << i)) + { + if (gQueuedStatBoosts[battler].statChanges[i] <= -1) + SET_STATCHANGER(i + 1, abs(gQueuedStatBoosts[battler].statChanges[i]), TRUE); + else + SET_STATCHANGER(i + 1, gQueuedStatBoosts[battler].statChanges[i], FALSE); + + gQueuedStatBoosts[battler].stats &= ~(1 << i); + gBattleScripting.battler = battler; + gBattlerTarget = battler; + if (gQueuedStatBoosts[battler].stats & 0x80) + { + gQueuedStatBoosts[battler].stats &= ~0x80; // set 'aura flared to life' flag + gBattlescriptCurrInstr = BattleScript_TotemFlaredToLife; + } + else + { + gBattlescriptCurrInstr = cmd->jumpInstr; // do boost + } + return; + } + } + gBattlescriptCurrInstr = cmd->nextInstr; // exit if loop failed (failsafe) + } +} + +void BS_ActivateItemEffects(void) +{ + NATIVE_ARGS(); + if (ItemBattleEffects(ITEMEFFECT_NORMAL, gBattlerTarget)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryRoomService(void) +{ + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) + { + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TryTerrainSeed(void) +{ + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SEEDS) + { + enum ItemEffect effect = ITEM_NO_EFFECT; + u16 item = gBattleMons[battler].item; + switch (GetBattlerHoldEffectParam(battler)) + { + case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); + break; + case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); + break; + case HOLD_EFFECT_PARAM_MISTY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); + break; + case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); + break; + } + + if (effect != ITEM_NO_EFFECT) + return; + } + gBattlescriptCurrInstr = cmd->failInstr; +} + +void BS_MakeInvisible(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (gBattleControllerExecFlags) + return; + + BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfTeamHealthy(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + u32 battler = gBattlerAttacker; + if ((IsDoubleBattle()) && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + u8 partner = BATTLE_PARTNER(battler); + if ((gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) + && (gBattleMons[partner].hp == gBattleMons[partner].maxHP && !(gBattleMons[partner].status1 & STATUS1_ANY))) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } + else // single battle + { + if (gBattleMons[battler].hp == gBattleMons[battler].maxHP && !(gBattleMons[battler].status1 & STATUS1_ANY)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryHealQuarterHealth(void) +{ + NATIVE_ARGS(u8 battler, const u8 *failInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + + if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal +} + +void BS_JumpIfUnder200(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail. + if (GetBattlerWeight(gBattlerTarget) < 2000) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SetSkyDrop(void) +{ + NATIVE_ARGS(); + gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. + This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if + the target of a Sky Drop faints while in the air.*/ + gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; + gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; + + // End any multiturn effects caused by the target except VOLATILE_LOCK_CONFUSE + gBattleMons[gBattlerTarget].volatiles.multipleTurns = 0; + gBattleMons[gBattlerTarget].volatiles.uproarTurns = 0; + gBattleMons[gBattlerTarget].volatiles.bideTurns = 0; + gDisableStructs[gBattlerTarget].rolloutTimer = 0; + gDisableStructs[gBattlerTarget].furyCutterCounter = 0; + + // End any Follow Me/Rage Powder effects caused by the target + if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) + gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0; + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_ClearSkyDrop(void) +{ + NATIVE_ARGS(const u8 *failInstr); + // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop. + // If so, make the move fail. If not, clear all of the statuses and continue the move. + if (gBattleStruct->skyDropTargets[gBattlerAttacker] == SKY_DROP_NO_TARGET) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gBattleStruct->skyDropTargets[gBattlerAttacker] = SKY_DROP_NO_TARGET; + gBattleStruct->skyDropTargets[gBattlerTarget] = SKY_DROP_NO_TARGET; + gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattlescriptCurrInstr = cmd->nextInstr; + } + + // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. + if (gBattleMons[gBattlerTarget].volatiles.lockConfusionTurns) + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; +} + +void BS_SkyDropYawn(void) +{ + NATIVE_ARGS(); + if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED)) + { + // Set the target of Sky Drop as gEffectBattler + gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = SKY_DROP_NO_TARGET; + gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; + + // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation + if (gBattleMons[gEffectBattler].volatiles.lockConfusionTurns && CanBeConfused(gEffectBattler)) + { + gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; + gBattlerAttacker = gEffectBattler; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; + gBattlescriptCurrInstr = BattleScript_ThrashConfuses; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_JumpIfPranksterBlocked(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gBattlerTarget, TRUE)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryToClearPrimalWeather(void) +{ + NATIVE_ARGS(); + bool32 shouldNotClear = FALSE; + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 ability = GetBattlerAbility(i); + if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL) + || (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL) + || (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS)) + && IsBattlerAlive(i)) + shouldNotClear = TRUE; + } + if (gBattleWeather & B_WEATHER_SUN_PRIMAL && !shouldNotClear) + { + gBattleWeather &= ~B_WEATHER_SUN_PRIMAL; + PrepareStringBattle(STRINGID_EXTREMESUNLIGHTFADED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & B_WEATHER_RAIN_PRIMAL && !shouldNotClear) + { + gBattleWeather &= ~B_WEATHER_RAIN_PRIMAL; + PrepareStringBattle(STRINGID_HEAVYRAINLIFTED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + else if (gBattleWeather & B_WEATHER_STRONG_WINDS && !shouldNotClear) + { + gBattleWeather &= ~B_WEATHER_STRONG_WINDS; + PrepareStringBattle(STRINGID_STRONGWINDSDISSIPATED, gBattlerAttacker); + gBattleCommunication[MSG_DISPLAY] = 1; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryEndNeutralizingGas(void) +{ + NATIVE_ARGS(); + if (gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved) + { + gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = FALSE; + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_GetRototillerTargets(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u32 count = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + gSpecialStatuses[battler].rototillerAffected = FALSE; + if (IsRototillerAffected(battler)) + { + gSpecialStatuses[battler].rototillerAffected = TRUE; + count++; + } + } + + if (count == 0) + gBattlescriptCurrInstr = cmd->failInstr; // Rototiller fails + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfNotRototillerAffected(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (gSpecialStatuses[gBattlerTarget].rototillerAffected) + { + gSpecialStatuses[gBattlerTarget].rototillerAffected = FALSE; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->jumpInstr; // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET + } +} + +void BS_ConsumeBerry(void) +{ + NATIVE_ARGS(u8 battler, bool8 fromBattler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (gBattleScripting.overrideBerryRequirements == 2) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + + if (cmd->fromBattler) + gLastUsedItem = gBattleMons[battler].item; + + gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; + gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID + if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfWeatherAffected(void) +{ + NATIVE_ARGS(u16 flags, const u8 *jumpInstr); + u32 weather = cmd->flags; + if (IsBattlerWeatherAffected(gBattlerAttacker, weather)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfSpecies(void) +{ + NATIVE_ARGS(u16 species, const u8 *jumpInstr); + if (gBattleMons[gBattlerAttacker].species == cmd->species) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfLeafGuardProtected(void) +{ + NATIVE_ARGS(u8 battler, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (IsLeafGuardProtected(battler, GetBattlerAbility(battler))) + { + gBattlerAbility = battler; + gBattlescriptCurrInstr = cmd->jumpInstr; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_SetAttackerToStickyWebUser(void) +{ + NATIVE_ARGS(); + // For Mirror Armor: "If the Pokémon with this Ability is affected by Sticky Web, the effect is reflected back to the Pokémon which set it up. + // If Pokémon which set up Sticky Web is not on the field, no Pokémon have their Speed lowered." + gBattlerAttacker = gBattlerTarget; // Initialize 'fail' condition + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + if (gSideTimers[GetBattlerSide(gBattlerTarget)].stickyWebBattlerId != 0xFF) + gBattlerAttacker = gSideTimers[GetBattlerSide(gBattlerTarget)].stickyWebBattlerId; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_CutOneThirdHpAndRaiseStats(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + bool8 atLeastOneStatBoosted = FALSE; + u16 hpFraction = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); + + for (u32 stat = 1; stat < NUM_STATS; stat++) + { + if (CompareStat(gBattlerAttacker, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + atLeastOneStatBoosted = TRUE; + break; + } + } + if (atLeastOneStatBoosted && gBattleMons[gBattlerAttacker].hp > hpFraction) + { + gBattleStruct->moveDamage[gBattlerAttacker] = hpFraction; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_CheckPoltergeist(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM + || GetBattlerAbility(gBattlerTarget) == ABILITY_KLUTZ) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].item); + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_TryNoRetreat(void) +{ + NATIVE_ARGS(const u8 *failInstr); + if (gDisableStructs[gBattlerTarget].noRetreat) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) + gDisableStructs[gBattlerTarget].noRetreat = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} + +void BS_CureCertainStatuses(void) +{ + NATIVE_ARGS(); + // Check infatuation + if (gBattleMons[gBattlerTarget].volatiles.infatuation) + { + gBattleMons[gBattlerTarget].volatiles.infatuation = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + } + // Check taunt + if (gDisableStructs[gBattlerTarget].tauntTimer != 0) + { + gDisableStructs[gBattlerTarget].tauntTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + } + // Check encore + if (gDisableStructs[gBattlerTarget].encoreTimer != 0) + { + gDisableStructs[gBattlerTarget].encoredMove = 0; + gDisableStructs[gBattlerTarget].encoreTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED + } + // Check torment + if (gBattleMons[gBattlerTarget].volatiles.torment == TRUE) + { + gBattleMons[gBattlerTarget].volatiles.torment = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; + } + // Check heal block + if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + { + gStatuses3[gBattlerTarget] &= ~(STATUS3_HEAL_BLOCK); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; + } + // Check disable + if (gDisableStructs[gBattlerTarget].disableTimer != 0) + { + gDisableStructs[gBattlerTarget].disableTimer = 0; + gDisableStructs[gBattlerTarget].disabledMove = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; + } + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_TryResetNegativeStatStages(void) +{ + NATIVE_ARGS(); + for (u32 stat = 0; stat < NUM_BATTLE_STATS; stat++) + if (gBattleMons[gBattlerTarget].statStages[stat] < DEFAULT_STAT_STAGE) + gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_JumpIfLastUsedItemBerry(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + if (GetItemPocket(gLastUsedItem) == POCKET_BERRIES) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_SaveBattlerItem(void) +{ + NATIVE_ARGS(); + gBattleHistory->heldItems[gBattlerTarget] = gBattleMons[gBattlerTarget].item; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_RestoreBattlerItem(void) +{ + NATIVE_ARGS(); + gBattleMons[gBattlerTarget].item = gBattleHistory->heldItems[gBattlerTarget]; + gBattlescriptCurrInstr = cmd->nextInstr; +} + +void BS_BattlerItemToLastUsedItem(void) +{ + NATIVE_ARGS(); + gBattleMons[gBattlerTarget].item = gLastUsedItem; + gBattlescriptCurrInstr = cmd->nextInstr; +} From 731948a769745dc092a168c3f793ace0cec92df4 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 18 Jul 2025 20:43:02 +0100 Subject: [PATCH 153/248] preproc: Support __attribute__ in enums (#7344) --- tools/preproc/asm_file.cpp | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 66667935a1..60296fa943 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -517,8 +517,53 @@ bool AsmFile::ParseEnum() long fallbackPosition = m_pos; std::string headerFilename = ""; - long currentHeaderLine = SkipWhitespaceAndEol(); - std::string enumName = ReadIdentifier(); + long currentHeaderLine = 0; + std::string enumName; + while (true) + { + currentHeaderLine += SkipWhitespaceAndEol(); + std::string identifier = ReadIdentifier(); + if (identifier == "__attribute__") + { + if (m_pos + 1 >= m_size + || m_buffer[m_pos] != '(' + || m_buffer[m_pos + 1] != '(') + { + m_pos = fallbackPosition - 4; + return false; + } + + m_pos += 2; + int parens = 2; + while (true) + { + char c = m_buffer[m_pos++]; + if (c == '\n') + currentHeaderLine++; + + if (c == '(') + { + parens++; + } + else if (c == ')') + { + parens--; + if (parens == 0) + break; + } + else if (parens < 2 || m_pos == m_size) + { + m_pos = fallbackPosition - 4; + return false; + } + } + } + else + { + enumName = identifier; + break; + } + } currentHeaderLine += SkipWhitespaceAndEol(); std::string enumBase = "0"; long enumCounter = 0; From e502c078e83b3816ae92a4fca604740816751766 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 19 Jul 2025 04:22:24 -0400 Subject: [PATCH 154/248] Switch AI can see weather abilities of switchin candidates during damage calcs (#7373) --- include/battle_ai_util.h | 1 + src/battle_ai_util.c | 29 ++++++++++++++++++++++++++++- test/battle/ai/ai_switching.c | 19 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index d4a66f2028..473a8758a5 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -102,6 +102,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId); enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); u32 AI_GetWeather(void); +u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum DamageCalcContext calcContext); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ff81162d52..b480ac6118 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1638,6 +1638,33 @@ u32 AI_GetWeather(void) return gBattleWeather; } +u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) +{ + u32 ability = battleMon.ability; + // Forced weather behaviour + if (!AI_WeatherHasEffect()) + return B_WEATHER_NONE; + if (ability == ABILITY_CLOUD_NINE || ability == ABILITY_AIR_LOCK) + return B_WEATHER_NONE; + if (gBattleWeather & B_WEATHER_PRIMAL_ANY) + return gBattleWeather; + + // Switchin will introduce new weather + switch(ability) + { + case ABILITY_DRIZZLE: + return B_WEATHER_RAIN_NORMAL; + case ABILITY_DROUGHT: + return B_WEATHER_SUN_NORMAL; + case ABILITY_SAND_STREAM: + return B_WEATHER_SANDSTORM; + case ABILITY_SNOW_WARNING: + return B_SNOW_WARNING >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; + default: + return gBattleWeather; + } +} + enum WeatherState IsWeatherActive(u32 flags) { enum WeatherState state = WEATHER_INACTIVE; @@ -4057,7 +4084,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetSwitchinWeather(switchinCandidate)); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 0aae647030..2eb6834c6c 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1267,3 +1267,22 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI considers 0 hits to KO as los TURN { MOVE(player, MOVE_TACKLE); EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting ability when considering switchin candidates") +{ + u32 ability = ABILITY_NONE; + PARAMETRIZE { ability = ABILITY_WATER_ABSORB; } + PARAMETRIZE { ability = ABILITY_DRIZZLE; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(2); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Level(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_POLITOED) { Speed(5); Ability(ability); Moves(MOVE_BUBBLE_BEAM); } + OPPONENT(SPECIES_CONKELDURR) { Speed(1); Ability(ABILITY_GUTS); Moves(MOVE_SUPERPOWER); } + } WHEN { + if (ability == ABILITY_DRIZZLE) + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 1); } + else + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } + } +} From 2f6e1ea6d3c45366a31f1bc40a2de4c0f568a861 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 19 Jul 2025 10:28:25 +0200 Subject: [PATCH 155/248] Enum conversion for `enum MoveEffects` and `enum BattleMoveEffects` (#7366) --- Makefile | 2 +- include/battle_ai_util.h | 4 +- include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 2 +- include/move.h | 4 +- src/battle_ai_main.c | 253 ++++++++++++------------ src/battle_ai_util.c | 30 ++- src/battle_tv.c | 2 + 8 files changed, 161 insertions(+), 138 deletions(-) diff --git a/Makefile b/Makefile index dd1c0f2c92..759512ea63 100644 --- a/Makefile +++ b/Makefile @@ -124,7 +124,7 @@ ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull +override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull -Wenum-conversion ifneq ($(LTO),0) ifneq ($(TEST),1) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 473a8758a5..6450dfe907 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -189,8 +189,8 @@ bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); -bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect); -bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect); +bool32 IsSelfStatLoweringEffect(enum MoveEffects effect); +bool32 IsSelfStatRaisingEffect(enum MoveEffects effect); bool32 IsSwitchOutEffect(enum BattleMoveEffects effect); bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); diff --git a/include/constants/battle.h b/include/constants/battle.h index 28b39117ff..c659cdf7e8 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -389,7 +389,7 @@ enum BattleWeather #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -enum MoveEffects +enum __attribute__((packed)) MoveEffects { MOVE_EFFECT_NONE, MOVE_EFFECT_SLEEP, diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index bb37a33933..3e5559748f 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H #define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H -enum BattleMoveEffects +enum __attribute__((packed)) BattleMoveEffects { EFFECT_PLACEHOLDER, EFFECT_HIT, diff --git a/include/move.h b/include/move.h index 9e37b75ab2..fa89ec3cf3 100644 --- a/include/move.h +++ b/include/move.h @@ -30,7 +30,7 @@ enum SheerForceBoost struct AdditionalEffect { - u16 moveEffect; + enum MoveEffects moveEffect; u8 self:1; u8 onlyIfTargetRaisedStats:1; u8 onChargeTurnOnly:1; @@ -67,7 +67,7 @@ struct MoveInfo { const u8 *name; const u8 *description; - u16 effect; + enum BattleMoveEffects effect; u16 type:5; // Up to 32 enum DamageCategory category:2; u16 power:9; // up to 511 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5586934eea..1198768b73 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5164,6 +5164,8 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_EVS_PLUS_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_EVASION)); break; + default: + break; } } else @@ -5207,6 +5209,8 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; + default: + break; } } } @@ -5214,133 +5218,134 @@ case EFFECT_GUARD_SPLIT: { switch (additionalEffect->moveEffect) { - case MOVE_EFFECT_FLINCH: - score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); + case MOVE_EFFECT_FLINCH: + score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); + break; + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); + break; + case MOVE_EFFECT_ATK_MINUS_1: + case MOVE_EFFECT_DEF_MINUS_1: + case MOVE_EFFECT_SP_ATK_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_EVS_MINUS_1: + if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_ACC_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_POISON: + IncreasePoisonScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_CLEAR_SMOG: + score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); + break; + case MOVE_EFFECT_BUG_BITE: // And pluck + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_2: - ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); + else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_INCINERATE: + if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; - case MOVE_EFFECT_ATK_MINUS_1: - case MOVE_EFFECT_DEF_MINUS_1: - case MOVE_EFFECT_SP_ATK_MINUS_1: - case MOVE_EFFECT_SP_DEF_MINUS_1: - case MOVE_EFFECT_ACC_MINUS_1: - case MOVE_EFFECT_EVS_MINUS_1: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_ATK_MINUS_2: - case MOVE_EFFECT_DEF_MINUS_2: - case MOVE_EFFECT_SP_ATK_MINUS_2: - case MOVE_EFFECT_SP_DEF_MINUS_2: - case MOVE_EFFECT_ACC_MINUS_2: - case MOVE_EFFECT_EVS_MINUS_2: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_POISON: - IncreasePoisonScore(battlerAtk, battlerDef, move, &score); - break; - case MOVE_EFFECT_CLEAR_SMOG: - score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); - break; - case MOVE_EFFECT_BUG_BITE: // And pluck - if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_INCINERATE: - if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_STEAL_ITEM: + else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_STEAL_ITEM: + { + bool32 canSteal = FALSE; + + if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) + canSteal = TRUE; + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk)) + canSteal = TRUE; + + if (canSteal && aiData->items[battlerAtk] == ITEM_NONE + && aiData->items[battlerDef] != ITEM_NONE + && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) + && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) { - bool32 canSteal = FALSE; - - if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) - canSteal = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk)) - canSteal = TRUE; - - if (canSteal && aiData->items[battlerAtk] == ITEM_NONE - && aiData->items[battlerDef] != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) - && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) - && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) + switch (aiData->holdEffects[battlerDef]) { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_NONE: - break; - case HOLD_EFFECT_CHOICE_BAND: - case HOLD_EFFECT_CHOICE_SCARF: - case HOLD_EFFECT_CHOICE_SPECS: + case HOLD_EFFECT_NONE: + break; + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_TOXIC_ORB: + if (ShouldPoison(battlerAtk, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_TOXIC_ORB: - if (ShouldPoison(battlerAtk, battlerAtk)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_FLAME_ORB: - if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_IRON_BALL: - if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(WEAK_EFFECT); - break; - } + break; + case HOLD_EFFECT_FLAME_ORB: + if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_IRON_BALL: + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(WEAK_EFFECT); + break; } - break; } break; - case MOVE_EFFECT_STEALTH_ROCK: - case MOVE_EFFECT_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); - { - if (gDisableStructs[battlerAtk].isFirstTurn) - ADJUST_SCORE(BEST_EFFECT); - else - ADJUST_SCORE(DECENT_EFFECT); - } - break; - case MOVE_EFFECT_FEINT: - if (GetMoveEffect(predictedMove) == EFFECT_PROTECT) - ADJUST_SCORE(GOOD_EFFECT); - break; - case MOVE_EFFECT_THROAT_CHOP: - if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) - { - if (AI_IsFaster(battlerAtk, battlerDef, move)) - ADJUST_SCORE(GOOD_EFFECT); - else - ADJUST_SCORE(DECENT_EFFECT); - } - break; - case MOVE_EFFECT_WRAP: - if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) + } + break; + case MOVE_EFFECT_STEALTH_ROCK: + case MOVE_EFFECT_SPIKES: + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); + { + if (gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); - break; - case MOVE_EFFECT_SALT_CURE: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL)) + else ADJUST_SCORE(DECENT_EFFECT); - break; - + } + break; + case MOVE_EFFECT_FEINT: + if (GetMoveEffect(predictedMove) == EFFECT_PROTECT) + ADJUST_SCORE(GOOD_EFFECT); + break; + case MOVE_EFFECT_THROAT_CHOP: + if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) + { + if (AI_IsFaster(battlerAtk, battlerDef, move)) + ADJUST_SCORE(GOOD_EFFECT); + else + ADJUST_SCORE(DECENT_EFFECT); + } + break; + case MOVE_EFFECT_WRAP: + if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + break; + case MOVE_EFFECT_SALT_CURE: + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL)) + ADJUST_SCORE(DECENT_EFFECT); + break; + default: + break; } } } @@ -6092,12 +6097,14 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { switch (GetMoveAdditionalEffectById(move, i)->moveEffect) { - case MOVE_EFFECT_WRAP: - ADJUST_SCORE(AWFUL_EFFECT); - break; - case MOVE_EFFECT_FEINT: - ADJUST_SCORE(WORST_EFFECT); - break; + case MOVE_EFFECT_WRAP: + ADJUST_SCORE(AWFUL_EFFECT); + break; + case MOVE_EFFECT_FEINT: + ADJUST_SCORE(WORST_EFFECT); + break; + default: + break; } } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b480ac6118..5d0f34b4fd 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1021,6 +1021,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 return TRUE; } break; + default: + break; } } else // consider move effects that hinder the target @@ -1072,6 +1074,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 if (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; + default: + break; } } } @@ -1148,6 +1152,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s || (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)))) return TRUE; break; + default: + break; } } break; @@ -1740,6 +1746,8 @@ bool32 IsHazardMove(u32 move) { case MOVE_EFFECT_STEELSURGE: return TRUE; + default: + break; } } return FALSE; @@ -1768,6 +1776,8 @@ bool32 IsHazardClearingMove(u32 move) { case MOVE_EFFECT_DEFOG: return TRUE; + default: + break; } } @@ -2744,7 +2754,7 @@ bool32 IsStatLoweringEffect(enum BattleMoveEffects effect) } } -bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect) +bool32 IsSelfStatLoweringEffect(enum MoveEffects effect) { // Self stat lowering moves like Overheart, Superpower etc. switch (effect) @@ -2772,7 +2782,7 @@ bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect) } } -bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect) +bool32 IsSelfStatRaisingEffect(enum MoveEffects effect) { // Self stat lowering moves like Power Up Punch or Charge Beam switch (effect) @@ -2872,6 +2882,8 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) case MOVE_EFFECT_EFFECT_SPORE_SIDE: case MOVE_EFFECT_YAWN_FOE: return TRUE; + default: + break; } } return FALSE; @@ -4318,12 +4330,14 @@ bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiI switch (gMovesInfo[moves[i]].additionalEffects[i].moveEffect) { - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_2: - { - if(aiIsFaster) - return TRUE; - } + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + { + if(aiIsFaster) + return TRUE; + } + default: + break; } } } diff --git a/src/battle_tv.c b/src/battle_tv.c index 4215d3ead3..433390caa4 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -867,6 +867,8 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) baseFromEffect += 2; break; + default: + break; } } From 1b996fbb8e13e3ddcb688755277acef2f50a50a6 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 19 Jul 2025 19:20:07 -0400 Subject: [PATCH 156/248] AI refactor for weather-setting, terrain-setting, Trick Room behaviors; doubles-focused (#7319) --- include/battle_ai_field_statuses.h | 18 ++ include/battle_ai_util.h | 13 +- include/config/ai.h | 11 +- include/constants/battle.h | 3 + include/random.h | 2 + src/battle_ai_field_statuses.c | 454 +++++++++++++++++++++++++++++ src/battle_ai_main.c | 214 ++++++++------ src/battle_ai_util.c | 107 +------ test/battle/ai/ai_doubles.c | 66 ++++- 9 files changed, 686 insertions(+), 202 deletions(-) create mode 100644 include/battle_ai_field_statuses.h create mode 100644 src/battle_ai_field_statuses.c diff --git a/include/battle_ai_field_statuses.h b/include/battle_ai_field_statuses.h new file mode 100644 index 0000000000..64608f6370 --- /dev/null +++ b/include/battle_ai_field_statuses.h @@ -0,0 +1,18 @@ +#ifndef GUARD_BATTLE_AI_FIELD_STATUSES_H +#define GUARD_BATTLE_AI_FIELD_STATUSES_H + +#include "battle_ai_main.h" +#include "battle_ai_util.h" + +enum FieldEffectOutcome +{ + FIELD_EFFECT_POSITIVE, + FIELD_EFFECT_NEUTRAL, + FIELD_EFFECT_NEGATIVE, + FIELD_EFFECT_BLOCKED, +}; + +bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult); +bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome desiredResult); + +#endif //GUARD_BATTLE_AI_FIELD_STATUSES_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 6450dfe907..4dfea63dfe 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -2,6 +2,7 @@ #define GUARD_BATTLE_AI_UTIL_H #include "battle_ai_main.h" +#include "battle_ai_field_statuses.h" #define FOE(battler) ((BATTLE_OPPOSITE(battler)) & BIT_SIDE) @@ -159,9 +160,12 @@ bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); +bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); +bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect); +bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); @@ -175,11 +179,10 @@ bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); bool32 IsBattlerDamagedByStatus(u32 battler); s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove); -bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetRain(u32 battlerAtk, u32 ability, enum ItemHoldEffect holdEffect); -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect); +bool32 ShouldSetWeather(u32 battler, u32 weather); +bool32 ShouldClearWeather(u32 battler, u32 weather); +bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus); +bool32 ShouldClearFieldStatus(u32 battler, u32 fieldStatus); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 IsHealingMove(u32 move); bool32 HasHealingEffect(u32 battler); diff --git a/include/config/ai.h b/include/config/ai.h index ec359c646d..99283ee90a 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -89,10 +89,13 @@ // AI_FLAG_SMART_SWITCHING settings #define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise -// AI's acceptable number of hits to KO the partner via friendly fire in a double battle. -#define FRIENDLY_FIRE_RISKY_THRESHOLD 2 -#define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 -#define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 +// Configurations specifically for AI_FLAG_DOUBLE_BATTLE. +#define FRIENDLY_FIRE_RISKY_THRESHOLD 2 // AI_FLAG_RISKY acceptable number of hits to KO the partner via friendly fire +#define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 // typical acceptable number of hits to KO the partner via friendly fire +#define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 // AI_FLAG_CONSERVATIVE acceptable number of hits to KO the partner via friendly fire +// Counterplay on the assumption of opponents Protecting. +#define DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE 35 // both pokemon use Trick Room on turn Trick Room expires in the hopes both opponents used Protect to stall, getting a free refresh on the timer +#define TAILWIND_IN_TRICK_ROOM_CHANCE 35 // use Tailwind on turn Trick Room expires in the hopes both opponents used Protect to stall // AI's desired stat changes for Guard Split and Power Split, treated as % #define GUARD_SPLIT_ALLY_PERCENTAGE 200 diff --git a/include/constants/battle.h b/include/constants/battle.h index c659cdf7e8..1abace348a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -387,6 +387,9 @@ enum BattleWeather #define B_WEATHER_STRONG_WINDS (1 << BATTLE_WEATHER_STRONG_WINDS) #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) +#define B_WEATHER_DAMAGING_ANY (B_WEATHER_HAIL | B_WEATHER_SANDSTORM) +#define B_WEATHER_ICY_ANY (B_WEATHER_HAIL | B_WEATHER_SNOW) +#define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) enum __attribute__((packed)) MoveEffects diff --git a/include/random.h b/include/random.h index 65e48e1b86..f00ace1f8c 100644 --- a/include/random.h +++ b/include/random.h @@ -209,6 +209,8 @@ enum RandomTag RNG_AI_ASSUME_STATUS_MEDIUM_ODDS, RNG_AI_ASSUME_STATUS_LOW_ODDS, RNG_AI_ASSUME_ALL_STATUS, + RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, + RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, }; #define RandomWeighted(tag, ...) \ diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c new file mode 100644 index 0000000000..fc5ea0ccf6 --- /dev/null +++ b/src/battle_ai_field_statuses.c @@ -0,0 +1,454 @@ +#include "global.h" +#include "battle_z_move.h" +#include "malloc.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_ai_field_statuses.h" +#include "battle_ai_util.h" +#include "battle_ai_main.h" +#include "battle_ai_switch_items.h" +#include "battle_factory.h" +#include "battle_setup.h" +#include "event_data.h" +#include "data.h" +#include "item.h" +#include "move.h" +#include "pokemon.h" +#include "random.h" +#include "recorded_battle.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/battle_ai.h" +#include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" +#include "constants/moves.h" +#include "constants/items.h" + +static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather); +static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus); +// A move is light sensitive if it is boosted by Sunny Day and weakened by low light weathers. +static bool32 IsLightSensitiveMove(u32 move); +static bool32 HasLightSensitiveMove(u32 battler); +// The following functions all feed into WeatherChecker, which is then called by ShouldSetWeather and ShouldClearWeather. +// BenefitsFrom functions all return FIELD_EFFECT_POSITIVE if the weather or field effect is good to have in place from the perspective of the battler, FIELD_EFFECT_NEUTRAL if it is neither good nor bad, and FIELD_EFFECT_NEGATIVE if it is bad. +// The purpose of WeatherChecker and FieldStatusChecker is to cleanly homogenize the logic that's the same with all of them, and to more easily apply single battle logic to double battles. +// ShouldSetWeather and ShouldClearWeather are looking for a positive or negative result respectively, and check the entire side. +// If one pokemon has a positive result and the other has a negative result, it defaults to the opinion of the battler that may change the weather or field status. +static enum FieldEffectOutcome BenefitsFromSun(u32 battler); +static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler); +static enum FieldEffectOutcome BenefitsFromHailOrSnow(u32 battler, u32 weather); +static enum FieldEffectOutcome BenefitsFromRain(u32 battler); +// The following functions all feed into FieldStatusChecker, which is then called by ShouldSetFieldStatus and ShouldClearFieldStatus. +// They work approximately the same as the weather functions. +static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler); + +bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult) +{ + if (IsWeatherActive(B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) + return (FIELD_EFFECT_BLOCKED == desiredResult); + + enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; + enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; + + u32 i; + u32 battlersOnSide = 1; + + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + battlersOnSide = 2; + + for (i = 0; i < battlersOnSide; i++) + { + if (weather & B_WEATHER_RAIN) + result = BenefitsFromRain(battler); + else if (weather & B_WEATHER_SUN) + result = BenefitsFromSun(battler); + else if (weather & B_WEATHER_SANDSTORM) + result = BenefitsFromSandstorm(battler); + else if (weather & B_WEATHER_ICY_ANY) + result = BenefitsFromHailOrSnow(battler, weather); + + battler = BATTLE_PARTNER(battler); + + if (result != FIELD_EFFECT_NEUTRAL) + { + if (weather & B_WEATHER_DAMAGING_ANY && i == 0 && battlersOnSide == 2) + firstResult = result; + } + } + if (firstResult != FIELD_EFFECT_NEUTRAL) + return (firstResult == result) && (result == desiredResult); + return (result == desiredResult); +} + +bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome desiredResult) +{ + enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; + enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; + u32 i; + + u32 battlersOnSide = 1; + + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + battlersOnSide = 2; + + for (i = 0; i < battlersOnSide; i++) + { + // terrains + if (fieldStatus & STATUS_FIELD_ELECTRIC_TERRAIN) + result = BenefitsFromElectricTerrain(battler); + if (fieldStatus & STATUS_FIELD_GRASSY_TERRAIN) + result = BenefitsFromGrassyTerrain(battler); + if (fieldStatus & STATUS_FIELD_MISTY_TERRAIN) + result = BenefitsFromMistyTerrain(battler); + if (fieldStatus & STATUS_FIELD_PSYCHIC_TERRAIN) + result = BenefitsFromPsychicTerrain(battler); + + // other field statuses + if (fieldStatus & STATUS_FIELD_TRICK_ROOM) + result = BenefitsFromTrickRoom(battler); + + battler = BATTLE_PARTNER(battler); + + if (result != FIELD_EFFECT_NEUTRAL) + { + // Trick room wants both pokemon to agree, not just one + if (fieldStatus & STATUS_FIELD_TRICK_ROOM && i == 0 && battlersOnSide == 2) + firstResult = result; + } + } + if (firstResult != FIELD_EFFECT_NEUTRAL) + return (firstResult == result) && (result == desiredResult); + return (result == desiredResult); +} + +static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather) +{ + switch (ability) + { + case ABILITY_FORECAST: + return (weather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_ICY_ANY)); + case ABILITY_MAGIC_GUARD: + case ABILITY_OVERCOAT: + return (weather & B_WEATHER_DAMAGING_ANY); + case ABILITY_SAND_FORCE: + case ABILITY_SAND_RUSH: + case ABILITY_SAND_VEIL: + return (weather & B_WEATHER_SANDSTORM); + case ABILITY_ICE_BODY: + case ABILITY_ICE_FACE: + case ABILITY_SNOW_CLOAK: + return (weather & B_WEATHER_ICY_ANY); + case ABILITY_SLUSH_RUSH: + return (weather & B_WEATHER_SNOW); + case ABILITY_DRY_SKIN: + case ABILITY_HYDRATION: + case ABILITY_RAIN_DISH: + case ABILITY_SWIFT_SWIM: + return (weather & B_WEATHER_RAIN); + case ABILITY_CHLOROPHYLL: + case ABILITY_FLOWER_GIFT: + case ABILITY_HARVEST: + case ABILITY_LEAF_GUARD: + case ABILITY_ORICHALCUM_PULSE: + case ABILITY_PROTOSYNTHESIS: + case ABILITY_SOLAR_POWER: + return (weather & B_WEATHER_SUN); + default: + break; + } + return FALSE; +} + +static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus) +{ + switch (ability) + { + case ABILITY_MIMICRY: + return (fieldStatus & STATUS_FIELD_TERRAIN_ANY); + case ABILITY_HADRON_ENGINE: + case ABILITY_QUARK_DRIVE: + case ABILITY_SURGE_SURFER: + return (fieldStatus & STATUS_FIELD_ELECTRIC_TERRAIN); + case ABILITY_GRASS_PELT: + return (fieldStatus & STATUS_FIELD_GRASSY_TERRAIN); + // no abilities inherently benefit from Misty or Psychic Terrains + // return (fieldStatus & STATUS_FIELD_MISTY_TERRAIN); + // return (fieldStatus & STATUS_FIELD_PSYCHIC_TERRAIN); + default: + break; + } + return FALSE; +} + +static bool32 IsLightSensitiveMove(u32 move) +{ + switch (GetMoveEffect(move)) + { + case EFFECT_SOLAR_BEAM: + case EFFECT_MORNING_SUN: + case EFFECT_SYNTHESIS: + case EFFECT_MOONLIGHT: + case EFFECT_GROWTH: + return TRUE; + default: + return FALSE; + } +} + +static bool32 HasLightSensitiveMove(u32 battler) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsLightSensitiveMove(moves[i])) + return TRUE; + } + + return FALSE; +} + +// Sun +// Utility Umbrella does NOT block Ancient Pokemon from their stat boosts. +static enum FieldEffectOutcome BenefitsFromSun(u32 battler) +{ + u32 ability = gAiLogicData->abilities[battler]; + + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) + { + if (ability == ABILITY_ORICHALCUM_PULSE || ability == ABILITY_PROTOSYNTHESIS) + return FIELD_EFFECT_POSITIVE; + else + return FIELD_EFFECT_NEUTRAL; + } + + if (DoesAbilityBenefitFromWeather(ability, B_WEATHER_SUN) + || HasLightSensitiveMove(battler) + || HasDamagingMoveOfType(battler, TYPE_FIRE) + || HasBattlerSideMoveWithEffect(battler, EFFECT_HYDRO_STEAM)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithFlag(battler, MoveHas50AccuracyInSun) || HasDamagingMoveOfType(battler, TYPE_WATER) || gAiLogicData->abilities[battler] == ABILITY_DRY_SKIN) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +// Sandstorm +static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler) +{ + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_SANDSTORM) + || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK) + || HasBattlerSideMoveWithEffect(battler, EFFECT_SHORE_UP)) + return FIELD_EFFECT_POSITIVE; + + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + { + if (!(IS_BATTLER_ANY_TYPE(FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + || gAiLogicData->holdEffects[FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES + || DoesAbilityBenefitFromWeather(gAiLogicData->abilities[FOE(battler)], B_WEATHER_SANDSTORM)) + return FIELD_EFFECT_POSITIVE; + else + return FIELD_EFFECT_NEUTRAL; + } + + return FIELD_EFFECT_NEGATIVE; +} + +// Hail or Snow +static enum FieldEffectOutcome BenefitsFromHailOrSnow(u32 battler, u32 weather) +{ + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], weather) + || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) + || HasBattlerSideMoveWithEffect(battler, EFFECT_AURORA_VEIL)) + return FIELD_EFFECT_POSITIVE; + + if ((weather & B_WEATHER_DAMAGING_ANY) && gAiLogicData->holdEffects[battler] != HOLD_EFFECT_SAFETY_GOGGLES) + return FIELD_EFFECT_NEGATIVE; + + if (HasLightSensitiveMove(battler)) + return FIELD_EFFECT_NEGATIVE; + + if (HasMoveWithFlag(FOE(battler), MoveAlwaysHitsInHailSnow)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +// Rain +static enum FieldEffectOutcome BenefitsFromRain(u32 battler) +{ + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) + return FIELD_EFFECT_NEUTRAL; + + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_RAIN) + || HasMoveWithFlag(battler, MoveAlwaysHitsInRain) + || HasDamagingMoveOfType(battler, TYPE_WATER)) + return FIELD_EFFECT_POSITIVE; + + if (HasLightSensitiveMove(battler) || HasDamagingMoveOfType(battler, TYPE_FIRE)) + return FIELD_EFFECT_NEGATIVE; + + if (HasMoveWithFlag(FOE(battler), MoveAlwaysHitsInRain)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is electric terrain bad? +static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_ELECTRIC_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithEffect(battler, EFFECT_RISING_VOLTAGE)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithEffect(FOE(battler), EFFECT_REST) && IsBattlerGrounded(FOE(battler))) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = IsBattlerGrounded(battler); + if (grounded && HasBattlerSideUsedMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) + return FIELD_EFFECT_POSITIVE; + + if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) + || (gStatuses3[battler] & STATUS3_YAWN) + || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) + return FIELD_EFFECT_POSITIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is grassy terrain bad? +static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_GRASSY_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) + return FIELD_EFFECT_POSITIVE; + if (HasBattlerSideUsedMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = IsBattlerGrounded(battler); + + // Weaken spamming Earthquake, Magnitude, and Bulldoze. + if (grounded && (HasBattlerSideUsedMoveWithEffect(FOE(battler), EFFECT_EARTHQUAKE) + || HasBattlerSideUsedMoveWithEffect(FOE(battler), EFFECT_MAGNITUDE))) + return FIELD_EFFECT_POSITIVE; + + if (grounded && HasDamagingMoveOfType(battler, TYPE_GRASS)) + return FIELD_EFFECT_POSITIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is misty terrain bad? +static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_MISTY_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_MISTY_EXPLOSION)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = IsBattlerGrounded(battler); + bool32 allyGrounded = FALSE; + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); + + if (HasMoveWithEffect(FOE(battler), EFFECT_REST) && IsBattlerGrounded(FOE(battler))) + return FIELD_EFFECT_POSITIVE; + + // harass dragons + if ((grounded || allyGrounded) + && (HasDamagingMoveOfType(FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(BATTLE_PARTNER(FOE(battler)), TYPE_DRAGON))) + return FIELD_EFFECT_POSITIVE; + + if ((grounded || allyGrounded) && HasBattlerSideUsedMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) + return FIELD_EFFECT_POSITIVE; + + if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) + || (gStatuses3[battler] & STATUS3_YAWN))) + return FIELD_EFFECT_POSITIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +//TODO: when is Psychic Terrain negative? +static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) +{ + if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_PSYCHIC_TERRAIN)) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) + return FIELD_EFFECT_POSITIVE; + + bool32 grounded = IsBattlerGrounded(battler); + bool32 allyGrounded = FALSE; + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); + + // don't bother if we're not grounded + if (grounded || allyGrounded) + { + // harass priority + if (HasBattlerSideAbility(FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) + || HasBattlerSideAbility(FOE(battler), ABILITY_TRIAGE, gAiLogicData) + || HasBattlerSideAbility(FOE(battler), ABILITY_PRANKSTER, gAiLogicData)) + return FIELD_EFFECT_POSITIVE; + } + + if (grounded && (HasDamagingMoveOfType(battler, TYPE_PSYCHIC))) + return FIELD_EFFECT_POSITIVE; + + if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) + || HasBattlerSideAbility(battler, ABILITY_TRIAGE, gAiLogicData) + || HasBattlerSideAbility(battler, ABILITY_PRANKSTER, gAiLogicData)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; +} + +static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) +{ + // If we're in singles, we literally only care about speed. + if (!IsDoubleBattle()) + { + if (GetBattlerSideSpeedAverage(battler) < GetBattlerSideSpeedAverage(FOE(battler))) + return FIELD_EFFECT_POSITIVE; + // If we tie, we shouldn't change trick room state. + else if (GetBattlerSideSpeedAverage(battler) == GetBattlerSideSpeedAverage(FOE(battler))) + return FIELD_EFFECT_NEUTRAL; + else + return FIELD_EFFECT_NEGATIVE; + } + + // First checking if we have enough priority for one pokemon to disregard Trick Room entirely. + if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) + { + u16* aiMoves = GetMovesArray(battler); + for (int i = 0; i < MAX_MON_MOVES; i++) + { + u16 move = aiMoves[i]; + if (GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > 0 && !(GetMovePriority(move) > 0 && IsBattleMoveStatus(move))) + { + return FIELD_EFFECT_POSITIVE; + } + } + } + + // If we are faster or tie, we don't want trick room. + if ((gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[FOE(battler)]) || (gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[BATTLE_PARTNER(FOE(battler))])) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_POSITIVE; +} + + diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1198768b73..f9f5cc46a9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1698,7 +1698,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_AURORA_VEIL: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_AURORA_VEIL || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) - || !(weather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + || !(weather & (B_WEATHER_ICY_ANY))) ADJUST_SCORE(-10); break; case EFFECT_SHEER_COLD: @@ -1912,18 +1912,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; case EFFECT_HAIL: - if (weather & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) - ADJUST_SCORE(-8); - else if (weather & B_WEATHER_SNOW) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow - break; case EFFECT_SNOWSCAPE: - if (weather & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) + if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) || IsMoveEffectWeather(aiData->partnerMove)) ADJUST_SCORE(-8); - else if (weather & B_WEATHER_HAIL) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow break; case EFFECT_ATTRACT: if (!AI_CanBeInfatuated(battlerAtk, battlerDef, aiData->abilities[battlerDef])) @@ -1957,10 +1949,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CHILLY_RECEPTION: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (weather & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) || IsMoveEffectWeather(aiData->partnerMove)) + else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) || IsMoveEffectWeather(aiData->partnerMove)) ADJUST_SCORE(-8); - else if (weather & B_WEATHER_HAIL) - ADJUST_SCORE(-2); // mainly to prevent looping between hail and snow break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: @@ -2143,12 +2133,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MORNING_SUN: case EFFECT_SYNTHESIS: case EFFECT_MOONLIGHT: - if ((AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_FOG))) - ADJUST_SCORE(-3); - else if (AI_BattlerAtMaxHp(battlerAtk)) + if (AI_BattlerAtMaxHp(battlerAtk)) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] >= 90) ADJUST_SCORE(-9); //No point in healing, but should at least do it if nothing better + else if ((AI_GetWeather() & (B_WEATHER_LOW_LIGHT))) + ADJUST_SCORE(-3); break; case EFFECT_PURIFY: if (!(gBattleMons[battlerDef].status1 & STATUS1_ANY)) @@ -2535,6 +2525,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) ADJUST_SCORE(-10); break; + case EFFECT_STEEL_ROLLER: + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(-10); + break; case EFFECT_PLEDGE: if (isDoubleBattle && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) { @@ -2551,20 +2545,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_TRICK_ROOM: if (PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TRICK_ROOM)) { - ADJUST_SCORE(-10); + // This only happens if the ally already rolled on double trick room on final turn. + // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. + if (gFieldTimers.trickRoomTimer == gBattleTurnCounter) + ADJUST_SCORE(PERFECT_EFFECT); + else + ADJUST_SCORE(-10); } else if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) // Trick Room Up - { - if (GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) // Attacker side slower than target side - ADJUST_SCORE(-10); // Keep the Trick Room up - } - else - { - if (GetBattlerSideSpeedAverage(battlerAtk) >= GetBattlerSideSpeedAverage(battlerDef)) // Attacker side faster than target side - ADJUST_SCORE(-10); // Keep the Trick Room down - } + // Don't set a trick room you don't benefit from. + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(-10); + // Don't unset a trick room that doesn't harm you unless it's about to expire. + else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && gFieldTimers.trickRoomTimer != gBattleTurnCounter && !ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) + ADJUST_SCORE(-10); } break; case EFFECT_MAGIC_ROOM: @@ -2759,7 +2754,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_TAILWIND: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND) - || gFieldStatuses & STATUS_FIELD_TRICK_ROOM) + || (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != gBattleTurnCounter)) ADJUST_SCORE(-10); break; case EFFECT_LUCKY_CHANT: @@ -2900,7 +2895,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) && moveEffect != EFFECT_DESTINY_BOND && moveEffect != EFFECT_WISH && moveEffect != EFFECT_HEALING_WISH - && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_HAIL)))) + && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & B_WEATHER_ICY_ANY))) ADJUST_SCORE(-30); // Don't use a status move if the mon is the last one in the party, has no good switchin, or is trapped else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS @@ -3000,11 +2995,11 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: - if (effect == EFFECT_TRICK_ROOM) + if (effect == EFFECT_TRICK_ROOM && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TRICK_ROOM: - if (effect == EFFECT_AFTER_YOU) + if (effect == EFFECT_AFTER_YOU && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); break; default: @@ -3039,7 +3034,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MAGNET_RISE: if (IsBattlerGrounded(battlerAtk) - && (HasMove(battlerAtkPartner, MOVE_EARTHQUAKE) || HasMove(battlerAtkPartner, MOVE_MAGNITUDE)) + && (HasMoveWithEffect(battlerAtkPartner, EFFECT_EARTHQUAKE) || HasMoveWithEffect(battlerAtkPartner, EFFECT_MAGNITUDE)) && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != UQ_4_12(0.0))) // Doesn't resist ground move { RETURN_SCORE_PLUS(DECENT_EFFECT); // partner has earthquake or magnitude -> good idea to use magnet rise @@ -3063,38 +3058,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // consider global move effects switch (effect) { - case EFFECT_SANDSTORM: - if (ShouldSetSandstorm(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from sandstorm - } + // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. + // This unsets Trick Room and resets it with a full timer. + case EFFECT_TRICK_ROOM: + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM) + && HasMoveWithEffect(battlerAtkPartner, MOVE_TRICK_ROOM) + && RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE)) + ADJUST_SCORE(PERFECT_EFFECT); break; - case EFFECT_RAIN_DANCE: - if (ShouldSetRain(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from rain - } - break; - case EFFECT_SUNNY_DAY: - if (ShouldSetSun(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(WEAK_EFFECT); // our partner benefits from sun - } - break; - case EFFECT_HAIL: - if (IsBattlerAlive(battlerAtkPartner) - && ShouldSetHail(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); // our partner benefits from hail - } - break; - case EFFECT_SNOWSCAPE: - case EFFECT_CHILLY_RECEPTION: - if (IsBattlerAlive(battlerAtkPartner) - && ShouldSetSnow(battlerAtkPartner, atkPartnerAbility, atkPartnerHoldEffect)) - { - RETURN_SCORE_PLUS(DECENT_EFFECT); // our partner benefits from snow - } + case EFFECT_TAILWIND: + // Anticipate both opponents protecting to stall out Trick Room, and apply Tailwind. + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + && RandomPercentage(RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, TAILWIND_IN_TRICK_ROOM_CHANCE)) + ADJUST_SCORE(BEST_EFFECT); break; default: break; @@ -4355,9 +4332,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SANDSTORM: - if (ShouldSetSandstorm(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4367,12 +4347,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_HAIL: - if (ShouldSetHail(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) { + ADJUST_SCORE(DECENT_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); - - ADJUST_SCORE(DECENT_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4382,12 +4364,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_SNOWSCAPE: - if (ShouldSetSnow(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SNOW)) { + ADJUST_SCORE(DECENT_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); - - ADJUST_SCORE(DECENT_EFFECT); + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) @@ -4397,27 +4381,33 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_RAIN_DANCE: - if (ShouldSetRain(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) - || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithType(battlerDef, TYPE_FIRE) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) + if (HasDamagingMoveOfType(battlerDef, TYPE_FIRE) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_SUNNY_DAY: - if (ShouldSetSun(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) + if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) { ADJUST_SCORE(DECENT_EFFECT); + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_HEAT_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) + if (HasDamagingMoveOfType(battlerDef, TYPE_WATER) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) ADJUST_SCORE(WEAK_EFFECT); @@ -4883,14 +4873,58 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(WORST_EFFECT); } case EFFECT_ELECTRIC_TERRAIN: - case EFFECT_MISTY_TERRAIN: - if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) - ADJUST_SCORE(BEST_EFFECT); - case EFFECT_GRASSY_TERRAIN: - case EFFECT_PSYCHIC_TERRAIN: - ADJUST_SCORE(GOOD_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER) + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) + { ADJUST_SCORE(GOOD_EFFECT); + if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) + ADJUST_SCORE(BEST_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + case EFFECT_MISTY_TERRAIN: + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) + ADJUST_SCORE(BEST_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + case EFFECT_GRASSY_TERRAIN: + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + case EFFECT_PSYCHIC_TERRAIN: + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + { + ADJUST_SCORE(GOOD_EFFECT); + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) + ADJUST_SCORE(WEAK_EFFECT); + } + break; + case EFFECT_STEEL_ROLLER: + { + u32 terrain = gFieldStatuses & STATUS_FIELD_TERRAIN_ANY; + if (ShouldClearFieldStatus(battlerAtk, terrain)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldSetFieldStatus(battlerDef, terrain)) + ADJUST_SCORE(DECENT_EFFECT); + } + break; + case EFFECT_ICE_SPINNER: + { + u32 terrain = gFieldStatuses & STATUS_FIELD_TERRAIN_ANY; + if (ShouldClearFieldStatus(battlerAtk, terrain)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldSetFieldStatus(battlerDef, terrain)) + ADJUST_SCORE(DECENT_EFFECT); + } break; case EFFECT_PLEDGE: if (isDoubleBattle && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) @@ -4899,9 +4933,10 @@ case EFFECT_GUARD_SPLIT: case EFFECT_TRICK_ROOM: if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { - if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); - else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) >= GetBattlerSideSpeedAverage(battlerDef)) + // Don't unset it on last turn. + else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != gBattleTurnCounter && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -5929,11 +5964,8 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_HAIL: - if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; case EFFECT_SNOWSCAPE: - if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + if (IsWeatherActive(B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; default: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5d0f34b4fd..ce13267ed6 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3,6 +3,7 @@ #include "malloc.h" #include "battle.h" #include "battle_anim.h" +#include "battle_ai_field_statuses.h" #include "battle_ai_util.h" #include "battle_ai_main.h" #include "battle_ai_switch_items.h" @@ -1887,7 +1888,7 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) if ((weather & B_WEATHER_RAIN) && MoveAlwaysHitsInRain(move)) return TRUE; - if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) + if ((weather & B_WEATHER_ICY_ANY) && MoveAlwaysHitsInHailSnow(move)) return TRUE; if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && MoveIncreasesPowerToMinimizedTargets(move)) return TRUE; @@ -1929,110 +1930,24 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil return FALSE; } -bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 ShouldSetWeather(u32 battler, u32 weather) { - if (IsWeatherActive(B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; - - if (ability == ABILITY_SAND_VEIL - || ability == ABILITY_SAND_RUSH - || ability == ABILITY_SAND_FORCE - || ability == ABILITY_OVERCOAT - || ability == ABILITY_MAGIC_GUARD - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - || HasMoveWithEffect(battler, EFFECT_SHORE_UP) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; + return WeatherChecker(battler, weather, FIELD_EFFECT_POSITIVE); } -bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 ShouldClearWeather(u32 battler, u32 weather) { - if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; - - if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || ability == ABILITY_MAGIC_GUARD - || ability == ABILITY_OVERCOAT - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; + return WeatherChecker(battler, weather, FIELD_EFFECT_NEGATIVE); } -bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) +bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus) { - if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; - - if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA - && (atkAbility == ABILITY_SWIFT_SWIM - || atkAbility == ABILITY_FORECAST - || atkAbility == ABILITY_HYDRATION - || atkAbility == ABILITY_RAIN_DISH - || atkAbility == ABILITY_DRY_SKIN - || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) - || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveWithType(battlerAtk, TYPE_WATER))) - { - return TRUE; - } - return FALSE; + return FieldStatusChecker(battler, fieldStatus, FIELD_EFFECT_POSITIVE); } -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) +bool32 ShouldClearFieldStatus(u32 battler, u32 fieldStatus) { - if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; - - if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA - && (atkAbility == ABILITY_CHLOROPHYLL - || atkAbility == ABILITY_FLOWER_GIFT - || atkAbility == ABILITY_FORECAST - || atkAbility == ABILITY_LEAF_GUARD - || atkAbility == ABILITY_SOLAR_POWER - || atkAbility == ABILITY_HARVEST - || HasMoveWithEffect(battlerAtk, EFFECT_SOLAR_BEAM) - || HasMoveWithEffect(battlerAtk, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerAtk, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerAtk, EFFECT_MOONLIGHT) - || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveWithEffect(battlerAtk, EFFECT_GROWTH) - || HasMoveWithType(battlerAtk, TYPE_FIRE))) - { - return TRUE; - } - return FALSE; -} - -bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) -{ - if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) - return FALSE; - - if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) - { - return TRUE; - } - return FALSE; + return FieldStatusChecker(battler, fieldStatus, FIELD_EFFECT_NEGATIVE); } bool32 IsBattlerDamagedByStatus(u32 battler) @@ -3816,7 +3731,7 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo { case EFFECT_AURORA_VEIL: // Use only in Hail and only if AI doesn't already have Reflect, Light Screen or Aurora Veil itself active. - if ((AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_SNOW)) + if ((AI_GetWeather() & (B_WEATHER_ICY_ANY)) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 33c3eca074..e4ab8610ab 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -431,7 +431,7 @@ AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons tha // Sandstorm is omitted on purpose. // Tornadus is currently not willing to set up Sandstorm for its ally, but the actual purpose of this test is to demonstrate that Tornadus or Whimsicott will perform standard VGC openers. // Rain Dance, Sunny Day, and Snowscape are the actually important ones; setting up a good Sandstorm test + functionality is less important and will be done in later PRs. -AI_DOUBLE_BATTLE_TEST("AI will set up weather for its ally") +AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally") { u32 goodWeather, badWeather, weatherTrigger; u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; @@ -440,7 +440,7 @@ AI_DOUBLE_BATTLE_TEST("AI will set up weather for its ally") PARAMETRIZE { goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } -// PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; @@ -449,20 +449,49 @@ AI_DOUBLE_BATTLE_TEST("AI will set up weather for its ally") goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } -// PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; -// goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } GIVEN { AI_FLAGS(aiFlags); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_TORNADUS) { Ability(ABILITY_PRANKSTER); Moves(goodWeather, badWeather, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(SPECIES_TORNADUS) { Item(ITEM_SAFETY_GOGGLES); Ability(ABILITY_PRANKSTER); Moves(goodWeather, badWeather, MOVE_RETURN, MOVE_TAUNT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherTrigger, MOVE_EARTH_POWER); } } WHEN { TURN { EXPECT_MOVE(opponentLeft, goodWeather); } } } +AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally") +{ + u32 goodTerrain, badTerrain, terrainTrigger; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; } + PARAMETRIZE { goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } + PARAMETRIZE { goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } + PARAMETRIZE { goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(goodTerrain, badTerrain, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(terrainTrigger, MOVE_EARTH_POWER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, goodTerrain); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") { u32 move; @@ -476,7 +505,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(4); } - OPPONENT(SPECIES_INDEEDEE_M) { Speed(5); Moves(MOVE_AFTER_YOU, MOVE_PSYCHIC); } + OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_TRIAGE); Speed(5); Moves(MOVE_AFTER_YOU, MOVE_DRAINING_KISS); } OPPONENT(SPECIES_CLEFAIRY) { Speed(3); Moves(move, MOVE_PSYCHIC); } } WHEN { if (move == MOVE_TRICK_ROOM) @@ -486,7 +515,32 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") } } +AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") +{ + u32 move, ability, speed; + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_SYNCHRONIZE; speed = 4; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; ability = ABILITY_SYNCHRONIZE; speed = 4; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_PSYCHIC_SURGE; speed = 4; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_SYNCHRONIZE; speed = 2; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; ability = ABILITY_SYNCHRONIZE; speed = 2; } + PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_PSYCHIC_SURGE; speed = 2; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(speed); } + OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_TRIAGE); Speed(5); Moves(move); } + OPPONENT(SPECIES_INDEEDEE) { Ability(ability); Speed(3); Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); } + } WHEN { + if (move == MOVE_DRAINING_KISS && ability != ABILITY_PSYCHIC_SURGE && speed > 3) + TURN { EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + } +} AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") { From cb66393df7835f7638cdb9d7c0cff7d8339bca76 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 20 Jul 2025 05:34:51 -0400 Subject: [PATCH 157/248] Add missing break (#7356) --- src/battle_ai_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 813ea65d2b..a73de7f94e 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3890,6 +3890,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(WEAK_EFFECT); } + break; case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: From a92f432dafacfd5b309cd0f992a3ff8d85506eab Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 20 Jul 2025 06:53:14 -0400 Subject: [PATCH 158/248] Improve AI type matchup calcs (#7364) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_ai_switch_items.c | 60 ++++++++++++++++------------------- test/battle/ai/ai_switching.c | 13 ++++++++ 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 06c41c6d77..84cba174b2 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -31,6 +31,7 @@ static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon); static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent); static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); +static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon); static void InitializeSwitchinCandidate(struct Pokemon *mon) { @@ -176,11 +177,11 @@ static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization - u8 opposingPosition, atkType1, atkType2, defType1, defType2; + u8 opposingPosition; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; - u16 typeEffectiveness = UQ_4_12(1.0); //baseline typing damage + u32 typeMatchup; enum BattleMoveEffects aiMoveEffect; u32 hitsToKoPlayer = 0, hitsToKoAI = 0; @@ -196,12 +197,6 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) opposingBattler = GetBattlerAtPosition(opposingPosition); u16 *playerMoves = GetMovesArray(opposingBattler); - // Gets types of player (opposingBattler) and computer (battler) - atkType1 = gBattleMons[opposingBattler].types[0]; - atkType2 = gBattleMons[opposingBattler].types[1]; - defType1 = gBattleMons[battler].types[0]; - defType2 = gBattleMons[battler].types[1]; - for (i = 0; i < MAX_MON_MOVES; i++) { aiMove = gBattleMons[battler].moves[i]; @@ -245,15 +240,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(maxDamageDealt, opposingBattler); // Calculate type advantage - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); - if (defType2 != defType1) - { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); - } + typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gBattleMons[battler]); // Get max damage mon could take for (i = 0; i < MAX_MON_MOVES; i++) @@ -303,7 +290,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // General bad type matchups have more wiggle room - if (typeEffectiveness >= UQ_4_12(2.0)) // If the player has at least a 2x type advantage + if (typeMatchup > UQ_4_12(2.0)) // If the player has favourable offensive matchup (2.0 is neutral, this must be worse) { if (!hasSuperEffectiveMove // If the AI doesn't have a super effective move && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator @@ -1902,25 +1889,34 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) return hitsToKO; } -static u16 GetSwitchinTypeMatchup(u32 opposingBattler, struct BattlePokemon battleMon) +static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon) { - // Check type matchup - u16 typeEffectiveness = UQ_4_12(1.0); - u8 atkType1 = GetSpeciesType(gBattleMons[opposingBattler].species, 0), atkType2 = GetSpeciesType(gBattleMons[opposingBattler].species, 1), + u32 typeEffectiveness1 = UQ_4_12(1.0), typeEffectiveness2 = UQ_4_12(1.0); + u8 atkType1 = opposingBattleMon.types[0], atkType2 = opposingBattleMon.types[1], defType1 = battleMon.types[0], defType2 = battleMon.types[1]; - // Multiply type effectiveness by a factor depending on type matchup - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); + // Add each independent defensive type matchup together + typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType1))); if (defType2 != defType1) + typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType2))); + if (typeEffectiveness1 == 0) // Immunity + typeEffectiveness1 = UQ_4_12(0.1); + + if (atkType2 != atkType1) { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); + typeEffectiveness2 = uq4_12_multiply(typeEffectiveness2, (GetTypeModifier(atkType2, defType1))); + if (defType2 != defType1) + typeEffectiveness2 = uq4_12_multiply(typeEffectiveness2, (GetTypeModifier(atkType2, defType2))); + if (typeEffectiveness2 == 0) // Immunity + typeEffectiveness2 = UQ_4_12(0.1); } - return typeEffectiveness; + else + { + typeEffectiveness2 = typeEffectiveness1; + } + + return typeEffectiveness1 + typeEffectiveness2; } static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, int lastId, int currentMonId) @@ -2049,7 +2045,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; u32 aiMove, hitsToKOAI, maxHitsToKO = 0; - u16 bestResist = UQ_4_12(1.0), bestResistEffective = UQ_4_12(1.0), typeMatchup; + u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; // Iterate through mons @@ -2082,7 +2078,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // Get max number of hits for player to KO AI mon and type matchup for defensive switching hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon), battler); - typeMatchup = GetSwitchinTypeMatchup(opposingBattler, gAiLogicData->switchinCandidate.battleMon); + typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 2eb6834c6c..4d1fa5d746 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1286,3 +1286,16 @@ AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting abi TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_CERULEDGE) { Moves(MOVE_SPARK); } + OPPONENT(SPECIES_WHIMSICOTT) { Moves(MOVE_MEGA_DRAIN); } + } WHEN { + TURN { MOVE(player, MOVE_KARATE_CHOP); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } + } +} From 14a7fc58adc2b0e760704367bbbfaebce97a7052 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:00:55 +0100 Subject: [PATCH 159/248] Multibattle Partner AI Flags and 2vs1 battler3 AI Flags fix (#7378) --- include/data.h | 14 ++++++++++++-- src/battle_ai_main.c | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/data.h b/include/data.h index ffa1a4cba0..4663bae33c 100644 --- a/include/data.h +++ b/include/data.h @@ -198,9 +198,16 @@ extern const struct FollowerMsgInfo gFollowerCuriousMessages[]; extern const struct FollowerMsgInfo gFollowerMusicMessages[]; extern const struct FollowerMsgInfo gFollowerPoisonedMessages[]; +static inline bool8 IsPartnerTrainerId(u16 trainerId) +{ + if (trainerId >= TRAINER_PARTNER(PARTNER_NONE) && trainerId < TRAINER_PARTNER(PARTNER_COUNT)) + return TRUE; + return FALSE; +} + static inline u16 SanitizeTrainerId(u16 trainerId) { - if (trainerId >= TRAINERS_COUNT) + if (trainerId >= TRAINERS_COUNT && !IsPartnerTrainerId(trainerId)) return TRAINER_NONE; return trainerId; } @@ -212,7 +219,10 @@ static inline const struct Trainer *GetTrainerStructFromId(u16 trainerId) sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - return &gTrainers[difficulty][sanitizedTrainerId]; + if (IsPartnerTrainerId(trainerId)) + return &gBattlePartners[difficulty][sanitizedTrainerId - TRAINER_PARTNER(PARTNER_NONE)]; + else + return &gTrainers[difficulty][sanitizedTrainerId]; } static inline const enum TrainerClassID GetTrainerClassFromId(u16 trainerId) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a73de7f94e..b6ddd0dc91 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -251,7 +251,7 @@ void BattleAI_SetupFlags(void) else { gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); - if (TRAINER_BATTLE_PARAM.opponentB != 0) + if (TRAINER_BATTLE_PARAM.opponentB != 0 && TRAINER_BATTLE_PARAM.opponentB != 0xFFFF) gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); else gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; @@ -259,7 +259,7 @@ void BattleAI_SetupFlags(void) if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId); } else if (IsDoubleBattle() && IsAiVsAiBattle()) { From 8e8813e5933692bd309dbdbdf0e6a84ead54eb15 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 22 Jul 2025 18:58:15 +0200 Subject: [PATCH 160/248] Show chosen move in the battle debug menu (#7382) --- src/battle_debug.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index e746ee619d..6b8998de8f 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -813,11 +813,16 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) if (gAiLogicData->shouldSwitch & (1u << data->aiBattlerId)) { u32 switchMon = GetMonData(&gEnemyParty[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Switching to "), 74, 64, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); } - + else + { + u32 chosenMoveIndex = gAiBattleData->chosenMoveIndex[data->aiBattlerId]; + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Chosen move: "), 74, 64, 0, NULL); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, GetMoveName(gBattleMons[data->aiBattlerId].moves[chosenMoveIndex]), 74 + 68, 64, 0, NULL); + } + CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL); Free(text); } From c544fee140d5e9c4b3543df7d895e3e7e0d67462 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Tue, 22 Jul 2025 14:13:10 -0400 Subject: [PATCH 161/248] Improve AI's Sucker Punch handling (#7389) --- include/config/ai.h | 2 ++ include/random.h | 1 + src/battle_ai_main.c | 9 ++++----- test/battle/ai/ai.c | 13 +++++++++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index 99283ee90a..f5d0496c20 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -58,6 +58,8 @@ #define BOOST_INTO_HAZE_CHANCE 0 // Chance the AI will use a stat boosting move if the player has used Haze #define SHOULD_RECOVER_CHANCE 50 // Chance the AI will give recovery moves score increase if less than ENABLE_RECOVERY_THRESHOLD and in no immediate danger #define ENABLE_RECOVERY_THRESHOLD 60 // HP percentage beneath which SHOULD_RECOVER_CHANCE is active +#define SUCKER_PUNCH_CHANCE 50 // Chance for the AI to not use Sucker Punch if the player has a status move +#define SUCKER_PUNCH_PREDICTION_CHANCE 50 // Additional chance for the AI to not use Sucker Punch if actively predicting a status move if SUCKER_PUNCH_CHANCE fails // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit diff --git a/include/random.h b/include/random.h index f00ace1f8c..89ccb9779a 100644 --- a/include/random.h +++ b/include/random.h @@ -193,6 +193,7 @@ enum RandomTag RNG_AI_CONSERVE_TERA, RNG_AI_SWITCH_ALL_SCORES_BAD, RNG_AI_PP_STALL_DISREGARD_MOVE, + RNG_AI_SUCKER_PUNCH, RNG_SHELL_SIDE_ARM, RNG_RANDOM_TARGET, RNG_AI_PREDICT_ABILITY, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index b6ddd0dc91..0f9bf432c9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2745,11 +2745,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SUCKER_PUNCH: - if (predictedMove != MOVE_NONE) - { - if (IsBattleMoveStatus(predictedMove) || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first - ADJUST_SCORE(-10); - } + if ((HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_STATUS) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_CHANCE)) // Player has a status move + || (IsBattleMoveStatus(predictedMove) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_PREDICTION_CHANCE) && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE)) // AI actively predicting incoming status move + || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first + ADJUST_SCORE(-10); break; case EFFECT_TAILWIND: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 4eb99e481e..25999df746 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -675,6 +675,19 @@ AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a move of the sam } } +AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a status move a percentage of the time") +{ + PASSES_RANDOMLY(SUCKER_PUNCH_CHANCE, 100, RNG_AI_SUCKER_PUNCH); + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUCKER_PUNCH) == EFFECT_SUCKER_PUNCH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_GROWL, MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SUCKER_PUNCH); } + } +} + AI_SINGLE_BATTLE_TEST("AI won't use thawing moves if target is frozen unless it is super effective or it has no other options") { u32 aiFlags = 0; u32 status = 0; u32 aiMove = 0; From e222b725d26236207231a6d1b1278d5fb939b110 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 25 Jul 2025 15:32:20 +0200 Subject: [PATCH 162/248] Remove leftover code (#7397) --- src/battle_util.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a7e375b9b2..8e2627c262 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6037,29 +6037,6 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item return ITEM_NO_EFFECT; } -static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) -{ - if (gProtectStructs[battler].tryEjectPack - && !gProtectStructs[battler].disableEjectPack - && CountUsablePartyMons(battler) > 0 - && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) // Does not activate if attacker used Parting Shot and can switch out - { - gProtectStructs[battler].tryEjectPack = FALSE; - gBattleScripting.battler = battler; - gAiLogicData->ejectPackSwitch = TRUE; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) - { - BattleScriptExecute(BattleScript_EjectPackActivate_End2); - } - else - { - BattleScriptCall(BattleScript_EjectPackActivate_Ret); - } - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} - static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) { if (CanBeInfinitelyConfused(battler)) @@ -6723,9 +6700,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; } break; - case HOLD_EFFECT_EJECT_PACK: - effect = TryEjectPack(battler, caseID); - break; case HOLD_EFFECT_BERSERK_GENE: effect = ConsumeBerserkGene(battler, caseID); break; From e7cf1621805540d8b87a21948f11c39e0bbe77e3 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:18:30 +0200 Subject: [PATCH 163/248] Fixes various Choice lock issues (#7383) --- include/battle_util.h | 1 + include/constants/battle_script_commands.h | 1 - include/constants/hold_effects.h | 2 -- include/item.h | 3 +++ src/battle_ai_main.c | 6 ++--- src/battle_ai_switch_items.c | 6 ++--- src/battle_script_commands.c | 31 ---------------------- src/battle_util.c | 28 +++++++++++++++++-- src/item.c | 9 ++++++- 9 files changed, 44 insertions(+), 43 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index aac39b3641..b9566e2512 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -123,6 +123,7 @@ enum MoveSuccessOrder CANCELLER_BIDE, CANCELLER_THAW, CANCELLER_STANCE_CHANGE_2, + CANCELLER_CHOICE_LOCK, CANCELLER_WEATHER_PRIMAL, CANCELLER_DYNAMAX_BLOCKED, CANCELLER_POWDER_STATUS, diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4e4902f4b2..78c2200018 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -137,7 +137,6 @@ enum MoveEndEffects MOVEEND_ABILITIES_ATTACKER, MOVEEND_STATUS_IMMUNITY_ABILITIES, MOVEEND_SYNCHRONIZE_ATTACKER, - MOVEEND_CHOICE_MOVE, MOVEEND_ATTACKER_INVISIBLE, MOVEEND_ATTACKER_VISIBLE, MOVEEND_TARGET_VISIBLE, diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index e5ec842f1a..101a198b81 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -145,8 +145,6 @@ enum ItemHoldEffect HOLD_EFFECT_COUNT }; -#define HOLD_EFFECT_CHOICE(holdEffect) ((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) - // Terrain seed params #define HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN 0 #define HOLD_EFFECT_PARAM_GRASSY_TERRAIN 1 diff --git a/include/item.h b/include/item.h index 5fbb12ec43..5622786c91 100644 --- a/include/item.h +++ b/include/item.h @@ -6,6 +6,8 @@ #include "constants/items.h" #include "constants/moves.h" #include "constants/tms_hms.h" +#include "constants/item_effects.h" +#include "constants/hold_effects.h" /* Expands to: * enum @@ -190,5 +192,6 @@ u32 GetItemFlingPower(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile); u32 GetItemSellPrice(u32 itemId); +bool32 IsHoldEffectChoice(enum ItemHoldEffect holdEffect); #endif // GUARD_ITEM_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 0f9bf432c9..1b22be4ac5 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2889,7 +2889,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Choice items - if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) + if (IsHoldEffectChoice(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) { // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) @@ -3060,7 +3060,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. // This unsets Trick Room and resets it with a full timer. case EFFECT_TRICK_ROOM: - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, MOVE_TRICK_ROOM) && RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE)) @@ -3068,7 +3068,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_TAILWIND: // Anticipate both opponents protecting to stall out Trick Room, and apply Tailwind. - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter && RandomPercentage(RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, TAILWIND_IN_TRICK_ROOM_CHANCE)) ADJUST_SCORE(BEST_EFFECT); break; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 84cba174b2..976c06c0b6 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -165,7 +165,7 @@ static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) { // Choice locked into something else if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move - && ((HOLD_EFFECT_CHOICE(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) + && ((IsHoldEffectChoice(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) || gBattleMons[battler].ability == ABILITY_GORILLA_TACTICS)) return TRUE; return FALSE; @@ -1003,7 +1003,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, AI_CHECK))) moveAffectsTarget = FALSE; - if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) + if (IsHoldEffectChoice(holdEffect) && IsBattlerItemEnabled(battler)) { if ((GetMoveCategory(lastUsedMove) == DAMAGE_CATEGORY_STATUS || !moveAffectsTarget) && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -1902,7 +1902,7 @@ static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struc typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType2))); if (typeEffectiveness1 == 0) // Immunity typeEffectiveness1 = UQ_4_12(0.1); - + if (atkType2 != atkType1) { typeEffectiveness2 = uq4_12_multiply(typeEffectiveness2, (GetTypeModifier(atkType2, defType1))); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3c70f4b583..f834742279 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5939,7 +5939,6 @@ static void Cmd_moveend(void) s32 i; bool32 effect = FALSE; u32 moveType = 0; - enum ItemHoldEffect holdEffectAtk = HOLD_EFFECT_NONE; u32 endMode, endState; u32 originallyUsedMove; @@ -5951,7 +5950,6 @@ static void Cmd_moveend(void) endMode = cmd->endMode; endState = cmd->endState; - holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); moveType = GetBattleMoveType(gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); @@ -6149,35 +6147,6 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_CHOICE_MOVE: // update choice band move - { - u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; - if (gHitMarker & HITMARKER_OBEYS - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gChosenMove != MOVE_STRUGGLE - && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (HOLD_EFFECT_CHOICE(holdEffectAtk) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) - { - if ((moveEffect == EFFECT_BATON_PASS || moveEffect == EFFECT_HEALING_WISH) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED)) - { - gBattleScripting.moveendState++; - break; - } - *choicedMoveAtk = gChosenMove; - } - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk) - break; - } - if (i == MAX_MON_MOVES) - { - *choicedMoveAtk = MOVE_NONE; - } - gBattleScripting.moveendState++; - break; - } case MOVEEND_ITEM_EFFECTS_TARGET: if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget)) effect = TRUE; diff --git a/src/battle_util.c b/src/battle_util.c index 8e2627c262..d62d41af58 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1481,7 +1481,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) } gPotentialItemEffectBattler = battler; - if (DYNAMAX_BYPASS_CHECK && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) + if (DYNAMAX_BYPASS_CHECK && IsHoldEffectChoice(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[battler].item; @@ -1600,7 +1600,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_ENCORE && gDisableStructs[battler].encoreTimer && gDisableStructs[battler].encoredMove != move) unusableMoves |= 1u << i; // Choice Items - else if (check & MOVE_LIMITATION_CHOICE_ITEM && HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) + else if (check & MOVE_LIMITATION_CHOICE_ITEM && IsHoldEffectChoice(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) unusableMoves |= 1u << i; // Assault Vest else if (check & MOVE_LIMITATION_ASSAULT_VEST && holdEffect == HOLD_EFFECT_ASSAULT_VEST && IsBattleMoveStatus(move) && moveEffect != EFFECT_ME_FIRST) @@ -2295,6 +2295,29 @@ static enum MoveCanceller CancellerStanceChangeTwo(void) return MOVE_STEP_SUCCESS; } +static enum MoveCanceller CancellerChoiceLock(void) +{ + u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + + if (gChosenMove != MOVE_STRUGGLE + && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) + && (IsHoldEffectChoice(holdEffect) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) + *choicedMoveAtk = gChosenMove; + + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (gBattleMons[gBattlerAttacker].moves[moveIndex] == *choicedMoveAtk) + break; + } + + if (moveIndex == MAX_MON_MOVES) + *choicedMoveAtk = MOVE_NONE; + + return MOVE_STEP_SUCCESS; +} + static enum MoveCanceller CancellerWeatherPrimal(void) { enum MoveCanceller effect = MOVE_STEP_SUCCESS; @@ -2564,6 +2587,7 @@ static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = [CANCELLER_BIDE] = CancellerBide, [CANCELLER_THAW] = CancellerThaw, [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, + [CANCELLER_CHOICE_LOCK] = CancellerChoiceLock, [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, [CANCELLER_DYNAMAX_BLOCKED] = CancellerDynamaxBlocked, [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, diff --git a/src/item.c b/src/item.c index 52d52923ca..b25f38b058 100644 --- a/src/item.c +++ b/src/item.c @@ -50,7 +50,7 @@ const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = FOREACH_HM(UNPACK_HM_ITEM_ID) /* * Expands to the following: - * + * * [1] = { ITEM_TM_FOCUS_PUNCH, MOVE_FOCUS_PUNCH }, * [2] = { ITEM_TM_DRAGON_CLAW, MOVE_DRAGON_CLAW }, * [3] = { ITEM_TM_WATER_PULSE, MOVE_WATER_PULSE }, @@ -976,3 +976,10 @@ u32 GetItemSellPrice(u32 itemId) { return GetItemPrice(itemId) / ITEM_SELL_FACTOR; } + +bool32 IsHoldEffectChoice(enum ItemHoldEffect holdEffect) +{ + return holdEffect == HOLD_EFFECT_CHOICE_BAND + || holdEffect == HOLD_EFFECT_CHOICE_SCARF + || holdEffect == HOLD_EFFECT_CHOICE_SPECS; +} From cf4bb3e286c5f11d681f7b6e31926a9aa6a99846 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 25 Jul 2025 16:16:35 -0400 Subject: [PATCH 164/248] Moved some fields to BattlerState/PartyState (#7409) --- include/battle.h | 17 +++++--- include/constants/form_change_types.h | 4 +- src/battle_ai_main.c | 2 + src/battle_anim_new.c | 6 +-- src/battle_gfx_sfx_util.c | 2 +- src/battle_main.c | 16 ++++---- src/battle_script_commands.c | 46 ++++++++++----------- src/battle_util.c | 59 ++++++++++++++------------- src/pokemon.c | 4 +- 9 files changed, 80 insertions(+), 76 deletions(-) diff --git a/include/battle.h b/include/battle.h index b834fc195b..176adf7343 100644 --- a/include/battle.h +++ b/include/battle.h @@ -582,7 +582,9 @@ struct BattlerState u32 stompingTantrumTimer:2; u32 canPickupItem:1; u32 itemCanBeKnockedOff:1; - u32 padding:16; + u32 ateBoost:1; + u32 commanderSpecies:11; + u32 padding:4; // End of Word }; @@ -594,7 +596,9 @@ struct PartyState u32 battleBondBoost:1; u32 transformZeroToHero:1; u32 supersweetSyrup:1; - u32 padding:26; + u32 timesGotHit:5; + u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon. + u32 padding:10; }; // Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise. @@ -702,7 +706,6 @@ struct BattleStruct u8 savedBattlerAttacker[5]; u8 savedTargetCount:4; u8 savedAttackerCount:4; - bool8 ateBoost[MAX_BATTLERS_COUNT]; u8 abilityPopUpSpriteIds[MAX_BATTLERS_COUNT][NUM_BATTLE_SIDES]; // two per battler struct ZMoveData zmove; struct DynamaxData dynamax; @@ -717,7 +720,6 @@ struct BattleStruct u8 soulheartBattlerId; u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. - u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon. u8 quickClawBattlerId; struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side) u8 blunderPolicy:1; // should blunder policy activate @@ -745,13 +747,11 @@ struct BattleStruct s32 aiDelayTimer; // Counts number of frames AI takes to choose an action. s32 aiDelayFrames; // Number of frames it took to choose an action. s32 aiDelayCycles; // Number of cycles it took to choose an action. - u8 timesGotHit[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 stickySyrupdBy[MAX_BATTLERS_COUNT]; u8 supremeOverlordCounter[MAX_BATTLERS_COUNT]; u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. enum DamageCategory categoryOverride:8; // for Z-Moves and Max Moves - u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party u16 opponentMonCanTera:6; @@ -1218,6 +1218,11 @@ static inline struct Pokemon *GetBattlerParty(u32 battler) return GetSideParty(GetBattlerSide(battler)); } +static inline struct PartyState *GetBattlerPartyState(u32 battler) +{ + return &gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]]; +} + static inline bool32 IsDoubleBattle(void) { return gBattleTypeFlags & BATTLE_TYPE_DOUBLE; diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 10de5f785f..f43f3bddc6 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -48,7 +48,7 @@ enum FormChanges FORM_CHANGE_WITHDRAW, // Form change that activates when the Pokémon faints, either in battle or in the overworld by poison. // If species is not specified and it's on the player's side, it will try to use the value - // saved in gBattleStruct->changedSpecies from a previous form change. + // saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change. // - No parameters. FORM_CHANGE_FAINT, // Form change that activates when the Pokémon is sent out at the beginning of a battle @@ -56,7 +56,7 @@ enum FormChanges // param2: a move that will be replaced, optional // param3: a new move to replace it with, optional FORM_CHANGE_BEGIN_BATTLE, - // Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->changedSpecies from a previous form change. + // Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change. // param1: item to hold, optional // param2: a move that will be replaced, optional // param3: a new move to replace it with, optional diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1b22be4ac5..f06a4e8f6d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3878,6 +3878,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_STRENGTH_SAP: + { u32 atkStat = gBattleMons[battlerDef].attack; u32 atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; atkStat *= gStatStageRatios[atkStage][0]; @@ -3890,6 +3891,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); } break; + } case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 00281253fa..1263632ab7 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9632,7 +9632,7 @@ void AnimTask_RandomBool(u8 taskId) // Credit to Skeli #define PRIMAL_PULSE_SCALE_SIZE 16 #define PRIMAL_PULSE_FRAME_COUNT 4 -static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] = +static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 15), @@ -9679,7 +9679,7 @@ const union AffineAnimCmd* const gSpriteAffineAnimTable_MegaSymbol[] = // Used for determining which animation to use for Order Up void AnimTask_GetCommanderType(u8 taskId) { - switch (gBattleStruct->commanderActive[gEffectBattler]) + switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies) { case SPECIES_TATSUGIRI_CURLY: gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_CURLY; @@ -9694,6 +9694,6 @@ void AnimTask_GetCommanderType(u8 taskId) gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_NONE; break; } - + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 7135cb8905..37c5b12d60 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -940,7 +940,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo { // Get base form if its currently Gigantamax if (IsGigantamaxed(battlerDef)) - targetSpecies = gBattleStruct->changedSpecies[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]]; + targetSpecies = GetBattlerPartyState(battlerDef)->changedSpecies; else if (gBattleStruct->illusion[battlerDef].state == ILLUSION_ON) targetSpecies = GetIllusionMonSpecies(battlerDef); else diff --git a/src/battle_main.c b/src/battle_main.c index 8c4ba46261..2b3edabad2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3367,7 +3367,7 @@ const u8* FaintClearSetData(u32 battler) ClearPursuitValuesIfSet(battler); - if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) { u32 partner = BATTLE_PARTNER(battler); if (IsBattlerAlive(partner)) @@ -5340,7 +5340,7 @@ static void CheckChangingTurnOrderEffects(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gBattleStruct->battlerState[i].focusPunchBattlers = FALSE; - gBattleStruct->ateBoost[i] = FALSE; + gBattleStruct->battlerState[i].ateBoost = FALSE; gSpecialStatuses[i].gemBoost = FALSE; } @@ -5612,8 +5612,8 @@ static void HandleEndTurn_FinishBattle(void) changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE); // Clear original species field - gBattleStruct->changedSpecies[B_SIDE_PLAYER][i] = SPECIES_NONE; - gBattleStruct->changedSpecies[B_SIDE_OPPONENT][i] = SPECIES_NONE; + gBattleStruct->partyState[B_SIDE_PLAYER][i].changedSpecies = SPECIES_NONE; + gBattleStruct->partyState[B_SIDE_OPPONENT][i].changedSpecies = SPECIES_NONE; // Recalculate the stats of every party member before the end if (!changedForm && B_RECALCULATE_STATS >= GEN_5) @@ -6045,7 +6045,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState { u32 ateType = TrySetAteType(move, battler, ability); if (ateType != TYPE_NONE && state == MON_IN_BATTLE) - gBattleStruct->ateBoost[battler] = TRUE; + gBattleStruct->battlerState[battler].ateBoost = TRUE; return ateType; } else if (moveEffect != EFFECT_CHANGE_TYPE_ON_ITEM @@ -6057,7 +6057,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState && gimmick != GIMMICK_Z_MOVE) { if (state == MON_IN_BATTLE && gimmick != GIMMICK_DYNAMAX) - gBattleStruct->ateBoost[battler] = TRUE; + gBattleStruct->battlerState[battler].ateBoost = TRUE; return TYPE_NORMAL; } @@ -6071,7 +6071,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); gBattleStruct->dynamicMoveType = 0; - gBattleStruct->ateBoost[battler] = FALSE; + gBattleStruct->battlerState[battler].ateBoost = FALSE; gSpecialStatuses[battler].gemBoost = FALSE; moveType = GetDynamicMoveType(GetBattlerMon(battler), @@ -6165,4 +6165,4 @@ void BattleDebug_WonBattle(void) { gBattleOutcome |= B_OUTCOME_WON; gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; -} \ No newline at end of file +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f834742279..8a1e1a1740 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2107,7 +2107,7 @@ static inline bool32 TryActivateWeaknessBerry(u32 battlerDef) { gBattleScripting.battler = battlerDef; gLastUsedItem = gBattleMons[battlerDef].item; - gBattleStruct->partyState[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]].ateBerry = TRUE; + GetBattlerPartyState(battlerDef)->ateBerry = TRUE; BattleScriptCall(BattleScript_BerryReduceDmg); return TRUE; } @@ -2361,10 +2361,9 @@ static void Cmd_datahpupdate(void) else if (DoesDisguiseBlockMove(battler, gCurrentMove)) { // TODO: Convert this to a proper FORM_CHANGE type. - u32 side = GetBattlerSide(battler); gBattleScripting.battler = battler; - if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] = gBattleMons[battler].species; + if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else @@ -2445,7 +2444,7 @@ static void Cmd_datahpupdate(void) if (gBattlerAttacker != gBattlerTarget && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS && IsBattlerTurnDamaged(gBattlerTarget)) - gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; + GetBattlerPartyState(gBattlerTarget)->timesGotHit++; if (GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF && IsBattlerTurnDamaged(gBattlerTarget) @@ -2574,9 +2573,8 @@ static void Cmd_resultmessage(void) if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention) { gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; - u32 side = GetBattlerSide(gBattlerTarget); - if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species; + if (GetBattlerPartyState(gBattlerTarget)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(gBattlerTarget)->changedSpecies = gBattleMons[gBattlerTarget].species; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED BattleScriptCall(BattleScript_IceFaceNullsDamage); @@ -3016,7 +3014,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai gBattleScripting.moveEffect = MOVE_EFFECT_NONE; else if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker]) + && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE) && !primary) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) @@ -3602,7 +3600,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai { u32 stat = 0; bool32 commanderAffected = TRUE; - switch (gBattleStruct->commanderActive[gEffectBattler]) + switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies) { case SPECIES_TATSUGIRI_CURLY: stat = STAT_ATK; @@ -5664,18 +5662,16 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move || NumFaintedBattlersByAttacker(battlerAtk) == 0) break; - u32 side = GetBattlerSide(battlerAtk); - - if (gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost) + if (GetBattlerPartyState(battlerAtk)->battleBondBoost) break; if (GetGenConfig(GEN_CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) { // TODO: Convert this to a proper FORM_CHANGE type. gLastUsedAbility = abilityAtk; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE; + GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species); - gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species; + GetBattlerPartyState(battlerAtk)->changedSpecies = gBattleMons[battlerAtk].species; gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH; BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker); effect = TRUE; @@ -5706,7 +5702,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move gLastUsedAbility = abilityAtk; gBattlerAbility = battlerAtk; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE; + GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; BattleScriptCall(BattleScript_EffectBattleBondStatIncrease); effect = TRUE; } @@ -6558,7 +6554,7 @@ static void Cmd_moveend(void) gBattleScripting.battler = battler; gEffectBattler = gBattlerAttacker; BattleScriptPushCursor(); - if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE + if (gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG || GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; @@ -6911,7 +6907,7 @@ static void Cmd_moveend(void) // #endif } gProtectStructs[gBattlerAttacker].shellTrap = FALSE; - gBattleStruct->ateBoost[gBattlerAttacker] = FALSE; + gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; @@ -6943,10 +6939,10 @@ static void Cmd_moveend(void) gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; gProtectStructs[i].tryEjectPack = FALSE; - if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i)) + if (gBattleStruct->battlerState[i].commanderSpecies != SPECIES_NONE && !IsBattlerAlive(i)) { u32 partner = BATTLE_PARTNER(i); - gBattleStruct->commanderActive[i] = SPECIES_NONE; + gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; if (IsBattlerAlive(partner)) gStatuses3[partner] &= ~STATUS3_COMMANDER; } @@ -8586,7 +8582,7 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) - && gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry + && GetBattlerPartyState(battler)->ateBerry && !IsBattlerAtMaxHp(battler)) { gBattleStruct->cheekPouchActivated = TRUE; @@ -11186,8 +11182,8 @@ static void Cmd_transformdataexecution(void) gDisableStructs[gBattlerAttacker].mimickedMoves = 0; gDisableStructs[gBattlerAttacker].usedMoves = 0; - timesGotHit = gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]; - gBattleStruct->timesGotHit[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = timesGotHit; + timesGotHit = GetBattlerPartyState(gBattlerTarget)->timesGotHit; + GetBattlerPartyState(gBattlerAttacker)->timesGotHit = timesGotHit; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) @@ -16121,7 +16117,7 @@ void BS_JumpIfCommanderActive(void) { NATIVE_ARGS(const u8 *jumpInstr); - if (gBattleStruct->commanderActive[gBattlerTarget] != SPECIES_NONE) + if (gBattleStruct->battlerState[gBattlerTarget].commanderSpecies != SPECIES_NONE) gBattlescriptCurrInstr = cmd->jumpInstr; else if (gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) gBattlescriptCurrInstr = cmd->jumpInstr; @@ -18160,7 +18156,7 @@ void BS_ConsumeBerry(void) if (cmd->fromBattler) gLastUsedItem = gBattleMons[battler].item; - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; + GetBattlerPartyState(battler)->ateBerry = TRUE; gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler)) return; diff --git a/src/battle_util.c b/src/battle_util.c index d62d41af58..1346b9f0da 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1292,7 +1292,7 @@ bool32 IsBelchPreventingMove(u32 battler, u32 move) if (GetMoveEffect(move) != EFFECT_BELCH) return FALSE; - return !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry; + return !GetBattlerPartyState(battler)->ateBerry; } // Dynamax bypasses all selection prevention except Taunt and Assault Vest. @@ -3291,7 +3291,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 u32 side = 0; u32 i = 0, j = 0; u32 partner = 0; - struct Pokemon *mon; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return 0; @@ -3915,12 +3914,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_SUPERSWEET_SYRUP: if (!gSpecialStatuses[battler].switchInAbilityDone - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup) + && !GetBattlerPartyState(battler)->supersweetSyrup) { SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup = TRUE; + GetBattlerPartyState(battler)->supersweetSyrup = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates); effect++; } @@ -3956,10 +3955,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_INTREPID_SWORD: if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost) + && !GetBattlerPartyState(battler)->intrepidSwordBoost) { if (B_INTREPID_SWORD == GEN_9) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost = TRUE; + GetBattlerPartyState(battler)->intrepidSwordBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -3968,10 +3967,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_DAUNTLESS_SHIELD: if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN) - && !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost) + && !GetBattlerPartyState(battler)->dauntlessShieldBoost) { if (B_DAUNTLESS_SHIELD == GEN_9) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost = TRUE; + GetBattlerPartyState(battler)->dauntlessShieldBoost = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_DEF, 1, FALSE); BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); @@ -4080,15 +4079,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ZERO_TO_HERO: - side = GetBattlerSide(battler); - mon = GetBattlerMon(battler); - if (!gSpecialStatuses[battler].switchInAbilityDone - && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO - && !gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero) + && GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO + && !GetBattlerPartyState(battler)->transformZeroToHero) { gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero = TRUE; + GetBattlerPartyState(battler)->transformZeroToHero = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates); effect++; } @@ -4162,7 +4158,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && IsBattlerAlive(partner) && IsBattlerAlive(battler) - && gBattleStruct->commanderActive[partner] == SPECIES_NONE + && gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE && gBattleMons[partner].species == SPECIES_DONDOZO && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) { @@ -4170,7 +4166,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattlerAttacker = partner; gBattleStruct->battlerState[battler].commandingDondozo = TRUE; - gBattleStruct->commanderActive[partner] = gBattleMons[battler].species; + gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species; gStatuses3[battler] |= STATUS3_COMMANDER; if (gBattleMons[battler].volatiles.confusionTurns > 0 && !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION)) @@ -4708,6 +4704,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: + { u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg @@ -4723,11 +4720,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } } + } break; case ABILITY_STATIC: if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: + { u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg @@ -4743,6 +4742,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } } + } break; case ABILITY_FLAME_BODY: if (IsBattlerAlive(gBattlerAttacker) @@ -5490,7 +5490,7 @@ u32 IsAbilityPreventingEscape(u32 battler) bool32 CanBattlerEscape(u32 battler) // no ability check { - if (gBattleStruct->commanderActive[battler] != SPECIES_NONE) + if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) return TRUE; @@ -7289,7 +7289,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) // Berry was successfully used on a Pokemon. if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX)) - gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE; + GetBattlerPartyState(battler)->ateBerry = TRUE; return effect; } @@ -8213,7 +8213,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower = GetMaxMovePower(gBattleMons[battlerAtk].moves[gBattleStruct->chosenMovePositions[battlerAtk]]); break; case EFFECT_RAGE_FIST: - basePower += 50 * gBattleStruct->timesGotHit[GetBattlerSide(battlerAtk)][gBattlerPartyIndexes[battlerAtk]]; + basePower += 50 * GetBattlerPartyState(battlerAtk)->timesGotHit; basePower = (basePower > 350) ? 350 : basePower; break; case EFFECT_FICKLE_BEAM: @@ -8382,23 +8382,23 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_PIXILATE: - if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk]) + if (moveType == TYPE_FAIRY && gBattleStruct->battlerState[battlerAtk].ateBoost) modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_GALVANIZE: - if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk]) + if (moveType == TYPE_ELECTRIC && gBattleStruct->battlerState[battlerAtk].ateBoost) modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_REFRIGERATE: - if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk]) + if (moveType == TYPE_ICE && gBattleStruct->battlerState[battlerAtk].ateBoost) modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_AERILATE: - if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk]) + if (moveType == TYPE_FLYING && gBattleStruct->battlerState[battlerAtk].ateBoost) modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_NORMALIZE: - if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk] && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7) + if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_PUNK_ROCK: @@ -10160,7 +10160,6 @@ bool32 CanBattlerFormChange(u32 battler, enum FormChanges method) bool32 TryBattleFormChange(u32 battler, enum FormChanges method) { u32 monId = gBattlerPartyIndexes[battler]; - u32 side = GetBattlerSide(battler); struct Pokemon *party = GetBattlerParty(battler); u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); u32 targetSpecies; @@ -10174,8 +10173,9 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method) if (targetSpecies != currentSpecies) { // Saves the original species on the first form change. - if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE) - gBattleStruct->changedSpecies[side][monId] = gBattleMons[battler].species; + + if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); @@ -10183,7 +10183,7 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method) RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); return TRUE; } - else if (gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) + else if (GetBattlerPartyState(battler)->changedSpecies != SPECIES_NONE) { bool32 restoreSpecies = FALSE; @@ -10204,7 +10204,8 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method) u32 abilityForm = gBattleMons[battler].ability; // Reverts the original species TryToSetBattleFormChangeMoves(&party[monId], method); - SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[side][monId]); + u32 changedSpecies = GetBattlerPartyState(battler)->changedSpecies; + SetMonData(&party[monId], MON_DATA_SPECIES, &changedSpecies); RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX); // Battler data is not updated with regular form's ability, not doing so could cause wrong ability activation. if (method == FORM_CHANGE_FAINT) diff --git a/src/pokemon.c b/src/pokemon.c index 85ef8a2fc9..6433acd701 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6829,8 +6829,8 @@ bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method) u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); u32 targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE) - targetSpecies = gBattleStruct->changedSpecies[side][monId]; + if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->partyState[side][monId].changedSpecies != SPECIES_NONE) + targetSpecies = gBattleStruct->partyState[side][monId].changedSpecies; if (targetSpecies != currentSpecies) { From 57fda0d060b87785d3b93eb1ed9ee26bb7637206 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 26 Jul 2025 12:22:47 -0400 Subject: [PATCH 165/248] Improve AI's priority handling (#7337) --- include/battle_ai_main.h | 7 ++ include/battle_ai_util.h | 24 +++-- include/config/ai.h | 1 + include/random.h | 1 + src/battle_ai_main.c | 173 ++++++++++++++++++++++++---------- src/battle_ai_switch_items.c | 142 ++++++++++++++++++++-------- src/battle_ai_util.c | 99 +++++++++---------- test/battle/ai/ai.c | 12 +++ test/battle/ai/ai_switching.c | 40 ++++++++ 9 files changed, 353 insertions(+), 146 deletions(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 547395d480..b3bc57c4e9 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -45,6 +45,13 @@ enum AIScore WORST_EFFECT = -10 }; +enum MoveComparisonResult +{ + MOVE_NEUTRAL_COMPARISON, + MOVE_WON_COMPARISON, + MOVE_LOST_COMPARISON, +}; + // AI_TryToFaint #define FAST_KILL 6 // AI is faster and faints target #define SLOW_KILL 4 // AI is slower and faints target diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 4dfea63dfe..ec8c250fd2 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -29,8 +29,10 @@ enum DamageCalcContext enum AiCompareMovesPriority { PRIORITY_EFFECT, + PRIORITY_GUARANTEE, PRIORITY_ACCURACY, - PRIORITY_NOT_CHARGING + PRIORITY_NOT_CHARGING, + PRIORITY_SPEED, }; enum AIPivot @@ -54,6 +56,12 @@ enum AIConsiderGimmick USE_GIMMICK, }; +enum ConsiderPriority +{ + DONT_CONSIDER_PRIORITY, + CONSIDER_PRIORITY, +}; + static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations) { return move == MOVE_NONE @@ -63,8 +71,10 @@ static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations typedef bool32 (*MoveFlag)(u32 move); -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); bool32 AI_RandLessThan(u32 val); u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData); bool32 IsAiVsAiBattle(void); @@ -92,7 +102,7 @@ bool32 AI_BattlerAtMaxHp(u32 battler); u32 GetHealthPercentage(u32 battler); bool32 AI_CanBattlerEscape(u32 battler); bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef); -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 moveConsidered); +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority); bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk); u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk); u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); @@ -107,7 +117,6 @@ u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum DamageCalcContext calcContext); -bool32 CanIndexMoveGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index); bool32 HasDamagingMove(u32 battlerId); bool32 HasDamagingMoveOfType(u32 battlerId, u32 type); u32 GetBattlerSecondaryDamage(u32 battlerId); @@ -131,6 +140,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); bool32 IsAIUsingGimmick(u32 battler); void DecideTerastal(u32 battler); +bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); @@ -143,7 +153,7 @@ u32 CountNegativeStatStages(u32 battlerId); // move checks bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); -s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); +enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather); bool32 AI_IsDamagedByRecoil(u32 battler); @@ -269,7 +279,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext); -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered); +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority ConsiderPriority); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); diff --git a/include/config/ai.h b/include/config/ai.h index f5d0496c20..c82e46773a 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -60,6 +60,7 @@ #define ENABLE_RECOVERY_THRESHOLD 60 // HP percentage beneath which SHOULD_RECOVER_CHANCE is active #define SUCKER_PUNCH_CHANCE 50 // Chance for the AI to not use Sucker Punch if the player has a status move #define SUCKER_PUNCH_PREDICTION_CHANCE 50 // Additional chance for the AI to not use Sucker Punch if actively predicting a status move if SUCKER_PUNCH_CHANCE fails +#define PRIORITIZE_LAST_CHANCE_CHANCE 50 // Chance the AI will prioritize Last Chance (priority move in the face of being outsped and KO'd) over Slow KO // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit diff --git a/include/random.h b/include/random.h index 89ccb9779a..38a464e457 100644 --- a/include/random.h +++ b/include/random.h @@ -202,6 +202,7 @@ enum RandomTag RNG_AI_STATUS_FOCUS_PUNCH, RNG_AI_BOOST_INTO_HAZE, RNG_AI_SHOULD_RECOVER, + RNG_AI_PRIORITIZE_LAST_CHANCE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, RNG_AI_ASSUME_STATUS_SLEEP, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f06a4e8f6d..d29becb2ea 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1083,7 +1083,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsPowderMove(move) && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); - if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move)) + if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) RETURN_SCORE_MINUS(10); if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) @@ -1309,7 +1309,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (moveEffect) { case EFFECT_HIT: // only applies to Vital Throw - if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) + if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && aiData->hpPercents[battlerAtk] < 40) ADJUST_SCORE(-2); // don't want to move last break; default: @@ -1759,7 +1759,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) ADJUST_SCORE(-10); // no anticipated move to disable @@ -1781,7 +1781,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) ADJUST_SCORE(-10); // no anticipated move to encore @@ -2163,7 +2163,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SPITE: case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) @@ -2320,7 +2320,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (isDoubleBattle) { if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards - && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove)) // partner is going to set up before the potential Defog + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the potential Defog { ADJUST_SCORE(-10); break; // Don't use Defog if partner is going to set up hazards @@ -2348,7 +2348,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE - && AI_IsSlower(battlerAtk, battlerDef, move) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && GetMoveEffect(predictedMove) == EFFECT_SEMI_INVULNERABLE) ADJUST_SCORE(-10); // Don't Fly/dig/etc if opponent is going to fly/dig/etc after you @@ -2495,7 +2495,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ME_FIRST: if (predictedMove != MOVE_NONE) { - if (AI_IsSlower(battlerAtk, battlerDef, move)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); // Target is predicted to go first, Me First will fail else if (GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckBadMove(battlerAtk, battlerDef, predictedMove, score); @@ -2664,7 +2664,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_ELECTRIFY: - if (AI_IsSlower(battlerAtk, battlerDef, move) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) //|| GetMoveTypeSpecial(battlerDef, predictedMove) == TYPE_ELECTRIC // Move will already be electric type || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2696,7 +2696,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INSTRUCT: { u32 instructedMove; - if (AI_IsSlower(battlerAtk, battlerDef, move)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) instructedMove = predictedMove; else instructedMove = gLastMoves[battlerDef]; @@ -2733,21 +2733,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_QUASH: if (!isDoubleBattle - || AI_IsSlower(battlerAtk, battlerDef, move) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: if (!IsTargetingPartner(battlerAtk, battlerDef) || !isDoubleBattle - || AI_IsSlower(battlerAtk, battlerDef, move) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SUCKER_PUNCH: if ((HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_STATUS) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_CHANCE)) // Player has a status move || (IsBattleMoveStatus(predictedMove) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_PREDICTION_CHANCE) && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE)) // AI actively predicting incoming status move - || AI_IsSlower(battlerAtk, battlerDef, move)) // Opponent going first + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Opponent going first ADJUST_SCORE(-10); break; case EFFECT_TAILWIND: @@ -2782,7 +2782,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FLAIL: - if (AI_IsSlower(battlerAtk, battlerDef, move) // Opponent should go first + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) // Opponent should go first || aiData->hpPercents[battlerAtk] > 50) ADJUST_SCORE(-4); break; @@ -2817,7 +2817,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) ADJUST_SCORE(-10); else if (CanTargetFaintAi(battlerDef, battlerAtk) - && AI_IsSlower(battlerAtk, battlerDef, move)) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); break; case EFFECT_JUNGLE_HEALING: @@ -2848,7 +2848,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 defPrio = GetBattleMovePriority(battlerDef, aiData->abilities[battlerDef], predictedMove); if (predictedMove == MOVE_NONE || IsBattleMoveStatus(predictedMove) - || AI_IsSlower(battlerAtk, battlerDef, move) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) || defPrio < 1 || defPrio > 3) // Opponent going first or not using priority move ADJUST_SCORE(-10); @@ -2924,9 +2924,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) && effect != EFFECT_EXPLOSION && effect != EFFECT_MISTY_EXPLOSION) { - if (CanIndexMoveGuaranteeFaintTarget(battlerAtk, battlerDef, movesetIndex)) - ADJUST_SCORE(1); // Bonus point if the KO is guaranteed - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) ADJUST_SCORE(FAST_KILL); else ADJUST_SCORE(SLOW_KILL); @@ -2935,7 +2933,10 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) > 0) { - ADJUST_SCORE(LAST_CHANCE); + if (RandomPercentage(RNG_AI_PRIORITIZE_LAST_CHANCE, PRIORITIZE_LAST_CHANCE_CHANCE)) + ADJUST_SCORE(SLOW_KILL + 2); // Don't outscore Fast Kill (which gets a bonus point in AI_CompareDamagingMoves), but do outscore Slow Kill getting the same + else + ADJUST_SCORE(LAST_CHANCE); } return score; @@ -3009,7 +3010,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Adjust for always crit moves if (MoveAlwaysCrits(aiData->partnerMove) && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT) { - if (AI_IsSlower(battlerAtk, battlerAtkPartner, move)) // Partner moving first + if (AI_IsSlower(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY)) // Partner moving first { // discourage raising our attack since it's about to be maxed out if (IsAttackBoostMoveEffect(effect)) @@ -3182,7 +3183,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_ANGER_POINT: if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && AI_IsFaster(battlerAtk, battlerAtkPartner, move) + && AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY) && isFriendlyFireOK) { if (MoveAlwaysCrits(move)) @@ -3501,7 +3502,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INSTRUCT: { u16 instructedMove; - if (AI_IsFaster(battlerAtk, battlerAtkPartner, move)) + if (AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY)) instructedMove = aiData->partnerMove; else instructedMove = gLastMoves[battlerAtkPartner]; @@ -3518,8 +3519,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); - if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove) // Opponent mon 1 goes before partner - && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove)) // Opponent mon 2 goes before partner + if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove, predictedMove, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner + && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner { if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last @@ -3528,8 +3529,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_HEAL_PULSE: case EFFECT_HIT_ENEMY_HEAL_ALLY: - if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move) - && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move) + if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move, predictedMove, CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move, predictedMove, CONSIDER_PRIORITY) && gBattleMons[battlerAtkPartner].hp < gBattleMons[battlerAtkPartner].maxHP / 2) RETURN_SCORE_PLUS(WEAK_EFFECT); break; @@ -3635,16 +3636,50 @@ static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) } } -static s32 CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) +static enum MoveComparisonResult CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) { u32 acc1 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot1]; u32 acc2 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot2]; if (acc1 > acc2) - return 1; + return MOVE_WON_COMPARISON; else if (acc2 > acc1) - return -1; - return 0; + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareMoveSpeeds(u32 battlerAtk, u32 battlerDef, u16 move1, u16 move2) +{ + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 speed1 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move1, predictedMove, CONSIDER_PRIORITY); + u32 speed2 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move2, predictedMove, CONSIDER_PRIORITY); + + if (speed1 == AI_IS_FASTER && speed2 == AI_IS_SLOWER) + return MOVE_WON_COMPARISON; + if (speed2 == AI_IS_FASTER && speed1 == AI_IS_SLOWER) + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u16 moveSlot1, u16 moveSlot2, u16 *moves) +{ + s32 dmg1, dmg2; + bool32 guarantee1, guarantee2; + + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT)) + return 0; + + // Explictly care about guaranteed KOs universally + dmg1 = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveSlot1].minimum; + guarantee1 = (gBattleMons[battlerDef].hp <= dmg1 && !CanEndureHit(battlerAtk, battlerDef, moves[moveSlot1])); + dmg2 = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveSlot2].minimum; + guarantee2 = (gBattleMons[battlerDef].hp <= dmg2 && !CanEndureHit(battlerAtk, battlerDef, moves[moveSlot2])); + + if (guarantee1 && !guarantee2) + return MOVE_WON_COMPARISON; + if (guarantee2 && !guarantee1) + return MOVE_LOST_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; } static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 moveIndex, u32 hitsToFaintOpposingBattler) @@ -3718,9 +3753,11 @@ static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) // Priority list: // 1. Less no of hits to ko - // 2. Not charging - // 3. More accuracy - // 4. Better effect + // 2. Priority if outsped and a OHKO + // 3. Not charging + // 4. More accuracy + // 5. Guaranteed KO + // 6. Better effect // Current move requires the least hits to KO. Compare with other moves. if (leastHits == noOfHits[currId]) @@ -3738,23 +3775,55 @@ static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) else if (!isTwoTurnNotSemiInvulnerableMove[i] && isTwoTurnNotSemiInvulnerableMove[currId]) tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); + // Comparing KOs + if (noOfHits[currId] == 1) + { + // Use priority to get fast KO if outsped + switch (CompareMoveSpeeds(battlerAtk, battlerDef, moves[currId], moves[i])) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + // Min roll KOs + switch (CompareGuaranteeFaintTarget(battlerAtk, battlerDef, currId, i, moves)) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + } switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i)) { - case 1: + case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); break; - case -1: + case MOVE_LOST_COMPARISON: tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); break; + case MOVE_NEUTRAL_COMPARISON: + break; } switch (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId])) { - case 1: + case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); break; - case -1: + case MOVE_LOST_COMPARISON: tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); break; + case MOVE_NEUTRAL_COMPARISON: + break; } } } @@ -4111,7 +4180,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move)); break; case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) { if (gLastMoves[battlerDef] != MOVE_NONE && gLastMoves[battlerDef] != 0xFFFF && (GetMoveEffect(gLastMoves[battlerDef]) != GetMoveEffect(move))) @@ -4180,7 +4249,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && (gLastMoves[battlerDef] != MOVE_NONE) && (gLastMoves[battlerDef] != 0xFFFF) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && (AI_IsFaster(battlerAtk, battlerDef, move))) + && (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY))) { if (CanTargetMoveFaintAi(gLastMoves[battlerDef], battlerDef, battlerAtk, 1)) ADJUST_SCORE(GOOD_EFFECT); // Disable move that can kill attacker @@ -4220,7 +4289,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_DESTINY_BOND: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (AI_IsFaster(battlerAtk, battlerDef, move) && CanTargetFaintAi(battlerDef, battlerAtk)) + else if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SPITE: @@ -4435,7 +4504,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (predictedMove != MOVE_NONE && !isDoubleBattle) { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); - if ((AI_IsFaster(battlerAtk, battlerDef, move)) + if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) && (predictedEffect == EFFECT_EXPLOSION || predictedEffect == EFFECT_MISTY_EXPLOSION || predictedEffect == EFFECT_PROTECT)) @@ -4486,7 +4555,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_ATTRACT: if (!isDoubleBattle - && (AI_IsSlower(battlerAtk, battlerDef, move)) + && (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) && BattlerWillFaintFromSecondaryDamage(battlerDef, aiData->abilities[battlerDef])) break; // Don't use if the attract won't have a change to activate if (gBattleMons[battlerDef].status1 & STATUS1_ANY @@ -4513,7 +4582,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (isDoubleBattle) { if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards - && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move)) // Partner going first + && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move, predictedMove, CONSIDER_PRIORITY)) // Partner going first break; // Don't use Defog if partner is going to set up hazards } ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); @@ -5007,7 +5076,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEAL_BLOCK: - if (AI_IsFaster(battlerAtk, battlerDef, move) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) ADJUST_SCORE(DECENT_EFFECT); // Try to cancel healing move else if (HasHealingEffect(battlerDef) || aiData->holdEffects[battlerDef] == HOLD_EFFECT_LEFTOVERS || (aiData->holdEffects[battlerDef] == HOLD_EFFECT_BLACK_SLUDGE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_POISON))) @@ -5041,7 +5110,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_QUASH: - if (isDoubleBattle && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove)) + if (isDoubleBattle && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) ADJUST_SCORE(DECENT_EFFECT); // Attacker partner wouldn't go before target break; case EFFECT_TAILWIND: @@ -5056,7 +5125,7 @@ case EFFECT_GUARD_SPLIT: if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker goes first { if (predictedType == TYPE_GROUND) ADJUST_SCORE(GOOD_EFFECT); // Cause the enemy's move to fail @@ -5071,7 +5140,7 @@ case EFFECT_GUARD_SPLIT: } break; case EFFECT_CAMOUFLAGE: - if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move) // Attacker goes first + if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) // Attacker goes first && !IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(DECENT_EFFECT); break; @@ -5098,7 +5167,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_ENDEAVOR: - if (AI_IsSlower(battlerAtk, battlerDef, move) && !CanTargetFaintAi(battlerDef, battlerAtk)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_REVIVAL_BLESSING: @@ -5377,7 +5446,7 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_THROAT_CHOP: if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) { - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); @@ -5433,7 +5502,7 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 return score; if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING - && AI_IsSlower(battlerAtk, battlerDef, move) + && AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk) && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) == 0) { @@ -6009,7 +6078,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); else if (hitsToKO == 1) ADJUST_SCORE(BEST_EFFECT); - else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER) // Pursuit against fast U-Turn + else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) == AI_IS_SLOWER) // Pursuit against fast U-Turn ADJUST_SCORE(DECENT_EFFECT); break; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 976c06c0b6..7c5348176f 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -171,6 +171,34 @@ static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) return FALSE; } +static inline bool32 CanBattlerWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32 isBattlerFirst) +{ + // Player's best move deals 0 damage + if (hitsToKOAI == 0 && hitsToKOPlayer > 0) + return TRUE; + + // AI's best move deals 0 damage + if (hitsToKOPlayer == 0 && hitsToKOAI > 0) + return FALSE; + + // Neither mon can damage the other + if (hitsToKOPlayer == 0 && hitsToKOAI == 0) + return FALSE; + + // Different KO thresholds depending on who goes first + if (isBattlerFirst) + { + if (hitsToKOAI >= hitsToKOPlayer) + return TRUE; + } + else + { + if (hitsToKOAI > hitsToKOPlayer) + return TRUE; + } + return FALSE; +} + // Note that as many return statements as possible are INTENTIONALLY put after all of the loops; // the function can take a max of about 0.06s to run, and this prevents the player from identifying // whether the mon will switch or not by seeing how long the delay is before they select a move @@ -178,12 +206,13 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization u8 opposingPosition; - s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; - u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; + s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0, maxDamageTakenPriority = 0; + u32 aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u32 typeMatchup; enum BattleMoveEffects aiMoveEffect; - u32 hitsToKoPlayer = 0, hitsToKoAI = 0; + u32 hitsToKoAI = 0, hitsToKoAIPriority = 0, hitsToKoPlayer = 0; + bool32 canBattlerWin1v1 = FALSE, isBattlerFirst, isBattlerFirstPriority; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -197,6 +226,28 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) opposingBattler = GetBattlerAtPosition(opposingPosition); u16 *playerMoves = GetMovesArray(opposingBattler); + // Get max damage mon could take + for (i = 0; i < MAX_MON_MOVES; i++) + { + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + { + damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); + if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + { + maxDamageTaken = damageTaken; + } + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[battler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + { + maxDamageTakenPriority = damageTaken; + bestPlayerPriorityMove = playerMove; + } + } + } + + hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); + hitsToKoAIPriority = GetNoOfHitsToKOBattlerDmg(maxDamageTakenPriority, battler); + for (i = 0; i < MAX_MON_MOVES; i++) { aiMove = gBattleMons[battler].moves[i]; @@ -220,53 +271,37 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // Only check damage if it's a damaging move - if (!IsBattleMoveStatus(aiMove)) + if (!IsBattleMoveStatus(aiMove) && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) { // Check if mon has a super effective move - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0) && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) + if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData); - if (damageDealt > maxDamageDealt && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) + if (!canBattlerWin1v1 ) // Once we can win a 1v1 we don't need to track this, but want to run the rest of the function to keep the runtime the same regardless of when we find the winning move { - maxDamageDealt = damageDealt; - aiBestMove = aiMove; + hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); + isBattlerFirst = AI_IsFaster(battler, opposingBattler, aiMove, GetIncomingMove(battler, opposingBattler, gAiLogicData), CONSIDER_PRIORITY); + isBattlerFirstPriority = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); + canBattlerWin1v1 = CanBattlerWin1v1(hitsToKoAI, hitsToKoPlayer, isBattlerFirst) && CanBattlerWin1v1(hitsToKoAIPriority, hitsToKoPlayer, isBattlerFirstPriority); } } } } - hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(maxDamageDealt, opposingBattler); - // Calculate type advantage typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gBattleMons[battler]); - // Get max damage mon could take - for (i = 0; i < MAX_MON_MOVES; i++) - { - playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) - { - damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); - if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) - { - maxDamageTaken = damageTaken; - } - } - } - - hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); - // Check if mon gets one shot if (maxDamageTaken > gBattleMons[battler].hp - && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gBattleMons[opposingBattler].ability) && B_STURDY >= GEN_5 && aiAbility == ABILITY_STURDY))) + && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler]) && B_STURDY >= GEN_5 && aiAbility == ABILITY_STURDY))) { getsOneShot = TRUE; } // Check if current mon can 1v1 in spite of bad matchup, and don't switch out if it can - if ((hitsToKoPlayer != 0 && (hitsToKoPlayer < hitsToKoAI || hitsToKoAI == 0)) || (hitsToKoPlayer == hitsToKoAI && AI_IsFaster(battler, opposingBattler, aiBestMove))) + if (canBattlerWin1v1) return FALSE; // If we don't have any other viable options, don't switch out @@ -384,8 +419,8 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) { aiMove = gBattleMons[battler].moves[moveIndex]; if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) && aiMove != MOVE_NONE - && !CanAbilityAbsorbMove(battler, opposingBattler, gBattleMons[opposingBattler].ability, aiMove, GetBattleMoveType(aiMove), AI_CHECK) - && !CanAbilityBlockMove(battler, opposingBattler, gBattleMons[battler].ability, gBattleMons[opposingBattler].ability, aiMove, AI_CHECK) + && !CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], aiMove, GetBattleMoveType(aiMove), AI_CHECK) + && !CanAbilityBlockMove(battler, opposingBattler, gBattleMons[battler].ability, gAiLogicData->abilities[opposingBattler], aiMove, AI_CHECK) && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || gMovesInfo[aiMove].power != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero return FALSE; } @@ -1788,7 +1823,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); - u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = gAiLogicData->switchinCandidate.battleMon.ability; + u32 opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP; @@ -1939,7 +1974,7 @@ static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, return PARTY_SIZE; } -static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon) +static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerMove) { int i = 0; u32 playerMove; @@ -1955,7 +1990,35 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move return damageTaken; if (damageTaken > maxDamageTaken) + { maxDamageTaken = damageTaken; + *bestPlayerMove = playerMove; + } + } + } + return maxDamageTaken; +} + +static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerPriorityMove) +{ + int i = 0; + u32 playerMove; + u16 *playerMoves = GetMovesArray(opposingBattler); + s32 damageTaken = 0, maxDamageTaken = 0; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + { + damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); + if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move + return damageTaken; + if (damageTaken > maxDamageTaken) + { + maxDamageTaken = damageTaken; + *bestPlayerPriorityMove = playerMove; + } } } return maxDamageTaken; @@ -2044,9 +2107,9 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, int i, j, aliveCount = 0, bits = 0, aceMonCount = 0; s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; - u32 aiMove, hitsToKOAI, maxHitsToKO = 0; + u32 aiMove, hitsToKOAI, hitsToKOPlayer, hitsToKOAIPriority, bestPlayerMove = MOVE_NONE, bestPlayerPriorityMove = MOVE_NONE, maxHitsToKO = 0; u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup - bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, canSwitchinWin1v1; + bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, isSwitchinFirstPriority, canSwitchinWin1v1; // Iterate through mons for (i = firstId; i < lastId; i++) @@ -2077,7 +2140,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, continue; // Get max number of hits for player to KO AI mon and type matchup for defensive switching - hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon), battler); + hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerMove), battler); + hitsToKOAIPriority = GetSwitchinHitsToKO(GetMaxPriorityDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerPriorityMove), battler); typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); // Check through current mon's moves @@ -2085,10 +2149,12 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); + hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 - isSwitchinFirst = AI_WhoStrikesFirstPartyMon(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove); - canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler), isSwitchinFirst, isFreeSwitch); + isSwitchinFirst = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerMove, CONSIDER_PRIORITY); + isSwitchinFirstPriority = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); + canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, hitsToKOPlayer, isSwitchinFirst, isFreeSwitch) && CanSwitchinWin1v1(hitsToKOAIPriority, hitsToKOPlayer, isSwitchinFirstPriority, isFreeSwitch); // AI must successfully 1v1 with and without priority to be considered a good option // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not if (GetMoveEffect(aiMove) == EFFECT_BATON_PASS) @@ -2346,7 +2412,7 @@ static bool32 AiExpectsToFaintPlayer(u32 battler) if (!IsBattlerAlly(target, battler) && CanIndexMoveFaintTarget(battler, target, gAiBattleData->chosenMoveIndex[battler], AI_ATTACKING) - && AI_IsFaster(battler, target, GetAIChosenMove(battler))) + && AI_IsFaster(battler, target, GetAIChosenMove(battler), GetIncomingMove(battler, target, gAiLogicData), CONSIDER_PRIORITY)) { // We expect to faint the target and move first -> dont use an item return TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 61d8021de6..4443aa1f59 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -76,14 +76,24 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC } } -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move) +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) { - return (AI_WhoStrikesFirst(battlerAi, battlerDef, move) == AI_IS_FASTER); + return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_FASTER); } -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move) +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) { - return (AI_WhoStrikesFirst(battlerAi, battlerDef, move) == AI_IS_SLOWER); + return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); +} + +bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +{ + return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_FASTER); +} + +bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +{ + return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); } u32 GetAIChosenMove(u32 battlerId) @@ -484,7 +494,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; - if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI))) + if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI), GetIncomingMove(battlerAI, opposingBattler, gAiLogicData), CONSIDER_PRIORITY)) return TRUE; } return FALSE; @@ -1164,7 +1174,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s } // Checks if one of the moves has side effects or perks, assuming equal dmg or equal no of hits to KO -s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) +enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; u32 defAbility = gAiLogicData->abilities[battlerDef]; @@ -1178,27 +1188,27 @@ s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 bool32 moveContact1 = MoveMakesContact(move1); bool32 moveContact2 = MoveMakesContact(move2); if (moveContact1 && !moveContact2) - return -1; + return MOVE_LOST_COMPARISON; if (moveContact2 && !moveContact1) - return 1; + return MOVE_WON_COMPARISON; } // Check additional effects. effect1 = AI_IsMoveEffectInMinus(battlerAtk, battlerDef, move1, noOfHitsToKo); effect2 = AI_IsMoveEffectInMinus(battlerAtk, battlerDef, move2, noOfHitsToKo); if (effect2 && !effect1) - return 1; + return MOVE_WON_COMPARISON; if (effect1 && !effect2) - return -1; + return MOVE_LOST_COMPARISON; effect1 = AI_IsMoveEffectInPlus(battlerAtk, battlerDef, move1, noOfHitsToKo); effect2 = AI_IsMoveEffectInPlus(battlerAtk, battlerDef, move2, noOfHitsToKo); if (effect2 && !effect1) - return -1; + return MOVE_LOST_COMPARISON; if (effect1 && !effect2) - return 1; + return MOVE_WON_COMPARISON; - return 0; + return MOVE_NEUTRAL_COMPARISON; } u32 GetNoOfHitsToKO(u32 dmg, s32 hp) @@ -1261,7 +1271,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) * AI_IS_FASTER: is user(ai) faster * AI_IS_SLOWER: is target faster */ -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) { u32 speedBattlerAI, speedBattler; enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; @@ -1269,15 +1279,16 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) u32 abilityAI = gAiLogicData->abilities[battlerAI]; u32 abilityPlayer = gAiLogicData->abilities[battler]; - u32 predictedMove = GetIncomingMove(battlerAI, battler, gAiLogicData); + if (considerPriority == CONSIDER_PRIORITY) + { + s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, aiMoveConsidered); + s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, playerMoveConsidered); - s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, moveConsidered); - s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, predictedMove); - - if (aiPriority > playerPriority) - return AI_IS_FASTER; - else if (aiPriority < playerPriority) - return AI_IS_SLOWER; + if (aiPriority > playerPriority) + return AI_IS_FASTER; + else if (aiPriority < playerPriority) + return AI_IS_SLOWER; + } speedBattlerAI = GetBattlerTotalSpeedStatArgs(battlerAI, abilityAI, holdEffectAI); speedBattler = GetBattlerTotalSpeedStatArgs(battler, abilityPlayer, holdEffectPlayer); @@ -1314,7 +1325,7 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) return AI_IS_SLOWER; } -static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) +bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) { enum BattleMoveEffects effect = GetMoveEffect(move); if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT) @@ -2043,7 +2054,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) if (stat == STAT_SPEED) { // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY) && CountUsablePartyMons(battlerAtk) == 0 && !HasMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } @@ -2085,7 +2096,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += DECENT_EFFECT; break; case STAT_SPEED: - if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered)) + if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; break; case STAT_SPATK: @@ -2191,18 +2202,6 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, en return FALSE; } -bool32 CanIndexMoveGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex) -{ - s32 dmg; - u16 *moves = gBattleMons[battlerAtk].moves; - - dmg = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; // Explictly care about guaranteed KOs universally - - if (gBattleMons[battlerDef].hp <= dmg && !CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) - return TRUE; - return FALSE; -} - u16 *GetMovesArray(u32 battler) { if (IsAiBattlerAware(battler) || IsAiBattlerAware(BATTLE_PARTNER(battler))) @@ -3127,7 +3126,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (IsBattlerPredictedToSwitch(battlerDef)) return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent - if (AI_IsFaster(battlerAtk, battlerDef, move)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) // Attacker goes first { if (!CanAIFaintTarget(battlerAtk, battlerDef, 0)) // Can't KO foe otherwise { @@ -3512,7 +3511,7 @@ u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbi if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || AI_IsSlower(battlerAtk, battlerDef, move))) // Opponent goes first + || AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY))) // Opponent goes first { return 0; } @@ -3520,7 +3519,7 @@ u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbi || gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS || gBattleMons[battlerDef].volatiles.infatuation || gBattleMons[battlerDef].volatiles.confusionTurns > 0) - || ((AI_IsFaster(battlerAtk, battlerDef, move)) && CanTargetFaintAi(battlerDef, battlerAtk))) + || ((AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) && CanTargetFaintAi(battlerDef, battlerAtk))) { return 2; // good idea to flinch } @@ -3666,7 +3665,7 @@ bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 mo bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) { - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) + if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) { // using item or user goes first s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; @@ -3698,7 +3697,7 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) healAmount = maxHP; if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) healAmount = 0; - if (AI_IsFaster(battlerAtk, battlerDef, move)) + if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) { if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) @@ -4040,17 +4039,17 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl return dmg.median; } -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 moveConsidered) +u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) { struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); gBattleMons[battlerAtk] = switchinCandidate; SetBattlerAiData(battlerAtk, gAiLogicData); - u32 aiMonFaster = AI_IsFaster(battlerAtk, battlerDef, moveConsidered); + u32 aiWhoStrikesFirst = AI_WhoStrikesFirst(battlerAtk, battlerDef, aiMoveConsidered, playerMoveConsidered, considerPriority); FreeRestoreBattleMons(savedBattleMons); SetBattlerAiData(battlerAtk, gAiLogicData); - return aiMonFaster; + return aiWhoStrikesFirst; } s32 CountUsablePartyMons(u32 battlerId) @@ -4291,7 +4290,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, { enum AIScore tempScore = NO_INCREASE; u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk); - u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, TRUE); + u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; u32 statId = GetStatBeingChanged(statChange); @@ -4841,7 +4840,7 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str else { // will we go first? - if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove, GetIncomingMove(battler, opposingBattler, gAiLogicData), CONSIDER_PRIORITY) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) return USE_GIMMICK; } } @@ -4954,7 +4953,7 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); - if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move)) + if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY)) ADJUST_SCORE_PTR(-10); if (gBattleMons[battlerDef].volatiles.substitute) ADJUST_SCORE_PTR(GOOD_EFFECT); @@ -4970,6 +4969,8 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st u32 preventsStatLoss; u32 partnerAbility; u32 partnerHoldEffect = aiData->holdEffects[battlerAtkPartner]; + u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); + u32 opposingBattler = GetBattlerAtPosition(opposingPosition); if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) partnerAbility = ABILITY_NONE; @@ -5002,7 +5003,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st } return (preventsStatLoss - && AI_IsFaster(battlerAtk, battlerAtkPartner, TRUE) + && AI_IsFaster(battlerAtk, battlerAtkPartner, MOVE_NONE, GetIncomingMove(battlerAtk, opposingBattler, gAiLogicData), CONSIDER_PRIORITY) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)); } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 25999df746..4c65a23489 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -1010,3 +1010,15 @@ AI_SINGLE_BATTLE_TEST("AI will use recovery move if is in no immediate danger be TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_RECOVER); } } } + +AI_SINGLE_BATTLE_TEST("AI has a chance to prioritize last chance priority damage over slow KO") +{ + PASSES_RANDOMLY(PRIORITIZE_LAST_CHANCE_CHANCE, 100, RNG_AI_PRIORITIZE_LAST_CHANCE); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CAMERUPT) { Speed(2); Moves(MOVE_FLAMETHROWER, MOVE_CELEBRATE); } + OPPONENT(SPECIES_FLOATZEL) { Level(90); Speed(1); HP(1); Moves(MOVE_WAVE_CRASH, MOVE_AQUA_JET); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_AQUA_JET); } + } +} diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 4d1fa5d746..4c05c620a5 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1164,6 +1164,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves ASSUME(GetMoveType(MOVE_RETURN) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_DRAIN_PUNCH) == TYPE_FIGHTING); ASSUME(gSpeciesInfo[SPECIES_MAROWAK_ALOLA].types[1] == TYPE_GHOST); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_MAROWAK_ALOLA) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_SHADOW_BONE); } OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_FAKE_OUT, MOVE_RETURN, MOVE_DRAIN_PUNCH, MOVE_THUNDER_PUNCH); Ability(ABILITY_LIMBER); } OPPONENT(SPECIES_CHANDELURE) { Moves(MOVE_SHADOW_BALL); } @@ -1299,3 +1300,42 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immu TURN { MOVE(player, MOVE_KARATE_CHOP); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out due to bad odds if it can OHKO with a priority move") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_CETODDLE) { Level(14); HP(30); Speed(1); Moves(MOVE_ICE_FANG, MOVE_ROCK_SMASH, MOVE_BULLDOZE, MOVE_ICE_SHARD); } + OPPONENT(SPECIES_SPHEAL) { Level(14); Speed(1); Ability(ABILITY_THICK_FAT); Moves(MOVE_ICY_WIND, MOVE_BRINE, MOVE_HIDDEN_POWER, MOVE_SIGNAL_BEAM); } + PLAYER(SPECIES_LITTEN) { Level(15); HP(1); Speed(2); Ability(ABILITY_BLAZE); Moves(MOVE_FIRE_FANG, MOVE_EMBER, MOVE_LICK, MOVE_FAKE_OUT); } + } WHEN { + TURN { MOVE(player, MOVE_FIRE_FANG); EXPECT_MOVE(opponent, MOVE_ICE_SHARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider player's priority when evaluating switchin candidates") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); HP(1); Moves(MOVE_HEADBUTT); } + OPPONENT(SPECIES_ANNIHILAPE) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Moves(MOVE_SUCKER_PUNCH, MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_MOVE(opponent, MOVE_HEADBUTT); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's priority when evaluating Bad Odds 1v1") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + OPPONENT(SPECIES_SCRAFTY) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Moves(MOVE_SUCKER_PUNCH, MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_SWITCH(opponent, 1); } + } +} From b12fcd8c7e4818b5d18f6f22f9c5c2930a7addf5 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 26 Jul 2025 13:59:17 -0400 Subject: [PATCH 166/248] Fix dynamic move types in switching (#7415) --- include/config/ai.h | 1 + include/random.h | 1 + src/battle_ai_switch_items.c | 6 ++++-- test/battle/ai/ai_switching.c | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index c82e46773a..d5f42696eb 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -13,6 +13,7 @@ // AI smart switching chances; if you want more complex behaviour, modify GetSwitchChance #define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100 +#define SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE 50 #define SHOULD_SWITCH_TRAPPER_PERCENTAGE 100 #define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 100 #define STAY_IN_ABSORBING_PERCENTAGE 66 // Chance to stay in if outgoing mon has super effective move against player, will prevent switching out for an absorber with this likelihood diff --git a/include/random.h b/include/random.h index 38a464e457..283813b1b1 100644 --- a/include/random.h +++ b/include/random.h @@ -192,6 +192,7 @@ enum RandomTag RNG_AI_SWITCH_ALL_MOVES_BAD, RNG_AI_CONSERVE_TERA, RNG_AI_SWITCH_ALL_SCORES_BAD, + RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, RNG_AI_PP_STALL_DISREGARD_MOVE, RNG_AI_SUCKER_PUNCH, RNG_SHELL_SIDE_ARM, diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 7c5348176f..526c81c7ca 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -481,12 +481,14 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) u16 monAbility, aiMove; u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); - u32 incomingType = GetMoveType(incomingMove); + u32 incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE); bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); s32 i, j; if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; + if (GetMoveEffect(incomingMove) == EFFECT_HIDDEN_POWER && RandomPercentage(RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE)) + return FALSE; if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species && !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE)) // AI mon has changed, player's behaviour no longer reliable; override this if using AI_FLAG_PREDICT_MOVE return FALSE; if (CanUseSuperEffectiveMoveAgainstOpponents(battler) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || gAiLogicData->aiPredictionInProgress)) @@ -1034,7 +1036,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) bool32 moveAffectsTarget = TRUE; if (lastUsedMove != MOVE_NONE && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) - || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), AI_CHECK) + || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, CheckDynamicMoveType(GetBattlerMon(battler), lastUsedMove, battler, MON_IN_BATTLE), AI_CHECK) || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, AI_CHECK))) moveAffectsTarget = FALSE; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 4c05c620a5..e8eb9f7ec4 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1339,3 +1339,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's priori TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider Hidden Power when triggering absorbing switches") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER); + GIVEN { + ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HIDDEN_POWER); HPIV(31); AttackIV(30); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_NINETALES) { Moves(MOVE_SCRATCH); Ability(ABILITY_FLASH_FIRE); } + } WHEN { + TURN { MOVE(player, MOVE_HIDDEN_POWER); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_HIDDEN_POWER); EXPECT_SWITCH(opponent, 1); } + } +} From 7c6cff1fb3f93e0b8220db34269c74bb81183c84 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Mon, 28 Jul 2025 13:42:28 +0300 Subject: [PATCH 167/248] Get/SetMonData optimisation (#7313) --- include/gba/defines.h | 1 + include/pokemon.h | 10 +- src/pokemon.c | 596 +++++++++++++++++++++--------------------- test/pokemon.c | 25 ++ 4 files changed, 326 insertions(+), 306 deletions(-) diff --git a/include/gba/defines.h b/include/gba/defines.h index 674c5fdc14..754e95a6dd 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -26,6 +26,7 @@ #define ALIGNED(n) __attribute__((aligned(n))) #define PACKED __attribute__((packed)) #define TRANSPARENT __attribute__ ((__transparent_union__)) +#define ALWAYS_INLINE inline __attribute__((always_inline)) #define NONNULL __attribute__((__nonnull__)) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) diff --git a/include/pokemon.h b/include/pokemon.h index ac525624cc..f3eea90000 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -16,7 +16,7 @@ #define FORM_SPECIES_END (0xffff) // Property labels for Get(Box)MonData / Set(Box)MonData -enum { +enum MonData { MON_DATA_PERSONALITY, MON_DATA_STATUS, MON_DATA_OT_ID, @@ -232,6 +232,14 @@ struct PokemonSubstruct3 max(sizeof(struct PokemonSubstruct2), \ sizeof(struct PokemonSubstruct3))))) +enum SubstructType +{ + SUBSTRUCT_TYPE_0, + SUBSTRUCT_TYPE_1, + SUBSTRUCT_TYPE_2, + SUBSTRUCT_TYPE_3, +}; + union PokemonSubstruct { struct PokemonSubstruct0 type0; diff --git a/src/pokemon.c b/src/pokemon.c index 6433acd701..8ddfd5d5b4 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -76,7 +76,9 @@ struct SpeciesItem }; static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); -static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); +static u16 CalculateBoxMonChecksumDecrypt(struct BoxPokemon *boxMon); +static u16 CalculateBoxMonChecksumReencrypt(struct BoxPokemon *boxMon); +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, enum SubstructType substructType); static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DecryptBoxMon(struct BoxPokemon *boxMon); static void Task_PlayMapChosenOrBattleBGM(u8 taskId); @@ -1656,24 +1658,36 @@ void CreateEnemyEventMon(void) static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) { - u16 checksum = 0; - union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); - union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); - union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); - union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); - s32 i; + u32 checksum = 0; - for (i = 0; i < (s32)ARRAY_COUNT(substruct0->raw); i++) - checksum += substruct0->raw[i]; + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); - for (i = 0; i < (s32)ARRAY_COUNT(substruct1->raw); i++) - checksum += substruct1->raw[i]; + return checksum; +} - for (i = 0; i < (s32)ARRAY_COUNT(substruct2->raw); i++) - checksum += substruct2->raw[i]; +static u16 CalculateBoxMonChecksumDecrypt(struct BoxPokemon *boxMon) +{ + u32 checksum = 0; - for (i = 0; i < (s32)ARRAY_COUNT(substruct3->raw); i++) - checksum += substruct3->raw[i]; + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + { + boxMon->secure.raw[i] ^= (boxMon->otId ^ boxMon->personality); + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); + } + + return checksum; +} + +static u16 CalculateBoxMonChecksumReencrypt(struct BoxPokemon *boxMon) +{ + u32 checksum = 0; + + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + { + checksum += boxMon->secure.raw[i] + (boxMon->secure.raw[i] >> 16); + boxMon->secure.raw[i] ^= (boxMon->otId ^ boxMon->personality); + } return checksum; } @@ -2194,8 +2208,7 @@ void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPositio static void EncryptBoxMon(struct BoxPokemon *boxMon) { - u32 i; - for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->personality; boxMon->secure.raw[i] ^= boxMon->otId; @@ -2204,70 +2217,26 @@ static void EncryptBoxMon(struct BoxPokemon *boxMon) static void DecryptBoxMon(struct BoxPokemon *boxMon) { - u32 i; - for (i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) + for (u32 i = 0; i < ARRAY_COUNT(boxMon->secure.raw); i++) { boxMon->secure.raw[i] ^= boxMon->otId; boxMon->secure.raw[i] ^= boxMon->personality; } } -#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ -case n: \ - { \ - \ - switch (substructType) \ - { \ - case 0: \ - substruct = &boxMon->secure.substructs[v1]; \ - break; \ - case 1: \ - substruct = &boxMon->secure.substructs[v2]; \ - break; \ - case 2: \ - substruct = &boxMon->secure.substructs[v3]; \ - break; \ - case 3: \ - substruct = &boxMon->secure.substructs[v4]; \ - break; \ - } \ - break; \ - } \ - - -static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) +static const u8 sSubstructOffsets[4][24] = { - union PokemonSubstruct *substruct = NULL; + [SUBSTRUCT_TYPE_0] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}, + [SUBSTRUCT_TYPE_1] = {1, 1, 2, 2, 3, 3, 0, 0, 2, 2, 3, 3, 0, 0, 1, 1, 3, 3, 0, 0, 1, 1, 2, 2}, + [SUBSTRUCT_TYPE_2] = {2, 3, 1, 3, 1, 2, 2, 3, 0, 3, 0, 2, 1, 3, 0, 3, 0, 1, 1, 2, 0, 2, 0, 1}, + [SUBSTRUCT_TYPE_3] = {3, 2, 3, 1, 2, 1, 3, 2, 3, 0, 2, 0, 3, 1, 3, 0, 1, 0, 2, 1, 2, 0, 1, 0} +}; - switch (personality % 24) - { - SUBSTRUCT_CASE( 0,0,1,2,3) - SUBSTRUCT_CASE( 1,0,1,3,2) - SUBSTRUCT_CASE( 2,0,2,1,3) - SUBSTRUCT_CASE( 3,0,3,1,2) - SUBSTRUCT_CASE( 4,0,2,3,1) - SUBSTRUCT_CASE( 5,0,3,2,1) - SUBSTRUCT_CASE( 6,1,0,2,3) - SUBSTRUCT_CASE( 7,1,0,3,2) - SUBSTRUCT_CASE( 8,2,0,1,3) - SUBSTRUCT_CASE( 9,3,0,1,2) - SUBSTRUCT_CASE(10,2,0,3,1) - SUBSTRUCT_CASE(11,3,0,2,1) - SUBSTRUCT_CASE(12,1,2,0,3) - SUBSTRUCT_CASE(13,1,3,0,2) - SUBSTRUCT_CASE(14,2,1,0,3) - SUBSTRUCT_CASE(15,3,1,0,2) - SUBSTRUCT_CASE(16,2,3,0,1) - SUBSTRUCT_CASE(17,3,2,0,1) - SUBSTRUCT_CASE(18,1,2,3,0) - SUBSTRUCT_CASE(19,1,3,2,0) - SUBSTRUCT_CASE(20,2,1,3,0) - SUBSTRUCT_CASE(21,3,1,2,0) - SUBSTRUCT_CASE(22,2,3,1,0) - SUBSTRUCT_CASE(23,3,2,1,0) - } +ARM_FUNC NOINLINE static u32 ConstantMod24(u32 a) { return a % 24; } - return substruct; +static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, enum SubstructType substructType) +{ + return &boxMon->secure.substructs[sSubstructOffsets[substructType][ConstantMod24(personality)]]; } /* GameFreak called GetMonData with either 2 or 3 arguments, for type @@ -2337,19 +2306,58 @@ u32 GetMonData2(struct Pokemon *mon, s32 field) return GetMonData3(mon, field, NULL); } -struct EvolutionTrackerBitfield -{ - u16 a: 5; - u16 b: 5; - u16 unused: 6; -}; union EvolutionTracker { - u16 value; - struct EvolutionTrackerBitfield asField; + u16 combinedValue:10; + struct { + u16 tracker1: 5; + u16 tracker2: 5; + }; }; +static ALWAYS_INLINE struct PokemonSubstruct0 *GetSubstruct0(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_0)->type0); +} + +static ALWAYS_INLINE struct PokemonSubstruct1 *GetSubstruct1(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_1)->type1); +} + +static ALWAYS_INLINE struct PokemonSubstruct2 *GetSubstruct2(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_2)->type2); +} + +static ALWAYS_INLINE struct PokemonSubstruct3 *GetSubstruct3(struct BoxPokemon *boxMon) +{ + return &(GetSubstruct(boxMon, boxMon->personality, SUBSTRUCT_TYPE_3)->type3); +} + +static bool32 IsBadEgg(struct BoxPokemon *boxMon) +{ + if (boxMon->isBadEgg) + return TRUE; + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = TRUE; + boxMon->isEgg = TRUE; + GetSubstruct3(boxMon)->isEgg = TRUE; + + return TRUE; + } + + return FALSE; +} + +static ALWAYS_INLINE bool32 IsEggOrBadEgg(struct BoxPokemon *boxMon) +{ + return GetSubstruct3(boxMon)->isEgg || IsBadEgg(boxMon); +} + /* GameFreak called GetBoxMonData with either 2 or 3 arguments, for type * safety we have a GetBoxMonData macro (in include/pokemon.h) which * dispatches to either GetBoxMonData2 or GetBoxMonData3 based on the @@ -2358,35 +2366,18 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) { s32 i; u32 retVal = 0; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - union EvolutionTracker evoTracker; // Any field greater than MON_DATA_ENCRYPT_SEPARATOR is encrypted and must be treated as such if (field > MON_DATA_ENCRYPT_SEPARATOR) { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - DecryptBoxMon(boxMon); - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = TRUE; - boxMon->isEgg = TRUE; - substruct3->isEgg = TRUE; - } - switch (field) { case MON_DATA_NICKNAME: case MON_DATA_NICKNAME10: { - if (boxMon->isBadEgg) + if (IsBadEgg(boxMon)) { for (retVal = 0; retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS; @@ -2425,6 +2416,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) // so if both are 0 we assume that this is a vanilla // Pokémon and replace them with EOS. This means that // two CHAR_SPACE at the end of a nickname are trimmed. + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); if (field != MON_DATA_NICKNAME10 && POKEMON_NAME_LENGTH >= 12) { if (substruct0->nickname11 == 0 && substruct0->nickname12 == 0) @@ -2455,182 +2447,184 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) break; } case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + retVal = IsBadEgg(boxMon) ? SPECIES_EGG : GetSubstruct0(boxMon)->species; break; case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; + retVal = GetSubstruct0(boxMon)->heldItem; break; case MON_DATA_EXP: - retVal = substruct0->experience; + retVal = GetSubstruct0(boxMon)->experience; break; case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; + retVal = GetSubstruct0(boxMon)->ppBonuses; break; case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; + retVal = GetSubstruct0(boxMon)->friendship; break; case MON_DATA_MOVE1: - retVal = substruct1->move1; + retVal = GetSubstruct1(boxMon)->move1; break; case MON_DATA_MOVE2: - retVal = substruct1->move2; + retVal = GetSubstruct1(boxMon)->move2; break; case MON_DATA_MOVE3: - retVal = substruct1->move3; + retVal = GetSubstruct1(boxMon)->move3; break; case MON_DATA_MOVE4: - retVal = substruct1->move4; + retVal = GetSubstruct1(boxMon)->move4; break; case MON_DATA_PP1: - retVal = substruct1->pp1; + retVal = GetSubstruct1(boxMon)->pp1; break; case MON_DATA_PP2: - retVal = substruct1->pp2; + retVal = GetSubstruct1(boxMon)->pp2; break; case MON_DATA_PP3: - retVal = substruct1->pp3; + retVal = GetSubstruct1(boxMon)->pp3; break; case MON_DATA_PP4: - retVal = substruct1->pp4; + retVal = GetSubstruct1(boxMon)->pp4; break; case MON_DATA_HP_EV: - retVal = substruct2->hpEV; + retVal = GetSubstruct2(boxMon)->hpEV; break; case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; + retVal = GetSubstruct2(boxMon)->attackEV; break; case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; + retVal = GetSubstruct2(boxMon)->defenseEV; break; case MON_DATA_SPEED_EV: - retVal = substruct2->speedEV; + retVal = GetSubstruct2(boxMon)->speedEV; break; case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; + retVal = GetSubstruct2(boxMon)->spAttackEV; break; case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; + retVal = GetSubstruct2(boxMon)->spDefenseEV; break; case MON_DATA_COOL: - retVal = substruct2->cool; + retVal = GetSubstruct2(boxMon)->cool; break; case MON_DATA_BEAUTY: - retVal = substruct2->beauty; + retVal = GetSubstruct2(boxMon)->beauty; break; case MON_DATA_CUTE: - retVal = substruct2->cute; + retVal = GetSubstruct2(boxMon)->cute; break; case MON_DATA_SMART: - retVal = substruct2->smart; + retVal = GetSubstruct2(boxMon)->smart; break; case MON_DATA_TOUGH: - retVal = substruct2->tough; + retVal = GetSubstruct2(boxMon)->tough; break; case MON_DATA_SHEEN: - retVal = substruct2->sheen; + retVal = GetSubstruct2(boxMon)->sheen; break; case MON_DATA_POKERUS: - retVal = substruct3->pokerus; + retVal = GetSubstruct3(boxMon)->pokerus; break; case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; + retVal = GetSubstruct3(boxMon)->metLocation; break; case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; + retVal = GetSubstruct3(boxMon)->metLevel; break; case MON_DATA_MET_GAME: - retVal = substruct3->metGame; + retVal = GetSubstruct3(boxMon)->metGame; break; case MON_DATA_POKEBALL: - retVal = substruct0->pokeball; + retVal = GetSubstruct0(boxMon)->pokeball; break; case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; + retVal = GetSubstruct3(boxMon)->otGender; break; case MON_DATA_HP_IV: - retVal = substruct3->hpIV; + retVal = GetSubstruct3(boxMon)->hpIV; break; case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; + retVal = GetSubstruct3(boxMon)->attackIV; break; case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; + retVal = GetSubstruct3(boxMon)->defenseIV; break; case MON_DATA_SPEED_IV: - retVal = substruct3->speedIV; + retVal = GetSubstruct3(boxMon)->speedIV; break; case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; + retVal = GetSubstruct3(boxMon)->spAttackIV; break; case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; + retVal = GetSubstruct3(boxMon)->spDefenseIV; break; case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; + retVal = IsEggOrBadEgg(boxMon); break; case MON_DATA_ABILITY_NUM: - retVal = substruct3->abilityNum; + retVal = GetSubstruct3(boxMon)->abilityNum; break; case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; + retVal = GetSubstruct3(boxMon)->coolRibbon; break; case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; + retVal = GetSubstruct3(boxMon)->beautyRibbon; break; case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; + retVal = GetSubstruct3(boxMon)->cuteRibbon; break; case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; + retVal = GetSubstruct3(boxMon)->smartRibbon; break; case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; + retVal = GetSubstruct3(boxMon)->toughRibbon; break; case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; + retVal = GetSubstruct3(boxMon)->championRibbon; break; case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; + retVal = GetSubstruct3(boxMon)->winningRibbon; break; case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; + retVal = GetSubstruct3(boxMon)->victoryRibbon; break; case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; + retVal = GetSubstruct3(boxMon)->artistRibbon; break; case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; + retVal = GetSubstruct3(boxMon)->effortRibbon; break; case MON_DATA_MARINE_RIBBON: - retVal = substruct3->marineRibbon; + retVal = GetSubstruct3(boxMon)->marineRibbon; break; case MON_DATA_LAND_RIBBON: - retVal = substruct3->landRibbon; + retVal = GetSubstruct3(boxMon)->landRibbon; break; case MON_DATA_SKY_RIBBON: - retVal = substruct3->skyRibbon; + retVal = GetSubstruct3(boxMon)->skyRibbon; break; case MON_DATA_COUNTRY_RIBBON: - retVal = substruct3->countryRibbon; + retVal = GetSubstruct3(boxMon)->countryRibbon; break; case MON_DATA_NATIONAL_RIBBON: - retVal = substruct3->nationalRibbon; + retVal = GetSubstruct3(boxMon)->nationalRibbon; break; case MON_DATA_EARTH_RIBBON: - retVal = substruct3->earthRibbon; + retVal = GetSubstruct3(boxMon)->earthRibbon; break; case MON_DATA_WORLD_RIBBON: - retVal = substruct3->worldRibbon; + retVal = GetSubstruct3(boxMon)->worldRibbon; break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - retVal = substruct3->modernFatefulEncounter; + retVal = GetSubstruct3(boxMon)->modernFatefulEncounter; break; case MON_DATA_SPECIES_OR_EGG: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = GetSubstruct0(boxMon)->species; + if (retVal && IsEggOrBadEgg(boxMon)) retVal = SPECIES_EGG; break; case MON_DATA_IVS: + { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) @@ -2638,9 +2632,11 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); break; + } case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); u16 *moves = (u16 *)data; s32 i = 0; @@ -2657,9 +2653,10 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) } break; case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); + retVal = 0; retVal += substruct3->coolRibbon; retVal += substruct3->beautyRibbon; retVal += substruct3->cuteRibbon; @@ -2680,75 +2677,81 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) } break; case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) + if (GetSubstruct0(boxMon)->species && !IsEggOrBadEgg(boxMon)) { + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->marineRibbon << 20) - | (substruct3->landRibbon << 21) - | (substruct3->skyRibbon << 22) - | (substruct3->countryRibbon << 23) - | (substruct3->nationalRibbon << 24) - | (substruct3->earthRibbon << 25) - | (substruct3->worldRibbon << 26); + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->marineRibbon << 20) + | (substruct3->landRibbon << 21) + | (substruct3->skyRibbon << 22) + | (substruct3->countryRibbon << 23) + | (substruct3->nationalRibbon << 24) + | (substruct3->earthRibbon << 25) + | (substruct3->worldRibbon << 26); } break; case MON_DATA_HYPER_TRAINED_HP: - retVal = substruct1->hyperTrainedHP; + retVal = GetSubstruct1(boxMon)->hyperTrainedHP; break; case MON_DATA_HYPER_TRAINED_ATK: - retVal = substruct1->hyperTrainedAttack; + retVal = GetSubstruct1(boxMon)->hyperTrainedAttack; break; case MON_DATA_HYPER_TRAINED_DEF: - retVal = substruct1->hyperTrainedDefense; + retVal = GetSubstruct1(boxMon)->hyperTrainedDefense; break; case MON_DATA_HYPER_TRAINED_SPEED: - retVal = substruct1->hyperTrainedSpeed; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpeed; break; case MON_DATA_HYPER_TRAINED_SPATK: - retVal = substruct1->hyperTrainedSpAttack; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpAttack; break; case MON_DATA_HYPER_TRAINED_SPDEF: - retVal = substruct1->hyperTrainedSpDefense; + retVal = GetSubstruct1(boxMon)->hyperTrainedSpDefense; break; case MON_DATA_IS_SHADOW: - retVal = substruct3->isShadow; + retVal = GetSubstruct3(boxMon)->isShadow; break; case MON_DATA_DYNAMAX_LEVEL: - retVal = substruct3->dynamaxLevel; + retVal = GetSubstruct3(boxMon)->dynamaxLevel; break; case MON_DATA_GIGANTAMAX_FACTOR: - retVal = substruct3->gigantamaxFactor; + retVal = GetSubstruct3(boxMon)->gigantamaxFactor; break; case MON_DATA_TERA_TYPE: - if (gSpeciesInfo[substruct0->species].forceTeraType) { - retVal = gSpeciesInfo[substruct0->species].forceTeraType; - } - else if (substruct0->teraType == TYPE_NONE) // Tera Type hasn't been modified so we can just use the personality - { - const u8 *types = gSpeciesInfo[substruct0->species].types; - retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; - } - else - { - retVal = substruct0->teraType; + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); + if (gSpeciesInfo[substruct0->species].forceTeraType) + { + retVal = gSpeciesInfo[substruct0->species].forceTeraType; + } + else if (substruct0->teraType == TYPE_NONE) // Tera Type hasn't been modified so we can just use the personality + { + const u8 *types = gSpeciesInfo[substruct0->species].types; + retVal = (boxMon->personality & 0x1) == 0 ? types[0] : types[1]; + } + else + { + retVal = substruct0->teraType; + } } break; case MON_DATA_EVOLUTION_TRACKER: - evoTracker.asField.a = substruct1->evolutionTracker1; - evoTracker.asField.b = substruct1->evolutionTracker2; - evoTracker.asField.unused = 0; - retVal = evoTracker.value; + { + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); + retVal = (union EvolutionTracker) { + .tracker1 = substruct1->evolutionTracker1, + .tracker2 = substruct1->evolutionTracker2, + }.combinedValue; + } break; default: break; @@ -2898,25 +2901,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) { const u8 *data = dataArg; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - if (field > MON_DATA_ENCRYPT_SEPARATOR) { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + if (CalculateBoxMonChecksumDecrypt(boxMon) != boxMon->checksum) { boxMon->isBadEgg = TRUE; boxMon->isEgg = TRUE; - substruct3->isEgg = TRUE; + GetSubstruct3(boxMon)->isEgg = TRUE; EncryptBoxMon(boxMon); return; } @@ -2927,6 +2918,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_NICKNAME10: { s32 i; + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); for (i = 0; i < min(sizeof(boxMon->nickname), POKEMON_NAME_LENGTH); i++) boxMon->nickname[i] = data[i]; if (field != MON_DATA_NICKNAME10) @@ -2945,6 +2937,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) } case MON_DATA_SPECIES: { + struct PokemonSubstruct0 *substruct0 = GetSubstruct0(boxMon); SET16(substruct0->species); if (substruct0->species) boxMon->hasSpecies = TRUE; @@ -2953,180 +2946,178 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; } case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); + SET16(GetSubstruct0(boxMon)->heldItem); break; case MON_DATA_EXP: - SET32(substruct0->experience); + SET32(GetSubstruct0(boxMon)->experience); break; case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); + SET8(GetSubstruct0(boxMon)->ppBonuses); break; case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); + SET8(GetSubstruct0(boxMon)->friendship); break; case MON_DATA_MOVE1: - SET16(substruct1->move1); + SET16(GetSubstruct1(boxMon)->move1); break; case MON_DATA_MOVE2: - SET16(substruct1->move2); + SET16(GetSubstruct1(boxMon)->move2); break; case MON_DATA_MOVE3: - SET16(substruct1->move3); + SET16(GetSubstruct1(boxMon)->move3); break; case MON_DATA_MOVE4: - SET16(substruct1->move4); + SET16(GetSubstruct1(boxMon)->move4); break; case MON_DATA_PP1: - SET8(substruct1->pp1); + SET8(GetSubstruct1(boxMon)->pp1); break; case MON_DATA_PP2: - SET8(substruct1->pp2); + SET8(GetSubstruct1(boxMon)->pp2); break; case MON_DATA_PP3: - SET8(substruct1->pp3); + SET8(GetSubstruct1(boxMon)->pp3); break; case MON_DATA_PP4: - SET8(substruct1->pp4); + SET8(GetSubstruct1(boxMon)->pp4); break; case MON_DATA_HP_EV: - SET8(substruct2->hpEV); + SET8(GetSubstruct2(boxMon)->hpEV); break; case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); + SET8(GetSubstruct2(boxMon)->attackEV); break; case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); + SET8(GetSubstruct2(boxMon)->defenseEV); break; case MON_DATA_SPEED_EV: - SET8(substruct2->speedEV); + SET8(GetSubstruct2(boxMon)->speedEV); break; case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); + SET8(GetSubstruct2(boxMon)->spAttackEV); break; case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); + SET8(GetSubstruct2(boxMon)->spDefenseEV); break; case MON_DATA_COOL: - SET8(substruct2->cool); + SET8(GetSubstruct2(boxMon)->cool); break; case MON_DATA_BEAUTY: - SET8(substruct2->beauty); + SET8(GetSubstruct2(boxMon)->beauty); break; case MON_DATA_CUTE: - SET8(substruct2->cute); + SET8(GetSubstruct2(boxMon)->cute); break; case MON_DATA_SMART: - SET8(substruct2->smart); + SET8(GetSubstruct2(boxMon)->smart); break; case MON_DATA_TOUGH: - SET8(substruct2->tough); + SET8(GetSubstruct2(boxMon)->tough); break; case MON_DATA_SHEEN: - SET8(substruct2->sheen); + SET8(GetSubstruct2(boxMon)->sheen); break; case MON_DATA_POKERUS: - SET8(substruct3->pokerus); + SET8(GetSubstruct3(boxMon)->pokerus); break; case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); + SET8(GetSubstruct3(boxMon)->metLocation); break; case MON_DATA_MET_LEVEL: - SET8(substruct3->metLevel); + SET8(GetSubstruct3(boxMon)->metLevel); break; case MON_DATA_MET_GAME: - SET8(substruct3->metGame); + SET8(GetSubstruct3(boxMon)->metGame); break; case MON_DATA_POKEBALL: - SET8(substruct0->pokeball); + SET8(GetSubstruct0(boxMon)->pokeball); break; case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); + SET8(GetSubstruct3(boxMon)->otGender); break; case MON_DATA_HP_IV: - SET8(substruct3->hpIV); + SET8(GetSubstruct3(boxMon)->hpIV); break; case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); + SET8(GetSubstruct3(boxMon)->attackIV); break; case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); + SET8(GetSubstruct3(boxMon)->defenseIV); break; case MON_DATA_SPEED_IV: - SET8(substruct3->speedIV); + SET8(GetSubstruct3(boxMon)->speedIV); break; case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); + SET8(GetSubstruct3(boxMon)->spAttackIV); break; case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); + SET8(GetSubstruct3(boxMon)->spDefenseIV); break; case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = TRUE; - else - boxMon->isEgg = FALSE; + SET8(GetSubstruct3(boxMon)->isEgg); + SET8(boxMon->isEgg); break; case MON_DATA_ABILITY_NUM: - SET8(substruct3->abilityNum); + SET8(GetSubstruct3(boxMon)->abilityNum); break; case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); + SET8(GetSubstruct3(boxMon)->coolRibbon); break; case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); + SET8(GetSubstruct3(boxMon)->beautyRibbon); break; case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); + SET8(GetSubstruct3(boxMon)->cuteRibbon); break; case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); + SET8(GetSubstruct3(boxMon)->smartRibbon); break; case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); + SET8(GetSubstruct3(boxMon)->toughRibbon); break; case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); + SET8(GetSubstruct3(boxMon)->championRibbon); break; case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); + SET8(GetSubstruct3(boxMon)->winningRibbon); break; case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); + SET8(GetSubstruct3(boxMon)->victoryRibbon); break; case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); + SET8(GetSubstruct3(boxMon)->artistRibbon); break; case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); + SET8(GetSubstruct3(boxMon)->effortRibbon); break; case MON_DATA_MARINE_RIBBON: - SET8(substruct3->marineRibbon); + SET8(GetSubstruct3(boxMon)->marineRibbon); break; case MON_DATA_LAND_RIBBON: - SET8(substruct3->landRibbon); + SET8(GetSubstruct3(boxMon)->landRibbon); break; case MON_DATA_SKY_RIBBON: - SET8(substruct3->skyRibbon); + SET8(GetSubstruct3(boxMon)->skyRibbon); break; case MON_DATA_COUNTRY_RIBBON: - SET8(substruct3->countryRibbon); + SET8(GetSubstruct3(boxMon)->countryRibbon); break; case MON_DATA_NATIONAL_RIBBON: - SET8(substruct3->nationalRibbon); + SET8(GetSubstruct3(boxMon)->nationalRibbon); break; case MON_DATA_EARTH_RIBBON: - SET8(substruct3->earthRibbon); + SET8(GetSubstruct3(boxMon)->earthRibbon); break; case MON_DATA_WORLD_RIBBON: - SET8(substruct3->worldRibbon); + SET8(GetSubstruct3(boxMon)->worldRibbon); break; case MON_DATA_MODERN_FATEFUL_ENCOUNTER: - SET8(substruct3->modernFatefulEncounter); + SET8(GetSubstruct3(boxMon)->modernFatefulEncounter); break; case MON_DATA_IVS: { u32 ivs; + struct PokemonSubstruct3 *substruct3 = GetSubstruct3(boxMon); SET32(ivs); substruct3->hpIV = ivs & MAX_IV_MASK; substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; @@ -3137,43 +3128,42 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; } case MON_DATA_HYPER_TRAINED_HP: - SET8(substruct1->hyperTrainedHP); + SET8(GetSubstruct1(boxMon)->hyperTrainedHP); break; case MON_DATA_HYPER_TRAINED_ATK: - SET8(substruct1->hyperTrainedAttack); + SET8(GetSubstruct1(boxMon)->hyperTrainedAttack); break; case MON_DATA_HYPER_TRAINED_DEF: - SET8(substruct1->hyperTrainedDefense); + SET8(GetSubstruct1(boxMon)->hyperTrainedDefense); break; case MON_DATA_HYPER_TRAINED_SPEED: - SET8(substruct1->hyperTrainedSpeed); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpeed); break; case MON_DATA_HYPER_TRAINED_SPATK: - SET8(substruct1->hyperTrainedSpAttack); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpAttack); break; case MON_DATA_HYPER_TRAINED_SPDEF: - SET8(substruct1->hyperTrainedSpDefense); + SET8(GetSubstruct1(boxMon)->hyperTrainedSpDefense); break; case MON_DATA_IS_SHADOW: - SET8(substruct3->isShadow); + SET8(GetSubstruct3(boxMon)->isShadow); break; case MON_DATA_DYNAMAX_LEVEL: - SET8(substruct3->dynamaxLevel); + SET8(GetSubstruct3(boxMon)->dynamaxLevel); break; case MON_DATA_GIGANTAMAX_FACTOR: - SET8(substruct3->gigantamaxFactor); + SET8(GetSubstruct3(boxMon)->gigantamaxFactor); break; case MON_DATA_TERA_TYPE: - SET8(substruct0->teraType); + SET8(GetSubstruct0(boxMon)->teraType); break; case MON_DATA_EVOLUTION_TRACKER: { union EvolutionTracker evoTracker; - u32 evoTrackerValue; - SET32(evoTrackerValue); - evoTracker.value = evoTrackerValue; - substruct1->evolutionTracker1 = evoTracker.asField.a; - substruct1->evolutionTracker2 = evoTracker.asField.b; + struct PokemonSubstruct1 *substruct1 = GetSubstruct1(boxMon); + SET32(evoTracker.combinedValue); + substruct1->evolutionTracker1 = evoTracker.tracker1; + substruct1->evolutionTracker2 = evoTracker.tracker2; break; } default: @@ -3248,10 +3238,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) } if (field > MON_DATA_ENCRYPT_SEPARATOR) - { - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); - } + boxMon->checksum = CalculateBoxMonChecksumReencrypt(boxMon); } void CopyMon(void *dest, void *src, size_t size) @@ -6939,15 +6926,15 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality) u32 teraType = GetBoxMonData(boxMon, MON_DATA_TERA_TYPE, NULL); old = *boxMon; - old0 = &(GetSubstruct(&old, old.personality, 0)->type0); - old1 = &(GetSubstruct(&old, old.personality, 1)->type1); - old2 = &(GetSubstruct(&old, old.personality, 2)->type2); - old3 = &(GetSubstruct(&old, old.personality, 3)->type3); + old0 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_0)->type0); + old1 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_1)->type1); + old2 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_2)->type2); + old3 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_3)->type3); - new0 = &(GetSubstruct(boxMon, personality, 0)->type0); - new1 = &(GetSubstruct(boxMon, personality, 1)->type1); - new2 = &(GetSubstruct(boxMon, personality, 2)->type2); - new3 = &(GetSubstruct(boxMon, personality, 3)->type3); + new0 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_0)->type0); + new1 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_1)->type1); + new2 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_2)->type2); + new3 = &(GetSubstruct(boxMon, personality, SUBSTRUCT_TYPE_3)->type3); DecryptBoxMon(&old); boxMon->personality = personality; @@ -6955,8 +6942,7 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality) *new1 = *old1; *new2 = *old2; *new3 = *old3; - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); + boxMon->checksum = CalculateBoxMonChecksumReencrypt(boxMon); SetBoxMonData(boxMon, MON_DATA_IS_SHINY, &isShiny); SetBoxMonData(boxMon, MON_DATA_HIDDEN_NATURE, &hiddenNature); diff --git a/test/pokemon.c b/test/pokemon.c index 00a4a4485b..c83b42e478 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -450,3 +450,28 @@ TEST("Pokémon level up learnsets fit within MAX_LEVEL_UP_MOVES and MAX_RELEARNE EXPECT_LT(count, MAX_LEVEL_UP_MOVES); EXPECT_LT(count, MAX_RELEARNER_MOVES - 1); // - 1 because at least one move is already known } + +TEST("Optimised GetMonData") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + u32 exp = 0x123456; + SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); + struct Benchmark optimised, + vanilla = (struct Benchmark) { .ticks = 137 }; // From prior testing + u32 expGet = 0; + BENCHMARK(&optimised) { expGet = GetMonData(&gPlayerParty[0], MON_DATA_EXP); } + EXPECT_EQ(exp, expGet); + EXPECT_FASTER(optimised, vanilla); +} + +TEST("Optimised SetMonData") +{ + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + u32 exp = 0x123456; + struct Benchmark optimised, + vanilla = (struct Benchmark) { .ticks = 205 }; // From prior testing + BENCHMARK(&optimised) { SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); } + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_BAD_EGG), FALSE); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EXP), exp); + EXPECT_FASTER(optimised, vanilla); +} From 1fbee7cce015163786581e3885b943a42c10ead3 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:10:34 +0100 Subject: [PATCH 168/248] fixed-damage-move-ai-calc-fix (#7385) --- include/battle_util.h | 1 + src/battle_ai_util.c | 7 ++++++- src/battle_util.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b9566e2512..272ccf3d1e 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -280,6 +280,7 @@ u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); s32 CalculateMoveDamage(struct DamageContext *ctx); s32 CalculateMoveDamageVars(struct DamageContext *ctx); +s32 DoFixedDamageMoveCalc(struct DamageContext *ctx); s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx); uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 4443aa1f59..dc766c9ee8 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -893,7 +893,12 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u AI_StoreBattlerTypes(battlerAtk, types); ProteanTryChangeType(battlerAtk, aiData->abilities[battlerAtk], move, ctx.moveType); - if (moveEffect == EFFECT_TRIPLE_KICK) + s32 fixedDamage = DoFixedDamageMoveCalc(&ctx); + if (fixedDamage != INT32_MAX) + { + simDamage.minimum = simDamage.median = simDamage.maximum = fixedDamage; + } + else if (moveEffect == EFFECT_TRIPLE_KICK) { for (gMultiHitCounter = GetMoveStrikeCount(move); gMultiHitCounter > 0; gMultiHitCounter--) // The global is used to simulate actual damage done { diff --git a/src/battle_util.c b/src/battle_util.c index 1346b9f0da..1c7a2b7073 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9392,7 +9392,7 @@ s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) return dmg; } -static inline s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) +s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) { s32 dmg = 0; s32 randDamage; From 689bf0bcbc090ebc733216ebc9309706a67bb483 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Tue, 29 Jul 2025 11:28:12 +0300 Subject: [PATCH 169/248] Fixed item swapping bug (#7428) (#7430) --- src/item.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item.c b/src/item.c index b25f38b058..4e7e514938 100644 --- a/src/item.c +++ b/src/item.c @@ -567,7 +567,7 @@ static inline void NONNULL BagPocket_MoveItemSlot(struct BagPocket *pocket, u32 BagPocket_GetSlotData(pocket, from, &fromItemId, &fromQuantity); // Shuffle items between "to" and "from" - for (u32 i = from; i == to - shift; i += shift) + for (u32 i = from; i != to; i += shift) { BagPocket_GetSlotData(pocket, i + shift, &tempItemId, &tempQuantity); BagPocket_SetSlotData(pocket, i, &tempItemId, &tempQuantity); From 2eeb346387f64fe2e6e414f71de12fb06e0ef7e1 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Tue, 29 Jul 2025 11:47:32 +0300 Subject: [PATCH 170/248] Bag refactor3 + Ghoulslash's sorting feature port (#7330) --- include/constants/item.h | 3 +- include/item.h | 74 +++++- include/item_menu.h | 12 +- src/data/items.h | 550 +++++++++++++++++++++++++++++++++++++++ src/item.c | 244 +++++++---------- src/item_menu.c | 397 ++++++++++++++++++++++++++-- src/menu_helpers.c | 3 +- test/bag.c | 49 +++- 8 files changed, 1141 insertions(+), 191 deletions(-) diff --git a/include/constants/item.h b/include/constants/item.h index bd35bdb861..2d8c3f9419 100644 --- a/include/constants/item.h +++ b/include/constants/item.h @@ -9,10 +9,9 @@ enum Pocket POCKET_BERRIES, POCKET_KEY_ITEMS, POCKETS_COUNT, + POCKET_DUMMY = POCKETS_COUNT, }; -#define POCKET_DUMMY POCKETS_COUNT - #define REPEL_LURE_MASK (1 << 15) #define IS_LAST_USED_LURE(var) (var & REPEL_LURE_MASK) #define REPEL_LURE_STEPS(var) (var & (REPEL_LURE_MASK - 1)) diff --git a/include/item.h b/include/item.h index 5622786c91..9cecce661a 100644 --- a/include/item.h +++ b/include/item.h @@ -44,6 +44,46 @@ enum TMHMIndex #undef UNPACK_TM_HM_ENUM +enum PACKED ItemSortType +{ + ITEM_TYPE_UNCATEGORIZED, + ITEM_TYPE_FIELD_USE, + ITEM_TYPE_LEVEL_UP_ITEM, + ITEM_TYPE_HEALTH_RECOVERY, + ITEM_TYPE_STATUS_RECOVERY, + ITEM_TYPE_PP_RECOVERY, + ITEM_TYPE_NATURE_MINT, + ITEM_TYPE_STAT_BOOST_DRINK, + ITEM_TYPE_STAT_BOOST_FEATHER, + ITEM_TYPE_STAT_BOOST_MOCHI, + ITEM_TYPE_BATTLE_ITEM, + ITEM_TYPE_FLUTE, + ITEM_TYPE_X_ITEM, + ITEM_TYPE_AUX_ITEM, + ITEM_TYPE_EVOLUTION_STONE, + ITEM_TYPE_EVOLUTION_ITEM, + ITEM_TYPE_SPECIAL_HELD_ITEM, + ITEM_TYPE_MEGA_STONE, + ITEM_TYPE_Z_CRYSTAL, + ITEM_TYPE_TERA_SHARD, + ITEM_TYPE_HELD_ITEM, + ITEM_TYPE_TYPE_BOOST_HELD_ITEM, + ITEM_TYPE_CONTEST_HELD_ITEM, + ITEM_TYPE_EV_BOOST_HELD_ITEM, + ITEM_TYPE_GEM, + ITEM_TYPE_PLATE, + ITEM_TYPE_MEMORY, + ITEM_TYPE_DRIVE, + ITEM_TYPE_INCENSE, + ITEM_TYPE_NECTAR, + ITEM_TYPE_GROWTH, + ITEM_TYPE_SHARD, + ITEM_TYPE_SELLABLE, + ITEM_TYPE_RELIC, + ITEM_TYPE_FOSSIL, + ITEM_TYPE_MAIL, +}; + typedef void (*ItemUseFunc)(u8); struct Item @@ -60,7 +100,7 @@ struct Item u8 importance:2; u8 notConsumed:1; enum Pocket pocket:5; - u8 padding; + enum ItemSortType sortType; u8 type; u8 battleUsage; u8 flingPower; @@ -139,16 +179,29 @@ static inline u16 GetTMHMMoveId(enum TMHMIndex index) return gTMHMItemMoveIds[index].moveId; } -enum SortPocket -{ - SORT_NONE, - SORT_POCKET_BY_ITEM_ID, - SORT_POCKET_TM_HM, -}; +void BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot); +struct ItemSlot BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos); + +static inline void BagPocket_SetSlotItemIdAndCount(struct BagPocket *pocket, u32 pocketPos, u16 itemId, u16 quantity) +{ + BagPocket_SetSlotData(pocket, pocketPos, (struct ItemSlot) {itemId, quantity}); +} + +static inline u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).itemId; +} + +static inline u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).quantity; +} + +static inline struct ItemSlot GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos) +{ + return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos); +} -void GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos, u16 *itemId, u16 *quantity); -u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos); -u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos); void ApplyNewEncryptionKeyToBagItems(u32 newKey); void SetBagItemsPointers(void); u8 *CopyItemName(u16 itemId, u8 *dst); @@ -168,7 +221,6 @@ void RemovePCItem(u8 index, u16 count); void CompactPCItems(void); void SwapRegisteredBike(void); void CompactItemsInBagPocket(enum Pocket pocketId); -void SortPocket(enum Pocket pocketId, enum SortPocket sortPocket); void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to); void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to); void ClearBag(void); diff --git a/include/item_menu.h b/include/item_menu.h index 84137da1de..64d9f7628e 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -36,6 +36,15 @@ enum { ITEMWIN_COUNT }; +//bag sort +enum BagSortOptions +{ + SORT_ALPHABETICALLY, + SORT_BY_TYPE, + SORT_BY_AMOUNT, //greatest->least + SORT_BY_INDEX, +}; + #define ITEMMENU_SWAP_LINE_LENGTH 8 // Swap line is 8 sprites long enum { ITEMMENUSPRITE_BAG, @@ -105,10 +114,11 @@ void CB2_ChooseBerry(void); void CB2_ChooseMulch(void); void Task_FadeAndCloseBagMenu(u8 taskId); void BagMenu_YesNo(u8 taskId, u8 windowType, const struct YesNoFuncTable *funcTable); -void UpdatePocketItemList(u8 pocketId); +void UpdatePocketItemList(enum Pocket pocketId); void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void (*callback)(u8 taskId)); void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback); void CloseItemMessage(u8 taskId); void ItemMenu_RotomCatalog(u8 taskId); +void SortItemsInBag(struct BagPocket *pocket, enum BagSortOptions type); #endif //GUARD_ITEM_MENU_H diff --git a/src/data/items.h b/src/data/items.h index d1d7ae3125..1a39f409b5 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -146,6 +146,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_QuestionMark, @@ -617,6 +618,7 @@ const struct Item gItemsInfo[] = "a Pokémon by\n" "20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -640,6 +642,7 @@ const struct Item gItemsInfo[] = "50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -663,6 +666,7 @@ const struct Item gItemsInfo[] = "200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -681,6 +685,7 @@ const struct Item gItemsInfo[] = "Fully restores the\n" "HP of a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -700,6 +705,7 @@ const struct Item gItemsInfo[] = "HP and status of a\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_HEAL_AND_CURE_STATUS, @@ -718,6 +724,7 @@ const struct Item gItemsInfo[] = "Pokémon with half\n" "its HP."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -733,6 +740,7 @@ const struct Item gItemsInfo[] = .price = 4000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -756,6 +764,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -779,6 +788,7 @@ const struct Item gItemsInfo[] = "by 60 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -805,6 +815,7 @@ const struct Item gItemsInfo[] = "by 80 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -825,6 +836,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 100 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -848,6 +860,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -870,6 +883,7 @@ const struct Item gItemsInfo[] = "by 200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -889,6 +903,7 @@ const struct Item gItemsInfo[] = "that heals all\n" "status problems."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -907,6 +922,7 @@ const struct Item gItemsInfo[] = "that revives a\n" "fainted Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -924,6 +940,7 @@ const struct Item gItemsInfo[] = "Heals a poisoned\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -941,6 +958,7 @@ const struct Item gItemsInfo[] = "Heals a paralyzed\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -958,6 +976,7 @@ const struct Item gItemsInfo[] = "Heals Pokémon\n" "of a burn."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -975,6 +994,7 @@ const struct Item gItemsInfo[] = "Defrosts a frozen\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -992,6 +1012,7 @@ const struct Item gItemsInfo[] = "Awakens a sleeping\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1007,6 +1028,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 400 : 600, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1026,6 +1048,7 @@ const struct Item gItemsInfo[] = "of a selected move\n" "by 10."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU_MOVES, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1045,6 +1068,7 @@ const struct Item gItemsInfo[] = "PP of a selected\n" "move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU_MOVES, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1063,6 +1087,7 @@ const struct Item gItemsInfo[] = "Restores the PP\n" "of all moves by 10."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1082,6 +1107,7 @@ const struct Item gItemsInfo[] = "PP of a Pokémon's\n" "moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PP_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, .battleUsage = EFFECT_ITEM_RESTORE_PP, @@ -1103,6 +1129,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -1122,6 +1149,7 @@ const struct Item gItemsInfo[] = "restores all\n" "fainted Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_SacredAsh, .effect = gItemEffect_SacredAsh, @@ -1140,6 +1168,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -1156,6 +1185,7 @@ const struct Item gItemsInfo[] = .price = 8000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_REVIVE, @@ -1174,6 +1204,7 @@ const struct Item gItemsInfo[] = .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1189,6 +1220,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 350 : 300, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1207,6 +1239,7 @@ const struct Item gItemsInfo[] = "that heals all\n" "status problems."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1223,6 +1256,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1238,6 +1272,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 350 : 100, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1253,6 +1288,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1268,6 +1304,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1283,6 +1320,7 @@ const struct Item gItemsInfo[] = .price = 350, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -1302,6 +1340,7 @@ const struct Item gItemsInfo[] = "Raises the base HP\n" "of one Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HPUp, @@ -1319,6 +1358,7 @@ const struct Item gItemsInfo[] = "Attack stat of one\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Protein, @@ -1336,6 +1376,7 @@ const struct Item gItemsInfo[] = "Defense stat of\n" "one Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Iron, @@ -1353,6 +1394,7 @@ const struct Item gItemsInfo[] = "Sp. Atk stat of one\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Calcium, @@ -1370,6 +1412,7 @@ const struct Item gItemsInfo[] = "Sp. Def stat of one\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Zinc, @@ -1388,6 +1431,7 @@ const struct Item gItemsInfo[] = "Speed stat of one\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_Carbos, @@ -1405,6 +1449,7 @@ const struct Item gItemsInfo[] = "PP of a selected\n" "move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, .effect = gItemEffect_PPUp, @@ -1423,6 +1468,7 @@ const struct Item gItemsInfo[] = "move to its maximum\n" "points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_DRINK, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, .effect = gItemEffect_PPMax, @@ -1439,6 +1485,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HpFeather, @@ -1453,6 +1500,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_AtkFeather, @@ -1467,6 +1515,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_DefFeather, @@ -1481,6 +1530,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpatkFeather, @@ -1495,6 +1545,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpdefFeather, @@ -1509,6 +1560,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_FEATHER, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpeedFeather, @@ -1528,6 +1580,7 @@ const struct Item gItemsInfo[] = "Switches a Poké-\n" "mon's ability."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_AbilityCapsule, .iconPic = gItemIcon_AbilityCapsule, @@ -1545,6 +1598,7 @@ const struct Item gItemsInfo[] = "of a Pokémon into\n" "a rare ability."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_AbilityPatch, .iconPic = gItemIcon_AbilityPatch, @@ -1562,6 +1616,7 @@ const struct Item gItemsInfo[] = "ups Attack, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_LONELY, @@ -1579,6 +1634,7 @@ const struct Item gItemsInfo[] = "ups Attack, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_ADAMANT, @@ -1596,6 +1652,7 @@ const struct Item gItemsInfo[] = "ups Attack, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_NAUGHTY, @@ -1613,6 +1670,7 @@ const struct Item gItemsInfo[] = "ups Attack, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_BRAVE, @@ -1630,6 +1688,7 @@ const struct Item gItemsInfo[] = "ups Defense, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_BOLD, @@ -1647,6 +1706,7 @@ const struct Item gItemsInfo[] = "ups Defense, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_IMPISH, @@ -1664,6 +1724,7 @@ const struct Item gItemsInfo[] = "ups Defense, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_LAX, @@ -1681,6 +1742,7 @@ const struct Item gItemsInfo[] = "ups Defense, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_RELAXED, @@ -1698,6 +1760,7 @@ const struct Item gItemsInfo[] = "ups Sp. Atk, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_MODEST, @@ -1715,6 +1778,7 @@ const struct Item gItemsInfo[] = "ups Sp. Atk, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_MILD, @@ -1732,6 +1796,7 @@ const struct Item gItemsInfo[] = "ups Sp. Atk, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_RASH, @@ -1749,6 +1814,7 @@ const struct Item gItemsInfo[] = "ups Sp. Atk, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_QUIET, @@ -1766,6 +1832,7 @@ const struct Item gItemsInfo[] = "ups Sp. Def, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_CALM, @@ -1783,6 +1850,7 @@ const struct Item gItemsInfo[] = "ups Sp. Def, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_GENTLE, @@ -1800,6 +1868,7 @@ const struct Item gItemsInfo[] = "ups Sp. Def, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_CAREFUL, @@ -1817,6 +1886,7 @@ const struct Item gItemsInfo[] = "ups Sp. Def, but\n" "reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_SASSY, @@ -1834,6 +1904,7 @@ const struct Item gItemsInfo[] = "ups Speed, but\n" "reduces Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_TIMID, @@ -1851,6 +1922,7 @@ const struct Item gItemsInfo[] = "ups Speed, but\n" "reduces Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_HASTY, @@ -1868,6 +1940,7 @@ const struct Item gItemsInfo[] = "ups Speed, but\n" "reduces Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_JOLLY, @@ -1885,6 +1958,7 @@ const struct Item gItemsInfo[] = "ups Speed, but\n" "reduces Sp. Def."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_NAIVE, @@ -1902,6 +1976,7 @@ const struct Item gItemsInfo[] = "makes each stat\n" "grow equally."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NATURE_MINT, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Mint, .secondaryId = NATURE_SERIOUS, @@ -1922,6 +1997,7 @@ const struct Item gItemsInfo[] = "of a Pokémon by\n" "one."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1941,6 +2017,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1960,6 +2037,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1979,6 +2057,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -1998,6 +2077,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -2017,6 +2097,7 @@ const struct Item gItemsInfo[] = "amount of Exp. to\n" "a single Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .effect = gItemEffect_RareCandy, @@ -2035,6 +2116,7 @@ const struct Item gItemsInfo[] = "Level of a single\n" "Pokémon by one."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_DynamaxCandy, .flingPower = 30, @@ -2054,6 +2136,7 @@ const struct Item gItemsInfo[] = "Pokémon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2073,6 +2156,7 @@ const struct Item gItemsInfo[] = "out of confusion."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2092,6 +2176,7 @@ const struct Item gItemsInfo[] = "out of attraction."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -2114,6 +2199,7 @@ const struct Item gItemsInfo[] = "Pokémon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .flingPower = 30, @@ -2131,6 +2217,7 @@ const struct Item gItemsInfo[] = "lures wild Pokémon."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FLUTE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, .flingPower = 30, @@ -2150,6 +2237,7 @@ const struct Item gItemsInfo[] = "Pokémon for 100\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2167,6 +2255,7 @@ const struct Item gItemsInfo[] = "Pokémon for 200\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2184,6 +2273,7 @@ const struct Item gItemsInfo[] = "Pokémon for 250\n" "steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, .flingPower = 30, @@ -2201,6 +2291,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 100 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2219,6 +2310,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 200 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2237,6 +2329,7 @@ const struct Item gItemsInfo[] = "likely to appear\n" "for 250 steps."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Lure, .secondaryId = 0, @@ -2259,6 +2352,7 @@ const struct Item gItemsInfo[] = #else .price = (I_PRICE >= GEN_7) ? 1000 : 550, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, #endif .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_EscapeRope, @@ -2285,6 +2379,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2310,6 +2405,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2335,6 +2431,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2360,6 +2457,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2385,6 +2483,7 @@ const struct Item gItemsInfo[] = "battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2411,6 +2510,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, @@ -2429,6 +2529,7 @@ const struct Item gItemsInfo[] = "critical-hit ratio\n" "during one battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_SET_FOCUS_ENERGY, @@ -2448,6 +2549,7 @@ const struct Item gItemsInfo[] = "reduction when\n" "used in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_X_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_SET_MIST, @@ -2463,6 +2565,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE == GEN_7) ? 100 : 300), .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2477,6 +2580,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2491,6 +2595,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_ESCAPE, @@ -2509,6 +2614,7 @@ const struct Item gItemsInfo[] = "during one battle\n" "by one stage."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_BATTLE_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_ALL_STATS, @@ -2528,6 +2634,7 @@ const struct Item gItemsInfo[] = "cap that gives off\n" "a silver gleam."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2544,6 +2651,7 @@ const struct Item gItemsInfo[] = "cap that gives off\n" "a golden gleam."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2560,6 +2668,7 @@ const struct Item gItemsInfo[] = "gold. Can be sold at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2576,6 +2685,7 @@ const struct Item gItemsInfo[] = "of gold, sellable\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 130, @@ -2592,6 +2702,7 @@ const struct Item gItemsInfo[] = "that would sell\n" "at a cheap price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2605,6 +2716,7 @@ const struct Item gItemsInfo[] = .price = 5000 * TREASURE_FACTOR, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2618,6 +2730,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 15000 * TREASURE_FACTOR: 12500, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2634,6 +2747,7 @@ const struct Item gItemsInfo[] = "that would sell at a\n" "cheap price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2650,6 +2764,7 @@ const struct Item gItemsInfo[] = "that would sell at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2666,6 +2781,7 @@ const struct Item gItemsInfo[] = "that would sell at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2683,6 +2799,7 @@ const struct Item gItemsInfo[] = "Can be sold at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2699,6 +2816,7 @@ const struct Item gItemsInfo[] = "It would sell for a\n" "very high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2715,6 +2833,7 @@ const struct Item gItemsInfo[] = "It would sell for a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2732,6 +2851,7 @@ const struct Item gItemsInfo[] = "deep inside the\n" "Shoal Cave."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2748,6 +2868,7 @@ const struct Item gItemsInfo[] = "deep inside the\n" "Shoal Cave."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2761,6 +2882,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2774,6 +2896,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2787,6 +2910,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2800,6 +2924,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2816,6 +2941,7 @@ const struct Item gItemsInfo[] = "It is coveted by\n" "collectors."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2833,6 +2959,7 @@ const struct Item gItemsInfo[] = "attracts wild\n" "Pokémon when used."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Honey, .flingPower = 30, @@ -2849,6 +2976,7 @@ const struct Item gItemsInfo[] = "It can be sold at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -2865,6 +2993,7 @@ const struct Item gItemsInfo[] = "from this odd stone\n" "occasionally."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -2881,6 +3010,7 @@ const struct Item gItemsInfo[] = "plain feather that\n" "does nothing."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 20, @@ -2897,6 +3027,7 @@ const struct Item gItemsInfo[] = "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2913,6 +3044,7 @@ const struct Item gItemsInfo[] = "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2929,6 +3061,7 @@ const struct Item gItemsInfo[] = "long ago. It sells\n" "at a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2945,6 +3078,7 @@ const struct Item gItemsInfo[] = "ago. It sells at\n" "a high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2961,6 +3095,7 @@ const struct Item gItemsInfo[] = "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2977,6 +3112,7 @@ const struct Item gItemsInfo[] = "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -2993,6 +3129,7 @@ const struct Item gItemsInfo[] = "It sells at a\n" "high price."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3009,6 +3146,7 @@ const struct Item gItemsInfo[] = "depicts a Pokémon\n" "from Alola."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_RELIC, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3028,6 +3166,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3050,6 +3189,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3072,6 +3212,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3091,6 +3232,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3110,6 +3252,7 @@ const struct Item gItemsInfo[] = #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, #else .price = 0, .importance = 1, @@ -3131,6 +3274,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's head."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3147,6 +3291,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's collar."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3163,6 +3308,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's back."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3179,6 +3325,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's wing."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3195,6 +3342,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's large jaw."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3211,6 +3359,7 @@ const struct Item gItemsInfo[] = "prehistoric Poké-\n" "mon's skin sail."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3227,6 +3376,7 @@ const struct Item gItemsInfo[] = "ancient, sky-\n" "soaring Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3241,6 +3391,7 @@ const struct Item gItemsInfo[] = .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3257,6 +3408,7 @@ const struct Item gItemsInfo[] = "ancient, land-\n" "roaming Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3270,6 +3422,7 @@ const struct Item gItemsInfo[] = .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3293,6 +3446,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_GROWTH_MULCH), @@ -3315,6 +3469,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_DAMP_MULCH), @@ -3337,6 +3492,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_STABLE_MULCH), @@ -3359,6 +3515,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_GOOEY_MULCH), @@ -3381,6 +3538,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_RICH_MULCH), @@ -3403,6 +3561,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_SURPRISE_MULCH), @@ -3425,6 +3584,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_BOOST_MULCH), @@ -3447,6 +3607,7 @@ const struct Item gItemsInfo[] = .description = sGenericMulchDesc, #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = ITEM_TO_MULCH(ITEM_AMAZE_MULCH), @@ -3466,6 +3627,7 @@ const struct Item gItemsInfo[] = "It assails your\n" "nostrils."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RedApricorn, @@ -3481,6 +3643,7 @@ const struct Item gItemsInfo[] = "It smells a bit\n" "like grass."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlueApricorn, @@ -3496,6 +3659,7 @@ const struct Item gItemsInfo[] = "It has an invigor-\n" "ating scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_YellowApricorn, @@ -3511,6 +3675,7 @@ const struct Item gItemsInfo[] = "It has a strange,\n" "aromatic scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_GreenApricorn, @@ -3526,6 +3691,7 @@ const struct Item gItemsInfo[] = "It has a nice,\n" "sweet scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_PinkApricorn, @@ -3541,6 +3707,7 @@ const struct Item gItemsInfo[] = "It doesn't smell\n" "like anything."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_WhiteApricorn, @@ -3556,6 +3723,7 @@ const struct Item gItemsInfo[] = "It has an inde-\n" "scribable scent."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlackApricorn, @@ -3571,6 +3739,7 @@ const struct Item gItemsInfo[] = "{PKMN} Den to attract\n" "Dynamax Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 50, @@ -3587,6 +3756,7 @@ const struct Item gItemsInfo[] = "in Galar called\n" "Galarica."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3604,6 +3774,7 @@ const struct Item gItemsInfo[] = "found in the Isle\n" "of Armor at Galar."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3621,6 +3792,7 @@ const struct Item gItemsInfo[] = "It can be found in\n" "Galar's Max Lair."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -3640,6 +3812,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_ORANGE_MAIL), @@ -3657,6 +3830,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_HARBOR_MAIL), @@ -3674,6 +3848,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_GLITTER_MAIL), @@ -3691,6 +3866,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_MECH_MAIL), @@ -3708,6 +3884,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_WOOD_MAIL), @@ -3725,6 +3902,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_WAVE_MAIL), @@ -3739,6 +3917,7 @@ const struct Item gItemsInfo[] = .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_BEAD_MAIL), @@ -3756,6 +3935,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_SHADOW_MAIL), @@ -3773,6 +3953,7 @@ const struct Item gItemsInfo[] = "Mail to be held by\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_TROPIC_MAIL), @@ -3787,6 +3968,7 @@ const struct Item gItemsInfo[] = .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_DREAM_MAIL), @@ -3804,6 +3986,7 @@ const struct Item gItemsInfo[] = "Mail to be held\n" "by a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_FAB_MAIL), @@ -3821,6 +4004,7 @@ const struct Item gItemsInfo[] = "drawings of three\n" "Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MAIL, .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, .secondaryId = ITEM_TO_MAIL(ITEM_RETRO_MAIL), @@ -3836,6 +4020,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3850,6 +4035,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3864,6 +4050,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3878,6 +4065,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3892,6 +4080,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3906,6 +4095,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3920,6 +4110,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3934,6 +4125,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3948,6 +4140,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3962,6 +4155,7 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_STONE, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3979,6 +4173,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -3996,6 +4191,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4013,6 +4209,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4030,6 +4227,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4047,6 +4245,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4065,6 +4264,7 @@ const struct Item gItemsInfo[] = "Galar. Makes some\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -4084,6 +4284,7 @@ const struct Item gItemsInfo[] = "held by Dragon-\n" "type Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4101,6 +4302,7 @@ const struct Item gItemsInfo[] = "A peculiar box made\n" "by Silph Co."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4118,6 +4320,7 @@ const struct Item gItemsInfo[] = "Pokémon. It's stiff\n" "and heavy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4135,6 +4338,7 @@ const struct Item gItemsInfo[] = "Pokémon. It's full\n" "of electric energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4152,6 +4356,7 @@ const struct Item gItemsInfo[] = "Pokémon. It's full\n" "of magma energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4169,6 +4374,7 @@ const struct Item gItemsInfo[] = "overflowing with\n" "dubious data."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4187,6 +4393,7 @@ const struct Item gItemsInfo[] = "Pokémon. Imbued\n" "with spirit energy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4204,6 +4411,7 @@ const struct Item gItemsInfo[] = "that evolves a\n" "certain Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4222,6 +4430,7 @@ const struct Item gItemsInfo[] = "treat loved by\n" "a certain Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4239,6 +4448,7 @@ const struct Item gItemsInfo[] = "perfumes, loved by\n" "a certain Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4256,6 +4466,7 @@ const struct Item gItemsInfo[] = "that evolves a\n" "certain Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -4273,6 +4484,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4289,6 +4501,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4305,6 +4518,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4321,6 +4535,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4337,6 +4552,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4353,6 +4569,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4369,6 +4586,7 @@ const struct Item gItemsInfo[] = "sweet loved by\n" "Milcery."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -4386,6 +4604,7 @@ const struct Item gItemsInfo[] = "item that prevents\n" "evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -4402,6 +4621,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4416,6 +4636,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4430,6 +4651,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4444,6 +4666,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 0, .description = sNectarDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_NECTAR, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, @@ -4464,6 +4687,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Fire-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4483,6 +4707,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Water-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -4502,6 +4727,7 @@ const struct Item gItemsInfo[] = "the power of Elec-\n" "tric-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4521,6 +4747,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Grass-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -4540,6 +4767,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ice-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4559,6 +4787,7 @@ const struct Item gItemsInfo[] = "the power of Fight-\n" "ing-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -4578,6 +4807,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Poison-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -4597,6 +4827,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ground-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -4616,6 +4847,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Flying-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -4635,6 +4867,7 @@ const struct Item gItemsInfo[] = "the power of Psy\n" "chic-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -4654,6 +4887,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Bug-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -4673,6 +4907,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Rock-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -4692,6 +4927,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Ghost-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -4711,6 +4947,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Dragon-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -4730,6 +4967,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Dark-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -4749,6 +4987,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Steel-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -4768,6 +5007,7 @@ const struct Item gItemsInfo[] = "the power of\n" "Fairy-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_PLATE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -4806,6 +5046,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Electric-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4824,6 +5065,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Fire-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4842,6 +5084,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Ice-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4864,6 +5107,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -4884,6 +5128,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -4904,6 +5149,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -4924,6 +5170,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -4944,6 +5191,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -4964,6 +5212,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -4984,6 +5233,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -5004,6 +5254,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -5024,6 +5275,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -5044,6 +5296,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -5064,6 +5317,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -5084,6 +5338,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -5104,6 +5359,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -5124,6 +5380,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -5144,6 +5401,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -5164,6 +5422,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -5184,6 +5443,7 @@ const struct Item gItemsInfo[] = "type data. It swaps\n" "Silvally's type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEMORY, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -5201,6 +5461,7 @@ const struct Item gItemsInfo[] = "hero used it to\n" "halt a disaster."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RustedSword, @@ -5216,6 +5477,7 @@ const struct Item gItemsInfo[] = "hero used it to\n" "halt a disaster."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RustedShield, @@ -5234,6 +5496,7 @@ const struct Item gItemsInfo[] = "said to contain an\n" "ancient power."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_RedOrb, @@ -5250,6 +5513,7 @@ const struct Item gItemsInfo[] = "said to contain an\n" "ancient power."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_BlueOrb, @@ -5268,6 +5532,7 @@ const struct Item gItemsInfo[] = "Venusaur to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5283,6 +5548,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5298,6 +5564,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5315,6 +5582,7 @@ const struct Item gItemsInfo[] = "Blastoise to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5332,6 +5600,7 @@ const struct Item gItemsInfo[] = "Beedrill to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5349,6 +5618,7 @@ const struct Item gItemsInfo[] = "Pidgeot to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5366,6 +5636,7 @@ const struct Item gItemsInfo[] = "Alakazam to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5383,6 +5654,7 @@ const struct Item gItemsInfo[] = "Slowbro to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5400,6 +5672,7 @@ const struct Item gItemsInfo[] = "Gengar to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5417,6 +5690,7 @@ const struct Item gItemsInfo[] = "Kangaskhan to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5434,6 +5708,7 @@ const struct Item gItemsInfo[] = "Pinsir to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5451,6 +5726,7 @@ const struct Item gItemsInfo[] = "Gyarados to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5468,6 +5744,7 @@ const struct Item gItemsInfo[] = "Aerodactyl to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5483,6 +5760,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5498,6 +5776,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5515,6 +5794,7 @@ const struct Item gItemsInfo[] = "Ampharos to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5532,6 +5812,7 @@ const struct Item gItemsInfo[] = "Steelix to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5549,6 +5830,7 @@ const struct Item gItemsInfo[] = "Scizor to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5566,6 +5848,7 @@ const struct Item gItemsInfo[] = "Heracross to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5583,6 +5866,7 @@ const struct Item gItemsInfo[] = "Houndoom to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5600,6 +5884,7 @@ const struct Item gItemsInfo[] = "Tyranitar to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5617,6 +5902,7 @@ const struct Item gItemsInfo[] = "Sceptile to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5634,6 +5920,7 @@ const struct Item gItemsInfo[] = "Blaziken to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5651,6 +5938,7 @@ const struct Item gItemsInfo[] = "Swampert to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5668,6 +5956,7 @@ const struct Item gItemsInfo[] = "Gardevoir to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5685,6 +5974,7 @@ const struct Item gItemsInfo[] = "Sableye to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5702,6 +5992,7 @@ const struct Item gItemsInfo[] = "Mawile to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5719,6 +6010,7 @@ const struct Item gItemsInfo[] = "Aggron to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5736,6 +6028,7 @@ const struct Item gItemsInfo[] = "Medicham to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5753,6 +6046,7 @@ const struct Item gItemsInfo[] = "Manectric to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5770,6 +6064,7 @@ const struct Item gItemsInfo[] = "Sharpedo to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5787,6 +6082,7 @@ const struct Item gItemsInfo[] = "Camerupt to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5804,6 +6100,7 @@ const struct Item gItemsInfo[] = "Altaria to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5821,6 +6118,7 @@ const struct Item gItemsInfo[] = "Banette to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5838,6 +6136,7 @@ const struct Item gItemsInfo[] = "Absol to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5855,6 +6154,7 @@ const struct Item gItemsInfo[] = "Glalie to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5872,6 +6172,7 @@ const struct Item gItemsInfo[] = "Salamence to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5889,6 +6190,7 @@ const struct Item gItemsInfo[] = "Metagross to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5906,6 +6208,7 @@ const struct Item gItemsInfo[] = "Latias to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5923,6 +6226,7 @@ const struct Item gItemsInfo[] = "Latios to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5940,6 +6244,7 @@ const struct Item gItemsInfo[] = "Lopunny to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5957,6 +6262,7 @@ const struct Item gItemsInfo[] = "Garchomp to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5974,6 +6280,7 @@ const struct Item gItemsInfo[] = "Lucario to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -5991,6 +6298,7 @@ const struct Item gItemsInfo[] = "Abomasnow to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6008,6 +6316,7 @@ const struct Item gItemsInfo[] = "Gallade to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6025,6 +6334,7 @@ const struct Item gItemsInfo[] = "Audino to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6042,6 +6352,7 @@ const struct Item gItemsInfo[] = "Diancie to Mega\n" "Evolve in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_MEGA_STONE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -6062,6 +6373,7 @@ const struct Item gItemsInfo[] = "power of Normal\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -6080,6 +6392,7 @@ const struct Item gItemsInfo[] = "power of Fire\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -6098,6 +6411,7 @@ const struct Item gItemsInfo[] = "power of Water\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -6116,6 +6430,7 @@ const struct Item gItemsInfo[] = "power of Electric\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -6134,6 +6449,7 @@ const struct Item gItemsInfo[] = "power of Grass\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -6152,6 +6468,7 @@ const struct Item gItemsInfo[] = "power of Ice\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -6170,6 +6487,7 @@ const struct Item gItemsInfo[] = "power of Fighting\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -6188,6 +6506,7 @@ const struct Item gItemsInfo[] = "power of Poison\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -6206,6 +6525,7 @@ const struct Item gItemsInfo[] = "power of Ground\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -6224,6 +6544,7 @@ const struct Item gItemsInfo[] = "power of Flying\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -6242,6 +6563,7 @@ const struct Item gItemsInfo[] = "power of Psychic\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -6260,6 +6582,7 @@ const struct Item gItemsInfo[] = "power of Bug\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -6278,6 +6601,7 @@ const struct Item gItemsInfo[] = "power of Rock\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -6296,6 +6620,7 @@ const struct Item gItemsInfo[] = "power of Ghost\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -6314,6 +6639,7 @@ const struct Item gItemsInfo[] = "power of Dragon\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -6332,6 +6658,7 @@ const struct Item gItemsInfo[] = "power of Dark\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -6350,6 +6677,7 @@ const struct Item gItemsInfo[] = "power of Steel\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -6368,6 +6696,7 @@ const struct Item gItemsInfo[] = "power of Fairy\n" "Type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_GEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -6387,6 +6716,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -6404,6 +6734,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -6421,6 +6752,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -6438,6 +6770,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -6455,6 +6788,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -6472,6 +6806,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -6489,6 +6824,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -6506,6 +6842,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -6523,6 +6860,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -6540,6 +6878,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -6557,6 +6896,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -6574,6 +6914,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -6591,6 +6932,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -6608,6 +6950,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -6625,6 +6968,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -6642,6 +6986,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -6659,6 +7004,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, @@ -6676,6 +7022,7 @@ const struct Item gItemsInfo[] = "type moves into\n" "Z-Moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -6693,6 +7040,7 @@ const struct Item gItemsInfo[] = "Volt Tackle\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6710,6 +7058,7 @@ const struct Item gItemsInfo[] = "Last Resort\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6727,6 +7076,7 @@ const struct Item gItemsInfo[] = "Giga Impact\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6744,6 +7094,7 @@ const struct Item gItemsInfo[] = "Psychic into\n" "a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6761,6 +7112,7 @@ const struct Item gItemsInfo[] = "eye's Spirit Sha-\n" "ckle into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6778,6 +7130,7 @@ const struct Item gItemsInfo[] = "roar's Darkest La-\n" "riat into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6795,6 +7148,7 @@ const struct Item gItemsInfo[] = "Sparkling Aria\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6812,6 +7166,7 @@ const struct Item gItemsInfo[] = "Stone Edge\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6829,6 +7184,7 @@ const struct Item gItemsInfo[] = "Play Rough\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6846,6 +7202,7 @@ const struct Item gItemsInfo[] = "Clanging Scales\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6863,6 +7220,7 @@ const struct Item gItemsInfo[] = "Nature's Madness\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, //signature z move @@ -6880,6 +7238,7 @@ const struct Item gItemsInfo[] = "Sunsteel Strike\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6897,6 +7256,7 @@ const struct Item gItemsInfo[] = "Moongeist Beam\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6914,6 +7274,7 @@ const struct Item gItemsInfo[] = "dow's Spectral Thi-\n" "ef into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6931,6 +7292,7 @@ const struct Item gItemsInfo[] = "Raichu's Thunder-\n" "bolt into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6948,6 +7310,7 @@ const struct Item gItemsInfo[] = "a cap's Thunderbolt\n" "into a Z-Move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, // signature z move @@ -6965,6 +7328,7 @@ const struct Item gItemsInfo[] = "fused Necrozma\n" "into a new form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_Z_CRYSTAL, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 255, //signature z move @@ -6984,6 +7348,7 @@ const struct Item gItemsInfo[] = "raises the Atk and\n" "Sp. Atk of Pikachu."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7001,6 +7366,7 @@ const struct Item gItemsInfo[] = "raises Farfetch'd's\n" "critical-hit ratio."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7018,6 +7384,7 @@ const struct Item gItemsInfo[] = "raises Cubone or\n" "Marowak's Attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 90, @@ -7036,6 +7403,7 @@ const struct Item gItemsInfo[] = "raises Chansey's\n" "critical-hit rate."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -7054,6 +7422,7 @@ const struct Item gItemsInfo[] = "raises Ditto's\n" "Defense."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7072,6 +7441,7 @@ const struct Item gItemsInfo[] = "raises the Speed\n" "of Ditto."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7089,6 +7459,7 @@ const struct Item gItemsInfo[] = "raises the Sp. Def\n" "of Clamperl."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7108,6 +7479,7 @@ const struct Item gItemsInfo[] = "raises the Sp. Atk\n" "of Clamperl."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7133,6 +7505,7 @@ const struct Item gItemsInfo[] = "Latios & Latias."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7151,6 +7524,7 @@ const struct Item gItemsInfo[] = "Dragon and Steel-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7169,6 +7543,7 @@ const struct Item gItemsInfo[] = "Dragon and Water-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7187,6 +7562,7 @@ const struct Item gItemsInfo[] = "Dragon and Ghost-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7204,6 +7580,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7223,6 +7600,7 @@ const struct Item gItemsInfo[] = "slightly lowers the\n" "foe's accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7238,6 +7616,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 20, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -7254,6 +7633,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 20, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -7270,6 +7650,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 5, .description = sFullIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7285,6 +7666,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7301,6 +7683,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 20, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -7316,6 +7699,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7330,6 +7714,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7349,6 +7734,7 @@ const struct Item gItemsInfo[] = "raises Cool in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7366,6 +7752,7 @@ const struct Item gItemsInfo[] = "raises Beauty in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7383,6 +7770,7 @@ const struct Item gItemsInfo[] = "raises Cute in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7400,6 +7788,7 @@ const struct Item gItemsInfo[] = "raises Smart in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7417,6 +7806,7 @@ const struct Item gItemsInfo[] = "raises Tough in\n" "Contests."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_CONTEST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7436,6 +7826,7 @@ const struct Item gItemsInfo[] = "promotes growth,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -7454,6 +7845,7 @@ const struct Item gItemsInfo[] = "promotes HP gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_HP, @@ -7473,6 +7865,7 @@ const struct Item gItemsInfo[] = "promotes Atk gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_ATK, @@ -7492,6 +7885,7 @@ const struct Item gItemsInfo[] = "promotes Def gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_DEF, @@ -7512,6 +7906,7 @@ const struct Item gItemsInfo[] = "motes Sp. Atk gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPATK, @@ -7531,6 +7926,7 @@ const struct Item gItemsInfo[] = "motes Sp. Def gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPDEF, @@ -7550,6 +7946,7 @@ const struct Item gItemsInfo[] = "promotes Spd gain,\n" "but reduces Speed."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EV_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = STAT_SPEED, @@ -7572,6 +7969,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Normal-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, @@ -7591,6 +7989,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Fire-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, @@ -7611,6 +8010,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Water-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, @@ -7630,6 +8030,7 @@ const struct Item gItemsInfo[] = "boosts Electric-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, @@ -7646,6 +8047,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = TYPE_BOOST_PARAM, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, @@ -7666,6 +8068,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ice-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, @@ -7685,6 +8088,7 @@ const struct Item gItemsInfo[] = "boosts Fighting-\n" "type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, @@ -7704,6 +8108,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Poison-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, @@ -7724,6 +8129,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ground-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, @@ -7743,6 +8149,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Flying-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, @@ -7759,6 +8166,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = TYPE_BOOST_PARAM, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, @@ -7779,6 +8187,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Bug-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, @@ -7795,6 +8204,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = TYPE_BOOST_PARAM, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, @@ -7814,6 +8224,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Ghost-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, @@ -7833,6 +8244,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Dragon-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, @@ -7853,6 +8265,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Dark-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, @@ -7872,6 +8285,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Steel-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -7893,6 +8307,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7911,6 +8326,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7929,6 +8345,7 @@ const struct Item gItemsInfo[] = "allows the use of\n" "only one move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -7948,6 +8365,7 @@ const struct Item gItemsInfo[] = "inflicts a burn on\n" "holder in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7965,6 +8383,7 @@ const struct Item gItemsInfo[] = "badly poisons the\n" "holder in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -7984,6 +8403,7 @@ const struct Item gItemsInfo[] = "of Rain Dance if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -8001,6 +8421,7 @@ const struct Item gItemsInfo[] = "of Sunny Day if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -8018,6 +8439,7 @@ const struct Item gItemsInfo[] = "of Sandstorm if\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8047,6 +8469,7 @@ const struct Item gItemsInfo[] = "used by the holder."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -8067,6 +8490,7 @@ const struct Item gItemsInfo[] = "Electric Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8085,6 +8509,7 @@ const struct Item gItemsInfo[] = "Psychic Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8103,6 +8528,7 @@ const struct Item gItemsInfo[] = "Misty Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8121,6 +8547,7 @@ const struct Item gItemsInfo[] = "Grassy Terrain,\n" "but only one time."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8141,6 +8568,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "a Water-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8160,6 +8588,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "an Electric move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8179,6 +8608,7 @@ const struct Item gItemsInfo[] = "the holder is hit by\n" "a Water-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8197,6 +8627,7 @@ const struct Item gItemsInfo[] = "holder is hit by an\n" "Ice-type move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8218,6 +8649,7 @@ const struct Item gItemsInfo[] = "casts a glare to\n" "reduce accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8235,6 +8667,7 @@ const struct Item gItemsInfo[] = "restores any\n" "lowered stat."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8260,6 +8693,7 @@ const struct Item gItemsInfo[] = "from battles."), #endif .pocket = I_EXP_SHARE_ITEM >= GEN_6 ? POCKET_KEY_ITEMS : POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_ExpShare, .flingPower = 30, @@ -8278,6 +8712,7 @@ const struct Item gItemsInfo[] = "occasionally allows\n" "the first strike."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8295,6 +8730,7 @@ const struct Item gItemsInfo[] = "calms spirits and\n" "fosters friendship."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8318,6 +8754,7 @@ const struct Item gItemsInfo[] = "of infatuation."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8333,6 +8770,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 10, .description = sKingsRockDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8348,6 +8786,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8362,6 +8801,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8379,6 +8819,7 @@ const struct Item gItemsInfo[] = "assures fleeing\n" "from wild Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8397,6 +8838,7 @@ const struct Item gItemsInfo[] = "occasionally\n" "prevents fainting."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8414,6 +8856,7 @@ const struct Item gItemsInfo[] = "boosts Exp. points\n" "earned in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8432,6 +8875,7 @@ const struct Item gItemsInfo[] = "improves the\n" "critical-hit rate."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8451,6 +8895,7 @@ const struct Item gItemsInfo[] = "gradually restores\n" "HP in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8469,6 +8914,7 @@ const struct Item gItemsInfo[] = "restores HP upon\n" "striking the foe."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8488,6 +8934,7 @@ const struct Item gItemsInfo[] = "that boosts the\n" "accuracy of moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8506,6 +8953,7 @@ const struct Item gItemsInfo[] = "boosts the power\n" "of physical moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8525,6 +8973,7 @@ const struct Item gItemsInfo[] = "that ups the power\n" "of special moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8543,6 +8992,7 @@ const struct Item gItemsInfo[] = "the power of super\n" "effective moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8561,6 +9011,7 @@ const struct Item gItemsInfo[] = "of barrier moves\n" "used by the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8578,6 +9029,7 @@ const struct Item gItemsInfo[] = "but holder loses HP\n" "with each attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8595,6 +9047,7 @@ const struct Item gItemsInfo[] = "use of a move that\n" "charges first."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8613,6 +9066,7 @@ const struct Item gItemsInfo[] = "full HP, it endures\n" "KO hits with 1 HP."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8632,6 +9086,7 @@ const struct Item gItemsInfo[] = "after the foe, it'll\n" "boost accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8650,6 +9105,7 @@ const struct Item gItemsInfo[] = "boosts a move used\n" "consecutively."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8667,6 +9123,7 @@ const struct Item gItemsInfo[] = "becomes vulnerable\n" "to Ground moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 130, @@ -8681,6 +9138,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .description = sFullIncenseDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8698,6 +9156,7 @@ const struct Item gItemsInfo[] = "in love, the foe\n" "does too."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8716,6 +9175,7 @@ const struct Item gItemsInfo[] = "Poison-types.\n" "Damages all others."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8733,6 +9193,7 @@ const struct Item gItemsInfo[] = "extends binding\n" "moves like Wrap."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 90, @@ -8750,6 +9211,7 @@ const struct Item gItemsInfo[] = "each turn. May\n" "latch on to foes."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8767,6 +9229,7 @@ const struct Item gItemsInfo[] = "to switch out\n" "without fail."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8785,6 +9248,7 @@ const struct Item gItemsInfo[] = "ups the power of\n" "HP-stealing moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8802,6 +9266,7 @@ const struct Item gItemsInfo[] = "ups the holder's\n" "critical-hit ratio."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8818,6 +9283,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 10, .description = sKingsRockDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, @@ -8837,6 +9303,7 @@ const struct Item gItemsInfo[] = "Sp. Def of Pokémon\n" "that can evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 40, @@ -8854,6 +9321,7 @@ const struct Item gItemsInfo[] = "when held, it halves\n" "a Pokémon's weight."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8872,6 +9340,7 @@ const struct Item gItemsInfo[] = "they touch its\n" "holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -8890,6 +9359,7 @@ const struct Item gItemsInfo[] = "float but bursts\n" "if hit by an attack."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8908,6 +9378,7 @@ const struct Item gItemsInfo[] = "foe if they hit the\n" "holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8926,6 +9397,7 @@ const struct Item gItemsInfo[] = "have no effect will\n" "hit the holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -8943,6 +9415,7 @@ const struct Item gItemsInfo[] = "power of binding\n" "moves when held."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8961,6 +9434,7 @@ const struct Item gItemsInfo[] = "user if they're hit\n" "by the foe."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -8980,6 +9454,7 @@ const struct Item gItemsInfo[] = "effective move,\n" "ups Atk and Sp. Atk."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -8998,6 +9473,7 @@ const struct Item gItemsInfo[] = "prevents the use\n" "of status moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9016,6 +9492,7 @@ const struct Item gItemsInfo[] = "weather damage and\n" "powder moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9033,6 +9510,7 @@ const struct Item gItemsInfo[] = "Speed if the holder\n" "is intimidated."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9050,6 +9528,7 @@ const struct Item gItemsInfo[] = "of the active\n" "battle terrain."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -9068,6 +9547,7 @@ const struct Item gItemsInfo[] = "from contact move\n" "effects."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9085,6 +9565,7 @@ const struct Item gItemsInfo[] = "the holder uses a\n" "sound-based move."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -9102,6 +9583,7 @@ const struct Item gItemsInfo[] = "switch if its stats\n" "are lowered."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 50, @@ -9120,6 +9602,7 @@ const struct Item gItemsInfo[] = "effects of traps\n" "set in the field."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9138,6 +9621,7 @@ const struct Item gItemsInfo[] = "the user misses\n" "due to Accuracy."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, @@ -9155,6 +9639,7 @@ const struct Item gItemsInfo[] = "Trick Room is\n" "active."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -9172,6 +9657,7 @@ const struct Item gItemsInfo[] = "protects from\n" "weather effects."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -12961,6 +13447,7 @@ const struct Item gItemsInfo[] = "prevented for this\n" "items's holder."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -12978,6 +13465,7 @@ const struct Item gItemsInfo[] = "moves and removes\n" "their contact."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -12995,6 +13483,7 @@ const struct Item gItemsInfo[] = "from additional\n" "effects of moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13013,6 +13502,7 @@ const struct Item gItemsInfo[] = "Multihit strikes\n" "hit more times."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13029,6 +13519,7 @@ const struct Item gItemsInfo[] = "auspicious wishes.\n" "Causes evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13048,6 +13539,7 @@ const struct Item gItemsInfo[] = "ups Pokémon with\n" "certain Abilities."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13064,6 +13556,7 @@ const struct Item gItemsInfo[] = "bamboo shoot. Best\n" "sold to gourmands."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13080,6 +13573,7 @@ const struct Item gItemsInfo[] = "and treasure these\n" "curious coins."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_GimmighoulCoin, @@ -13095,6 +13589,7 @@ const struct Item gItemsInfo[] = "blade of some sort.\n" "Held by Bisharp."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_LeadersCrest, @@ -13110,6 +13605,7 @@ const struct Item gItemsInfo[] = "malicious will.\n" "Causes evolution."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13128,6 +13624,7 @@ const struct Item gItemsInfo[] = "stat increases\n" "but only once."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13146,6 +13643,7 @@ const struct Item gItemsInfo[] = "the dark path."), .importance = 1, .pocket = POCKET_KEY_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13164,6 +13662,7 @@ const struct Item gItemsInfo[] = "the water path."), .importance = 1, .pocket = POCKET_KEY_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13196,6 +13695,7 @@ const struct Item gItemsInfo[] = "bamboo shoot. Best\n" "sold to gourmands."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, @@ -13209,6 +13709,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13221,6 +13722,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13233,6 +13735,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13245,6 +13748,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13257,6 +13761,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13269,6 +13774,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13281,6 +13787,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13293,6 +13800,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13305,6 +13813,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13317,6 +13826,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13329,6 +13839,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13341,6 +13852,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13353,6 +13865,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13365,6 +13878,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13377,6 +13891,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13389,6 +13904,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13401,6 +13917,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13413,6 +13930,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_TeraShard, @@ -13430,6 +13948,7 @@ const struct Item gItemsInfo[] = "that lets Dialga\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13448,6 +13967,7 @@ const struct Item gItemsInfo[] = "that lets Giratina\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13466,6 +13986,7 @@ const struct Item gItemsInfo[] = "that lets Palkia\n" "change form."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 60, @@ -13482,6 +14003,7 @@ const struct Item gItemsInfo[] = "makes some Pokémon\n" "evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13499,6 +14021,7 @@ const struct Item gItemsInfo[] = "that makes some\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13516,6 +14039,7 @@ const struct Item gItemsInfo[] = "that makes some\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13534,6 +14058,7 @@ const struct Item gItemsInfo[] = "Attack, but causes\n" "lasting confusion."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, @@ -13552,6 +14077,7 @@ const struct Item gItemsInfo[] = "raises the power of\n" "Fairy-type moves."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TYPE_BOOST_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, @@ -13569,6 +14095,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13586,6 +14113,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13603,6 +14131,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13622,6 +14151,7 @@ const struct Item gItemsInfo[] = "wield the Rock-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_CornerstoneMask, @@ -13639,6 +14169,7 @@ const struct Item gItemsInfo[] = "wield the Water-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_WellspringMask, @@ -13656,6 +14187,7 @@ const struct Item gItemsInfo[] = "wield the Fire-\n" "type in battle."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SPECIAL_HELD_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_HearthflameMask, @@ -13669,6 +14201,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HpMochi, @@ -13684,6 +14217,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_AtkMochi, @@ -13699,6 +14233,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_DefMochi, @@ -13714,6 +14249,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpatkMochi, @@ -13729,6 +14265,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpdefMochi, @@ -13744,6 +14281,7 @@ const struct Item gItemsInfo[] = .price = 500, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpeedMochi, @@ -13762,6 +14300,7 @@ const struct Item gItemsInfo[] = "all base points of\n" "a Pokémon."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STAT_BOOST_MOCHI, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ResetEVs, .effect = gItemEffect_ResetMochi, @@ -13795,6 +14334,7 @@ const struct Item gItemsInfo[] = "that makes certain\n" "Pokémon evolve."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_EVOLUTION_ITEM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, .effect = gItemEffect_EvoItem, @@ -13808,6 +14348,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_TERA_SHARD, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_StellarTeraShard, @@ -13820,6 +14361,7 @@ const struct Item gItemsInfo[] = .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_STATUS_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_CURE_STATUS, @@ -13838,6 +14380,7 @@ const struct Item gItemsInfo[] = "that restores HP\n" "by 20 points."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -13860,6 +14403,7 @@ const struct Item gItemsInfo[] = "by 50 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -13882,6 +14426,7 @@ const struct Item gItemsInfo[] = "by 200 points."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, .battleUsage = EFFECT_ITEM_RESTORE_HP, @@ -13906,6 +14451,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -13928,6 +14474,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -13950,6 +14497,7 @@ const struct Item gItemsInfo[] = "during one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -13973,6 +14521,7 @@ const struct Item gItemsInfo[] = "one battle."), #endif .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_AUX_ITEM, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, //.effect = currently missing @@ -14028,6 +14577,7 @@ const struct Item gItemsInfo[] = "resembling a Poké-.\n" "mon. Can be sold."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_PokeshiDoll, diff --git a/src/item.c b/src/item.c index 4e7e514938..b155cbb903 100644 --- a/src/item.c +++ b/src/item.c @@ -32,8 +32,6 @@ static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count); static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count); static const u8 *GetItemPluralName(u16); static bool32 DoesItemHavePluralName(u16); -static void BagPocket_GetSetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting); -static void BagPocket_GetSetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting); EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; @@ -61,71 +59,72 @@ const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = #undef UNPACK_TM_ITEM_ID #undef UNPACK_HM_ITEM_ID -static void (*const sBagPocket_GetSetSlotDataFuncs[])(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) = +static inline struct ItemSlot NONNULL BagPocket_GetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos) { - [POCKET_ITEMS] = BagPocket_GetSetSlotDataGeneric, - [POCKET_KEY_ITEMS] = BagPocket_GetSetSlotDataGeneric, - [POCKET_POKE_BALLS] = BagPocket_GetSetSlotDataGeneric, - [POCKET_TM_HM] = BagPocket_GetSetSlotDataGeneric, - [POCKET_BERRIES] = BagPocket_GetSetSlotDataGeneric, - [POCKET_DUMMY] = BagPocket_GetSetSlotDataPC, -}; + return (struct ItemSlot) { + .itemId = pocket->itemSlots[pocketPos].itemId, + .quantity = pocket->itemSlots[pocketPos].quantity ^ gSaveBlock2Ptr->encryptionKey, + }; +} -static void NONNULL BagPocket_GetSetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) +static inline struct ItemSlot NONNULL BagPocket_GetSlotDataPC(struct BagPocket *pocket, u32 pocketPos) { - if (isSetting) + return (struct ItemSlot) { + .itemId = pocket->itemSlots[pocketPos].itemId, + .quantity = pocket->itemSlots[pocketPos].quantity, + }; +} + +static inline void NONNULL BagPocket_SetSlotDataGeneric(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) +{ + pocket->itemSlots[pocketPos].itemId = newSlot.itemId; + pocket->itemSlots[pocketPos].quantity = newSlot.quantity ^ gSaveBlock2Ptr->encryptionKey; +} + +static inline void NONNULL BagPocket_SetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) +{ + pocket->itemSlots[pocketPos].itemId = newSlot.itemId; + pocket->itemSlots[pocketPos].quantity = newSlot.quantity; +} + +struct ItemSlot NONNULL BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos) +{ + switch (pocket->id) { - pocket->itemSlots[pocketPos].itemId = *quantity ? *itemId : ITEM_NONE; // Sets to zero if quantity is zero - pocket->itemSlots[pocketPos].quantity = *quantity ^ gSaveBlock2Ptr->encryptionKey; + case POCKET_ITEMS: + case POCKET_KEY_ITEMS: + case POCKET_POKE_BALLS: + case POCKET_TM_HM: + case POCKET_BERRIES: + return BagPocket_GetSlotDataGeneric(pocket, pocketPos); + case POCKET_DUMMY: + return BagPocket_GetSlotDataPC(pocket, pocketPos); } - else + + return (struct ItemSlot) {0}; // Because compiler complains +} + +void NONNULL BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot) +{ + if (newSlot.itemId == ITEM_NONE || newSlot.quantity == 0) // Sets to zero if quantity or itemId is zero { - *itemId = pocket->itemSlots[pocketPos].itemId; - *quantity = pocket->itemSlots[pocketPos].quantity ^ gSaveBlock2Ptr->encryptionKey; + newSlot.itemId = ITEM_NONE; + newSlot.quantity = 0; } -} -static void NONNULL BagPocket_GetSetSlotDataPC(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity, bool32 isSetting) -{ - if (isSetting) + switch (pocket->id) { - pocket->itemSlots[pocketPos].itemId = *quantity ? *itemId : ITEM_NONE; // Sets to zero if quantity is zero - pocket->itemSlots[pocketPos].quantity = *quantity; + case POCKET_ITEMS: + case POCKET_KEY_ITEMS: + case POCKET_POKE_BALLS: + case POCKET_TM_HM: + case POCKET_BERRIES: + BagPocket_SetSlotDataGeneric(pocket, pocketPos, newSlot); + break; + case POCKET_DUMMY: + BagPocket_SetSlotDataPC(pocket, pocketPos, newSlot); + break; } - else - { - *itemId = pocket->itemSlots[pocketPos].itemId; - *quantity = pocket->itemSlots[pocketPos].quantity; - } -} - -static inline void NONNULL BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity) -{ - sBagPocket_GetSetSlotDataFuncs[pocket->id](pocket, pocketPos, itemId, quantity, FALSE); -} - -static inline void NONNULL BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, u16 *itemId, u16 *quantity) -{ - sBagPocket_GetSetSlotDataFuncs[pocket->id](pocket, pocketPos, itemId, quantity, TRUE); -} - -void GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos, u16 *itemId, u16 *quantity) -{ - BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, itemId, quantity); -} - -u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos) -{ - u16 itemId, quantity; - BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, &itemId, &quantity); - return itemId; -} - -u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos) -{ - u16 itemId, quantity; - BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos, &itemId, &quantity); - return quantity; } void ApplyNewEncryptionKeyToBagItems(u32 newKey) @@ -200,14 +199,14 @@ bool32 IsBagPocketNonEmpty(enum Pocket pocketId) static bool32 NONNULL BagPocket_CheckHasItem(struct BagPocket *pocket, u16 itemId, u16 count) { - u16 tempItemId, tempQuantity; + struct ItemSlot tempItem; // Check for item slots that contain the item for (u32 i = 0; i < pocket->capacity && count > 0; i++) { - BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); - if (tempItemId == itemId) - count -= min(count, tempQuantity); + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId) + count -= min(count, tempItem.quantity); } return count == 0; @@ -257,14 +256,14 @@ bool32 CheckBagHasSpace(u16 itemId, u16 count) static u32 NONNULL BagPocket_GetFreeSpaceForItem(struct BagPocket *pocket, u16 itemId) { u32 spaceForItem = 0; - u16 tempItemId, tempQuantity; + struct ItemSlot tempItem; // Check space in any existing item slots that already contain this item for (u32 i = 0; i < pocket->capacity; i++) { - BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); - if (tempItemId == ITEM_NONE || tempItemId == itemId) - spaceForItem += (tempItemId ? (MAX_BAG_ITEM_CAPACITY - tempQuantity) : MAX_BAG_ITEM_CAPACITY); + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == ITEM_NONE || tempItem.itemId == itemId) + spaceForItem += (tempItem.itemId ? (MAX_BAG_ITEM_CAPACITY - tempItem.quantity) : MAX_BAG_ITEM_CAPACITY); } return spaceForItem; @@ -280,17 +279,16 @@ u32 GetFreeSpaceForItemInBag(u16 itemId) static inline bool32 NONNULL CheckSlotAndUpdateCount(struct BagPocket *pocket, u16 itemId, u32 pocketPos, u32 *nextPocketPos, u16 *count, u16 *tempPocketSlotQuantities) { - u16 tempItemId, tempQuantity; - BagPocket_GetSlotData(pocket, pocketPos, &tempItemId, &tempQuantity); - if (tempItemId == ITEM_NONE || tempItemId == itemId) + struct ItemSlot tempItem = BagPocket_GetSlotData(pocket, pocketPos); + if (tempItem.itemId == ITEM_NONE || tempItem.itemId == itemId) { // The quantity already at the slot - zero if an empty slot - if (!tempItemId) - tempQuantity = 0; + if (tempItem.itemId == ITEM_NONE) + tempItem.quantity = 0; // Record slot quantity in tempPocketSlotQuantities, adjust count - tempPocketSlotQuantities[pocketPos] = min(MAX_BAG_ITEM_CAPACITY, *count + tempQuantity); - *count -= min(*count, MAX_BAG_ITEM_CAPACITY - tempQuantity); + tempPocketSlotQuantities[pocketPos] = min(MAX_BAG_ITEM_CAPACITY, *count + tempItem.quantity); + *count -= min(*count, MAX_BAG_ITEM_CAPACITY - tempItem.quantity); // Set the starting index for the next loop to set items (shifted by one) if (!*nextPocketPos) @@ -336,7 +334,7 @@ static bool32 NONNULL BagPocket_AddItem(struct BagPocket *pocket, u16 itemId, u1 for (--itemAddIndex; itemAddIndex < itemLookupIndex; itemAddIndex++) { if (tempPocketSlotQuantities[itemAddIndex] > 0) - BagPocket_SetSlotData(pocket, itemAddIndex, &itemId, &tempPocketSlotQuantities[itemAddIndex]); + BagPocket_SetSlotItemIdAndCount(pocket, itemAddIndex, itemId, tempPocketSlotQuantities[itemAddIndex]); } } @@ -359,21 +357,21 @@ bool32 AddBagItem(u16 itemId, u16 count) static bool32 NONNULL BagPocket_RemoveItem(struct BagPocket *pocket, u16 itemId, u16 count) { u32 itemLookupIndex, itemRemoveIndex = 0, totalQuantity = 0; - u16 tempItemId, tempQuantity; + struct ItemSlot tempItem; u16 *tempPocketSlotQuantities = AllocZeroed(sizeof(u16) * pocket->capacity); for (itemLookupIndex = 0; itemLookupIndex < pocket->capacity && totalQuantity < count; itemLookupIndex++) { - BagPocket_GetSlotData(pocket, itemLookupIndex, &tempItemId, &tempQuantity); - if (tempItemId == itemId) + tempItem = BagPocket_GetSlotData(pocket, itemLookupIndex); + if (tempItem.itemId == itemId) { // Index for the next loop - where we should start removing items if (!itemRemoveIndex) itemRemoveIndex = itemLookupIndex + 1; // Gather quantities (+ 1 to tempPocketSlotQuantities so that even if setting to 0 we know which indices to target) - totalQuantity += tempQuantity; - tempPocketSlotQuantities[itemLookupIndex] = (tempQuantity <= count ? 0 : tempQuantity - count) + 1; + totalQuantity += tempItem.quantity; + tempPocketSlotQuantities[itemLookupIndex] = (tempItem.quantity <= count ? 0 : tempItem.quantity - count) + 1; } } @@ -389,10 +387,7 @@ static bool32 NONNULL BagPocket_RemoveItem(struct BagPocket *pocket, u16 itemId, for (--itemRemoveIndex; itemRemoveIndex < itemLookupIndex; itemRemoveIndex++) { if (tempPocketSlotQuantities[itemRemoveIndex] > 0) - { - tempPocketSlotQuantities[itemRemoveIndex]--; // Reverse the +1 shift - BagPocket_SetSlotData(pocket, itemRemoveIndex, &itemId, &tempPocketSlotQuantities[itemRemoveIndex]); - } + BagPocket_SetSlotItemIdAndCount(pocket, itemRemoveIndex, itemId, tempPocketSlotQuantities[itemRemoveIndex] - 1); } } @@ -415,12 +410,10 @@ bool32 RemoveBagItem(u16 itemId, u16 count) static u8 NONNULL BagPocket_CountUsedItemSlots(struct BagPocket *pocket) { u8 usedSlots = 0; - u16 tempItemId, tempQuantity; for (u32 i = 0; i < pocket->capacity; i++) { - BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); - if (tempItemId) + if (BagPocket_GetSlotData(pocket, i).itemId != ITEM_NONE) usedSlots++; } return usedSlots; @@ -434,12 +427,12 @@ u8 CountUsedPCItemSlots(void) static bool32 NONNULL BagPocket_CheckPocketForItemCount(struct BagPocket *pocket, u16 itemId, u16 count) { - u16 tempItemId, tempQuantity; + struct ItemSlot tempItem; for (u32 i = 0; i < pocket->capacity; i++) { - BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); - if (tempItemId == itemId && tempQuantity >= count) + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId && tempItem.quantity >= count) return TRUE; } return FALSE; @@ -459,20 +452,20 @@ bool32 AddPCItem(u16 itemId, u16 count) static void NONNULL BagPocket_CompactItems(struct BagPocket *pocket) { - u16 itemId, quantity, zero = 0, slotCursor = 0; + struct ItemSlot tempItem; + u32 slotCursor = 0; for (u32 i = 0; i < pocket->capacity; i++) { - BagPocket_GetSlotData(pocket, i, &itemId, &quantity); - if (itemId == ITEM_NONE) + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == ITEM_NONE) { if (!slotCursor) slotCursor = i + 1; } else if (slotCursor > 0) { - BagPocket_SetSlotData(pocket, slotCursor - 1, &itemId, &quantity); - BagPocket_SetSlotData(pocket, i, &zero, &zero); - slotCursor++; + BagPocket_SetSlotData(pocket, slotCursor++ - 1, tempItem); + BagPocket_SetSlotItemIdAndCount(pocket, i, ITEM_NONE, 0); } } } @@ -482,15 +475,13 @@ void RemovePCItem(u8 index, u16 count) struct BagPocket dummyPocket = DUMMY_PC_BAG_POCKET; // Get id, quantity at slot - u16 tempItemId, tempQuantity; - BagPocket_GetSlotData(&dummyPocket, index, &tempItemId, &tempQuantity); + struct ItemSlot tempItem = BagPocket_GetSlotData(&dummyPocket, index); // Remove quantity - tempQuantity -= count; - BagPocket_SetSlotData(&dummyPocket, index, &tempItemId, &tempQuantity); + BagPocket_SetSlotItemIdAndCount(&dummyPocket, index, tempItem.itemId, tempItem.quantity - count); // Compact if necessary - if (tempQuantity == 0) + if (tempItem.quantity == 0) BagPocket_CompactItems(&dummyPocket); } @@ -518,42 +509,6 @@ void CompactItemsInBagPocket(enum Pocket pocketId) BagPocket_CompactItems(&gBagPockets[pocketId]); } -// Opens the possibility of sorting by other means e.g. ghoulslash's advanced sorting -static inline bool32 ItemIndexCompare(u16 itemA, u16 itemB, enum SortPocket sortPocket) -{ - switch (sortPocket) - { - case SORT_POCKET_BY_ITEM_ID: - return itemA > itemB; - case SORT_POCKET_TM_HM: - return GetItemTMHMIndex(itemA) > GetItemTMHMIndex(itemB); - default: - return FALSE; - } -} - -void SortPocket(enum Pocket pocketId, enum SortPocket sortPocket) -{ - u16 itemId_i, quantity_i, itemId_j, quantity_j; - struct BagPocket *pocket = &gBagPockets[pocketId]; - - for (u32 i = 0; i < pocket->capacity - 1; i++) - { - BagPocket_GetSlotData(pocket, i, &itemId_i, &quantity_i); - for (u32 j = i + 1; j < pocket->capacity; j++) - { - BagPocket_GetSlotData(pocket, j, &itemId_j, &quantity_j); - if (itemId_j && (!itemId_i || ItemIndexCompare(itemId_i, itemId_j, sortPocket))) - { - BagPocket_SetSlotData(pocket, i, &itemId_j, &quantity_j); - BagPocket_SetSlotData(pocket, j, &itemId_i, &quantity_i); - itemId_i = itemId_j; - quantity_i = quantity_j; - } - } - } -} - static inline void NONNULL BagPocket_MoveItemSlot(struct BagPocket *pocket, u32 from, u32 to) { if (from != to) @@ -563,18 +518,14 @@ static inline void NONNULL BagPocket_MoveItemSlot(struct BagPocket *pocket, u32 to--; // Record the values at "from" - u16 fromItemId, fromQuantity, tempItemId, tempQuantity; - BagPocket_GetSlotData(pocket, from, &fromItemId, &fromQuantity); + struct ItemSlot fromSlot = BagPocket_GetSlotData(pocket, from); // Shuffle items between "to" and "from" for (u32 i = from; i != to; i += shift) - { - BagPocket_GetSlotData(pocket, i + shift, &tempItemId, &tempQuantity); - BagPocket_SetSlotData(pocket, i, &tempItemId, &tempQuantity); - } + BagPocket_SetSlotData(pocket, i, BagPocket_GetSlotData(pocket, i + shift)); // Move the saved "from" to "to" - BagPocket_SetSlotData(pocket, to, &fromItemId, &fromQuantity); + BagPocket_SetSlotData(pocket, to, fromSlot); } } @@ -596,13 +547,14 @@ void ClearBag(void) static inline u16 NONNULL BagPocket_CountTotalItemQuantity(struct BagPocket *pocket, u16 itemId) { - u16 tempItemId, tempQuantity, ownedCount = 0; + u32 ownedCount = 0; + struct ItemSlot tempItem; for (u32 i = 0; i < pocket->capacity; i++) { - BagPocket_GetSlotData(pocket, i, &tempItemId, &tempQuantity); - if (tempItemId == itemId) - ownedCount += tempQuantity; + tempItem = BagPocket_GetSlotData(pocket, i); + if (tempItem.itemId == itemId) + ownedCount += tempItem.quantity; } return ownedCount; diff --git a/src/item_menu.c b/src/item_menu.c index d6e3598b58..6d1fb43077 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -89,6 +89,10 @@ enum { ACTION_SHOW, ACTION_GIVE_FAVOR_LADY, ACTION_CONFIRM_QUIZ_LADY, + ACTION_BY_NAME, + ACTION_BY_TYPE, + ACTION_BY_AMOUNT, + ACTION_BY_INDEX, ACTION_DUMMY, }; @@ -218,6 +222,19 @@ static const u8 sText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_ static const u8 sText_NoRoomForItems[] = _("There's no room to\nstore items."); static const u8 sText_CantStoreImportantItems[] = _("Important items\ncan't be stored in\nthe PC!"); +static void Task_LoadBagSortOptions(u8 taskId); +static void ItemMenu_SortByName(u8 taskId); +static void ItemMenu_SortByType(u8 taskId); +static void ItemMenu_SortByAmount(u8 taskId); +static void ItemMenu_SortByIndex(u8 taskId); +static void SortBagItems(u8 taskId); +static void Task_SortFinish(u8 taskId); +static void MergeSort(struct BagPocket *pocket, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)); +static s32 CompareItemsAlphabetically(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByType(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); +static s32 CompareItemsByIndex(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2); + static const struct BgTemplate sBgTemplates_ItemMenu[] = { { @@ -271,6 +288,7 @@ static const struct ListMenuTemplate sItemListMenu = .cursorKind = CURSOR_BLACK_ARROW }; +static const u8 sText_NothingToSort[] = _("There's nothing to sort!"); static const struct MenuAction sItemMenuActions[] = { [ACTION_USE] = {gMenuText_Use, {ItemMenu_UseOutOfBattle}}, [ACTION_TOSS] = {gMenuText_Toss, {ItemMenu_Toss}}, @@ -286,6 +304,10 @@ static const struct MenuAction sItemMenuActions[] = { [ACTION_SHOW] = {COMPOUND_STRING("SHOW"), {ItemMenu_Show}}, [ACTION_GIVE_FAVOR_LADY] = {gMenuText_Give2, {ItemMenu_GiveFavorLady}}, [ACTION_CONFIRM_QUIZ_LADY] = {gMenuText_Confirm, {ItemMenu_ConfirmQuizLady}}, + [ACTION_BY_NAME] = {COMPOUND_STRING("Name"), {ItemMenu_SortByName}}, + [ACTION_BY_TYPE] = {COMPOUND_STRING("Type"), {ItemMenu_SortByType}}, + [ACTION_BY_AMOUNT] = {COMPOUND_STRING("Amount"), {ItemMenu_SortByAmount}}, + [ACTION_BY_INDEX] = {COMPOUND_STRING("Index"), {ItemMenu_SortByIndex}}, [ACTION_DUMMY] = {gText_EmptyString2, {NULL}} }; @@ -966,7 +988,6 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) { if (itemIndex != LIST_CANCEL) { - u16 itemId, itemQuantity; s32 offset; if (gBagMenu->toSwapPos != NOT_SWAPPING) @@ -978,16 +999,16 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) BagMenu_PrintCursorAtPos(y, COLORID_NONE); } - GetBagItemIdAndQuantity(gBagPosition.pocket, itemIndex, &itemId, &itemQuantity); + struct ItemSlot itemSlot = GetBagItemIdAndQuantity(gBagPosition.pocket, itemIndex); // Draw HM icon - if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) + if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemSlot.itemId) > NUM_TECHNICAL_MACHINES) BlitBitmapToWindow(windowId, gBagMenuHMIcon_Gfx, 8, y - 1, 16, 16); - if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemId) == FALSE) + if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemSlot.itemId) == FALSE) { // Print item quantity - ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, MAX_ITEM_DIGITS); + ConvertIntToDecimalStringN(gStringVar1, itemSlot.quantity, STR_CONV_MODE_RIGHT_ALIGN, MAX_ITEM_DIGITS); StringExpandPlaceholders(gStringVar4, gText_xVar1); offset = GetStringRightAlignXOffset(FONT_NARROW, gStringVar4, 119); BagMenu_Print(windowId, FONT_NARROW, gStringVar4, offset, y, 0, 0, TEXT_SKIP_DRAW, COLORID_NORMAL); @@ -995,7 +1016,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) else { // Print registered icon - if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == itemId) + if (gSaveBlock1Ptr->registeredItem != ITEM_NONE && gSaveBlock1Ptr->registeredItem == itemSlot.itemId) BlitBitmapToWindow(windowId, sRegisteredSelect_Gfx, 96, y - 1, 24, 16); } } @@ -1125,16 +1146,17 @@ static void Task_CloseBagMenu(u8 taskId) } } -void UpdatePocketItemList(u8 pocketId) +void UpdatePocketItemList(enum Pocket pocketId) { - u16 i; + if (pocketId >= POCKETS_COUNT) + return; // shouldn't even get here + + struct BagPocket *pocket = &gBagPockets[pocketId]; switch (pocketId) { case POCKET_TM_HM: - SortPocket(pocketId, SORT_POCKET_TM_HM); - break; case POCKET_BERRIES: - SortPocket(pocketId, SORT_POCKET_BY_ITEM_ID); + SortItemsInBag(pocket, SORT_BY_INDEX); break; default: CompactItemsInBagPocket(pocketId); @@ -1143,7 +1165,7 @@ void UpdatePocketItemList(u8 pocketId) gBagMenu->numItemStacks[pocketId] = 0; - for (i = 0; i < gBagPockets[pocketId].capacity && GetBagItemId(pocketId, i); i++) + for (u32 i = 0; i < pocket->capacity && BagPocket_GetSlotData(pocket, i).itemId; i++) gBagMenu->numItemStacks[pocketId]++; if (!gBagMenu->hideCloseBagText) @@ -1263,6 +1285,34 @@ static void Task_BagMenu_HandleInput(u8 taskId) } return; } + else if (JOY_NEW(START_BUTTON)) + { + if ((gBagMenu->numItemStacks[gBagPosition.pocket] - 1) <= 1) //can't sort with 0 or 1 item in bag + { + static const u8 sText_NothingToSort[] = _("There's nothing to sort!"); + PlaySE(SE_FAILURE); + DisplayItemMessage(taskId, 1, sText_NothingToSort, HandleErrorMessage); + break; + } + else + { + struct ItemSlot tempItem; + data[1] = GetItemListPosition(gBagPosition.pocket); + tempItem = GetBagItemIdAndQuantity(gBagPosition.pocket, data[1]); + data[2] = tempItem.quantity; + if (gBagPosition.cursorPosition[gBagPosition.pocket] == gBagMenu->numItemStacks[gBagPosition.pocket]) + break; + else + gSpecialVar_ItemId = tempItem.itemId; + + PlaySE(SE_SELECT); + BagDestroyPocketScrollArrowPair(); + BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); + ListMenuGetScrollAndRow(data[0], scrollPos, cursorPos); + gTasks[taskId].func = Task_LoadBagSortOptions; + return; + } + } break; } @@ -1283,12 +1333,16 @@ static void Task_BagMenu_HandleInput(u8 taskId) gTasks[taskId].func = Task_FadeAndCloseBagMenu; break; default: // A_BUTTON - PlaySE(SE_SELECT); - BagDestroyPocketScrollArrowPair(); - BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); - tListPosition = listPosition; - GetBagItemIdAndQuantity(gBagPosition.pocket, listPosition, &gSpecialVar_ItemId, (u16*)&tQuantity); - sContextMenuFuncs[gBagPosition.location](taskId); + { + struct ItemSlot itemSlot = GetBagItemIdAndQuantity(gBagPosition.pocket, listPosition); + PlaySE(SE_SELECT); + BagDestroyPocketScrollArrowPair(); + BagMenu_PrintCursor(tListTaskId, COLORID_GRAY_CURSOR); + tListPosition = listPosition; + gSpecialVar_ItemId = itemSlot.itemId; + tQuantity = itemSlot.quantity; + sContextMenuFuncs[gBagPosition.location](taskId); + } break; } } @@ -2639,3 +2693,310 @@ static void PrintTMHMMoveData(u16 itemId) CopyWindowToVram(WIN_TMHM_INFO, COPYWIN_GFX); } } + +static const u8 sText_SortItemsHow[] = _("Sort items how?"); +static const u8 sText_ItemsSorted[] = _("Items sorted by {STR_VAR_1}!"); +static const u8 *const sSortTypeStrings[] = +{ + [SORT_ALPHABETICALLY] = COMPOUND_STRING("name"), + [SORT_BY_TYPE] = COMPOUND_STRING("type"), + [SORT_BY_AMOUNT] = COMPOUND_STRING("amount"), + [SORT_BY_INDEX] = COMPOUND_STRING("index") +}; + +static const u8 sBagMenuSortItems[] = +{ + ACTION_BY_NAME, + ACTION_BY_TYPE, + ACTION_BY_AMOUNT, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortKeyItems[] = +{ + ACTION_BY_NAME, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortPokeBalls[] = +{ + ACTION_BY_NAME, + ACTION_BY_AMOUNT, + ACTION_DUMMY, + ACTION_CANCEL, +}; + +static const u8 sBagMenuSortBerriesTMsHMs[] = +{ + ACTION_BY_NAME, + ACTION_BY_AMOUNT, + ACTION_BY_INDEX, + ACTION_CANCEL, +}; + +static void AddBagSortSubMenu(void) +{ + switch (gBagPosition.pocket) + { + case POCKET_KEY_ITEMS: + gBagMenu->contextMenuItemsPtr = sBagMenuSortKeyItems; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortKeyItems, NELEMS(sBagMenuSortKeyItems)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortKeyItems); + break; + case POCKET_POKE_BALLS: + gBagMenu->contextMenuItemsPtr = sBagMenuSortPokeBalls; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortPokeBalls, NELEMS(sBagMenuSortPokeBalls)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortPokeBalls); + break; + case POCKET_BERRIES: + case POCKET_TM_HM: + gBagMenu->contextMenuItemsPtr = sBagMenuSortBerriesTMsHMs; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortBerriesTMsHMs, NELEMS(sBagMenuSortBerriesTMsHMs)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortBerriesTMsHMs); + break; + default: + gBagMenu->contextMenuItemsPtr = sBagMenuSortItems; + memcpy(&gBagMenu->contextMenuItemsBuffer, &sBagMenuSortItems, NELEMS(sBagMenuSortItems)); + gBagMenu->contextMenuNumItems = NELEMS(sBagMenuSortItems); + break; + } + + StringExpandPlaceholders(gStringVar4, sText_SortItemsHow); + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + BagMenu_Print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0); + + if (gBagMenu->contextMenuNumItems == 2) + PrintContextMenuItems(BagMenu_AddWindow(ITEMWIN_1x2)); + else if (gBagMenu->contextMenuNumItems == 4) + PrintContextMenuItemGrid(BagMenu_AddWindow(ITEMWIN_2x2), 2, 2); + else + PrintContextMenuItemGrid(BagMenu_AddWindow(ITEMWIN_2x3), 2, 3); +} + +static void Task_LoadBagSortOptions(u8 taskId) +{ + AddBagSortSubMenu(); + if (gBagMenu->contextMenuNumItems <= 2) + gTasks[taskId].func = Task_ItemContext_SingleRow; + else + gTasks[taskId].func = Task_ItemContext_MultipleRows; +} + +#define tSortType data[2] +static void ItemMenu_SortByName(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_ALPHABETICALLY; + StringCopy(gStringVar1, sSortTypeStrings[SORT_ALPHABETICALLY]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByType(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_TYPE; + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_TYPE]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByAmount(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_AMOUNT; //greatest->least + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_AMOUNT]); + gTasks[taskId].func = SortBagItems; +} + +static void ItemMenu_SortByIndex(u8 taskId) +{ + gTasks[taskId].tSortType = SORT_BY_INDEX; + StringCopy(gStringVar1, sSortTypeStrings[SORT_BY_INDEX]); + gTasks[taskId].func = SortBagItems; +} + +static void SortBagItems(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *scrollPos = &gBagPosition.scrollPosition[gBagPosition.pocket]; + u16 *cursorPos = &gBagPosition.cursorPosition[gBagPosition.pocket]; + + RemoveContextWindow(); + + SortItemsInBag(&gBagPockets[gBagPosition.pocket], tSortType); + DestroyListMenuTask(data[0], scrollPos, cursorPos); + UpdatePocketListPosition(gBagPosition.pocket); + LoadBagItemListBuffers(gBagPosition.pocket); + data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); + ScheduleBgCopyTilemapToVram(0); + + StringCopy(gStringVar1, sSortTypeStrings[tSortType]); + StringExpandPlaceholders(gStringVar4, sText_ItemsSorted); + DisplayItemMessage(taskId, 1, gStringVar4, Task_SortFinish); +} + +#undef tSortType + +static void Task_SortFinish(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + RemoveItemMessageWindow(4); + ReturnToItemList(taskId); + } +} + +void SortItemsInBag(struct BagPocket *pocket, enum BagSortOptions type) +{ + switch (type) + { + case SORT_ALPHABETICALLY: + MergeSort(pocket, CompareItemsAlphabetically); + break; + case SORT_BY_AMOUNT: + MergeSort(pocket, CompareItemsByMost); + break; + case SORT_BY_INDEX: + MergeSort(pocket, CompareItemsByIndex); + break; + default: + MergeSort(pocket, CompareItemsByType); + break; + } +} + +static inline __attribute__((always_inline)) void Merge(struct BagPocket *pocket, u32 iLeft, u32 iRight, u32 iEnd, struct ItemSlot *dummySlots, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)) +{ + struct ItemSlot item_i, item_j; + u32 i = iLeft, j = iRight; + for (u32 k = iLeft; k < iEnd; k++) + { + item_i = BagPocket_GetSlotData(pocket, i); + item_j = BagPocket_GetSlotData(pocket, j); + if (i < iRight && (j >= iEnd || comparator(pocket->id, item_i, item_j) < 0)) + { + dummySlots[k] = item_i; + i++; + } + else + { + dummySlots[k] = item_j; + j++; + } + } +} + +// Source: https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation +static void MergeSort(struct BagPocket *pocket, s32 (*comparator)(enum Pocket, struct ItemSlot, struct ItemSlot)) +{ + struct ItemSlot *dummySlots = AllocZeroed(sizeof(struct ItemSlot) * pocket->capacity); + + for (u32 width = 1; width < pocket->capacity; width *= 2) + { + for (u32 i = 0; i < pocket->capacity; i += 2 * width) + Merge(pocket, i, min(i + width, pocket->capacity), min(i + 2 * width, pocket->capacity), dummySlots, comparator); + + for (u32 j = 0; j < pocket->capacity; j++) + BagPocket_SetSlotData(pocket, j, dummySlots[j]); + } + + Free(dummySlots); +} + +static s32 CompareItemsAlphabetically(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + const u8 *name1, *name2; + + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + if (pocketId == POCKET_TM_HM) + { + name1 = gMovesInfo[GetTMHMMoveId(GetItemTMHMIndex(item1.itemId))].name; + name2 = gMovesInfo[GetTMHMMoveId(GetItemTMHMIndex(item2.itemId))].name; + } + else + { + name1 = GetItemName(item1.itemId); + name2 = GetItemName(item2.itemId); + } + + for (u32 i = 0; ; ++i) + { + if (name1[i] == EOS && name2[i] != EOS) + return -1; + else if (name1[i] != EOS && name2[i] == EOS) + return 1; + else if (name1[i] == EOS && name2[i] == EOS) + return 0; + + if (name1[i] < name2[i]) + return -1; + else if (name1[i] > name2[i]) + return 1; + } + + return 0; // Will never be reached +} + +static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + if (item1.quantity < item2.quantity) + return 1; + else if (item1.quantity > item2.quantity) + return -1; + + return CompareItemsAlphabetically(pocketId, item1, item2); // Items have same quantity so sort alphabetically +} + +static s32 CompareItemsByType(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + enum ItemSortType type1 = gItemsInfo[item1.itemId].sortType; + enum ItemSortType type2 = gItemsInfo[item2.itemId].sortType; + + // Null and uncategorized items go last + if (type1 && !type2) + return -1; + else if (type2 && !type1) + return 1; + else if (type1 < type2) + return -1; + else if (type1 > type2) + return 1; + + return CompareItemsAlphabetically(pocketId, item1, item2); // Items are of same type so sort alphabetically +} + +static s32 CompareItemsByIndex(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) +{ + u16 index1 = 0, index2 = 0; + + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + + switch (pocketId) + { + case POCKET_TM_HM: + index1 = GetItemTMHMIndex(item1.itemId); + index2 = GetItemTMHMIndex(item2.itemId); + break; + case POCKET_BERRIES: // To do - requires #7305 + index1 = item1.itemId; + index2 = item2.itemId; + break; + default: + return 0; + } + + if (index1 < index2) + return -1; + else if (index1 > index2) + return 1; + + return 0; // Cannot have multiple stacks of indexed items +} diff --git a/src/menu_helpers.c b/src/menu_helpers.c index e1483c9579..3b97d1f404 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -322,13 +322,12 @@ bool8 MenuHelpers_ShouldWaitForLinkRecv(void) void SetItemListPerPageCount(struct ItemSlot *slots, u8 slotsCount, u8 *pageItems, u8 *totalItems, u8 maxPerPage) { u16 i; - struct ItemSlot *slots_ = slots; // Count the number of non-empty item slots *totalItems = 0; for (i = 0; i < slotsCount; i++) { - if (slots_[i].itemId != ITEM_NONE) + if (slots[i].itemId != ITEM_NONE) (*totalItems)++; } (*totalItems)++; // + 1 for 'Cancel' diff --git a/test/bag.c b/test/bag.c index 6d0620dd6e..fe33d01eee 100644 --- a/test/bag.c +++ b/test/bag.c @@ -1,7 +1,7 @@ #include "global.h" #include "battle.h" #include "event_data.h" -#include "item.h" +#include "item_menu.h" #include "pokemon.h" #include "test/overworld_script.h" #include "test/test.h" @@ -19,6 +19,11 @@ TEST("TMs and HMs are sorted correctly in the bag") ASSUME(GetItemPocket(ITEM_TM01) == POCKET_TM_HM); ASSUME(GetItemPocket(ITEM_HM02) == POCKET_TM_HM); + /* + * Note: I would add a test to make sure that TMs are sorted correctly by move name, + * but downstream users are likely to rearrange TMs so this would just be a nuisance. + */ + RUN_OVERWORLD_SCRIPT( additem ITEM_HM07; additem ITEM_TM25; @@ -30,7 +35,7 @@ TEST("TMs and HMs are sorted correctly in the bag") additem ITEM_HM02; ); - SortPocket(POCKET_TM_HM, SORT_POCKET_TM_HM); + SortItemsInBag(&gBagPockets[POCKET_TM_HM], SORT_BY_INDEX); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_TM01); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_TM05); @@ -67,7 +72,7 @@ TEST("Berries are sorted correctly in the bag") additem ITEM_CHERI_BERRY; ); - SortPocket(POCKET_BERRIES, SORT_POCKET_BY_ITEM_ID); + SortItemsInBag(&gBagPockets[POCKET_BERRIES], SORT_BY_INDEX); EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHERI_BERRY); EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_ORAN_BERRY); @@ -78,9 +83,21 @@ TEST("Berries are sorted correctly in the bag") EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_GANLON_BERRY); EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_MICLE_BERRY); EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); + + SortItemsInBag(&gBagPockets[POCKET_BERRIES], SORT_ALPHABETICALLY); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHARTI_BERRY); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_CHERI_BERRY); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_GANLON_BERRY); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_KELPSY_BERRY); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_MAGOST_BERRY); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_MICLE_BERRY); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_ORAN_BERRY); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_POMEG_BERRY); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); } -TEST("Items are correctly compacted in the bag") +TEST("Items are correctly sorted and compacted in the bag") { struct BagPocket *pocket = &gBagPockets[POCKET_ITEMS]; memset(pocket->itemSlots, 0, sizeof(gSaveBlock1Ptr->bag.items)); @@ -115,21 +132,31 @@ TEST("Items are correctly compacted in the bag") EXPECT_EQ(pocket->itemSlots[5].quantity, 1); EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); - // Try removing the small items, check that everything is compacted correctly + SortItemsInBag(&gBagPockets[POCKET_ITEMS], SORT_ALPHABETICALLY); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + + // Try removing the big items, check that everything is compacted correctly RUN_OVERWORLD_SCRIPT( - removeitem ITEM_NUGGET; - removeitem ITEM_TINY_MUSHROOM; - removeitem ITEM_PEARL; + removeitem ITEM_BIG_NUGGET; + removeitem ITEM_BIG_MUSHROOM; + removeitem ITEM_BIG_PEARL; ); CompactItemsInBagPocket(POCKET_ITEMS); - EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); EXPECT_EQ(pocket->itemSlots[0].quantity, 1); - EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_PEARL); EXPECT_EQ(pocket->itemSlots[1].quantity, 1); - EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); EXPECT_EQ(pocket->itemSlots[2].quantity, 1); EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NONE); EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_NONE); From dc1abb72dc7e64ad225cd556dca256eb47942e6a Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 29 Jul 2025 12:13:29 +0100 Subject: [PATCH 171/248] Fix substruct offsets from #7313 (#7431) --- src/pokemon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 8ddfd5d5b4..bcbf672bd9 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2226,10 +2226,10 @@ static void DecryptBoxMon(struct BoxPokemon *boxMon) static const u8 sSubstructOffsets[4][24] = { - [SUBSTRUCT_TYPE_0] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}, - [SUBSTRUCT_TYPE_1] = {1, 1, 2, 2, 3, 3, 0, 0, 2, 2, 3, 3, 0, 0, 1, 1, 3, 3, 0, 0, 1, 1, 2, 2}, - [SUBSTRUCT_TYPE_2] = {2, 3, 1, 3, 1, 2, 2, 3, 0, 3, 0, 2, 1, 3, 0, 3, 0, 1, 1, 2, 0, 2, 0, 1}, - [SUBSTRUCT_TYPE_3] = {3, 2, 3, 1, 2, 1, 3, 2, 3, 0, 2, 0, 3, 1, 3, 0, 1, 0, 2, 1, 2, 0, 1, 0} + [SUBSTRUCT_TYPE_0] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 2, 3, 1, 1, 2, 3, 2, 3, 1, 1, 2, 3, 2, 3}, + [SUBSTRUCT_TYPE_1] = {1, 1, 2, 3, 2, 3, 0, 0, 0, 0, 0, 0, 2, 3, 1, 1, 3, 2, 2, 3, 1, 1, 3, 2}, + [SUBSTRUCT_TYPE_2] = {2, 3, 1, 1, 3, 2, 2, 3, 1, 1, 3, 2, 0, 0, 0, 0, 0, 0, 3, 2, 3, 2, 1, 1}, + [SUBSTRUCT_TYPE_3] = {3, 2, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 3, 2, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0}, }; ARM_FUNC NOINLINE static u32 ConstantMod24(u32 a) { return a % 24; } From a16d6e3bfe64c0e13415edf3657cf14abd4b12b6 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 1 Aug 2025 12:10:44 -0400 Subject: [PATCH 172/248] Avoid doubling up on status moves in double battles. (#7452) --- src/battle_ai_main.c | 21 ++++++++++++--- test/battle/ai/ai_doubles.c | 53 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index d29becb2ea..fc2ac90b1d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1720,7 +1720,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gBattleMons[battlerAtk].volatiles.dragonCheer || gBattleMons[battlerAtk].volatiles.focusEnergy) ADJUST_SCORE(-10); break; + case EFFECT_NON_VOLATILE_STATUS: + if (GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_FOES_AND_ALLY + && PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + ADJUST_SCORE(-10); + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + break; case EFFECT_CONFUSE: + if (GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_FOES_AND_ALLY + && PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + ADJUST_SCORE(-10); case EFFECT_SWAGGER: case EFFECT_FLATTER: if (!AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) @@ -1853,7 +1863,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STICKY_WEB: if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) ADJUST_SCORE(-10); - else if (PartnerMoveIsSameNoTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) && IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) + if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); // only one mon needs to set up Sticky Web break; case EFFECT_FORESIGHT: @@ -1881,7 +1891,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); //Both enemies are perish songed } - else if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + else if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { ADJUST_SCORE(-10); } @@ -2547,7 +2557,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // This only happens if the ally already rolled on double trick room on final turn. // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. - if (gFieldTimers.trickRoomTimer == gBattleTurnCounter) + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter) ADJUST_SCORE(PERFECT_EFFECT); else ADJUST_SCORE(-10); @@ -2854,6 +2864,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); } break; + case EFFECT_COURT_CHANGE: + case EFFECT_TEATIME: + if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + ADJUST_SCORE(-10); + break; case EFFECT_PLACEHOLDER: return 0; // cannot even select } // move effect checks diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index e4ab8610ab..60dce82801 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -85,6 +85,59 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He } } +TO_DO_BATTLE_TEST("AI understands Instruct") + +TO_DO_BATTLE_TEST("AI understands Quick Guard") +TO_DO_BATTLE_TEST("AI understands Wide Guard") + +AI_DOUBLE_BATTLE_TEST("AI will not use the same nondamaging move as its partner for no reason") +{ + u32 move; + PARAMETRIZE { move = MOVE_AROMATHERAPY; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } + PARAMETRIZE { move = MOVE_FOLLOW_ME; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } + PARAMETRIZE { move = MOVE_GRAVITY; } + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_HEAL_BELL; } + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_LUCKY_CHANT; } + PARAMETRIZE { move = MOVE_MAGIC_ROOM; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } + PARAMETRIZE { move = MOVE_MUD_SPORT; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; } + PARAMETRIZE { move = MOVE_RAIN_DANCE; } + PARAMETRIZE { move = MOVE_REFLECT; } + PARAMETRIZE { move = MOVE_SAFEGUARD; } + PARAMETRIZE { move = MOVE_SANDSTORM; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_SPOTLIGHT; } + PARAMETRIZE { move = MOVE_STEALTH_ROCK; } + PARAMETRIZE { move = MOVE_SUNNY_DAY; } + PARAMETRIZE { move = MOVE_TAILWIND; } + PARAMETRIZE { move = MOVE_TEETER_DANCE; } + PARAMETRIZE { move = MOVE_TRICK_ROOM; } + PARAMETRIZE { move = MOVE_WATER_SPORT; } + PARAMETRIZE { move = MOVE_COURT_CHANGE; } + PARAMETRIZE { move = MOVE_PERISH_SONG; } + PARAMETRIZE { move = MOVE_STICKY_WEB; } + PARAMETRIZE { move = MOVE_TEATIME; } + PARAMETRIZE { move = MOVE_WONDER_ROOM; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_TACKLE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); EXPECT_MOVE(opponentRight, MOVE_TACKLE); } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner without a positive effect") { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); From 0b44093a8e946a0b808888594e49545c0866f592 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 1 Aug 2025 12:11:34 -0400 Subject: [PATCH 173/248] Adds AI_FLAG_ASSUMPTIONS as a constant for semi-omniscience (#7435) --- include/constants/battle_ai.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index db386be4b0..8781640d60 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -45,6 +45,7 @@ #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) #define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION | AI_FLAG_SMART_TERA) #define AI_FLAG_PREDICTION (AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON | AI_FLAG_PREDICT_MOVE) +#define AI_FLAG_ASSUMPTIONS (AI_FLAG_ASSUME_STAB | AI_FLAG_ASSUME_STATUS_MOVES | AI_FLAG_WEIGH_ABILITY_PREDICTION) // 'other' ai logic flags #define AI_FLAG_DYNAMIC_FUNC ((u64)1 << 60) // Create custom AI functions for specific battles via "setdynamicaifunc" cmd From 73fd5675201f8cbbd515289d48a1c1000a7e4a0d Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 1 Aug 2025 19:13:23 +0300 Subject: [PATCH 174/248] Additional effects tweak (#7392) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- docs/tutorials/how_to_new_move.md | 21 ++++++++++++--------- include/battle_ai_util.h | 4 ++-- include/battle_util.h | 2 +- include/constants/battle.h | 2 +- include/constants/battle_string_ids.h | 3 +-- include/move.h | 17 +++++++---------- src/battle_ai_util.c | 4 ++-- src/battle_script_commands.c | 23 ++--------------------- src/battle_tv.c | 2 +- src/battle_util.c | 9 ++------- src/data/moves_info.h | 21 +++++++++++++++------ 11 files changed, 46 insertions(+), 62 deletions(-) diff --git a/docs/tutorials/how_to_new_move.md b/docs/tutorials/how_to_new_move.md index e4289f4c58..442e2b28c9 100644 --- a/docs/tutorials/how_to_new_move.md +++ b/docs/tutorials/how_to_new_move.md @@ -40,7 +40,6 @@ Let's look at an example: .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .sheerForceBoost = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 10, @@ -140,7 +139,18 @@ If you look at the example [here](#srcdatamoves_infoh), you can see that Thunder All additional effects with a defined chance (even 100%) are treated as "secondary effects". This means that they are nullified by Sheer Force, blocked by Shield Dust or the Covert Cloak, and have their chance modified by Serene Grace. Additional effects without a chance field (effectively setting it to 0) are treated as "primary effects", which means that they cannot be blocked by the aforementioned items and abilities and their chance to occur cannot be modified; they will *always* happen. -Each move can have up to 15 additional effects, allowing you to construct monstrosities like this: +Depending on the move effect, it is possible to also set a `multistring` value. For example: + +``` +.additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + .multistring = B_MSG_WRAPPED_MAGMA_STORM, +}), +``` + +For Magma Storm, we not only want the wrapping move effect, we want to give it a unique string when it activates. The index is an enum defined in `battle_string_ids.h` and it corresponds to an entry (for this move effect) in the `gWrappedStringIds` list in battle_message.c. For custom strings, you need to add an enum and an entry respectively. For new custom move effects, you will have to add a new set of enums and a new table of strings. + +Each move can have up to 3 additional effects, allowing you to construct monstrosities like this: ``` [MOVE_POUND] = { @@ -165,13 +175,6 @@ Each move can have up to 15 additional effects, allowing you to construct monstr },{ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, - },{ - .moveEffect = MOVE_EFFECT_ALL_STATS_UP, - .chance = 40, - .self = TRUE, - },{ - .moveEffect = MOVE_EFFECT_DEF_MINUS_2, - .chance = 50, }), .makesContact = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS == GEN_4, diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index ec8c250fd2..f5af4acb33 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -202,8 +202,8 @@ bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); -bool32 IsSelfStatLoweringEffect(enum MoveEffects effect); -bool32 IsSelfStatRaisingEffect(enum MoveEffects effect); +bool32 IsSelfStatLoweringEffect(enum MoveEffect effect); +bool32 IsSelfStatRaisingEffect(enum MoveEffect effect); bool32 IsSwitchOutEffect(enum BattleMoveEffects effect); bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); diff --git a/include/battle_util.h b/include/battle_util.h index 272ccf3d1e..95efdd9922 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -357,7 +357,7 @@ bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 ability); bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects secondaryMoveEffect, enum FunctionCallOption option); +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); diff --git a/include/constants/battle.h b/include/constants/battle.h index de4b3f40ba..5faa91ad7e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -392,7 +392,7 @@ enum BattleWeather #define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -enum __attribute__((packed)) MoveEffects +enum __attribute__((packed)) MoveEffect { MOVE_EFFECT_NONE, MOVE_EFFECT_SLEEP, diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 57cf6f7021..df7b5e6232 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1167,8 +1167,7 @@ enum StartingStatusStringID }; // gWrappedStringIds -// These correspond in order to sTrappingMoves! -enum WrappedStringID +enum __attribute__((packed)) WrappedStringID { B_MSG_WRAPPED_BIND, B_MSG_WRAPPED_WRAP, diff --git a/include/move.h b/include/move.h index fa89ec3cf3..61483e402e 100644 --- a/include/move.h +++ b/include/move.h @@ -4,6 +4,7 @@ #include "contest_effect.h" #include "constants/battle.h" #include "constants/battle_move_effects.h" +#include "constants/battle_string_ids.h" #include "constants/moves.h" // For defining EFFECT_HIT etc. with battle TV scores and flags etc. @@ -21,21 +22,17 @@ struct __attribute__((packed, aligned(2))) BattleMoveEffect #define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} #define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) -enum SheerForceBoost -{ - SHEER_FORCE_AUTO_BOOST, // This is the default state when a move has a move effect with a chance - SHEER_FORCE_BOOST, // If a move effect doesn't have an effect with a chance this can force a boost - SHEER_FORCE_NO_BOOST, // Prevents a Sheer Force boost -}; - struct AdditionalEffect { - enum MoveEffects moveEffect; + enum MoveEffect moveEffect; u8 self:1; u8 onlyIfTargetRaisedStats:1; u8 onChargeTurnOnly:1; - u8 sheerForceBoost:2; // Handles edge cases for Sheer Force - u8 padding:3; + u8 sheerForceOverride:1; // Handles edge cases for Sheer Force - if TRUE, boosts when it shouldn't, or doesn't boost when it should + u8 padding:4; + union PACKED { + enum WrappedStringID wrapped; + } multistring; u8 chance; // 0% = effect certain, primary effect }; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dc766c9ee8..b4e0cbaaf4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2673,7 +2673,7 @@ bool32 IsStatLoweringEffect(enum BattleMoveEffects effect) } } -bool32 IsSelfStatLoweringEffect(enum MoveEffects effect) +bool32 IsSelfStatLoweringEffect(enum MoveEffect effect) { // Self stat lowering moves like Overheart, Superpower etc. switch (effect) @@ -2701,7 +2701,7 @@ bool32 IsSelfStatLoweringEffect(enum MoveEffects effect) } } -bool32 IsSelfStatRaisingEffect(enum MoveEffects effect) +bool32 IsSelfStatRaisingEffect(enum MoveEffect effect) { // Self stat lowering moves like Power Up Punch or Charge Beam switch (effect) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d7ccf40f53..e615c9d2d1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -288,20 +288,6 @@ static const s32 sExperienceScalingFactors[] = 159767, }; -static const u16 sTrappingMoves[NUM_TRAPPING_MOVES] = -{ - MOVE_BIND, - MOVE_WRAP, - MOVE_FIRE_SPIN, - MOVE_CLAMP, - MOVE_WHIRLPOOL, - MOVE_SAND_TOMB, - MOVE_MAGMA_STORM, - MOVE_INFESTATION, - MOVE_SNAP_TRAP, - MOVE_THUNDER_CAGE -}; - static const u16 sWhiteOutBadgeMoney[9] = { 8, 16, 24, 36, 48, 64, 80, 100, 120 }; enum GiveCaughtMonStates @@ -2900,7 +2886,7 @@ static inline bool32 TrySetLightScreen(u32 battler) return FALSE; } -static void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffects effect, enum StatusTrigger trigger) +static void SetNonVolatileStatusCondition(u32 effectBattler, enum MoveEffect effect, enum StatusTrigger trigger) { gEffectBattler = effectBattler; @@ -3187,12 +3173,6 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectWrap; - - for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattleCommunication[MULTISTRING_CHOOSER] < NUM_TRAPPING_MOVES; gBattleCommunication[MULTISTRING_CHOOSER]++) - { - if (sTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) - break; - } } break; case MOVE_EFFECT_ATK_PLUS_1: @@ -4123,6 +4103,7 @@ static void Cmd_setadditionaleffects(void) if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance)) { gBattleScripting.moveEffect = additionalEffect->moveEffect; + gBattleCommunication[MULTISTRING_CHOOSER] = *((u8 *) &additionalEffect->multistring); SetMoveEffect( gBattlerAttacker, diff --git a/src/battle_tv.c b/src/battle_tv.c index dbcb9fb101..e23712beab 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -768,7 +768,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) { const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - switch ((enum MoveEffects)additionalEffect->moveEffect) + switch ((enum MoveEffect)additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: diff --git a/src/battle_util.c b/src/battle_util.c index cd33223a6e..ce82a997cc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5625,7 +5625,7 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return FALSE; } -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffects effect, enum FunctionCallOption option) +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect effect, enum FunctionCallOption option) { const u8 *battleScript = NULL; u32 sideBattler = ABILITY_NONE; @@ -11044,12 +11044,7 @@ bool32 MoveIsAffectedBySheerForce(u32 move) for (i = 0; i < numAdditionalEffects; i++) { const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - if (additionalEffect->sheerForceBoost == SHEER_FORCE_NO_BOOST) - continue; - - if (additionalEffect->chance > 0) - return TRUE; - if (additionalEffect->sheerForceBoost == SHEER_FORCE_BOOST) + if ((additionalEffect->chance > 0) != additionalEffect->sheerForceOverride) return TRUE; } return FALSE; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index adab4af3cc..4edf88f17a 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -631,6 +631,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_BIND, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -1018,6 +1019,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_WRAP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -2255,6 +2257,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_FIRE_SPIN, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -3428,6 +3431,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_CLAMP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -6639,6 +6643,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .damagesUnderwater = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_WHIRLPOOL, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -8670,6 +8675,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_SAND_TOMB, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, @@ -11990,6 +11996,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_MAGMA_STORM, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -15612,6 +15619,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_INFESTATION, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, @@ -16003,7 +16011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .soundMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -17270,7 +17278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, .chance = 30, - .sheerForceBoost = SHEER_FORCE_NO_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_FloatyFall, }, @@ -17953,6 +17961,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_SNAP_TRAP, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -18935,6 +18944,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, + .multistring.wrapped = B_MSG_WRAPPED_THUNDER_CAGE, }), .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_COOL, @@ -19202,7 +19212,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .slicingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_StoneAxe, }, @@ -19527,7 +19537,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .makesContact = TRUE, .slicingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_CeaselessEdge, }, @@ -20837,7 +20847,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, .self = TRUE, .onChargeTurnOnly = TRUE, - .sheerForceBoost = SHEER_FORCE_BOOST, + .sheerForceOverride = TRUE, }), .battleAnimScript = gBattleAnimMove_ElectroShot, }, @@ -21113,7 +21123,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_TOXIC, .chance = 50, - .sheerForceBoost = SHEER_FORCE_BOOST, }), .battleAnimScript = gBattleAnimMove_MalignantChain, }, From 9faa5294ced5dc6684bfe2138caf75faf280f777 Mon Sep 17 00:00:00 2001 From: Linathan <35115312+LinathanZel@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:14:42 -0400 Subject: [PATCH 175/248] =?UTF-8?q?Wild=20Pok=C3=A9mon=20animate=20after?= =?UTF-8?q?=20breaking=20out=20of=20Pok=C3=A9=20Ball=20(#7339)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_2.s | 3 +++ include/battle_controllers.h | 1 + include/config/battle.h | 31 ++++++++++++++++--------------- src/battle_controllers.c | 9 +++++++++ src/battle_script_commands.c | 10 +++++++--- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c906938b93..c2a10b175c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -842,8 +842,9 @@ .byte 0x95 .endm - .macro unused_96 + .macro animatewildpokemonafterfailedpokeball battler:req .byte 0x96 + .byte \battler .endm .macro tryinfatuating failInstr:req diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 0e0f43893e..b46b30a443 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -211,6 +211,9 @@ BattleScript_WallyBallThrow:: finishturn BattleScript_ShakeBallThrow:: + animatewildpokemonafterfailedpokeball BS_TARGET + waitstate + waitmessage B_WAIT_TIME_LONG printfromtable gBallEscapeStringIds waitmessage B_WAIT_TIME_LONG jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, BATTLE_TYPE_SAFARI, BattleScript_ShakeBallThrowEnd diff --git a/include/battle_controllers.h b/include/battle_controllers.h index d5166ce6f8..4db4aea969 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -426,6 +426,7 @@ void LinkPartnerBufferExecCompleted(u32 battler); void TrySetBattlerShadowSpriteCallback(u32 battler); +void AnimateMonAfterPokeBallFail(u32 battler); void TryShinyAnimAfterMonAnim(u32 battler); void WaitForMonAnimAfterLoad(u32 battler); void BtlController_HandleSwitchInWaitAndEnd(u32 battler); diff --git a/include/config/battle.h b/include/config/battle.h index a58b174b46..d09698c634 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -267,21 +267,22 @@ #define B_NEW_TERRAIN_BACKGROUNDS FALSE // If set to TRUE, uses new terrain backgrounds for Electric, Misty, Grassy and Psychic Terrain. // Interface settings -#define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. -#define B_FAST_INTRO_PKMN_TEXT TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. -#define B_FAST_INTRO_NO_SLIDE FALSE // If set to TRUE, the slide animation that happens at the beginning of the battle is skipped. -#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. -#define B_FAST_EXP_GROW TRUE // If set to TRUE, EXP bars will move faster. -#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. -#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary and move relearner showing the move's category. -#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. -#define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles. -#define B_QUICK_MOVE_CURSOR_TO_RUN FALSE // If set to TRUE, pushing B in the battle options against a wild encounter will move the cursor to the run option -#define B_RUN_TRAINER_BATTLE TRUE // If set to TRUE, players can run from Trainer battles. This is treated as a whiteout. -#define B_MOVE_DESCRIPTION_BUTTON L_BUTTON // If set to a button other than B_LAST_USED_BALL_BUTTON, pressing this button will open the move description menu -#define B_SHOW_USELESS_Z_MOVE_INFO FALSE // If set to TRUE, Z-moves without additional effects like newer gen status moves will say "no additional effect" -#define B_ANIMATE_MON_AFTER_KO TRUE // If set to TRUE, if a Pokémon on the opposite site faints, the non-fainted Pokemon will display a victory animation. -#define B_SHOW_DYNAMAX_MESSAGE FALSE // If set to TRUE, an additional battle message is shown after completing Dynamaxing/Gigantamaxing. +#define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. +#define B_FAST_INTRO_PKMN_TEXT TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. +#define B_FAST_INTRO_NO_SLIDE FALSE // If set to TRUE, the slide animation that happens at the beginning of the battle is skipped. +#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. +#define B_FAST_EXP_GROW TRUE // If set to TRUE, EXP bars will move faster. +#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. +#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary and move relearner showing the move's category. +#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations. +#define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles. +#define B_QUICK_MOVE_CURSOR_TO_RUN FALSE // If set to TRUE, pushing B in the battle options against a wild encounter will move the cursor to the run option +#define B_RUN_TRAINER_BATTLE TRUE // If set to TRUE, players can run from Trainer battles. This is treated as a whiteout. +#define B_MOVE_DESCRIPTION_BUTTON L_BUTTON // If set to a button other than B_LAST_USED_BALL_BUTTON, pressing this button will open the move description menu +#define B_SHOW_USELESS_Z_MOVE_INFO FALSE // If set to TRUE, Z-moves without additional effects like newer gen status moves will say "no additional effect" +#define B_ANIMATE_MON_AFTER_KO TRUE // If set to TRUE, if a Pokémon on the opposite site faints, the non-fainted Pokemon will display a victory animation. +#define B_ANIMATE_MON_AFTER_FAILED_POKEBALL TRUE // If set to TRUE, if a Pokémon on the opposite side breaks out of a thrown Poké Ball, the wild Pokémon will display its animation. +#define B_SHOW_DYNAMAX_MESSAGE FALSE // If set to TRUE, an additional battle message is shown after completing Dynamaxing/Gigantamaxing. // Catching settings #define B_SEMI_INVULNERABLE_CATCH GEN_LATEST // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 193248ce27..d0e6117433 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2860,6 +2860,15 @@ void BtlController_HandleBattleAnimation(u32 battler) } } +void AnimateMonAfterPokeBallFail(u32 battler) +{ + if (B_ANIMATE_MON_AFTER_FAILED_POKEBALL == FALSE) + return; + + LaunchKOAnimation(battler, ReturnAnimIdForBattler(TRUE, battler), TRUE); + TryShinyAnimation(gBattlerTarget, GetBattlerMon(gBattlerTarget)); +} + static void AnimateMonAfterKnockout(u32 battler) { if (B_ANIMATE_MON_AFTER_KO == FALSE) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e615c9d2d1..9c4da75feb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -486,7 +486,7 @@ static void Cmd_setlightscreen(void); static void Cmd_tryKO(void); static void Cmd_checknonvolatiletrigger(void); static void Cmd_copybidedmg(void); -static void Cmd_unused_96(void); +static void Cmd_animatewildpokemonafterfailedpokeball(void); static void Cmd_tryinfatuating(void); static void Cmd_updatestatusicon(void); static void Cmd_setmist(void); @@ -745,7 +745,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_tryKO, //0x93 Cmd_checknonvolatiletrigger, //0x94 Cmd_copybidedmg, //0x95 - Cmd_unused_96, //0x96 + Cmd_animatewildpokemonafterfailedpokeball, //0x96 Cmd_tryinfatuating, //0x97 Cmd_updatestatusicon, //0x98 Cmd_setmist, //0x99 @@ -11016,8 +11016,12 @@ static void Cmd_copybidedmg(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_96(void) +static void Cmd_animatewildpokemonafterfailedpokeball(void) { + CMD_ARGS(u8 battler); + u8 battler = GetBattlerForBattleScript(cmd->battler); + AnimateMonAfterPokeBallFail(battler); + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_tryinfatuating(void) From 469a0b476a17d485046153456a0dac5e27a4f103 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 2 Aug 2025 12:54:39 +0200 Subject: [PATCH 176/248] Update trainer.h usage warning (#7439) Co-authored-by: Hedara --- tools/trainerproc/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index dc812cb153..5330c9fe3d 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -1733,9 +1733,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, "//\n"); fprintf(f, "// DO NOT MODIFY THIS FILE! It is auto-generated from %s\n", parsed->source->path); fprintf(f, "//\n"); - fprintf(f, "// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE\n"); - fprintf(f, "// in include/config/general.h and remove this notice.\n"); - fprintf(f, "// Use sed -i '/^#line/d' '%s' to remove #line markers.\n", output_path); + fprintf(f, "// If you want to modify this file see expansion PR #7154\n"); fprintf(f, "//\n"); fprintf(f, "\n"); From ed44da86444248ce541508461db6f5ed828896fc Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 2 Aug 2025 12:56:00 +0200 Subject: [PATCH 177/248] Add a heal animation to Hospitality recovery (#7426) --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5984fcd319..e6bf8e1db8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7613,6 +7613,7 @@ BattleScript_HospitalityActivates:: printstring STRINGID_HOSPITALITYRESTORATION waitmessage B_WAIT_TIME_LONG orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + playanimation BS_EFFECT_BATTLER, B_ANIM_SIMPLE_HEAL healthbarupdate BS_EFFECT_BATTLER datahpupdate BS_EFFECT_BATTLER end3 From 3841fee8880bc47a931fc4475be048f966841307 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 2 Aug 2025 15:17:44 +0200 Subject: [PATCH 178/248] Clean up noResultString (#7408) --- include/battle.h | 4 +--- include/constants/battle.h | 7 +++++++ src/battle_script_commands.c | 24 ++++++++++++------------ src/battle_util.c | 21 +++++++++++---------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/include/battle.h b/include/battle.h index 176adf7343..de25626c6b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -764,7 +764,7 @@ struct BattleStruct s16 critChance[MAX_BATTLERS_COUNT]; u16 moveResultFlags[MAX_BATTLERS_COUNT]; u8 missStringId[MAX_BATTLERS_COUNT]; - u8 noResultString[MAX_BATTLERS_COUNT]; + enum CalcDamageState noResultString[MAX_BATTLERS_COUNT]; u8 doneDoublesSpreadHit:1; u8 calculatedDamageDone:1; u8 calculatedSpreadMoveAccuracy:1; @@ -865,8 +865,6 @@ static inline bool32 IsBattleMoveStatus(u32 move) #define SET_STATCHANGER(statId, stage, goesDown) (gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) #define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) -#define DO_ACCURACY_CHECK 2 // Don't skip the accuracy check before the move might be absorbed - // NOTE: The members of this struct have hard-coded offsets // in include/constants/battle_script_commands.h struct BattleScripting diff --git a/include/constants/battle.h b/include/constants/battle.h index 5faa91ad7e..730dbd63c7 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -700,4 +700,11 @@ enum MonState MON_OUTSIDE_BATTLE, }; +enum __attribute__((packed)) CalcDamageState +{ + CAN_DAMAGE, + WILL_FAIL, + CHECK_ACCURACY, +}; + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9c4da75feb..162e55dba9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1407,7 +1407,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u if ((!calcSpreadMove && battlerDef != gBattlerTarget) || IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; numTargets++; @@ -1743,7 +1743,7 @@ static void Cmd_critcalc(void) continue; if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; @@ -1819,7 +1819,7 @@ static void Cmd_damagecalc(void) for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; @@ -1882,7 +1882,7 @@ static void Cmd_adjustdamage(void) continue; if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef]) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; if (DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) @@ -2029,8 +2029,8 @@ static u32 UpdateEffectivenessResultFlagsForDoubleSpreadMoves(u32 resultFlags) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if ((gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) - || gBattleStruct->noResultString[battlerDef])) + if (gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; switch (sound) @@ -2115,7 +2115,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; if (TryStrongWindsWeakenAttack(battlerDef, moveType)) @@ -2127,7 +2127,7 @@ static bool32 ProcessPreAttackAnimationFuncs(void) { if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || (gBattleStruct->noResultString[battlerDef] && gBattleStruct->noResultString[battlerDef] != DO_ACCURACY_CHECK)) + || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) continue; if (TryTeraShellDistortTypeMatchups(battlerDef)) @@ -2255,7 +2255,7 @@ static void DoublesHPBarReduction(void) { if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT || gBattleStruct->moveDamage[battlerDef] == 0 - || gBattleStruct->noResultString[battlerDef] + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove) || DoesDisguiseBlockMove(battlerDef, gCurrentMove)) continue; @@ -2534,7 +2534,7 @@ static inline bool32 ShouldPrintTwoFoesMessage(u32 moveResult) { return gBattlerTarget == BATTLE_OPPOSITE(gBattlerAttacker) && gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & moveResult - && !gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)]; + && gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)] == CAN_DAMAGE; } static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) @@ -2542,7 +2542,7 @@ static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) return gBattlerTarget == BATTLE_PARTNER(BATTLE_OPPOSITE(gBattlerAttacker)) && gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & moveResult && !(gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & MOVE_RESULT_MISSED && gBattleStruct->missStringId[BATTLE_OPPOSITE(gBattlerAttacker)] > B_MSG_AVOIDED_ATK) - && !gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)]; + && gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)] == CAN_DAMAGE; } static void Cmd_resultmessage(void) @@ -8247,7 +8247,7 @@ static void Cmd_hitanimation(void) for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT - || gBattleStruct->noResultString[battlerDef]) + || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) diff --git a/src/battle_util.c b/src/battle_util.c index ce82a997cc..caa4be0191 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -205,7 +205,7 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = // Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly // This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI -static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities) +static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, bool32 recordAbilities) { struct DamageContext ctx = {0}; ctx.battlerAtk = battlerAtk; @@ -213,8 +213,8 @@ static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u3 ctx.move = move; ctx.moveType = moveType; ctx.updateFlags = recordAbilities; - ctx.abilityAtk = GetBattlerAbility(battlerAtk); - ctx.abilityDef = defAbility; + ctx.abilityAtk = abilityAtk; + ctx.abilityDef = abilityDef; ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); @@ -2541,22 +2541,23 @@ static enum MoveCanceller CancellerMultiTargetMoves(void) || IsBattlerProtected(gBattlerAttacker, battlerDef, gCurrentMove)) // Missing Invulnerable check { gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; - gBattleStruct->noResultString[battlerDef] = TRUE; + gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } else if (CanAbilityBlockMove(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER) || (IsBattlerTerrainAffected(gBattlerAttacker, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(gBattlerAttacker, abilityAtk, gCurrentMove) > 0)) { gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = TRUE; + gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } else if (CanAbilityAbsorbMove(gBattlerAttacker, battlerDef, abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = DO_ACCURACY_CHECK; + gBattleStruct->noResultString[battlerDef] = CHECK_ACCURACY; } else { - CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, GetBattlerAbility(battlerDef), TRUE); + CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, abilityAtk, abilityDef, TRUE); // Sets moveResultFlags + gBattleStruct->noResultString[battlerDef] = CAN_DAMAGE; } } if (moveTarget == MOVE_TARGET_BOTH) @@ -5669,7 +5670,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u battleScript = BattleScript_NotAffected; } else if (option == RUN_SCRIPT // Check only important during battle execution for moves - && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityDef, TRUE) + && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) { battleScript = BattleScript_ButItFailed; @@ -11223,7 +11224,7 @@ static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerD bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) { u32 moveType = GetBattleMoveType(gCurrentMove); - return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) + return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) || IsSemiInvulnerable(battlerDef, gCurrentMove) || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); @@ -11284,7 +11285,7 @@ void ClearDamageCalcResults(void) { gBattleStruct->moveDamage[battler] = 0; gBattleStruct->critChance[battler] = 0; - gBattleStruct->moveResultFlags[battler] = 0; + gBattleStruct->moveResultFlags[battler] = CAN_DAMAGE; gBattleStruct->noResultString[battler] = 0; gBattleStruct->missStringId[battler] = 0; gSpecialStatuses[battler].criticalHit = FALSE; From 4d31693005bf628bfe259a7be9f3f47f87b3f810 Mon Sep 17 00:00:00 2001 From: pokesidv <216572922+pokesidv@users.noreply.github.com> Date: Sun, 3 Aug 2025 14:52:07 +0200 Subject: [PATCH 179/248] Rock climb by ghoulslash (#7432) Co-authored-by: Evan Co-authored-by: Jaizu Co-authored-by: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Co-authored-by: ghoulslash Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- data/field_effect_scripts.s | 10 + data/scripts/field_move_scripts.inc | 33 +++ graphics/field_effects/palettes/big_dust.pal | 19 ++ .../field_effects/pics/rock_climb_blob.png | Bin 0 -> 383 bytes .../field_effects/pics/rock_climb_dust.png | Bin 0 -> 558 bytes include/config/overworld.h | 1 + include/constants/event_object_movement.h | 5 + include/constants/field_effects.h | 5 + include/constants/field_move.h | 3 + include/constants/metatile_behaviors.h | 2 +- include/event_scripts.h | 1 + include/field_effect.h | 2 +- include/metatile_behavior.h | 1 + include/party_menu.h | 1 + spritesheet_rules.mk | 6 + .../field_effect_object_template_pointers.h | 4 + src/data/field_effects/field_effect_objects.h | 44 +++ .../movement_action_func_tables.h | 43 +++ .../object_events/object_event_graphics.h | 3 + src/event_object_movement.c | 47 ++- src/field_control_avatar.c | 3 + src/field_effect.c | 271 +++++++++++++++++- src/field_effect_helpers.c | 26 +- src/field_move.c | 18 +- src/metatile_behavior.c | 9 + src/party_menu.c | 23 ++ 26 files changed, 567 insertions(+), 13 deletions(-) create mode 100644 graphics/field_effects/palettes/big_dust.pal create mode 100644 graphics/field_effects/pics/rock_climb_blob.png create mode 100644 graphics/field_effects/pics/rock_climb_dust.png diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 98ed66a13d..34678bb293 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -81,6 +81,8 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT .4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST .4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG + .4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB + .4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon @@ -384,3 +386,11 @@ gFieldEffectScript_CaveDust:: gFieldEffectScript_Defog:: field_eff_callnative FldEff_Defog field_eff_end +gFieldEffectScript_UseRockClimb:: @ 82DBC3F + field_eff_callnative FldEff_UseRockClimb + field_eff_end + +gFieldEffectScript_RockClimbDust:: @ 82DBB28 + field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust + field_eff_end + diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index bfc6958138..e9a88367a7 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -441,3 +441,36 @@ EventScript_UseDefog:: waitstate releaseall end + +EventScript_UseRockClimb:: + lockall + checkfieldmove FIELD_MOVE_ROCK_CLIMB + goto_if_eq VAR_RESULT, PARTY_SIZE, EventScript_CantRockClimb + bufferpartymonnick STR_VAR_1, VAR_RESULT + setfieldeffectargument 0, VAR_RESULT + msgbox Text_WantToRockClimb, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, EventScript_EndRockClimb + msgbox Text_MonUsedRockClimb, MSGBOX_DEFAULT + closemessage + dofieldeffect FLDEFF_USE_ROCK_CLIMB + waitstate + goto EventScript_EndRockClimb + end + +EventScript_CantRockClimb:: + msgbox Text_CantRockClimb, MSGBOX_DEFAULT + +EventScript_EndRockClimb:: + releaseall + end + +Text_WantToRockClimb: + .string "The cliff is steep.\n" + .string "Would you like to use Rock Climb?$" + +Text_MonUsedRockClimb: + .string "{STR_VAR_1} used Rock Climb!$" + +Text_CantRockClimb: + .string "The cliff is steep.\n" + .string "A Pokémon may be able to climb it.$" diff --git a/graphics/field_effects/palettes/big_dust.pal b/graphics/field_effects/palettes/big_dust.pal new file mode 100644 index 0000000000..34beaf0371 --- /dev/null +++ b/graphics/field_effects/palettes/big_dust.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 172 238 +198 181 156 +165 140 115 +181 165 140 +148 123 99 +206 198 173 +189 173 148 +82 74 57 +222 180 148 +140 123 82 +173 156 123 +238 213 180 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/field_effects/pics/rock_climb_blob.png b/graphics/field_effects/pics/rock_climb_blob.png new file mode 100644 index 0000000000000000000000000000000000000000..19a9a7cea9b64d8b91262792826091934322e1cf GIT binary patch literal 383 zcmV-_0f7FAP)5Fk0;=I(RNb4rv_|6*FjK|%lj{{R30FCfkm00009 za7bBm000&x000&x0ZCFM@Bjb+^+`lQR5*?8Q#*FUFbvb=Ri~3ydx=+G-AlBhvPnp! zlfJ$VnObh301*16^k09gfa7=kN0FcaJX+-D*ZIXOmiDN!x%IXS9L^`dD+d2GsFQ)c zukKFKE`F&TA(ugI(Qn|Co+>B@11V%Eg9FoHWD+x2)iS>b#2RJYT%wU7Gr-DB7!x!T zXrM=n7Xc#_I|mw66O2eaCw8jc4lUPj1t8%F3^9RCteApk4HbwPz%~uLIB*ZkrKqDJ zY9Lc^J&h^oBeV{0ATEIw@8M(sVPYU;#C1|8mN1Yb9A7D0gr3khj6H?A{kXefjvwkx d{Ydy+eE}yq7eUcLbl?C0002ovPDHLkV1g59m4pBQ literal 0 HcmV?d00001 diff --git a/graphics/field_effects/pics/rock_climb_dust.png b/graphics/field_effects/pics/rock_climb_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..541c6ba9b8b3f3dba8f8546fe42f643169103d96 GIT binary patch literal 558 zcmV+}0@3}6P)=jL9sbPN{d@04`5?qC0JaozJOq5XKm{X z`p@jeM9pC`9Jd)V-^@S%#u$y4%uEZSayg+qBckKmF5j}drwTxH`<)%9hZ|b<`K|+( z33yK_vQ}rVd{6nZ>rZs|QEO_WO|PSkC@7CQV3z9uYMMw5ad0c7&o(w%Giz)-2fyxs zed&+@+fdGKApqMJh`bY!9{`6m@L5cNy=HGdxi5(?6(F(zM3e5^M3q{~RPenE%Fw|W z&s_chYz*?&+X$efb!+F+?2B(%V211n6IGID(mv>o76AH^hJXY1E&(p^J@}Ijcti*2 zf+R7Pu(bG!LqLOrg+J|pCv-4b`MqXn~xIssJ!|uBhZJsx-0h zlKzp}3PH8gZ=*&CAg37!Ovr)AwYhDLk`2X{2jsK5TXz}N5q@=LF$wL|Hq!&#*T~n6Z1+oDC%k~ wpx;7Wj}>ILUya0KB%o8SCKM|$R?g)30(n1Mi4fg(6#xJL07*qoM6N<$g5})wKL7v# literal 0 HcmV?d00001 diff --git a/include/config/overworld.h b/include/config/overworld.h index b1f107ce63..480c5dbcea 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -11,6 +11,7 @@ #define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last. #define OW_WHITEOUT_CUTSCENE GEN_LATEST // In Gen4+, whiting out shows an additional message and post whiteout event script cutscene with a healing NPC. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.) #define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt. +#define OW_ROCK_CLIMB_FIELD_MOVE FALSE // If enabled, Rock Climb can be used as a Field Move as seen in DPPt. // Item Obtain Description Box #define OW_ITEM_DESCRIPTIONS_OFF 0 // never show descriptions diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 4e1b3a34ea..4f183d7667 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -259,6 +259,11 @@ #define MOVEMENT_ACTION_SURF_STILL_UP 0xAB #define MOVEMENT_ACTION_SURF_STILL_LEFT 0xAC #define MOVEMENT_ACTION_SURF_STILL_RIGHT 0xAD +//fast diagonal movement +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT 0xAE +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT 0xAF +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT 0xB0 +#define MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT 0xB1 #define MOVEMENT_ACTION_STEP_END 0xFE #define MOVEMENT_ACTION_NONE 0xFF diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index e47cc292c3..e38b25cac7 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -77,6 +77,8 @@ #define FLDEFF_TRACKS_BUG 72 #define FLDEFF_CAVE_DUST 73 #define FLDEFF_DEFOG 74 +#define FLDEFF_USE_ROCK_CLIMB 75 +#define FLDEFF_ROCK_CLIMB_DUST 76 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 @@ -119,6 +121,8 @@ #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 #define FLDEFFOBJ_CAVE_DUST 40 +#define FLDEFFOBJ_ROCK_CLIMB_BLOB 41 +#define FLDEFFOBJ_ROCK_CLIMB_DUST 42 #define FLDEFF_PAL_TAG_CUT_GRASS 0x1000 #define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003 @@ -133,6 +137,7 @@ #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 #define FLDEFF_PAL_TAG_CAVE_DUST 0x1012 +#define FLDEFF_PAL_TAG_DUST_CLOUD 0x1013 #define FLDEFF_PAL_TAG_FIELD_MOVE_MON 0x8400 // tile tags, for field effects that may have many copies on screen at once diff --git a/include/constants/field_move.h b/include/constants/field_move.h index 1d0fb83977..c6c49c8708 100644 --- a/include/constants/field_move.h +++ b/include/constants/field_move.h @@ -18,6 +18,9 @@ enum FieldMove FIELD_MOVE_MILK_DRINK, FIELD_MOVE_SOFT_BOILED, FIELD_MOVE_SWEET_SCENT, +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE + FIELD_MOVE_ROCK_CLIMB, +#endif #if OW_DEFOG_FIELD_MOVE == TRUE FIELD_MOVE_DEFOG, #endif diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 505f279f73..12ced67a9f 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -241,7 +241,7 @@ enum { MB_UP_LEFT_STAIR_WARP, MB_DOWN_RIGHT_STAIR_WARP, MB_DOWN_LEFT_STAIR_WARP, - MB_UNUSED_EF, + MB_ROCK_CLIMB, NUM_METATILE_BEHAVIORS }; diff --git a/include/event_scripts.h b/include/event_scripts.h index fa2df54740..646b054195 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -573,6 +573,7 @@ extern const u8 EventScript_UseWaterfall[]; extern const u8 EventScript_CannotUseWaterfall[]; extern const u8 EventScript_UseDive[]; extern const u8 EventScript_UseDiveUnderwater[]; +extern const u8 EventScript_UseRockClimb[]; extern const u8 EventScript_FallDownHole[]; extern const u8 EventScript_FieldPoison[]; extern const u8 EventScript_EggHatch[]; diff --git a/include/field_effect.h b/include/field_effect.h index 2e13879353..2b933e0c1f 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -49,5 +49,5 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority); void StartEscapeRopeFieldEffect(void); void FieldEffectFreeGraphicsResources(struct Sprite *sprite); - +bool8 IsRockClimbActive(void); #endif // GUARD_FIELD_EFFECTS_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index ecdc696d41..5e268d7262 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -164,5 +164,6 @@ bool8 MetatileBehavior_IsSidewaysStairsRightSideBottom(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsLeftSideBottom(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsRightSideAny(u8 metatileBehavior); bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior); +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/include/party_menu.h b/include/party_menu.h index 5aa9472dac..c450ab02c0 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -110,5 +110,6 @@ bool32 SetUpFieldMove_Surf(void); bool32 SetUpFieldMove_Fly(void); bool32 SetUpFieldMove_Waterfall(void); bool32 SetUpFieldMove_Dive(void); +bool32 SetUpFieldMove_RockClimb(void); #endif // GUARD_PARTY_MENU_H diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index aaa346ccf1..ef5da9c091 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -663,6 +663,9 @@ $(FLDEFFGFXDIR)/deep_sand_footprints.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/ground_impact_dust.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 1 +$(FLDEFFGFXDIR)/rock_climb_dust.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(FLDEFFGFXDIR)/ash_puff.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 @@ -687,6 +690,9 @@ $(FLDEFFGFXDIR)/short_grass.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/surf_blob.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 +$(FLDEFFGFXDIR)/rock_climb_blob.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(FLDEFFGFXDIR)/tall_grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 diff --git a/src/data/field_effects/field_effect_object_template_pointers.h b/src/data/field_effects/field_effect_object_template_pointers.h index 7173ffbe58..281c664f03 100755 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -40,6 +40,8 @@ extern const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks; extern const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob; +extern const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust; const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall, @@ -83,4 +85,6 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_TRACKS_SPOT] = &gFieldEffectObjectTemplate_SpotTracks, [FLDEFFOBJ_TRACKS_BUG] = &gFieldEffectObjectTemplate_BugTracks, [FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust, + [FLDEFFOBJ_ROCK_CLIMB_BLOB] = &gFieldEffectObjectTemplate_RockClimbBlob, + [FLDEFFOBJ_ROCK_CLIMB_DUST] = &gFieldEffectObjectTemplate_RockClimbDust, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 5638ea46e2..aae9ad1948 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -1404,3 +1404,47 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust = { }; const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST}; +static const struct SpriteFrameImage sPicTable_RockClimbBlob[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbBlob, 4, 4, 2), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbBlob = { + .tileTag = 0xFFFF, + .paletteTag = 0xFFFF, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_SurfBlob, + .images = sPicTable_RockClimbBlob, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateSurfBlobFieldEffect, +}; + + +static const union AnimCmd sAnim_RockClimbDust[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(2, 12), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimTable_RockClimbDust[] = +{ + sAnim_RockClimbDust, +}; +static const struct SpriteFrameImage sPicTable_RockClimbDust[] = { + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 0), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 1), + overworld_frame(gFieldEffectObjectPic_RockClimbDust, 4, 4, 2), +}; +const struct SpriteTemplate gFieldEffectObjectTemplate_RockClimbDust = { + .tileTag = 0xFFFF, + .paletteTag = FLDEFF_PAL_TAG_DUST_CLOUD, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_RockClimbDust, + .images = sPicTable_RockClimbDust, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateJumpImpactEffect, +}; + +const struct SpritePalette gSpritePalette_BigDust = {gFieldEffectPal_DustCloud, FLDEFF_PAL_TAG_DUST_CLOUD}; diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 44639b6c9b..686e468fca 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -287,6 +287,12 @@ u8 MovementAction_SurfStillLeft_Step0(struct ObjectEvent *objectEvent, struct Sp u8 MovementAction_SurfStillLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementAction_SurfStillRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +//fast diagonal +u8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); @@ -463,6 +469,12 @@ u8 (*const gMovementActionFuncs_SurfStillDown[])(struct ObjectEvent *, struct Sp u8 (*const gMovementActionFuncs_SurfStillUp[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_SurfStillLeft[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct Sprite *); +//fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); + u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -639,6 +651,12 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_SURF_STILL_UP] = gMovementActionFuncs_SurfStillUp, [MOVEMENT_ACTION_SURF_STILL_LEFT] = gMovementActionFuncs_SurfStillLeft, [MOVEMENT_ACTION_SURF_STILL_RIGHT] = gMovementActionFuncs_SurfStillRight, + //fast diagonal + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT] = gMovementActionFuncs_WalkFastDiagonalUpLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT] = gMovementActionFuncs_WalkFastDiagonalUpRight, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT] = gMovementActionFuncs_WalkFastDiagonalDownLeft, + [MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT] = gMovementActionFuncs_WalkFastDiagonalDownRight, + }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1676,3 +1694,28 @@ u8 (*const gMovementActionFuncs_SurfStillRight[])(struct ObjectEvent *, struct S MovementAction_SurfStillRight_Step1, MovementAction_PauseSpriteAnim, }; +// fast diagonal +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalUpRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownLeft_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_WalkFastDiagonalDownRight_Step0, + MovementAction_WalkFastDiagonal_Step1, + MovementAction_PauseSpriteAnim, +}; + diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index c7b92def91..e3d2c674ad 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -286,6 +286,8 @@ const u32 gObjectEventPic_CustapBerryTree[] = INCBIN_U32("graphics/object_events const u32 gObjectEventPic_JabocaBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/jaboca.4bpp"); const u32 gObjectEventPic_RowapBerryTree[] = INCBIN_U32("graphics/object_events/pics/berry_trees/rowap.4bpp"); const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/field_effects/pics/surf_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbBlob[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_blob.4bpp"); +const u32 gFieldEffectObjectPic_RockClimbDust[] = INCBIN_U32("graphics/field_effects/pics/rock_climb_dust.4bpp"); const u32 gObjectEventPic_QuintyPlump[] = INCBIN_U32("graphics/object_events/pics/people/quinty_plump.4bpp"); const u16 gObjectEventPal_QuintyPlump[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump.gbapal"); const u16 gObjectEventPal_QuintyPlumpReflection[] = INCBIN_U16("graphics/object_events/palettes/quinty_plump_reflection.gbapal"); @@ -330,6 +332,7 @@ const u32 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U32("graphics/field_ const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/field_effects/pics/sand_disguise_placeholder.4bpp"); const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effects/pics/hot_springs_water.4bpp"); const u16 gFieldEffectPal_Ash[] = INCBIN_U16("graphics/field_effects/palettes/ash.gbapal"); +const u16 gFieldEffectPal_DustCloud[] = INCBIN_U16("graphics/field_effects/palettes/big_dust.gbapal"); const u32 gFieldEffectObjectPic_AshPuff[] = INCBIN_U32("graphics/field_effects/pics/ash_puff.4bpp"); const u32 gFieldEffectObjectPic_AshLaunch[] = INCBIN_U32("graphics/field_effects/pics/ash_launch.4bpp"); const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/field_effects/pics/bubbles.4bpp"); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 7f4e7ec142..a91bb04b25 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -820,10 +820,10 @@ static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto sur [DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH, [DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST, [DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST, - [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH, - [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, + [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST, + [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST, + [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_WEST, + [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_EAST, }; static const u8 sAcroWheelieDirectionAnimNums[] = { [DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, @@ -1068,6 +1068,10 @@ const u8 gJumpSpecialMovementActions[] = { MOVEMENT_ACTION_JUMP_SPECIAL_UP, MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; const u8 gWalkInPlaceSlowMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, @@ -11353,6 +11357,41 @@ bool8 MovementAction_WalkSlowStairsUp_Step1(struct ObjectEvent *objectEvent, str return FALSE; } +// fast diagonal +bool8 MovementAction_WalkFastDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, 1); + return MovementAction_WalkFastDiagonal_Step1(objectEvent, sprite); +} + +bool8 MovementAction_WalkFastDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + if (UpdateMovementNormal(objectEvent, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + bool8 MovementAction_WalkSlowStairsDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitWalkSlow(objectEvent, sprite, DIR_SOUTH); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index ebcd775ed9..f35c349fc6 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -13,6 +13,7 @@ #include "field_control_avatar.h" #include "field_message_box.h" #include "field_move.h" +#include "field_effect.h" #include "field_player_avatar.h" #include "field_poison.h" #include "field_screen_effect.h" @@ -521,6 +522,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me SetMsgSignPostAndVarFacing(direction); return Common_EventScript_ShowPokemonCenterSign; } + if (MetatileBehavior_IsRockClimbable(metatileBehavior) == TRUE && !IsRockClimbActive()) + return EventScript_UseRockClimb; elevation = position->elevation; if (elevation == MapGridGetElevationAt(position->x, position->y)) diff --git a/src/field_effect.c b/src/field_effect.c index 5cdc3472fb..8a11f56a68 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -245,6 +245,18 @@ static void UseVsSeeker_DoPlayerAnimation(struct Task *task); static void UseVsSeeker_ResetPlayerGraphics(struct Task *task); static void UseVsSeeker_CleanUpFieldEffect(struct Task *task); +static void Task_UseRockClimb(u8); +static bool8 RockClimb_Init(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_FieldMovePose(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ShowMon(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent); +//static bool8 RockClimb_RideUp(struct Task *, struct ObjectEvent *); +//static bool8 RockClimb_RideDown(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_ContinueRideOrEnd(struct Task *, struct ObjectEvent *); +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent); +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent); // Static RAM declarations static u8 sActiveList[32]; @@ -1987,7 +1999,7 @@ static bool8 WaterfallFieldEffect_ContinueRideOrEnd(struct Task *task, struct Ob { if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) return FALSE; - + if (MetatileBehavior_IsWaterfall(objectEvent->currentMetatileBehavior)) { // Still ascending waterfall, back to WaterfallFieldEffect_RideUp @@ -4156,6 +4168,263 @@ u8 FldEff_CaveDust(void) return spriteId; } +// ROCK CLIMB +enum RockClimbState +{ + STATE_ROCK_CLIMB_INIT, + STATE_ROCK_CLIMB_POSE, + STATE_ROCK_CLIMB_SHOW_MON, + STATE_ROCK_CLIMB_JUMP_ON, + STATE_ROCK_CLIMB_WAIT_JUMP, + STATE_ROCK_CLIMB_RIDE, + STATE_ROCK_CLIMB_CONTINUE_RIDE, + STATE_ROCK_CLIMB_STOP_INIT, + STATE_ROCK_CLIMB_WAIT_STOP +}; + +#define tState data[0] +#define tDestX data[1] +#define tDestY data[2] +#define tMonId data[15] + +static u8 CreateRockClimbBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = LoadPlayerObjectEventPalette(gSaveBlock2Ptr->playerGender); + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -1; + sprite->data[6] = -1; + sprite->data[7] = -1; + } + + return spriteId; +} + +bool8 (*const sRockClimbFieldEffectFuncs[])(struct Task *, struct ObjectEvent *) = +{ + [STATE_ROCK_CLIMB_INIT] = RockClimb_Init, + [STATE_ROCK_CLIMB_POSE] = RockClimb_FieldMovePose, + [STATE_ROCK_CLIMB_SHOW_MON] = RockClimb_ShowMon, + [STATE_ROCK_CLIMB_JUMP_ON] = RockClimb_JumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_WAIT_JUMP] = RockClimb_WaitJumpOnRockClimbBlob, + [STATE_ROCK_CLIMB_RIDE] = RockClimb_Ride, + [STATE_ROCK_CLIMB_CONTINUE_RIDE] = RockClimb_ContinueRideOrEnd, + [STATE_ROCK_CLIMB_STOP_INIT] = RockClimb_StopRockClimbInit, + [STATE_ROCK_CLIMB_WAIT_STOP] = RockClimb_WaitStopRockClimb +}; + +bool8 FldEff_UseRockClimb(void) +{ + u8 taskId; + taskId = CreateTask(Task_UseRockClimb, 0xff); + gTasks[taskId].tMonId = gFieldEffectArguments[0]; + Task_UseRockClimb(taskId); + return FALSE; +} + +static void Task_UseRockClimb(u8 taskId) +{ + while (sRockClimbFieldEffectFuncs[gTasks[taskId].tState](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])); +} + +static bool8 RockClimb_Init(struct Task *task, struct ObjectEvent *objectEvent) +{ + LockPlayerFieldControls(); + FreezeObjectEvents(); + // Put follower into pokeball before using Rock Climb + HideFollowerForFieldEffect(); + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->tDestX, &task->tDestY); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_FieldMovePose(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetPlayerAvatarFieldMove(); + ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); + task->tState++; + } + return FALSE; +} + +static bool8 RockClimb_ShowMon(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventCheckHeldMovementStatus(objectEvent)) + { + gFieldEffectArguments[0] = task->tMonId | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->tState++; + return TRUE; + } + return FALSE; +} + +static bool8 RockClimb_JumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + objectEvent->noShadow = TRUE; // hide shadow + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); + ObjectEventClearHeldMovementIfFinished(objectEvent); + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(objectEvent->movementDirection)); + gFieldEffectArguments[0] = task->tDestX; + gFieldEffectArguments[1] = task->tDestY; + gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; + objectEvent->fieldEffectSpriteId = CreateRockClimbBlob(); + task->tState++; + } + + return FALSE; +} + +static bool8 RockClimb_WaitJumpOnRockClimbBlob(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); + switch (objectEvent->facingDirection) + { + case DIR_EAST: + //check southeast then northeast + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHEAST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX + 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHEAST; + break; + case DIR_WEST: + //check northwest then southwest + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY - 1))) + objectEvent->movementDirection = DIR_NORTHWEST; + else if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX - 1, task->tDestY + 1))) + objectEvent->movementDirection = DIR_SOUTHWEST; + break; + } + + task->tState = STATE_ROCK_CLIMB_CONTINUE_RIDE; + } + + return FALSE; +} + +struct RockClimbRide +{ + u8 action; + s8 dx; + s8 dy; + u8 jumpDir; +}; +static const struct RockClimbRide sRockClimbMovement[] = +{ + [DIR_NONE] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, 0, DIR_NONE}, + [DIR_SOUTH] = {MOVEMENT_ACTION_WALK_FAST_DOWN, 0, -1, DIR_SOUTH}, + [DIR_NORTH] = {MOVEMENT_ACTION_WALK_FAST_UP, 0, 1, DIR_NORTH}, + [DIR_WEST] = {MOVEMENT_ACTION_WALK_FAST_LEFT, 1, 1, DIR_WEST}, + [DIR_EAST] = {MOVEMENT_ACTION_WALK_FAST_RIGHT, -1, -1, DIR_EAST}, + [DIR_SOUTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_LEFT, 1, -1, DIR_WEST}, + [DIR_SOUTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_DOWN_RIGHT, -1, -1, DIR_EAST}, + [DIR_NORTHWEST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_LEFT, 1, 1, DIR_WEST}, + [DIR_NORTHEAST] = {MOVEMENT_ACTION_WALK_FAST_DIAGONAL_UP_RIGHT, -1, 1, DIR_EAST}, +}; + +static void RockClimbDust(struct ObjectEvent *objectEvent, u8 direction) +{ + s8 dx = sRockClimbMovement[direction].dx; + s8 dy = sRockClimbMovement[direction].dy; + + gFieldEffectArguments[0] = objectEvent->currentCoords.x + dx; + gFieldEffectArguments[1] = objectEvent->currentCoords.y + dy; + gFieldEffectArguments[2] = objectEvent->previousElevation; + gFieldEffectArguments[3] = gSprites[objectEvent->spriteId].oam.priority; + FieldEffectStart(FLDEFF_ROCK_CLIMB_DUST); +} + +static bool8 RockClimb_Ride(struct Task *task, struct ObjectEvent *objectEvent) +{ + ObjectEventSetHeldMovement(objectEvent, sRockClimbMovement[objectEvent->movementDirection].action); + PlaySE(SE_M_ROCK_THROW); + RockClimbDust(objectEvent, objectEvent->movementDirection); + task->tState++; + return FALSE; +} + +static bool8 RockClimb_ContinueRideOrEnd(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + + PlayerGetDestCoords(&task->tDestX, &task->tDestY); + MoveCoords(objectEvent->movementDirection, &task->tDestX, &task->tDestY); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(task->tDestX, task->tDestY))) + { + task->tState = STATE_ROCK_CLIMB_RIDE; + return TRUE; + } + + LockPlayerFieldControls(); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; + task->tState++; + return FALSE; +} + +static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent) +{ + if (ObjectEventIsMovementOverridden(objectEvent)) + { + if (!ObjectEventClearHeldMovementIfFinished(objectEvent)) + return FALSE; + } + + RockClimbDust(objectEvent, DIR_NONE); //dust on final spot + ObjectEventSetHeldMovement(objectEvent, GetJumpSpecialMovementAction(sRockClimbMovement[objectEvent->movementDirection].jumpDir)); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE); + task->tState++; + return TRUE; +} + +static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent *objectEvent) +{ + struct ObjectEvent *followerObject = GetFollowerObject(); + if (ObjectEventClearHeldMovementIfFinished(objectEvent)) + { + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL)); + ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->facingDirection)); + gPlayerAvatar.preventStep = FALSE; + if (followerObject) + ObjectEventClearHeldMovementIfFinished(followerObject); // restore follower to normal + objectEvent->noShadow = FALSE; // restore shadow + UnfreezeObjectEvents(); + UnlockPlayerFieldControls(); + DestroySprite(&gSprites[objectEvent->fieldEffectSpriteId]); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_CLIMB); + objectEvent->triggerGroundEffectsOnMove = TRUE; // e.g. if dismount on grass + DestroyTask(FindTaskIdByFunc(Task_UseRockClimb)); + } + + return FALSE; +} + +bool8 IsRockClimbActive(void) +{ + if (FieldEffectActiveListContains(FLDEFF_USE_ROCK_CLIMB)) + return TRUE; + else + return FALSE; +} + #undef tState #undef tSpriteId #undef tTargetX diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index f7a6531ec2..2e9e1a8510 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1263,10 +1263,10 @@ static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sp [DIR_NORTH] = 1, [DIR_WEST] = 2, [DIR_EAST] = 3, - [DIR_SOUTHWEST] = 0, - [DIR_SOUTHEAST] = 0, - [DIR_NORTHWEST] = 1, - [DIR_NORTHEAST] = 1, + [DIR_SOUTHWEST] = 2, + [DIR_SOUTHEAST] = 3, + [DIR_NORTHWEST] = 2, + [DIR_NORTHEAST] = 3, }; if (!GetSurfBlob_DontSyncAnim(sprite)) @@ -1389,6 +1389,24 @@ u32 FldEff_Dust(void) return 0; } +u32 FldEff_RockClimbDust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_ROCK_CLIMB_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = FLDEFF_ROCK_CLIMB_DUST; + } + return 0; +} + // Sprite data for FLDEFF_SAND_PILE #define sLocalId data[0] #define sMapNum data[1] diff --git a/src/field_move.c b/src/field_move.c index ff9c986436..49c81bec9a 100644 --- a/src/field_move.c +++ b/src/field_move.c @@ -48,6 +48,13 @@ static bool32 IsFieldMoveUnlocked_Waterfall(void) return FlagGet(FLAG_BADGE08_GET); } +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE +static bool32 IsFieldMoveUnlocked_RockClimb(void) +{ + return TRUE; +} +#endif + static bool32 IsFieldMoveUnlocked_Teleport(void) { return TRUE; @@ -198,7 +205,15 @@ const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] = .moveID = MOVE_SWEET_SCENT, .partyMsgID = PARTY_MSG_CANT_USE_HERE, }, - +#if OW_ROCK_CLIMB_FIELD_MOVE == TRUE + [FIELD_MOVE_ROCK_CLIMB] = + { + .fieldMoveFunc = SetUpFieldMove_RockClimb, + .isUnlockedFunc = IsFieldMoveUnlocked_RockClimb, + .moveID = MOVE_ROCK_CLIMB, + .partyMsgID = PARTY_MSG_CANT_USE_HERE, + }, +#endif #if OW_DEFOG_FIELD_MOVE == TRUE [FIELD_MOVE_DEFOG] = { @@ -208,5 +223,4 @@ const struct FieldMoveInfo gFieldMoveInfo[FIELD_MOVES_COUNT] = .partyMsgID = PARTY_MSG_CANT_USE_HERE, }, #endif - }; diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 2d61e9a75a..687b98ca27 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -133,6 +133,7 @@ static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] = [MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, [MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM] = TILE_FLAG_UNUSED, [MB_ROCK_STAIRS] = TILE_FLAG_UNUSED, + [MB_ROCK_CLIMB] = TILE_FLAG_UNUSED, }; bool8 MetatileBehavior_IsATile(u8 metatileBehavior) @@ -1542,3 +1543,11 @@ bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior) else return FALSE; } + +bool8 MetatileBehavior_IsRockClimbable(u8 metatileBehavior) +{ + if (metatileBehavior == MB_ROCK_CLIMB) + return TRUE; + else + return FALSE; +} diff --git a/src/party_menu.c b/src/party_menu.c index 71464969ba..9b48152b9b 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -489,6 +489,7 @@ void TryItemHoldFormChange(struct Pokemon *mon, s8 slotId); static void ShowMoveSelectWindow(u8 slot); static void Task_HandleWhichMoveInput(u8 taskId); static void Task_HideFollowerNPCForTeleport(u8); +static void FieldCallback_RockClimb(void); // static const data #include "data/party_menu.h" @@ -4194,6 +4195,21 @@ bool32 SetUpFieldMove_Waterfall(void) return FALSE; } +bool32 SetUpFieldMove_RockClimb(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsRockClimbable(MapGridGetMetatileBehaviorAt(x, y))) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_RockClimb; + return TRUE; + } + + return FALSE; +} + static void FieldCallback_Dive(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); @@ -7997,3 +8013,10 @@ void CursorCb_MoveItem(u8 taskId) gTasks[taskId].func = Task_UpdateHeldItemSprite; } } + +static void FieldCallback_RockClimb(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + FieldEffectStart(FLDEFF_USE_ROCK_CLIMB); +} + From 7f493948ed0abfc9354ef9e5b78175fee04e38d6 Mon Sep 17 00:00:00 2001 From: Raymond Dodge Date: Mon, 4 Aug 2025 07:48:06 -0400 Subject: [PATCH 180/248] Replace all usages of rl compression with smol (#7458) --- .../1.13/convert_compressed_files.py | 10 ++- src/contest_painting.c | 68 +++++++++---------- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/migration_scripts/1.13/convert_compressed_files.py b/migration_scripts/1.13/convert_compressed_files.py index 11f29708bc..0ccb5d61c1 100644 --- a/migration_scripts/1.13/convert_compressed_files.py +++ b/migration_scripts/1.13/convert_compressed_files.py @@ -9,9 +9,10 @@ if not os.path.exists("Makefile"): primaryTileset_pattern = re.compile(r"(.*\"data/tilesets/primary/.+\.4bpp\.)lz(\".*)") secondaryTileset_pattern = re.compile(r"(.*\"data/tilesets/secondary/.+\.4bpp\.)lz(\".*)") -tilemap_pattern = re.compile(r"(.*\"graphics/.+\.bin\.)lz(\".*)") +tilemap_pattern = re.compile(r"(.*\"graphics/.+\.bin\.)(?:lz|rl)(\".*)") lzuncomp_pattern = re.compile(r"(.*)\bLZ77UnComp([WV])ram\b(\(.*)") lzdecomp_pattern = re.compile(r"(.*)\bLZDecompress([WV])ram\b(\(.*)") +rluncomp_pattern = re.compile(r"(.*)\bRLUnComp([WV])ram\b(\(.*)") def handle_file(fileInput): fileTest = Path(fileInput) @@ -33,8 +34,12 @@ def handle_file(fileInput): line = match.group(1) + "smolTM" + match.group(2) + "\n" elif ".4bpp.lz" in line: line = line.replace(".4bpp.lz", ".4bpp.smol") + elif ".4bpp.rl" in line: + line = line.replace(".4bpp.rl", ".4bpp.smol") elif ".8bpp.lz" in line: line = line.replace(".8bpp.lz", ".8bpp.smol") + elif ".8bpp.rl" in line: + line = line.replace(".8bpp.rl", ".8bpp.smol") elif match := lzuncomp_pattern.match(line): if allLines[-1].strip() != "case MODE_LZ77:": # do not modify DecompressDataWithHeader itself line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" @@ -42,6 +47,9 @@ def handle_file(fileInput): elif match := lzdecomp_pattern.match(line): line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" needs_decompress_h = True + elif match := rluncomp_pattern.match(line): + line = match.group(1) + "DecompressDataWithHeader" + match.group(2) + "ram" + match.group(3) + "\n" + needs_decompress_h = True else: pass diff --git a/src/contest_painting.c b/src/contest_painting.c index 4853b9425c..e8f929ef4b 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -70,18 +70,18 @@ extern const u8 gContestPaintingTough2[]; extern const u8 gContestPaintingTough3[]; static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal"); -static const u32 sPictureFrameTiles_Cool[] = INCBIN_U32("graphics/picture_frame/cool.4bpp.rl"); -static const u32 sPictureFrameTiles_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty.4bpp.rl"); -static const u32 sPictureFrameTiles_Cute[] = INCBIN_U32("graphics/picture_frame/cute.4bpp.rl"); -static const u32 sPictureFrameTiles_Smart[] = INCBIN_U32("graphics/picture_frame/smart.4bpp.rl"); -static const u32 sPictureFrameTiles_Tough[] = INCBIN_U32("graphics/picture_frame/tough.4bpp.rl"); -static const u32 sPictureFrameTiles_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby.4bpp.rl"); -static const u32 sPictureFrameTilemap_Cool[] = INCBIN_U32("graphics/picture_frame/cool_map.bin.rl"); -static const u32 sPictureFrameTilemap_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty_map.bin.rl"); -static const u32 sPictureFrameTilemap_Cute[] = INCBIN_U32("graphics/picture_frame/cute_map.bin.rl"); -static const u32 sPictureFrameTilemap_Smart[] = INCBIN_U32("graphics/picture_frame/smart_map.bin.rl"); -static const u32 sPictureFrameTilemap_Tough[] = INCBIN_U32("graphics/picture_frame/tough_map.bin.rl"); -static const u32 sPictureFrameTilemap_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby_map.bin.rl"); +static const u32 sPictureFrameTiles_Cool[] = INCBIN_U32("graphics/picture_frame/cool.4bpp.smol"); +static const u32 sPictureFrameTiles_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty.4bpp.smol"); +static const u32 sPictureFrameTiles_Cute[] = INCBIN_U32("graphics/picture_frame/cute.4bpp.smol"); +static const u32 sPictureFrameTiles_Smart[] = INCBIN_U32("graphics/picture_frame/smart.4bpp.smol"); +static const u32 sPictureFrameTiles_Tough[] = INCBIN_U32("graphics/picture_frame/tough.4bpp.smol"); +static const u32 sPictureFrameTiles_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby.4bpp.smol"); +static const u32 sPictureFrameTilemap_Cool[] = INCBIN_U32("graphics/picture_frame/cool_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Beauty[] = INCBIN_U32("graphics/picture_frame/beauty_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Cute[] = INCBIN_U32("graphics/picture_frame/cute_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Smart[] = INCBIN_U32("graphics/picture_frame/smart_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_Tough[] = INCBIN_U32("graphics/picture_frame/tough_map.bin.smolTM"); +static const u32 sPictureFrameTilemap_HallLobby[] = INCBIN_U32("graphics/picture_frame/lobby_map.bin.smolTM"); static const u8 *const sContestCategoryNames_Unused[] = { @@ -424,24 +424,24 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Cool, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cool, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Cool, gContestMonPixels); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Beauty, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Beauty, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Beauty, gContestMonPixels); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Cute, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cute, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Cute, gContestMonPixels); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Smart, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Smart, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Smart, gContestMonPixels); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); - RLUnCompWram(sPictureFrameTilemap_Tough, gContestMonPixels); + DecompressDataWithHeaderVram(sPictureFrameTiles_Tough, (void *)VRAM); + DecompressDataWithHeaderWram(sPictureFrameTilemap_Tough, gContestMonPixels); break; } @@ -466,8 +466,8 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) else if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START) { // Load Contest Hall lobby frame - RLUnCompVram(sPictureFrameTiles_HallLobby, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_HallLobby, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12))); } else { @@ -475,24 +475,24 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cool, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Beauty, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Cute, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Smart, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); - RLUnCompVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12))); + DecompressDataWithHeaderVram(sPictureFrameTiles_Tough, (void *)VRAM); + DecompressDataWithHeaderVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12))); break; } } From 76b8ffc12ebd9fba51d204253c170e6d22fccd57 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 5 Aug 2025 18:24:34 +0100 Subject: [PATCH 181/248] Fix sorting bag by type (#7488) --- src/data/items.h | 2 +- src/item_menu.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 1a39f409b5..69806c26da 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -146,7 +146,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FIELD_USE, + .sortType = ITEM_TYPE_UNCATEGORIZED, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .iconPic = gItemIcon_QuestionMark, diff --git a/src/item_menu.c b/src/item_menu.c index 2ac5e27da9..5ec54f07c4 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2954,13 +2954,18 @@ static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struc static s32 CompareItemsByType(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) { + if (item1.itemId == ITEM_NONE) + return 1; + else if (item2.itemId == ITEM_NONE) + return -1; + enum ItemSortType type1 = gItemsInfo[item1.itemId].sortType; enum ItemSortType type2 = gItemsInfo[item2.itemId].sortType; - // Null and uncategorized items go last - if (type1 && !type2) + // Uncategorized items go last. + if (type1 != ITEM_TYPE_UNCATEGORIZED && type2 == ITEM_TYPE_UNCATEGORIZED) return -1; - else if (type2 && !type1) + else if (type2 != ITEM_TYPE_UNCATEGORIZED && type1 == ITEM_TYPE_UNCATEGORIZED) return 1; else if (type1 < type2) return -1; From 1fb895ad4858198b057ff9d9ae5897e0753191a8 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 5 Aug 2025 18:27:08 +0100 Subject: [PATCH 182/248] Bag sorting cleanup (#7489) --- src/item_menu.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/item_menu.c b/src/item_menu.c index 5ec54f07c4..e0954c0587 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2887,12 +2887,19 @@ static void MergeSort(struct BagPocket *pocket, s32 (*comparator)(enum Pocket, s { struct ItemSlot *dummySlots = AllocZeroed(sizeof(struct ItemSlot) * pocket->capacity); - for (u32 width = 1; width < pocket->capacity; width *= 2) + u32 usedCapacity; + for (usedCapacity = 0; usedCapacity < pocket->capacity; usedCapacity++) { - for (u32 i = 0; i < pocket->capacity; i += 2 * width) - Merge(pocket, i, min(i + width, pocket->capacity), min(i + 2 * width, pocket->capacity), dummySlots, comparator); + if (BagPocket_GetSlotData(pocket, usedCapacity).itemId == ITEM_NONE) + break; + } - for (u32 j = 0; j < pocket->capacity; j++) + for (u32 width = 1; width < usedCapacity; width *= 2) + { + for (u32 i = 0; i < usedCapacity; i += 2 * width) + Merge(pocket, i, min(i + width, usedCapacity), min(i + 2 * width, usedCapacity), dummySlots, comparator); + + for (u32 j = 0; j < usedCapacity; j++) BagPocket_SetSlotData(pocket, j, dummySlots[j]); } @@ -2919,22 +2926,7 @@ static s32 CompareItemsAlphabetically(enum Pocket pocketId, struct ItemSlot item name2 = GetItemName(item2.itemId); } - for (u32 i = 0; ; ++i) - { - if (name1[i] == EOS && name2[i] != EOS) - return -1; - else if (name1[i] != EOS && name2[i] == EOS) - return 1; - else if (name1[i] == EOS && name2[i] == EOS) - return 0; - - if (name1[i] < name2[i]) - return -1; - else if (name1[i] > name2[i]) - return 1; - } - - return 0; // Will never be reached + return StringCompare(name1, name2); } static s32 CompareItemsByMost(enum Pocket pocketId, struct ItemSlot item1, struct ItemSlot item2) From acc82e7d7972175b70a0eb25e72cf8ebdfe49b40 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:28:33 +0200 Subject: [PATCH 183/248] Convert Status4 to volatiles (#7411) Co-authored-by: hedara90 <90hedara@gmail.com> --- asm/macros/battle_script.inc | 5 +- data/battle_scripts_1.s | 5 +- include/battle.h | 1 - include/battle_ai_util.h | 2 - include/battle_util.h | 2 + include/constants/battle.h | 75 +++++-------- include/move.h | 2 +- include/pokemon.h | 7 +- src/battle_ai_main.c | 6 +- src/battle_ai_switch_items.c | 6 +- src/battle_ai_util.c | 66 ++---------- src/battle_anim_effects_1.c | 7 +- src/battle_debug.c | 81 ++++---------- src/battle_end_turn.c | 23 ++-- src/battle_main.c | 26 ++--- src/battle_script_commands.c | 96 ++++++++--------- src/battle_util.c | 101 +++++++++++------- src/data/moves_info.h | 14 +-- src/item_use.c | 2 +- test/battle/hold_effect/berserk_gene.c | 2 +- test/battle/move_effect/semi_invulnerable.c | 12 +-- test/battle/move_effects_combined/hurricane.c | 6 +- 22 files changed, 230 insertions(+), 317 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c2a10b175c..9dd0479c92 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -416,8 +416,11 @@ .4byte \argPtr .endm - .macro unused_0x47 + .macro jumpfifsemiinvulnerable battler:req, state:req, jumpInstr:req .byte 0x47 + .byte \battler + .byte \state + .4byte \jumpInstr .endm .macro unused_0x48 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e6bf8e1db8..aa4cfac123 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2613,7 +2613,8 @@ BattleScript_EffectGravitySuccess:: selectfirstvalidtarget BattleScript_GravityLoop: movevaluescleanup - jumpifstatus3 BS_TARGET, STATUS3_ON_AIR | STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop + jumpfifsemiinvulnerable BS_TARGET, STATE_ON_AIR, BattleScript_GravityLoopDrop + jumpifstatus3 BS_TARGET, STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop goto BattleScript_GravityLoopEnd BattleScript_GravityLoopDrop: gravityonairbornemons @@ -6982,7 +6983,7 @@ BattleScript_YawnMakesAsleep:: waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate - jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_SKY_DROPPED, BattleScript_YawnEnd + jumpfifsemiinvulnerable BS_EFFECT_BATTLER, STATE_SKY_DROP, BattleScript_YawnEnd makevisible BS_EFFECT_BATTLER skydropyawn BattleScript_YawnEnd: diff --git a/include/battle.h b/include/battle.h index de25626c6b..78eed713f9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1074,7 +1074,6 @@ extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u32 gSideStatuses[NUM_BATTLE_SIDES]; extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; extern u32 gStatuses3[MAX_BATTLERS_COUNT]; -extern u32 gStatuses4[MAX_BATTLERS_COUNT]; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index f5af4acb33..e0f1a4de0c 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -184,7 +184,6 @@ bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); bool32 IsNonVolatileStatusMove(u32 moveEffect); bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); -bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); bool32 IsBattlerDamagedByStatus(u32 battler); @@ -208,7 +207,6 @@ bool32 IsSwitchOutEffect(enum BattleMoveEffects effect); bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); bool32 IsUngroundingEffect(enum BattleMoveEffects effect); -bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag); bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); diff --git a/include/battle_util.h b/include/battle_util.h index 95efdd9922..8f38e0f572 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -406,5 +406,7 @@ bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); void RemoveHazardFromField(u32 side, enum Hazards hazardType); bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); +bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); +bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 730dbd63c7..148438237b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -169,8 +169,14 @@ enum VolatileFlags F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (u32, 5)) \ + F(VOLATILE_ELECTRIFIED, electrified, (u32, 1)) \ F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) + F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_INFINITE_CONFUSION, infiniteConfusion, (u32, 1)) \ + F(VOLATILE_SALT_CURE, saltCure, (u32, 1)) \ + F(VOLATILE_SYRUP_BOMB, syrupBomb, (u32, 1)) \ + F(VOLATILE_GLAIVE_RUSH, glaiveRush, (u32, 1)) /* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ #define GET_VOLATILE_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeMaxValue) @@ -188,44 +194,13 @@ enum Volatile // Helper macros #define INFATUATED_WITH(battler) (battler + 1) -// Old flags -#define STATUS2_CONFUSION (1 << 0 | 1 << 1 | 1 << 2) -#define STATUS2_CONFUSION_TURN(num) ((num) << 0) -#define STATUS2_FLINCHED (1 << 3) -#define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6) -#define STATUS2_UPROAR_TURN(num) ((num) << 4) -#define STATUS2_TORMENT (1 << 7) -#define STATUS2_BIDE (1 << 8 | 1 << 9) -#define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE) -#define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash -#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10) -#define STATUS2_MULTIPLETURNS (1 << 12) -#define STATUS2_WRAPPED (1 << 13) -#define STATUS2_POWDER (1 << 14) -//#define STATUS2_UNUSED (1 << 15) -#define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler -#define STATUS2_INFATUATED_WITH(battler) (1u << (battler + 16)) -#define STATUS2_DEFENSE_CURL (1 << 20) -#define STATUS2_TRANSFORMED (1 << 21) -#define STATUS2_RECHARGE (1 << 22) -#define STATUS2_RAGE (1 << 23) -#define STATUS2_SUBSTITUTE (1 << 24) -#define STATUS2_DESTINY_BOND (1 << 25) -#define STATUS2_ESCAPE_PREVENTION (1 << 26) -#define STATUS2_NIGHTMARE (1 << 27) -#define STATUS2_CURSED (1 << 28) -#define STATUS2_FORESIGHT (1 << 29) -#define STATUS2_DRAGON_CHEER (1 << 30) -#define STATUS2_FOCUS_ENERGY (1 << 31) -#define STATUS2_FOCUS_ENERGY_ANY (STATUS2_DRAGON_CHEER | STATUS2_FOCUS_ENERGY) - #define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed #define STATUS3_LEECHSEED (1 << 2) #define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4) #define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active #define STATUS3_PERISH_SONG (1 << 5) -#define STATUS3_ON_AIR (1 << 6) -#define STATUS3_UNDERGROUND (1 << 7) +#define STATUS3_UNUSED_6 (1 << 6) +#define STATUS3_UNUSED_7 (1 << 7) #define STATUS3_MINIMIZED (1 << 8) #define STATUS3_CHARGED_UP (1 << 9) #define STATUS3_ROOTED (1 << 10) @@ -233,33 +208,39 @@ enum Volatile #define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN) #define STATUS3_IMPRISONED_OTHERS (1 << 13) #define STATUS3_GRUDGE (1 << 14) -#define STATUS3_COMMANDER (1 << 15) +#define STATUS3_UNUSED_15 (1 << 15) #define STATUS3_GASTRO_ACID (1 << 16) #define STATUS3_EMBARGO (1 << 17) -#define STATUS3_UNDERWATER (1 << 18) +#define STATUS3_UNUSED_18 (1 << 18) #define STATUS3_UNUSED_19 (1 << 19) #define STATUS3_UNUSED_20 (1 << 20) #define STATUS3_SMACKED_DOWN (1 << 21) #define STATUS3_UNUSED_22 (1 << 22) #define STATUS3_TELEKINESIS (1 << 23) -#define STATUS3_PHANTOM_FORCE (1 << 24) +#define STATUS3_UNUSED_24 (1 << 24) #define STATUS3_MIRACLE_EYED (1 << 25) #define STATUS3_MAGNET_RISE (1 << 26) #define STATUS3_HEAL_BLOCK (1 << 27) #define STATUS3_AQUA_RING (1 << 28) #define STATUS3_LASER_FOCUS (1 << 29) #define STATUS3_POWER_TRICK (1 << 30) -#define STATUS3_SKY_DROPPED (1 << 31) // Target of Sky Drop -#define STATUS3_SEMI_INVULNERABLE_NO_COMMANDER (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) // Exception for Transform / Imposter -#define STATUS3_SEMI_INVULNERABLE (STATUS3_SEMI_INVULNERABLE_NO_COMMANDER | STATUS3_COMMANDER) -#define STATUS4_ELECTRIFIED (1 << 0) -#define STATUS4_MUD_SPORT (1 << 1) // Only used if B_SPORT_TURNS < GEN_6 -#define STATUS4_WATER_SPORT (1 << 2) // Only used if B_SPORT_TURNS < GEN_6 -#define STATUS4_INFINITE_CONFUSION (1 << 3) // Used for Berserk Gene -#define STATUS4_SALT_CURE (1 << 4) -#define STATUS4_SYRUP_BOMB (1 << 5) -#define STATUS4_GLAIVE_RUSH (1 << 6) +enum SemiInvulnerableState +{ + STATE_NONE, + STATE_UNDERGROUND, + STATE_UNDERWATER, + STATE_ON_AIR, + STATE_PHANTOM_FORCE, + STATE_SKY_DROP, + STATE_COMMANDER, +}; + +enum SemiInvulnerableExclusion +{ + CHECK_ALL, + EXCLUDE_COMMANDER, +}; #define HITMARKER_STRING_PRINTED (1 << 4) #define HITMARKER_IGNORE_BIDE (1 << 5) diff --git a/include/move.h b/include/move.h index 61483e402e..b1e8cba99f 100644 --- a/include/move.h +++ b/include/move.h @@ -489,7 +489,7 @@ static inline u32 GetMoveTwoTurnAttackStringId(u32 moveId) static inline u32 GetMoveTwoTurnAttackStatus(u32 moveId) { - return UNCOMPRESS_BITS(gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status); + return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; } static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) diff --git a/include/pokemon.h b/include/pokemon.h index f36f8ba7f5..cd7925cf14 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -381,12 +381,7 @@ struct BattlePokemon /*0x45*/ u32 experience; /*0x49*/ u32 personality; /*0x4D*/ u32 status1; - /*0x51*/ union { - struct { - u32 status2; // To be expanded to include Status3/4 - }; - struct Volatiles volatiles; - }; + /*0x51*/ struct Volatiles volatiles; /*0x5D*/ u32 otId; /*0x61*/ u8 metLevel; /*0x62*/ bool8 isShiny; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index fc2ac90b1d..7a74e0d655 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1083,7 +1083,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsPowderMove(move) && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); - if (IsSemiInvulnerable(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (!BreaksThroughSemiInvulnerablity(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) RETURN_SCORE_MINUS(10); if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) @@ -2363,7 +2363,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // Don't Fly/dig/etc if opponent is going to fly/dig/etc after you if (BattlerWillFaintFromWeather(battlerAtk, aiData->abilities[battlerAtk]) - && GetMoveTwoTurnAttackStatus(move) == STATUS3_ON_AIR) + && GetMoveTwoTurnAttackStatus(move) == STATE_ON_AIR) ADJUST_SCORE(-10); // Attacker will faint while in the air break; case EFFECT_HEALING_WISH: //healing wish, lunar dance @@ -4524,7 +4524,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) || predictedEffect == EFFECT_MISTY_EXPLOSION || predictedEffect == EFFECT_PROTECT)) ADJUST_SCORE(GOOD_EFFECT); - else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) ADJUST_SCORE(GOOD_EFFECT); } break; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 526c81c7ca..fe3bb5a5ed 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -482,7 +482,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); u32 incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE); - bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); s32 i, j; if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -615,7 +615,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); - bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; @@ -2436,7 +2436,7 @@ static bool32 ShouldUseItem(u32 battler) // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) - || gStatuses3[battler] & STATUS3_SKY_DROPPED) + || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; if (gStatuses3[battler] & STATUS3_EMBARGO) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b4e0cbaaf4..a15fafc897 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -457,7 +457,9 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) return TRUE; if (gBattleMons[battlerDef].volatiles.escapePrevention) return TRUE; - if (gStatuses3[battlerDef] & (STATUS3_ROOTED | STATUS3_SKY_DROPPED)) + if (gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_SKY_DROP) + return TRUE; + if (gStatuses3[battlerDef] & STATUS3_ROOTED) return TRUE; if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return TRUE; @@ -1860,60 +1862,6 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) return FALSE; } -bool32 IsSemiInvulnerable(u32 battlerDef, u32 move) -{ - if (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) - return TRUE; - else if (gBattleStruct->battlerState[battlerDef].commandingDondozo) - return TRUE; - else if (!MoveDamagesAirborne(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) - return TRUE; - else if (!MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) - return TRUE; - else if (!MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) - return TRUE; - else - return FALSE; -} - -bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) -{ - u32 weather; - if (IsSemiInvulnerable(battlerDef, move)) - return FALSE; - - //TODO - anticipate protect move? - - // always hits - if (gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS || gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) - return TRUE; - - if (gAiLogicData->abilities[battlerDef] == ABILITY_NO_GUARD || gAiLogicData->abilities[battlerAtk] == ABILITY_NO_GUARD) - return TRUE; - - u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - if (B_TOXIC_NEVER_MISS >= GEN_6 - && nonVolatileStatus == MOVE_EFFECT_TOXIC - && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - return TRUE; - - // discouraged from hitting - weather = AI_GetWeather(); - if ((weather & B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) - return FALSE; - - if ((weather & B_WEATHER_RAIN) && MoveAlwaysHitsInRain(move)) - return TRUE; - if ((weather & B_WEATHER_ICY_ANY) && MoveAlwaysHitsInHailSnow(move)) - return TRUE; - if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && MoveIncreasesPowerToMinimizedTargets(move)) - return TRUE; - if (GetMoveAccuracy(move) == 0) - return TRUE; - - return FALSE; -} - bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) { enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; @@ -1972,8 +1920,8 @@ bool32 IsBattlerDamagedByStatus(u32 battler) || gBattleMons[battler].volatiles.wrapped || gBattleMons[battler].volatiles.nightmare || gBattleMons[battler].volatiles.cursed + || gBattleMons[battler].volatiles.saltCure || gStatuses3[battler] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED) - || gStatuses4[battler] & (STATUS4_SALT_CURE) || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); } @@ -2980,7 +2928,8 @@ static u32 GetWeatherDamage(u32 battlerId) if (weather & B_WEATHER_SANDSTORM) { if (BattlerAffectedBySandstorm(battlerId, ability) - && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERWATER && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = GetNonDynamaxMaxHP(battlerId) / 16; @@ -2991,7 +2940,8 @@ static u32 GetWeatherDamage(u32 battlerId) if ((weather & B_WEATHER_HAIL) && ability != ABILITY_ICE_BODY) { if (BattlerAffectedByHail(battlerId, ability) - && !(gStatuses3[battlerId] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battlerId].volatiles.semiInvulnerable != STATE_UNDERWATER && holdEffect != HOLD_EFFECT_SAFETY_GOGGLES) { damage = GetNonDynamaxMaxHP(battlerId) / 16; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index fccbfb1b64..12bd7859b9 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6871,7 +6871,7 @@ static void SwapBattlerMoveData(u32 battler1, u32 battler2) SWAP(gBattleStruct->moveTarget[battler1], gBattleStruct->moveTarget[battler2], temp); SWAP(gMoveSelectionCursor[battler1], gMoveSelectionCursor[battler2], temp); SWAP(gLockedMoves[battler1], gLockedMoves[battler2], temp); - + // update last moves SWAP(gLastPrintedMoves[battler1], gLastPrintedMoves[battler2], temp); SWAP(gLastMoves[battler1], gLastMoves[battler2], temp); @@ -6907,10 +6907,9 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) SWAP(gTransformedPersonalities[battlerAtk], gTransformedPersonalities[battlerPartner], temp); SWAP(gTransformedShininess[battlerAtk], gTransformedShininess[battlerPartner], temp); SWAP(gStatuses3[battlerAtk], gStatuses3[battlerPartner], temp); - SWAP(gStatuses4[battlerAtk], gStatuses4[battlerPartner], temp); - + SwapBattlerMoveData(battlerAtk, battlerPartner); - + // Swap turn order, so that all the battlers take action SWAP(gChosenActionByBattler[battlerAtk], gChosenActionByBattler[battlerPartner], temp); for (i = 0; i < gBattlersCount; i++) diff --git a/src/battle_debug.c b/src/battle_debug.c index 6b8998de8f..a991ac341a 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -106,7 +106,6 @@ enum LIST_ITEM_STATUS1, LIST_ITEM_VOLATILE, LIST_ITEM_STATUS3, - LIST_ITEM_STATUS4, LIST_ITEM_HAZARDS, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, @@ -147,8 +146,6 @@ enum LIST_STATUS3_LEECH_SEEDED, LIST_STATUS3_ALWAYS_HITS, LIST_STATUS3_PERISH_SONG, - LIST_STATUS3_ON_AIR, - LIST_STATUS3_UNDERGROUND, LIST_STATUS3_MINIMIZED, LIST_STATUS3_CHARGED_UP, LIST_STATUS3_ROOTED, @@ -157,7 +154,6 @@ enum LIST_STATUS3_GRUDGE, LIST_STATUS3_GASTRO_ACID, LIST_STATUS3_EMBARGO, - LIST_STATUS3_UNDERWATER, LIST_STATUS3_SMACKED_DOWN, LIST_STATUS3_TELEKINESIS, LIST_STATUS3_MIRACLE_EYED, @@ -168,14 +164,6 @@ enum LIST_STATUS3_POWER_TRICK, }; -enum -{ - LIST_STATUS4_ELECTRIFIED, - LIST_STATUS4_SALT_CURE, - LIST_STATUS4_SYRUP_BOMB, - LIST_STATUS4_GLAIVE_RUSH, -}; - enum { LIST_SIDE_STICKY_WEB, @@ -314,16 +302,6 @@ static const struct BitfieldInfo sStatus3Bitfield[] = {/*Power Trick*/ 1, 30}, }; -static const struct BitfieldInfo sStatus4Bitfield[] = -{ - {/*Electrified*/ 1, 0}, - {/*Mud Sport*/ 1, 1}, - {/*Water Sport*/ 1, 2}, - {/*Salt Cure*/ 1, 4}, - {/*Syrup Bomb*/ 1, 5}, - {/*Glaive Rush*/ 1, 6}, -}; - static const struct BitfieldInfo sAIBitfield[] = { {/*Check Bad Move*/ 1, 0}, @@ -369,7 +347,6 @@ static const struct ListMenuItem sMainListItems[] = {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, {COMPOUND_STRING("Status3"), LIST_ITEM_STATUS3}, - {COMPOUND_STRING("Status4"), LIST_ITEM_STATUS4}, {COMPOUND_STRING("Hazards"), LIST_ITEM_HAZARDS}, {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, {COMPOUND_STRING("AI"), LIST_ITEM_AI}, @@ -405,21 +382,26 @@ static const struct ListMenuItem sStatus1ListItems[] = static const struct ListMenuItem sVolatileStatusListItems[] = { - {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, - {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, - {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, - {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, - {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, - {COMPOUND_STRING("Recharge"), VOLATILE_RECHARGE}, - {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, - {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, - {COMPOUND_STRING("EscapePrevention"), VOLATILE_ESCAPE_PREVENTION}, - {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, - {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, - {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, - {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, - {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, - {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, + {COMPOUND_STRING("Confusion"), VOLATILE_CONFUSION}, + {COMPOUND_STRING("Flinched"), VOLATILE_FLINCHED}, + {COMPOUND_STRING("Torment"), VOLATILE_TORMENT}, + {COMPOUND_STRING("Powder"), VOLATILE_POWDER}, + {COMPOUND_STRING("DefenseCurl"), VOLATILE_DEFENSE_CURL}, + {COMPOUND_STRING("Recharge"), VOLATILE_RECHARGE}, + {COMPOUND_STRING("Rage"), VOLATILE_RAGE}, + {COMPOUND_STRING("DestinyBond"), VOLATILE_DESTINY_BOND}, + {COMPOUND_STRING("EscapePrevention"), VOLATILE_ESCAPE_PREVENTION}, + {COMPOUND_STRING("Cursed"), VOLATILE_CURSED}, + {COMPOUND_STRING("Foresight"), VOLATILE_FORESIGHT}, + {COMPOUND_STRING("DragonCheer"), VOLATILE_DRAGON_CHEER}, + {COMPOUND_STRING("FocusEnergy"), VOLATILE_FOCUS_ENERGY}, + {COMPOUND_STRING("Electrified"), VOLATILE_ELECTRIFIED}, + {COMPOUND_STRING("MudSport"), VOLATILE_MUD_SPORT}, + {COMPOUND_STRING("WaterSport"), VOLATILE_WATER_SPORT}, + {COMPOUND_STRING("Infinite Confusion"), VOLATILE_INFINITE_CONFUSION}, + {COMPOUND_STRING("Salt Cure"), VOLATILE_SALT_CURE}, + {COMPOUND_STRING("Syrup Bomb"), VOLATILE_SYRUP_BOMB}, + {COMPOUND_STRING("Glaive Rush"), VOLATILE_GLAIVE_RUSH}, }; static const struct ListMenuItem sStatus3ListItems[] = @@ -428,8 +410,6 @@ static const struct ListMenuItem sStatus3ListItems[] = {COMPOUND_STRING("Leech Seeded"), LIST_STATUS3_LEECH_SEEDED}, {COMPOUND_STRING("Always Hits"), LIST_STATUS3_ALWAYS_HITS}, {COMPOUND_STRING("Perish Song"), LIST_STATUS3_PERISH_SONG}, - {COMPOUND_STRING("On Air"), LIST_STATUS3_ON_AIR}, - {COMPOUND_STRING("Underground"), LIST_STATUS3_UNDERGROUND}, {COMPOUND_STRING("Minimized"), LIST_STATUS3_MINIMIZED}, {COMPOUND_STRING("Charged Up"), LIST_STATUS3_CHARGED_UP}, {COMPOUND_STRING("Rooted"), LIST_STATUS3_ROOTED}, @@ -438,7 +418,6 @@ static const struct ListMenuItem sStatus3ListItems[] = {COMPOUND_STRING("Grudge"), LIST_STATUS3_GRUDGE}, {COMPOUND_STRING("Gastro Acid"), LIST_STATUS3_GASTRO_ACID}, {COMPOUND_STRING("Embargo"), LIST_STATUS3_EMBARGO}, - {COMPOUND_STRING("Underwater"), LIST_STATUS3_UNDERWATER}, {COMPOUND_STRING("Smacked Down"), LIST_STATUS3_SMACKED_DOWN}, {COMPOUND_STRING("Telekinesis"), LIST_STATUS3_TELEKINESIS}, {COMPOUND_STRING("Miracle Eyed"), LIST_STATUS3_MIRACLE_EYED}, @@ -449,14 +428,6 @@ static const struct ListMenuItem sStatus3ListItems[] = {COMPOUND_STRING("Power Trick"), LIST_STATUS3_POWER_TRICK}, }; -static const struct ListMenuItem sStatus4ListItems[] = -{ - {COMPOUND_STRING("Electrified"), LIST_STATUS4_ELECTRIFIED}, - {COMPOUND_STRING("Salt Cure"), LIST_STATUS4_SALT_CURE}, - {COMPOUND_STRING("Syrup Bomb"), LIST_STATUS4_SYRUP_BOMB}, - {COMPOUND_STRING("Glaive Rush"), LIST_STATUS4_GLAIVE_RUSH}, -}; - static const struct ListMenuItem sHazardsListItems[] = { {COMPOUND_STRING("Spikes"), LIST_SIDE_SPIKES}, @@ -822,7 +793,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Chosen move: "), 74, 64, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, GetMoveName(gBattleMons[data->aiBattlerId].moves[chosenMoveIndex]), 74 + 68, 64, 0, NULL); } - + CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL); Free(text); } @@ -1437,11 +1408,6 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sStatus3ListItems); data->bitfield = sStatus3Bitfield; break; - case LIST_ITEM_STATUS4: - listTemplate.items = sStatus4ListItems; - itemsCount = ARRAY_COUNT(sStatus4ListItems); - data->bitfield = sStatus4Bitfield; - break; case LIST_ITEM_AI: listTemplate.items = sAIListItems; itemsCount = ARRAY_COUNT(sAIListItems); @@ -2084,11 +2050,6 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; - case LIST_ITEM_STATUS4: - data->modifyArrows.modifiedValPtr = &gStatuses4[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gStatuses4[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; case LIST_ITEM_AI: data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->aiFlags[data->battlerId]; data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index a33aa25cc4..87ed8542a7 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -232,9 +232,10 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT - && !IS_BATTLER_ANY_TYPE(gBattlerAttacker, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && !IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER + && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -257,7 +258,8 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) if (ability != ABILITY_SNOW_CLOAK && ability != ABILITY_OVERCOAT && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { @@ -306,7 +308,7 @@ static bool32 HandleEndTurnEmergencyExit(u32 battler) && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) && CountUsablePartyMons(battler) > 0 - && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) // Not currently held by Sky Drop + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) // Not currently held by Sky Drop { gBattlerAbility = battler; gLastUsedAbility = ability; @@ -458,7 +460,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) gBattleStruct->eventBlockCounter++; break; case FIRST_EVENT_BLOCK_THRASH: - if (gBattleMons[battler].volatiles.lockConfusionTurns && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + if (gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) { gBattleMons[battler].volatiles.lockConfusionTurns--; if (WasUnableToUseMove(battler)) @@ -484,7 +486,8 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerAlive(battler) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & (STATUS3_SEMI_INVULNERABLE | STATUS3_HEAL_BLOCK)) + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + && !IsSemiInvulnerable(battler, CHECK_ALL) && IsBattlerGrounded(battler)) { gBattlerAttacker = battler; @@ -795,7 +798,7 @@ static bool32 HandleEndTurnSaltCure(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses4[battler] & STATUS4_SALT_CURE + if (gBattleMons[battler].volatiles.saltCure && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { @@ -836,10 +839,10 @@ static bool32 HandleEndTurnSyrupBomb(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if ((gStatuses4[battler] & STATUS4_SYRUP_BOMB) && (IsBattlerAlive(battler))) + if (gBattleMons[battler].volatiles.syrupBomb && (IsBattlerAlive(battler))) { if (gDisableStructs[battler].syrupBombTimer > 0 && --gDisableStructs[battler].syrupBombTimer == 0) - gStatuses4[battler] &= ~STATUS4_SYRUP_BOMB; + gBattleMons[battler].volatiles.syrupBomb = FALSE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SYRUP_BOMB); gBattlescriptCurrInstr = BattleScript_SyrupBombEndTurn; BattleScriptExecute(gBattlescriptCurrInstr); diff --git a/src/battle_main.c b/src/battle_main.c index 2b3edabad2..cd9544ef28 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -194,7 +194,6 @@ EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u32 gStatuses4[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; @@ -3028,7 +3027,6 @@ static void BattleStartClearSetData(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gStatuses3[i] = 0; - gStatuses4[i] = 0; gDisableStructs[i].isFirstTurn = 2; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; @@ -3174,7 +3172,6 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); - gStatuses4[battler] &= STATUS4_INFINITE_CONFUSION; for (i = 0; i < gBattlersCount; i++) { if (!IsBattlerAlly(battler, i) @@ -3191,7 +3188,6 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) else { gStatuses3[battler] = 0; - gStatuses4[battler] = 0; } for (i = 0; i < gBattlersCount; i++) @@ -3200,8 +3196,8 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gBattleMons[i].volatiles.infatuation = 0; if (gBattleMons[i].volatiles.wrapped && gBattleStruct->wrappedBy[i] == battler) gBattleMons[i].volatiles.wrapped = FALSE; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) - gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gBattleMons[i].volatiles.syrupBomb && gBattleStruct->stickySyrupdBy[i] == battler) + gBattleMons[i].volatiles.syrupBomb = FALSE; } gActionSelectionCursor[battler] = 0; @@ -3308,7 +3304,6 @@ const u8* FaintClearSetData(u32 battler) memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); gStatuses3[battler] &= STATUS3_GASTRO_ACID; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. - gStatuses4[battler] = 0; for (i = 0; i < gBattlersCount; i++) { @@ -3318,8 +3313,8 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[i].volatiles.infatuation = 0; if (gBattleMons[i].volatiles.wrapped && gBattleStruct->wrappedBy[i] == battler) gBattleMons[i].volatiles.wrapped = FALSE; - if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) - gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gBattleMons[i].volatiles.syrupBomb && gBattleStruct->stickySyrupdBy[i] == battler) + gBattleMons[i].volatiles.syrupBomb = FALSE; } gActionSelectionCursor[battler] = 0; @@ -3410,10 +3405,10 @@ const u8* FaintClearSetData(u32 battler) gBattleStruct->skyDropTargets[otherSkyDropper] = SKY_DROP_NO_TARGET; // If the other Pokemon involved in this Sky Drop was the target, not the attacker - if (gStatuses3[otherSkyDropper] & STATUS3_SKY_DROPPED) + if (gBattleMons[otherSkyDropper].volatiles.semiInvulnerable == STATE_SKY_DROP) { // Release the target and take them out of the semi-invulnerable state - gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[otherSkyDropper].volatiles.semiInvulnerable = STATE_NONE; // Make the target's sprite visible gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE; @@ -4019,7 +4014,7 @@ void BattleTurnPassed(void) gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; gBattleStruct->monToSwitchIntoId[i] = PARTY_SIZE; - gStatuses4[i] &= ~STATUS4_ELECTRIFIED; + gBattleMons[i].volatiles.electrified = FALSE; gBattleMons[i].volatiles.flinched = FALSE; gBattleMons[i].volatiles.powder = FALSE; @@ -4308,7 +4303,7 @@ static void HandleTurnActionSelectionState(void) | BATTLE_TYPE_RECORDED_LINK)) && !gTestRunnerEnabled) // Or if currently held by Sky Drop - || gStatuses3[battler] & STATUS3_SKY_DROPPED) + || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) { RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; @@ -5133,7 +5128,7 @@ static void TurnValuesCleanUp(bool8 var0) if (gDisableStructs[i].substituteHP == 0) gBattleMons[i].volatiles.substitute = FALSE; - if (!(gStatuses3[i] & STATUS3_COMMANDER)) + if (gBattleMons[i].volatiles.semiInvulnerable != STATE_COMMANDER) gBattleStruct->battlerState[i].commandingDondozo = FALSE; gSpecialStatuses[i].parentalBondState = PARENTAL_BOND_OFF; @@ -6083,7 +6078,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET; moveType = GetBattleMoveType(move); - if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) || gStatuses4[battler] & STATUS4_ELECTRIFIED) + if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) + || gBattleMons[battler].volatiles.electrified) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 162e55dba9..965745608c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -407,7 +407,7 @@ static void Cmd_jumpifabilitypresent(void); static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); static void Cmd_playanimation_var(void); -static void Cmd_unused_0x47(void); +static void Cmd_jumpfifsemiinvulnerable(void); static void Cmd_unused_0x48(void); static void Cmd_moveend(void); static void Cmd_sethealblock(void); @@ -666,7 +666,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_endselectionscript, //0x44 Cmd_playanimation, //0x45 Cmd_playanimation_var, //0x46 - Cmd_unused_0x47, //0x47 + Cmd_jumpfifsemiinvulnerable, //0x47 Cmd_unused_0x48, //0x48 Cmd_moveend, //0x49 Cmd_sethealblock, //0x4A @@ -1079,7 +1079,7 @@ bool32 EmergencyExitCanBeTriggered(u32 battler) && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) && CountUsablePartyMons(battler) > 0 - && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) return TRUE; return FALSE; @@ -1366,7 +1366,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr = nextInstr; - else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) + else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) gBattlescriptCurrInstr = failInstr; else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, failInstr)) gBattlescriptCurrInstr = nextInstr; @@ -3372,7 +3372,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_FLAME_BURST: if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_SEMI_INVULNERABLE) + && !IsSemiInvulnerable(BATTLE_PARTNER(gBattlerTarget), CHECK_ALL) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { gBattleScripting.battler = i = BATTLE_PARTNER(gBattlerTarget); @@ -3513,11 +3513,11 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_SYRUP_BOMB: - if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB)) + if (!gBattleMons[gEffectBattler].volatiles.syrupBomb) { struct Pokemon *mon = GetBattlerMon(gBattlerAttacker); - gStatuses4[gEffectBattler] |= STATUS4_SYRUP_BOMB; + gBattleMons[gEffectBattler].volatiles.syrupBomb = TRUE; gDisableStructs[gEffectBattler].syrupBombTimer = 3; gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); gBattleStruct->stickySyrupdBy[gEffectBattler] = gBattlerAttacker; @@ -3655,9 +3655,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_SALT_CURE: - if (!(gStatuses4[gBattlerTarget] & STATUS4_SALT_CURE)) + if (!gBattleMons[gBattlerTarget].volatiles.saltCure) { - gStatuses4[gBattlerTarget] |= STATUS4_SALT_CURE; + gBattleMons[gBattlerTarget].volatiles.saltCure = TRUE; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectSaltCure; } @@ -5455,7 +5455,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } - else if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + else if (IsSemiInvulnerable(battler, CHECK_ALL)) { gBattlescriptCurrInstr = nextInstr; } @@ -5484,8 +5484,15 @@ static void Cmd_playanimation_var(void) PlayAnimation(battler, *(cmd->animIdPtr), cmd->argPtr, cmd->nextInstr); } -static void Cmd_unused_0x47(void) +static void Cmd_jumpfifsemiinvulnerable(void) { + CMD_ARGS(u8 battler, u8 state, const u8 *jumpInstr); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (gBattleMons[battler].volatiles.semiInvulnerable == cmd->state) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_0x48(void) @@ -5764,7 +5771,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER)) + && gBattleMons[BATTLE_PARTNER(gBattlerTarget)].volatiles.semiInvulnerable != STATE_COMMANDER) { u32 targetAbility = GetBattlerAbility(gBattlerTarget); if (targetAbility == ABILITY_GUARD_DOG) @@ -5796,8 +5803,9 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS); BattleScriptCall(BattleScript_MoveEffectSmackDown); effect = TRUE; } @@ -6156,7 +6164,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible - if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) { BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, TRUE); @@ -6168,12 +6176,12 @@ static void Cmd_moveend(void) break; case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)) + || !IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) || WasUnableToUseMove(gBattlerAttacker)) { BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gBattlerAttacker); - gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = TRUE; gBattleScripting.moveendState++; return; @@ -6182,11 +6190,11 @@ static void Cmd_moveend(void) break; case MOVEEND_TARGET_VISIBLE: // make target sprite visible if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount - && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) + && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) { BtlController_EmitSpriteInvisibility(gBattlerTarget, B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gBattlerTarget); - gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; gBattleScripting.moveendState++; return; } @@ -6927,7 +6935,7 @@ static void Cmd_moveend(void) u32 partner = BATTLE_PARTNER(i); gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; if (IsBattlerAlive(partner)) - gStatuses3[partner] &= ~STATUS3_COMMANDER; + gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; } } @@ -8468,7 +8476,7 @@ static void Cmd_statusanimation(void) { u32 battler = GetBattlerForBattleScript(cmd->battler), statusFlag = (cmd->isVolatile || cmd->status) ? cmd->status : gBattleMons[battler].status1; - if (!(gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (!IsSemiInvulnerable(battler, CHECK_ALL) && gDisableStructs[battler].substituteHP == 0 && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { @@ -9322,7 +9330,7 @@ static bool32 IsRototillerAffected(u32 battler) return FALSE; // Only grounded battlers affected if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) return FALSE; // Only grass types affected - if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; // Rototiller doesn't affected semi-invulnerable battlers if (BlocksPrankster(MOVE_ROTOTILLER, gBattlerAttacker, battler, FALSE)) return FALSE; @@ -9352,7 +9360,7 @@ static bool32 IsTeatimeAffected(u32 battler) { if (GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) return FALSE; // Only berries - if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; // Teatime doesn't affected semi-invulnerable battlers return TRUE; } @@ -11151,7 +11159,7 @@ static void Cmd_transformdataexecution(void) gBattlescriptCurrInstr = cmd->nextInstr; if (gBattleMons[gBattlerTarget].volatiles.transformed || gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON - || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER) + || IsSemiInvulnerable(gBattlerTarget, EXCLUDE_COMMANDER)) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; @@ -11552,7 +11560,7 @@ static void Cmd_settypetorandomresistance(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (IsSemiInvulnerable(gBattlerTarget, gCurrentMove)) + else if (!BreaksThroughSemiInvulnerablity(gBattlerTarget, gCurrentMove)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -11705,7 +11713,7 @@ static void Cmd_trychoosesleeptalkmove(void) gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; } gCurrMovePos = movePosition; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gBattlescriptCurrInstr = cmd->failInstr; } @@ -12005,7 +12013,7 @@ static void Cmd_trysetperishsong(void) if (gStatuses3[i] & STATUS3_PERISH_SONG || GetBattlerAbility(i) == ABILITY_SOUNDPROOF || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) - || gStatuses3[i] & STATUS3_COMMANDER) + || gBattleMons[i].volatiles.semiInvulnerable == STATE_COMMANDER) { notAffectedCount++; } @@ -12557,9 +12565,9 @@ static void Cmd_setsemiinvulnerablebit(void) { u32 semiInvulnerableEffect = GetMoveTwoTurnAttackStatus(gCurrentMove); if (cmd->clear) - gStatuses3[gBattlerAttacker] &= ~semiInvulnerableEffect; + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; else - gStatuses3[gBattlerAttacker] |= semiInvulnerableEffect; + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = semiInvulnerableEffect; } gBattlescriptCurrInstr = cmd->nextInstr; @@ -12618,7 +12626,7 @@ static void Cmd_trymemento(void) if (B_MEMENTO_FAIL >= GEN_4 && (gBattleCommunication[MISS_TYPE] == B_MSG_PROTECTED - || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE + || IsSemiInvulnerable(gBattlerTarget, CHECK_ALL) || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { @@ -15094,7 +15102,7 @@ void BS_ItemCureStatus(void) if (GetItemStatus1Mask(gLastUsedItem) & STATUS1_SLEEP) gBattleMons[battler].volatiles.nightmare = FALSE; if (ItemHasVolatileFlag(gLastUsedItem, VOLATILE_CONFUSION)) - gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } if (statusChanged) @@ -15234,15 +15242,6 @@ void BS_JumpIfElectricAbilityAffected(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_ApplySaltCure(void) -{ - NATIVE_ARGS(u8 battler); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - gStatuses4[battler] |= STATUS4_SALT_CURE; - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SetTerrain(void) { NATIVE_ARGS(const u8 *jumpInstr); @@ -15362,7 +15361,7 @@ void BS_TrySetOctolock(void) void BS_SetGlaiveRush(void) { NATIVE_ARGS(); - gStatuses4[gBattlerAttacker] |= STATUS4_GLAIVE_RUSH; + gBattleMons[gBattlerAttacker].volatiles.glaiveRush = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -15985,7 +15984,7 @@ void BS_TeatimeInvul(void) NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES && !(gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE))) + if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) gBattlescriptCurrInstr = cmd->nextInstr; else gBattlescriptCurrInstr = cmd->jumpInstr; @@ -16107,7 +16106,7 @@ void BS_JumpIfCommanderActive(void) if (gBattleStruct->battlerState[gBattlerTarget].commanderSpecies != SPECIES_NONE) gBattlescriptCurrInstr = cmd->jumpInstr; - else if (gStatuses3[gBattlerTarget] & STATUS3_COMMANDER) + else if (gBattleMons[gBattlerTarget].volatiles.semiInvulnerable == STATE_COMMANDER) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -16887,10 +16886,11 @@ void BS_GravityOnAirborneMons(void) { NATIVE_ARGS(); // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop. - if (gStatuses3[gBattlerTarget] & STATUS3_ON_AIR && !(gStatuses3[gBattlerTarget] & STATUS3_SKY_DROPPED)) + if (gBattleMons[gBattlerTarget].volatiles.semiInvulnerable == STATE_ON_AIR) CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_GRAVITY_ON_AIRBORNE); - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17460,7 +17460,7 @@ void BS_TryElectrify(void) } else { - gStatuses4[gBattlerTarget] |= STATUS4_ELECTRIFIED; + gBattleMons[gBattlerTarget].volatiles.electrified = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -17964,7 +17964,7 @@ void BS_JumpIfUnder200(void) void BS_SetSkyDrop(void) { NATIVE_ARGS(); - gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_SKY_DROP; /* skyDropTargets holds the information of who is in a particular instance of Sky Drop. This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if the target of a Sky Drop faints while in the air.*/ @@ -17998,7 +17998,7 @@ void BS_ClearSkyDrop(void) { gBattleStruct->skyDropTargets[gBattlerAttacker] = SKY_DROP_NO_TARGET; gBattleStruct->skyDropTargets[gBattlerTarget] = SKY_DROP_NO_TARGET; - gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -18010,7 +18010,7 @@ void BS_ClearSkyDrop(void) void BS_SkyDropYawn(void) { NATIVE_ARGS(); - if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED)) + if (gBattleStruct->skyDropTargets[gEffectBattler] != SKY_DROP_NO_TARGET && gBattleMons[gEffectBattler].volatiles.semiInvulnerable != STATE_SKY_DROP) { // Set the target of Sky Drop as gEffectBattler gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler]; diff --git a/src/battle_util.c b/src/battle_util.c index caa4be0191..bc5eafc56f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1047,7 +1047,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) const u8 *result = NULL; u8 otherSkyDropper = gBattleStruct->skyDropTargets[battler]; - gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR); + gBattleMons[battler].volatiles.semiInvulnerable = STATE_NONE; // Makes both attacker and target's sprites visible gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; @@ -1075,9 +1075,9 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) } else if (skyDropState == SKY_DROP_GRAVITY_ON_AIRBORNE) { - // Reapplying STATUS3_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target. + // Reapplying STATE_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target. gBattleStruct->skyDropTargets[battler] = SKY_DROP_RELEASED_TARGET; - gStatuses3[otherSkyDropper] |= STATUS3_SKY_DROPPED; + gBattleMons[otherSkyDropper].volatiles.semiInvulnerable = STATE_SKY_DROP; } else if (skyDropState == SKY_DROP_CANCEL_MULTI_TURN_MOVES) { @@ -1121,10 +1121,10 @@ const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState) } // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. - if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED)) - gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); + if (gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) + gBattleMons[battler].volatiles.semiInvulnerable = STATE_NONE; - if (gBattleStruct->skyDropTargets[battler] != SKY_DROP_NO_TARGET && !(gStatuses3[battler] & STATUS3_SKY_DROPPED)) + if (gBattleStruct->skyDropTargets[battler] != SKY_DROP_NO_TARGET && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) result = CheckSkyDropState(battler, skyDropState); gDisableStructs[battler].rolloutTimer = 0; @@ -1893,7 +1893,7 @@ static enum MoveCanceller CancellerFlags(void) { gBattleMons[gBattlerAttacker].volatiles.destinyBond = FALSE; gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; - gStatuses4[gBattlerAttacker] &= ~STATUS4_GLAIVE_RUSH; + gBattleMons[gBattlerAttacker].volatiles.glaiveRush = FALSE; return MOVE_STEP_SUCCESS; } @@ -1907,7 +1907,7 @@ static enum MoveCanceller CancellerStanceChangeOne(void) static enum MoveCanceller CancellerSkyDrop(void) { // If Pokemon is being held in Sky Drop - if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED) + if (gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable == STATE_SKY_DROP) { gBattlescriptCurrInstr = BattleScript_MoveEnd; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -2157,7 +2157,7 @@ static enum MoveCanceller CancellerConfused(void) if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) { - if (!(gStatuses4[gBattlerAttacker] & STATUS4_INFINITE_CONFUSION)) + if (!gBattleMons[gBattlerAttacker].volatiles.infiniteConfusion) gBattleMons[gBattlerAttacker].volatiles.confusionTurns--; if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) { @@ -3577,7 +3577,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gBattleMons[diagonalBattler].volatiles.transformed && !gBattleMons[battler].volatiles.transformed && gBattleStruct->illusion[diagonalBattler].state != ILLUSION_ON - && !(gStatuses3[diagonalBattler] & STATUS3_SEMI_INVULNERABLE_NO_COMMANDER)) + && !IsSemiInvulnerable(diagonalBattler, EXCLUDE_COMMANDER)) { SaveBattlerAttacker(gBattlerAttacker); SaveBattlerTarget(gBattlerTarget); @@ -4169,9 +4169,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattlerAttacker = partner; gBattleStruct->battlerState[battler].commandingDondozo = TRUE; gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species; - gStatuses3[battler] |= STATUS3_COMMANDER; - if (gBattleMons[battler].volatiles.confusionTurns > 0 - && !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION)) + gBattleMons[battler].volatiles.semiInvulnerable = STATE_COMMANDER; + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !gBattleMons[battler].volatiles.infiniteConfusion) gBattleMons[battler].volatiles.confusionTurns--; BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(battler); @@ -4212,7 +4211,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_ICE_BODY: if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal); @@ -4985,7 +4985,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_GULP_MISSILE: if ((gBattleMons[gBattlerAttacker].species == SPECIES_CRAMORANT) - && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && ((gCurrentMove == MOVE_SURF && IsBattlerTurnDamaged(gBattlerTarget)) || gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable == STATE_UNDERWATER) && TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_HP_PERCENT)) { gBattleScripting.battler = gBattlerAttacker; @@ -5506,7 +5506,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check return FALSE; else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return FALSE; - else if (gStatuses3[battler] & STATUS3_SKY_DROPPED) + else if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; else return TRUE; @@ -5531,7 +5531,7 @@ bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag) { if (!(gFieldStatuses & terrainFlag)) return FALSE; - else if (gStatuses3[battler] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; return IsBattlerGrounded(battler); @@ -6066,7 +6066,7 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) { if (CanBeInfinitelyConfused(battler)) - gStatuses4[battler] |= STATUS4_INFINITE_CONFUSION; + gBattleMons[battler].volatiles.infiniteConfusion = TRUE; BufferStatChange(battler, STAT_ATK, STRINGID_STATROSE); gBattlerAttacker = gEffectBattler = battler; @@ -7300,8 +7300,8 @@ void ClearVariousBattlerFlags(u32 battler) { gDisableStructs[battler].furyCutterCounter = 0; gBattleMons[battler].volatiles.destinyBond = FALSE; + gBattleMons[battler].volatiles.glaiveRush = FALSE; gStatuses3[battler] &= ~STATUS3_GRUDGE; - gStatuses4[battler] &= ~ STATUS4_GLAIVE_RUSH; } void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands @@ -8286,7 +8286,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) break; case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_KNOCK_OFF: @@ -9077,7 +9077,7 @@ static inline uq4_12_t GetCriticalModifier(bool32 isCrit) static inline uq4_12_t GetGlaiveRushModifier(u32 battlerDef) { - if (gStatuses4[battlerDef] & STATUS4_GLAIVE_RUSH) + if (gBattleMons[battlerDef].volatiles.glaiveRush) return UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -9102,21 +9102,21 @@ static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) static inline uq4_12_t GetUndergroundModifier(u32 move, u32 battlerDef) { - if (MoveDamagesUnderground(move) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) + if (MoveDamagesUnderground(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERGROUND) return UQ_4_12(2.0); return UQ_4_12(1.0); } static inline uq4_12_t GetDiveModifier(u32 move, u32 battlerDef) { - if (MoveDamagesUnderWater(move) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) + if (MoveDamagesUnderWater(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERWATER) return UQ_4_12(2.0); return UQ_4_12(1.0); } static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) { - if (MoveDamagesAirborneDoubleDamage(move) && gStatuses3[battlerDef] & STATUS3_ON_AIR) + if (MoveDamagesAirborneDoubleDamage(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_ON_AIR) return UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -9934,7 +9934,7 @@ bool32 CanMegaEvolve(u32 battler) return FALSE; // Check if battler is currently held by Sky Drop. - if (gStatuses3[battler] & STATUS3_SKY_DROPPED) + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; // Check if battler is holding a Z-Crystal. @@ -9972,7 +9972,7 @@ bool32 CanUltraBurst(u32 battler) return FALSE; // Check if mon is currently held by Sky Drop - if (gStatuses3[battler] & STATUS3_SKY_DROPPED) + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; // Check if there is an entry in the form change table for Ultra Burst and battler is holding a Z-Crystal. @@ -10784,7 +10784,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch return FALSE; if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) return FALSE; - if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) + if (IsSemiInvulnerable(battlerDef, CHECK_ALL)) return FALSE; return TRUE; @@ -10915,7 +10915,7 @@ void RecalcBattlerStats(u32 battler, struct Pokemon *mon, bool32 isDynamaxing) void RemoveConfusionStatus(u32 battler) { gBattleMons[battler].volatiles.confusionTurns = 0; - gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } static bool32 CanBeInfinitelyConfused(u32 battler) @@ -11226,7 +11226,7 @@ bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) u32 moveType = GetBattleMoveType(gCurrentMove); return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) - || IsSemiInvulnerable(battlerDef, gCurrentMove) + || !BreaksThroughSemiInvulnerablity(battlerDef, gCurrentMove) || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); } @@ -11614,13 +11614,13 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u if ((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) || (B_TOXIC_NEVER_MISS >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - || gStatuses4[battlerDef] & STATUS4_GLAIVE_RUSH) + || gBattleMons[battlerDef].volatiles.glaiveRush) { effect = TRUE; } // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits. else if (abilityAtk == ABILITY_NO_GUARD - && !(gStatuses3[battlerDef] & STATUS3_COMMANDER) + && gBattleMons[battlerDef].volatiles.semiInvulnerable != STATE_COMMANDER && (moveEffect != EFFECT_SKY_DROP || gBattleStruct->skyDropTargets[battlerDef] == SKY_DROP_NO_TARGET)) { effect = TRUE; @@ -11635,7 +11635,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u } // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. else if (gStatuses3[battlerDef] & STATUS3_TELEKINESIS - && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE) + && !IsSemiInvulnerable(battlerDef, CHECK_ALL) && moveEffect != EFFECT_OHKO && moveEffect != EFFECT_SHEER_COLD) { @@ -11645,15 +11645,11 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { effect = TRUE; } - else if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + else if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) { effect = TRUE; } - else if ((gStatuses3[battlerDef] & STATUS3_COMMANDER) - || (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) - || ((gStatuses3[battlerDef] & STATUS3_ON_AIR) && !(MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move))) - || ((gStatuses3[battlerDef] & STATUS3_UNDERGROUND) && !MoveDamagesUnderground(move)) - || ((gStatuses3[battlerDef] & STATUS3_UNDERWATER) && !MoveDamagesUnderWater(move))) + else if (!BreaksThroughSemiInvulnerablity(battlerDef, move)) { if (option == RUN_SCRIPT) { @@ -11813,3 +11809,32 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u return calc; } + +bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander) +{ + if (gBattleMons[battler].volatiles.semiInvulnerable == STATE_COMMANDER) + return excludeCommander != EXCLUDE_COMMANDER; + return gBattleMons[battler].volatiles.semiInvulnerable != STATE_NONE; +} + +bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) +{ + switch (gBattleMons[battler].volatiles.semiInvulnerable) + { + case STATE_UNDERGROUND: + return MoveDamagesUnderground(move); + case STATE_UNDERWATER: + return MoveDamagesUnderWater(move); + case STATE_ON_AIR: + case STATE_SKY_DROP: + return MoveDamagesAirborne(move) || MoveDamagesAirborneDoubleDamage(move); + case STATE_PHANTOM_FORCE: + return FALSE; + case STATE_COMMANDER: + return FALSE; + case STATE_NONE: + return TRUE; + } + + return FALSE; +} diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 4edf88f17a..a4cff9c375 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -604,7 +604,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = STATE_ON_AIR }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -2461,7 +2461,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .assistBanned = TRUE, .skyBattleBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = COMPRESS_BITS(STATUS3_UNDERGROUND) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = STATE_UNDERGROUND }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -7715,7 +7715,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .instructBanned = TRUE, .assistBanned = TRUE, .skyBattleBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = COMPRESS_BITS(STATUS3_UNDERWATER) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = STATE_UNDERWATER }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_DIVE, @@ -8974,7 +8974,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = STATE_ON_AIR }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, @@ -12100,7 +12100,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = STATE_PHANTOM_FORCE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), @@ -13065,7 +13065,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = COMPRESS_BITS(STATUS3_ON_AIR) }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = STATE_ON_AIR }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -14505,7 +14505,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = COMPRESS_BITS(STATUS3_PHANTOM_FORCE) }, + .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = STATE_PHANTOM_FORCE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, }), diff --git a/src/item_use.c b/src/item_use.c index 328a258f2e..af1395f011 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1110,7 +1110,7 @@ static u32 GetBallThrowableState(void) return BALL_THROW_UNABLE_TWO_MONS; else if (IsPlayerPartyAndPokemonStorageFull() == TRUE) return BALL_THROW_UNABLE_NO_ROOM; - else if (B_SEMI_INVULNERABLE_CATCH >= GEN_4 && (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE)) + else if (B_SEMI_INVULNERABLE_CATCH >= GEN_4 && IsSemiInvulnerable(GetCatchingBattler(), CHECK_ALL)) return BALL_THROW_UNABLE_SEMI_INVULNERABLE; else if (FlagGet(B_FLAG_NO_CATCHING)) return BALL_THROW_UNABLE_DISABLED_FLAG; diff --git a/test/battle/hold_effect/berserk_gene.c b/test/battle/hold_effect/berserk_gene.c index bbeb356701..5331f57849 100644 --- a/test/battle/hold_effect/berserk_gene.c +++ b/test/battle/hold_effect/berserk_gene.c @@ -213,7 +213,7 @@ SINGLE_BATTLE_TEST("Berserk Gene causes infinite confusion") // check if bit is TURN {} } SCENE { } THEN { - EXPECT(gStatuses4[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] & STATUS4_INFINITE_CONFUSION); + EXPECT(gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].volatiles.infiniteConfusion); } } diff --git a/test/battle/move_effect/semi_invulnerable.c b/test/battle/move_effect/semi_invulnerable.c index 331413121c..66086ca458 100644 --- a/test/battle/move_effect/semi_invulnerable.c +++ b/test/battle/move_effect/semi_invulnerable.c @@ -4,17 +4,17 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIG) == STATUS3_UNDERGROUND); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIG) == STATE_UNDERGROUND); ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_DIVE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIVE) == STATUS3_UNDERWATER); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_DIVE) == STATE_UNDERWATER); ASSUME(GetMoveEffect(MOVE_PHANTOM_FORCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_PHANTOM_FORCE) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_PHANTOM_FORCE) == STATE_PHANTOM_FORCE); ASSUME(GetMoveEffect(MOVE_SHADOW_FORCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SHADOW_FORCE) == STATUS3_PHANTOM_FORCE); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SHADOW_FORCE) == STATE_PHANTOM_FORCE); } SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn 1, then strike turn 2") diff --git a/test/battle/move_effects_combined/hurricane.c b/test/battle/move_effects_combined/hurricane.c index 91a3435cf4..96773ce585 100644 --- a/test/battle/move_effects_combined/hurricane.c +++ b/test/battle/move_effects_combined/hurricane.c @@ -41,9 +41,9 @@ SINGLE_BATTLE_TEST("Hurricane can hit airborne targets (Fly, Bounce)") PARAMETRIZE { move = MOVE_BOUNCE; } GIVEN { ASSUME(GetMoveEffect(MOVE_FLY) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_FLY) == STATE_ON_AIR); ASSUME(GetMoveEffect(MOVE_BOUNCE) == EFFECT_SEMI_INVULNERABLE); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_BOUNCE) == STATE_ON_AIR); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } } WHEN { @@ -59,7 +59,7 @@ DOUBLE_BATTLE_TEST("Hurricane can hit airborne targets (Sky Drop)") { GIVEN { ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP); - ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SKY_DROP) == STATUS3_ON_AIR); + ASSUME(GetMoveTwoTurnAttackStatus(MOVE_SKY_DROP) == STATE_ON_AIR); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); From d3a5ddcb4b12a44400a0b7fcdbd41ba443a9ee1d Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Tue, 5 Aug 2025 21:14:21 +0200 Subject: [PATCH 184/248] remove leftover --- include/constants/moves.h | 4 ---- src/field_effect.c | 4 ---- 2 files changed, 8 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index f8fa1773bf..dc8bc59a3f 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -1,10 +1,6 @@ #ifndef GUARD_CONSTANTS_MOVES_H #define GUARD_CONSTANTS_MOVES_H -#ifndef BATTLE_ENGINE - #define MOVE_ROCK_CLIMB 1 -#endif - #define MOVE_NONE 0 #define MOVE_POUND 1 #define MOVE_KARATE_CHOP 2 diff --git a/src/field_effect.c b/src/field_effect.c index a79409fd93..427bac13a3 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -259,10 +259,6 @@ static bool8 RockClimb_WaitStopRockClimb(struct Task *task, struct ObjectEvent * static bool8 RockClimb_StopRockClimbInit(struct Task *task, struct ObjectEvent *objectEvent); // Static RAM declarations -#if FOLLOW_ME_IMPLEMENTED -static void TryAttachFollowerToPlayer(void); -#endif - static u8 sActiveList[32]; // External declarations From e8b6d40f18a795425e9b90d2e04406f37bd2696c Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 6 Aug 2025 10:22:34 -0400 Subject: [PATCH 185/248] AI_FLAG_ATTACKS_PARTNER with a config for bloodthirstiness (#7401) --- docs/tutorials/ai_flags.md | 3 + include/battle_ai_util.h | 11 +- include/config/ai.h | 3 + include/constants/battle_ai.h | 5 +- src/battle_ai_field_statuses.c | 38 +++--- src/battle_ai_main.c | 154 ++++++++++++++--------- src/battle_ai_util.c | 118 ++++++++++++----- src/battle_controller_opponent.c | 24 +--- test/battle/ai/ai_doubles.c | 2 +- test/battle/ai/ai_flag_attacks_partner.c | 78 ++++++++++++ 10 files changed, 312 insertions(+), 124 deletions(-) create mode 100644 test/battle/ai/ai_flag_attacks_partner.c diff --git a/docs/tutorials/ai_flags.md b/docs/tutorials/ai_flags.md index 98657210d9..2c13cee8bd 100644 --- a/docs/tutorials/ai_flags.md +++ b/docs/tutorials/ai_flags.md @@ -54,6 +54,9 @@ This flag is divided into two components to calculate the best available move fo This is different to `AI_FLAG_CHECK_BAD_MOVE` as it calculates how poor a move is and not whether it will fail or not. +## `AI_FLAG_ATTACKS_PARTNER` +This flag is meant for double battles where both of the opponents hate each other. They prioritize damage to their 'partner' over the player. + ## `AI_FLAG_FORCE_SETUP_FIRST_TURN` AI will prioritize using setup moves on the first turn at the expense of all else. These include stat buffs, field effects, status moves, etc. AI_FLAG_CHECK_VIABILITY will instead do this when the AI determines it makes sense. diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index e0f1a4de0c..22efc06d0e 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -241,8 +241,16 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData // partner logic bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); +// IsTargetingPartner includes a check to make sure the adjacent pokemon is truly a partner. u32 GetAllyChosenMove(u32 battlerId); -bool32 IsValidDoubleBattle(u32 battlerAtk); +bool32 IsBattle1v1(); +// IsBattle1v1 is distinct from !IsDoubleBattle. If the player is fighting Maxie and Tabitha, with Steven as their partner, and both Tabitha and Steven have run out of Pokemon, the battle is 1v1, even though mechanically it is a Double Battle for how battlers and flags are set. +// Most AI checks should be using IsBattle1v1; most engine checks should be using !IsDoubleBattle +bool32 HasTwoOpponents(u32 battler); +// HasTwoOpponents checks if the opposing side has two pokemon. Partner state is irrelevant. e.g., Dragon Darts hits one time with two opponents and twice with one opponent. +bool32 HasPartner(u32 battler); +bool32 HasPartnerIgnoreFlags(u32 battler); +// HasPartner respects the Attacks Partner AI flag; HasPartnerIgnoreFlags checks only if a live pokemon is adjacent. bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); @@ -290,5 +298,6 @@ u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); u32 GetThinkingBattler(u32 battler); +bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/include/config/ai.h b/include/config/ai.h index d5f42696eb..8d015ce9e4 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -101,6 +101,9 @@ #define DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE 35 // both pokemon use Trick Room on turn Trick Room expires in the hopes both opponents used Protect to stall, getting a free refresh on the timer #define TAILWIND_IN_TRICK_ROOM_CHANCE 35 // use Tailwind on turn Trick Room expires in the hopes both opponents used Protect to stall +#define AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER FALSE // if TRUE, AI_FLAG_ATTACKS_PARTNER prefers attacking the partner over the ally. + // This is treated as true regardless during wild battles with AI. + // AI's desired stat changes for Guard Split and Power Split, treated as % #define GUARD_SPLIT_ALLY_PERCENTAGE 200 #define GUARD_SPLIT_ENEMY_PERCENTAGE 50 diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 8781640d60..f3a62398b3 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -34,9 +34,10 @@ #define AI_FLAG_PREDICT_MOVE (1 << 26) // AI will predict the player's move based on what move it would use in the same situation. Recommend using AI_FLAG_OMNISCIENT #define AI_FLAG_SMART_TERA (1 << 27) // AI will make smarter decisions when choosing whether to terrastalize (default is to always tera whenever available). #define AI_FLAG_ASSUME_STAB (1 << 28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. -#define AI_FLAG_ASSUME_STATUS_MOVES (1 << 29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ASSUME_STATUS_MOVES (1 << 29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. +#define AI_FLAG_ATTACKS_PARTNER (1 << 30) // AI specific to double battles; AI can deliberately attack its 'partner.' -#define AI_FLAG_COUNT 30 +#define AI_FLAG_COUNT 31 // Flags at and after 32 need different formatting, as in // #define AI_FLAG_PLACEHOLDER ((u64)1 << 32) diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index fc5ea0ccf6..d04f00d4b5 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -57,7 +57,7 @@ bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredR u32 i; u32 battlersOnSide = 1; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) battlersOnSide = 2; for (i = 0; i < battlersOnSide; i++) @@ -92,7 +92,7 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome u32 battlersOnSide = 1; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) battlersOnSide = 2; for (i = 0; i < battlersOnSide; i++) @@ -230,7 +230,7 @@ static enum FieldEffectOutcome BenefitsFromSun(u32 battler) if (DoesAbilityBenefitFromWeather(ability, B_WEATHER_SUN) || HasLightSensitiveMove(battler) || HasDamagingMoveOfType(battler, TYPE_FIRE) - || HasBattlerSideMoveWithEffect(battler, EFFECT_HYDRO_STEAM)) + || HasMoveWithEffect(battler, EFFECT_HYDRO_STEAM)) return FIELD_EFFECT_POSITIVE; if (HasMoveWithFlag(battler, MoveHas50AccuracyInSun) || HasDamagingMoveOfType(battler, TYPE_WATER) || gAiLogicData->abilities[battler] == ABILITY_DRY_SKIN) @@ -243,8 +243,7 @@ static enum FieldEffectOutcome BenefitsFromSun(u32 battler) static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler) { if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_SANDSTORM) - || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK) - || HasBattlerSideMoveWithEffect(battler, EFFECT_SHORE_UP)) + || IS_BATTLER_OF_TYPE(battler, TYPE_ROCK)) return FIELD_EFFECT_POSITIVE; if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) @@ -314,7 +313,7 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) return FIELD_EFFECT_POSITIVE; bool32 grounded = IsBattlerGrounded(battler); - if (grounded && HasBattlerSideUsedMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) + if (grounded && HasBattlerSideMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) return FIELD_EFFECT_POSITIVE; if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) @@ -322,6 +321,10 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) return FIELD_EFFECT_POSITIVE; + if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_RISING_VOLTAGE)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; } @@ -331,21 +334,25 @@ static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_GRASSY_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) + if (HasMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideUsedMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) + if (HasMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) return FIELD_EFFECT_POSITIVE; bool32 grounded = IsBattlerGrounded(battler); // Weaken spamming Earthquake, Magnitude, and Bulldoze. - if (grounded && (HasBattlerSideUsedMoveWithEffect(FOE(battler), EFFECT_EARTHQUAKE) - || HasBattlerSideUsedMoveWithEffect(FOE(battler), EFFECT_MAGNITUDE))) + if (grounded && (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_EARTHQUAKE) + || HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_MAGNITUDE))) return FIELD_EFFECT_POSITIVE; if (grounded && HasDamagingMoveOfType(battler, TYPE_GRASS)) return FIELD_EFFECT_POSITIVE; + if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_GRASSY_GLIDE)) + return FIELD_EFFECT_NEGATIVE; + + return FIELD_EFFECT_NEUTRAL; } @@ -360,7 +367,7 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) bool32 grounded = IsBattlerGrounded(battler); bool32 allyGrounded = FALSE; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); if (HasMoveWithEffect(FOE(battler), EFFECT_REST) && IsBattlerGrounded(FOE(battler))) @@ -387,12 +394,12 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_PSYCHIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) + if (HasMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_POSITIVE; bool32 grounded = IsBattlerGrounded(battler); bool32 allyGrounded = FALSE; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); // don't bother if we're not grounded @@ -408,6 +415,9 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (grounded && (HasDamagingMoveOfType(battler, TYPE_PSYCHIC))) return FIELD_EFFECT_POSITIVE; + if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_EXPANDING_FORCE)) + return FIELD_EFFECT_NEGATIVE; + if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) || HasBattlerSideAbility(battler, ABILITY_TRIAGE, gAiLogicData) || HasBattlerSideAbility(battler, ABILITY_PRANKSTER, gAiLogicData)) @@ -429,7 +439,7 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) else return FIELD_EFFECT_NEGATIVE; } - + // First checking if we have enough priority for one pokemon to disregard Trick Room entirely. if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7a74e0d655..c6d488211a 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -51,6 +51,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); @@ -91,10 +92,10 @@ static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = [24] = NULL, // AI_FLAG_PREDICT_INCOMING_MON [25] = AI_CheckPpStall, // AI_FLAG_PP_STALL_PREVENTION [26] = NULL, // AI_FLAG_PREDICT_MOVE - [27] = NULL, // Unused - [28] = NULL, // Unused - [29] = NULL, // Unused - [30] = NULL, // Unused + [27] = NULL, // AI_FLAG_SMART_TERA + [28] = NULL, // AI_FLAG_ASSUME_STAB + [29] = NULL, // AI_FLAG_ASSUME_STATUS_MOVES + [30] = AI_AttacksPartner, // AI_FLAG_ATTACKS_PARTNER [31] = NULL, // Unused [32] = NULL, // Unused [33] = NULL, // Unused @@ -247,6 +248,18 @@ void BattleAI_SetupFlags(void) // smart wild AI gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); + + // The check is here because wild natural enemies are not symmetrical. + if (B_WILD_NATURAL_ENEMIES && IsDoubleBattle()) + { + u32 speciesLeft = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES); + u32 speciesRight = GetMonData(&gEnemyParty[1], MON_DATA_SPECIES); + if (IsNaturalEnemy(speciesLeft, speciesRight)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] |= AI_FLAG_ATTACKS_PARTNER; + if (IsNaturalEnemy(speciesRight, speciesLeft)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] |= AI_FLAG_ATTACKS_PARTNER; + } + } else { @@ -1059,6 +1072,9 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, // AI_FLAG_CHECK_BAD_MOVE - decreases move scores static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + if (IsTargetingPartner(battlerAtk, battlerDef)) + return score; + // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); @@ -1066,7 +1082,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; - bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); + bool32 isBattle1v1 = IsBattle1v1(); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); + bool32 hasPartner = HasPartner(battlerAtk); u32 i; u32 weather; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); @@ -1074,9 +1092,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - if (IsTargetingPartner(battlerAtk, battlerDef)) - return score; - SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); @@ -1208,7 +1223,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // def ability checks // target partner ability checks & not attacking partner - if (isDoubleBattle) + if (hasTwoOpponents) { switch (aiData->abilities[BATTLE_PARTNER(battlerDef)]) { @@ -1479,7 +1494,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_ROTOTILLER: - if (isDoubleBattle) + if (hasPartner) { if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) && IsBattlerGrounded(battlerAtk) @@ -1510,12 +1525,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; } - else if (!isDoubleBattle) + else if (!hasPartner) { ADJUST_SCORE(-10); // no partner and our stats wont rise, so don't use } - if (isDoubleBattle) + if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1541,12 +1556,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPDEF)) ADJUST_SCORE(-8); } - else if (!isDoubleBattle) + else if (!hasPartner) { ADJUST_SCORE(-10); // our stats wont rise from this move } - if (isDoubleBattle) + if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1875,7 +1890,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-9); break; case EFFECT_PERISH_SONG: - if (isDoubleBattle) + if (!isBattle1v1) { if (CountUsablePartyMons(battlerAtk) == 0 && aiData->abilities[battlerAtk] != ABILITY_SOUNDPROOF @@ -1908,23 +1923,23 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SANDSTORM: if (weather & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_SUNNY_DAY: if (weather & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_RAIN_DANCE: if (weather & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_HAIL: case EFFECT_SNOWSCAPE: if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) - || IsMoveEffectWeather(aiData->partnerMove)) + || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_ATTRACT: @@ -2022,8 +2037,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_FOLLOW_ME: case EFFECT_HELPING_HAND: - if (!isDoubleBattle - || !IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) + if (!hasPartner || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. @@ -2102,11 +2116,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_FLOWER_SHIELD: if (!IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && !(isDoubleBattle && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS))) + && !(hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS))) ADJUST_SCORE(-10); break; case EFFECT_AROMATIC_MIST: - if (!isDoubleBattle || gBattleMons[BATTLE_PARTNER(battlerAtk)].hp == 0 || !BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPDEF)) + if (!hasPartner || !BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_BIDE: @@ -2243,7 +2257,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) decreased = TRUE; } case PROTECT_CRAFTY_SHIELD: - if (!isDoubleBattle) + if (!hasPartner) { ADJUST_SCORE(-10); decreased = TRUE; @@ -2279,7 +2293,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else if (gDisableStructs[battlerAtk].protectUses == 1 && Random() % 100 < 50) { - if (!isDoubleBattle) + if (isBattle1v1) ADJUST_SCORE(-6); else ADJUST_SCORE(-10); //Don't try double protecting in doubles @@ -2327,7 +2341,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } - if (isDoubleBattle) + if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the potential Defog @@ -2540,7 +2554,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_PLEDGE: - if (isDoubleBattle && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) + if (hasPartner && gBattleMons[BATTLE_PARTNER(battlerAtk)].hp > 0) { if (aiData->partnerMove != MOVE_NONE && GetMoveEffect(aiData->partnerMove) == EFFECT_PLEDGE @@ -2723,7 +2737,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (isDoubleBattle) + else if (hasPartner) { if (!IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); @@ -2742,14 +2756,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_QUASH: - if (!isDoubleBattle + if (!hasPartner || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: if (!IsTargetingPartner(battlerAtk, battlerDef) - || !isDoubleBattle + || !hasPartner || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2976,15 +2990,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - + + bool32 hasPartner = HasPartner(battlerAtk); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); - bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) - && !partnerProtecting && IsBattlerAlive(battlerAtkPartner); + bool32 wouldPartnerFaint = hasPartner && CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) + && !partnerProtecting; bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); // check what effect partner is using - if (aiData->partnerMove != 0) + if (aiData->partnerMove != 0 && hasPartner) { switch (partnerEffect) { @@ -3040,7 +3055,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_HELPING_HAND: - if (!IsBattlerAlive(battlerAtkPartner) || !HasDamagingMove(battlerAtkPartner)) + if (!hasPartner || !HasDamagingMove(battlerAtkPartner)) ADJUST_SCORE(-20); break; case EFFECT_PERISH_SONG: @@ -3076,7 +3091,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. // This unsets Trick Room and resets it with a full timer. case EFFECT_TRICK_ROOM: - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, MOVE_TRICK_ROOM) && RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE)) @@ -3702,9 +3717,8 @@ static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 mov u32 partnerBattler = BATTLE_PARTNER(battlerAtk); u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex, AI_ATTACKING); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); - return (IsDoubleBattle() + return (HasPartnerIgnoreFlags(battlerAtk) && noOfHitsToFaintPartner != 0 // Immunity check - && IsBattlerAlive(partnerBattler) && GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && !(noOfHitsToFaintPartner < friendlyFireThreshold && hitsToFaintOpposingBattler == 1) && noOfHitsToFaintPartner < (friendlyFireThreshold * 2)); @@ -3906,7 +3920,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); u32 predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); - bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); + bool32 isBattle1v1 = IsBattle1v1(); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); + bool32 hasPartner = HasPartner(battlerAtk); + bool32 moveTargetsBothOpponents = hasTwoOpponents && (gMovesInfo[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); u32 i; // The AI should understand that while Dynamaxed, status moves function like Protect. @@ -4083,7 +4100,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) break; - score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; case EFFECT_ROAR: if ((IsSoundMove(move) && aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) @@ -4091,7 +4108,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; case EFFECT_MULTI_HIT: case EFFECT_TRIPLE_KICK: @@ -4228,7 +4245,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: case EFFECT_CHILLY_RECEPTION: - if (!IsDoubleBattle()) + if (!hasPartner) { switch (ShouldPivot(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, movesetIndex)) { @@ -4346,7 +4363,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } - else if (isDoubleBattle && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) + else if (hasPartner && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) { if (aiData->abilities[battlerAtk] != ABILITY_TELEPATHY) ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); @@ -4516,7 +4533,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); break; case EFFECT_SEMI_INVULNERABLE: - if (predictedMove != MOVE_NONE && !isDoubleBattle) + if (predictedMove != MOVE_NONE && isBattle1v1) { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) @@ -4565,11 +4582,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_FURY_CUTTER: - if (!isDoubleBattle && aiData->holdEffects[battlerAtk] == HOLD_EFFECT_METRONOME) + if (isBattle1v1 && aiData->holdEffects[battlerAtk] == HOLD_EFFECT_METRONOME) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_ATTRACT: - if (!isDoubleBattle + if (isBattle1v1 && (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) && BattlerWillFaintFromSecondaryDamage(battlerDef, aiData->abilities[battlerDef])) break; // Don't use if the attract won't have a change to activate @@ -4594,7 +4611,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } else if (!AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) || CountUsablePartyMons(battlerDef) == 0) //Don't blow away hazards if you set them up { - if (isDoubleBattle) + if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move, predictedMove, CONSIDER_PRIORITY)) // Partner going first @@ -4606,11 +4623,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_TORMENT: break; case EFFECT_FOLLOW_ME: - if (isDoubleBattle + if (hasPartner && GetMoveTarget(move) == MOVE_TARGET_USER && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) - && (!IsPowderMove(move) || IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) // Rage Powder doesn't affect powder immunities - && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + && (!IsPowderMove(move) || IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef]))) + // Rage Powder doesn't affect powder immunities { u32 predictedMoveOnPartner = gLastMoves[BATTLE_PARTNER(battlerAtk)]; if (predictedMoveOnPartner != MOVE_NONE && !IsBattleMoveStatus(predictedMoveOnPartner)) @@ -4684,7 +4701,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case HOLD_EFFECT_EJECT_BUTTON: //if (!IsRaidBattle() && GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX && gNewBS->dynamaxData.timer[battlerDef] > 1 && if (HasDamagingMove(battlerAtk) - || (isDoubleBattle && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && HasDamagingMove(BATTLE_PARTNER(battlerAtk)))) + || (hasPartner && HasDamagingMove(BATTLE_PARTNER(battlerAtk)))) ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn break; default: @@ -5013,7 +5030,7 @@ case EFFECT_GUARD_SPLIT: } break; case EFFECT_PLEDGE: - if (isDoubleBattle && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) + if (hasPartner && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: @@ -5030,7 +5047,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(WEAK_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_NONE && aiData->holdEffects[battlerDef] != HOLD_EFFECT_NONE) ADJUST_SCORE(WEAK_EFFECT); - if (isDoubleBattle && aiData->holdEffects[BATTLE_PARTNER(battlerAtk)] == HOLD_EFFECT_NONE && aiData->holdEffects[BATTLE_PARTNER(battlerDef)] != HOLD_EFFECT_NONE) + if (!isBattle1v1 && aiData->holdEffects[BATTLE_PARTNER(battlerAtk)] == HOLD_EFFECT_NONE && aiData->holdEffects[BATTLE_PARTNER(battlerDef)] != HOLD_EFFECT_NONE) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_WONDER_ROOM: @@ -5125,7 +5142,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_QUASH: - if (isDoubleBattle && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) + if (hasPartner && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) ADJUST_SCORE(DECENT_EFFECT); // Attacker partner wouldn't go before target break; case EFFECT_TAILWIND: @@ -5133,7 +5150,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_LUCKY_CHANT: - if (!isDoubleBattle && CountUsablePartyMons(battlerDef) > 0) + if (isBattle1v1 && CountUsablePartyMons(battlerDef) > 0) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGNET_RISE: @@ -5431,7 +5448,7 @@ case EFFECT_GUARD_SPLIT: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; case MOVE_EFFECT_CLEAR_SMOG: - score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; case MOVE_EFFECT_BUG_BITE: // And pluck if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) @@ -5710,6 +5727,31 @@ static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } +// Adds score bonus to targeting "partner" +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +{ + if (battlerDef == BATTLE_PARTNER(battlerAtk) + // natural enemies in wild battles try to kill each other + && ((IsNaturalEnemy(gBattleMons[battlerAtk].species, gBattleMons[battlerDef].species) && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) + || AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER)) + { + u32 movesetIndex = gAiThinkingStruct->movesetIndex; + + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING)) + ADJUST_SCORE(BEST_EFFECT); + + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + + if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && + (GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) + ADJUST_SCORE(BEST_EFFECT); + + if (hitsToKO > 0) + ADJUST_SCORE(DECENT_EFFECT); + } + return score; +} + // Prefers moves that are good for baton pass static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a15fafc897..a3598e6800 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1337,7 +1337,7 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) enum BattleMoveEffects effect = GetMoveEffect(move); if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT) return FALSE; - if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && IsValidDoubleBattle(battlerTarget))) + if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && !HasTwoOpponents(battler))) return FALSE; if (gAiLogicData->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; @@ -1947,7 +1947,7 @@ s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) } else { - if (IsDoubleBattle()) + if (!IsBattle1v1()) score -= (2 * min(uses, 3)); else score -= (min(uses, 3)); @@ -2225,7 +2225,7 @@ bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) { if (HasMoveWithEffect(battler, effect)) return TRUE; - if (IsDoubleBattle() && HasMoveWithEffect(BATTLE_OPPOSITE(battler), effect)) + if (HasPartnerIgnoreFlags(battler) && HasMoveWithEffect(BATTLE_PARTNER(battler), effect)) return TRUE; return FALSE; } @@ -2240,7 +2240,7 @@ bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) { if (GetMoveEffect(gBattleHistory->usedMoves[battler][i]) == effect) return TRUE; - if (IsDoubleBattle() && GetMoveEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i]) == effect) + if (HasPartnerIgnoreFlags(battler) && GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) == effect) return TRUE; } return FALSE; @@ -2295,7 +2295,7 @@ bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) { if (HasMoveWithAdditionalEffect(battler, moveEffect)) return TRUE; - if (IsDoubleBattle() && HasMoveWithAdditionalEffect(BATTLE_OPPOSITE(battler), moveEffect)) + if (HasPartnerIgnoreFlags(battler) && HasMoveWithAdditionalEffect(BATTLE_PARTNER(battler), moveEffect)) return TRUE; return FALSE; } @@ -2310,7 +2310,7 @@ bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect) { if (MoveHasAdditionalEffect(gBattleHistory->usedMoves[battler][i], moveEffect)) return TRUE; - if (IsDoubleBattle() && MoveHasAdditionalEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i], moveEffect)) + if (HasPartnerIgnoreFlags(battler) && MoveHasAdditionalEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i], moveEffect)) return TRUE; } return FALSE; @@ -3073,7 +3073,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (PartyBattlerShouldAvoidHazards(battlerAtk, battlerToSwitch)) return DONT_PIVOT; - if (!IsDoubleBattle()) + if (IsBattle1v1()) { if (CountUsablePartyMons(battlerAtk) == 0) return CAN_TRY_PIVOT; // can't switch, but attack might still be useful @@ -3543,7 +3543,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) party = GetBattlerParty(battlerId); - if (IsDoubleBattle()) + if (HasPartner(battlerId)) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; @@ -3595,7 +3595,7 @@ u32 GetBattlerSideSpeedAverage(u32 battler) numBattlersAlive++; } - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) { speed2 = gAiLogicData->speedStats[BATTLE_PARTNER(battler)]; numBattlersAlive++; @@ -3709,17 +3709,48 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo } // Partner Logic -bool32 IsValidDoubleBattle(u32 battlerAtk) +bool32 IsBattle1v1() { if (IsDoubleBattle() - && ((IsBattlerAlive(BATTLE_OPPOSITE(battlerAtk)) && IsBattlerAlive(BATTLE_PARTNER(BATTLE_OPPOSITE(battlerAtk)))) || IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))) + && ((IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) + || (IsBattlerAlive(B_POSITION_OPPONENT_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_RIGHT)))) + return FALSE; + return TRUE; +} + +bool32 HasTwoOpponents(u32 battler) +{ + if (IsDoubleBattle() + && IsBattlerAlive(FOE(battler)) && IsBattlerAlive(BATTLE_PARTNER(FOE(battler)))) return TRUE; return FALSE; } -// TODO: Handling for when the 'partner' is not actually a partner, a la Battle Royale or B_WILD_NATURAL_ENEMIES +bool32 HasPartner(u32 battler) +{ + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ATTACKS_PARTNER) + return FALSE; + else + return TRUE; + } + return FALSE; +} + +bool32 HasPartnerIgnoreFlags(u32 battler) +{ + if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + { + return TRUE; + } + return FALSE; +} + bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef) { + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_ATTACKS_PARTNER) + return FALSE; return ((battlerAtk) == (battlerDef ^ BIT_FLANK)); } @@ -3738,7 +3769,7 @@ u32 GetAllyChosenMove(u32 battlerId) //PARTNER_MOVE_EFFECT_IS_SAME bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (GetMoveEffect(move) == GetMoveEffect(partnerMove) @@ -3753,7 +3784,7 @@ bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 //PARTNER_MOVE_EFFECT_IS_SAME_NO_TARGET bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (GetMoveEffect(move) == GetMoveEffect(partnerMove) @@ -3765,7 +3796,7 @@ bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u3 //PARTNER_MOVE_EFFECT_IS_STATUS_SAME_TARGET bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); @@ -3799,7 +3830,7 @@ bool32 IsMoveEffectWeather(u32 move) //PARTNER_MOVE_EFFECT_IS_TERRAIN bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); @@ -3816,7 +3847,7 @@ bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove) //PARTNER_MOVE_EFFECT_IS bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (partnerMove != MOVE_NONE && GetMoveEffect(partnerMove) == effectCheck) @@ -3828,7 +3859,7 @@ bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMo //PARTNER_MOVE_IS_TAILWIND_TRICKROOM bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (partnerMove != MOVE_NONE && partnerMove == moveCheck) @@ -3839,7 +3870,7 @@ bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) //PARTNER_MOVE_IS_SAME bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (partnerMove != MOVE_NONE && move == partnerMove && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) @@ -3850,7 +3881,7 @@ bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 mo //PARTNER_MOVE_IS_SAME_NO_TARGET bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) { - if (!IsDoubleBattle()) + if (!HasPartner(battlerAtkPartner)) return FALSE; if (partnerMove != MOVE_NONE && move == partnerMove) return TRUE; @@ -3859,7 +3890,7 @@ bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMov bool32 PartnerMoveActivatesSleepClause(u32 partnerMove) { - if (!IsDoubleBattle() || !IsSleepClauseEnabled()) + if (IsBattle1v1() || !IsSleepClauseEnabled()) return FALSE; return IsMoveSleepClauseTrigger(partnerMove); } @@ -3894,7 +3925,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) } } - if (!IsDoubleBattle()) + if (IsBattle1v1()) { switch (GetMoveEffect(move)) { @@ -4086,7 +4117,7 @@ bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category) bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category) { - if (IsDoubleBattle()) + if (HasPartnerIgnoreFlags(battlerId)) { if (HasMoveWithCategory(battlerId, category) || HasMoveWithCategory(BATTLE_PARTNER(battlerId), category)) return TRUE; @@ -4612,7 +4643,7 @@ void DecideTerastal(u32 battler) return; // TODO: Currently only single battles are considered. - if (IsDoubleBattle()) + if (!IsBattle1v1()) return; // TODO: A lot of these checks are most effective for an omnicient ai. @@ -5030,7 +5061,7 @@ bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiDat { if (aiData->abilities[battler] == ability) return TRUE; - if (IsDoubleBattle() && gAiLogicData->abilities[BATTLE_PARTNER(battler)] == ability) + if (HasPartnerIgnoreFlags(battler) && gAiLogicData->abilities[BATTLE_PARTNER(battler)] == ability) return TRUE; return FALSE; } @@ -5041,6 +5072,8 @@ u32 GetFriendlyFireKOThreshold(u32 battler) return FRIENDLY_FIRE_RISKY_THRESHOLD; if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CONSERVATIVE) return FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD; + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ATTACKS_PARTNER) + return 0; return FRIENDLY_FIRE_NORMAL_THRESHOLD; } @@ -5192,7 +5225,7 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct if (hasSameAbility || gAbilitiesInfo[atkAbility].cantBeSuppressed || gAbilitiesInfo[defAbility].cantBeCopied) return FALSE; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + if (HasPartnerIgnoreFlags(battlerAtk)) { u32 partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; if (gAbilitiesInfo[partnerAbility].cantBeSuppressed) @@ -5293,7 +5326,7 @@ void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, bool32 attackerHasBadAbility = (gAbilitiesInfo[abilityAtk].aiRating < 0); s32 currentAbilityScore, transferredAbilityScore = 0; - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + if (HasPartner(battlerAtk)) { partnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; if (!(gAbilitiesInfo[partnerAbility].cantBeSuppressed) && (gAbilitiesInfo[partnerAbility].aiRating < 0)) @@ -5387,7 +5420,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData case ABILITY_FRIEND_GUARD: case ABILITY_POWER_SPOT: case ABILITY_VICTORY_STAR: - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler)) && aiData->abilities[BATTLE_PARTNER(battler)] != ability) + if (HasPartner(battler) && aiData->abilities[BATTLE_PARTNER(battler)] != ability) return BEST_EFFECT; break; case ABILITY_GUTS: @@ -5414,7 +5447,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData } else { - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(FOE(battler)))) + if (HasTwoOpponents(battler)) { abilityDef = aiData->abilities[BATTLE_PARTNER(FOE(battler))]; if (DoesIntimidateRaiseStats(abilityDef)) @@ -5457,7 +5490,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData case ABILITY_SWORD_OF_RUIN: case ABILITY_TABLETS_OF_RUIN: case ABILITY_VESSEL_OF_RUIN: - if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (HasPartner(battler)) { if (aiData->abilities[BATTLE_PARTNER(battler)] != ability) return GOOD_EFFECT; @@ -5480,3 +5513,28 @@ u32 GetThinkingBattler(u32 battler) return gAiLogicData->battlerDoingPrediction; return battler; } + +bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget) +{ + if (B_WILD_NATURAL_ENEMIES != TRUE) + return FALSE; + + switch (speciesAttacker) + { + case SPECIES_ZANGOOSE: + return (speciesTarget == SPECIES_SEVIPER); + case SPECIES_SEVIPER: + return (speciesTarget == SPECIES_ZANGOOSE); + case SPECIES_HEATMOR: + return (speciesTarget == SPECIES_DURANT); + case SPECIES_DURANT: + return (speciesTarget == SPECIES_HEATMOR); + case SPECIES_SABLEYE: + return (speciesTarget == SPECIES_CARBINK); + case SPECIES_MAREANIE: + return (speciesTarget == SPECIES_CORSOLA); + default: + return FALSE; + } + return FALSE; +} diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index c907309280..84b3d3c0a8 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -473,31 +473,15 @@ static void OpponentHandleChooseMove(u32 battler) target = GetBattlerAtPosition(Random() & 2); } while (!CanTargetBattler(battler, target, move)); - // Don't bother to loop through table if the move can't attack ally + // Don't bother to check if they're enemies if the move can't attack ally if (B_WILD_NATURAL_ENEMIES == TRUE && !(GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_BOTH)) { - u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE; - static const u16 naturalEnemies[][2] = - { - // Attacker Target - {SPECIES_ZANGOOSE, SPECIES_SEVIPER}, - {SPECIES_SEVIPER, SPECIES_ZANGOOSE}, - {SPECIES_HEATMOR, SPECIES_DURANT}, - {SPECIES_DURANT, SPECIES_HEATMOR}, - {SPECIES_SABLEYE, SPECIES_CARBINK}, - {SPECIES_MAREANIE, SPECIES_CORSOLA}, - }; + u32 speciesAttacker, speciesTarget; speciesAttacker = gBattleMons[battler].species; speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(battler))].species; - for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++) - { - if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1]) - { - isPartnerEnemy = TRUE; - break; - } - } + bool32 isPartnerEnemy = IsNaturalEnemy(speciesAttacker, speciesTarget); + if (isPartnerEnemy && CanTargetBattler(battler, target, move)) BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(BATTLE_PARTNER(battler)) << 8)); else diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 60dce82801..5589f7bb0e 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -510,7 +510,7 @@ AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally") PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TORNADUS) { Item(ITEM_SAFETY_GOGGLES); Ability(ABILITY_PRANKSTER); Moves(goodWeather, badWeather, MOVE_RETURN, MOVE_TAUNT); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherTrigger, MOVE_EARTH_POWER); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); Moves(weatherTrigger, MOVE_EARTH_POWER); } } WHEN { TURN { EXPECT_MOVE(opponentLeft, goodWeather); } } diff --git a/test/battle/ai/ai_flag_attacks_partner.c b/test/battle/ai/ai_flag_attacks_partner.c new file mode 100644 index 0000000000..4f2533fa5b --- /dev/null +++ b/test/battle/ai/ai_flag_attacks_partner.c @@ -0,0 +1,78 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER is willing to kill either the partner or the player") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + + u32 move, level; + + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 1; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 1; } + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 100; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 100; } + PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 50; } + PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 50; } + + GIVEN { + ASSUME(GetMovePower(MOVE_OVERDRIVE) == 80); + ASSUME(GetMovePower(MOVE_BRUTAL_SWING) == 60); + ASSUME(GetMovePower(MOVE_MIGHTY_CLEAVE) == 95); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseAttack == gSpeciesInfo[SPECIES_ZIGZAGOON].baseSpAttack); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseDefense == gSpeciesInfo[SPECIES_ZIGZAGOON].baseSpDefense); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseHP == 38); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseAttack == 30); + ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseDefense == 41); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); + PLAYER(SPECIES_ZIGZAGOON) { Level(50); } + PLAYER(SPECIES_ZIGZAGOON) { Level(16); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(50); Moves(move, MOVE_OVERDRIVE, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(level); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN + { + if (move == MOVE_MIGHTY_CLEAVE) + { + if (level == 1) + EXPECT_MOVE(opponentLeft, move, target: opponentRight); + else + EXPECT_MOVE(opponentLeft, move, target: playerRight); + } + else + { + if (level == 1 || AI_FLAG_ATTACKS_PARTNER_FOCUSES_PARTNER) + EXPECT_MOVE(opponentLeft, move); + else + EXPECT_MOVE(opponentLeft, MOVE_OVERDRIVE); + } + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER steps on its ally's weather") +{ + u32 weather1, move1, weather2, move2; + + PARAMETRIZE { weather1 = MOVE_SUNNY_DAY; move1 = MOVE_SOLAR_BEAM; weather2 = MOVE_RAIN_DANCE; move2 = MOVE_THUNDER; } + PARAMETRIZE { weather1 = MOVE_RAIN_DANCE; move1 = MOVE_THUNDER; weather2 = MOVE_SUNNY_DAY; move2 = MOVE_SOLAR_BEAM; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(75); Moves(weather1, move1, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(weather2, move2, MOVE_HEADBUTT); } + } WHEN { + TURN + { + EXPECT_MOVE(opponentLeft, weather1); + EXPECT_MOVE(opponentRight, weather2); + } + TURN + { + EXPECT_MOVE(opponentLeft, move1); + EXPECT_MOVE(opponentRight, weather2); + } + } +} From 3f9359765c56f7ebace7f6688f1f00cb36024107 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:20:03 -0400 Subject: [PATCH 186/248] Fix doubles switch AI to use new type matchup system (#7495) --- src/battle_ai_switch_items.c | 21 +++------------------ test/battle/ai/ai_switching.c | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index fe3bb5a5ed..d6ac5d025e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1444,33 +1444,18 @@ static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 battler, u32 opposingBattler) { int i, bits = 0; - while (bits != 0x3F) // All mons were checked. { - uq4_12_t bestResist = UQ_4_12(1.0); + u32 bestResist = UQ_4_12(2.0); int bestMonId = PARTY_SIZE; // Find the mon whose type is the most suitable defensively. for (i = firstId; i < lastId; i++) { if (!((1u << i) & invalidMons) && !((1u << i) & bits)) { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - uq4_12_t typeEffectiveness = UQ_4_12(1.0); + InitializeSwitchinCandidate(&party[i]); - u8 atkType1 = gBattleMons[opposingBattler].types[0]; - u8 atkType2 = gBattleMons[opposingBattler].types[1]; - u8 defType1 = GetSpeciesType(species, 0); - u8 defType2 = GetSpeciesType(species, 1); - - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType1))); - if (defType2 != defType1) - { - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType2))); - if (atkType2 != atkType1) - typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType2, defType2))); - } + u32 typeEffectiveness = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); if (typeEffectiveness < bestResist) { bestResist = typeEffectiveness; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 45b50b7638..a858c33ded 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1316,6 +1316,21 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immu } } +AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup (Doubles)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_CERULEDGE) { Moves(MOVE_SPARK); } + OPPONENT(SPECIES_WHIMSICOTT) { Moves(MOVE_MEGA_DRAIN); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_KARATE_CHOP, target:opponentLeft); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(opponentLeft, 3); } + } +} + AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out due to bad odds if it can OHKO with a priority move") { PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_HASBADODDS); From 13a8f655b5e382211be682f127981700556a0b69 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:29:37 -0400 Subject: [PATCH 187/248] Fix Bad Odds not seeing damage properly (#7492) --- src/battle_ai_switch_items.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index d6ac5d025e..3180550e59 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -207,7 +207,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) //Variable initialization u8 opposingPosition; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0, maxDamageTakenPriority = 0; - u32 aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; + u32 aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, bestPlayerMove = MOVE_NONE, expectedMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u32 typeMatchup; enum BattleMoveEffects aiMoveEffect; @@ -236,6 +236,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) { maxDamageTaken = damageTaken; + bestPlayerMove = playerMove; } if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[battler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) { @@ -247,6 +248,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); hitsToKoAIPriority = GetNoOfHitsToKOBattlerDmg(maxDamageTakenPriority, battler); + expectedMove = gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE ? GetIncomingMove(battler, opposingBattler, gAiLogicData) : bestPlayerMove; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -279,10 +281,12 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Get maximum damage mon can deal damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData); + if (damageDealt > maxDamageDealt) + maxDamageDealt = damageDealt; if (!canBattlerWin1v1 ) // Once we can win a 1v1 we don't need to track this, but want to run the rest of the function to keep the runtime the same regardless of when we find the winning move { hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); - isBattlerFirst = AI_IsFaster(battler, opposingBattler, aiMove, GetIncomingMove(battler, opposingBattler, gAiLogicData), CONSIDER_PRIORITY); + isBattlerFirst = AI_IsFaster(battler, opposingBattler, aiMove, expectedMove, CONSIDER_PRIORITY); isBattlerFirstPriority = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); canBattlerWin1v1 = CanBattlerWin1v1(hitsToKoAI, hitsToKoPlayer, isBattlerFirst) && CanBattlerWin1v1(hitsToKoAIPriority, hitsToKoPlayer, isBattlerFirstPriority); } @@ -310,11 +314,8 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Start assessing whether or not mon has bad odds // Jump straight to switching out in cases where mon gets OHKO'd - if (((getsOneShot && gBattleMons[opposingBattler].speed > gBattleMons[battler].speed) // If the player OHKOs and outspeeds OR OHKOs, doesn't outspeed but isn't 2HKO'd - || (getsOneShot && gBattleMons[opposingBattler].speed <= gBattleMons[battler].speed && maxDamageDealt < gBattleMons[opposingBattler].hp / 2)) - && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator - || (aiAbility == ABILITY_REGENERATOR - && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) + if ((getsOneShot && !canBattlerWin1v1) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator + || (aiAbility == ABILITY_REGENERATOR && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !gAiLogicData->aiPredictionInProgress) From e778d3cdfee6329b2a3551b5256cc0f213c83bee Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 6 Aug 2025 17:39:43 -0400 Subject: [PATCH 188/248] Improved Guaranteed Flinch logic (fake out et al) (#7501) --- include/battle_ai_util.h | 3 +- src/battle_ai_main.c | 16 +++++++++-- src/battle_ai_util.c | 57 +++++++++++++++++++++++++++++++------ test/battle/ai/ai_doubles.c | 13 +++++++++ 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 22efc06d0e..52b5764b00 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -197,7 +197,8 @@ bool32 IsHealingMove(u32 move); bool32 HasHealingEffect(u32 battler); bool32 IsTrappingMove(u32 move); bool32 HasTrappingMoveEffect(u32 battler); -bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 HasChoiceEffect(u32 battler); bool32 HasThawingMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c6d488211a..2fbe68f0ee 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1138,6 +1138,12 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)) abilityDef = ABILITY_NONE; + // If a pokemon can be guaranteed flinched, don't target the pokemon that can't be flinched. + if (hasTwoOpponents + && !IsFlinchGuaranteed(battlerAtk, battlerDef, move) && IsFlinchGuaranteed(battlerAtk, BATTLE_PARTNER(battlerDef), move) + && aiData->effectiveness[battlerAtk][BATTLE_PARTNER(battlerDef)][gAiThinkingStruct->movesetIndex] != UQ_4_12(0.0)) + ADJUST_SCORE(-5); + // check non-user target if (!(moveTarget & MOVE_TARGET_USER)) { @@ -1999,6 +2005,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FIRST_TURN_ONLY: if (!gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(-10); + if (HasChoiceEffect(battlerAtk)) + ADJUST_SCORE(-5); break; case EFFECT_STOCKPILE: if (gDisableStructs[battlerAtk].stockpileCounter >= 3) @@ -3946,6 +3954,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(-20); // Force switch if all your attacking moves are physical and you have Natural Cure. } + // check guaranteed flinch, a la Fake Out + if (IsFlinchGuaranteed(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + // Non-volatile statuses switch(GetMoveNonVolatileStatus(move)) { @@ -4551,9 +4563,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; case EFFECT_FIRST_TURN_ONLY: - if (ShouldFakeOut(battlerAtk, battlerDef, move) && MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) - ADJUST_SCORE(GOOD_EFFECT); - else if (gDisableStructs[battlerAtk].isFirstTurn && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + if (gDisableStructs[battlerAtk].isFirstTurn && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_STOCKPILE: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a3598e6800..0f6fc16fb7 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3502,18 +3502,57 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; } -bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move) { - if ((!gDisableStructs[battlerAtk].isFirstTurn && MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) - || gAiLogicData->abilities[battlerAtk] == ABILITY_GORILLA_TACTICS - || gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_CHOICE_BAND - || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK - || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || (!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) - && (gAiLogicData->abilities[battlerDef] == ABILITY_SHIELD_DUST || gAiLogicData->abilities[battlerDef] == ABILITY_INNER_FOCUS))) + if (!MoveHasAdditionalEffect(move, MOVE_EFFECT_FLINCH)) return FALSE; - return TRUE; + if (AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) + return FALSE; + + u32 i; + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + // check move additional effects that are likely to happen + for (i = 0; i < additionalEffectCount; i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + // Only consider effects with a guaranteed chance to happen + if (!MoveEffectIsGuaranteed(battlerAtk, gAiLogicData->abilities[battlerAtk], additionalEffect)) + continue; + + if (additionalEffect->moveEffect == MOVE_EFFECT_FLINCH) + { + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) + || (!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) + && (gAiLogicData->abilities[battlerDef] == ABILITY_SHIELD_DUST || gAiLogicData->abilities[battlerDef] == ABILITY_INNER_FOCUS))) + return FALSE; + else + return TRUE; + } + } + return FALSE; +} + +bool32 HasChoiceEffect(u32 battler) +{ + u32 ability = gAiLogicData->abilities[battler]; + if (ability == ABILITY_GORILLA_TACTICS) + return TRUE; + + if (ability == ABILITY_KLUTZ) + return FALSE; + + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + switch (holdEffect) + { + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + return TRUE; + default: + return FALSE; + } } static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 5589f7bb0e..e0eac1eeed 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -648,3 +648,16 @@ AI_DOUBLE_BATTLE_TEST("AI uses Power Split to improve its stats") } } +AI_DOUBLE_BATTLE_TEST("AI prefers to Fake Out the opponent vulnerable to flinching.") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } + PLAYER(SPECIES_BRAIXEN) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FAKE_OUT, MOVE_BRANCH_POKE, MOVE_ROCK_SMASH); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FAKE_OUT, target:playerRight); } + } +} From 6158d21448f60a81c3be6475aaadfbf0dd9af85e Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:27:35 -0400 Subject: [PATCH 189/248] Fix GetSwitchinHitsToKO one shot heal calcs (#7502) --- src/battle_ai_switch_items.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 3180550e59..1c436e81cf 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1807,13 +1807,13 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u32 recurringDamage = GetSwitchinRecurringDamage(); u32 recurringHealing = GetSwitchinRecurringHealing(); u32 statusDamage = GetSwitchinStatusDamage(battler); - u32 hitsToKO = 0, singleUseItemHeal = 0; + u32 hitsToKO = 0; u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); u32 opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); - s32 currentHP = startingHP; + s32 currentHP = startingHP, singleUseItemHeal = 0; // No damage being dealt if ((damageTaken + statusDamage + recurringDamage <= recurringHealing) || damageTaken + statusDamage + recurringDamage == 0) @@ -1838,11 +1838,11 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = 1; // If mon is still alive, apply weather impact first, as it might KO the mon before it can heal with its item (order is weather -> item -> status) - if (currentHP != 0) + if (currentHP > 0) currentHP = currentHP - weatherImpact; // Check if we're at a single use healing item threshold - if (gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE + if (currentHP > 0 && gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE && !(opposingAbility == ABILITY_UNNERVE && GetItemPocket(item) == POCKET_BERRIES)) { switch (heldItemEffect) @@ -1885,7 +1885,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Healing from items occurs before status so we can do the rest in one line - if (currentHP >= 0) + if (currentHP > 0) currentHP = currentHP + recurringHealing - recurringDamage - statusDamage; // Recalculate toxic damage if needed @@ -1900,7 +1900,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Disguise will always add an extra hit to KO - if (opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) + if (!opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) hitsToKO++; // If mon had a hypothetical status from TSpikes, clear it From 6cb18f2048480522d75c657cee36220b976cf185 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 8 Aug 2025 03:53:13 -0400 Subject: [PATCH 190/248] Fiddling with CanLowerStat. (#7510) --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 30 ++++++++-------- src/battle_ai_util.c | 76 +++++++++++++++++++++++----------------- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 52b5764b00..b6b16524af 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -144,7 +144,7 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat); +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat); bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2fbe68f0ee..4b7f8bddd9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1585,40 +1585,40 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // stat lowering effects case EFFECT_ATTACK_DOWN: case EFFECT_ATTACK_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_DEFENSE_DOWN: case EFFECT_DEFENSE_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_DEF)) ADJUST_SCORE(-10); break; case EFFECT_SPEED_DOWN: case EFFECT_SPEED_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_ATTACK_DOWN: case EFFECT_SPECIAL_ATTACK_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-10); break; case EFFECT_SPECIAL_DEFENSE_DOWN: case EFFECT_SPECIAL_DEFENSE_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPDEF)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPDEF)) ADJUST_SCORE(-10); break; case EFFECT_ACCURACY_DOWN: case EFFECT_ACCURACY_DOWN_2: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ACC)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ACC)) ADJUST_SCORE(-10); break; case EFFECT_EVASION_DOWN: case EFFECT_EVASION_DOWN_2: case EFFECT_TICKLE: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); - else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_DEF)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_DEF)) ADJUST_SCORE(-8); break; case EFFECT_VENOM_DRENCH: @@ -1628,18 +1628,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-10); - else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-8); - else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-6); } break; case EFFECT_NOBLE_ROAR: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPATK)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPATK)) ADJUST_SCORE(-10); - else if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-8); break; case EFFECT_CAPTIVATE: @@ -1703,7 +1703,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TOXIC_THREAD: - if (!CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) + if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison //fallthrough case EFFECT_LIGHT_SCREEN: @@ -2112,7 +2112,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (!CanLowerStat(battlerAtk, battlerDef, aiData->abilities[battlerDef], STAT_ATK)) + else if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ATK)) ADJUST_SCORE(-10); break; case EFFECT_COPYCAT: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0f6fc16fb7..229a9a8c68 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1079,7 +1079,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, gAiLogicData, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -1089,7 +1089,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 (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (CanLowerStat(battlerAtk, battlerDef, gAiLogicData, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) return TRUE; break; default: @@ -1967,49 +1967,59 @@ s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) } // stat stages -bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat) { if (gBattleMons[battlerDef].statStages[stat] == MIN_STAT_STAGE) return FALSE; - if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) return FALSE; - switch (abilityDef) - { - case ABILITY_SPEED_BOOST: - if (stat == STAT_SPEED) - return FALSE; - case ABILITY_HYPER_CUTTER: - if (stat == STAT_ATK) - return FALSE; - case ABILITY_BIG_PECKS: - if (stat == STAT_DEF) - return FALSE; - case ABILITY_ILLUMINATE: - if (B_ILLUMINATE_EFFECT < GEN_9) - break; - case ABILITY_KEEN_EYE: - case ABILITY_MINDS_EYE: - if (stat == STAT_ACC) - return FALSE; - case ABILITY_FLOWER_VEIL: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS)) - return FALSE; - break; - case ABILITY_CONTRARY: - case ABILITY_CLEAR_BODY: - case ABILITY_WHITE_SMOKE: - case ABILITY_FULL_METAL_BODY: + u32 move = gAiThinkingStruct->moveConsidered; + u32 abilityAtk = aiData->abilities[battlerAtk]; + + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MIST && abilityAtk != ABILITY_INFILTRATOR) return FALSE; + + if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move)) + { + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) && AI_IsAbilityOnSide(battlerDef, ABILITY_FLOWER_VEIL)) + return FALSE; + + switch (aiData->abilities[battlerDef]) + { + case ABILITY_SPEED_BOOST: + if (stat == STAT_SPEED) + return FALSE; + case ABILITY_HYPER_CUTTER: + if (stat == STAT_ATK) + return FALSE; + case ABILITY_BIG_PECKS: + if (stat == STAT_DEF) + return FALSE; + case ABILITY_ILLUMINATE: + if (B_ILLUMINATE_EFFECT < GEN_9) + break; + case ABILITY_KEEN_EYE: + case ABILITY_MINDS_EYE: + if (stat == STAT_ACC) + return FALSE; + case ABILITY_CONTRARY: + case ABILITY_CLEAR_BODY: + case ABILITY_WHITE_SMOKE: + case ABILITY_FULL_METAL_BODY: + return FALSE; + default: + break; + } } if (stat == STAT_SPEED) { // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY) + return !(AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY) && CountUsablePartyMons(battlerAtk) == 0 - && !HasMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); + && !HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } return TRUE; @@ -2027,7 +2037,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) if (GetBattlerSecondaryDamage(battlerDef) >= gBattleMons[battlerDef].hp) return NO_INCREASE; - // Don't decrese stat if opposing battler has Encore + // Don't decrease stat if opposing battler has Encore if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; From 070a4f1dfada102c2389cd02bf5d170672ee9be3 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 8 Aug 2025 03:54:30 -0400 Subject: [PATCH 191/248] Improved hazards logic and Mycelium Might ignores ability checks (#7509) --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 18 +++++------------- src/battle_ai_util.c | 41 ++++++++++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index b6b16524af..62cba4949e 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -289,7 +289,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority ConsiderPriority); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData); u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 4b7f8bddd9..528bcbd859 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4416,11 +4416,13 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); } break; + case EFFECT_CEASELESS_EDGE: case EFFECT_SPIKES: case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: + case EFFECT_STONE_AXE: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)) + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)) { if (gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); @@ -5319,16 +5321,6 @@ case EFFECT_GUARD_SPLIT: break; } break; - case EFFECT_STONE_AXE: - case EFFECT_CEASELESS_EDGE: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); - { - if (gDisableStructs[battlerAtk].isFirstTurn) - ADJUST_SCORE(BEST_EFFECT); - else - ADJUST_SCORE(DECENT_EFFECT); - } - break; default: break; } // move effect checks @@ -5473,7 +5465,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case MOVE_EFFECT_STEALTH_ROCK: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData)); + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)); { if (gDisableStructs[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); @@ -6062,7 +6054,7 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, gAiLogicData)) + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, gAiLogicData)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_GRASSY_TERRAIN: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 229a9a8c68..8e6f0d79a2 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1639,6 +1639,9 @@ bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept + if (atkAbility == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(move)) + return TRUE; + if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) return TRUE; @@ -1750,10 +1753,12 @@ bool32 IsHazardMove(u32 move) u32 i, moveEffect = GetMoveEffect(move); switch (moveEffect) { + case EFFECT_CEASELESS_EDGE: case EFFECT_SPIKES: - case EFFECT_TOXIC_SPIKES: - case EFFECT_STICKY_WEB: case EFFECT_STEALTH_ROCK: + case EFFECT_STICKY_WEB: + case EFFECT_STONE_AXE: + case EFFECT_TOXIC_SPIKES: return TRUE; } @@ -1763,6 +1768,7 @@ bool32 IsHazardMove(u32 move) const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); switch (additionalEffect->moveEffect) { + case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_STEELSURGE: return TRUE; default: @@ -4967,17 +4973,32 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) } //TODO - track entire opponent party data to determine hazard effectiveness -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { - if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE - || CountUsablePartyMons(battlerDef) == 0 - || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasMoveWithEffect(battlerDef, EFFECT_TIDY_UP) - || HasMoveWithEffect(battlerDef, EFFECT_DEFOG) - || HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG) - || HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) + if (CountUsablePartyMons(battlerDef) == 0 + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_COURT_CHANGE) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_DEFOG) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_TIDY_UP) + || HasBattlerSideMoveWithEffect(battlerDef, MOVE_EFFECT_DEFOG)) return FALSE; + if (IsBattleMoveStatus(move)) + { + if (HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) + return FALSE; + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) + return TRUE; + if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE) + return FALSE; + } + else + { + if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) + return TRUE; + if (aiData->abilities[battlerDef] == ABILITY_SHIELD_DUST) + return FALSE; + } return TRUE; } From 38eb3461b941b5f4fe1fc4ba3f631880b954a985 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 8 Aug 2025 19:51:16 +0100 Subject: [PATCH 192/248] Changed item name/pluralName to a compound string (#7359) --- include/item.h | 5 +- include/metaprogram.h | 6 + src/data/items.h | 2066 +++++++++++++++++++++-------------------- src/item.c | 6 +- 4 files changed, 1050 insertions(+), 1033 deletions(-) diff --git a/include/item.h b/include/item.h index 9cecce661a..1f3b1fab1b 100644 --- a/include/item.h +++ b/include/item.h @@ -93,8 +93,8 @@ struct Item ItemUseFunc fieldUseFunc; const u8 *description; const u8 *effect; - u8 name[ITEM_NAME_LENGTH]; - u8 pluralName[ITEM_NAME_PLURAL_LENGTH]; + const u8 *name; + const u8 *pluralName; u8 holdEffect; u8 holdEffectParam; u8 importance:2; @@ -121,6 +121,7 @@ struct TmHmIndexKey u16 moveId; }; +extern const u8 gQuestionMarksItemName[]; extern const struct Item gItemsInfo[]; extern struct BagPocket gBagPockets[]; extern const struct TmHmIndexKey gTMHMItemMoveIds[]; diff --git a/include/metaprogram.h b/include/metaprogram.h index 542d62f9dd..1bf77265ff 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -32,6 +32,12 @@ /* Converts a string to a compound literal, essentially making it a pointer to const u8 */ #define COMPOUND_STRING(str) (const u8[]) _(str) +#define COMPOUND_STRING_SIZE_LIMIT(str, limit) (const u8[COMPOUND_STRING_CHECK_SIZE(str, limit)]) _(str) + +/* Used for COMPOUND_STRING_SIZE_LIMIT. Stupid, but makes sure we only get + * one error message regardless of how many characters over the limit we are. + * Otherwise, GCC gives an error for each and every character (which is annoying). */ +#define COMPOUND_STRING_CHECK_SIZE(str, limit) (sizeof(COMPOUND_STRING(str)) > limit ? sizeof(COMPOUND_STRING(str)) - 1 : sizeof(COMPOUND_STRING(str))) /* Expands to the first/second/third/fourth argument. */ #define FIRST(a, ...) a diff --git a/src/data/items.h b/src/data/items.h index 69806c26da..d86a610eb4 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -14,6 +14,9 @@ #define TREASURE_FACTOR ((I_SELL_VALUE_FRACTION >= GEN_9) ? 2 : 1) +#define ITEM_NAME(str) COMPOUND_STRING_SIZE_LIMIT(str, ITEM_NAME_LENGTH) +#define ITEM_PLURAL_NAME(str) COMPOUND_STRING_SIZE_LIMIT(str, ITEM_NAME_PLURAL_LENGTH) + // Shared Item Description entries static const u8 sFullHealDesc[] = _("Heals all the\n" @@ -124,6 +127,8 @@ static const u8 sFigyBerryDesc[] = _("A hold item that\n" "restores HP but\n" "may confuse."); +const u8 gQuestionMarksItemName[] = _("????????"); + static const u8 sQuestionMarksDesc[] = _("?????"); static const u8 sKeyToRoomDesc[] = _("A key that opens a\n" @@ -142,7 +147,7 @@ const struct Item gItemsInfo[] = { [ITEM_NONE] = { - .name = _("????????"), + .name = gQuestionMarksItemName, .price = 0, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -157,7 +162,7 @@ const struct Item gItemsInfo[] = [ITEM_STRANGE_BALL] = { - .name = _("Strange Ball"), + .name = ITEM_NAME("Strange Ball"), .price = 0, .description = COMPOUND_STRING( "An unusual Ball\n" @@ -173,7 +178,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_BALL] = { - .name = _("Poké Ball"), + .name = ITEM_NAME("Poké Ball"), .price = 200, .description = COMPOUND_STRING( "A tool used for\n" @@ -189,7 +194,7 @@ const struct Item gItemsInfo[] = [ITEM_GREAT_BALL] = { - .name = _("Great Ball"), + .name = ITEM_NAME("Great Ball"), .price = 600, .description = COMPOUND_STRING( "A good Ball with a\n" @@ -205,7 +210,7 @@ const struct Item gItemsInfo[] = [ITEM_ULTRA_BALL] = { - .name = _("Ultra Ball"), + .name = ITEM_NAME("Ultra Ball"), .price = (I_PRICE >= GEN_7) ? 800 : 1200, .description = COMPOUND_STRING( "A better Ball with\n" @@ -221,7 +226,7 @@ const struct Item gItemsInfo[] = [ITEM_MASTER_BALL] = { - .name = _("Master Ball"), + .name = ITEM_NAME("Master Ball"), .price = 0, .description = COMPOUND_STRING( "The best Ball that\n" @@ -237,7 +242,7 @@ const struct Item gItemsInfo[] = [ITEM_PREMIER_BALL] = { - .name = _("Premier Ball"), + .name = ITEM_NAME("Premier Ball"), .price = (I_PRICE >= GEN_7) ? 20 : 200, .description = COMPOUND_STRING( "A rare Ball made\n" @@ -253,7 +258,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAL_BALL] = { - .name = _("Heal Ball"), + .name = ITEM_NAME("Heal Ball"), .price = 300, .description = COMPOUND_STRING( "A remedial Ball\n" @@ -269,7 +274,7 @@ const struct Item gItemsInfo[] = [ITEM_NET_BALL] = { - .name = _("Net Ball"), + .name = ITEM_NAME("Net Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -285,7 +290,7 @@ const struct Item gItemsInfo[] = [ITEM_NEST_BALL] = { - .name = _("Nest Ball"), + .name = ITEM_NAME("Nest Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -301,7 +306,7 @@ const struct Item gItemsInfo[] = [ITEM_DIVE_BALL] = { - .name = _("Dive Ball"), + .name = ITEM_NAME("Dive Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -317,7 +322,7 @@ const struct Item gItemsInfo[] = [ITEM_DUSK_BALL] = { - .name = _("Dusk Ball"), + .name = ITEM_NAME("Dusk Ball"), .price = 1000, .description = COMPOUND_STRING( "Works well if\n" @@ -333,7 +338,7 @@ const struct Item gItemsInfo[] = [ITEM_TIMER_BALL] = { - .name = _("Timer Ball"), + .name = ITEM_NAME("Timer Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that gains\n" @@ -349,7 +354,7 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_BALL] = { - .name = _("Quick Ball"), + .name = ITEM_NAME("Quick Ball"), .price = 1000, .description = COMPOUND_STRING( "Works well if\n" @@ -365,7 +370,7 @@ const struct Item gItemsInfo[] = [ITEM_REPEAT_BALL] = { - .name = _("Repeat Ball"), + .name = ITEM_NAME("Repeat Ball"), .price = 1000, .description = COMPOUND_STRING( "A Ball that works\n" @@ -381,7 +386,7 @@ const struct Item gItemsInfo[] = [ITEM_LUXURY_BALL] = { - .name = _("Luxury Ball"), + .name = ITEM_NAME("Luxury Ball"), .price = (I_PRICE >= GEN_8) ? 3000 : 1000, .description = COMPOUND_STRING( "A cozy Ball that\n" @@ -397,7 +402,7 @@ const struct Item gItemsInfo[] = [ITEM_LEVEL_BALL] = { - .name = _("Level Ball"), + .name = ITEM_NAME("Level Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -413,7 +418,7 @@ const struct Item gItemsInfo[] = [ITEM_LURE_BALL] = { - .name = _("Lure Ball"), + .name = ITEM_NAME("Lure Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -429,7 +434,7 @@ const struct Item gItemsInfo[] = [ITEM_MOON_BALL] = { - .name = _("Moon Ball"), + .name = ITEM_NAME("Moon Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that works\n" @@ -445,7 +450,7 @@ const struct Item gItemsInfo[] = [ITEM_FRIEND_BALL] = { - .name = _("Friend Ball"), + .name = ITEM_NAME("Friend Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "A Ball that makes\n" @@ -461,7 +466,7 @@ const struct Item gItemsInfo[] = [ITEM_LOVE_BALL] = { - .name = _("Love Ball"), + .name = ITEM_NAME("Love Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -477,7 +482,7 @@ const struct Item gItemsInfo[] = [ITEM_FAST_BALL] = { - .name = _("Fast Ball"), + .name = ITEM_NAME("Fast Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -493,7 +498,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAVY_BALL] = { - .name = _("Heavy Ball"), + .name = ITEM_NAME("Heavy Ball"), .price = (I_PRICE >= GEN_7) ? 0 : 300, .description = COMPOUND_STRING( "Works well on\n" @@ -509,7 +514,7 @@ const struct Item gItemsInfo[] = [ITEM_DREAM_BALL] = { - .name = _("Dream Ball"), + .name = ITEM_NAME("Dream Ball"), .price = 0, .description = COMPOUND_STRING( #if B_DREAM_BALL_MODIFIER >= GEN_8 @@ -530,7 +535,7 @@ const struct Item gItemsInfo[] = [ITEM_SAFARI_BALL] = { - .name = _("Safari Ball"), + .name = ITEM_NAME("Safari Ball"), .price = 0, .description = COMPOUND_STRING( "A special Ball that\n" @@ -546,7 +551,7 @@ const struct Item gItemsInfo[] = [ITEM_SPORT_BALL] = { - .name = _("Sport Ball"), + .name = ITEM_NAME("Sport Ball"), .price = (I_PRICE < GEN_3 || I_PRICE >= GEN_9) ? 0 : 300, .description = COMPOUND_STRING( "A special Ball\n" @@ -562,7 +567,7 @@ const struct Item gItemsInfo[] = [ITEM_PARK_BALL] = { - .name = _("Park Ball"), + .name = ITEM_NAME("Park Ball"), .price = 0, .description = COMPOUND_STRING( "A special Ball for\n" @@ -577,7 +582,7 @@ const struct Item gItemsInfo[] = [ITEM_BEAST_BALL] = { - .name = _("Beast Ball"), + .name = ITEM_NAME("Beast Ball"), .price = 0, .description = COMPOUND_STRING( "A Ball designed to\n" @@ -592,7 +597,7 @@ const struct Item gItemsInfo[] = [ITEM_CHERISH_BALL] = { - .name = _("Cherish Ball"), + .name = ITEM_NAME("Cherish Ball"), .price = 0, .description = COMPOUND_STRING( "A rare Ball made\n" @@ -610,7 +615,7 @@ const struct Item gItemsInfo[] = [ITEM_POTION] = { - .name = _("Potion"), + .name = ITEM_NAME("Potion"), .price = (I_PRICE >= GEN_7) ? 200 : 300, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -630,7 +635,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_POTION] = { - .name = _("Super Potion"), + .name = ITEM_NAME("Super Potion"), .price = 700, .holdEffectParam = 60, .description = COMPOUND_STRING( @@ -654,7 +659,7 @@ const struct Item gItemsInfo[] = [ITEM_HYPER_POTION] = { - .name = _("Hyper Potion"), + .name = ITEM_NAME("Hyper Potion"), .price = (I_PRICE >= GEN_2 && I_PRICE <= GEN_6) ? 1200 : 1500, .holdEffectParam = 120, .description = COMPOUND_STRING( @@ -678,7 +683,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_POTION] = { - .name = _("Max Potion"), + .name = ITEM_NAME("Max Potion"), .price = 2500, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -697,7 +702,7 @@ const struct Item gItemsInfo[] = [ITEM_FULL_RESTORE] = { - .name = _("Full Restore"), + .name = ITEM_NAME("Full Restore"), .price = 3000, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -717,7 +722,7 @@ const struct Item gItemsInfo[] = [ITEM_REVIVE] = { - .name = _("Revive"), + .name = ITEM_NAME("Revive"), .price = (I_PRICE >= GEN_7) ? 2000 : 1500, .description = COMPOUND_STRING( "Revives a fainted\n" @@ -736,7 +741,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_REVIVE] = { - .name = _("Max Revive"), + .name = ITEM_NAME("Max Revive"), .price = 4000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, @@ -752,7 +757,7 @@ const struct Item gItemsInfo[] = [ITEM_FRESH_WATER] = { - .name = _("Fresh Water"), + .name = ITEM_NAME("Fresh Water"), .price = 200, .holdEffectParam = 30, .description = COMPOUND_STRING( @@ -776,7 +781,7 @@ const struct Item gItemsInfo[] = [ITEM_SODA_POP] = { - .name = _("Soda Pop"), + .name = ITEM_NAME("Soda Pop"), .price = 300, .holdEffectParam = 50, .description = COMPOUND_STRING( @@ -800,7 +805,7 @@ const struct Item gItemsInfo[] = [ITEM_LEMONADE] = { - .name = _("Lemonade"), + .name = ITEM_NAME("Lemonade"), .price = (I_PRICE >= GEN_7) ? 400 : 350, .holdEffectParam = 70, #if I_HEALTH_RECOVERY >= GEN_7 @@ -827,8 +832,8 @@ const struct Item gItemsInfo[] = [ITEM_MOOMOO_MILK] = { - .name = _("Moomoo Milk"), - .pluralName = _("Moomoo Milk"), + .name = ITEM_NAME("Moomoo Milk"), + .pluralName = ITEM_PLURAL_NAME("Moomoo Milk"), .price = (I_PRICE >= GEN_7) ? 600 : 500, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -848,8 +853,8 @@ const struct Item gItemsInfo[] = [ITEM_ENERGY_POWDER] = { - .name = _("Energy Powder"), - .pluralName = _("Energy Powder"), + .name = ITEM_NAME("Energy Powder"), + .pluralName = ITEM_PLURAL_NAME("Energy Powder"), .price = 500, .description = COMPOUND_STRING( "A bitter powder\n" @@ -872,7 +877,7 @@ const struct Item gItemsInfo[] = [ITEM_ENERGY_ROOT] = { - .name = _("Energy Root"), + .name = ITEM_NAME("Energy Root"), .price = (I_PRICE >= GEN_7) ? 1200 : 800, .description = COMPOUND_STRING( "A bitter root\n" @@ -895,8 +900,8 @@ const struct Item gItemsInfo[] = [ITEM_HEAL_POWDER] = { - .name = _("Heal Powder"), - .pluralName = _("Heal Powder"), + .name = ITEM_NAME("Heal Powder"), + .pluralName = ITEM_PLURAL_NAME("Heal Powder"), .price = (I_PRICE >= GEN_7) ? 300 : 450, .description = COMPOUND_STRING( "A bitter powder\n" @@ -915,7 +920,7 @@ const struct Item gItemsInfo[] = [ITEM_REVIVAL_HERB] = { - .name = _("Revival Herb"), + .name = ITEM_NAME("Revival Herb"), .price = 2800, .description = COMPOUND_STRING( "A very bitter herb\n" @@ -934,7 +939,7 @@ const struct Item gItemsInfo[] = [ITEM_ANTIDOTE] = { - .name = _("Antidote"), + .name = ITEM_NAME("Antidote"), .price = (I_PRICE >= GEN_7) ? 200 : 100, .description = COMPOUND_STRING( "Heals a poisoned\n" @@ -952,7 +957,7 @@ const struct Item gItemsInfo[] = [ITEM_PARALYZE_HEAL] = { - .name = _("Paralyze Heal"), + .name = ITEM_NAME("Paralyze Heal"), .price = (I_PRICE == GEN_7) ? 300 : 200, .description = COMPOUND_STRING( "Heals a paralyzed\n" @@ -970,7 +975,7 @@ const struct Item gItemsInfo[] = [ITEM_BURN_HEAL] = { - .name = _("Burn Heal"), + .name = ITEM_NAME("Burn Heal"), .price = (I_PRICE == GEN_7) ? 300 : ((I_PRICE <= GEN_7) ? 250 : 200), .description = COMPOUND_STRING( "Heals Pokémon\n" @@ -988,7 +993,7 @@ const struct Item gItemsInfo[] = [ITEM_ICE_HEAL] = { - .name = _("Ice Heal"), + .name = ITEM_NAME("Ice Heal"), .price = (I_PRICE == GEN_7) ? 100 : ((I_PRICE <= GEN_7) ? 250 : 200), .description = COMPOUND_STRING( "Defrosts a frozen\n" @@ -1006,7 +1011,7 @@ const struct Item gItemsInfo[] = [ITEM_AWAKENING] = { - .name = _("Awakening"), + .name = ITEM_NAME("Awakening"), .price = (I_PRICE >= GEN_2 && I_PRICE <= GEN_6) ? 250 : ((I_PRICE == GEN_7) ? 100 : 200), .description = COMPOUND_STRING( "Awakens a sleeping\n" @@ -1024,7 +1029,7 @@ const struct Item gItemsInfo[] = [ITEM_FULL_HEAL] = { - .name = _("Full Heal"), + .name = ITEM_NAME("Full Heal"), .price = (I_PRICE >= GEN_7) ? 400 : 600, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1040,7 +1045,7 @@ const struct Item gItemsInfo[] = [ITEM_ETHER] = { - .name = _("Ether"), + .name = ITEM_NAME("Ether"), .price = (I_PRICE >= GEN_2) ? 1200 : 1, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -1060,7 +1065,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_ETHER] = { - .name = _("Max Ether"), + .name = ITEM_NAME("Max Ether"), .price = (I_PRICE >= GEN_2) ? 2000 : 1, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -1080,7 +1085,7 @@ const struct Item gItemsInfo[] = [ITEM_ELIXIR] = { - .name = _("Elixir"), + .name = ITEM_NAME("Elixir"), .price = (I_PRICE >= GEN_2) ? 3000 : 1, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -1099,7 +1104,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_ELIXIR] = { - .name = _("Max Elixir"), + .name = ITEM_NAME("Max Elixir"), .price = (I_PRICE >= GEN_2) ? 4500 : 1, .holdEffectParam = 255, .description = COMPOUND_STRING( @@ -1119,8 +1124,8 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_JUICE] = { - .name = _("Berry Juice"), - .pluralName = _("Berry Juice"), + .name = ITEM_NAME("Berry Juice"), + .pluralName = ITEM_PLURAL_NAME("Berry Juice"), .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_HP, .holdEffectParam = 20, @@ -1141,8 +1146,8 @@ const struct Item gItemsInfo[] = [ITEM_SACRED_ASH] = { - .name = _("Sacred Ash"), - .pluralName = _("Sacred Ashes"), + .name = ITEM_NAME("Sacred Ash"), + .pluralName = ITEM_PLURAL_NAME("Sacred Ashes"), .price = (I_PRICE >= GEN_7) ? 50000 : 200, .description = COMPOUND_STRING( "Fully revives and\n" @@ -1160,7 +1165,7 @@ const struct Item gItemsInfo[] = [ITEM_SWEET_HEART] = { - .name = _("Sweet Heart"), + .name = ITEM_NAME("Sweet Heart"), .price = (I_PRICE >= GEN_7) ? 3000 : 100, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -1180,8 +1185,8 @@ const struct Item gItemsInfo[] = [ITEM_MAX_HONEY] = { - .name = _("Max Honey"), - .pluralName = _("Max Honey"), + .name = ITEM_NAME("Max Honey"), + .pluralName = ITEM_PLURAL_NAME("Max Honey"), .price = 8000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, @@ -1199,8 +1204,8 @@ const struct Item gItemsInfo[] = [ITEM_PEWTER_CRUNCHIES] = { - .name = _("Pewter Crunchies"), - .pluralName = _("Pewter Crunchies"), + .name = ITEM_NAME("Pewter Crunchies"), + .pluralName = ITEM_PLURAL_NAME("Pewter Crunchies"), .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1216,7 +1221,7 @@ const struct Item gItemsInfo[] = [ITEM_RAGE_CANDY_BAR] = { - .name = _("Rage Candy Bar"), + .name = ITEM_NAME("Rage Candy Bar"), .price = (I_PRICE >= GEN_7) ? 350 : 300, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1232,7 +1237,7 @@ const struct Item gItemsInfo[] = [ITEM_LAVA_COOKIE] = { - .name = _("Lava Cookie"), + .name = ITEM_NAME("Lava Cookie"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = COMPOUND_STRING( "A local specialty\n" @@ -1251,8 +1256,8 @@ const struct Item gItemsInfo[] = [ITEM_OLD_GATEAU] = { - .name = _("Old Gateau"), - .pluralName = _("Old Gateaux"), + .name = ITEM_NAME("Old Gateau"), + .pluralName = ITEM_PLURAL_NAME("Old Gateaux"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1268,7 +1273,7 @@ const struct Item gItemsInfo[] = [ITEM_CASTELIACONE] = { - .name = _("Casteliacone"), + .name = ITEM_NAME("Casteliacone"), .price = (I_PRICE >= GEN_7) ? 350 : 100, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1284,7 +1289,7 @@ const struct Item gItemsInfo[] = [ITEM_LUMIOSE_GALETTE] = { - .name = _("Lumiose Galette"), + .name = ITEM_NAME("Lumiose Galette"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1300,7 +1305,7 @@ const struct Item gItemsInfo[] = [ITEM_SHALOUR_SABLE] = { - .name = _("Shalour Sable"), + .name = ITEM_NAME("Shalour Sable"), .price = (I_PRICE >= GEN_7) ? 350 : 200, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1316,7 +1321,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_MALASADA] = { - .name = _("Big Malasada"), + .name = ITEM_NAME("Big Malasada"), .price = 350, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -1334,7 +1339,7 @@ const struct Item gItemsInfo[] = [ITEM_HP_UP] = { - .name = _("HP Up"), + .name = ITEM_NAME("HP Up"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base HP\n" @@ -1351,7 +1356,7 @@ const struct Item gItemsInfo[] = [ITEM_PROTEIN] = { - .name = _("Protein"), + .name = ITEM_NAME("Protein"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" @@ -1369,7 +1374,7 @@ const struct Item gItemsInfo[] = [ITEM_IRON] = { - .name = _("Iron"), + .name = ITEM_NAME("Iron"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" @@ -1387,7 +1392,7 @@ const struct Item gItemsInfo[] = [ITEM_CALCIUM] = { - .name = _("Calcium"), + .name = ITEM_NAME("Calcium"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" @@ -1405,7 +1410,7 @@ const struct Item gItemsInfo[] = [ITEM_ZINC] = { - .name = _("Zinc"), + .name = ITEM_NAME("Zinc"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" @@ -1423,8 +1428,8 @@ const struct Item gItemsInfo[] = [ITEM_CARBOS] = { - .name = _("Carbos"), - .pluralName = _("Carbos"), + .name = ITEM_NAME("Carbos"), + .pluralName = ITEM_PLURAL_NAME("Carbos"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the base\n" @@ -1442,7 +1447,7 @@ const struct Item gItemsInfo[] = [ITEM_PP_UP] = { - .name = _("PP Up"), + .name = ITEM_NAME("PP Up"), .price = (I_PRICE == GEN_1) ? 1 : ((I_PRICE >= GEN_7) ? 10000 : 9800), .description = COMPOUND_STRING( "Raises the maximum\n" @@ -1460,8 +1465,8 @@ const struct Item gItemsInfo[] = [ITEM_PP_MAX] = { - .name = _("PP Max"), - .pluralName = _("PP Maxes"), + .name = ITEM_NAME("PP Max"), + .pluralName = ITEM_PLURAL_NAME("PP Maxes"), .price = (I_PRICE >= GEN_7) ? 10000 : 9800, .description = COMPOUND_STRING( "Raises the PP of a\n" @@ -1481,7 +1486,7 @@ const struct Item gItemsInfo[] = [ITEM_HEALTH_FEATHER] = { - .name = _("Health Feather"), + .name = ITEM_NAME("Health Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, @@ -1496,7 +1501,7 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_FEATHER] = { - .name = _("Muscle Feather"), + .name = ITEM_NAME("Muscle Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, @@ -1511,7 +1516,7 @@ const struct Item gItemsInfo[] = [ITEM_RESIST_FEATHER] = { - .name = _("Resist Feather"), + .name = ITEM_NAME("Resist Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, @@ -1526,7 +1531,7 @@ const struct Item gItemsInfo[] = [ITEM_GENIUS_FEATHER] = { - .name = _("Genius Feather"), + .name = ITEM_NAME("Genius Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, @@ -1541,7 +1546,7 @@ const struct Item gItemsInfo[] = [ITEM_CLEVER_FEATHER] = { - .name = _("Clever Feather"), + .name = ITEM_NAME("Clever Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, @@ -1556,7 +1561,7 @@ const struct Item gItemsInfo[] = [ITEM_SWIFT_FEATHER] = { - .name = _("Swift Feather"), + .name = ITEM_NAME("Swift Feather"), .price = (I_PRICE >= GEN_7) ? 300 : 3000, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, @@ -1573,7 +1578,7 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_CAPSULE] = { - .name = _("Ability Capsule"), + .name = ITEM_NAME("Ability Capsule"), .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE < GEN_9) ? 10000 : 100000), .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -1589,8 +1594,8 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_PATCH] = { - .name = _("Ability Patch"), - .pluralName = _("Ability Patches"), + .name = ITEM_NAME("Ability Patch"), + .pluralName = ITEM_PLURAL_NAME("Ability Patches"), .price = (I_PRICE >= GEN_9) ? 250000 : 20, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -1609,7 +1614,7 @@ const struct Item gItemsInfo[] = [ITEM_LONELY_MINT] = { - .name = _("Lonely Mint"), + .name = ITEM_NAME("Lonely Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1627,7 +1632,7 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_MINT] = { - .name = _("Adamant Mint"), + .name = ITEM_NAME("Adamant Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1645,7 +1650,7 @@ const struct Item gItemsInfo[] = [ITEM_NAUGHTY_MINT] = { - .name = _("Naughty Mint"), + .name = ITEM_NAME("Naughty Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1663,7 +1668,7 @@ const struct Item gItemsInfo[] = [ITEM_BRAVE_MINT] = { - .name = _("Brave Mint"), + .name = ITEM_NAME("Brave Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1681,7 +1686,7 @@ const struct Item gItemsInfo[] = [ITEM_BOLD_MINT] = { - .name = _("Bold Mint"), + .name = ITEM_NAME("Bold Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1699,7 +1704,7 @@ const struct Item gItemsInfo[] = [ITEM_IMPISH_MINT] = { - .name = _("Impish Mint"), + .name = ITEM_NAME("Impish Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1717,7 +1722,7 @@ const struct Item gItemsInfo[] = [ITEM_LAX_MINT] = { - .name = _("Lax Mint"), + .name = ITEM_NAME("Lax Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1735,7 +1740,7 @@ const struct Item gItemsInfo[] = [ITEM_RELAXED_MINT] = { - .name = _("Relaxed Mint"), + .name = ITEM_NAME("Relaxed Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1753,7 +1758,7 @@ const struct Item gItemsInfo[] = [ITEM_MODEST_MINT] = { - .name = _("Modest Mint"), + .name = ITEM_NAME("Modest Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1771,7 +1776,7 @@ const struct Item gItemsInfo[] = [ITEM_MILD_MINT] = { - .name = _("Mild Mint"), + .name = ITEM_NAME("Mild Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1789,7 +1794,7 @@ const struct Item gItemsInfo[] = [ITEM_RASH_MINT] = { - .name = _("Rash Mint"), + .name = ITEM_NAME("Rash Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1807,7 +1812,7 @@ const struct Item gItemsInfo[] = [ITEM_QUIET_MINT] = { - .name = _("Quiet Mint"), + .name = ITEM_NAME("Quiet Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1825,7 +1830,7 @@ const struct Item gItemsInfo[] = [ITEM_CALM_MINT] = { - .name = _("Calm Mint"), + .name = ITEM_NAME("Calm Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1843,7 +1848,7 @@ const struct Item gItemsInfo[] = [ITEM_GENTLE_MINT] = { - .name = _("Gentle Mint"), + .name = ITEM_NAME("Gentle Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1861,7 +1866,7 @@ const struct Item gItemsInfo[] = [ITEM_CAREFUL_MINT] = { - .name = _("Careful Mint"), + .name = ITEM_NAME("Careful Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1879,7 +1884,7 @@ const struct Item gItemsInfo[] = [ITEM_SASSY_MINT] = { - .name = _("Sassy Mint"), + .name = ITEM_NAME("Sassy Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1897,7 +1902,7 @@ const struct Item gItemsInfo[] = [ITEM_TIMID_MINT] = { - .name = _("Timid Mint"), + .name = ITEM_NAME("Timid Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1915,7 +1920,7 @@ const struct Item gItemsInfo[] = [ITEM_HASTY_MINT] = { - .name = _("Hasty Mint"), + .name = ITEM_NAME("Hasty Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1933,7 +1938,7 @@ const struct Item gItemsInfo[] = [ITEM_JOLLY_MINT] = { - .name = _("Jolly Mint"), + .name = ITEM_NAME("Jolly Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1951,7 +1956,7 @@ const struct Item gItemsInfo[] = [ITEM_NAIVE_MINT] = { - .name = _("Naive Mint"), + .name = ITEM_NAME("Naive Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1969,7 +1974,7 @@ const struct Item gItemsInfo[] = [ITEM_SERIOUS_MINT] = { - .name = _("Serious Mint"), + .name = ITEM_NAME("Serious Mint"), .price = (I_PRICE >= GEN_9) ? 20000 : 20, .description = COMPOUND_STRING( "Can be smelled. It\n" @@ -1989,8 +1994,8 @@ const struct Item gItemsInfo[] = [ITEM_RARE_CANDY] = { - .name = _("Rare Candy"), - .pluralName = _("Rare Candies"), + .name = ITEM_NAME("Rare Candy"), + .pluralName = ITEM_PLURAL_NAME("Rare Candies"), .price = (I_PRICE >= GEN_7) ? 10000 : 4800, .description = COMPOUND_STRING( "Raises the level\n" @@ -2008,8 +2013,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_XS] = { - .name = _("Exp. Candy XS"), - .pluralName = _("Exp. Candies XS"), + .name = ITEM_NAME("Exp. Candy XS"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies XS"), .price = 20, .holdEffectParam = EXP_100, .description = COMPOUND_STRING( @@ -2028,8 +2033,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_S] = { - .name = _("Exp. Candy S"), - .pluralName = _("Exp. Candies S"), + .name = ITEM_NAME("Exp. Candy S"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies S"), .price = 240, .holdEffectParam = EXP_800, .description = COMPOUND_STRING( @@ -2048,8 +2053,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_M] = { - .name = _("Exp. Candy M"), - .pluralName = _("Exp. Candies M"), + .name = ITEM_NAME("Exp. Candy M"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies M"), .price = 1000, .holdEffectParam = EXP_3000, .description = COMPOUND_STRING( @@ -2068,8 +2073,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_L] = { - .name = _("Exp. Candy L"), - .pluralName = _("Exp. Candies L"), + .name = ITEM_NAME("Exp. Candy L"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies L"), .price = 3000, .holdEffectParam = EXP_10000, .description = COMPOUND_STRING( @@ -2088,8 +2093,8 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CANDY_XL] = { - .name = _("Exp. Candy XL"), - .pluralName = _("Exp. Candies XL"), + .name = ITEM_NAME("Exp. Candy XL"), + .pluralName = ITEM_PLURAL_NAME("Exp. Candies XL"), .price = 10000, .holdEffectParam = EXP_30000, .description = COMPOUND_STRING( @@ -2108,8 +2113,8 @@ const struct Item gItemsInfo[] = [ITEM_DYNAMAX_CANDY] = { - .name = _("Dynamax Candy"), - .pluralName = _("Dynamax Candies"), + .name = ITEM_NAME("Dynamax Candy"), + .pluralName = ITEM_PLURAL_NAME("Dynamax Candies"), .price = 0, .description = COMPOUND_STRING( "Raises the Dynamax\n" @@ -2128,7 +2133,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_FLUTE] = { - .name = _("Blue Flute"), + .name = ITEM_NAME("Blue Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 100, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2148,7 +2153,7 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_FLUTE] = { - .name = _("Yellow Flute"), + .name = ITEM_NAME("Yellow Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 300, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2168,7 +2173,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_FLUTE] = { - .name = _("Red Flute"), + .name = ITEM_NAME("Red Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 200, .description = COMPOUND_STRING( "A glass flute that\n" @@ -2190,7 +2195,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_FLUTE] = { - .name = _("Black Flute"), + .name = ITEM_NAME("Black Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 400, .holdEffectParam = 50, .description = COMPOUND_STRING( @@ -2209,7 +2214,7 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_FLUTE] = { - .name = _("White Flute"), + .name = ITEM_NAME("White Flute"), .price = (I_PRICE >= GEN_7) ? 20 : 500, .holdEffectParam = 150, .description = COMPOUND_STRING( @@ -2229,7 +2234,7 @@ const struct Item gItemsInfo[] = [ITEM_REPEL] = { - .name = _("Repel"), + .name = ITEM_NAME("Repel"), .price = (I_PRICE >= GEN_7) ? 400 : 350, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -2247,7 +2252,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_REPEL] = { - .name = _("Super Repel"), + .name = ITEM_NAME("Super Repel"), .price = (I_PRICE >= GEN_7) ? 700 : 500, .holdEffectParam = 200, .description = COMPOUND_STRING( @@ -2265,7 +2270,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_REPEL] = { - .name = _("Max Repel"), + .name = ITEM_NAME("Max Repel"), .price = (I_PRICE >= GEN_7) ? 900 : 700, .holdEffectParam = 250, .description = COMPOUND_STRING( @@ -2283,7 +2288,7 @@ const struct Item gItemsInfo[] = [ITEM_LURE] = { - .name = _("Lure"), + .name = ITEM_NAME("Lure"), .price = 400, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -2302,7 +2307,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_LURE] = { - .name = _("Super Lure"), + .name = ITEM_NAME("Super Lure"), .price = 700, .holdEffectParam = 200, .description = COMPOUND_STRING( @@ -2321,7 +2326,7 @@ const struct Item gItemsInfo[] = [ITEM_MAX_LURE] = { - .name = _("Max Lure"), + .name = ITEM_NAME("Max Lure"), .price = 900, .holdEffectParam = 250, .description = COMPOUND_STRING( @@ -2340,7 +2345,7 @@ const struct Item gItemsInfo[] = [ITEM_ESCAPE_ROPE] = { - .name = _("Escape Rope"), + .name = ITEM_NAME("Escape Rope"), .description = COMPOUND_STRING( "Use to escape\n" "instantly from a\n" @@ -2365,7 +2370,7 @@ const struct Item gItemsInfo[] = [ITEM_X_ATTACK] = { - .name = _("X Attack"), + .name = ITEM_NAME("X Attack"), .price = (I_PRICE >= GEN_7) ? 1000 : 500, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2391,7 +2396,7 @@ const struct Item gItemsInfo[] = [ITEM_X_DEFENSE] = { - .name = _("X Defense"), + .name = ITEM_NAME("X Defense"), .price = (I_PRICE >= GEN_7) ? 2000 : 550, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2417,7 +2422,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SP_ATK] = { - .name = _("X Sp. Atk"), + .name = ITEM_NAME("X Sp. Atk"), .price = (I_PRICE >= GEN_7) ? 1000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2443,7 +2448,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SP_DEF] = { - .name = _("X Sp. Def"), + .name = ITEM_NAME("X Sp. Def"), .price = (I_PRICE >= GEN_7) ? 2000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2469,7 +2474,7 @@ const struct Item gItemsInfo[] = [ITEM_X_SPEED] = { - .name = _("X Speed"), + .name = ITEM_NAME("X Speed"), .price = (I_PRICE >= GEN_7) ? 1000 : 350, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2495,8 +2500,8 @@ const struct Item gItemsInfo[] = [ITEM_X_ACCURACY] = { - .name = _("X Accuracy"), - .pluralName = _("X Accuracies"), + .name = ITEM_NAME("X Accuracy"), + .pluralName = ITEM_PLURAL_NAME("X Accuracies"), .price = (I_PRICE >= GEN_7) ? 1000 : 950, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -2522,7 +2527,7 @@ const struct Item gItemsInfo[] = [ITEM_DIRE_HIT] = { - .name = _("Dire Hit"), + .name = ITEM_NAME("Dire Hit"), .price = (I_PRICE >= GEN_7) ? 1000 : 650, .description = COMPOUND_STRING( "Raises the\n" @@ -2541,8 +2546,8 @@ const struct Item gItemsInfo[] = [ITEM_GUARD_SPEC] = { - .name = _("Guard Spec."), - .pluralName = _("Guard Specs."), + .name = ITEM_NAME("Guard Spec."), + .pluralName = ITEM_PLURAL_NAME("Guard Specs."), .price = (I_PRICE >= GEN_7) ? 1500 : 700, .description = COMPOUND_STRING( "Prevents stat\n" @@ -2561,7 +2566,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_DOLL] = { - .name = _("Poké Doll"), + .name = ITEM_NAME("Poké Doll"), .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE == GEN_7) ? 100 : 300), .description = sPokeDollDesc, .pocket = POCKET_ITEMS, @@ -2576,7 +2581,7 @@ const struct Item gItemsInfo[] = [ITEM_FLUFFY_TAIL] = { - .name = _("Fluffy Tail"), + .name = ITEM_NAME("Fluffy Tail"), .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, @@ -2591,7 +2596,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_TOY] = { - .name = _("Poké Toy"), + .name = ITEM_NAME("Poké Toy"), .price = (I_PRICE >= GEN_7) ? 100 : 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, @@ -2606,8 +2611,8 @@ const struct Item gItemsInfo[] = [ITEM_MAX_MUSHROOMS] = { - .name = _("Max Mushrooms"), - .pluralName = _("Max Mushrooms"), + .name = ITEM_NAME("Max Mushrooms"), + .pluralName = ITEM_PLURAL_NAME("Max Mushrooms"), .price = 8000, .description = COMPOUND_STRING( "Raises every stat\n" @@ -2627,7 +2632,7 @@ const struct Item gItemsInfo[] = [ITEM_BOTTLE_CAP] = { - .name = _("Bottle Cap"), + .name = ITEM_NAME("Bottle Cap"), .price = (I_PRICE >= GEN_9) ? 20000 : 5000, .description = COMPOUND_STRING( "A beautiful bottle\n" @@ -2644,7 +2649,7 @@ const struct Item gItemsInfo[] = [ITEM_GOLD_BOTTLE_CAP] = { - .name = _("Gold Bottle Cap"), + .name = ITEM_NAME("Gold Bottle Cap"), .price = (I_PRICE >= GEN_9) ? 60000 : 10000, .description = COMPOUND_STRING( "A beautiful bottle\n" @@ -2661,7 +2666,7 @@ const struct Item gItemsInfo[] = [ITEM_NUGGET] = { - .name = _("Nugget"), + .name = ITEM_NAME("Nugget"), .price = 10000 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A nugget of pure\n" @@ -2678,7 +2683,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_NUGGET] = { - .name = _("Big Nugget"), + .name = ITEM_NAME("Big Nugget"), .price = (I_PRICE >= GEN_7) ? (40000 * TREASURE_FACTOR) : 20000, .description = COMPOUND_STRING( "A big nugget made\n" @@ -2695,7 +2700,7 @@ const struct Item gItemsInfo[] = [ITEM_TINY_MUSHROOM] = { - .name = _("Tiny Mushroom"), + .name = ITEM_NAME("Tiny Mushroom"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A plain mushroom\n" @@ -2712,7 +2717,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_MUSHROOM] = { - .name = _("Big Mushroom"), + .name = ITEM_NAME("Big Mushroom"), .price = 5000 * TREASURE_FACTOR, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, @@ -2726,7 +2731,7 @@ const struct Item gItemsInfo[] = [ITEM_BALM_MUSHROOM] = { - .name = _("Balm Mushroom"), + .name = ITEM_NAME("Balm Mushroom"), .price = (I_PRICE >= GEN_7) ? 15000 * TREASURE_FACTOR: 12500, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, @@ -2740,7 +2745,7 @@ const struct Item gItemsInfo[] = [ITEM_PEARL] = { - .name = _("Pearl"), + .name = ITEM_NAME("Pearl"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR: 1400, .description = COMPOUND_STRING( "A pretty pearl\n" @@ -2757,7 +2762,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_PEARL] = { - .name = _("Big Pearl"), + .name = ITEM_NAME("Big Pearl"), .price = (I_PRICE >= GEN_7) ? 8000 * TREASURE_FACTOR: 7500, .description = COMPOUND_STRING( "A lovely large pearl\n" @@ -2774,7 +2779,7 @@ const struct Item gItemsInfo[] = [ITEM_PEARL_STRING] = { - .name = _("Pearl String"), + .name = ITEM_NAME("Pearl String"), .price = (I_PRICE >= GEN_8) ? 15000 * TREASURE_FACTOR: ((I_PRICE == GEN_7) ? 30000 : 15000), .description = COMPOUND_STRING( "Very large pearls\n" @@ -2791,8 +2796,8 @@ const struct Item gItemsInfo[] = [ITEM_STARDUST] = { - .name = _("Stardust"), - .pluralName = _("Stardust"), + .name = ITEM_NAME("Stardust"), + .pluralName = ITEM_PLURAL_NAME("Stardust"), .price = (I_PRICE >= GEN_7) ? 3000 * TREASURE_FACTOR: 2000, .description = COMPOUND_STRING( "Beautiful red sand.\n" @@ -2809,7 +2814,7 @@ const struct Item gItemsInfo[] = [ITEM_STAR_PIECE] = { - .name = _("Star Piece"), + .name = ITEM_NAME("Star Piece"), .price = (I_PRICE >= GEN_7) ? 12000 * TREASURE_FACTOR: 9800, .description = COMPOUND_STRING( "A red gem shard.\n" @@ -2826,7 +2831,7 @@ const struct Item gItemsInfo[] = [ITEM_COMET_SHARD] = { - .name = _("Comet Shard"), + .name = ITEM_NAME("Comet Shard"), .price = (I_PRICE <= GEN_5) ? 0 : ((I_PRICE == GEN_6) ? 30000 : ((I_PRICE == GEN_7) ? 60000 : 25000 * TREASURE_FACTOR)), .description = COMPOUND_STRING( "A comet's shard.\n" @@ -2843,8 +2848,8 @@ const struct Item gItemsInfo[] = [ITEM_SHOAL_SALT] = { - .name = _("Shoal Salt"), - .pluralName = _("Shoal Salt"), + .name = ITEM_NAME("Shoal Salt"), + .pluralName = ITEM_PLURAL_NAME("Shoal Salt"), .price = 20, .description = COMPOUND_STRING( "Salt obtained from\n" @@ -2861,7 +2866,7 @@ const struct Item gItemsInfo[] = [ITEM_SHOAL_SHELL] = { - .name = _("Shoal Shell"), + .name = ITEM_NAME("Shoal Shell"), .price = 20, .description = COMPOUND_STRING( "A seashell found\n" @@ -2878,7 +2883,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_SHARD] = { - .name = _("Red Shard"), + .name = ITEM_NAME("Red Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, @@ -2892,7 +2897,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_SHARD] = { - .name = _("Blue Shard"), + .name = ITEM_NAME("Blue Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, @@ -2906,7 +2911,7 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_SHARD] = { - .name = _("Yellow Shard"), + .name = ITEM_NAME("Yellow Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, @@ -2920,7 +2925,7 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_SHARD] = { - .name = _("Green Shard"), + .name = ITEM_NAME("Green Shard"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .description = sShardsDesc, .pocket = POCKET_ITEMS, @@ -2934,7 +2939,7 @@ const struct Item gItemsInfo[] = [ITEM_HEART_SCALE] = { - .name = _("Heart Scale"), + .name = ITEM_NAME("Heart Scale"), .price = 100, .description = COMPOUND_STRING( "A lovely scale.\n" @@ -2951,8 +2956,8 @@ const struct Item gItemsInfo[] = [ITEM_HONEY] = { - .name = _("Honey"), - .pluralName = _("Honey"), + .name = ITEM_NAME("Honey"), + .pluralName = ITEM_PLURAL_NAME("Honey"), .price = (I_PRICE < GEN_5) ? 100 : ((I_PRICE < GEN_8) ? 300 : 900), .description = COMPOUND_STRING( "Sweet honey that\n" @@ -2969,7 +2974,7 @@ const struct Item gItemsInfo[] = [ITEM_RARE_BONE] = { - .name = _("Rare Bone"), + .name = ITEM_NAME("Rare Bone"), .price = (I_PRICE >= GEN_7) ? 5000 * TREASURE_FACTOR: 10000, .description = COMPOUND_STRING( "A very rare bone.\n" @@ -2986,7 +2991,7 @@ const struct Item gItemsInfo[] = [ITEM_ODD_KEYSTONE] = { - .name = _("Odd Keystone"), + .name = ITEM_NAME("Odd Keystone"), .price = 2100, .description = COMPOUND_STRING( "Voices can be heard\n" @@ -3003,7 +3008,7 @@ const struct Item gItemsInfo[] = [ITEM_PRETTY_FEATHER] = { - .name = _("Pretty Feather"), + .name = ITEM_NAME("Pretty Feather"), .price = (I_PRICE >= GEN_7) ? 1000 * TREASURE_FACTOR: 200, .description = COMPOUND_STRING( "A beautiful yet\n" @@ -3020,7 +3025,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_COPPER] = { - .name = _("Relic Copper"), + .name = ITEM_NAME("Relic Copper"), .price = 0, .description = COMPOUND_STRING( "A copper coin used\n" @@ -3037,7 +3042,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_SILVER] = { - .name = _("Relic Silver"), + .name = ITEM_NAME("Relic Silver"), .price = 0, .description = COMPOUND_STRING( "A silver coin used\n" @@ -3054,7 +3059,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_GOLD] = { - .name = _("Relic Gold"), + .name = ITEM_NAME("Relic Gold"), .price = 0, .description = COMPOUND_STRING( "A gold coin used\n" @@ -3071,7 +3076,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_VASE] = { - .name = _("Relic Vase"), + .name = ITEM_NAME("Relic Vase"), .price = 0, .description = COMPOUND_STRING( "A vase made long\n" @@ -3088,7 +3093,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_BAND] = { - .name = _("Relic Band"), + .name = ITEM_NAME("Relic Band"), .price = 0, .description = COMPOUND_STRING( "An old bracelet.\n" @@ -3105,7 +3110,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_STATUE] = { - .name = _("Relic Statue"), + .name = ITEM_NAME("Relic Statue"), .price = 0, .description = COMPOUND_STRING( "An old statue.\n" @@ -3122,7 +3127,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_CROWN] = { - .name = _("Relic Crown"), + .name = ITEM_NAME("Relic Crown"), .price = 0, .description = COMPOUND_STRING( "An old crown.\n" @@ -3139,7 +3144,7 @@ const struct Item gItemsInfo[] = [ITEM_STRANGE_SOUVENIR] = { - .name = _("Strange Souvenir"), + .name = ITEM_NAME("Strange Souvenir"), .price = (I_PRICE >= GEN_7) ? 3000 : 10, .description = COMPOUND_STRING( "An ornament that\n" @@ -3158,7 +3163,7 @@ const struct Item gItemsInfo[] = [ITEM_HELIX_FOSSIL] = { - .name = _("Helix Fossil"), + .name = ITEM_NAME("Helix Fossil"), .description = COMPOUND_STRING( "A piece of an\n" "ancient marine\n" @@ -3181,7 +3186,7 @@ const struct Item gItemsInfo[] = [ITEM_DOME_FOSSIL] = { - .name = _("Dome Fossil"), + .name = ITEM_NAME("Dome Fossil"), .description = COMPOUND_STRING( "A piece of an\n" "ancient marine\n" @@ -3204,7 +3209,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_AMBER] = { - .name = _("Old Amber"), + .name = ITEM_NAME("Old Amber"), .description = COMPOUND_STRING( "A stone containing\n" "the genes of an\n" @@ -3227,7 +3232,7 @@ const struct Item gItemsInfo[] = [ITEM_ROOT_FOSSIL] = { - .name = _("Root Fossil"), + .name = ITEM_NAME("Root Fossil"), .description = sRootFossilDesc, #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, @@ -3247,7 +3252,7 @@ const struct Item gItemsInfo[] = [ITEM_CLAW_FOSSIL] = { - .name = _("Claw Fossil"), + .name = ITEM_NAME("Claw Fossil"), .description = sRootFossilDesc, #if I_KEY_FOSSILS >= GEN_4 .price = (I_PRICE >= GEN_7) ? 7000: 1000, @@ -3267,7 +3272,7 @@ const struct Item gItemsInfo[] = [ITEM_ARMOR_FOSSIL] = { - .name = _("Armor Fossil"), + .name = ITEM_NAME("Armor Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3284,7 +3289,7 @@ const struct Item gItemsInfo[] = [ITEM_SKULL_FOSSIL] = { - .name = _("Skull Fossil"), + .name = ITEM_NAME("Skull Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3301,7 +3306,7 @@ const struct Item gItemsInfo[] = [ITEM_COVER_FOSSIL] = { - .name = _("Cover Fossil"), + .name = ITEM_NAME("Cover Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3318,7 +3323,7 @@ const struct Item gItemsInfo[] = [ITEM_PLUME_FOSSIL] = { - .name = _("Plume Fossil"), + .name = ITEM_NAME("Plume Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3335,7 +3340,7 @@ const struct Item gItemsInfo[] = [ITEM_JAW_FOSSIL] = { - .name = _("Jaw Fossil"), + .name = ITEM_NAME("Jaw Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3352,7 +3357,7 @@ const struct Item gItemsInfo[] = [ITEM_SAIL_FOSSIL] = { - .name = _("Sail Fossil"), + .name = ITEM_NAME("Sail Fossil"), .price = (I_PRICE >= GEN_7) ? 7000: 1000, .description = COMPOUND_STRING( "A piece of a\n" @@ -3369,7 +3374,7 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_BIRD] = { - .name = _("Fossilized Bird"), + .name = ITEM_NAME("Fossilized Bird"), .price = 5000, .description = COMPOUND_STRING( "A fossil of an\n" @@ -3386,8 +3391,8 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_FISH] = { - .name = _("Fossilized Fish"), - .pluralName = _("Fossilized Fishes"), + .name = ITEM_NAME("Fossilized Fish"), + .pluralName = ITEM_PLURAL_NAME("Fossilized Fishes"), .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, @@ -3401,7 +3406,7 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_DRAKE] = { - .name = _("Fossilized Drake"), + .name = ITEM_NAME("Fossilized Drake"), .price = 5000, .description = COMPOUND_STRING( "A fossil of an\n" @@ -3418,7 +3423,7 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_DINO] = { - .name = _("Fossilized Dino"), + .name = ITEM_NAME("Fossilized Dino"), .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, @@ -3434,8 +3439,8 @@ const struct Item gItemsInfo[] = [ITEM_GROWTH_MULCH] = { - .name = _("Growth Mulch"), - .pluralName = _("Growth Mulch"), + .name = ITEM_NAME("Growth Mulch"), + .pluralName = ITEM_PLURAL_NAME("Growth Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3457,8 +3462,8 @@ const struct Item gItemsInfo[] = [ITEM_DAMP_MULCH] = { - .name = _("Damp Mulch"), - .pluralName = _("Damp Mulch"), + .name = ITEM_NAME("Damp Mulch"), + .pluralName = ITEM_PLURAL_NAME("Damp Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3480,8 +3485,8 @@ const struct Item gItemsInfo[] = [ITEM_STABLE_MULCH] = { - .name = _("Stable Mulch"), - .pluralName = _("Stable Mulch"), + .name = ITEM_NAME("Stable Mulch"), + .pluralName = ITEM_PLURAL_NAME("Stable Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3503,8 +3508,8 @@ const struct Item gItemsInfo[] = [ITEM_GOOEY_MULCH] = { - .name = _("Gooey Mulch"), - .pluralName = _("Gooey Mulch"), + .name = ITEM_NAME("Gooey Mulch"), + .pluralName = ITEM_PLURAL_NAME("Gooey Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3526,8 +3531,8 @@ const struct Item gItemsInfo[] = [ITEM_RICH_MULCH] = { - .name = _("Rich Mulch"), - .pluralName = _("Rich Mulch"), + .name = ITEM_NAME("Rich Mulch"), + .pluralName = ITEM_PLURAL_NAME("Rich Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3549,8 +3554,8 @@ const struct Item gItemsInfo[] = [ITEM_SURPRISE_MULCH] = { - .name = _("Surprise Mulch"), - .pluralName = _("Surprise Mulch"), + .name = ITEM_NAME("Surprise Mulch"), + .pluralName = ITEM_PLURAL_NAME("Surprise Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3572,8 +3577,8 @@ const struct Item gItemsInfo[] = [ITEM_BOOST_MULCH] = { - .name = _("Boost Mulch"), - .pluralName = _("Boost Mulch"), + .name = ITEM_NAME("Boost Mulch"), + .pluralName = ITEM_PLURAL_NAME("Boost Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3595,8 +3600,8 @@ const struct Item gItemsInfo[] = [ITEM_AMAZE_MULCH] = { - .name = _("Amaze Mulch"), - .pluralName = _("Amaze Mulch"), + .name = ITEM_NAME("Amaze Mulch"), + .pluralName = ITEM_PLURAL_NAME("Amaze Mulch"), .price = 200, #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( @@ -3620,7 +3625,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_APRICORN] = { - .name = _("Red Apricorn"), + .name = ITEM_NAME("Red Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A red apricorn.\n" @@ -3636,7 +3641,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_APRICORN] = { - .name = _("Blue Apricorn"), + .name = ITEM_NAME("Blue Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A blue apricorn.\n" @@ -3652,7 +3657,7 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_APRICORN] = { - .name = _("Yellow Apricorn"), + .name = ITEM_NAME("Yellow Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A yellow apricorn.\n" @@ -3668,7 +3673,7 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_APRICORN] = { - .name = _("Green Apricorn"), + .name = ITEM_NAME("Green Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A green apricorn.\n" @@ -3684,7 +3689,7 @@ const struct Item gItemsInfo[] = [ITEM_PINK_APRICORN] = { - .name = _("Pink Apricorn"), + .name = ITEM_NAME("Pink Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A pink apricorn.\n" @@ -3700,7 +3705,7 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_APRICORN] = { - .name = _("White Apricorn"), + .name = ITEM_NAME("White Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A white apricorn.\n" @@ -3716,7 +3721,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_APRICORN] = { - .name = _("Black Apricorn"), + .name = ITEM_NAME("Black Apricorn"), .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), .description = COMPOUND_STRING( "A black apricorn.\n" @@ -3732,7 +3737,7 @@ const struct Item gItemsInfo[] = [ITEM_WISHING_PIECE] = { - .name = _("Wishing Piece"), + .name = ITEM_NAME("Wishing Piece"), .price = 20, .description = COMPOUND_STRING( "Throw into a\n" @@ -3749,7 +3754,7 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_TWIG] = { - .name = _("Galarica Twig"), + .name = ITEM_NAME("Galarica Twig"), .price = 20 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A twig from a tree\n" @@ -3766,8 +3771,8 @@ const struct Item gItemsInfo[] = [ITEM_ARMORITE_ORE] = { - .name = _("Armorite Ore"), - .pluralName = _("Armorite Ore"), + .name = ITEM_NAME("Armorite Ore"), + .pluralName = ITEM_PLURAL_NAME("Armorite Ore"), .price = 20, .description = COMPOUND_STRING( "A rare ore. Can be\n" @@ -3784,8 +3789,8 @@ const struct Item gItemsInfo[] = [ITEM_DYNITE_ORE] = { - .name = _("Dynite Ore"), - .pluralName = _("Dynite Ore"), + .name = ITEM_NAME("Dynite Ore"), + .pluralName = ITEM_PLURAL_NAME("Dynite Ore"), .price = 20, .description = COMPOUND_STRING( "A mysterious ore.\n" @@ -3804,8 +3809,8 @@ const struct Item gItemsInfo[] = [ITEM_ORANGE_MAIL] = { - .name = _("Orange Mail"), - .pluralName = _("Orange Mail"), + .name = ITEM_NAME("Orange Mail"), + .pluralName = ITEM_PLURAL_NAME("Orange Mail"), .price = 50, .description = COMPOUND_STRING( "A Zigzagoon-print\n" @@ -3822,8 +3827,8 @@ const struct Item gItemsInfo[] = [ITEM_HARBOR_MAIL] = { - .name = _("Harbor Mail"), - .pluralName = _("Harbor Mail"), + .name = ITEM_NAME("Harbor Mail"), + .pluralName = ITEM_PLURAL_NAME("Harbor Mail"), .price = 50, .description = COMPOUND_STRING( "A Wingull-print\n" @@ -3840,8 +3845,8 @@ const struct Item gItemsInfo[] = [ITEM_GLITTER_MAIL] = { - .name = _("Glitter Mail"), - .pluralName = _("Glitter Mail"), + .name = ITEM_NAME("Glitter Mail"), + .pluralName = ITEM_PLURAL_NAME("Glitter Mail"), .price = 50, .description = COMPOUND_STRING( "A Pikachu-print\n" @@ -3858,8 +3863,8 @@ const struct Item gItemsInfo[] = [ITEM_MECH_MAIL] = { - .name = _("Mech Mail"), - .pluralName = _("Mech Mail"), + .name = ITEM_NAME("Mech Mail"), + .pluralName = ITEM_PLURAL_NAME("Mech Mail"), .price = 50, .description = COMPOUND_STRING( "A Magnemite-print\n" @@ -3876,8 +3881,8 @@ const struct Item gItemsInfo[] = [ITEM_WOOD_MAIL] = { - .name = _("Wood Mail"), - .pluralName = _("Wood Mail"), + .name = ITEM_NAME("Wood Mail"), + .pluralName = ITEM_PLURAL_NAME("Wood Mail"), .price = 50, .description = COMPOUND_STRING( "A Slakoth-print\n" @@ -3894,8 +3899,8 @@ const struct Item gItemsInfo[] = [ITEM_WAVE_MAIL] = { - .name = _("Wave Mail"), - .pluralName = _("Wave Mail"), + .name = ITEM_NAME("Wave Mail"), + .pluralName = ITEM_PLURAL_NAME("Wave Mail"), .price = 50, .description = COMPOUND_STRING( "A Wailmer-print\n" @@ -3912,8 +3917,8 @@ const struct Item gItemsInfo[] = [ITEM_BEAD_MAIL] = { - .name = _("Bead Mail"), - .pluralName = _("Bead Mail"), + .name = ITEM_NAME("Bead Mail"), + .pluralName = ITEM_PLURAL_NAME("Bead Mail"), .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, @@ -3927,8 +3932,8 @@ const struct Item gItemsInfo[] = [ITEM_SHADOW_MAIL] = { - .name = _("Shadow Mail"), - .pluralName = _("Shadow Mail"), + .name = ITEM_NAME("Shadow Mail"), + .pluralName = ITEM_PLURAL_NAME("Shadow Mail"), .price = 50, .description = COMPOUND_STRING( "A Duskull-print\n" @@ -3945,8 +3950,8 @@ const struct Item gItemsInfo[] = [ITEM_TROPIC_MAIL] = { - .name = _("Tropic Mail"), - .pluralName = _("Tropic Mail"), + .name = ITEM_NAME("Tropic Mail"), + .pluralName = ITEM_PLURAL_NAME("Tropic Mail"), .price = 50, .description = COMPOUND_STRING( "A Bellossom-print\n" @@ -3963,8 +3968,8 @@ const struct Item gItemsInfo[] = [ITEM_DREAM_MAIL] = { - .name = _("Dream Mail"), - .pluralName = _("Dream Mail"), + .name = ITEM_NAME("Dream Mail"), + .pluralName = ITEM_PLURAL_NAME("Dream Mail"), .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, @@ -3978,8 +3983,8 @@ const struct Item gItemsInfo[] = [ITEM_FAB_MAIL] = { - .name = _("Fab Mail"), - .pluralName = _("Fab Mail"), + .name = ITEM_NAME("Fab Mail"), + .pluralName = ITEM_PLURAL_NAME("Fab Mail"), .price = 50, .description = COMPOUND_STRING( "A gorgeous-print\n" @@ -3996,8 +4001,8 @@ const struct Item gItemsInfo[] = [ITEM_RETRO_MAIL] = { - .name = _("Retro Mail"), - .pluralName = _("Retro Mail"), + .name = ITEM_NAME("Retro Mail"), + .pluralName = ITEM_PLURAL_NAME("Retro Mail"), .price = 50, .description = COMPOUND_STRING( "Mail featuring the\n" @@ -4016,7 +4021,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_STONE] = { - .name = _("Fire Stone"), + .name = ITEM_NAME("Fire Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4031,7 +4036,7 @@ const struct Item gItemsInfo[] = [ITEM_WATER_STONE] = { - .name = _("Water Stone"), + .name = ITEM_NAME("Water Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4046,7 +4051,7 @@ const struct Item gItemsInfo[] = [ITEM_THUNDER_STONE] = { - .name = _("Thunder Stone"), + .name = ITEM_NAME("Thunder Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4061,7 +4066,7 @@ const struct Item gItemsInfo[] = [ITEM_LEAF_STONE] = { - .name = _("Leaf Stone"), + .name = ITEM_NAME("Leaf Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4076,7 +4081,7 @@ const struct Item gItemsInfo[] = [ITEM_ICE_STONE] = { - .name = _("Ice Stone"), + .name = ITEM_NAME("Ice Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4091,7 +4096,7 @@ const struct Item gItemsInfo[] = [ITEM_SUN_STONE] = { - .name = _("Sun Stone"), + .name = ITEM_NAME("Sun Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4106,7 +4111,7 @@ const struct Item gItemsInfo[] = [ITEM_MOON_STONE] = { - .name = _("Moon Stone"), + .name = ITEM_NAME("Moon Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4121,7 +4126,7 @@ const struct Item gItemsInfo[] = [ITEM_SHINY_STONE] = { - .name = _("Shiny Stone"), + .name = ITEM_NAME("Shiny Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4136,7 +4141,7 @@ const struct Item gItemsInfo[] = [ITEM_DUSK_STONE] = { - .name = _("Dusk Stone"), + .name = ITEM_NAME("Dusk Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4151,7 +4156,7 @@ const struct Item gItemsInfo[] = [ITEM_DAWN_STONE] = { - .name = _("Dawn Stone"), + .name = ITEM_NAME("Dawn Stone"), .price = (I_PRICE >= GEN_7) ? 3000 : 2100, .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, @@ -4166,7 +4171,7 @@ const struct Item gItemsInfo[] = [ITEM_SWEET_APPLE] = { - .name = _("Sweet Apple"), + .name = ITEM_NAME("Sweet Apple"), .price = 2200, .description = COMPOUND_STRING( "A very sweet apple\n" @@ -4184,7 +4189,7 @@ const struct Item gItemsInfo[] = [ITEM_TART_APPLE] = { - .name = _("Tart Apple"), + .name = ITEM_NAME("Tart Apple"), .price = 2200, .description = COMPOUND_STRING( "A very tart apple\n" @@ -4202,7 +4207,7 @@ const struct Item gItemsInfo[] = [ITEM_CRACKED_POT] = { - .name = _("Cracked Pot"), + .name = ITEM_NAME("Cracked Pot"), .price = 1600, .description = COMPOUND_STRING( "A cracked teapot\n" @@ -4220,7 +4225,7 @@ const struct Item gItemsInfo[] = [ITEM_CHIPPED_POT] = { - .name = _("Chipped Pot"), + .name = ITEM_NAME("Chipped Pot"), .price = 38000, .description = COMPOUND_STRING( "A chipped teapot\n" @@ -4238,7 +4243,7 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_CUFF] = { - .name = _("Galarica Cuff"), + .name = ITEM_NAME("Galarica Cuff"), .price = (I_PRICE >= GEN_9) ? 3000 : 6000, .description = COMPOUND_STRING( "A cuff from Galar\n" @@ -4256,8 +4261,8 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_WREATH] = { - .name = _("Galarica Wreath"), - .pluralName = _("Galarica Wreathes"), + .name = ITEM_NAME("Galarica Wreath"), + .pluralName = ITEM_PLURAL_NAME("Galarica Wreathes"), .price = (I_PRICE >= GEN_9) ? 3000 : 6000, .description = COMPOUND_STRING( "A wreath made in\n" @@ -4275,7 +4280,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_SCALE] = { - .name = _("Dragon Scale"), + .name = ITEM_NAME("Dragon Scale"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .holdEffect = HOLD_EFFECT_DRAGON_SCALE, .holdEffectParam = 10, @@ -4295,7 +4300,7 @@ const struct Item gItemsInfo[] = [ITEM_UPGRADE] = { - .name = _("Upgrade"), + .name = ITEM_NAME("Upgrade"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .holdEffect = HOLD_EFFECT_UPGRADE, .description = COMPOUND_STRING( @@ -4313,7 +4318,7 @@ const struct Item gItemsInfo[] = [ITEM_PROTECTOR] = { - .name = _("Protector"), + .name = ITEM_NAME("Protector"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" @@ -4331,7 +4336,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTIRIZER] = { - .name = _("Electirizer"), + .name = ITEM_NAME("Electirizer"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" @@ -4349,7 +4354,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGMARIZER] = { - .name = _("Magmarizer"), + .name = ITEM_NAME("Magmarizer"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" @@ -4367,7 +4372,7 @@ const struct Item gItemsInfo[] = [ITEM_DUBIOUS_DISC] = { - .name = _("Dubious Disc"), + .name = ITEM_NAME("Dubious Disc"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A clear device\n" @@ -4385,8 +4390,8 @@ const struct Item gItemsInfo[] = [ITEM_REAPER_CLOTH] = { - .name = _("Reaper Cloth"), - .pluralName = _("Reaper Cloths"), + .name = ITEM_NAME("Reaper Cloth"), + .pluralName = ITEM_PLURAL_NAME("Reaper Cloths"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain\n" @@ -4404,7 +4409,7 @@ const struct Item gItemsInfo[] = [ITEM_PRISM_SCALE] = { - .name = _("Prism Scale"), + .name = ITEM_NAME("Prism Scale"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 500), .description = COMPOUND_STRING( "A mysterious scale\n" @@ -4422,8 +4427,8 @@ const struct Item gItemsInfo[] = [ITEM_WHIPPED_DREAM] = { - .name = _("Whipped Dream"), - .pluralName = _("Whipped Dream"), + .name = ITEM_NAME("Whipped Dream"), + .pluralName = ITEM_PLURAL_NAME("Whipped Dream"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A soft and sweet\n" @@ -4441,7 +4446,7 @@ const struct Item gItemsInfo[] = [ITEM_SACHET] = { - .name = _("Sachet"), + .name = ITEM_NAME("Sachet"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A sachet of strong\n" @@ -4459,7 +4464,7 @@ const struct Item gItemsInfo[] = [ITEM_OVAL_STONE] = { - .name = _("Oval Stone"), + .name = ITEM_NAME("Oval Stone"), .price = (I_PRICE >= GEN_7) ? 2000 : 2100, .description = COMPOUND_STRING( "Peculiar stone\n" @@ -4477,7 +4482,7 @@ const struct Item gItemsInfo[] = [ITEM_STRAWBERRY_SWEET] = { - .name = _("Strawberry Sweet"), + .name = ITEM_NAME("Strawberry Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "Strawberry-shaped\n" @@ -4494,7 +4499,7 @@ const struct Item gItemsInfo[] = [ITEM_LOVE_SWEET] = { - .name = _("Love Sweet"), + .name = ITEM_NAME("Love Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A heart-shaped\n" @@ -4511,7 +4516,7 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_SWEET] = { - .name = _("Berry Sweet"), + .name = ITEM_NAME("Berry Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A berry-shaped\n" @@ -4528,7 +4533,7 @@ const struct Item gItemsInfo[] = [ITEM_CLOVER_SWEET] = { - .name = _("Clover Sweet"), + .name = ITEM_NAME("Clover Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A clover-shaped\n" @@ -4545,7 +4550,7 @@ const struct Item gItemsInfo[] = [ITEM_FLOWER_SWEET] = { - .name = _("Flower Sweet"), + .name = ITEM_NAME("Flower Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A flower-shaped\n" @@ -4562,7 +4567,7 @@ const struct Item gItemsInfo[] = [ITEM_STAR_SWEET] = { - .name = _("Star Sweet"), + .name = ITEM_NAME("Star Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A star-shaped\n" @@ -4579,7 +4584,7 @@ const struct Item gItemsInfo[] = [ITEM_RIBBON_SWEET] = { - .name = _("Ribbon Sweet"), + .name = ITEM_NAME("Ribbon Sweet"), .price = 500 * TREASURE_FACTOR, .description = COMPOUND_STRING( "A ribbon-shaped\n" @@ -4596,7 +4601,7 @@ const struct Item gItemsInfo[] = [ITEM_EVERSTONE] = { - .name = _("Everstone"), + .name = ITEM_NAME("Everstone"), .price = (I_PRICE >= GEN_7) ? 3000 : 200, .holdEffect = HOLD_EFFECT_PREVENT_EVOLVE, .description = COMPOUND_STRING( @@ -4616,7 +4621,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_NECTAR] = { - .name = _("Red Nectar"), + .name = ITEM_NAME("Red Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, @@ -4631,7 +4636,7 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_NECTAR] = { - .name = _("Yellow Nectar"), + .name = ITEM_NAME("Yellow Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, @@ -4646,7 +4651,7 @@ const struct Item gItemsInfo[] = [ITEM_PINK_NECTAR] = { - .name = _("Pink Nectar"), + .name = ITEM_NAME("Pink Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, @@ -4661,7 +4666,7 @@ const struct Item gItemsInfo[] = [ITEM_PURPLE_NECTAR] = { - .name = _("Purple Nectar"), + .name = ITEM_NAME("Purple Nectar"), .price = 300, .holdEffectParam = 0, .description = sNectarDesc, @@ -4678,7 +4683,7 @@ const struct Item gItemsInfo[] = [ITEM_FLAME_PLATE] = { - .name = _("Flame Plate"), + .name = ITEM_NAME("Flame Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4698,7 +4703,7 @@ const struct Item gItemsInfo[] = [ITEM_SPLASH_PLATE] = { - .name = _("Splash Plate"), + .name = ITEM_NAME("Splash Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4718,7 +4723,7 @@ const struct Item gItemsInfo[] = [ITEM_ZAP_PLATE] = { - .name = _("Zap Plate"), + .name = ITEM_NAME("Zap Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4738,7 +4743,7 @@ const struct Item gItemsInfo[] = [ITEM_MEADOW_PLATE] = { - .name = _("Meadow Plate"), + .name = ITEM_NAME("Meadow Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4758,7 +4763,7 @@ const struct Item gItemsInfo[] = [ITEM_ICICLE_PLATE] = { - .name = _("Icicle Plate"), + .name = ITEM_NAME("Icicle Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4778,7 +4783,7 @@ const struct Item gItemsInfo[] = [ITEM_FIST_PLATE] = { - .name = _("Fist Plate"), + .name = ITEM_NAME("Fist Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4798,7 +4803,7 @@ const struct Item gItemsInfo[] = [ITEM_TOXIC_PLATE] = { - .name = _("Toxic Plate"), + .name = ITEM_NAME("Toxic Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4818,7 +4823,7 @@ const struct Item gItemsInfo[] = [ITEM_EARTH_PLATE] = { - .name = _("Earth Plate"), + .name = ITEM_NAME("Earth Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4838,7 +4843,7 @@ const struct Item gItemsInfo[] = [ITEM_SKY_PLATE] = { - .name = _("Sky Plate"), + .name = ITEM_NAME("Sky Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4858,7 +4863,7 @@ const struct Item gItemsInfo[] = [ITEM_MIND_PLATE] = { - .name = _("Mind Plate"), + .name = ITEM_NAME("Mind Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4878,7 +4883,7 @@ const struct Item gItemsInfo[] = [ITEM_INSECT_PLATE] = { - .name = _("Insect Plate"), + .name = ITEM_NAME("Insect Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4898,7 +4903,7 @@ const struct Item gItemsInfo[] = [ITEM_STONE_PLATE] = { - .name = _("Stone Plate"), + .name = ITEM_NAME("Stone Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4918,7 +4923,7 @@ const struct Item gItemsInfo[] = [ITEM_SPOOKY_PLATE] = { - .name = _("Spooky Plate"), + .name = ITEM_NAME("Spooky Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4938,7 +4943,7 @@ const struct Item gItemsInfo[] = [ITEM_DRACO_PLATE] = { - .name = _("Draco Plate"), + .name = ITEM_NAME("Draco Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4958,7 +4963,7 @@ const struct Item gItemsInfo[] = [ITEM_DREAD_PLATE] = { - .name = _("Dread Plate"), + .name = ITEM_NAME("Dread Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4978,7 +4983,7 @@ const struct Item gItemsInfo[] = [ITEM_IRON_PLATE] = { - .name = _("Iron Plate"), + .name = ITEM_NAME("Iron Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -4998,7 +5003,7 @@ const struct Item gItemsInfo[] = [ITEM_PIXIE_PLATE] = { - .name = _("Pixie Plate"), + .name = ITEM_NAME("Pixie Plate"), .price = 1000, .holdEffect = HOLD_EFFECT_PLATE, .holdEffectParam = 20, @@ -5020,7 +5025,7 @@ const struct Item gItemsInfo[] = [ITEM_DOUSE_DRIVE] = { - .name = _("Douse Drive"), + .name = ITEM_NAME("Douse Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -5038,7 +5043,7 @@ const struct Item gItemsInfo[] = [ITEM_SHOCK_DRIVE] = { - .name = _("Shock Drive"), + .name = ITEM_NAME("Shock Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -5057,7 +5062,7 @@ const struct Item gItemsInfo[] = [ITEM_BURN_DRIVE] = { - .name = _("Burn Drive"), + .name = ITEM_NAME("Burn Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -5076,7 +5081,7 @@ const struct Item gItemsInfo[] = [ITEM_CHILL_DRIVE] = { - .name = _("Chill Drive"), + .name = ITEM_NAME("Chill Drive"), .price = (I_PRICE >= GEN_7) ? 0 : 1000, .holdEffect = HOLD_EFFECT_DRIVE, .description = COMPOUND_STRING( @@ -5097,8 +5102,8 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_MEMORY] = { - .name = _("Fire Memory"), - .pluralName = _("Fire Memories"), + .name = ITEM_NAME("Fire Memory"), + .pluralName = ITEM_PLURAL_NAME("Fire Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5118,8 +5123,8 @@ const struct Item gItemsInfo[] = [ITEM_WATER_MEMORY] = { - .name = _("Water Memory"), - .pluralName = _("Water Memories"), + .name = ITEM_NAME("Water Memory"), + .pluralName = ITEM_PLURAL_NAME("Water Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5139,8 +5144,8 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_MEMORY] = { - .name = _("Electric Memory"), - .pluralName = _("Electric Memories"), + .name = ITEM_NAME("Electric Memory"), + .pluralName = ITEM_PLURAL_NAME("Electric Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5160,8 +5165,8 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_MEMORY] = { - .name = _("Grass Memory"), - .pluralName = _("Grass Memories"), + .name = ITEM_NAME("Grass Memory"), + .pluralName = ITEM_PLURAL_NAME("Grass Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5181,8 +5186,8 @@ const struct Item gItemsInfo[] = [ITEM_ICE_MEMORY] = { - .name = _("Ice Memory"), - .pluralName = _("Ice Memories"), + .name = ITEM_NAME("Ice Memory"), + .pluralName = ITEM_PLURAL_NAME("Ice Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5202,8 +5207,8 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_MEMORY] = { - .name = _("Fighting Memory"), - .pluralName = _("Fighting Memories"), + .name = ITEM_NAME("Fighting Memory"), + .pluralName = ITEM_PLURAL_NAME("Fighting Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5223,8 +5228,8 @@ const struct Item gItemsInfo[] = [ITEM_POISON_MEMORY] = { - .name = _("Poison Memory"), - .pluralName = _("Poison Memories"), + .name = ITEM_NAME("Poison Memory"), + .pluralName = ITEM_PLURAL_NAME("Poison Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5244,8 +5249,8 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_MEMORY] = { - .name = _("Ground Memory"), - .pluralName = _("Ground Memories"), + .name = ITEM_NAME("Ground Memory"), + .pluralName = ITEM_PLURAL_NAME("Ground Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5265,8 +5270,8 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_MEMORY] = { - .name = _("Flying Memory"), - .pluralName = _("Flying Memories"), + .name = ITEM_NAME("Flying Memory"), + .pluralName = ITEM_PLURAL_NAME("Flying Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5286,8 +5291,8 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_MEMORY] = { - .name = _("Psychic Memory"), - .pluralName = _("Psychic Memories"), + .name = ITEM_NAME("Psychic Memory"), + .pluralName = ITEM_PLURAL_NAME("Psychic Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5307,8 +5312,8 @@ const struct Item gItemsInfo[] = [ITEM_BUG_MEMORY] = { - .name = _("Bug Memory"), - .pluralName = _("Bug Memories"), + .name = ITEM_NAME("Bug Memory"), + .pluralName = ITEM_PLURAL_NAME("Bug Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5328,8 +5333,8 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_MEMORY] = { - .name = _("Rock Memory"), - .pluralName = _("Rock Memories"), + .name = ITEM_NAME("Rock Memory"), + .pluralName = ITEM_PLURAL_NAME("Rock Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5349,8 +5354,8 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_MEMORY] = { - .name = _("Ghost Memory"), - .pluralName = _("Ghost Memories"), + .name = ITEM_NAME("Ghost Memory"), + .pluralName = ITEM_PLURAL_NAME("Ghost Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5370,8 +5375,8 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_MEMORY] = { - .name = _("Dragon Memory"), - .pluralName = _("Dragon Memories"), + .name = ITEM_NAME("Dragon Memory"), + .pluralName = ITEM_PLURAL_NAME("Dragon Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5391,8 +5396,8 @@ const struct Item gItemsInfo[] = [ITEM_DARK_MEMORY] = { - .name = _("Dark Memory"), - .pluralName = _("Dark Memories"), + .name = ITEM_NAME("Dark Memory"), + .pluralName = ITEM_PLURAL_NAME("Dark Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5412,8 +5417,8 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_MEMORY] = { - .name = _("Steel Memory"), - .pluralName = _("Steel Memories"), + .name = ITEM_NAME("Steel Memory"), + .pluralName = ITEM_PLURAL_NAME("Steel Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5433,8 +5438,8 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_MEMORY] = { - .name = _("Fairy Memory"), - .pluralName = _("Fairy Memories"), + .name = ITEM_NAME("Fairy Memory"), + .pluralName = ITEM_PLURAL_NAME("Fairy Memories"), .price = 1000, .holdEffect = HOLD_EFFECT_MEMORY, .holdEffectParam = 0, @@ -5454,7 +5459,7 @@ const struct Item gItemsInfo[] = [ITEM_RUSTED_SWORD] = { - .name = _("Rusted Sword"), + .name = ITEM_NAME("Rusted Sword"), .price = 0, .description = COMPOUND_STRING( "A rusty sword. A\n" @@ -5470,7 +5475,7 @@ const struct Item gItemsInfo[] = [ITEM_RUSTED_SHIELD] = { - .name = _("Rusted Shield"), + .name = ITEM_NAME("Rusted Shield"), .price = 0, .description = COMPOUND_STRING( "A rusty shield. A\n" @@ -5488,7 +5493,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_ORB] = { - .name = _("Red Orb"), + .name = ITEM_NAME("Red Orb"), .price = 0, .holdEffect = HOLD_EFFECT_PRIMAL_ORB, .description = COMPOUND_STRING( @@ -5505,7 +5510,7 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_ORB] = { - .name = _("Blue Orb"), + .name = ITEM_NAME("Blue Orb"), .price = 0, .holdEffect = HOLD_EFFECT_PRIMAL_ORB, .description = COMPOUND_STRING( @@ -5524,7 +5529,7 @@ const struct Item gItemsInfo[] = [ITEM_VENUSAURITE] = { - .name = _("Venusaurite"), + .name = ITEM_NAME("Venusaurite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5542,8 +5547,8 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_X] = { - .name = _("Charizardite X"), - .pluralName = _("Charizardites X"), + .name = ITEM_NAME("Charizardite X"), + .pluralName = ITEM_PLURAL_NAME("Charizardites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, @@ -5558,8 +5563,8 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_Y] = { - .name = _("Charizardite Y"), - .pluralName = _("Charizardites Y"), + .name = ITEM_NAME("Charizardite Y"), + .pluralName = ITEM_PLURAL_NAME("Charizardites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, @@ -5574,7 +5579,7 @@ const struct Item gItemsInfo[] = [ITEM_BLASTOISINITE] = { - .name = _("Blastoisinite"), + .name = ITEM_NAME("Blastoisinite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5592,7 +5597,7 @@ const struct Item gItemsInfo[] = [ITEM_BEEDRILLITE] = { - .name = _("Beedrillite"), + .name = ITEM_NAME("Beedrillite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5610,7 +5615,7 @@ const struct Item gItemsInfo[] = [ITEM_PIDGEOTITE] = { - .name = _("Pidgeotite"), + .name = ITEM_NAME("Pidgeotite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5628,7 +5633,7 @@ const struct Item gItemsInfo[] = [ITEM_ALAKAZITE] = { - .name = _("Alakazite"), + .name = ITEM_NAME("Alakazite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5646,7 +5651,7 @@ const struct Item gItemsInfo[] = [ITEM_SLOWBRONITE] = { - .name = _("Slowbronite"), + .name = ITEM_NAME("Slowbronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5664,7 +5669,7 @@ const struct Item gItemsInfo[] = [ITEM_GENGARITE] = { - .name = _("Gengarite"), + .name = ITEM_NAME("Gengarite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5682,7 +5687,7 @@ const struct Item gItemsInfo[] = [ITEM_KANGASKHANITE] = { - .name = _("Kangaskhanite"), + .name = ITEM_NAME("Kangaskhanite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5700,7 +5705,7 @@ const struct Item gItemsInfo[] = [ITEM_PINSIRITE] = { - .name = _("Pinsirite"), + .name = ITEM_NAME("Pinsirite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5718,7 +5723,7 @@ const struct Item gItemsInfo[] = [ITEM_GYARADOSITE] = { - .name = _("Gyaradosite"), + .name = ITEM_NAME("Gyaradosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5736,7 +5741,7 @@ const struct Item gItemsInfo[] = [ITEM_AERODACTYLITE] = { - .name = _("Aerodactylite"), + .name = ITEM_NAME("Aerodactylite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5754,8 +5759,8 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_X] = { - .name = _("Mewtwonite X"), - .pluralName = _("Mewtwonites X"), + .name = ITEM_NAME("Mewtwonite X"), + .pluralName = ITEM_PLURAL_NAME("Mewtwonites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, @@ -5770,8 +5775,8 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_Y] = { - .name = _("Mewtwonite Y"), - .pluralName = _("Mewtwonites Y"), + .name = ITEM_NAME("Mewtwonite Y"), + .pluralName = ITEM_PLURAL_NAME("Mewtwonites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, @@ -5786,7 +5791,7 @@ const struct Item gItemsInfo[] = [ITEM_AMPHAROSITE] = { - .name = _("Ampharosite"), + .name = ITEM_NAME("Ampharosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5804,7 +5809,7 @@ const struct Item gItemsInfo[] = [ITEM_STEELIXITE] = { - .name = _("Steelixite"), + .name = ITEM_NAME("Steelixite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5822,7 +5827,7 @@ const struct Item gItemsInfo[] = [ITEM_SCIZORITE] = { - .name = _("Scizorite"), + .name = ITEM_NAME("Scizorite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5840,7 +5845,7 @@ const struct Item gItemsInfo[] = [ITEM_HERACRONITE] = { - .name = _("Heracronite"), + .name = ITEM_NAME("Heracronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5858,7 +5863,7 @@ const struct Item gItemsInfo[] = [ITEM_HOUNDOOMINITE] = { - .name = _("Houndoominite"), + .name = ITEM_NAME("Houndoominite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5876,7 +5881,7 @@ const struct Item gItemsInfo[] = [ITEM_TYRANITARITE] = { - .name = _("Tyranitarite"), + .name = ITEM_NAME("Tyranitarite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5894,7 +5899,7 @@ const struct Item gItemsInfo[] = [ITEM_SCEPTILITE] = { - .name = _("Sceptilite"), + .name = ITEM_NAME("Sceptilite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5912,7 +5917,7 @@ const struct Item gItemsInfo[] = [ITEM_BLAZIKENITE] = { - .name = _("Blazikenite"), + .name = ITEM_NAME("Blazikenite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5930,7 +5935,7 @@ const struct Item gItemsInfo[] = [ITEM_SWAMPERTITE] = { - .name = _("Swampertite"), + .name = ITEM_NAME("Swampertite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5948,7 +5953,7 @@ const struct Item gItemsInfo[] = [ITEM_GARDEVOIRITE] = { - .name = _("Gardevoirite"), + .name = ITEM_NAME("Gardevoirite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5966,7 +5971,7 @@ const struct Item gItemsInfo[] = [ITEM_SABLENITE] = { - .name = _("Sablenite"), + .name = ITEM_NAME("Sablenite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -5984,7 +5989,7 @@ const struct Item gItemsInfo[] = [ITEM_MAWILITE] = { - .name = _("Mawilite"), + .name = ITEM_NAME("Mawilite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6002,7 +6007,7 @@ const struct Item gItemsInfo[] = [ITEM_AGGRONITE] = { - .name = _("Aggronite"), + .name = ITEM_NAME("Aggronite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6020,7 +6025,7 @@ const struct Item gItemsInfo[] = [ITEM_MEDICHAMITE] = { - .name = _("Medichamite"), + .name = ITEM_NAME("Medichamite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6038,7 +6043,7 @@ const struct Item gItemsInfo[] = [ITEM_MANECTITE] = { - .name = _("Manectite"), + .name = ITEM_NAME("Manectite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6056,7 +6061,7 @@ const struct Item gItemsInfo[] = [ITEM_SHARPEDONITE] = { - .name = _("Sharpedonite"), + .name = ITEM_NAME("Sharpedonite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6074,7 +6079,7 @@ const struct Item gItemsInfo[] = [ITEM_CAMERUPTITE] = { - .name = _("Cameruptite"), + .name = ITEM_NAME("Cameruptite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6092,7 +6097,7 @@ const struct Item gItemsInfo[] = [ITEM_ALTARIANITE] = { - .name = _("Altarianite"), + .name = ITEM_NAME("Altarianite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6110,7 +6115,7 @@ const struct Item gItemsInfo[] = [ITEM_BANETTITE] = { - .name = _("Banettite"), + .name = ITEM_NAME("Banettite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6128,7 +6133,7 @@ const struct Item gItemsInfo[] = [ITEM_ABSOLITE] = { - .name = _("Absolite"), + .name = ITEM_NAME("Absolite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6146,7 +6151,7 @@ const struct Item gItemsInfo[] = [ITEM_GLALITITE] = { - .name = _("Glalitite"), + .name = ITEM_NAME("Glalitite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6164,7 +6169,7 @@ const struct Item gItemsInfo[] = [ITEM_SALAMENCITE] = { - .name = _("Salamencite"), + .name = ITEM_NAME("Salamencite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6182,7 +6187,7 @@ const struct Item gItemsInfo[] = [ITEM_METAGROSSITE] = { - .name = _("Metagrossite"), + .name = ITEM_NAME("Metagrossite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6200,7 +6205,7 @@ const struct Item gItemsInfo[] = [ITEM_LATIASITE] = { - .name = _("Latiasite"), + .name = ITEM_NAME("Latiasite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6218,7 +6223,7 @@ const struct Item gItemsInfo[] = [ITEM_LATIOSITE] = { - .name = _("Latiosite"), + .name = ITEM_NAME("Latiosite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6236,7 +6241,7 @@ const struct Item gItemsInfo[] = [ITEM_LOPUNNITE] = { - .name = _("Lopunnite"), + .name = ITEM_NAME("Lopunnite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6254,7 +6259,7 @@ const struct Item gItemsInfo[] = [ITEM_GARCHOMPITE] = { - .name = _("Garchompite"), + .name = ITEM_NAME("Garchompite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6272,7 +6277,7 @@ const struct Item gItemsInfo[] = [ITEM_LUCARIONITE] = { - .name = _("Lucarionite"), + .name = ITEM_NAME("Lucarionite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6290,7 +6295,7 @@ const struct Item gItemsInfo[] = [ITEM_ABOMASITE] = { - .name = _("Abomasite"), + .name = ITEM_NAME("Abomasite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6308,7 +6313,7 @@ const struct Item gItemsInfo[] = [ITEM_GALLADITE] = { - .name = _("Galladite"), + .name = ITEM_NAME("Galladite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6326,7 +6331,7 @@ const struct Item gItemsInfo[] = [ITEM_AUDINITE] = { - .name = _("Audinite"), + .name = ITEM_NAME("Audinite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6344,7 +6349,7 @@ const struct Item gItemsInfo[] = [ITEM_DIANCITE] = { - .name = _("Diancite"), + .name = ITEM_NAME("Diancite"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = COMPOUND_STRING( @@ -6364,7 +6369,7 @@ const struct Item gItemsInfo[] = [ITEM_NORMAL_GEM] = { - .name = _("Normal Gem"), + .name = ITEM_NAME("Normal Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6383,7 +6388,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_GEM] = { - .name = _("Fire Gem"), + .name = ITEM_NAME("Fire Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6402,7 +6407,7 @@ const struct Item gItemsInfo[] = [ITEM_WATER_GEM] = { - .name = _("Water Gem"), + .name = ITEM_NAME("Water Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6421,7 +6426,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_GEM] = { - .name = _("Electric Gem"), + .name = ITEM_NAME("Electric Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6440,7 +6445,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_GEM] = { - .name = _("Grass Gem"), + .name = ITEM_NAME("Grass Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6459,7 +6464,7 @@ const struct Item gItemsInfo[] = [ITEM_ICE_GEM] = { - .name = _("Ice Gem"), + .name = ITEM_NAME("Ice Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6478,7 +6483,7 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_GEM] = { - .name = _("Fighting Gem"), + .name = ITEM_NAME("Fighting Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6497,7 +6502,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_GEM] = { - .name = _("Poison Gem"), + .name = ITEM_NAME("Poison Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6516,7 +6521,7 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_GEM] = { - .name = _("Ground Gem"), + .name = ITEM_NAME("Ground Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6535,7 +6540,7 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_GEM] = { - .name = _("Flying Gem"), + .name = ITEM_NAME("Flying Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6554,7 +6559,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_GEM] = { - .name = _("Psychic Gem"), + .name = ITEM_NAME("Psychic Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6573,7 +6578,7 @@ const struct Item gItemsInfo[] = [ITEM_BUG_GEM] = { - .name = _("Bug Gem"), + .name = ITEM_NAME("Bug Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6592,7 +6597,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_GEM] = { - .name = _("Rock Gem"), + .name = ITEM_NAME("Rock Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6611,7 +6616,7 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_GEM] = { - .name = _("Ghost Gem"), + .name = ITEM_NAME("Ghost Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6630,7 +6635,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_GEM] = { - .name = _("Dragon Gem"), + .name = ITEM_NAME("Dragon Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6649,7 +6654,7 @@ const struct Item gItemsInfo[] = [ITEM_DARK_GEM] = { - .name = _("Dark Gem"), + .name = ITEM_NAME("Dark Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6668,7 +6673,7 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_GEM] = { - .name = _("Steel Gem"), + .name = ITEM_NAME("Steel Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6687,7 +6692,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_GEM] = { - .name = _("Fairy Gem"), + .name = ITEM_NAME("Fairy Gem"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, @@ -6708,7 +6713,7 @@ const struct Item gItemsInfo[] = [ITEM_NORMALIUM_Z] = { - .name = _("Normalium Z"), + .name = ITEM_NAME("Normalium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6726,7 +6731,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRIUM_Z] = { - .name = _("Firium Z"), + .name = ITEM_NAME("Firium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6744,7 +6749,7 @@ const struct Item gItemsInfo[] = [ITEM_WATERIUM_Z] = { - .name = _("Waterium Z"), + .name = ITEM_NAME("Waterium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6762,7 +6767,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIUM_Z] = { - .name = _("Electrium Z"), + .name = ITEM_NAME("Electrium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6780,7 +6785,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASSIUM_Z] = { - .name = _("Grassium Z"), + .name = ITEM_NAME("Grassium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6798,7 +6803,7 @@ const struct Item gItemsInfo[] = [ITEM_ICIUM_Z] = { - .name = _("Icium Z"), + .name = ITEM_NAME("Icium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6816,7 +6821,7 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTINIUM_Z] = { - .name = _("Fightinium Z"), + .name = ITEM_NAME("Fightinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6834,7 +6839,7 @@ const struct Item gItemsInfo[] = [ITEM_POISONIUM_Z] = { - .name = _("Poisonium Z"), + .name = ITEM_NAME("Poisonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6852,7 +6857,7 @@ const struct Item gItemsInfo[] = [ITEM_GROUNDIUM_Z] = { - .name = _("Groundium Z"), + .name = ITEM_NAME("Groundium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6870,7 +6875,7 @@ const struct Item gItemsInfo[] = [ITEM_FLYINIUM_Z] = { - .name = _("Flyinium Z"), + .name = ITEM_NAME("Flyinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6888,7 +6893,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIUM_Z] = { - .name = _("Psychium Z"), + .name = ITEM_NAME("Psychium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6906,7 +6911,7 @@ const struct Item gItemsInfo[] = [ITEM_BUGINIUM_Z] = { - .name = _("Buginium Z"), + .name = ITEM_NAME("Buginium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6924,7 +6929,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCKIUM_Z] = { - .name = _("Rockium Z"), + .name = ITEM_NAME("Rockium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6942,7 +6947,7 @@ const struct Item gItemsInfo[] = [ITEM_GHOSTIUM_Z] = { - .name = _("Ghostium Z"), + .name = ITEM_NAME("Ghostium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6960,7 +6965,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGONIUM_Z] = { - .name = _("Dragonium Z"), + .name = ITEM_NAME("Dragonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6978,7 +6983,7 @@ const struct Item gItemsInfo[] = [ITEM_DARKINIUM_Z] = { - .name = _("Darkinium Z"), + .name = ITEM_NAME("Darkinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -6996,7 +7001,7 @@ const struct Item gItemsInfo[] = [ITEM_STEELIUM_Z] = { - .name = _("Steelium Z"), + .name = ITEM_NAME("Steelium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7014,7 +7019,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRIUM_Z] = { - .name = _("Fairium Z"), + .name = ITEM_NAME("Fairium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7032,7 +7037,7 @@ const struct Item gItemsInfo[] = [ITEM_PIKANIUM_Z] = { - .name = _("Pikanium Z"), + .name = ITEM_NAME("Pikanium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7050,7 +7055,7 @@ const struct Item gItemsInfo[] = [ITEM_EEVIUM_Z] = { - .name = _("Eevium Z"), + .name = ITEM_NAME("Eevium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7068,7 +7073,7 @@ const struct Item gItemsInfo[] = [ITEM_SNORLIUM_Z] = { - .name = _("Snorlium Z"), + .name = ITEM_NAME("Snorlium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7086,7 +7091,7 @@ const struct Item gItemsInfo[] = [ITEM_MEWNIUM_Z] = { - .name = _("Mewnium Z"), + .name = ITEM_NAME("Mewnium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7104,7 +7109,7 @@ const struct Item gItemsInfo[] = [ITEM_DECIDIUM_Z] = { - .name = _("Decidium Z"), + .name = ITEM_NAME("Decidium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7122,7 +7127,7 @@ const struct Item gItemsInfo[] = [ITEM_INCINIUM_Z] = { - .name = _("Incinium Z"), + .name = ITEM_NAME("Incinium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7140,7 +7145,7 @@ const struct Item gItemsInfo[] = [ITEM_PRIMARIUM_Z] = { - .name = _("Primarium Z"), + .name = ITEM_NAME("Primarium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7158,7 +7163,7 @@ const struct Item gItemsInfo[] = [ITEM_LYCANIUM_Z] = { - .name = _("Lycanium Z"), + .name = ITEM_NAME("Lycanium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7176,7 +7181,7 @@ const struct Item gItemsInfo[] = [ITEM_MIMIKIUM_Z] = { - .name = _("Mimikium Z"), + .name = ITEM_NAME("Mimikium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7194,7 +7199,7 @@ const struct Item gItemsInfo[] = [ITEM_KOMMONIUM_Z] = { - .name = _("Kommonium Z"), + .name = ITEM_NAME("Kommonium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7212,7 +7217,7 @@ const struct Item gItemsInfo[] = [ITEM_TAPUNIUM_Z] = { - .name = _("Tapunium Z"), + .name = ITEM_NAME("Tapunium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7230,7 +7235,7 @@ const struct Item gItemsInfo[] = [ITEM_SOLGANIUM_Z] = { - .name = _("Solganium Z"), + .name = ITEM_NAME("Solganium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7248,7 +7253,7 @@ const struct Item gItemsInfo[] = [ITEM_LUNALIUM_Z] = { - .name = _("Lunalium Z"), + .name = ITEM_NAME("Lunalium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7266,7 +7271,7 @@ const struct Item gItemsInfo[] = [ITEM_MARSHADIUM_Z] = { - .name = _("Marshadium Z"), + .name = ITEM_NAME("Marshadium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7284,7 +7289,7 @@ const struct Item gItemsInfo[] = [ITEM_ALORAICHIUM_Z] = { - .name = _("Aloraichium Z"), + .name = ITEM_NAME("Aloraichium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7302,7 +7307,7 @@ const struct Item gItemsInfo[] = [ITEM_PIKASHUNIUM_Z] = { - .name = _("Pikashunium Z"), + .name = ITEM_NAME("Pikashunium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7320,7 +7325,7 @@ const struct Item gItemsInfo[] = [ITEM_ULTRANECROZIUM_Z] = { - .name = _("Ultranecrozium Z"), + .name = ITEM_NAME("Ultranecrozium Z"), .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, .description = COMPOUND_STRING( @@ -7340,7 +7345,7 @@ const struct Item gItemsInfo[] = [ITEM_LIGHT_BALL] = { - .name = _("Light Ball"), + .name = ITEM_NAME("Light Ball"), .price = (I_PRICE >= GEN_7) ? 1000 : 100, .holdEffect = HOLD_EFFECT_LIGHT_BALL, .description = COMPOUND_STRING( @@ -7358,7 +7363,7 @@ const struct Item gItemsInfo[] = [ITEM_LEEK] = { - .name = _("Leek"), + .name = ITEM_NAME("Leek"), .price = (I_PRICE >= GEN_7) ? 1000 : 200, .holdEffect = HOLD_EFFECT_LEEK, .description = COMPOUND_STRING( @@ -7376,7 +7381,7 @@ const struct Item gItemsInfo[] = [ITEM_THICK_CLUB] = { - .name = _("Thick Club"), + .name = ITEM_NAME("Thick Club"), .price = (I_PRICE >= GEN_7) ? 1000 : 500, .holdEffect = HOLD_EFFECT_THICK_CLUB, .description = COMPOUND_STRING( @@ -7394,8 +7399,8 @@ const struct Item gItemsInfo[] = [ITEM_LUCKY_PUNCH] = { - .name = _("Lucky Punch"), - .pluralName = _("Lucky Punches"), + .name = ITEM_NAME("Lucky Punch"), + .pluralName = ITEM_PLURAL_NAME("Lucky Punches"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_LUCKY_PUNCH, .description = COMPOUND_STRING( @@ -7413,8 +7418,8 @@ const struct Item gItemsInfo[] = [ITEM_METAL_POWDER] = { - .name = _("Metal Powder"), - .pluralName = _("Metal Powder"), + .name = ITEM_NAME("Metal Powder"), + .pluralName = ITEM_PLURAL_NAME("Metal Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_METAL_POWDER, .description = COMPOUND_STRING( @@ -7432,8 +7437,8 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_POWDER] = { - .name = _("Quick Powder"), - .pluralName = _("Quick Powder"), + .name = ITEM_NAME("Quick Powder"), + .pluralName = ITEM_PLURAL_NAME("Quick Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_QUICK_POWDER, .description = COMPOUND_STRING( @@ -7451,7 +7456,7 @@ const struct Item gItemsInfo[] = [ITEM_DEEP_SEA_SCALE] = { - .name = _("Deep Sea Scale"), + .name = ITEM_NAME("Deep Sea Scale"), .price = (I_PRICE >= GEN_7) ? 2000 : 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_SCALE, .description = COMPOUND_STRING( @@ -7470,8 +7475,8 @@ const struct Item gItemsInfo[] = [ITEM_DEEP_SEA_TOOTH] = { - .name = _("Deep Sea Tooth"), - .pluralName = _("Deep Sea Teeth"), + .name = ITEM_NAME("Deep Sea Tooth"), + .pluralName = ITEM_PLURAL_NAME("Deep Sea Teeth"), .price = (I_PRICE >= GEN_7) ? 2000 : 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_TOOTH, .description = COMPOUND_STRING( @@ -7490,7 +7495,7 @@ const struct Item gItemsInfo[] = [ITEM_SOUL_DEW] = { - .name = _("Soul Dew"), + .name = ITEM_NAME("Soul Dew"), .price = (I_PRICE >= GEN_7) ? 0 : 200, .holdEffect = HOLD_EFFECT_SOUL_DEW, .holdEffectParam = B_SOUL_DEW_BOOST >= GEN_7 ? 20 : 50, @@ -7515,7 +7520,7 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_ORB] = { - .name = _("Adamant Orb"), + .name = ITEM_NAME("Adamant Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_ADAMANT_ORB, .holdEffectParam = 20, @@ -7534,7 +7539,7 @@ const struct Item gItemsInfo[] = [ITEM_LUSTROUS_ORB] = { - .name = _("Lustrous Orb"), + .name = ITEM_NAME("Lustrous Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, .holdEffectParam = 20, @@ -7553,7 +7558,7 @@ const struct Item gItemsInfo[] = [ITEM_GRISEOUS_ORB] = { - .name = _("Griseous Orb"), + .name = ITEM_NAME("Griseous Orb"), .price = (I_PRICE >= GEN_7) ? 0 : 10000, .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, .holdEffectParam = 20, @@ -7574,7 +7579,7 @@ const struct Item gItemsInfo[] = [ITEM_SEA_INCENSE] = { - .name = _("Sea Incense"), + .name = ITEM_NAME("Sea Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, @@ -7591,7 +7596,7 @@ const struct Item gItemsInfo[] = [ITEM_LAX_INCENSE] = { - .name = _("Lax Incense"), + .name = ITEM_NAME("Lax Incense"), .price = (I_PRICE >= GEN_7) ? 5000 : 9600, .holdEffect = HOLD_EFFECT_EVASION_UP, .holdEffectParam = 10, @@ -7610,7 +7615,7 @@ const struct Item gItemsInfo[] = [ITEM_ODD_INCENSE] = { - .name = _("Odd Incense"), + .name = ITEM_NAME("Odd Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, @@ -7627,7 +7632,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_INCENSE] = { - .name = _("Rock Incense"), + .name = ITEM_NAME("Rock Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, @@ -7644,7 +7649,7 @@ const struct Item gItemsInfo[] = [ITEM_FULL_INCENSE] = { - .name = _("Full Incense"), + .name = ITEM_NAME("Full Incense"), .price = (I_PRICE >= GEN_7) ? 5000 : 9600, .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .holdEffectParam = 5, @@ -7660,7 +7665,7 @@ const struct Item gItemsInfo[] = [ITEM_WAVE_INCENSE] = { - .name = _("Wave Incense"), + .name = ITEM_NAME("Wave Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, @@ -7677,7 +7682,7 @@ const struct Item gItemsInfo[] = [ITEM_ROSE_INCENSE] = { - .name = _("Rose Incense"), + .name = ITEM_NAME("Rose Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, @@ -7694,7 +7699,7 @@ const struct Item gItemsInfo[] = [ITEM_LUCK_INCENSE] = { - .name = _("Luck Incense"), + .name = ITEM_NAME("Luck Incense"), .price = (I_PRICE >= GEN_7) ? 11000 : 9600, .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, @@ -7709,7 +7714,7 @@ const struct Item gItemsInfo[] = [ITEM_PURE_INCENSE] = { - .name = _("Pure Incense"), + .name = ITEM_NAME("Pure Incense"), .price = (I_PRICE >= GEN_7) ? 6000 : 9600, .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, @@ -7726,8 +7731,8 @@ const struct Item gItemsInfo[] = [ITEM_RED_SCARF] = { - .name = _("Red Scarf"), - .pluralName = _("Red Scarves"), + .name = ITEM_NAME("Red Scarf"), + .pluralName = ITEM_PLURAL_NAME("Red Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" @@ -7744,8 +7749,8 @@ const struct Item gItemsInfo[] = [ITEM_BLUE_SCARF] = { - .name = _("Blue Scarf"), - .pluralName = _("Blue Scarves"), + .name = ITEM_NAME("Blue Scarf"), + .pluralName = ITEM_PLURAL_NAME("Blue Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" @@ -7762,8 +7767,8 @@ const struct Item gItemsInfo[] = [ITEM_PINK_SCARF] = { - .name = _("Pink Scarf"), - .pluralName = _("Pink Scarves"), + .name = ITEM_NAME("Pink Scarf"), + .pluralName = ITEM_PLURAL_NAME("Pink Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" @@ -7780,8 +7785,8 @@ const struct Item gItemsInfo[] = [ITEM_GREEN_SCARF] = { - .name = _("Green Scarf"), - .pluralName = _("Green Scarves"), + .name = ITEM_NAME("Green Scarf"), + .pluralName = ITEM_PLURAL_NAME("Green Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" @@ -7798,8 +7803,8 @@ const struct Item gItemsInfo[] = [ITEM_YELLOW_SCARF] = { - .name = _("Yellow Scarf"), - .pluralName = _("Yellow Scarves"), + .name = ITEM_NAME("Yellow Scarf"), + .pluralName = ITEM_PLURAL_NAME("Yellow Scarves"), .price = 100, .description = COMPOUND_STRING( "A hold item that\n" @@ -7818,7 +7823,7 @@ const struct Item gItemsInfo[] = [ITEM_MACHO_BRACE] = { - .name = _("Macho Brace"), + .name = ITEM_NAME("Macho Brace"), .price = 3000, .holdEffect = HOLD_EFFECT_MACHO_BRACE, .description = COMPOUND_STRING( @@ -7836,7 +7841,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_WEIGHT] = { - .name = _("Power Weight"), + .name = ITEM_NAME("Power Weight"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7856,7 +7861,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BRACER] = { - .name = _("Power Bracer"), + .name = ITEM_NAME("Power Bracer"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7876,7 +7881,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BELT] = { - .name = _("Power Belt"), + .name = ITEM_NAME("Power Belt"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7896,8 +7901,8 @@ const struct Item gItemsInfo[] = [ITEM_POWER_LENS] = { - .name = _("Power Lens"), - .pluralName = _("Power Lenses"), + .name = ITEM_NAME("Power Lens"), + .pluralName = ITEM_PLURAL_NAME("Power Lenses"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7917,7 +7922,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_BAND] = { - .name = _("Power Band"), + .name = ITEM_NAME("Power Band"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7937,7 +7942,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_ANKLET] = { - .name = _("Power Anklet"), + .name = ITEM_NAME("Power Anklet"), .price = (I_PRICE >= GEN_9) ? 10000 : 3000, .holdEffect = HOLD_EFFECT_POWER_ITEM, .holdEffectParam = POWER_ITEM_BOOST, @@ -7959,8 +7964,8 @@ const struct Item gItemsInfo[] = [ITEM_SILK_SCARF] = { - .name = _("Silk Scarf"), - .pluralName = _("Silk Scarves"), + .name = ITEM_NAME("Silk Scarf"), + .pluralName = ITEM_PLURAL_NAME("Silk Scarves"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -7980,7 +7985,7 @@ const struct Item gItemsInfo[] = [ITEM_CHARCOAL] = { - .name = _("Charcoal"), + .name = ITEM_NAME("Charcoal"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 9800), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8000,8 +8005,8 @@ const struct Item gItemsInfo[] = [ITEM_MYSTIC_WATER] = { - .name = _("Mystic Water"), - .pluralName = _("Mystic Water"), + .name = ITEM_NAME("Mystic Water"), + .pluralName = ITEM_PLURAL_NAME("Mystic Water"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8021,7 +8026,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGNET] = { - .name = _("Magnet"), + .name = ITEM_NAME("Magnet"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8041,7 +8046,7 @@ const struct Item gItemsInfo[] = [ITEM_MIRACLE_SEED] = { - .name = _("Miracle Seed"), + .name = ITEM_NAME("Miracle Seed"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8058,8 +8063,8 @@ const struct Item gItemsInfo[] = [ITEM_NEVER_MELT_ICE] = { - .name = _("Never-Melt Ice"), - .pluralName = _("Never-Melt Ice"), + .name = ITEM_NAME("Never-Melt Ice"), + .pluralName = ITEM_PLURAL_NAME("Never-Melt Ice"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8079,7 +8084,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_BELT] = { - .name = _("Black Belt"), + .name = ITEM_NAME("Black Belt"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8099,7 +8104,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_BARB] = { - .name = _("Poison Barb"), + .name = ITEM_NAME("Poison Barb"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8119,8 +8124,8 @@ const struct Item gItemsInfo[] = [ITEM_SOFT_SAND] = { - .name = _("Soft Sand"), - .pluralName = _("Soft Sand"), + .name = ITEM_NAME("Soft Sand"), + .pluralName = ITEM_PLURAL_NAME("Soft Sand"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8140,7 +8145,7 @@ const struct Item gItemsInfo[] = [ITEM_SHARP_BEAK] = { - .name = _("Sharp Beak"), + .name = ITEM_NAME("Sharp Beak"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8160,7 +8165,7 @@ const struct Item gItemsInfo[] = [ITEM_TWISTED_SPOON] = { - .name = _("Twisted Spoon"), + .name = ITEM_NAME("Twisted Spoon"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8177,8 +8182,8 @@ const struct Item gItemsInfo[] = [ITEM_SILVER_POWDER] = { - .name = _("Silver Powder"), - .pluralName = _("Silver Powder"), + .name = ITEM_NAME("Silver Powder"), + .pluralName = ITEM_PLURAL_NAME("Silver Powder"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8198,7 +8203,7 @@ const struct Item gItemsInfo[] = [ITEM_HARD_STONE] = { - .name = _("Hard Stone"), + .name = ITEM_NAME("Hard Stone"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8215,7 +8220,7 @@ const struct Item gItemsInfo[] = [ITEM_SPELL_TAG] = { - .name = _("Spell Tag"), + .name = ITEM_NAME("Spell Tag"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8235,7 +8240,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_FANG] = { - .name = _("Dragon Fang"), + .name = ITEM_NAME("Dragon Fang"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8255,8 +8260,8 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_GLASSES] = { - .name = _("Black Glasses"), - .pluralName = _("Black Glasses"), + .name = ITEM_NAME("Black Glasses"), + .pluralName = ITEM_PLURAL_NAME("Black Glasses"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8276,7 +8281,7 @@ const struct Item gItemsInfo[] = [ITEM_METAL_COAT] = { - .name = _("Metal Coat"), + .name = ITEM_NAME("Metal Coat"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 100), .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -8299,7 +8304,7 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_BAND] = { - .name = _("Choice Band"), + .name = ITEM_NAME("Choice Band"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_BAND, .description = COMPOUND_STRING( @@ -8317,8 +8322,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_SPECS] = { - .name = _("Choice Specs"), - .pluralName = _("Choice Specs"), + .name = ITEM_NAME("Choice Specs"), + .pluralName = ITEM_PLURAL_NAME("Choice Specs"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_SPECS, .description = COMPOUND_STRING( @@ -8336,8 +8341,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_SCARF] = { - .name = _("Choice Scarf"), - .pluralName = _("Choice Scarves"), + .name = ITEM_NAME("Choice Scarf"), + .pluralName = ITEM_PLURAL_NAME("Choice Scarves"), .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_CHOICE_SCARF, .description = COMPOUND_STRING( @@ -8357,7 +8362,7 @@ const struct Item gItemsInfo[] = [ITEM_FLAME_ORB] = { - .name = _("Flame Orb"), + .name = ITEM_NAME("Flame Orb"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FLAME_ORB, .description = COMPOUND_STRING( @@ -8375,7 +8380,7 @@ const struct Item gItemsInfo[] = [ITEM_TOXIC_ORB] = { - .name = _("Toxic Orb"), + .name = ITEM_NAME("Toxic Orb"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_TOXIC_ORB, .description = COMPOUND_STRING( @@ -8395,7 +8400,7 @@ const struct Item gItemsInfo[] = [ITEM_DAMP_ROCK] = { - .name = _("Damp Rock"), + .name = ITEM_NAME("Damp Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_DAMP_ROCK, .description = COMPOUND_STRING( @@ -8413,7 +8418,7 @@ const struct Item gItemsInfo[] = [ITEM_HEAT_ROCK] = { - .name = _("Heat Rock"), + .name = ITEM_NAME("Heat Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_HEAT_ROCK, .description = COMPOUND_STRING( @@ -8431,7 +8436,7 @@ const struct Item gItemsInfo[] = [ITEM_SMOOTH_ROCK] = { - .name = _("Smooth Rock"), + .name = ITEM_NAME("Smooth Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, .description = COMPOUND_STRING( @@ -8449,7 +8454,7 @@ const struct Item gItemsInfo[] = [ITEM_ICY_ROCK] = { - .name = _("Icy Rock"), + .name = ITEM_NAME("Icy Rock"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ICY_ROCK, #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL @@ -8481,7 +8486,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_SEED] = { - .name = _("Electric Seed"), + .name = ITEM_NAME("Electric Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_SEEDS, .holdEffectParam = HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN, @@ -8500,7 +8505,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_SEED] = { - .name = _("Psychic Seed"), + .name = ITEM_NAME("Psychic Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_SEEDS, .holdEffectParam = HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN, @@ -8519,7 +8524,7 @@ const struct Item gItemsInfo[] = [ITEM_MISTY_SEED] = { - .name = _("Misty Seed"), + .name = ITEM_NAME("Misty Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_SEEDS, .holdEffectParam = HOLD_EFFECT_PARAM_MISTY_TERRAIN, @@ -8538,7 +8543,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASSY_SEED] = { - .name = _("Grassy Seed"), + .name = ITEM_NAME("Grassy Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_SEEDS, .holdEffectParam = HOLD_EFFECT_PARAM_GRASSY_TERRAIN, @@ -8559,7 +8564,7 @@ const struct Item gItemsInfo[] = [ITEM_ABSORB_BULB] = { - .name = _("Absorb Bulb"), + .name = ITEM_NAME("Absorb Bulb"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ABSORB_BULB, .holdEffectParam = 0, @@ -8578,8 +8583,8 @@ const struct Item gItemsInfo[] = [ITEM_CELL_BATTERY] = { - .name = _("Cell Battery"), - .pluralName = _("Cell Batteries"), + .name = ITEM_NAME("Cell Battery"), + .pluralName = ITEM_PLURAL_NAME("Cell Batteries"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_CELL_BATTERY, .holdEffectParam = 0, @@ -8598,8 +8603,8 @@ const struct Item gItemsInfo[] = [ITEM_LUMINOUS_MOSS] = { - .name = _("Luminous Moss"), - .pluralName = _("Luminous Moss"), + .name = ITEM_NAME("Luminous Moss"), + .pluralName = ITEM_PLURAL_NAME("Luminous Moss"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), .holdEffect = HOLD_EFFECT_LUMINOUS_MOSS, .holdEffectParam = 0, @@ -8618,7 +8623,7 @@ const struct Item gItemsInfo[] = [ITEM_SNOWBALL] = { - .name = _("Snowball"), + .name = ITEM_NAME("Snowball"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SNOWBALL, .holdEffectParam = 0, @@ -8639,8 +8644,8 @@ const struct Item gItemsInfo[] = [ITEM_BRIGHT_POWDER] = { - .name = _("Bright Powder"), - .pluralName = _("Bright Powder"), + .name = ITEM_NAME("Bright Powder"), + .pluralName = ITEM_PLURAL_NAME("Bright Powder"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 10), .holdEffect = HOLD_EFFECT_EVASION_UP, .holdEffectParam = 10, @@ -8659,7 +8664,7 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_HERB] = { - .name = _("White Herb"), + .name = ITEM_NAME("White Herb"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_WHITE_HERB, .description = COMPOUND_STRING( @@ -8677,7 +8682,7 @@ const struct Item gItemsInfo[] = [ITEM_EXP_SHARE] = { - .name = _("Exp. Share"), + .name = ITEM_NAME("Exp. Share"), .holdEffect = HOLD_EFFECT_EXP_SHARE, #if I_EXP_SHARE_ITEM >= GEN_6 .price = 0, @@ -8703,7 +8708,7 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_CLAW] = { - .name = _("Quick Claw"), + .name = ITEM_NAME("Quick Claw"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_QUICK_CLAW, .holdEffectParam = 20, @@ -8722,7 +8727,7 @@ const struct Item gItemsInfo[] = [ITEM_SOOTHE_BELL] = { - .name = _("Soothe Bell"), + .name = ITEM_NAME("Soothe Bell"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_FRIENDSHIP_UP, .description = COMPOUND_STRING( @@ -8740,7 +8745,7 @@ const struct Item gItemsInfo[] = [ITEM_MENTAL_HERB] = { - .name = _("Mental Herb"), + .name = ITEM_NAME("Mental Herb"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_MENTAL_HERB, .description = COMPOUND_STRING( @@ -8764,7 +8769,7 @@ const struct Item gItemsInfo[] = [ITEM_KINGS_ROCK] = { - .name = _("King's Rock"), + .name = ITEM_NAME("King's Rock"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 5000 : 100), .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, @@ -8781,7 +8786,7 @@ const struct Item gItemsInfo[] = [ITEM_AMULET_COIN] = { - .name = _("Amulet Coin"), + .name = ITEM_NAME("Amulet Coin"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 10000 : 100), .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, @@ -8796,7 +8801,7 @@ const struct Item gItemsInfo[] = [ITEM_CLEANSE_TAG] = { - .name = _("Cleanse Tag"), + .name = ITEM_NAME("Cleanse Tag"), .price = (I_PRICE >= GEN_7) ? 5000 : 200, .holdEffect = HOLD_EFFECT_REPEL, .description = sPureIncenseDesc, @@ -8811,7 +8816,7 @@ const struct Item gItemsInfo[] = [ITEM_SMOKE_BALL] = { - .name = _("Smoke Ball"), + .name = ITEM_NAME("Smoke Ball"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, .description = COMPOUND_STRING( @@ -8829,7 +8834,7 @@ const struct Item gItemsInfo[] = [ITEM_FOCUS_BAND] = { - .name = _("Focus Band"), + .name = ITEM_NAME("Focus Band"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FOCUS_BAND, .holdEffectParam = 10, @@ -8848,7 +8853,7 @@ const struct Item gItemsInfo[] = [ITEM_LUCKY_EGG] = { - .name = _("Lucky Egg"), + .name = ITEM_NAME("Lucky Egg"), .price = (I_PRICE >= GEN_7) ? 10000 : 200, .holdEffect = HOLD_EFFECT_LUCKY_EGG, .description = COMPOUND_STRING( @@ -8866,8 +8871,8 @@ const struct Item gItemsInfo[] = [ITEM_SCOPE_LENS] = { - .name = _("Scope Lens"), - .pluralName = _("Scope Lenses"), + .name = ITEM_NAME("Scope Lens"), + .pluralName = ITEM_PLURAL_NAME("Scope Lenses"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( @@ -8885,8 +8890,8 @@ const struct Item gItemsInfo[] = [ITEM_LEFTOVERS] = { - .name = _("Leftovers"), - .pluralName = _("Leftovers"), + .name = ITEM_NAME("Leftovers"), + .pluralName = ITEM_PLURAL_NAME("Leftovers"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LEFTOVERS, .holdEffectParam = 10, @@ -8905,7 +8910,7 @@ const struct Item gItemsInfo[] = [ITEM_SHELL_BELL] = { - .name = _("Shell Bell"), + .name = ITEM_NAME("Shell Bell"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_SHELL_BELL, .holdEffectParam = 8, @@ -8924,8 +8929,8 @@ const struct Item gItemsInfo[] = [ITEM_WIDE_LENS] = { - .name = _("Wide Lens"), - .pluralName = _("Wide Lenses"), + .name = ITEM_NAME("Wide Lens"), + .pluralName = ITEM_PLURAL_NAME("Wide Lenses"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_WIDE_LENS, .holdEffectParam = 10, @@ -8944,7 +8949,7 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_BAND] = { - .name = _("Muscle Band"), + .name = ITEM_NAME("Muscle Band"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_MUSCLE_BAND, .holdEffectParam = 10, @@ -8963,8 +8968,8 @@ const struct Item gItemsInfo[] = [ITEM_WISE_GLASSES] = { - .name = _("Wise Glasses"), - .pluralName = _("Wise Glasses"), + .name = ITEM_NAME("Wise Glasses"), + .pluralName = ITEM_PLURAL_NAME("Wise Glasses"), .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_WISE_GLASSES, .holdEffectParam = 10, @@ -8983,7 +8988,7 @@ const struct Item gItemsInfo[] = [ITEM_EXPERT_BELT] = { - .name = _("Expert Belt"), + .name = ITEM_NAME("Expert Belt"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EXPERT_BELT, .holdEffectParam = 20, @@ -9002,8 +9007,8 @@ const struct Item gItemsInfo[] = [ITEM_LIGHT_CLAY] = { - .name = _("Light Clay"), - .pluralName = _("Light Clay"), + .name = ITEM_NAME("Light Clay"), + .pluralName = ITEM_PLURAL_NAME("Light Clay"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LIGHT_CLAY, .description = COMPOUND_STRING( @@ -9021,7 +9026,7 @@ const struct Item gItemsInfo[] = [ITEM_LIFE_ORB] = { - .name = _("Life Orb"), + .name = ITEM_NAME("Life Orb"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LIFE_ORB, .description = COMPOUND_STRING( @@ -9039,7 +9044,7 @@ const struct Item gItemsInfo[] = [ITEM_POWER_HERB] = { - .name = _("Power Herb"), + .name = ITEM_NAME("Power Herb"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_POWER_HERB, .description = COMPOUND_STRING( @@ -9057,8 +9062,8 @@ const struct Item gItemsInfo[] = [ITEM_FOCUS_SASH] = { - .name = _("Focus Sash"), - .pluralName = _("Focus Sashes"), + .name = ITEM_NAME("Focus Sash"), + .pluralName = ITEM_PLURAL_NAME("Focus Sashes"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FOCUS_SASH, .description = COMPOUND_STRING( @@ -9076,8 +9081,8 @@ const struct Item gItemsInfo[] = [ITEM_ZOOM_LENS] = { - .name = _("Zoom Lens"), - .pluralName = _("Zoom Lenses"), + .name = ITEM_NAME("Zoom Lens"), + .pluralName = ITEM_PLURAL_NAME("Zoom Lenses"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ZOOM_LENS, .holdEffectParam = 20, @@ -9096,7 +9101,7 @@ const struct Item gItemsInfo[] = [ITEM_METRONOME] = { - .name = _("Metronome"), + .name = ITEM_NAME("Metronome"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_METRONOME, .holdEffectParam = 20, @@ -9115,7 +9120,7 @@ const struct Item gItemsInfo[] = [ITEM_IRON_BALL] = { - .name = _("Iron Ball"), + .name = ITEM_NAME("Iron Ball"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_IRON_BALL, .description = COMPOUND_STRING( @@ -9133,7 +9138,7 @@ const struct Item gItemsInfo[] = [ITEM_LAGGING_TAIL] = { - .name = _("Lagging Tail"), + .name = ITEM_NAME("Lagging Tail"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .description = sFullIncenseDesc, @@ -9148,7 +9153,7 @@ const struct Item gItemsInfo[] = [ITEM_DESTINY_KNOT] = { - .name = _("Destiny Knot"), + .name = ITEM_NAME("Destiny Knot"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_DESTINY_KNOT, .description = COMPOUND_STRING( @@ -9166,8 +9171,8 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_SLUDGE] = { - .name = _("Black Sludge"), - .pluralName = _("Black Sludge"), + .name = ITEM_NAME("Black Sludge"), + .pluralName = ITEM_PLURAL_NAME("Black Sludge"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, .description = COMPOUND_STRING( @@ -9185,7 +9190,7 @@ const struct Item gItemsInfo[] = [ITEM_GRIP_CLAW] = { - .name = _("Grip Claw"), + .name = ITEM_NAME("Grip Claw"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_GRIP_CLAW, .description = COMPOUND_STRING( @@ -9203,7 +9208,7 @@ const struct Item gItemsInfo[] = [ITEM_STICKY_BARB] = { - .name = _("Sticky Barb"), + .name = ITEM_NAME("Sticky Barb"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_STICKY_BARB, .description = COMPOUND_STRING( @@ -9221,7 +9226,7 @@ const struct Item gItemsInfo[] = [ITEM_SHED_SHELL] = { - .name = _("Shed Shell"), + .name = ITEM_NAME("Shed Shell"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), .holdEffect = HOLD_EFFECT_SHED_SHELL, .description = COMPOUND_STRING( @@ -9239,7 +9244,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_ROOT] = { - .name = _("Big Root"), + .name = ITEM_NAME("Big Root"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BIG_ROOT, .holdEffectParam = 30, @@ -9258,7 +9263,7 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_CLAW] = { - .name = _("Razor Claw"), + .name = ITEM_NAME("Razor Claw"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( @@ -9277,7 +9282,7 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_FANG] = { - .name = _("Razor Fang"), + .name = ITEM_NAME("Razor Fang"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, @@ -9294,7 +9299,7 @@ const struct Item gItemsInfo[] = [ITEM_EVIOLITE] = { - .name = _("Eviolite"), + .name = ITEM_NAME("Eviolite"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EVIOLITE, .holdEffectParam = 50, @@ -9313,7 +9318,7 @@ const struct Item gItemsInfo[] = [ITEM_FLOAT_STONE] = { - .name = _("Float Stone"), + .name = ITEM_NAME("Float Stone"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_FLOAT_STONE, .description = COMPOUND_STRING( @@ -9331,7 +9336,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCKY_HELMET] = { - .name = _("Rocky Helmet"), + .name = ITEM_NAME("Rocky Helmet"), .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_ROCKY_HELMET, .holdEffectParam = 0, @@ -9350,7 +9355,7 @@ const struct Item gItemsInfo[] = [ITEM_AIR_BALLOON] = { - .name = _("Air Balloon"), + .name = ITEM_NAME("Air Balloon"), .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_AIR_BALLOON, .holdEffectParam = 0, @@ -9369,7 +9374,7 @@ const struct Item gItemsInfo[] = [ITEM_RED_CARD] = { - .name = _("Red Card"), + .name = ITEM_NAME("Red Card"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_RED_CARD, .holdEffectParam = 0, @@ -9388,7 +9393,7 @@ const struct Item gItemsInfo[] = [ITEM_RING_TARGET] = { - .name = _("Ring Target"), + .name = ITEM_NAME("Ring Target"), .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_RING_TARGET, .holdEffectParam = 0, @@ -9407,7 +9412,7 @@ const struct Item gItemsInfo[] = [ITEM_BINDING_BAND] = { - .name = _("Binding Band"), + .name = ITEM_NAME("Binding Band"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_BINDING_BAND, .description = COMPOUND_STRING( @@ -9425,7 +9430,7 @@ const struct Item gItemsInfo[] = [ITEM_EJECT_BUTTON] = { - .name = _("Eject Button"), + .name = ITEM_NAME("Eject Button"), .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), .holdEffect = HOLD_EFFECT_EJECT_BUTTON, .holdEffectParam = 0, @@ -9444,8 +9449,8 @@ const struct Item gItemsInfo[] = [ITEM_WEAKNESS_POLICY] = { - .name = _("Weakness Policy"), - .pluralName = _("Weakness Policies"), + .name = ITEM_NAME("Weakness Policy"), + .pluralName = ITEM_PLURAL_NAME("Weakness Policies"), .price = (I_PRICE >= GEN_9) ? 50000 : 1000, .holdEffect = HOLD_EFFECT_WEAKNESS_POLICY, .holdEffectParam = 0, @@ -9464,7 +9469,7 @@ const struct Item gItemsInfo[] = [ITEM_ASSAULT_VEST] = { - .name = _("Assault Vest"), + .name = ITEM_NAME("Assault Vest"), .price = (I_PRICE >= GEN_9) ? 50000 : 1000, .holdEffect = HOLD_EFFECT_ASSAULT_VEST, .holdEffectParam = 50, @@ -9483,8 +9488,8 @@ const struct Item gItemsInfo[] = [ITEM_SAFETY_GOGGLES] = { - .name = _("Safety Goggles"), - .pluralName = _("Safety Goggles"), + .name = ITEM_NAME("Safety Goggles"), + .pluralName = ITEM_PLURAL_NAME("Safety Goggles"), .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), .holdEffect = HOLD_EFFECT_SAFETY_GOGGLES, .description = COMPOUND_STRING( @@ -9502,7 +9507,7 @@ const struct Item gItemsInfo[] = [ITEM_ADRENALINE_ORB] = { - .name = _("Adrenaline Orb"), + .name = ITEM_NAME("Adrenaline Orb"), .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_8) ? 4000 : 300), .holdEffect = HOLD_EFFECT_ADRENALINE_ORB, .description = COMPOUND_STRING( @@ -9520,7 +9525,7 @@ const struct Item gItemsInfo[] = [ITEM_TERRAIN_EXTENDER] = { - .name = _("Terrain Extender"), + .name = ITEM_NAME("Terrain Extender"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_TERRAIN_EXTENDER, .description = COMPOUND_STRING( @@ -9538,8 +9543,8 @@ const struct Item gItemsInfo[] = [ITEM_PROTECTIVE_PADS] = { - .name = _("Protective Pads"), - .pluralName = _("Protective Pads"), + .name = ITEM_NAME("Protective Pads"), + .pluralName = ITEM_PLURAL_NAME("Protective Pads"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, .description = COMPOUND_STRING( @@ -9557,7 +9562,7 @@ const struct Item gItemsInfo[] = [ITEM_THROAT_SPRAY] = { - .name = _("Throat Spray"), + .name = ITEM_NAME("Throat Spray"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_THROAT_SPRAY, .description = COMPOUND_STRING( @@ -9575,7 +9580,7 @@ const struct Item gItemsInfo[] = [ITEM_EJECT_PACK] = { - .name = _("Eject Pack"), + .name = ITEM_NAME("Eject Pack"), .price = (I_PRICE >= GEN_9) ? 30000 : 4000, .holdEffect = HOLD_EFFECT_EJECT_PACK, .description = COMPOUND_STRING( @@ -9593,8 +9598,8 @@ const struct Item gItemsInfo[] = [ITEM_HEAVY_DUTY_BOOTS] = { - .name = _("Heavy-Duty Boots"), - .pluralName = _("Heavy-Duty Boots"), + .name = ITEM_NAME("Heavy-Duty Boots"), + .pluralName = ITEM_PLURAL_NAME("Heavy-Duty Boots"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_HEAVY_DUTY_BOOTS, .description = COMPOUND_STRING( @@ -9612,8 +9617,8 @@ const struct Item gItemsInfo[] = [ITEM_BLUNDER_POLICY] = { - .name = _("Blunder Policy"), - .pluralName = _("Blunder Policies"), + .name = ITEM_NAME("Blunder Policy"), + .pluralName = ITEM_PLURAL_NAME("Blunder Policies"), .price = (I_PRICE >= GEN_9) ? 30000 : 4000, .holdEffect = HOLD_EFFECT_BLUNDER_POLICY, .description = COMPOUND_STRING( @@ -9631,7 +9636,7 @@ const struct Item gItemsInfo[] = [ITEM_ROOM_SERVICE] = { - .name = _("Room Service"), + .name = ITEM_NAME("Room Service"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, .holdEffect = HOLD_EFFECT_ROOM_SERVICE, .description = COMPOUND_STRING( @@ -9649,7 +9654,7 @@ const struct Item gItemsInfo[] = [ITEM_UTILITY_UMBRELLA] = { - .name = _("Utility Umbrella"), + .name = ITEM_NAME("Utility Umbrella"), .price = (I_PRICE >= GEN_9) ? 15000 : 4000, .holdEffect = HOLD_EFFECT_UTILITY_UMBRELLA, .description = COMPOUND_STRING( @@ -9669,8 +9674,8 @@ const struct Item gItemsInfo[] = [ITEM_CHERI_BERRY] = { - .name = _("Cheri Berry"), - .pluralName = _("Cheri Berries"), + .name = ITEM_NAME("Cheri Berry"), + .pluralName = ITEM_PLURAL_NAME("Cheri Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_PAR, .description = COMPOUND_STRING( @@ -9689,8 +9694,8 @@ const struct Item gItemsInfo[] = [ITEM_CHESTO_BERRY] = { - .name = _("Chesto Berry"), - .pluralName = _("Chesto Berries"), + .name = ITEM_NAME("Chesto Berry"), + .pluralName = ITEM_PLURAL_NAME("Chesto Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_SLP, .description = COMPOUND_STRING( @@ -9709,8 +9714,8 @@ const struct Item gItemsInfo[] = [ITEM_PECHA_BERRY] = { - .name = _("Pecha Berry"), - .pluralName = _("Pecha Berries"), + .name = ITEM_NAME("Pecha Berry"), + .pluralName = ITEM_PLURAL_NAME("Pecha Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_PSN, .description = COMPOUND_STRING( @@ -9729,8 +9734,8 @@ const struct Item gItemsInfo[] = [ITEM_RAWST_BERRY] = { - .name = _("Rawst Berry"), - .pluralName = _("Rawst Berries"), + .name = ITEM_NAME("Rawst Berry"), + .pluralName = ITEM_PLURAL_NAME("Rawst Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_BRN, .description = COMPOUND_STRING( @@ -9749,8 +9754,8 @@ const struct Item gItemsInfo[] = [ITEM_ASPEAR_BERRY] = { - .name = _("Aspear Berry"), - .pluralName = _("Aspear Berries"), + .name = ITEM_NAME("Aspear Berry"), + .pluralName = ITEM_PLURAL_NAME("Aspear Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_FRZ, .description = COMPOUND_STRING( @@ -9769,8 +9774,8 @@ const struct Item gItemsInfo[] = [ITEM_LEPPA_BERRY] = { - .name = _("Leppa Berry"), - .pluralName = _("Leppa Berries"), + .name = ITEM_NAME("Leppa Berry"), + .pluralName = ITEM_PLURAL_NAME("Leppa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESTORE_PP, .holdEffectParam = 10, @@ -9790,8 +9795,8 @@ const struct Item gItemsInfo[] = [ITEM_ORAN_BERRY] = { - .name = _("Oran Berry"), - .pluralName = _("Oran Berries"), + .name = ITEM_NAME("Oran Berry"), + .pluralName = ITEM_PLURAL_NAME("Oran Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, .holdEffectParam = 10, @@ -9811,8 +9816,8 @@ const struct Item gItemsInfo[] = [ITEM_PERSIM_BERRY] = { - .name = _("Persim Berry"), - .pluralName = _("Persim Berries"), + .name = ITEM_NAME("Persim Berry"), + .pluralName = ITEM_PLURAL_NAME("Persim Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_CONFUSION, .description = COMPOUND_STRING( @@ -9831,8 +9836,8 @@ const struct Item gItemsInfo[] = [ITEM_LUM_BERRY] = { - .name = _("Lum Berry"), - .pluralName = _("Lum Berries"), + .name = ITEM_NAME("Lum Berry"), + .pluralName = ITEM_PLURAL_NAME("Lum Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CURE_STATUS, .description = COMPOUND_STRING( @@ -9851,8 +9856,8 @@ const struct Item gItemsInfo[] = [ITEM_SITRUS_BERRY] = { - .name = _("Sitrus Berry"), - .pluralName = _("Sitrus Berries"), + .name = ITEM_NAME("Sitrus Berry"), + .pluralName = ITEM_PLURAL_NAME("Sitrus Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, #if I_SITRUS_BERRY_HEAL >= GEN_4 .holdEffect = HOLD_EFFECT_RESTORE_PCT_HP, @@ -9881,8 +9886,8 @@ const struct Item gItemsInfo[] = [ITEM_FIGY_BERRY] = { - .name = _("Figy Berry"), - .pluralName = _("Figy Berries"), + .name = ITEM_NAME("Figy Berry"), + .pluralName = ITEM_PLURAL_NAME("Figy Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SPICY, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9897,8 +9902,8 @@ const struct Item gItemsInfo[] = [ITEM_WIKI_BERRY] = { - .name = _("Wiki Berry"), - .pluralName = _("Wiki Berries"), + .name = ITEM_NAME("Wiki Berry"), + .pluralName = ITEM_PLURAL_NAME("Wiki Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_DRY, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9913,8 +9918,8 @@ const struct Item gItemsInfo[] = [ITEM_MAGO_BERRY] = { - .name = _("Mago Berry"), - .pluralName = _("Mago Berries"), + .name = ITEM_NAME("Mago Berry"), + .pluralName = ITEM_PLURAL_NAME("Mago Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SWEET, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9929,8 +9934,8 @@ const struct Item gItemsInfo[] = [ITEM_AGUAV_BERRY] = { - .name = _("Aguav Berry"), - .pluralName = _("Aguav Berries"), + .name = ITEM_NAME("Aguav Berry"), + .pluralName = ITEM_PLURAL_NAME("Aguav Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_BITTER, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9945,8 +9950,8 @@ const struct Item gItemsInfo[] = [ITEM_IAPAPA_BERRY] = { - .name = _("Iapapa Berry"), - .pluralName = _("Iapapa Berries"), + .name = ITEM_NAME("Iapapa Berry"), + .pluralName = ITEM_PLURAL_NAME("Iapapa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CONFUSE_SOUR, .holdEffectParam = CONFUSE_BERRY_HEAL_FRACTION, @@ -9961,8 +9966,8 @@ const struct Item gItemsInfo[] = [ITEM_RAZZ_BERRY] = { - .name = _("Razz Berry"), - .pluralName = _("Razz Berries"), + .name = ITEM_NAME("Razz Berry"), + .pluralName = ITEM_PLURAL_NAME("Razz Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9978,8 +9983,8 @@ const struct Item gItemsInfo[] = [ITEM_BLUK_BERRY] = { - .name = _("Bluk Berry"), - .pluralName = _("Bluk Berries"), + .name = ITEM_NAME("Bluk Berry"), + .pluralName = ITEM_PLURAL_NAME("Bluk Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -9995,8 +10000,8 @@ const struct Item gItemsInfo[] = [ITEM_NANAB_BERRY] = { - .name = _("Nanab Berry"), - .pluralName = _("Nanab Berries"), + .name = ITEM_NAME("Nanab Berry"), + .pluralName = ITEM_PLURAL_NAME("Nanab Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10012,8 +10017,8 @@ const struct Item gItemsInfo[] = [ITEM_WEPEAR_BERRY] = { - .name = _("Wepear Berry"), - .pluralName = _("Wepear Berries"), + .name = ITEM_NAME("Wepear Berry"), + .pluralName = ITEM_PLURAL_NAME("Wepear Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10029,8 +10034,8 @@ const struct Item gItemsInfo[] = [ITEM_PINAP_BERRY] = { - .name = _("Pinap Berry"), - .pluralName = _("Pinap Berries"), + .name = ITEM_NAME("Pinap Berry"), + .pluralName = ITEM_PLURAL_NAME("Pinap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10046,8 +10051,8 @@ const struct Item gItemsInfo[] = [ITEM_POMEG_BERRY] = { - .name = _("Pomeg Berry"), - .pluralName = _("Pomeg Berries"), + .name = ITEM_NAME("Pomeg Berry"), + .pluralName = ITEM_PLURAL_NAME("Pomeg Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10064,8 +10069,8 @@ const struct Item gItemsInfo[] = [ITEM_KELPSY_BERRY] = { - .name = _("Kelpsy Berry"), - .pluralName = _("Kelpsy Berries"), + .name = ITEM_NAME("Kelpsy Berry"), + .pluralName = ITEM_PLURAL_NAME("Kelpsy Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10082,8 +10087,8 @@ const struct Item gItemsInfo[] = [ITEM_QUALOT_BERRY] = { - .name = _("Qualot Berry"), - .pluralName = _("Qualot Berries"), + .name = ITEM_NAME("Qualot Berry"), + .pluralName = ITEM_PLURAL_NAME("Qualot Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10100,8 +10105,8 @@ const struct Item gItemsInfo[] = [ITEM_HONDEW_BERRY] = { - .name = _("Hondew Berry"), - .pluralName = _("Hondew Berries"), + .name = ITEM_NAME("Hondew Berry"), + .pluralName = ITEM_PLURAL_NAME("Hondew Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10118,8 +10123,8 @@ const struct Item gItemsInfo[] = [ITEM_GREPA_BERRY] = { - .name = _("Grepa Berry"), - .pluralName = _("Grepa Berries"), + .name = ITEM_NAME("Grepa Berry"), + .pluralName = ITEM_PLURAL_NAME("Grepa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10136,8 +10141,8 @@ const struct Item gItemsInfo[] = [ITEM_TAMATO_BERRY] = { - .name = _("Tamato Berry"), - .pluralName = _("Tamato Berries"), + .name = ITEM_NAME("Tamato Berry"), + .pluralName = ITEM_PLURAL_NAME("Tamato Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "Makes a Pokémon\n" @@ -10154,8 +10159,8 @@ const struct Item gItemsInfo[] = [ITEM_CORNN_BERRY] = { - .name = _("Cornn Berry"), - .pluralName = _("Cornn Berries"), + .name = ITEM_NAME("Cornn Berry"), + .pluralName = ITEM_PLURAL_NAME("Cornn Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10171,8 +10176,8 @@ const struct Item gItemsInfo[] = [ITEM_MAGOST_BERRY] = { - .name = _("Magost Berry"), - .pluralName = _("Magost Berries"), + .name = ITEM_NAME("Magost Berry"), + .pluralName = ITEM_PLURAL_NAME("Magost Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10188,8 +10193,8 @@ const struct Item gItemsInfo[] = [ITEM_RABUTA_BERRY] = { - .name = _("Rabuta Berry"), - .pluralName = _("Rabuta Berries"), + .name = ITEM_NAME("Rabuta Berry"), + .pluralName = ITEM_PLURAL_NAME("Rabuta Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10205,8 +10210,8 @@ const struct Item gItemsInfo[] = [ITEM_NOMEL_BERRY] = { - .name = _("Nomel Berry"), - .pluralName = _("Nomel Berries"), + .name = ITEM_NAME("Nomel Berry"), + .pluralName = ITEM_PLURAL_NAME("Nomel Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10222,8 +10227,8 @@ const struct Item gItemsInfo[] = [ITEM_SPELON_BERRY] = { - .name = _("Spelon Berry"), - .pluralName = _("Spelon Berries"), + .name = ITEM_NAME("Spelon Berry"), + .pluralName = ITEM_PLURAL_NAME("Spelon Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10239,8 +10244,8 @@ const struct Item gItemsInfo[] = [ITEM_PAMTRE_BERRY] = { - .name = _("Pamtre Berry"), - .pluralName = _("Pamtre Berries"), + .name = ITEM_NAME("Pamtre Berry"), + .pluralName = ITEM_PLURAL_NAME("Pamtre Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10256,8 +10261,8 @@ const struct Item gItemsInfo[] = [ITEM_WATMEL_BERRY] = { - .name = _("Watmel Berry"), - .pluralName = _("Watmel Berries"), + .name = ITEM_NAME("Watmel Berry"), + .pluralName = ITEM_PLURAL_NAME("Watmel Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10273,8 +10278,8 @@ const struct Item gItemsInfo[] = [ITEM_DURIN_BERRY] = { - .name = _("Durin Berry"), - .pluralName = _("Durin Berries"), + .name = ITEM_NAME("Durin Berry"), + .pluralName = ITEM_PLURAL_NAME("Durin Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10290,8 +10295,8 @@ const struct Item gItemsInfo[] = [ITEM_BELUE_BERRY] = { - .name = _("Belue Berry"), - .pluralName = _("Belue Berries"), + .name = ITEM_NAME("Belue Berry"), + .pluralName = ITEM_PLURAL_NAME("Belue Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10307,8 +10312,8 @@ const struct Item gItemsInfo[] = [ITEM_CHILAN_BERRY] = { - .name = _("Chilan Berry"), - .pluralName = _("Chilan Berries"), + .name = ITEM_NAME("Chilan Berry"), + .pluralName = ITEM_PLURAL_NAME("Chilan Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_NORMAL, @@ -10326,8 +10331,8 @@ const struct Item gItemsInfo[] = [ITEM_OCCA_BERRY] = { - .name = _("Occa Berry"), - .pluralName = _("Occa Berries"), + .name = ITEM_NAME("Occa Berry"), + .pluralName = ITEM_PLURAL_NAME("Occa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FIRE, @@ -10345,8 +10350,8 @@ const struct Item gItemsInfo[] = [ITEM_PASSHO_BERRY] = { - .name = _("Passho Berry"), - .pluralName = _("Passho Berries"), + .name = ITEM_NAME("Passho Berry"), + .pluralName = ITEM_PLURAL_NAME("Passho Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_WATER, @@ -10364,8 +10369,8 @@ const struct Item gItemsInfo[] = [ITEM_WACAN_BERRY] = { - .name = _("Wacan Berry"), - .pluralName = _("Wacan Berries"), + .name = ITEM_NAME("Wacan Berry"), + .pluralName = ITEM_PLURAL_NAME("Wacan Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ELECTRIC, @@ -10383,8 +10388,8 @@ const struct Item gItemsInfo[] = [ITEM_RINDO_BERRY] = { - .name = _("Rindo Berry"), - .pluralName = _("Rindo Berries"), + .name = ITEM_NAME("Rindo Berry"), + .pluralName = ITEM_PLURAL_NAME("Rindo Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GRASS, @@ -10402,8 +10407,8 @@ const struct Item gItemsInfo[] = [ITEM_YACHE_BERRY] = { - .name = _("Yache Berry"), - .pluralName = _("Yache Berries"), + .name = ITEM_NAME("Yache Berry"), + .pluralName = ITEM_PLURAL_NAME("Yache Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ICE, @@ -10421,8 +10426,8 @@ const struct Item gItemsInfo[] = [ITEM_CHOPLE_BERRY] = { - .name = _("Chople Berry"), - .pluralName = _("Chople Berries"), + .name = ITEM_NAME("Chople Berry"), + .pluralName = ITEM_PLURAL_NAME("Chople Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FIGHTING, @@ -10440,8 +10445,8 @@ const struct Item gItemsInfo[] = [ITEM_KEBIA_BERRY] = { - .name = _("Kebia Berry"), - .pluralName = _("Kebia Berries"), + .name = ITEM_NAME("Kebia Berry"), + .pluralName = ITEM_PLURAL_NAME("Kebia Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_POISON, @@ -10459,8 +10464,8 @@ const struct Item gItemsInfo[] = [ITEM_SHUCA_BERRY] = { - .name = _("Shuca Berry"), - .pluralName = _("Shuca Berries"), + .name = ITEM_NAME("Shuca Berry"), + .pluralName = ITEM_PLURAL_NAME("Shuca Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GROUND, @@ -10478,8 +10483,8 @@ const struct Item gItemsInfo[] = [ITEM_COBA_BERRY] = { - .name = _("Coba Berry"), - .pluralName = _("Coba Berries"), + .name = ITEM_NAME("Coba Berry"), + .pluralName = ITEM_PLURAL_NAME("Coba Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FLYING, @@ -10497,8 +10502,8 @@ const struct Item gItemsInfo[] = [ITEM_PAYAPA_BERRY] = { - .name = _("Payapa Berry"), - .pluralName = _("Payapa Berries"), + .name = ITEM_NAME("Payapa Berry"), + .pluralName = ITEM_PLURAL_NAME("Payapa Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_PSYCHIC, @@ -10516,8 +10521,8 @@ const struct Item gItemsInfo[] = [ITEM_TANGA_BERRY] = { - .name = _("Tanga Berry"), - .pluralName = _("Tanga Berries"), + .name = ITEM_NAME("Tanga Berry"), + .pluralName = ITEM_PLURAL_NAME("Tanga Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_BUG, @@ -10535,8 +10540,8 @@ const struct Item gItemsInfo[] = [ITEM_CHARTI_BERRY] = { - .name = _("Charti Berry"), - .pluralName = _("Charti Berries"), + .name = ITEM_NAME("Charti Berry"), + .pluralName = ITEM_PLURAL_NAME("Charti Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_ROCK, @@ -10554,8 +10559,8 @@ const struct Item gItemsInfo[] = [ITEM_KASIB_BERRY] = { - .name = _("Kasib Berry"), - .pluralName = _("Kasib Berries"), + .name = ITEM_NAME("Kasib Berry"), + .pluralName = ITEM_PLURAL_NAME("Kasib Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_GHOST, @@ -10573,8 +10578,8 @@ const struct Item gItemsInfo[] = [ITEM_HABAN_BERRY] = { - .name = _("Haban Berry"), - .pluralName = _("Haban Berries"), + .name = ITEM_NAME("Haban Berry"), + .pluralName = ITEM_PLURAL_NAME("Haban Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_DRAGON, @@ -10592,8 +10597,8 @@ const struct Item gItemsInfo[] = [ITEM_COLBUR_BERRY] = { - .name = _("Colbur Berry"), - .pluralName = _("Colbur Berries"), + .name = ITEM_NAME("Colbur Berry"), + .pluralName = ITEM_PLURAL_NAME("Colbur Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_DARK, @@ -10611,8 +10616,8 @@ const struct Item gItemsInfo[] = [ITEM_BABIRI_BERRY] = { - .name = _("Babiri Berry"), - .pluralName = _("Babiri Berries"), + .name = ITEM_NAME("Babiri Berry"), + .pluralName = ITEM_PLURAL_NAME("Babiri Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_STEEL, @@ -10630,8 +10635,8 @@ const struct Item gItemsInfo[] = [ITEM_ROSELI_BERRY] = { - .name = _("Roseli Berry"), - .pluralName = _("Roseli Berries"), + .name = ITEM_NAME("Roseli Berry"), + .pluralName = ITEM_PLURAL_NAME("Roseli Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RESIST_BERRY, .holdEffectParam = TYPE_FAIRY, @@ -10649,8 +10654,8 @@ const struct Item gItemsInfo[] = [ITEM_LIECHI_BERRY] = { - .name = _("Liechi Berry"), - .pluralName = _("Liechi Berries"), + .name = ITEM_NAME("Liechi Berry"), + .pluralName = ITEM_PLURAL_NAME("Liechi Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ATTACK_UP, .holdEffectParam = 4, @@ -10668,8 +10673,8 @@ const struct Item gItemsInfo[] = [ITEM_GANLON_BERRY] = { - .name = _("Ganlon Berry"), - .pluralName = _("Ganlon Berries"), + .name = ITEM_NAME("Ganlon Berry"), + .pluralName = ITEM_PLURAL_NAME("Ganlon Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_DEFENSE_UP, .holdEffectParam = 4, @@ -10687,8 +10692,8 @@ const struct Item gItemsInfo[] = [ITEM_SALAC_BERRY] = { - .name = _("Salac Berry"), - .pluralName = _("Salac Berries"), + .name = ITEM_NAME("Salac Berry"), + .pluralName = ITEM_PLURAL_NAME("Salac Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SPEED_UP, .holdEffectParam = 4, @@ -10706,8 +10711,8 @@ const struct Item gItemsInfo[] = [ITEM_PETAYA_BERRY] = { - .name = _("Petaya Berry"), - .pluralName = _("Petaya Berries"), + .name = ITEM_NAME("Petaya Berry"), + .pluralName = ITEM_PLURAL_NAME("Petaya Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SP_ATTACK_UP, .holdEffectParam = 4, @@ -10725,8 +10730,8 @@ const struct Item gItemsInfo[] = [ITEM_APICOT_BERRY] = { - .name = _("Apicot Berry"), - .pluralName = _("Apicot Berries"), + .name = ITEM_NAME("Apicot Berry"), + .pluralName = ITEM_PLURAL_NAME("Apicot Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_SP_DEFENSE_UP, .holdEffectParam = 4, @@ -10744,8 +10749,8 @@ const struct Item gItemsInfo[] = [ITEM_LANSAT_BERRY] = { - .name = _("Lansat Berry"), - .pluralName = _("Lansat Berries"), + .name = ITEM_NAME("Lansat Berry"), + .pluralName = ITEM_PLURAL_NAME("Lansat Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CRITICAL_UP, .holdEffectParam = 4, @@ -10763,8 +10768,8 @@ const struct Item gItemsInfo[] = [ITEM_STARF_BERRY] = { - .name = _("Starf Berry"), - .pluralName = _("Starf Berries"), + .name = ITEM_NAME("Starf Berry"), + .pluralName = ITEM_PLURAL_NAME("Starf Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_RANDOM_STAT_UP, .holdEffectParam = 4, @@ -10782,8 +10787,8 @@ const struct Item gItemsInfo[] = [ITEM_ENIGMA_BERRY] = { - .name = _("Enigma Berry"), - .pluralName = _("Enigma Berries"), + .name = ITEM_NAME("Enigma Berry"), + .pluralName = ITEM_PLURAL_NAME("Enigma Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ENIGMA_BERRY, .description = COMPOUND_STRING( @@ -10800,8 +10805,8 @@ const struct Item gItemsInfo[] = [ITEM_MICLE_BERRY] = { - .name = _("Micle Berry"), - .pluralName = _("Micle Berries"), + .name = ITEM_NAME("Micle Berry"), + .pluralName = ITEM_PLURAL_NAME("Micle Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_MICLE_BERRY, .holdEffectParam = 4, @@ -10819,8 +10824,8 @@ const struct Item gItemsInfo[] = [ITEM_CUSTAP_BERRY] = { - .name = _("Custap Berry"), - .pluralName = _("Custap Berries"), + .name = ITEM_NAME("Custap Berry"), + .pluralName = ITEM_PLURAL_NAME("Custap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_CUSTAP_BERRY, .holdEffectParam = 4, @@ -10838,8 +10843,8 @@ const struct Item gItemsInfo[] = [ITEM_JABOCA_BERRY] = { - .name = _("Jaboca Berry"), - .pluralName = _("Jaboca Berries"), + .name = ITEM_NAME("Jaboca Berry"), + .pluralName = ITEM_PLURAL_NAME("Jaboca Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_JABOCA_BERRY, .description = COMPOUND_STRING( @@ -10856,8 +10861,8 @@ const struct Item gItemsInfo[] = [ITEM_ROWAP_BERRY] = { - .name = _("Rowap Berry"), - .pluralName = _("Rowap Berries"), + .name = ITEM_NAME("Rowap Berry"), + .pluralName = ITEM_PLURAL_NAME("Rowap Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_ROWAP_BERRY, .description = COMPOUND_STRING( @@ -10874,8 +10879,8 @@ const struct Item gItemsInfo[] = [ITEM_KEE_BERRY] = { - .name = _("Kee Berry"), - .pluralName = _("Kee Berries"), + .name = ITEM_NAME("Kee Berry"), + .pluralName = ITEM_PLURAL_NAME("Kee Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_KEE_BERRY, .description = COMPOUND_STRING( @@ -10892,8 +10897,8 @@ const struct Item gItemsInfo[] = [ITEM_MARANGA_BERRY] = { - .name = _("Maranga Berry"), - .pluralName = _("Maranga Berries"), + .name = ITEM_NAME("Maranga Berry"), + .pluralName = ITEM_PLURAL_NAME("Maranga Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .holdEffect = HOLD_EFFECT_MARANGA_BERRY, .description = COMPOUND_STRING( @@ -10910,8 +10915,8 @@ const struct Item gItemsInfo[] = [ITEM_ENIGMA_BERRY_E_READER] = { - .name = _("Enigma Berry"), - .pluralName = _("Enigma Berries"), + .name = ITEM_NAME("Enigma Berry"), + .pluralName = ITEM_PLURAL_NAME("Enigma Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, .description = COMPOUND_STRING( "{POKEBLOCK} ingredient.\n" @@ -10930,7 +10935,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FOCUS_PUNCH] = { - .name = _("TM01"), + .name = ITEM_NAME("TM01"), .price = 3000, .description = COMPOUND_STRING( "Powerful, but makes\n" @@ -10944,7 +10949,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_DRAGON_CLAW] = { - .name = _("TM02"), + .name = ITEM_NAME("TM02"), .price = 3000, .description = COMPOUND_STRING( "Hooks and slashes\n" @@ -10958,7 +10963,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_WATER_PULSE] = { - .name = _("TM03"), + .name = ITEM_NAME("TM03"), .price = 3000, .description = COMPOUND_STRING( "Generates an\n" @@ -10972,7 +10977,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_CALM_MIND] = { - .name = _("TM04"), + .name = ITEM_NAME("TM04"), .price = 3000, .description = COMPOUND_STRING( "Raises Sp. Atk and\n" @@ -10986,7 +10991,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_ROAR] = { - .name = _("TM05"), + .name = ITEM_NAME("TM05"), .price = 1000, .description = COMPOUND_STRING( "A savage roar that\n" @@ -11000,7 +11005,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_TOXIC] = { - .name = _("TM06"), + .name = ITEM_NAME("TM06"), .price = 3000, .description = COMPOUND_STRING( "Poisons the foe\n" @@ -11014,7 +11019,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_HAIL] = { - .name = _("TM07"), + .name = ITEM_NAME("TM07"), .price = 3000, #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW .description = COMPOUND_STRING( @@ -11035,7 +11040,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_BULK_UP] = { - .name = _("TM08"), + .name = ITEM_NAME("TM08"), .price = 3000, .description = COMPOUND_STRING( "Bulks up the body\n" @@ -11049,7 +11054,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_BULLET_SEED] = { - .name = _("TM09"), + .name = ITEM_NAME("TM09"), .price = 3000, .description = COMPOUND_STRING( "Shoots 2 to 5 seeds\n" @@ -11063,7 +11068,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_HIDDEN_POWER] = { - .name = _("TM10"), + .name = ITEM_NAME("TM10"), .price = 3000, .description = COMPOUND_STRING( "The attack power\n" @@ -11077,7 +11082,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SUNNY_DAY] = { - .name = _("TM11"), + .name = ITEM_NAME("TM11"), .price = 2000, .description = COMPOUND_STRING( "Raises the power of\n" @@ -11091,7 +11096,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_TAUNT] = { - .name = _("TM12"), + .name = ITEM_NAME("TM12"), .price = 3000, .description = COMPOUND_STRING( "Enrages the foe so\n" @@ -11105,7 +11110,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_ICE_BEAM] = { - .name = _("TM13"), + .name = ITEM_NAME("TM13"), .price = 3000, .description = COMPOUND_STRING( "Fires an icy cold\n" @@ -11123,7 +11128,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_BLIZZARD] = { - .name = _("TM14"), + .name = ITEM_NAME("TM14"), .price = 5500, .description = COMPOUND_STRING( #if B_USE_FROSTBITE == TRUE @@ -11143,7 +11148,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_HYPER_BEAM] = { - .name = _("TM15"), + .name = ITEM_NAME("TM15"), .price = 7500, .description = COMPOUND_STRING( "Powerful, but needs\n" @@ -11157,7 +11162,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_LIGHT_SCREEN] = { - .name = _("TM16"), + .name = ITEM_NAME("TM16"), .price = 3000, .description = COMPOUND_STRING( "Creates a wall of\n" @@ -11171,7 +11176,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_PROTECT] = { - .name = _("TM17"), + .name = ITEM_NAME("TM17"), .price = 3000, .description = COMPOUND_STRING( "Negates all damage,\n" @@ -11185,7 +11190,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_RAIN_DANCE] = { - .name = _("TM18"), + .name = ITEM_NAME("TM18"), .price = 2000, .description = COMPOUND_STRING( "Raises the power of\n" @@ -11199,7 +11204,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_GIGA_DRAIN] = { - .name = _("TM19"), + .name = ITEM_NAME("TM19"), .price = 3000, .description = COMPOUND_STRING( "Recovers half the\n" @@ -11213,7 +11218,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SAFEGUARD] = { - .name = _("TM20"), + .name = ITEM_NAME("TM20"), .price = 3000, .description = COMPOUND_STRING( "Prevents status\n" @@ -11227,7 +11232,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FRUSTRATION] = { - .name = _("TM21"), + .name = ITEM_NAME("TM21"), .price = 1000, .description = COMPOUND_STRING( "The less the user\n" @@ -11241,7 +11246,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SOLAR_BEAM] = { - .name = _("TM22"), + .name = ITEM_NAME("TM22"), .price = 3000, .description = COMPOUND_STRING( "Absorbs sunlight in\n" @@ -11255,7 +11260,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_IRON_TAIL] = { - .name = _("TM23"), + .name = ITEM_NAME("TM23"), .price = 3000, .description = COMPOUND_STRING( "Slams the foe with\n" @@ -11269,7 +11274,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_THUNDERBOLT] = { - .name = _("TM24"), + .name = ITEM_NAME("TM24"), .price = 3000, .description = COMPOUND_STRING( "A powerful electric\n" @@ -11283,7 +11288,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_THUNDER] = { - .name = _("TM25"), + .name = ITEM_NAME("TM25"), .price = 5500, .description = COMPOUND_STRING( "Strikes the foe\n" @@ -11297,7 +11302,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_EARTHQUAKE] = { - .name = _("TM26"), + .name = ITEM_NAME("TM26"), .price = 3000, .description = COMPOUND_STRING( "Causes a quake\n" @@ -11311,7 +11316,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_RETURN] = { - .name = _("TM27"), + .name = ITEM_NAME("TM27"), .price = 1000, .description = COMPOUND_STRING( "The more the user\n" @@ -11325,7 +11330,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_DIG] = { - .name = _("TM28"), + .name = ITEM_NAME("TM28"), .price = 2000, .description = COMPOUND_STRING( "Digs underground\n" @@ -11339,7 +11344,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_PSYCHIC] = { - .name = _("TM29"), + .name = ITEM_NAME("TM29"), .price = 2000, .description = COMPOUND_STRING( "A powerful psychic\n" @@ -11353,7 +11358,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SHADOW_BALL] = { - .name = _("TM30"), + .name = ITEM_NAME("TM30"), .price = 3000, .description = COMPOUND_STRING( "Hurls a dark lump\n" @@ -11367,7 +11372,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_BRICK_BREAK] = { - .name = _("TM31"), + .name = ITEM_NAME("TM31"), .price = 3000, .description = COMPOUND_STRING( "Destroys barriers\n" @@ -11381,7 +11386,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_DOUBLE_TEAM] = { - .name = _("TM32"), + .name = ITEM_NAME("TM32"), .price = 2000, .description = COMPOUND_STRING( "Creates illusory\n" @@ -11395,7 +11400,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_REFLECT] = { - .name = _("TM33"), + .name = ITEM_NAME("TM33"), .price = 3000, .description = COMPOUND_STRING( "Creates a wall of\n" @@ -11409,7 +11414,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SHOCK_WAVE] = { - .name = _("TM34"), + .name = ITEM_NAME("TM34"), .price = 3000, .description = COMPOUND_STRING( "Zaps the foe with a\n" @@ -11423,7 +11428,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FLAMETHROWER] = { - .name = _("TM35"), + .name = ITEM_NAME("TM35"), .price = 3000, .description = COMPOUND_STRING( "Looses a stream of\n" @@ -11437,7 +11442,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SLUDGE_BOMB] = { - .name = _("TM36"), + .name = ITEM_NAME("TM36"), .price = 1000, .description = COMPOUND_STRING( "Hurls sludge at the\n" @@ -11451,7 +11456,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SANDSTORM] = { - .name = _("TM37"), + .name = ITEM_NAME("TM37"), .price = 2000, .description = COMPOUND_STRING( "Causes a sandstorm\n" @@ -11465,7 +11470,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FIRE_BLAST] = { - .name = _("TM38"), + .name = ITEM_NAME("TM38"), .price = 5500, .description = COMPOUND_STRING( "A powerful fire\n" @@ -11479,7 +11484,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_ROCK_TOMB] = { - .name = _("TM39"), + .name = ITEM_NAME("TM39"), .price = 3000, .description = COMPOUND_STRING( "Stops the foe from\n" @@ -11493,7 +11498,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_AERIAL_ACE] = { - .name = _("TM40"), + .name = ITEM_NAME("TM40"), .price = 3000, .description = COMPOUND_STRING( "An extremely fast\n" @@ -11507,7 +11512,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_TORMENT] = { - .name = _("TM41"), + .name = ITEM_NAME("TM41"), .price = 3000, .description = COMPOUND_STRING( "Prevents the foe\n" @@ -11521,7 +11526,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_FACADE] = { - .name = _("TM42"), + .name = ITEM_NAME("TM42"), .price = 3000, .description = COMPOUND_STRING( "Raises Attack when\n" @@ -11535,7 +11540,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SECRET_POWER] = { - .name = _("TM43"), + .name = ITEM_NAME("TM43"), .price = 3000, .description = COMPOUND_STRING( "Adds an effect to\n" @@ -11549,7 +11554,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_REST] = { - .name = _("TM44"), + .name = ITEM_NAME("TM44"), .price = 3000, .description = COMPOUND_STRING( "The user sleeps for\n" @@ -11563,7 +11568,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_ATTRACT] = { - .name = _("TM45"), + .name = ITEM_NAME("TM45"), .price = 3000, .description = COMPOUND_STRING( "Makes it tough to\n" @@ -11577,7 +11582,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_THIEF] = { - .name = _("TM46"), + .name = ITEM_NAME("TM46"), .price = 3000, .description = COMPOUND_STRING( "While attacking,\n" @@ -11591,7 +11596,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_STEEL_WING] = { - .name = _("TM47"), + .name = ITEM_NAME("TM47"), .price = 3000, .description = COMPOUND_STRING( "Spreads hard-\n" @@ -11605,7 +11610,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SKILL_SWAP] = { - .name = _("TM48"), + .name = ITEM_NAME("TM48"), .price = 3000, .description = COMPOUND_STRING( "Switches abilities\n" @@ -11619,7 +11624,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_SNATCH] = { - .name = _("TM49"), + .name = ITEM_NAME("TM49"), .price = 3000, .description = COMPOUND_STRING( "Steals the effects\n" @@ -11633,7 +11638,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_OVERHEAT] = { - .name = _("TM50"), + .name = ITEM_NAME("TM50"), .price = 3000, .description = COMPOUND_STRING( "Enables full-power\n" @@ -11647,7 +11652,7 @@ const struct Item gItemsInfo[] = [ITEM_TM51] = { - .name = _("TM51"), + .name = ITEM_NAME("TM51"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11658,7 +11663,7 @@ const struct Item gItemsInfo[] = [ITEM_TM52] = { - .name = _("TM52"), + .name = ITEM_NAME("TM52"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11669,7 +11674,7 @@ const struct Item gItemsInfo[] = [ITEM_TM53] = { - .name = _("TM53"), + .name = ITEM_NAME("TM53"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11680,7 +11685,7 @@ const struct Item gItemsInfo[] = [ITEM_TM54] = { - .name = _("TM54"), + .name = ITEM_NAME("TM54"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11691,7 +11696,7 @@ const struct Item gItemsInfo[] = [ITEM_TM55] = { - .name = _("TM55"), + .name = ITEM_NAME("TM55"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11702,7 +11707,7 @@ const struct Item gItemsInfo[] = [ITEM_TM56] = { - .name = _("TM56"), + .name = ITEM_NAME("TM56"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11713,7 +11718,7 @@ const struct Item gItemsInfo[] = [ITEM_TM57] = { - .name = _("TM57"), + .name = ITEM_NAME("TM57"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11724,7 +11729,7 @@ const struct Item gItemsInfo[] = [ITEM_TM58] = { - .name = _("TM58"), + .name = ITEM_NAME("TM58"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11735,7 +11740,7 @@ const struct Item gItemsInfo[] = [ITEM_TM59] = { - .name = _("TM59"), + .name = ITEM_NAME("TM59"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11746,7 +11751,7 @@ const struct Item gItemsInfo[] = [ITEM_TM60] = { - .name = _("TM60"), + .name = ITEM_NAME("TM60"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11757,7 +11762,7 @@ const struct Item gItemsInfo[] = [ITEM_TM61] = { - .name = _("TM61"), + .name = ITEM_NAME("TM61"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11768,7 +11773,7 @@ const struct Item gItemsInfo[] = [ITEM_TM62] = { - .name = _("TM62"), + .name = ITEM_NAME("TM62"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11779,7 +11784,7 @@ const struct Item gItemsInfo[] = [ITEM_TM63] = { - .name = _("TM63"), + .name = ITEM_NAME("TM63"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11790,7 +11795,7 @@ const struct Item gItemsInfo[] = [ITEM_TM64] = { - .name = _("TM64"), + .name = ITEM_NAME("TM64"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11801,7 +11806,7 @@ const struct Item gItemsInfo[] = [ITEM_TM65] = { - .name = _("TM65"), + .name = ITEM_NAME("TM65"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11812,7 +11817,7 @@ const struct Item gItemsInfo[] = [ITEM_TM66] = { - .name = _("TM66"), + .name = ITEM_NAME("TM66"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11823,7 +11828,7 @@ const struct Item gItemsInfo[] = [ITEM_TM67] = { - .name = _("TM67"), + .name = ITEM_NAME("TM67"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11834,7 +11839,7 @@ const struct Item gItemsInfo[] = [ITEM_TM68] = { - .name = _("TM68"), + .name = ITEM_NAME("TM68"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11845,7 +11850,7 @@ const struct Item gItemsInfo[] = [ITEM_TM69] = { - .name = _("TM69"), + .name = ITEM_NAME("TM69"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11856,7 +11861,7 @@ const struct Item gItemsInfo[] = [ITEM_TM70] = { - .name = _("TM70"), + .name = ITEM_NAME("TM70"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11867,7 +11872,7 @@ const struct Item gItemsInfo[] = [ITEM_TM71] = { - .name = _("TM71"), + .name = ITEM_NAME("TM71"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11878,7 +11883,7 @@ const struct Item gItemsInfo[] = [ITEM_TM72] = { - .name = _("TM72"), + .name = ITEM_NAME("TM72"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11889,7 +11894,7 @@ const struct Item gItemsInfo[] = [ITEM_TM73] = { - .name = _("TM73"), + .name = ITEM_NAME("TM73"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11900,7 +11905,7 @@ const struct Item gItemsInfo[] = [ITEM_TM74] = { - .name = _("TM74"), + .name = ITEM_NAME("TM74"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11911,7 +11916,7 @@ const struct Item gItemsInfo[] = [ITEM_TM75] = { - .name = _("TM75"), + .name = ITEM_NAME("TM75"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11922,7 +11927,7 @@ const struct Item gItemsInfo[] = [ITEM_TM76] = { - .name = _("TM76"), + .name = ITEM_NAME("TM76"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11933,7 +11938,7 @@ const struct Item gItemsInfo[] = [ITEM_TM77] = { - .name = _("TM77"), + .name = ITEM_NAME("TM77"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11944,7 +11949,7 @@ const struct Item gItemsInfo[] = [ITEM_TM78] = { - .name = _("TM78"), + .name = ITEM_NAME("TM78"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11955,7 +11960,7 @@ const struct Item gItemsInfo[] = [ITEM_TM79] = { - .name = _("TM79"), + .name = ITEM_NAME("TM79"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11966,7 +11971,7 @@ const struct Item gItemsInfo[] = [ITEM_TM80] = { - .name = _("TM80"), + .name = ITEM_NAME("TM80"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11977,7 +11982,7 @@ const struct Item gItemsInfo[] = [ITEM_TM81] = { - .name = _("TM81"), + .name = ITEM_NAME("TM81"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11988,7 +11993,7 @@ const struct Item gItemsInfo[] = [ITEM_TM82] = { - .name = _("TM82"), + .name = ITEM_NAME("TM82"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -11999,7 +12004,7 @@ const struct Item gItemsInfo[] = [ITEM_TM83] = { - .name = _("TM83"), + .name = ITEM_NAME("TM83"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12010,7 +12015,7 @@ const struct Item gItemsInfo[] = [ITEM_TM84] = { - .name = _("TM84"), + .name = ITEM_NAME("TM84"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12021,7 +12026,7 @@ const struct Item gItemsInfo[] = [ITEM_TM85] = { - .name = _("TM85"), + .name = ITEM_NAME("TM85"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12032,7 +12037,7 @@ const struct Item gItemsInfo[] = [ITEM_TM86] = { - .name = _("TM86"), + .name = ITEM_NAME("TM86"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12043,7 +12048,7 @@ const struct Item gItemsInfo[] = [ITEM_TM87] = { - .name = _("TM87"), + .name = ITEM_NAME("TM87"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12054,7 +12059,7 @@ const struct Item gItemsInfo[] = [ITEM_TM88] = { - .name = _("TM88"), + .name = ITEM_NAME("TM88"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12065,7 +12070,7 @@ const struct Item gItemsInfo[] = [ITEM_TM89] = { - .name = _("TM89"), + .name = ITEM_NAME("TM89"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12076,7 +12081,7 @@ const struct Item gItemsInfo[] = [ITEM_TM90] = { - .name = _("TM90"), + .name = ITEM_NAME("TM90"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12087,7 +12092,7 @@ const struct Item gItemsInfo[] = [ITEM_TM91] = { - .name = _("TM91"), + .name = ITEM_NAME("TM91"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12098,7 +12103,7 @@ const struct Item gItemsInfo[] = [ITEM_TM92] = { - .name = _("TM92"), + .name = ITEM_NAME("TM92"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12109,7 +12114,7 @@ const struct Item gItemsInfo[] = [ITEM_TM93] = { - .name = _("TM93"), + .name = ITEM_NAME("TM93"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12120,7 +12125,7 @@ const struct Item gItemsInfo[] = [ITEM_TM94] = { - .name = _("TM94"), + .name = ITEM_NAME("TM94"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12131,7 +12136,7 @@ const struct Item gItemsInfo[] = [ITEM_TM95] = { - .name = _("TM95"), + .name = ITEM_NAME("TM95"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12142,7 +12147,7 @@ const struct Item gItemsInfo[] = [ITEM_TM96] = { - .name = _("TM96"), + .name = ITEM_NAME("TM96"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12153,7 +12158,7 @@ const struct Item gItemsInfo[] = [ITEM_TM97] = { - .name = _("TM97"), + .name = ITEM_NAME("TM97"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12164,7 +12169,7 @@ const struct Item gItemsInfo[] = [ITEM_TM98] = { - .name = _("TM98"), + .name = ITEM_NAME("TM98"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12175,7 +12180,7 @@ const struct Item gItemsInfo[] = [ITEM_TM99] = { - .name = _("TM99"), + .name = ITEM_NAME("TM99"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12186,7 +12191,7 @@ const struct Item gItemsInfo[] = [ITEM_TM100] = { - .name = _("TM100"), + .name = ITEM_NAME("TM100"), .price = 3000, .description = sQuestionMarksDesc, // Todo .importance = I_REUSABLE_TMS, @@ -12197,7 +12202,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_CUT] = { - .name = _("HM01"), + .name = ITEM_NAME("HM01"), .price = 0, .description = COMPOUND_STRING( "Attacks the foe\n" @@ -12211,7 +12216,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_FLY] = { - .name = _("HM02"), + .name = ITEM_NAME("HM02"), .price = 0, .description = COMPOUND_STRING( "Flies up on the\n" @@ -12225,7 +12230,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_SURF] = { - .name = _("HM03"), + .name = ITEM_NAME("HM03"), .price = 0, .description = COMPOUND_STRING( "Creates a huge\n" @@ -12239,7 +12244,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_STRENGTH] = { - .name = _("HM04"), + .name = ITEM_NAME("HM04"), .price = 0, .description = COMPOUND_STRING( "Builds enormous\n" @@ -12253,7 +12258,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_FLASH] = { - .name = _("HM05"), + .name = ITEM_NAME("HM05"), .price = 0, .description = COMPOUND_STRING( "Looses a powerful\n" @@ -12267,7 +12272,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_ROCK_SMASH] = { - .name = _("HM06"), + .name = ITEM_NAME("HM06"), .price = 0, .description = COMPOUND_STRING( "A rock-crushingly\n" @@ -12281,7 +12286,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_WATERFALL] = { - .name = _("HM07"), + .name = ITEM_NAME("HM07"), .price = 0, .description = COMPOUND_STRING( "Attacks the foe\n" @@ -12295,7 +12300,7 @@ const struct Item gItemsInfo[] = [ITEM_HM_DIVE] = { - .name = _("HM08"), + .name = ITEM_NAME("HM08"), .price = 0, .description = COMPOUND_STRING( "Dives underwater\n" @@ -12312,7 +12317,7 @@ const struct Item gItemsInfo[] = [ITEM_OVAL_CHARM] = { - .name = _("Oval Charm"), + .name = ITEM_NAME("Oval Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12328,7 +12333,7 @@ const struct Item gItemsInfo[] = [ITEM_SHINY_CHARM] = { - .name = _("Shiny Charm"), + .name = ITEM_NAME("Shiny Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12344,7 +12349,7 @@ const struct Item gItemsInfo[] = [ITEM_CATCHING_CHARM] = { - .name = _("Catching Charm"), + .name = ITEM_NAME("Catching Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12360,7 +12365,7 @@ const struct Item gItemsInfo[] = [ITEM_EXP_CHARM] = { - .name = _("Exp. Charm"), + .name = ITEM_NAME("Exp. Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12378,7 +12383,7 @@ const struct Item gItemsInfo[] = [ITEM_ROTOM_CATALOG] = { - .name = _("Rotom Catalog"), + .name = ITEM_NAME("Rotom Catalog"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12394,7 +12399,7 @@ const struct Item gItemsInfo[] = [ITEM_GRACIDEA] = { - .name = _("Gracidea"), + .name = ITEM_NAME("Gracidea"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12410,8 +12415,8 @@ const struct Item gItemsInfo[] = [ITEM_REVEAL_GLASS] = { - .name = _("Reveal Glass"), - .pluralName = _("Reveal Glasses"), + .name = ITEM_NAME("Reveal Glass"), + .pluralName = ITEM_PLURAL_NAME("Reveal Glasses"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12427,8 +12432,8 @@ const struct Item gItemsInfo[] = [ITEM_DNA_SPLICERS] = { - .name = _("DNA Splicers"), - .pluralName = _("DNA Splicers"), + .name = ITEM_NAME("DNA Splicers"), + .pluralName = ITEM_PLURAL_NAME("DNA Splicers"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12444,7 +12449,7 @@ const struct Item gItemsInfo[] = [ITEM_ZYGARDE_CUBE] = { - .name = _("Zygarde Cube"), + .name = ITEM_NAME("Zygarde Cube"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12460,7 +12465,7 @@ const struct Item gItemsInfo[] = [ITEM_PRISON_BOTTLE] = { - .name = _("Prison Bottle"), + .name = ITEM_NAME("Prison Bottle"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12476,7 +12481,7 @@ const struct Item gItemsInfo[] = [ITEM_N_SOLARIZER] = { - .name = _("N-Solarizer"), + .name = ITEM_NAME("N-Solarizer"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12492,7 +12497,7 @@ const struct Item gItemsInfo[] = [ITEM_N_LUNARIZER] = { - .name = _("N-Lunarizer"), + .name = ITEM_NAME("N-Lunarizer"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12508,8 +12513,8 @@ const struct Item gItemsInfo[] = [ITEM_REINS_OF_UNITY] = { - .name = _("Reins of Unity"), - .pluralName = _("Reins of Unity"), + .name = ITEM_NAME("Reins of Unity"), + .pluralName = ITEM_PLURAL_NAME("Reins of Unity"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12527,7 +12532,7 @@ const struct Item gItemsInfo[] = [ITEM_MEGA_RING] = { - .name = _("Mega Ring"), + .name = ITEM_NAME("Mega Ring"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12543,7 +12548,7 @@ const struct Item gItemsInfo[] = [ITEM_Z_POWER_RING] = { - .name = _("Z-Power Ring"), + .name = ITEM_NAME("Z-Power Ring"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -12559,7 +12564,7 @@ const struct Item gItemsInfo[] = [ITEM_DYNAMAX_BAND] = { - .name = _("Dynamax Band"), + .name = ITEM_NAME("Dynamax Band"), .price = 0, .description = COMPOUND_STRING( "A band carrying a\n" @@ -12576,7 +12581,7 @@ const struct Item gItemsInfo[] = [ITEM_BICYCLE] = { - .name = _("Bicycle"), + .name = ITEM_NAME("Bicycle"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12592,7 +12597,7 @@ const struct Item gItemsInfo[] = [ITEM_MACH_BIKE] = { - .name = _("Mach Bike"), + .name = ITEM_NAME("Mach Bike"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12609,7 +12614,7 @@ const struct Item gItemsInfo[] = [ITEM_ACRO_BIKE] = { - .name = _("Acro Bike"), + .name = ITEM_NAME("Acro Bike"), .price = 0, .description = COMPOUND_STRING( "A folding bicycle\n" @@ -12626,7 +12631,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_ROD] = { - .name = _("Old Rod"), + .name = ITEM_NAME("Old Rod"), .price = 0, .description = COMPOUND_STRING( "Use by any body of\n" @@ -12643,7 +12648,7 @@ const struct Item gItemsInfo[] = [ITEM_GOOD_ROD] = { - .name = _("Good Rod"), + .name = ITEM_NAME("Good Rod"), .price = 0, .description = COMPOUND_STRING( "A decent fishing\n" @@ -12660,7 +12665,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPER_ROD] = { - .name = _("Super Rod"), + .name = ITEM_NAME("Super Rod"), .price = 0, .description = COMPOUND_STRING( "The best fishing\n" @@ -12677,7 +12682,7 @@ const struct Item gItemsInfo[] = [ITEM_DOWSING_MACHINE] = { - .name = _("Dowsing Machine"), + .name = ITEM_NAME("Dowsing Machine"), .price = 0, .description = COMPOUND_STRING( "A device that\n" @@ -12693,7 +12698,7 @@ const struct Item gItemsInfo[] = [ITEM_TOWN_MAP] = { - .name = _("Town Map"), + .name = ITEM_NAME("Town Map"), .price = 0, .description = COMPOUND_STRING( "Can be viewed\n" @@ -12709,7 +12714,7 @@ const struct Item gItemsInfo[] = [ITEM_VS_SEEKER] = { - .name = _("Vs. Seeker"), + .name = ITEM_NAME("Vs. Seeker"), .price = 0, .description = COMPOUND_STRING( "A rechargeable unit\n" @@ -12729,7 +12734,7 @@ const struct Item gItemsInfo[] = [ITEM_TM_CASE] = { - .name = _("TM Case"), + .name = ITEM_NAME("TM Case"), .price = 0, .description = COMPOUND_STRING( "A convenient case\n" @@ -12745,8 +12750,8 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_POUCH] = { - .name = _("Berry Pouch"), - .pluralName = _("Berry Pouches"), + .name = ITEM_NAME("Berry Pouch"), + .pluralName = ITEM_PLURAL_NAME("Berry Pouches"), .price = 0, .description = COMPOUND_STRING( "A convenient\n" @@ -12762,7 +12767,7 @@ const struct Item gItemsInfo[] = [ITEM_POKEMON_BOX_LINK] = { - .name = _("{PKMN} Box Link"), + .name = ITEM_NAME("{PKMN} Box Link"), .price = 0, .description = COMPOUND_STRING( "This device grants\n" @@ -12778,7 +12783,7 @@ const struct Item gItemsInfo[] = [ITEM_COIN_CASE] = { - .name = _("Coin Case"), + .name = ITEM_NAME("Coin Case"), .price = 0, .description = COMPOUND_STRING( "A case that holds\n" @@ -12793,7 +12798,7 @@ const struct Item gItemsInfo[] = [ITEM_POWDER_JAR] = { - .name = _("Powder Jar"), + .name = ITEM_NAME("Powder Jar"), .price = 0, .description = COMPOUND_STRING( "Stores Berry\n" @@ -12809,7 +12814,7 @@ const struct Item gItemsInfo[] = [ITEM_WAILMER_PAIL] = { - .name = _("Wailmer Pail"), + .name = ITEM_NAME("Wailmer Pail"), .price = 0, .description = COMPOUND_STRING( "A tool used for\n" @@ -12825,7 +12830,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_RADAR] = { - .name = _("Poké Radar"), + .name = ITEM_NAME("Poké Radar"), .price = 0, .description = COMPOUND_STRING( "A tool used to\n" @@ -12841,7 +12846,7 @@ const struct Item gItemsInfo[] = [ITEM_POKEBLOCK_CASE] = { - .name = _("{POKEBLOCK} Case"), + .name = ITEM_NAME("{POKEBLOCK} Case"), .price = 0, .description = COMPOUND_STRING( "A case for holding\n" @@ -12857,7 +12862,7 @@ const struct Item gItemsInfo[] = [ITEM_SOOT_SACK] = { - .name = _("Soot Sack"), + .name = ITEM_NAME("Soot Sack"), .price = 0, .description = COMPOUND_STRING( "A sack used to\n" @@ -12873,7 +12878,7 @@ const struct Item gItemsInfo[] = [ITEM_POKE_FLUTE] = { - .name = _("Poké Flute"), + .name = ITEM_NAME("Poké Flute"), .price = 0, .description = COMPOUND_STRING( "A sweet-sounding\n" @@ -12890,7 +12895,7 @@ const struct Item gItemsInfo[] = [ITEM_FAME_CHECKER] = { - .name = _("Fame Checker"), + .name = ITEM_NAME("Fame Checker"), .price = 0, .description = COMPOUND_STRING( "Stores information\n" @@ -12906,7 +12911,7 @@ const struct Item gItemsInfo[] = [ITEM_TEACHY_TV] = { - .name = _("Teachy TV"), + .name = ITEM_NAME("Teachy TV"), .price = 0, .description = COMPOUND_STRING( "A TV set tuned to\n" @@ -12924,7 +12929,7 @@ const struct Item gItemsInfo[] = [ITEM_SS_TICKET] = { - .name = _("S.S. Ticket"), + .name = ITEM_NAME("S.S. Ticket"), .price = 0, .description = COMPOUND_STRING( "The ticket required\n" @@ -12940,7 +12945,7 @@ const struct Item gItemsInfo[] = [ITEM_EON_TICKET] = { - .name = _("Eon Ticket"), + .name = ITEM_NAME("Eon Ticket"), .price = 0, .description = COMPOUND_STRING( "The ticket for a\n" @@ -12957,7 +12962,7 @@ const struct Item gItemsInfo[] = [ITEM_MYSTIC_TICKET] = { - .name = _("Mystic Ticket"), + .name = ITEM_NAME("Mystic Ticket"), .price = 0, .description = COMPOUND_STRING( "A ticket required\n" @@ -12973,7 +12978,7 @@ const struct Item gItemsInfo[] = [ITEM_AURORA_TICKET] = { - .name = _("Aurora Ticket"), + .name = ITEM_NAME("Aurora Ticket"), .price = 0, .description = COMPOUND_STRING( "A ticket required\n" @@ -12989,7 +12994,7 @@ const struct Item gItemsInfo[] = [ITEM_OLD_SEA_MAP] = { - .name = _("Old Sea Map"), + .name = ITEM_NAME("Old Sea Map"), .price = 0, .description = COMPOUND_STRING( "A faded sea chart\n" @@ -13005,7 +13010,7 @@ const struct Item gItemsInfo[] = [ITEM_LETTER] = { - .name = _("Letter"), + .name = ITEM_NAME("Letter"), .price = 0, .description = COMPOUND_STRING( "A letter to Steven\n" @@ -13021,8 +13026,8 @@ const struct Item gItemsInfo[] = [ITEM_DEVON_PARTS] = { - .name = _("Devon Parts"), - .pluralName = _("Devon Parts"), + .name = ITEM_NAME("Devon Parts"), + .pluralName = ITEM_PLURAL_NAME("Devon Parts"), .price = 0, .description = COMPOUND_STRING( "A package that\n" @@ -13038,8 +13043,8 @@ const struct Item gItemsInfo[] = [ITEM_GO_GOGGLES] = { - .name = _("Go-Goggles"), - .pluralName = _("Go-Goggles"), + .name = ITEM_NAME("Go-Goggles"), + .pluralName = ITEM_PLURAL_NAME("Go-Goggles"), .price = 0, .description = COMPOUND_STRING( "Nifty goggles that\n" @@ -13055,7 +13060,7 @@ const struct Item gItemsInfo[] = [ITEM_DEVON_SCOPE] = { - .name = _("Devon Scope"), + .name = ITEM_NAME("Devon Scope"), .price = 0, .description = COMPOUND_STRING( "A device by Devon\n" @@ -13071,7 +13076,7 @@ const struct Item gItemsInfo[] = [ITEM_BASEMENT_KEY] = { - .name = _("Basement Key"), + .name = ITEM_NAME("Basement Key"), .price = 0, .description = COMPOUND_STRING( "The key for New\n" @@ -13087,7 +13092,7 @@ const struct Item gItemsInfo[] = [ITEM_SCANNER] = { - .name = _("Scanner"), + .name = ITEM_NAME("Scanner"), .price = 0, .description = COMPOUND_STRING( "A device found\n" @@ -13103,7 +13108,7 @@ const struct Item gItemsInfo[] = [ITEM_STORAGE_KEY] = { - .name = _("Storage Key"), + .name = ITEM_NAME("Storage Key"), .price = 0, .description = COMPOUND_STRING( "The key to the\n" @@ -13119,8 +13124,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_1] = { - .name = _("Key to Room 1"), - .pluralName = _("Keys to Room 1"), + .name = ITEM_NAME("Key to Room 1"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 1"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -13133,8 +13138,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_2] = { - .name = _("Key to Room 2"), - .pluralName = _("Keys to Room 2"), + .name = ITEM_NAME("Key to Room 2"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 2"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -13147,8 +13152,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_4] = { - .name = _("Key to Room 4"), - .pluralName = _("Keys to Room 4"), + .name = ITEM_NAME("Key to Room 4"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 4"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -13161,8 +13166,8 @@ const struct Item gItemsInfo[] = [ITEM_KEY_TO_ROOM_6] = { - .name = _("Key to Room 6"), - .pluralName = _("Keys to Room 6"), + .name = ITEM_NAME("Key to Room 6"), + .pluralName = ITEM_PLURAL_NAME("Keys to Room 6"), .price = 0, .description = sKeyToRoomDesc, .importance = 1, @@ -13175,7 +13180,7 @@ const struct Item gItemsInfo[] = [ITEM_METEORITE] = { - .name = _("Meteorite"), + .name = ITEM_NAME("Meteorite"), .price = 0, .description = COMPOUND_STRING( "A meteorite found\n" @@ -13190,7 +13195,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGMA_EMBLEM] = { - .name = _("Magma Emblem"), + .name = ITEM_NAME("Magma Emblem"), .price = 0, .description = COMPOUND_STRING( "A medal-like item in\n" @@ -13206,8 +13211,8 @@ const struct Item gItemsInfo[] = [ITEM_CONTEST_PASS] = { - .name = _("Contest Pass"), - .pluralName = _("Contest Passes"), + .name = ITEM_NAME("Contest Pass"), + .pluralName = ITEM_PLURAL_NAME("Contest Passes"), .price = 0, .description = COMPOUND_STRING( "The pass required\n" @@ -13223,7 +13228,7 @@ const struct Item gItemsInfo[] = [ITEM_PARCEL] = { - .name = _("Parcel"), + .name = ITEM_NAME("Parcel"), .price = 0, .description = COMPOUND_STRING( "A parcel for Prof.\n" @@ -13239,7 +13244,7 @@ const struct Item gItemsInfo[] = [ITEM_SECRET_KEY] = { - .name = _("Secret Key"), + .name = ITEM_NAME("Secret Key"), .price = 0, .description = COMPOUND_STRING( "The key to the\n" @@ -13255,7 +13260,7 @@ const struct Item gItemsInfo[] = [ITEM_BIKE_VOUCHER] = { - .name = _("Bike Voucher"), + .name = ITEM_NAME("Bike Voucher"), .price = 0, .description = COMPOUND_STRING( "A voucher for\n" @@ -13271,8 +13276,8 @@ const struct Item gItemsInfo[] = [ITEM_GOLD_TEETH] = { - .name = _("Gold Teeth"), - .pluralName = _("Gold Teeth"), + .name = ITEM_NAME("Gold Teeth"), + .pluralName = ITEM_PLURAL_NAME("Gold Teeth"), .price = 0, .description = COMPOUND_STRING( "Gold dentures lost\n" @@ -13288,7 +13293,7 @@ const struct Item gItemsInfo[] = [ITEM_CARD_KEY] = { - .name = _("Card Key"), + .name = ITEM_NAME("Card Key"), .price = 0, .description = COMPOUND_STRING( "A card-type door\n" @@ -13304,7 +13309,7 @@ const struct Item gItemsInfo[] = [ITEM_LIFT_KEY] = { - .name = _("Lift Key"), + .name = ITEM_NAME("Lift Key"), .price = 0, .description = COMPOUND_STRING( "An elevator key\n" @@ -13320,7 +13325,7 @@ const struct Item gItemsInfo[] = [ITEM_SILPH_SCOPE] = { - .name = _("Silph Scope"), + .name = ITEM_NAME("Silph Scope"), .price = 0, .description = COMPOUND_STRING( "Silph Co's scope\n" @@ -13336,8 +13341,8 @@ const struct Item gItemsInfo[] = [ITEM_TRI_PASS] = { - .name = _("Tri-Pass"), - .pluralName = _("Tri-Passes"), + .name = ITEM_NAME("Tri-Pass"), + .pluralName = ITEM_PLURAL_NAME("Tri-Passes"), .price = 0, .description = COMPOUND_STRING( "A pass for ferries\n" @@ -13353,8 +13358,8 @@ const struct Item gItemsInfo[] = [ITEM_RAINBOW_PASS] = { - .name = _("Rainbow Pass"), - .pluralName = _("Rainbow Passes"), + .name = ITEM_NAME("Rainbow Pass"), + .pluralName = ITEM_PLURAL_NAME("Rainbow Passes"), .price = 0, .description = COMPOUND_STRING( "For ferries serving\n" @@ -13370,8 +13375,8 @@ const struct Item gItemsInfo[] = [ITEM_TEA] = { - .name = _("Tea"), - .pluralName = _("Tea"), + .name = ITEM_NAME("Tea"), + .pluralName = ITEM_PLURAL_NAME("Tea"), .price = 0, .description = COMPOUND_STRING( "A thirst-quenching\n" @@ -13387,8 +13392,8 @@ const struct Item gItemsInfo[] = [ITEM_RUBY] = { - .name = _("Ruby"), - .pluralName = _("Rubies"), + .name = ITEM_NAME("Ruby"), + .pluralName = ITEM_PLURAL_NAME("Rubies"), .price = 0, .description = COMPOUND_STRING( "An exquisite, red-\n" @@ -13404,7 +13409,7 @@ const struct Item gItemsInfo[] = [ITEM_SAPPHIRE] = { - .name = _("Sapphire"), + .name = ITEM_NAME("Sapphire"), .price = 0, .description = COMPOUND_STRING( "A brilliant blue gem\n" @@ -13420,7 +13425,7 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_SHIELD] = { - .name = _("Ability Shield"), + .name = ITEM_NAME("Ability Shield"), .price = 20000, .holdEffect = HOLD_EFFECT_ABILITY_SHIELD, .description = COMPOUND_STRING( @@ -13439,7 +13444,7 @@ const struct Item gItemsInfo[] = [ITEM_CLEAR_AMULET] = { - .name = _("Clear Amulet"), + .name = ITEM_NAME("Clear Amulet"), .price = 30000, .holdEffect = HOLD_EFFECT_CLEAR_AMULET, .description = COMPOUND_STRING( @@ -13457,7 +13462,7 @@ const struct Item gItemsInfo[] = [ITEM_PUNCHING_GLOVE] = { - .name = _("Punching Glove"), + .name = ITEM_NAME("Punching Glove"), .price = 15000, .holdEffect = HOLD_EFFECT_PUNCHING_GLOVE, .description = COMPOUND_STRING( @@ -13475,7 +13480,7 @@ const struct Item gItemsInfo[] = [ITEM_COVERT_CLOAK] = { - .name = _("Covert Cloak"), + .name = ITEM_NAME("Covert Cloak"), .price = 20000, .holdEffect = HOLD_EFFECT_COVERT_CLOAK, .description = COMPOUND_STRING( @@ -13493,8 +13498,8 @@ const struct Item gItemsInfo[] = [ITEM_LOADED_DICE] = { - .name = _("Loaded Dice"), - .pluralName = _("Loaded Dice"), + .name = ITEM_NAME("Loaded Dice"), + .pluralName = ITEM_PLURAL_NAME("Loaded Dice"), .price = 20000, .holdEffect = HOLD_EFFECT_LOADED_DICE, .description = COMPOUND_STRING( @@ -13512,7 +13517,7 @@ const struct Item gItemsInfo[] = [ITEM_AUSPICIOUS_ARMOR] = { - .name = _("Auspicious Armor"), + .name = ITEM_NAME("Auspicious Armor"), .price = 3000, .description = COMPOUND_STRING( "Armor inhabited by\n" @@ -13530,8 +13535,8 @@ const struct Item gItemsInfo[] = [ITEM_BOOSTER_ENERGY] = { - .name = _("Booster Energy"), - .pluralName = _("Booster Energies"), + .name = ITEM_NAME("Booster Energy"), + .pluralName = ITEM_PLURAL_NAME("Booster Energies"), .price = 0, .holdEffect = HOLD_EFFECT_BOOSTER_ENERGY, .description = COMPOUND_STRING( @@ -13549,7 +13554,7 @@ const struct Item gItemsInfo[] = [ITEM_BIG_BAMBOO_SHOOT] = { - .name = _("Big Bamboo Shoot"), + .name = ITEM_NAME("Big Bamboo Shoot"), .price = 3000, .description = COMPOUND_STRING( "A large and rare\n" @@ -13566,7 +13571,7 @@ const struct Item gItemsInfo[] = [ITEM_GIMMIGHOUL_COIN] = { - .name = _("Gimmighoul Coin"), + .name = ITEM_NAME("Gimmighoul Coin"), .price = 400, .description = COMPOUND_STRING( "Gimmighoul hoard\n" @@ -13582,7 +13587,7 @@ const struct Item gItemsInfo[] = [ITEM_LEADERS_CREST] = { - .name = _("Leader's Crest"), + .name = ITEM_NAME("Leader's Crest"), .price = 3000, .description = COMPOUND_STRING( "A shard of an old\n" @@ -13598,7 +13603,7 @@ const struct Item gItemsInfo[] = [ITEM_MALICIOUS_ARMOR] = { - .name = _("Malicious Armor"), + .name = ITEM_NAME("Malicious Armor"), .price = 3000, .description = COMPOUND_STRING( "Armor inhabited by\n" @@ -13616,7 +13621,7 @@ const struct Item gItemsInfo[] = [ITEM_MIRROR_HERB] = { - .name = _("Mirror Herb"), + .name = ITEM_NAME("Mirror Herb"), .price = 30000, .holdEffect = HOLD_EFFECT_MIRROR_HERB, .description = COMPOUND_STRING( @@ -13634,8 +13639,8 @@ const struct Item gItemsInfo[] = [ITEM_SCROLL_OF_DARKNESS] = { - .name = _("Scroll of Darkness"), - .pluralName = _("Scrolls of Darkness"), + .name = ITEM_NAME("Scroll of Darkness"), + .pluralName = ITEM_PLURAL_NAME("Scrolls of Darkness"), .price = 0, .description = COMPOUND_STRING( "A peculiar scroll\n" @@ -13653,8 +13658,8 @@ const struct Item gItemsInfo[] = [ITEM_SCROLL_OF_WATERS] = { - .name = _("Scroll of Waters"), - .pluralName = _("Scrolls of Waters"), + .name = ITEM_NAME("Scroll of Waters"), + .pluralName = ITEM_PLURAL_NAME("Scrolls of Waters"), .price = 0, .description = COMPOUND_STRING( "A peculiar scroll\n" @@ -13672,7 +13677,7 @@ const struct Item gItemsInfo[] = [ITEM_TERA_ORB] = { - .name = _("Tera Orb"), + .name = ITEM_NAME("Tera Orb"), .price = 0, .description = COMPOUND_STRING( "Energy charges can\n" @@ -13688,7 +13693,7 @@ const struct Item gItemsInfo[] = [ITEM_TINY_BAMBOO_SHOOT] = { - .name = _("Tiny Bamboo Shoot"), + .name = ITEM_NAME("Tiny Bamboo Shoot"), .price = 750, .description = COMPOUND_STRING( "A small and rare\n" @@ -13705,7 +13710,7 @@ const struct Item gItemsInfo[] = [ITEM_BUG_TERA_SHARD] = { - .name = _("Bug Tera Shard"), + .name = ITEM_NAME("Bug Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13718,7 +13723,7 @@ const struct Item gItemsInfo[] = [ITEM_DARK_TERA_SHARD] = { - .name = _("Dark Tera Shard"), + .name = ITEM_NAME("Dark Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13731,7 +13736,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_TERA_SHARD] = { - .name = _("Dragon Tera Shard"), + .name = ITEM_NAME("Dragon Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13744,7 +13749,7 @@ const struct Item gItemsInfo[] = [ITEM_ELECTRIC_TERA_SHARD] = { - .name = _("Electric Tera Shard"), + .name = ITEM_NAME("Electric Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13757,7 +13762,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_TERA_SHARD] = { - .name = _("Fairy Tera Shard"), + .name = ITEM_NAME("Fairy Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13770,7 +13775,7 @@ const struct Item gItemsInfo[] = [ITEM_FIGHTING_TERA_SHARD] = { - .name = _("Fighting Tera Shard"), + .name = ITEM_NAME("Fighting Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13783,7 +13788,7 @@ const struct Item gItemsInfo[] = [ITEM_FIRE_TERA_SHARD] = { - .name = _("Fire Tera Shard"), + .name = ITEM_NAME("Fire Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13796,7 +13801,7 @@ const struct Item gItemsInfo[] = [ITEM_FLYING_TERA_SHARD] = { - .name = _("Flying Tera Shard"), + .name = ITEM_NAME("Flying Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13809,7 +13814,7 @@ const struct Item gItemsInfo[] = [ITEM_GHOST_TERA_SHARD] = { - .name = _("Ghost Tera Shard"), + .name = ITEM_NAME("Ghost Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13822,7 +13827,7 @@ const struct Item gItemsInfo[] = [ITEM_GRASS_TERA_SHARD] = { - .name = _("Grass Tera Shard"), + .name = ITEM_NAME("Grass Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13835,7 +13840,7 @@ const struct Item gItemsInfo[] = [ITEM_GROUND_TERA_SHARD] = { - .name = _("Ground Tera Shard"), + .name = ITEM_NAME("Ground Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13848,7 +13853,7 @@ const struct Item gItemsInfo[] = [ITEM_ICE_TERA_SHARD] = { - .name = _("Ice Tera Shard"), + .name = ITEM_NAME("Ice Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13861,7 +13866,7 @@ const struct Item gItemsInfo[] = [ITEM_NORMAL_TERA_SHARD] = { - .name = _("Normal Tera Shard"), + .name = ITEM_NAME("Normal Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13874,7 +13879,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_TERA_SHARD] = { - .name = _("Poison Tera Shard"), + .name = ITEM_NAME("Poison Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13887,7 +13892,7 @@ const struct Item gItemsInfo[] = [ITEM_PSYCHIC_TERA_SHARD] = { - .name = _("Psychic Tera Shard"), + .name = ITEM_NAME("Psychic Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13900,7 +13905,7 @@ const struct Item gItemsInfo[] = [ITEM_ROCK_TERA_SHARD] = { - .name = _("Rock Tera Shard"), + .name = ITEM_NAME("Rock Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13913,7 +13918,7 @@ const struct Item gItemsInfo[] = [ITEM_STEEL_TERA_SHARD] = { - .name = _("Steel Tera Shard"), + .name = ITEM_NAME("Steel Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13926,7 +13931,7 @@ const struct Item gItemsInfo[] = [ITEM_WATER_TERA_SHARD] = { - .name = _("Water Tera Shard"), + .name = ITEM_NAME("Water Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -13939,7 +13944,7 @@ const struct Item gItemsInfo[] = [ITEM_ADAMANT_CRYSTAL] = { - .name = _("Adamant Crystal"), + .name = ITEM_NAME("Adamant Crystal"), .price = 0, .holdEffect = HOLD_EFFECT_ADAMANT_ORB, .holdEffectParam = 20, @@ -13958,7 +13963,7 @@ const struct Item gItemsInfo[] = [ITEM_GRISEOUS_CORE] = { - .name = _("Griseous Core"), + .name = ITEM_NAME("Griseous Core"), .price = 0, .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, .holdEffectParam = 20, @@ -13977,7 +13982,7 @@ const struct Item gItemsInfo[] = [ITEM_LUSTROUS_GLOBE] = { - .name = _("Lustrous Globe"), + .name = ITEM_NAME("Lustrous Globe"), .price = 0, .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, .holdEffectParam = 20, @@ -13996,7 +14001,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_AUGURITE] = { - .name = _("Black Augurite"), + .name = ITEM_NAME("Black Augurite"), .price = 8000, .description = COMPOUND_STRING( "A black stone that\n" @@ -14014,7 +14019,7 @@ const struct Item gItemsInfo[] = [ITEM_LINKING_CORD] = { - .name = _("Linking Cord"), + .name = ITEM_NAME("Linking Cord"), .price = 8000, .description = COMPOUND_STRING( "A mysterious string\n" @@ -14032,7 +14037,7 @@ const struct Item gItemsInfo[] = [ITEM_PEAT_BLOCK] = { - .name = _("Peat Block"), + .name = ITEM_NAME("Peat Block"), .price = 10000, .description = COMPOUND_STRING( "A block of material\n" @@ -14050,7 +14055,7 @@ const struct Item gItemsInfo[] = [ITEM_BERSERK_GENE] = { - .name = _("Berserk Gene"), + .name = ITEM_NAME("Berserk Gene"), .price = 20, .holdEffect = HOLD_EFFECT_BERSERK_GENE, .description = COMPOUND_STRING( @@ -14068,7 +14073,7 @@ const struct Item gItemsInfo[] = [ITEM_FAIRY_FEATHER] = { - .name = _("Fairy Feather"), + .name = ITEM_NAME("Fairy Feather"), .price = 1000, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, @@ -14088,7 +14093,7 @@ const struct Item gItemsInfo[] = [ITEM_SYRUPY_APPLE] = { - .name = _("Syrupy Apple"), + .name = ITEM_NAME("Syrupy Apple"), .price = 2200, .description = COMPOUND_STRING( "A very syrupy apple\n" @@ -14106,7 +14111,7 @@ const struct Item gItemsInfo[] = [ITEM_UNREMARKABLE_TEACUP] = { - .name = _("Unremarkable Teacup"), + .name = ITEM_NAME("Unremarkable Teacup"), .price = 1600, .description = COMPOUND_STRING( "A cracked teacup\n" @@ -14124,7 +14129,7 @@ const struct Item gItemsInfo[] = [ITEM_MASTERPIECE_TEACUP] = { - .name = _("Masterpiece Teacup"), + .name = ITEM_NAME("Masterpiece Teacup"), .price = 38000, .description = COMPOUND_STRING( "A chipped teacup\n" @@ -14142,7 +14147,7 @@ const struct Item gItemsInfo[] = [ITEM_CORNERSTONE_MASK] = { - .name = _("Cornerstone Mask"), + .name = ITEM_NAME("Cornerstone Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -14160,7 +14165,7 @@ const struct Item gItemsInfo[] = [ITEM_WELLSPRING_MASK] = { - .name = _("Wellspring Mask"), + .name = ITEM_NAME("Wellspring Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -14178,7 +14183,7 @@ const struct Item gItemsInfo[] = [ITEM_HEARTHFLAME_MASK] = { - .name = _("Hearthflame Mask"), + .name = ITEM_NAME("Hearthflame Mask"), .price = 0, .holdEffect = HOLD_EFFECT_OGERPON_MASK, .holdEffectParam = 20, @@ -14196,8 +14201,8 @@ const struct Item gItemsInfo[] = [ITEM_HEALTH_MOCHI] = { - .name = _("Health Mochi"), - .pluralName = _("Health Mochi"), + .name = ITEM_NAME("Health Mochi"), + .pluralName = ITEM_PLURAL_NAME("Health Mochi"), .price = 500, .description = sHealthFeatherDesc, .pocket = POCKET_ITEMS, @@ -14212,8 +14217,8 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_MOCHI] = { - .name = _("Muscle Mochi"), - .pluralName = _("Muscle Mochi"), + .name = ITEM_NAME("Muscle Mochi"), + .pluralName = ITEM_PLURAL_NAME("Muscle Mochi"), .price = 500, .description = sMuscleFeatherDesc, .pocket = POCKET_ITEMS, @@ -14228,8 +14233,8 @@ const struct Item gItemsInfo[] = [ITEM_RESIST_MOCHI] = { - .name = _("Resist Mochi"), - .pluralName = _("Resist Mochi"), + .name = ITEM_NAME("Resist Mochi"), + .pluralName = ITEM_PLURAL_NAME("Resist Mochi"), .price = 500, .description = sResistFeatherDesc, .pocket = POCKET_ITEMS, @@ -14244,8 +14249,8 @@ const struct Item gItemsInfo[] = [ITEM_GENIUS_MOCHI] = { - .name = _("Genius Mochi"), - .pluralName = _("Genius Mochi"), + .name = ITEM_NAME("Genius Mochi"), + .pluralName = ITEM_PLURAL_NAME("Genius Mochi"), .price = 500, .description = sGeniusFeatherDesc, .pocket = POCKET_ITEMS, @@ -14260,8 +14265,8 @@ const struct Item gItemsInfo[] = [ITEM_CLEVER_MOCHI] = { - .name = _("Clever Mochi"), - .pluralName = _("Clever Mochi"), + .name = ITEM_NAME("Clever Mochi"), + .pluralName = ITEM_PLURAL_NAME("Clever Mochi"), .price = 500, .description = sCleverFeatherDesc, .pocket = POCKET_ITEMS, @@ -14276,8 +14281,8 @@ const struct Item gItemsInfo[] = [ITEM_SWIFT_MOCHI] = { - .name = _("Swift Mochi"), - .pluralName = _("Swift Mochi"), + .name = ITEM_NAME("Swift Mochi"), + .pluralName = ITEM_PLURAL_NAME("Swift Mochi"), .price = 500, .description = sSwiftFeatherDesc, .pocket = POCKET_ITEMS, @@ -14292,8 +14297,8 @@ const struct Item gItemsInfo[] = [ITEM_FRESH_START_MOCHI] = { - .name = _("Fresh Start Mochi"), - .pluralName = _("Fresh Start Mochi"), + .name = ITEM_NAME("Fresh Start Mochi"), + .pluralName = ITEM_PLURAL_NAME("Fresh Start Mochi"), .price = 300, .description = COMPOUND_STRING( "An item that resets\n" @@ -14311,7 +14316,7 @@ const struct Item gItemsInfo[] = [ITEM_GLIMMERING_CHARM] = { - .name = _("Glimmering Charm"), + .name = ITEM_NAME("Glimmering Charm"), .price = 0, .importance = 1, .description = COMPOUND_STRING( @@ -14327,7 +14332,7 @@ const struct Item gItemsInfo[] = [ITEM_METAL_ALLOY] = { - .name = _("Metal Alloy"), + .name = ITEM_NAME("Metal Alloy"), .price = 6000, .description = COMPOUND_STRING( "A peculiar metal\n" @@ -14344,7 +14349,7 @@ const struct Item gItemsInfo[] = [ITEM_STELLAR_TERA_SHARD] = { - .name = _("Stellar Tera Shard"), + .name = ITEM_NAME("Stellar Tera Shard"), .price = 0, .description = sTeraShardDesc, .pocket = POCKET_ITEMS, @@ -14357,7 +14362,7 @@ const struct Item gItemsInfo[] = [ITEM_JUBILIFE_MUFFIN] = { - .name = _("Jubilife Muffin"), + .name = ITEM_NAME("Jubilife Muffin"), .price = 250, .description = sFullHealDesc, .pocket = POCKET_ITEMS, @@ -14373,7 +14378,7 @@ const struct Item gItemsInfo[] = [ITEM_REMEDY] = { - .name = _("Remedy"), + .name = ITEM_NAME("Remedy"), .price = 150, .description = COMPOUND_STRING( "A bitter powder\n" @@ -14392,7 +14397,7 @@ const struct Item gItemsInfo[] = [ITEM_FINE_REMEDY] = { - .name = _("Fine Remedy"), + .name = ITEM_NAME("Fine Remedy"), .price = 150, .description = COMPOUND_STRING( "A bitter powder\n" @@ -14415,7 +14420,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPERB_REMEDY] = { - .name = _("Superb Remedy"), + .name = ITEM_NAME("Superb Remedy"), .price = 750, .description = COMPOUND_STRING( "A bitter powder\n" @@ -14438,7 +14443,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_EVASION] = { - .name = _("Aux Evasion"), + .name = ITEM_NAME("Aux Evasion"), .price = 800, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14461,7 +14466,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_GUARD] = { - .name = _("Aux Guard"), + .name = ITEM_NAME("Aux Guard"), .price = 400, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14484,7 +14489,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_POWER] = { - .name = _("Aux Power"), + .name = ITEM_NAME("Aux Power"), .price = 400, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14507,7 +14512,7 @@ const struct Item gItemsInfo[] = [ITEM_AUX_POWERGUARD] = { - .name = _("Aux Powerguard"), + .name = ITEM_NAME("Aux Powerguard"), .price = 1200, .holdEffectParam = X_ITEM_STAGES, .description = COMPOUND_STRING( @@ -14531,7 +14536,7 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_DUMPLING] = { - .name = _("Choice Dumpling"), + .name = ITEM_NAME("Choice Dumpling"), .price = 1200, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14544,7 +14549,7 @@ const struct Item gItemsInfo[] = [ITEM_SWAP_SNACK] = { - .name = _("Swap Snack"), + .name = ITEM_NAME("Swap Snack"), .price = 1200, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14557,7 +14562,7 @@ const struct Item gItemsInfo[] = [ITEM_TWICE_SPICED_RADISH] = { - .name = _("Twice-Spiced Radish"), + .name = ITEM_NAME("Twice-Spiced Radish"), .price = 1600, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -14570,7 +14575,7 @@ const struct Item gItemsInfo[] = [ITEM_POKESHI_DOLL] = { - .name = _("Pokéshi Doll"), + .name = ITEM_NAME("Pokéshi Doll"), .price = 2000, .description = COMPOUND_STRING( "A wooden toy\n" @@ -14584,3 +14589,6 @@ const struct Item gItemsInfo[] = .iconPalette = gItemIconPalette_PokeshiDoll, }, }; + +#undef ITEM_NAME +#undef ITEM_PLURAL_NAME diff --git a/src/item.c b/src/item.c index 7ca2b90399..6802b2272c 100644 --- a/src/item.c +++ b/src/item.c @@ -776,7 +776,9 @@ static u16 SanitizeItemId(u16 itemId) const u8 *GetItemName(u16 itemId) { - return gItemsInfo[SanitizeItemId(itemId)].name; + const u8 *name = gItemsInfo[SanitizeItemId(itemId)].name; + + return name == NULL ? gQuestionMarksItemName : name; } u32 GetItemPrice(u16 itemId) @@ -786,7 +788,7 @@ u32 GetItemPrice(u16 itemId) static bool32 DoesItemHavePluralName(u16 itemId) { - return (gItemsInfo[SanitizeItemId(itemId)].pluralName[0] != '\0'); + return gItemsInfo[SanitizeItemId(itemId)].pluralName != NULL; } static const u8 *GetItemPluralName(u16 itemId) From 90601792b9dd6a022f3be9df2d9956cba5ca19e8 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:06:01 +0200 Subject: [PATCH 193/248] Split Sheer Force tests by gen instead of by four (#7260) --- test/battle/ability/sheer_force.c | 753 +++++++++++++++++++++++------- 1 file changed, 588 insertions(+), 165 deletions(-) diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index 076597d49b..8e99361296 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -609,12 +609,12 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move) return FALSE; } -// Test split into four parts that handles ~1/4 of all moves each -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 1") +// Tests split by generation +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen1)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 1; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_POUND; j < MOVES_COUNT_GEN1; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } @@ -692,171 +692,594 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to EXPECT_EQ(damage2, damage1); } } -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 2") + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen2)") { s16 damage1, damage2; u32 move = 0; - for (u32 j = 2; j < MOVES_COUNT; j += 4) - if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) - PARAMETRIZE { move = j; } - GIVEN { - PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } - OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } - } WHEN { - if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect - TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move - TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) - TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); - MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); - MOVE(playerLeft, move, target: opponentRight); - MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) - TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) - TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_DREAM_EATER) - { - TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else if (move == MOVE_SNORE) - { - TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) - { - TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - switch (GetMoveEffect(move)) - { - case EFFECT_TWO_TURNS_ATTACK: - case EFFECT_SEMI_INVULNERABLE: - case EFFECT_SOLAR_BEAM: - case EFFECT_SKY_DROP: - TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } - break; - case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } - break; - case EFFECT_BIDE: - TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - break; - default: - break; - } - } SCENE { - if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) - { - HP_BAR(opponentRight, captureDamage: &damage1); - HP_BAR(playerRight, captureDamage: &damage2); - } - else - { - HP_BAR(playerRight, captureDamage: &damage2); - HP_BAR(opponentRight, captureDamage: &damage1); - } - } THEN { - if (IsMoveSheerForceBoosted(move)) - EXPECT_GT(damage1, damage2); - else - EXPECT_EQ(damage2, damage1); - } -} -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 3") -{ - s16 damage1, damage2; - u32 move = 0; - for (u32 j = 3; j < MOVES_COUNT; j += 4) - if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) - PARAMETRIZE { move = j; } - GIVEN { - PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } - OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } - } WHEN { - if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect - TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move - TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) - TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); - MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); - MOVE(playerLeft, move, target: opponentRight); - MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) - TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) - TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - else if (move == MOVE_DREAM_EATER) - { - TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else if (move == MOVE_SNORE) - { - TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) - { - TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - } - else - TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } - switch (GetMoveEffect(move)) - { - case EFFECT_TWO_TURNS_ATTACK: - case EFFECT_SEMI_INVULNERABLE: - case EFFECT_SOLAR_BEAM: - case EFFECT_SKY_DROP: - TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } - break; - case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } - break; - case EFFECT_BIDE: - TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - break; - default: - break; - } - } SCENE { - if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) - { - HP_BAR(opponentRight, captureDamage: &damage1); - HP_BAR(playerRight, captureDamage: &damage2); - } - else - { - HP_BAR(playerRight, captureDamage: &damage2); - HP_BAR(opponentRight, captureDamage: &damage1); - } - } THEN { - if (IsMoveSheerForceBoosted(move)) - EXPECT_GT(damage1, damage2); - else - EXPECT_EQ(damage2, damage1); - } -} -DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost 4") -{ - s16 damage1, damage2; - u32 move = 0; - for (u32 j = 4; j < MOVES_COUNT; j += 4) + for (u32 j = MOVE_SKETCH; j < MOVES_COUNT_GEN2; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen3)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_FAKE_OUT; j < MOVES_COUNT_GEN3; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen4)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_ROOST; j < MOVES_COUNT_GEN4; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen5)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_HONE_CLAWS; j < MOVES_COUNT_GEN5; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen6)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_FLYING_PRESS; j < MOVES_COUNT_GEN6; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen7)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_SHORE_UP; j < MOVES_COUNT_GEN7; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen8)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_DYNAMAX_CANNON; j < MOVES_COUNT_GEN8; j++) + { + if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) + PARAMETRIZE { move = j; } + } + GIVEN { + PLAYER(SPECIES_STEELIX) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_BLUK_BERRY); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_STEELIX) { Ability(ABILITY_STURDY); Item(ITEM_BLUK_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); Level(100); Item(ITEM_BLUK_BERRY); } + } WHEN { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponentRight, MOVE_AGILITY); MOVE(playerRight, MOVE_AGILITY); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_UPPER_HAND) // Upper Hand requires the target to be using a damaging priority move + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); MOVE(playerRight, move, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_COUNTER || move == MOVE_UPPER_HAND) + TURN { MOVE(opponentRight, MOVE_QUICK_ATTACK, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); + MOVE(playerLeft, move, target: opponentRight); + MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_MIRROR_COAT || move == MOVE_METAL_BURST) + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_SUCKER_PUNCH || move == MOVE_THUNDERCLAP) + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + else if (move == MOVE_DREAM_EATER) + { + TURN { MOVE(playerLeft, MOVE_HYPNOSIS, target: opponentRight); MOVE(opponentLeft, MOVE_HYPNOSIS, target: playerRight); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SNORE) + { + TURN { MOVE(opponentRight, MOVE_HYPNOSIS, target: playerLeft); MOVE(playerRight, MOVE_HYPNOSIS, target: opponentLeft); MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else if (move == MOVE_SPIT_UP || move == MOVE_LAST_RESORT) + { + TURN { MOVE(playerLeft, MOVE_STOCKPILE); MOVE(opponentLeft, MOVE_STOCKPILE); } + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + } + else + TURN { MOVE(playerLeft, move, target: opponentRight); MOVE(opponentLeft, move, target: playerRight); } + switch (GetMoveEffect(move)) + { + case EFFECT_TWO_TURNS_ATTACK: + case EFFECT_SEMI_INVULNERABLE: + case EFFECT_SOLAR_BEAM: + case EFFECT_SKY_DROP: + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { ; } + break; + case EFFECT_FUTURE_SIGHT: + TURN { ; } + TURN { ; } + break; + case EFFECT_BIDE: + TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } + break; + default: + break; + } + } SCENE { + if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) + { + HP_BAR(opponentRight, captureDamage: &damage1); + HP_BAR(playerRight, captureDamage: &damage2); + } + else + { + HP_BAR(playerRight, captureDamage: &damage2); + HP_BAR(opponentRight, captureDamage: &damage1); + } + } THEN { + if (IsMoveSheerForceBoosted(move)) + EXPECT_GT(damage1, damage2); + else + EXPECT_EQ(damage2, damage1); + } +} + +// Last test should always go up to MOVES_COUNT to catch users moves +DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen9)") +{ + s16 damage1, damage2; + u32 move = 0; + for (u32 j = MOVE_TERA_BLAST; j < MOVES_COUNT; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } From fda783b394ef430559768bf9f9420f6b2c2f084c Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 8 Aug 2025 16:54:07 -0400 Subject: [PATCH 194/248] AI handling for similar utility moves (#7513) --- include/battle_ai_util.h | 27 ++- src/battle_ai_field_statuses.c | 7 +- src/battle_ai_main.c | 93 +++++----- src/battle_ai_util.c | 325 +++++++++++++++++++++++---------- test/battle/ai/ai_doubles.c | 2 +- 5 files changed, 297 insertions(+), 157 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 62cba4949e..448fbf71c5 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -168,14 +168,15 @@ bool32 HasMove(u32 battlerId, u32 move); bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive); bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); bool32 HasMoveWithType(u32 battler, u32 type); -bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects moveEffect); +bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect); bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); +bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 effect); bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect); -bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); @@ -252,11 +253,9 @@ bool32 HasTwoOpponents(u32 battler); bool32 HasPartner(u32 battler); bool32 HasPartnerIgnoreFlags(u32 battler); // HasPartner respects the Attacks Partner AI flag; HasPartnerIgnoreFlags checks only if a live pokemon is adjacent. +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); -bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); -bool32 IsMoveEffectWeather(u32 move); -bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove); bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck); bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck); bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); @@ -301,4 +300,22 @@ bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *ai u32 GetThinkingBattler(u32 battler); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); +// These are for the purpose of not doubling up on moves during double battles. +// Used in GetAIEffectGroup for move effects and GetAIEffectGroupFromMove for additional effects +#define AI_EFFECT_NONE 0 +#define AI_EFFECT_WEATHER (1 << 0) +#define AI_EFFECT_TERRAIN (1 << 1) +#define AI_EFFECT_CLEAR_HAZARDS (1 << 2) +#define AI_EFFECT_BREAK_SCREENS (1 << 3) +#define AI_EFFECT_RESET_STATS (1 << 4) +#define AI_EFFECT_FORCE_SWITCH (1 << 5) +#define AI_EFFECT_TORMENT (1 << 6) +#define AI_EFFECT_LIGHT_SCREEN (1 << 7) +#define AI_EFFECT_REFLECT (1 << 8) +#define AI_EFFECT_GRAVITY (1 << 9) +#define AI_EFFECT_CHANGE_ABILITY (1 << 10) + +// As Aurora Veil should almost never be used alongside the other screens, we save the bit. +#define AI_EFFECT_AURORA_VEIL (AI_EFFECT_LIGHT_SCREEN | AI_EFFECT_REFLECT) + #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index d04f00d4b5..d85df3e74a 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -375,14 +375,15 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) // harass dragons if ((grounded || allyGrounded) - && (HasDamagingMoveOfType(FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(BATTLE_PARTNER(FOE(battler)), TYPE_DRAGON))) + && (HasDamagingMoveOfType(FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(BATTLE_PARTNER(FOE(battler)), TYPE_DRAGON))) return FIELD_EFFECT_POSITIVE; - if ((grounded || allyGrounded) && HasBattlerSideUsedMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) + if ((grounded || allyGrounded) + && (HasNonVolatileMoveEffect(FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(BATTLE_PARTNER(FOE(battler)), MOVE_EFFECT_SLEEP))) return FIELD_EFFECT_POSITIVE; if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) - || (gStatuses3[battler] & STATUS3_YAWN))) + || (gStatuses3[battler] & STATUS3_YAWN))) return FIELD_EFFECT_POSITIVE; return FIELD_EFFECT_NEUTRAL; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 528bcbd859..5e75f1dfb3 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1648,7 +1648,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; // other case EFFECT_HAZE: - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { ADJUST_SCORE(-10); // partner already using haze } @@ -1707,19 +1707,19 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-1); // may still want to just poison //fallthrough case EFFECT_LIGHT_SCREEN: - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_LIGHTSCREEN - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_REFLECT: - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_REFLECT - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_REFLECT | SIDE_STATUS_AURORA_VEIL) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_AURORA_VEIL: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_AURORA_VEIL - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) - || !(weather & (B_WEATHER_ICY_ANY))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || !(weather & (B_WEATHER_ICY_ANY))) ADJUST_SCORE(-10); break; case EFFECT_SHEER_COLD: @@ -1734,7 +1734,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MIST: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_MIST - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_FOCUS_ENERGY: @@ -1742,19 +1742,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_NON_VOLATILE_STATUS: - if (GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_FOES_AND_ALLY - && PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) - ADJUST_SCORE(-10); if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_CONFUSE: - if (GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_FOES_AND_ALLY - && PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) - ADJUST_SCORE(-10); case EFFECT_SWAGGER: case EFFECT_FLATTER: - if (!AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || !AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SUBSTITUTE: @@ -1788,7 +1783,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (gDisableStructs[battlerDef].disableTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && !PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first { @@ -1884,7 +1879,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_STICKY_WEB: if (IsHazardOnSide(GetBattlerSide(battlerDef), HAZARDS_STICKY_WEB)) ADJUST_SCORE(-10); - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); // only one mon needs to set up Sticky Web break; case EFFECT_FORESIGHT: @@ -1912,7 +1907,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); //Both enemies are perish songed } - else if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + else if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); } @@ -1929,23 +1924,23 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SANDSTORM: if (weather & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_SUNNY_DAY: if (weather & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_RAIN_DANCE: if (weather & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_HAIL: case EFFECT_SNOWSCAPE: if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && IsMoveEffectWeather(aiData->partnerMove))) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_ATTRACT: @@ -1954,7 +1949,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SAFEGUARD: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_SAFEGUARD - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_MAGNITUDE: @@ -1980,7 +1975,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CHILLY_RECEPTION: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) || IsMoveEffectWeather(aiData->partnerMove)) + else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; case EFFECT_BELLY_DRUM: @@ -2046,7 +2042,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FOLLOW_ME: case EFFECT_HELPING_HAND: if (!hasPartner - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. ADJUST_SCORE(-10); @@ -2096,13 +2092,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_MUD_SPORT: if (gFieldStatuses & STATUS_FIELD_MUDSPORT || gBattleMons[battlerAtk].volatiles.mudSport - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_WATER_SPORT: if (gFieldStatuses & STATUS_FIELD_WATERSPORT || gBattleMons[battlerAtk].volatiles.waterSport - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_ABSORB: @@ -2239,7 +2235,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BELL: - if (!AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (!AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_ENDURE: @@ -2336,7 +2332,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) || AreAnyHazardsOnSide(GetBattlerSide(battlerAtk))) { - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) { ADJUST_SCORE(-10); //Only need one hazards removal break; @@ -2440,12 +2436,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SIMPLE_BEAM: case EFFECT_SKILL_SWAP: case EFFECT_WORRY_SEED: - if (!CanEffectChangeAbility(battlerAtk, battlerDef, moveEffect, aiData)) + if (!CanEffectChangeAbility(battlerAtk, battlerDef, moveEffect, aiData) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); break; case EFFECT_SNATCH: if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_POWER_TRICK: @@ -2542,23 +2539,28 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_GRASSY_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_ELECTRIC_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_PSYCHIC_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_MISTY_TERRAIN: - if (PartnerMoveEffectIsTerrain(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) || gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_STEEL_ROLLER: - if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-10); break; case EFFECT_PLEDGE: @@ -2888,7 +2890,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_COURT_CHANGE: case EFFECT_TEATIME: - if (PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_PLACEHOLDER: @@ -3009,6 +3011,10 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // check what effect partner is using if (aiData->partnerMove != 0 && hasPartner) { + // This catches weather, terrain, screens, etc + if (AreMovesEquivalent(battlerAtk, battlerAtkPartner, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + switch (partnerEffect) { case EFFECT_HELPING_HAND: @@ -3022,16 +3028,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(WEAK_EFFECT); } break; - // Don't change weather if ally already decided to do so. - case EFFECT_SUNNY_DAY: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_RAIN_DANCE: - case EFFECT_SANDSTORM: - case EFFECT_CHILLY_RECEPTION: - if (IsMoveEffectWeather(move)) - ADJUST_SCORE(-10); - break; case EFFECT_AFTER_YOU: if (effect == EFFECT_TRICK_ROOM && !(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); @@ -4110,7 +4106,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_HAZE: if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) break; score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; @@ -5243,6 +5239,7 @@ case EFFECT_GUARD_SPLIT: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].volatiles.wrapped)) ADJUST_SCORE(GOOD_EFFECT); + break; case EFFECT_SPECTRAL_THIEF: ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 8e6f0d79a2..9e4f4e35fd 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -24,6 +24,9 @@ #include "constants/moves.h" #include "constants/items.h" +static u32 GetAIEffectGroup(enum BattleMoveEffects effect); +static u32 GetAIEffectGroupFromMove(u32 battler, u32 move); + // Functions static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) { @@ -2222,21 +2225,37 @@ bool32 HasMoveWithType(u32 battler, u32 type) return FALSE; } -bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects effect) +bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects effect) { s32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveEffect(moves[i]) == effect) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveEffect(moves[i]) == effect) return TRUE; } return FALSE; } +bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE) + { + if (GetAIEffectGroupFromMove(battler, moves[i]) & aiEffect) + return TRUE; + } + } + + return FALSE; +} + bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) { if (HasMoveWithEffect(battler, effect)) @@ -2246,18 +2265,44 @@ bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) return FALSE; } +bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 aiEffect) +{ + if (HasMoveWithAIEffect(battler, aiEffect)) + return TRUE; + if (HasPartnerIgnoreFlags(battler) && HasMoveWithAIEffect(BATTLE_PARTNER(battler), aiEffect)) + return TRUE; + return FALSE; +} + // HasBattlerSideMoveWithEffect checks if the AI knows a side has a move effect, -// while HasBattlerSideUsedMoveWithEffect checks if the side has ever used a move effect. -// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. +// while HasBattlerSideUsedMoveWithEffect checks if the side has actively USED the move effect. +// It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) { + u32 aiEffect = GetAIEffectGroup(effect); u32 i; for (i = 0; i < MAX_MON_MOVES; i++) { if (GetMoveEffect(gBattleHistory->usedMoves[battler][i]) == effect) return TRUE; - if (HasPartnerIgnoreFlags(battler) && GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) == effect) - return TRUE; + + if (aiEffect != AI_EFFECT_NONE) + { + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[battler][i]) & aiEffect) + return TRUE; + } + + if (HasPartnerIgnoreFlags(battler)) + { + if (GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) == effect) + return TRUE; + + if (aiEffect != AI_EFFECT_NONE) + { + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) & aiEffect) + return TRUE; + } + } } return FALSE; } @@ -2316,22 +2361,6 @@ bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) return FALSE; } -// HasBattlerSideMoveWithAdditionalEffect checks if the AI knows a side has a move effect, -// while HasBattlerSideUsedMoveWithAdditionalEffect checks if the side has ever used a move effect. -// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. -bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect) -{ - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (MoveHasAdditionalEffect(gBattleHistory->usedMoves[battler][i], moveEffect)) - return TRUE; - if (HasPartnerIgnoreFlags(battler) && MoveHasAdditionalEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i], moveEffect)) - return TRUE; - } - return FALSE; -} - bool32 HasMoveWithCriticalHitChance(u32 battlerId) { s32 i; @@ -3732,8 +3761,7 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo u32 atkSide = GetBattlerSide(battlerAtk); // Don't waste a turn if screens will be broken - if (HasMoveWithEffect(battlerDef, EFFECT_BRICK_BREAK) - || HasMoveWithEffect(battlerDef, EFFECT_RAGING_BULL)) + if (HasMoveWithAIEffect(battlerDef, AI_EFFECT_BREAK_SCREENS)) return FALSE; switch (moveEffect) @@ -3747,13 +3775,13 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo case EFFECT_REFLECT: // Use only if the player has a physical move and AI doesn't already have Reflect itself active. if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - && !(gSideStatuses[atkSide] & SIDE_STATUS_REFLECT)) + && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; case EFFECT_LIGHT_SCREEN: // Use only if the player has a special move and AI doesn't already have Light Screen itself active. if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - && !(gSideStatuses[atkSide] & SIDE_STATUS_LIGHTSCREEN)) + && !(gSideStatuses[atkSide] & (SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL))) return TRUE; break; default: @@ -3821,33 +3849,178 @@ u32 GetAllyChosenMove(u32 battlerId) return gBattleMons[partnerBattler].moves[gBattleStruct->chosenMovePositions[partnerBattler]]; } -//PARTNER_MOVE_EFFECT_IS_SAME +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove) +{ + if (!IsBattlerAlive(battlerAtkPartner) || partnerMove == MOVE_NONE) + return FALSE; + + u32 battlerDef = gBattleStruct->moveTarget[battlerAtk]; + + // We don't care the effect is basically the same; we would use this move anyway. + if (GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + return FALSE; + + u32 atkEffect = GetAIEffectGroupFromMove(battlerAtk, move); + u32 partnerEffect = GetAIEffectGroupFromMove(battlerAtkPartner, partnerMove); + + // shared bits indicate they're meaningfully the same in some way + if (atkEffect & partnerEffect) + { + if (gMovesInfo[move].target == MOVE_TARGET_SELECTED && gMovesInfo[partnerMove].target == MOVE_TARGET_SELECTED) + { + if (battlerDef == gBattleStruct->moveTarget[battlerAtkPartner]) + return TRUE; + else + return FALSE; + } + return TRUE; + } + return FALSE; +} + +static u32 GetAIEffectGroup(enum BattleMoveEffects effect) +{ + u32 aiEffect = AI_EFFECT_NONE; + + switch (effect) + { + case EFFECT_SUNNY_DAY: + case EFFECT_RAIN_DANCE: + case EFFECT_SANDSTORM: + case EFFECT_HAIL: + case EFFECT_SNOWSCAPE: + case EFFECT_CHILLY_RECEPTION: + aiEffect |= AI_EFFECT_WEATHER; + break; + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_STEEL_ROLLER: + case EFFECT_ICE_SPINNER: + aiEffect |= AI_EFFECT_TERRAIN; + break; + case EFFECT_COURT_CHANGE: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_AURORA_VEIL | AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_DEFOG: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_RAPID_SPIN: + case EFFECT_TIDY_UP: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS; + break; + case EFFECT_BRICK_BREAK: + case EFFECT_RAGING_BULL: + aiEffect |= AI_EFFECT_BREAK_SCREENS; + break; + case EFFECT_HAZE: + aiEffect |= AI_EFFECT_RESET_STATS; + break; + case EFFECT_HIT_SWITCH_TARGET: + case EFFECT_ROAR: + aiEffect |= AI_EFFECT_FORCE_SWITCH; + break; + case EFFECT_TORMENT: + aiEffect |= AI_EFFECT_TORMENT; + break; + case EFFECT_AURORA_VEIL: + aiEffect |= AI_EFFECT_AURORA_VEIL; + break; + case EFFECT_LIGHT_SCREEN: + aiEffect |= AI_EFFECT_LIGHT_SCREEN; + break; + case EFFECT_REFLECT: + aiEffect |= AI_EFFECT_REFLECT; + break; + case EFFECT_GRAVITY: + aiEffect |= AI_EFFECT_GRAVITY; + break; + case EFFECT_DOODLE: + case EFFECT_ENTRAINMENT: + case EFFECT_GASTRO_ACID: + case EFFECT_ROLE_PLAY: + case EFFECT_SIMPLE_BEAM: + case EFFECT_SKILL_SWAP: + case EFFECT_WORRY_SEED: + aiEffect |= AI_EFFECT_CHANGE_ABILITY; + break; + default: + break; + } + return aiEffect; +} + +static u32 GetAIEffectGroupFromMove(u32 battler, u32 move) +{ + u32 aiEffect = GetAIEffectGroup(GetMoveEffect(move)); + + u32 i; + u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + for (i = 0; i < additionalEffectCount; i++) + { + switch (GetMoveAdditionalEffectById(move, i)->moveEffect) + { + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + aiEffect |= AI_EFFECT_WEATHER; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + aiEffect |= AI_EFFECT_TERRAIN; + break; + case MOVE_EFFECT_DEFOG: + aiEffect |= AI_EFFECT_CLEAR_HAZARDS | AI_EFFECT_BREAK_SCREENS; + break; + case MOVE_EFFECT_CLEAR_SMOG: + case MOVE_EFFECT_HAZE: + aiEffect |= AI_EFFECT_RESET_STATS; + break; + case MOVE_EFFECT_TORMENT_SIDE: + aiEffect |= AI_EFFECT_TORMENT; + break; + case MOVE_EFFECT_LIGHT_SCREEN: + aiEffect |= AI_EFFECT_LIGHT_SCREEN; + break; + case MOVE_EFFECT_REFLECT: + aiEffect |= AI_EFFECT_REFLECT; + break; + case MOVE_EFFECT_AURORA_VEIL: + aiEffect |= AI_EFFECT_AURORA_VEIL; + break; + case MOVE_EFFECT_GRAVITY: + aiEffect |= AI_EFFECT_GRAVITY; + break; + default: + break; + } + } + + return aiEffect; +} + +// It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) { if (!HasPartner(battlerAtkPartner)) return FALSE; if (GetMoveEffect(move) == GetMoveEffect(partnerMove) - && partnerMove != MOVE_NONE - && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef) + && partnerMove != MOVE_NONE) { + if (gMovesInfo[move].target == MOVE_TARGET_SELECTED && gMovesInfo[partnerMove].target == MOVE_TARGET_SELECTED) + { + return gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef; + } return TRUE; } return FALSE; } -//PARTNER_MOVE_EFFECT_IS_SAME_NO_TARGET -bool32 PartnerHasSameMoveEffectWithoutTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) -{ - if (!HasPartner(battlerAtkPartner)) - return FALSE; - - if (GetMoveEffect(move) == GetMoveEffect(partnerMove) - && partnerMove != MOVE_NONE) - return TRUE; - return FALSE; -} - //PARTNER_MOVE_EFFECT_IS_STATUS_SAME_TARGET bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove) { @@ -3868,37 +4041,6 @@ bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef return FALSE; } -bool32 IsMoveEffectWeather(u32 move) -{ - enum BattleMoveEffects effect = GetMoveEffect(move); - if (move != MOVE_NONE - && (effect == EFFECT_SUNNY_DAY - || effect == EFFECT_RAIN_DANCE - || effect == EFFECT_SANDSTORM - || effect == EFFECT_HAIL - || effect == EFFECT_SNOWSCAPE - || effect == EFFECT_CHILLY_RECEPTION)) - return TRUE; - return FALSE; -} - -//PARTNER_MOVE_EFFECT_IS_TERRAIN -bool32 PartnerMoveEffectIsTerrain(u32 battlerAtkPartner, u32 partnerMove) -{ - if (!HasPartner(battlerAtkPartner)) - return FALSE; - - enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); - if (partnerMove != MOVE_NONE - && (partnerEffect == EFFECT_GRASSY_TERRAIN - || partnerEffect == EFFECT_MISTY_TERRAIN - || partnerEffect == EFFECT_ELECTRIC_TERRAIN - || partnerEffect == EFFECT_PSYCHIC_TERRAIN)) - return TRUE; - - return FALSE; -} - //PARTNER_MOVE_EFFECT_IS bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck) { @@ -4363,17 +4505,14 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; - // Don't increase stats if opposing battler has used Haze effect - if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) && - (HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE) - || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) - || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) + // Don't increase stats if opposing battler has used Haze effect or AI effect + if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) + && HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE)) return NO_INCREASE; // Don't increase if AI is at +1 and opponent has Haze effect - if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 5 && (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_HAZE) - || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) - || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) + if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 5 + && HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_RESET_STATS)) return NO_INCREASE; // Don't increase stats if AI could KO target through Sturdy effect, as otherwise it always 2HKOs @@ -4976,11 +5115,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { if (CountUsablePartyMons(battlerDef) == 0 - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_COURT_CHANGE) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_DEFOG) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_TIDY_UP) - || HasBattlerSideMoveWithEffect(battlerDef, MOVE_EFFECT_DEFOG)) + || HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_CLEAR_HAZARDS)) return FALSE; if (IsBattleMoveStatus(move)) @@ -5023,27 +5158,17 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData) { u32 preventsStatLoss; - u32 partnerAbility; - u32 partnerHoldEffect = aiData->holdEffects[battlerAtkPartner]; + u32 partnerAbility = aiData->abilities[battlerAtkPartner]; u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); u32 opposingBattler = GetBattlerAtPosition(opposingPosition); - if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) - partnerAbility = ABILITY_NONE; - else - partnerAbility = aiData->abilities[battlerAtkPartner]; - if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE || partnerAbility == ABILITY_CONTRARY || partnerAbility == ABILITY_GOOD_AS_GOLD - || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) - || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) + || HasBattlerSideMoveWithEffect(FOE(battlerAtk), EFFECT_FOUL_PLAY)) return FALSE; - preventsStatLoss = (partnerAbility == ABILITY_CLEAR_BODY - || partnerAbility == ABILITY_FULL_METAL_BODY - || partnerAbility == ABILITY_WHITE_SMOKE - || partnerHoldEffect == HOLD_EFFECT_CLEAR_AMULET); + preventsStatLoss = !CanLowerStat(battlerAtk, battlerAtkPartner, aiData, STAT_DEF); switch (GetMoveEffect(aiData->partnerMove)) { diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index e0eac1eeed..ab6b4a4425 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -90,7 +90,7 @@ TO_DO_BATTLE_TEST("AI understands Instruct") TO_DO_BATTLE_TEST("AI understands Quick Guard") TO_DO_BATTLE_TEST("AI understands Wide Guard") -AI_DOUBLE_BATTLE_TEST("AI will not use the same nondamaging move as its partner for no reason") +AI_DOUBLE_BATTLE_TEST("AI won't use the same nondamaging move as its partner for no reason") { u32 move; PARAMETRIZE { move = MOVE_AROMATHERAPY; } From 89b179e4c43650992ccffa9f73b5942117a7c1d7 Mon Sep 17 00:00:00 2001 From: Linathan <35115312+LinathanZel@users.noreply.github.com> Date: Sat, 9 Aug 2025 18:27:47 -0400 Subject: [PATCH 195/248] Fixes draining moves recovering 1 HP when dealing 0 damage (#7523) Co-authored-by: root Co-authored-by: LinathanZel --- src/battle_script_commands.c | 5 ++++- test/battle/move_effect/absorb.c | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/battle_script_commands.c diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c old mode 100644 new mode 100755 index 965745608c..943e7db979 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6061,10 +6061,13 @@ static void Cmd_moveend(void) switch (moveEffect) { case EFFECT_ABSORB: - if (!(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) && IsBattlerAlive(gBattlerAttacker)) + if (!(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) + && gBattleStruct->moveDamage[gBattlerTarget] > 0 + && IsBattlerAlive(gBattlerAttacker)) { gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; effect = TRUE; if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 456c888cd4..d497bc3f04 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -104,3 +104,17 @@ SINGLE_BATTLE_TEST("Absorb does not drain any HP if user flinched") } TO_DO_BATTLE_TEST("Absorb recovers 50% of the damage dealt to a Substitute"); + +SINGLE_BATTLE_TEST("Absorb does not drain any HP if user does 0 damage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_ENDURE); MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + NOT MESSAGE("The opposing Wobbuffet had its energy drained!"); + } +} From de6c9c617692d6b6298fbfc8e722f1948ad8df23 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 11 Aug 2025 09:06:23 +0100 Subject: [PATCH 196/248] Hacky support for enums in C asm statements (#7494) --- include/test/overworld_script.h | 1 - tools/preproc/asm_file.cpp | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/test/overworld_script.h b/include/test/overworld_script.h index e849f87e0c..a5bee797b2 100644 --- a/include/test/overworld_script.h +++ b/include/test/overworld_script.h @@ -51,7 +51,6 @@ asm(".set FALSE, 0\n" ".set VARS_END, " STR(VARS_END) "\n" ".set SPECIAL_VARS_START, " STR(SPECIAL_VARS_START) "\n" ".set SPECIAL_VARS_END, " STR(SPECIAL_VARS_END) "\n"); -asm(".include \"constants/gba_constants.inc\"\n"); // Make overworld script macros available. asm(".include \"constants/gba_constants.inc\"\n" diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 83e84a6fde..10330f1774 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -620,6 +620,10 @@ bool AsmFile::ParseEnum() } enumCounter = 0; } + // HACK(#7394): Make the definitions global so that C 'asm' + // statements are able to reference them (if they happen to + // be available in an assembled object file). + std::printf(".global %s; ", currentIdentName.c_str()); std::printf(".equiv %s, (%s) + %ld\n", currentIdentName.c_str(), enumBase.c_str(), enumCounter); enumCounter++; symbolCount++; From a9d5c2cd289e6ad4aca2f541982da5fb940a7e6f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 11 Aug 2025 10:06:58 -0400 Subject: [PATCH 197/248] Updated Dream Eater/Liquid Ooze's interaction to Gen 5 standards (#7528) --- data/battle_scripts_1.s | 51 +++--------------------- docs/tutorials/how_to_testing_system.md | 2 +- include/battle_scripts.h | 2 +- include/config/battle.h | 3 +- include/constants/battle_move_effects.h | 2 +- include/constants/battle_string_ids.h | 1 - include/constants/generational_changes.h | 1 + include/generational_changes.h | 1 + include/test/battle.h | 2 +- src/battle_message.c | 1 - src/battle_script_commands.c | 14 ++++--- src/battle_util.c | 4 +- test/battle/ability/liquid_ooze.c | 3 +- test/battle/move_effect/dream_eater.c | 4 +- 14 files changed, 27 insertions(+), 64 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 53f6697aef..248d79714d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2835,13 +2835,6 @@ BattleScript_AlreadyAsleep:: setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_WasntAffected:: - pause B_WAIT_TIME_SHORT - printstring STRINGID_PKMNWASNTAFFECTED - waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_FAILED - goto BattleScript_MoveEnd - BattleScript_CantMakeAsleep:: pause B_WAIT_TIME_SHORT printfromtable gUproarAwakeStringIds @@ -2886,44 +2879,10 @@ BattleScript_MaxHp50Recoil:: BattleScript_EffectDreamEater:: attackcanceler - jumpifsubstituteblocks BattleScript_DreamEaterNoEffect - jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked - jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_DreamEaterWorked -BattleScript_DreamEaterNoEffect: - attackstring - ppreduce - waitmessage B_WAIT_TIME_LONG - goto BattleScript_WasntAffected -BattleScript_DreamEaterWorked: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_DreamEaterTryFaintEnd - setdrainedhp - manipulatedamage DMG_BIG_ROOT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - jumpifmovehadnoeffect BattleScript_DreamEaterTryFaintEnd - printstring STRINGID_PKMNENERGYDRAINED - waitmessage B_WAIT_TIME_LONG -BattleScript_DreamEaterTryFaintEnd: - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd + jumpifsubstituteblocks BattleScript_DoesntAffectTargetAtkString + jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_HitFromAccCheck + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_HitFromAccCheck + goto BattleScript_DoesntAffectTargetAtkString BattleScript_EffectMirrorMove:: attackcanceler @@ -9168,7 +9127,7 @@ BattleScript_EjectPackActivates:: jumpifcantswitch BS_SCRIPTING, BattleScript_EjectButtonEnd goto BattleScript_EjectPackActivate_Ret -BattleScript_DarkTypePreventsPrankster:: +BattleScript_DoesntAffectTargetAtkString:: attackstring ppreduce pause B_WAIT_TIME_SHORT diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index c5fbb945aa..b663ad54b4 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -428,7 +428,7 @@ Spaces in pattern match newlines (\n, \l, and \p) in the message. Often used to check that a battler took its turn but it failed, e.g.: ``` MESSAGE("Wobbuffet used Dream Eater!"); - MESSAGE("The opposing Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect the opposing Wobbuffet…"); ``` ### `STATUS_ICON` diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ef6206cf45..46326a42df 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -426,7 +426,7 @@ extern const u8 BattleScript_MentalHerbCureEnd2[]; extern const u8 BattleScript_TerrainPreventsEnd2[]; extern const u8 BattleScript_MistyTerrainPrevents[]; extern const u8 BattleScript_ElectricTerrainPrevents[]; -extern const u8 BattleScript_DarkTypePreventsPrankster[]; +extern const u8 BattleScript_DoesntAffectTargetAtkString[]; extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_GulpMissileFormChange[]; diff --git a/include/config/battle.h b/include/config/battle.h index d09698c634..3cfd319304 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -131,7 +131,8 @@ #define B_SKIP_RECHARGE GEN_LATEST // In Gen1, recharging moves such as Hyper Beam skip the recharge if the target gets KO'd #define B_ENCORE_TARGET GEN_LATEST // In Gen5+, encored moves are allowed to choose a target #define B_TIME_OF_DAY_HEALING_MOVES GEN_LATEST // In Gen2, Morning Sun, Moonlight, and Synthesis heal twice as much HP based off the time of day. Also changes how much they heal. Evening affects Moonlight. - // If OW_TIMES_OF_DAY is set to Gen 3, then Morning Sun is boosted during the day. + // If OW_TIMES_OF_DAY is set to Gen 3, then Morning Sun is boosted during the day. +#define B_DREAM_EATER_LIQUID_OOZE GEN_LATEST // In Gen5+, Dream Eater is affected by Liquid Ooze. // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 53c9843d5b..2ddb75adf6 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -9,7 +9,7 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_ABSORB, EFFECT_EXPLOSION, EFFECT_MISTY_EXPLOSION, // Same as EFFECT_EXPLOSION but it's boosted on Misty Terrain - EFFECT_DREAM_EATER, + EFFECT_DREAM_EATER, // Same as EFFECT_ABSORB but it can only be used on sleeping targets EFFECT_MIRROR_MOVE, EFFECT_ATTACK_UP, EFFECT_DEFENSE_UP, diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index df7b5e6232..3343a449e7 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -41,7 +41,6 @@ enum StringID STRINGID_PKMNMADESLEEP, STRINGID_PKMNALREADYASLEEP, STRINGID_PKMNALREADYASLEEP2, - STRINGID_PKMNWASNTAFFECTED, STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNHURTBYPOISON, diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 6892f70ee2..e51d57915c 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -28,6 +28,7 @@ enum GenConfigTag GEN_STEAL_WILD_ITEMS, GEN_SNOW_WARNING, GEN_ALLY_SWITCH_FAIL_CHANCE, + GEN_DREAM_EATER_LIQUID_OOZE, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 9c24608e63..53991bab1f 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -31,6 +31,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_STEAL_WILD_ITEMS] = B_STEAL_WILD_ITEMS, [GEN_SNOW_WARNING] = B_SNOW_WARNING, [GEN_ALLY_SWITCH_FAIL_CHANCE] = B_ALLY_SWITCH_FAIL_CHANCE, + [GEN_DREAM_EATER_LIQUID_OOZE] = B_DREAM_EATER_LIQUID_OOZE, }; #if TESTING diff --git a/include/test/battle.h b/include/test/battle.h index 2ec2b1da0a..b95038b09e 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -434,7 +434,7 @@ * Spaces in pattern match newlines (\n, \l, and \p) in the message. * Often used to check that a battler took its turn but it failed, e.g.: * MESSAGE("Wobbuffet used Dream Eater!"); - * MESSAGE("The opposing Wobbuffet wasn't affected!"); + * MESSAGE("It doesn't affect the opposing Wobbuffet…"); * * STATUS_ICON(battler, status1 | none: | sleep: | poison: | burn: | freeze: | paralysis:, badPoison:) * Causes the test to fail if the battler's status is not changed to the diff --git a/src/battle_message.c b/src/battle_message.c index d49b96b8be..132cfa66f0 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -200,7 +200,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNMADESLEEP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYASLEEP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already asleep!"), [STRINGID_PKMNALREADYASLEEP2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is already asleep!"), - [STRINGID_PKMNWASNTAFFECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} wasn't affected!"), //not in gen 5+, ability popup [STRINGID_PKMNWASPOISONED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned!"), [STRINGID_PKMNPOISONEDBY] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTBYPOISON] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by its poisoning!"), diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 109f044f2c..8bd6d3ab6a 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6066,6 +6066,7 @@ static void Cmd_moveend(void) switch (moveEffect) { case EFFECT_ABSORB: + case EFFECT_DREAM_EATER: if (!(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) && gBattleStruct->moveDamage[gBattlerTarget] > 0 && IsBattlerAlive(gBattlerAttacker)) @@ -6075,18 +6076,19 @@ static void Cmd_moveend(void) gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; effect = TRUE; - if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) + if ((moveEffect == EFFECT_DREAM_EATER && GetGenConfig(GEN_DREAM_EATER_LIQUID_OOZE) < GEN_5) + || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; + BattleScriptCall(BattleScript_EffectAbsorb); + } + else { gBattleStruct->moveDamage[gBattlerAttacker] *= -1; gHitMarker |= HITMARKER_PASSIVE_DAMAGE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; - BattleScriptCall(BattleScript_EffectAbsorb); - } } break; case EFFECT_FINAL_GAMBIT: diff --git a/src/battle_util.c b/src/battle_util.c index 97753232c6..13f830d953 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1194,7 +1194,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) SET_STATCHANGER(STAT_SPEED, 1, FALSE); } - if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNWASNTAFFECTED || stringId == STRINGID_PKMNUNAFFECTED)) + if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNUNAFFECTED)) TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, stringId); @@ -3046,7 +3046,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected - battleScriptBlocksMove = BattleScript_DarkTypePreventsPrankster; + battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } // Check def partner ability diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index 1bd3cbbdf8..2c89702911 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -140,9 +140,9 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder" SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of heal (Gen 5+)") { - KNOWN_FAILING; s16 damage; GIVEN { + WITH_CONFIG(GEN_DREAM_EATER_LIQUID_OOZE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); @@ -167,6 +167,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP inst { s16 damage; GIVEN { + WITH_CONFIG(GEN_DREAM_EATER_LIQUID_OOZE, GEN_3); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index caa365a17a..baefd2e4ff 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Dream Eater fails on awake targets") TURN { MOVE(player, MOVE_DREAM_EATER); } } SCENE { MESSAGE("Wobbuffet used Dream Eater!"); - MESSAGE("The opposing Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect the opposing Wobbuffet…"); } } @@ -88,7 +88,7 @@ SINGLE_BATTLE_TEST("Dream Eater fails if the target is behind a Substitute (Gen TURN { MOVE(opponent, MOVE_DREAM_EATER); } } SCENE { MESSAGE("The opposing Wobbuffet used Dream Eater!"); - MESSAGE("Wobbuffet wasn't affected!"); + MESSAGE("It doesn't affect Wobbuffet…"); } } #else From 38cfc4bacf3eb4dabb22c3a3e8b81abbb27840d1 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 11 Aug 2025 18:26:41 +0200 Subject: [PATCH 198/248] Modify move prediction to work in doubles (#7087) --- include/battle.h | 8 +-- include/battle_ai_util.h | 2 +- include/config/ai.h | 4 +- src/battle_ai_main.c | 108 +++++++++++++--------------- src/battle_ai_switch_items.c | 34 ++++----- src/battle_ai_util.c | 20 +++--- test/battle/ai/ai_check_viability.c | 24 +++++++ 7 files changed, 107 insertions(+), 93 deletions(-) diff --git a/include/battle.h b/include/battle.h index 47739ca264..086eb68f51 100644 --- a/include/battle.h +++ b/include/battle.h @@ -329,12 +329,12 @@ struct AiLogicData u8 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button u8 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack u8 predictingSwitch:1; // Determines whether AI will use switch predictions this turn or not - u8 predictingMove:1; // Determines whether AI will use move predictions this turn or not u8 aiPredictionInProgress:1; // Tracks whether the AI is in the middle of running prediction calculations - u8 padding:2; - u8 shouldSwitch; // Stores result of ShouldSwitch, which decides whether a mon should be switched out u8 aiCalcInProgress:1; - u8 battlerDoingPrediction; // Stores which battler is currently running its prediction calcs + u8 predictingMove:1; // Determines whether AI will use move predictions this turn or not + u8 padding1:1; + u8 shouldSwitch:4; // Stores result of ShouldSwitch, which decides whether a mon should be switched out + u8 padding2:4; u16 predictedMove[MAX_BATTLERS_COUNT]; }; diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 448fbf71c5..118fbf5984 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -80,6 +80,7 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); bool32 IsAiBattlerAware(u32 battlerId); +bool32 CanAiPredictMove(void); bool32 IsAiBattlerAssumingStab(void); bool32 IsAiBattlerAssumingStatusMoves(void); bool32 ShouldRecordStatusMove(u32 move); @@ -297,7 +298,6 @@ bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); -u32 GetThinkingBattler(u32 battler); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); // These are for the purpose of not doubling up on moves during double battles. diff --git a/include/config/ai.h b/include/config/ai.h index 8d015ce9e4..b6eb7bfe21 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -52,7 +52,7 @@ #define AI_GOOD_SCORE_THRESHOLD 100 // Move scores above this threshold are considered "good" when deciding switching // AI held item-based move scoring -#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy +#define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy // AI move scoring #define STATUS_MOVE_FOCUS_PUNCH_CHANCE 50 // Chance the AI will use a status move if the player's best move is Focus Punch @@ -73,7 +73,7 @@ // AI Terastalization chances #define AI_CONSERVE_TERA_CHANCE_PER_MON 10 // Chance for AI with smart tera flag to decide not to tera before considering defensive benefit is this*(X-1), where X is the number of alive pokemon that could tera -#define AI_TERA_PREDICT_CHANCE 40 // Chance for AI with smart tera flag to tera in the situation where tera would save it from a KO, but could be punished by a KO from a different move. +#define AI_TERA_PREDICT_CHANCE 40 // Chance for AI with smart tera flag to tera in the situation where tera would save it from a KO, but could be punished by a KO from a different move. // AI_FLAG_PP_STALL_PREVENTION settings #define PP_STALL_DISREGARD_MOVE_PERCENTAGE 50 // Detection chance per roll diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5e75f1dfb3..5460e31dee 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -33,6 +33,7 @@ #define AI_ACTION_WATCH (1 << 2) #define AI_ACTION_DO_NOT_ATTACK (1 << 3) +static u32 ChooseMoveOrAction(u32 battler); static u32 ChooseMoveOrAction_Singles(u32 battler); static u32 ChooseMoveOrAction_Doubles(u32 battler); static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAtk, u32 battlerDef); @@ -278,16 +279,17 @@ void BattleAI_SetupFlags(void) { gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT]; } - else + else // Assign ai flags for player for prediction { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = 0; // player + u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA) | GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = aiFlags; + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = aiFlags; } } void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) { - u32 moveLimitations, moveLimitationsTarget; - u32 defaultScoreMovesTarget = defaultScoreMoves; + u32 moveLimitations; u64 flags[MAX_BATTLERS_COUNT]; u32 moveIndex; @@ -313,25 +315,6 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) gBattlerTarget = SetRandomTarget(battler); gAiBattleData->chosenTarget[battler] = gBattlerTarget; - - // Initialize move prediction scores - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) - { - u32 opposingBattler = GetOppositeBattler(battler); - moveLimitationsTarget = gAiLogicData->moveLimitations[opposingBattler]; - - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) - { - if (moveLimitationsTarget & (1u << moveIndex)) - SET_SCORE(opposingBattler, moveIndex, 0); - if (defaultScoreMovesTarget & 1) - SET_SCORE(opposingBattler, moveIndex, AI_SCORE_DEFAULT); - else - SET_SCORE(opposingBattler, moveIndex, 0); - - defaultScoreMovesTarget >>= 1; - } - } } bool32 BattlerChoseNonMoveAction(void) @@ -355,7 +338,6 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) { s32 opposingBattler = GetOppositeBattler(battler); gAiLogicData->aiPredictionInProgress = TRUE; - gAiLogicData->battlerDoingPrediction = battler; // Switch prediction if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) @@ -364,31 +346,21 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) if (ShouldSwitch(opposingBattler)) gAiLogicData->shouldSwitch |= (1u << opposingBattler); gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; - - // Determine whether AI will use predictions this turn - gAiLogicData->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); } - // Move prediction - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) - { - gAiLogicData->predictedMove[opposingBattler] = gBattleMons[opposingBattler].moves[BattleAI_ChooseMoveIndex(opposingBattler)]; - ModifySwitchAfterMoveScoring(opposingBattler); + // Determine whether AI will use predictions this turn + gAiLogicData->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); - // Determine whether AI will use predictions this turn - gAiLogicData->predictingMove = RandomPercentage(RNG_AI_PREDICT_MOVE, PREDICT_MOVE_CHANCE); - } gAiLogicData->aiPredictionInProgress = FALSE; } void ComputeBattlerDecisions(u32 battler) { - if ((gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) - && (BattlerHasAi(battler) - && !(gBattleTypeFlags & BATTLE_TYPE_PALACE))) + bool32 isAiBattler = (gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) && (BattlerHasAi(battler) && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)); + if (isAiBattler || CanAiPredictMove()) { // If ai is about to flee or chosen to watch player, no need to calc anything - if (BattlerChoseNonMoveAction()) + if (isAiBattler && BattlerChoseNonMoveAction()) return; // Risky AI switches aggressively even mid battle @@ -401,10 +373,13 @@ void ComputeBattlerDecisions(u32 battler) SetupAIPredictionData(battler, switchType); // AI's own switching data - gAiLogicData->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); - if (ShouldSwitch(battler)) - gAiLogicData->shouldSwitch |= (1u << battler); - gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; + if (isAiBattler) + { + gAiLogicData->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); + if (ShouldSwitch(battler)) + gAiLogicData->shouldSwitch |= (1u << battler); + gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; + } // AI's move scoring gAiBattleData->chosenMoveIndex[battler] = BattleAI_ChooseMoveIndex(battler); // Calculate score and chose move index @@ -425,6 +400,13 @@ void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) SetAIUsingGimmick(battlerAtk, NO_GIMMICK); } +static u32 ChooseMoveOrAction(u32 battler) +{ + if (IsDoubleBattle()) + return ChooseMoveOrAction_Doubles(battler); + return ChooseMoveOrAction_Singles(battler); +} + u32 BattleAI_ChooseMoveIndex(u32 battler) { u32 chosenMoveIndex; @@ -434,16 +416,11 @@ u32 BattleAI_ChooseMoveIndex(u32 battler) if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) DecideTerastal(battler); - - if (!IsDoubleBattle()) - chosenMoveIndex = ChooseMoveOrAction_Singles(battler); - else - chosenMoveIndex = ChooseMoveOrAction_Doubles(battler); + chosenMoveIndex = ChooseMoveOrAction(battler); if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) ReconsiderGimmick(battler, gBattlerTarget, gBattleMons[battler].moves[chosenMoveIndex]); - // Clear protect structures, some flags may be set during AI calcs // e.g. pranksterElevated from GetBattleMovePriority memset(&gProtectStructs, 0, MAX_BATTLERS_COUNT * sizeof(struct ProtectStruct)); @@ -573,7 +550,6 @@ void RecordStatusMoves(u32 battler) void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { u32 ability, holdEffect; - ability = aiData->abilities[battler] = AI_DecideKnownAbilityForTurn(battler); aiData->items[battler] = gBattleMons[battler].item; holdEffect = aiData->holdEffects[battler] = AI_DecideHoldEffectForTurn(battler); @@ -691,6 +667,20 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) SetBattlerAiMovesData(aiData, battlerAtk, battlersCount, weather); } + + for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) + { + // Prediction limited to player side but can be expanded to read partners move in the future + if (!IsOnPlayerSide(battlerAtk) || !CanAiPredictMove()) + continue; + + // This can potentially be cleaned up more + BattleAI_SetupAIData(0xF, battlerAtk); + u32 chosenMoveIndex = ChooseMoveOrAction(battlerAtk); + gAiLogicData->predictedMove[battlerAtk] = gBattleMons[battlerAtk].moves[chosenMoveIndex]; + aiData->predictingMove = RandomPercentage(RNG_AI_PREDICT_MOVE, PREDICT_MOVE_CHANCE); + } + if (DEBUG_AI_DELAY_TIMER) // We add to existing to compound multiple calls gBattleStruct->aiDelayCycles += CycleCountEnd(); @@ -749,7 +739,7 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) u8 consideredMoveArray[MAX_MON_MOVES]; u32 numOfBestMoves; s32 i; - u64 flags = gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)]; + u64 flags = gAiThinkingStruct->aiFlags[battler]; u32 opposingBattler = GetOppositeBattler(battler); gAiLogicData->partnerMove = 0; // no ally @@ -831,7 +821,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) gAiLogicData->partnerMove = GetAllyChosenMove(battler); gAiThinkingStruct->aiLogicId = 0; gAiThinkingStruct->movesetIndex = 0; - flags = gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)]; + flags = gAiThinkingStruct->aiFlags[battler]; while (flags != 0) { @@ -1139,7 +1129,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) abilityDef = ABILITY_NONE; // If a pokemon can be guaranteed flinched, don't target the pokemon that can't be flinched. - if (hasTwoOpponents + if (hasTwoOpponents && !IsFlinchGuaranteed(battlerAtk, battlerDef, move) && IsFlinchGuaranteed(battlerAtk, BATTLE_PARTNER(battlerDef), move) && aiData->effectiveness[battlerAtk][BATTLE_PARTNER(battlerDef)][gAiThinkingStruct->movesetIndex] != UQ_4_12(0.0)) ADJUST_SCORE(-5); @@ -1975,7 +1965,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CHILLY_RECEPTION: if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); - else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) + else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) ADJUST_SCORE(-8); break; @@ -2254,12 +2244,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); decreased = TRUE; } + break; case PROTECT_WIDE_GUARD: if(!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) { ADJUST_SCORE(-10); decreased = TRUE; } + break; case PROTECT_CRAFTY_SHIELD: if (!hasPartner) { @@ -3000,7 +2992,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - + bool32 hasPartner = HasPartner(battlerAtk); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); @@ -3095,7 +3087,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out. // This unsets Trick Room and resets it with a full timer. case EFFECT_TRICK_ROOM: - if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter + if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, MOVE_TRICK_ROOM) && RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE)) @@ -5741,8 +5733,8 @@ static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); - if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && - (GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) + if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && + (GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) ADJUST_SCORE(BEST_EFFECT); if (hitsToKO > 0) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 379ce723fd..6f470d3c84 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -111,11 +111,11 @@ u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) static bool32 IsAceMon(u32 battler, u32 monPartyId) { - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; @@ -215,7 +215,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) bool32 canBattlerWin1v1 = FALSE, isBattlerFirst, isBattlerFirstPriority; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic @@ -486,7 +486,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); s32 i, j; - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; if (GetMoveEffect(incomingMove) == EFFECT_HIDDEN_POWER && RandomPercentage(RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE)) return FALSE; @@ -618,7 +618,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); - if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; if (isOpposingBattlerChargingOrInvulnerable && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) @@ -637,7 +637,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Check if current mon has an ability that traps opponent @@ -681,7 +681,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) { //Yawn if (gStatuses3[battler] & STATUS3_YAWN @@ -869,7 +869,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc u16 move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) return FALSE; if (gLastLandedMoves[battler] == MOVE_NONE) @@ -1007,7 +1007,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // If not Encore'd don't switch @@ -1057,7 +1057,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Physical attacker @@ -1117,7 +1117,7 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // Sequence Switching AI never switches mid-battle - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) return FALSE; availableToSwitch = 0; @@ -1169,7 +1169,7 @@ bool32 ShouldSwitch(u32 battler) if (ShouldSwitchIfWonderGuard(battler)) return TRUE; - if ((gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) return FALSE; if (ShouldSwitchIfTrapperInParty(battler)) return TRUE; @@ -1197,7 +1197,7 @@ bool32 ShouldSwitch(u32 battler) // Removing switch capabilites under specific conditions // These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) return FALSE; if (CanUseSuperEffectiveMoveAgainstOpponents(battler)) return FALSE; @@ -1216,7 +1216,7 @@ bool32 ShouldSwitch(u32 battler) bool32 ShouldSwitchIfAllScoresBad(u32 battler) { u32 i, score, opposingBattler = GetOppositeBattler(battler); - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; for (i = 0; i < MAX_MON_MOVES; i++) @@ -1268,7 +1268,7 @@ void ModifySwitchAfterMoveScoring(u32 battler) return; // Sequence Switching AI never switches mid-battle - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) return; availableToSwitch = 0; @@ -2329,14 +2329,14 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) { bestMonId = GetNextMonInParty(party, firstId, lastId, battlerIn1, battlerIn2); return bestMonId; } // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 624dd7cf5a..e044f7b3e9 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -173,11 +173,17 @@ bool32 IsAiBattlerPredictingAbility(u32 battlerId) return BattlerHasAi(battlerId); } +bool32 CanAiPredictMove(void) +{ + return gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_MOVE + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_MOVE; +} + bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch - if (gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH - || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_SWITCH + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_SWITCH) { if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) return TRUE; @@ -188,9 +194,8 @@ bool32 IsBattlerPredictedToSwitch(u32 battler) // Either a predicted move or the last used move from an opposing battler u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) { - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE && aiData->predictingMove) + if (aiData->predictingMove && CanAiPredictMove()) return aiData->predictedMove[opposingBattler]; - return aiData->lastUsedMove[opposingBattler]; } @@ -5702,13 +5707,6 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return WEAK_EFFECT; } -u32 GetThinkingBattler(u32 battler) -{ - if (gAiLogicData->aiPredictionInProgress) - return gAiLogicData->battlerDoingPrediction; - return battler; -} - bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget) { if (B_WILD_NATURAL_ENEMIES != TRUE) diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 1407023ece..f18f7aceb1 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -339,3 +339,27 @@ AI_SINGLE_BATTLE_TEST("AI uses Skill Swap against Poison Heal") TURN { NOT_EXPECT_MOVE(opponent, MOVE_SKILL_SWAP); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Quick Guard against Quick Attack when opponent would take poison damage") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + PLAYER(SPECIES_RATTATA) { Moves(MOVE_QUICK_ATTACK); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_QUICK_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_QUICK_GUARD); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would take poison damage") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + PLAYER(SPECIES_RATTATA) { Moves(MOVE_EARTHQUAKE); Status1(STATUS1_TOXIC_POISON); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + OPPONENT(SPECIES_RATTATA) { Moves(MOVE_WIDE_GUARD, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } + } +} From 2469627c61f7e939bd2aadc2af16c453172c1bb4 Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 11 Aug 2025 13:35:10 -0400 Subject: [PATCH 199/248] AI uses Court Change. (#7525) --- src/battle_ai_main.c | 39 +++++++++++++++++++++++++- test/battle/move_effect/court_change.c | 32 +++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5460e31dee..6d7f4ed09d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2320,6 +2320,23 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-9); break; + case EFFECT_COURT_CHANGE: + if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_BAD_COURT) + ADJUST_SCORE(BAD_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_GOOD_COURT) + ADJUST_SCORE(BAD_EFFECT); + if (AreAnyHazardsOnSide(GetBattlerSide(FOE(battlerAtk))) && CountUsablePartyMons(battlerAtk) != 0) + ADJUST_SCORE(WORST_EFFECT); + if (hasPartner) + { + if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change + { + ADJUST_SCORE(-10); + break; // Don't use Defog if partner is going to set up hazards + } + } + break; case EFFECT_DEFOG: if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST) || AreAnyHazardsOnSide(GetBattlerSide(battlerAtk))) @@ -2880,7 +2897,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); } break; - case EFFECT_COURT_CHANGE: case EFFECT_TEATIME: if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -4603,6 +4619,27 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); break; + case EFFECT_COURT_CHANGE: + if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_GOOD_COURT) + ADJUST_SCORE(WEAK_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_BAD_COURT) + ADJUST_SCORE(WEAK_EFFECT); + + if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if (hasPartner) + { + if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change + { + ADJUST_SCORE(-10); + break; + } + } + break; case EFFECT_DEFOG: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) || (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_FOG)) diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 56d38c165d..40a1fe4e86 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -217,3 +217,35 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Vine Lash, G-Max } } } + +AI_SINGLE_BATTLE_TEST("AI uses Court Change") +{ + u32 move; + + PARAMETRIZE { move = MOVE_HEADBUTT; } + PARAMETRIZE { move = MOVE_REFLECT; } + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_SAFEGUARD; } + PARAMETRIZE { move = MOVE_SPIKES; } + PARAMETRIZE { move = MOVE_STEALTH_ROCK; } + PARAMETRIZE { move = MOVE_TOXIC_SPIKES; } + PARAMETRIZE { move = MOVE_TAILWIND; } + PARAMETRIZE { move = MOVE_STICKY_WEB; } + PARAMETRIZE { move = MOVE_MIST; } + PARAMETRIZE { move = MOVE_LUCKY_CHANT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_HEADBUTT); } + if (move == MOVE_HEADBUTT) + TURN { MOVE(player, MOVE_CELEBRATE); NOT_EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); } + else + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); } + } +} + From f4c91b5539be83cb7d658bc8d77f475368a2ddc2 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 11 Aug 2025 23:19:36 +0200 Subject: [PATCH 200/248] Convert statuses3 to volatiles (#7514) --- asm/macros/battle_script.inc | 24 ++--- data/battle_scripts_1.s | 33 +++--- include/battle.h | 1 - include/battle_util.h | 2 +- include/constants/battle.h | 116 ++++++++++----------- src/battle_ai_field_statuses.c | 25 +++-- src/battle_ai_main.c | 90 +++++++++-------- src/battle_ai_switch_items.c | 16 +-- src/battle_ai_util.c | 45 +++++---- src/battle_anim_effects_1.c | 1 - src/battle_debug.c | 81 ++++----------- src/battle_end_turn.c | 59 +++++------ src/battle_main.c | 26 ++--- src/battle_script_commands.c | 179 ++++++++++++++------------------- src/battle_tv.c | 2 +- src/battle_util.c | 82 +++++++-------- src/item_use.c | 4 +- 17 files changed, 350 insertions(+), 436 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9dd0479c92..2d70c5e722 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -187,12 +187,8 @@ .4byte \jumpInstr .endm - .macro jumpifstatus3condition battler:req, flags:req, jumpIfTrue:req, jumpInstr:req + .macro unused_0x21 .byte 0x21 - .byte \battler - .4byte \flags - .byte \jumpIfTrue - .4byte \jumpInstr .endm .macro jumpbasedontype battler:req, type:req, jumpIfType:req, jumpInstr:req @@ -738,9 +734,8 @@ .4byte \jumpInstr .endm - .macro setmiracleeye failInstr:req + .macro unused_0x83 .byte 0x83 - .4byte \failInstr .endm .macro jumpifuproarwakes jumpInstr:req @@ -1085,7 +1080,7 @@ tryfiretwoturnmovenowbyeffect \battler, FALSE, \jumpInstr .endm - .macro setminimize + .macro unused_0xC7 .byte 0xc7 .endm @@ -1191,9 +1186,10 @@ .4byte \failInstr .endm - .macro setuserstatus3 flags:req, failInstr:req + .macro trysetvolatile battler:req, _volatile:req, failInstr:req .byte 0xdd - .4byte \flags + .byte \battler + .byte \_volatile .4byte \failInstr .endm @@ -1884,14 +1880,6 @@ jumpifhalfword CMP_NOT_EQUAL, gChosenMove, \move, \jumpInstr .endm - .macro jumpifstatus3 battler:req, flags:req, jumpInstr:req - jumpifstatus3condition \battler, \flags, FALSE, \jumpInstr - .endm - - .macro jumpifnostatus3 battler:req, flags:req, jumpInstr:req - jumpifstatus3condition \battler, \flags, TRUE, \jumpInstr - .endm - .macro jumpifmovehadnoeffect jumpInstr:req jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, \jumpInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 248d79714d..b7b4ec99cd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1182,7 +1182,7 @@ BattleScript_StrengthSapAnimation: @ Drain HP without lowering a stat BattleScript_StrengthSapHp: jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapManipulateDmg - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveEnd + jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveEnd jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd BattleScript_StrengthSapManipulateDmg: manipulatedamage DMG_BIG_ROOT @@ -1240,7 +1240,7 @@ BattleScript_EffectLaserFocus:: attackcanceler attackstring ppreduce - setuserstatus3 STATUS3_LASER_FOCUS, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_LASER_FOCUS, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_LASERFOCUS @@ -2189,8 +2189,8 @@ BattleScript_EffectHealPulse:: attackcanceler attackstring ppreduce - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff - jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents + jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff + jumpifvolatile BS_TARGET, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed tryhealpulse BattleScript_AlreadyAtFullHp @@ -2485,9 +2485,9 @@ BattleScript_EffectMagnetRise:: attackcanceler attackstring ppreduce - jumpifstatus3 BS_ATTACKER, STATUS3_ROOTED, BattleScript_ButItFailed - jumpifstatus3 BS_ATTACKER, STATUS3_SMACKED_DOWN, BattleScript_ButItFailed - setuserstatus3 STATUS3_MAGNET_RISE, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_SMACK_DOWN, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_MAGNET_RISE, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNLEVITATEDONELECTROMAGNETISM @@ -2535,7 +2535,7 @@ BattleScript_EffectAquaRing:: attackcanceler attackstring ppreduce - setuserstatus3 STATUS3_AQUA_RING, BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_AQUA_RING attackanimation waitanimation printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER @@ -2596,7 +2596,7 @@ BattleScript_EffectMiracleEye:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - setmiracleeye BattleScript_ButItFailed + setvolatile BS_TARGET, VOLATILE_MIRACLE_EYE goto BattleScript_IdentifiedFoe BattleScript_EffectGravity:: @@ -2614,7 +2614,8 @@ BattleScript_EffectGravitySuccess:: BattleScript_GravityLoop: movevaluescleanup jumpfifsemiinvulnerable BS_TARGET, STATE_ON_AIR, BattleScript_GravityLoopDrop - jumpifstatus3 BS_TARGET, STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop + jumpifvolatile BS_TARGET, VOLATILE_MAGNET_RISE, BattleScript_GravityLoopDrop + jumpifvolatile BS_TARGET, VOLATILE_TELEKINESIS, BattleScript_GravityLoopDrop goto BattleScript_GravityLoopEnd BattleScript_GravityLoopDrop: gravityonairbornemons @@ -2726,7 +2727,7 @@ BattleScript_EffectNaturalGift:: jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed - jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_EMBARGO, BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE call BattleScript_HitFromCritCalc @@ -3063,7 +3064,7 @@ BattleScript_EffectRoar:: jumpifcommanderactive BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut - jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted + jumpifvolatile BS_TARGET, VOLATILE_ROOT, BattleScript_PrintMonIsRooted jumpiftargetdynamaxed BattleScript_RoarBlockedByDynamax accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE @@ -3787,7 +3788,7 @@ BattleScript_NightmareWorked:: BattleScript_EffectMinimize:: attackcanceler - setminimize + setvolatile BS_ATTACKER, VOLATILE_MINIMIZE .if B_MINIMIZE_EVASION >= GEN_5 setstatchanger STAT_EVASION, 2, FALSE .else @@ -4697,7 +4698,7 @@ BattleScript_EffectIngrain:: attackcanceler attackstring ppreduce - setuserstatus3 STATUS3_ROOTED, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNPLANTEDROOTS @@ -4846,7 +4847,7 @@ BattleScript_EffectGrudge:: attackcanceler attackstring ppreduce - setuserstatus3 STATUS3_GRUDGE, BattleScript_ButItFailed + trysetvolatile BS_ATTACKER, VOLATILE_GRUDGE, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE @@ -9061,7 +9062,7 @@ BattleScript_RedCardActivates:: printstring STRINGID_REDCARDACTIVATE waitmessage B_WAIT_TIME_LONG swapattackerwithtarget - jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_ROOTED, BattleScript_RedCardIngrain + jumpifvolatile BS_EFFECT_BATTLER, VOLATILE_ROOT, BattleScript_RedCardIngrain jumpifability BS_EFFECT_BATTLER, ABILITY_SUCTION_CUPS, BattleScript_RedCardSuctionCups jumpiftargetdynamaxed BattleScript_RedCardDynamaxed removeitem BS_SCRIPTING diff --git a/include/battle.h b/include/battle.h index 086eb68f51..e1cc318b25 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1074,7 +1074,6 @@ extern u32 gHitMarker; extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u32 gSideStatuses[NUM_BATTLE_SIDES]; extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; -extern u32 gStatuses3[MAX_BATTLERS_COUNT]; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; diff --git a/include/battle_util.h b/include/battle_util.h index 8f38e0f572..0c486f4a3a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -394,7 +394,7 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); -u32 GetMonVolatile(u32 battler, enum Volatile _volatile); +u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); bool32 ItemHealMonVolatile(u32 battler, u16 itemId); diff --git a/include/constants/battle.h b/include/constants/battle.h index 148438237b..0f83eaecae 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -144,39 +144,59 @@ enum VolatileFlags /* Volatile status ailments * These are removed after exiting the battle or switching - * Enum, Type Type, max value, flags */ + * Enum, Type Type, max value, flags */ #define VOLATILE_DEFINITIONS(F) \ - F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \ - F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ - F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \ - F(VOLATILE_TORMENT, torment, (u32, 1)) \ - F(VOLATILE_BIDE, bideTurns, (u32, 3)) \ - F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \ - F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ - F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ - F(VOLATILE_POWDER, powder, (u32, 1)) \ - F(VOLATILE_UNUSED, padding, (u32, 1)) \ - F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \ - F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ - F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ - F(VOLATILE_RECHARGE, recharge, (u32, 1)) \ - F(VOLATILE_RAGE, rage, (u32, 1)) \ - F(VOLATILE_SUBSTITUTE, substitute, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 1)) \ - F(VOLATILE_ESCAPE_PREVENTION, escapePrevention, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_NIGHTMARE, nightmare, (u32, 1)) \ - F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ - F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (u32, 5)) \ - F(VOLATILE_ELECTRIFIED, electrified, (u32, 1)) \ - F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_INFINITE_CONFUSION, infiniteConfusion, (u32, 1)) \ - F(VOLATILE_SALT_CURE, saltCure, (u32, 1)) \ - F(VOLATILE_SYRUP_BOMB, syrupBomb, (u32, 1)) \ - F(VOLATILE_GLAIVE_RUSH, glaiveRush, (u32, 1)) + F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \ + F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ + F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \ + F(VOLATILE_TORMENT, torment, (u32, 1)) \ + F(VOLATILE_BIDE, bideTurns, (u32, 3)) \ + F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \ + F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ + F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ + F(VOLATILE_POWDER, powder, (u32, 1)) \ + F(VOLATILE_UNUSED, padding, (u32, 1)) \ + F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ + F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ + F(VOLATILE_RECHARGE, recharge, (u32, 1)) \ + F(VOLATILE_RAGE, rage, (u32, 1)) \ + F(VOLATILE_SUBSTITUTE, substitute, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 1)) \ + F(VOLATILE_ESCAPE_PREVENTION, escapePrevention, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_NIGHTMARE, nightmare, (u32, 1)) \ + F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ + F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (u32, 5)) \ + F(VOLATILE_ELECTRIFIED, electrified, (u32, 1)) \ + F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_INFINITE_CONFUSION, infiniteConfusion, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SALT_CURE, saltCure, (u32, 1)) \ + F(VOLATILE_SYRUP_BOMB, syrupBomb, (u32, 1)) \ + F(VOLATILE_GLAIVE_RUSH, glaiveRush, (u32, 1)) \ + F(VOLATILE_LEECH_SEED, leechSeed, (enum BattlerId, MAX_BITS(4)), V_BATON_PASSABLE) \ + F(VOLATILE_LOCK_ON, lockOn, (u32, 2), V_BATON_PASSABLE) \ + F(VOLATILE_PERISH_SONG, perishSong, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_MINIMIZE, minimize, (u32, 1)) \ + F(VOLATILE_CHARGE, charge, (u32, 1)) \ + F(VOLATILE_ROOT, root, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_YAWN, yawn, (u32, 2)) \ + F(VOLATILE_IMPRISON, imprison, (u32, 1)) \ + F(VOLATILE_GRUDGE, grudge, (u32, 1)) \ + F(VOLATILE_GASTRO_ACID, gastroAcid, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_EMBARGO, embargo, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_SMACK_DOWN, smackDown, (u32, 1)) \ + F(VOLATILE_TELEKINESIS, telekinesis, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_MIRACLE_EYE, miracleEye, (u32, 1)) \ + F(VOLATILE_MAGNET_RISE, magnetRise, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_HEAL_BLOCK, healBlock, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_AQUA_RING, aquaRing, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_LASER_FOCUS, laserFocus, (u32, 1)) \ + F(VOLATILE_POWER_TRICK, powerTrick, (u32, 1), V_BATON_PASSABLE) + /* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ #define GET_VOLATILE_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_VOLATILE_MAXIMUM_, _typeMaxValue) @@ -193,37 +213,7 @@ enum Volatile // Helper macros #define INFATUATED_WITH(battler) (battler + 1) - -#define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed -#define STATUS3_LEECHSEED (1 << 2) -#define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4) -#define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active -#define STATUS3_PERISH_SONG (1 << 5) -#define STATUS3_UNUSED_6 (1 << 6) -#define STATUS3_UNUSED_7 (1 << 7) -#define STATUS3_MINIMIZED (1 << 8) -#define STATUS3_CHARGED_UP (1 << 9) -#define STATUS3_ROOTED (1 << 10) -#define STATUS3_YAWN (1 << 11 | 1 << 12) // Number of turns to sleep -#define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN) -#define STATUS3_IMPRISONED_OTHERS (1 << 13) -#define STATUS3_GRUDGE (1 << 14) -#define STATUS3_UNUSED_15 (1 << 15) -#define STATUS3_GASTRO_ACID (1 << 16) -#define STATUS3_EMBARGO (1 << 17) -#define STATUS3_UNUSED_18 (1 << 18) -#define STATUS3_UNUSED_19 (1 << 19) -#define STATUS3_UNUSED_20 (1 << 20) -#define STATUS3_SMACKED_DOWN (1 << 21) -#define STATUS3_UNUSED_22 (1 << 22) -#define STATUS3_TELEKINESIS (1 << 23) -#define STATUS3_UNUSED_24 (1 << 24) -#define STATUS3_MIRACLE_EYED (1 << 25) -#define STATUS3_MAGNET_RISE (1 << 26) -#define STATUS3_HEAL_BLOCK (1 << 27) -#define STATUS3_AQUA_RING (1 << 28) -#define STATUS3_LASER_FOCUS (1 << 29) -#define STATUS3_POWER_TRICK (1 << 30) +#define LEECHSEEDED_BY(battler) (battler + 1) enum SemiInvulnerableState { diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index d85df3e74a..423910a0e5 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -227,9 +227,9 @@ static enum FieldEffectOutcome BenefitsFromSun(u32 battler) return FIELD_EFFECT_NEUTRAL; } - if (DoesAbilityBenefitFromWeather(ability, B_WEATHER_SUN) - || HasLightSensitiveMove(battler) - || HasDamagingMoveOfType(battler, TYPE_FIRE) + if (DoesAbilityBenefitFromWeather(ability, B_WEATHER_SUN) + || HasLightSensitiveMove(battler) + || HasDamagingMoveOfType(battler, TYPE_FIRE) || HasMoveWithEffect(battler, EFFECT_HYDRO_STEAM)) return FIELD_EFFECT_POSITIVE; @@ -248,8 +248,8 @@ static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler) if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) { - if (!(IS_BATTLER_ANY_TYPE(FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) - || gAiLogicData->holdEffects[FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES + if (!(IS_BATTLER_ANY_TYPE(FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + || gAiLogicData->holdEffects[FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES || DoesAbilityBenefitFromWeather(gAiLogicData->abilities[FOE(battler)], B_WEATHER_SANDSTORM)) return FIELD_EFFECT_POSITIVE; else @@ -285,7 +285,7 @@ static enum FieldEffectOutcome BenefitsFromRain(u32 battler) { if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) return FIELD_EFFECT_NEUTRAL; - + if (DoesAbilityBenefitFromWeather(gAiLogicData->abilities[battler], B_WEATHER_RAIN) || HasMoveWithFlag(battler, MoveAlwaysHitsInRain) || HasDamagingMoveOfType(battler, TYPE_WATER)) @@ -316,8 +316,8 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) if (grounded && HasBattlerSideMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) return FIELD_EFFECT_POSITIVE; - if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) - || (gStatuses3[battler] & STATUS3_YAWN) + if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) + || gBattleMons[battler].volatiles.yawn || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) return FIELD_EFFECT_POSITIVE; @@ -382,8 +382,7 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) && (HasNonVolatileMoveEffect(FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(BATTLE_PARTNER(FOE(battler)), MOVE_EFFECT_SLEEP))) return FIELD_EFFECT_POSITIVE; - if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) - || (gStatuses3[battler] & STATUS3_YAWN))) + if (grounded && (gBattleMons[battler].status1 & STATUS1_SLEEP || gBattleMons[battler].volatiles.yawn)) return FIELD_EFFECT_POSITIVE; return FIELD_EFFECT_NEUTRAL; @@ -407,7 +406,7 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (grounded || allyGrounded) { // harass priority - if (HasBattlerSideAbility(FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) + if (HasBattlerSideAbility(FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) || HasBattlerSideAbility(FOE(battler), ABILITY_TRIAGE, gAiLogicData) || HasBattlerSideAbility(FOE(battler), ABILITY_PRANKSTER, gAiLogicData)) return FIELD_EFFECT_POSITIVE; @@ -419,7 +418,7 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_NEGATIVE; - if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) + if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) || HasBattlerSideAbility(battler, ABILITY_TRIAGE, gAiLogicData) || HasBattlerSideAbility(battler, ABILITY_PRANKSTER, gAiLogicData)) return FIELD_EFFECT_NEGATIVE; @@ -436,7 +435,7 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) return FIELD_EFFECT_POSITIVE; // If we tie, we shouldn't change trick room state. else if (GetBattlerSideSpeedAverage(battler) == GetBattlerSideSpeedAverage(FOE(battler))) - return FIELD_EFFECT_NEUTRAL; + return FIELD_EFFECT_NEUTRAL; else return FIELD_EFFECT_NEGATIVE; } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 6d7f4ed09d..430412966b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1281,7 +1281,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gDisableStructs[battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(move)) return 0; // Can't even select move at all // heal block check - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(battlerAtk, move)) + if (gBattleMons[battlerAtk].volatiles.healBlock && IsHealBlockPreventingMove(battlerAtk, move)) return 0; // Can't even select heal blocked move // primal weather check @@ -1432,7 +1432,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_CHARGE: - if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP) + if (gBattleMons[battlerAtk].volatiles.charge) ADJUST_SCORE(-20); else if (!HasMoveWithType(battlerAtk, TYPE_ELECTRIC)) ADJUST_SCORE(-10); @@ -1761,7 +1761,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; case EFFECT_LEECH_SEED: - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED + if (gBattleMons[battlerDef].volatiles.leechSeed || IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -1891,9 +1891,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); //Don't wipe your team if you're going to lose } else if ((!IsBattlerAlive(FOE(battlerAtk)) || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF - || gStatuses3[FOE(battlerAtk)] & STATUS3_PERISH_SONG) + || gBattleMons[FOE(battlerAtk)].volatiles.perishSong) && (!IsBattlerAlive(BATTLE_PARTNER(FOE(battlerAtk))) || aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_SOUNDPROOF - || gStatuses3[BATTLE_PARTNER(FOE(battlerAtk))] & STATUS3_PERISH_SONG)) + || gBattleMons[BATTLE_PARTNER(FOE(battlerAtk))].volatiles.perishSong)) { ADJUST_SCORE(-10); //Both enemies are perish songed } @@ -1908,7 +1908,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && CountUsablePartyMons(battlerDef) >= 1) ADJUST_SCORE(-10); - if (gStatuses3[FOE(battlerAtk)] & STATUS3_PERISH_SONG || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF) + if (gBattleMons[FOE(battlerAtk)].volatiles.perishSong || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF) ADJUST_SCORE(-10); } break; @@ -1954,8 +1954,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (CountUsablePartyMons(battlerAtk) == 0) ADJUST_SCORE(-10); else if (gBattleMons[battlerAtk].volatiles.substitute - || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) - || AnyStatIsRaised(battlerAtk)) + || gBattleMons[battlerAtk].volatiles.powerTrick + || gBattleMons[battlerAtk].volatiles.magnetRise + || gBattleMons[battlerAtk].volatiles.aquaRing + || gBattleMons[battlerAtk].volatiles.root + || AnyStatIsRaised(battlerAtk)) break; else ADJUST_SCORE(-6); @@ -2044,11 +2047,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_INGRAIN: - if (gStatuses3[battlerAtk] & STATUS3_ROOTED) + if (gBattleMons[battlerAtk].volatiles.root) ADJUST_SCORE(-10); break; case EFFECT_AQUA_RING: - if (gStatuses3[battlerAtk] & STATUS3_AQUA_RING) + if (gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(-10); break; case EFFECT_RECYCLE: @@ -2056,7 +2059,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_IMPRISON: - if (gStatuses3[battlerAtk] & STATUS3_IMPRISONED_OTHERS) + if (gBattleMons[battlerAtk].volatiles.imprison) ADJUST_SCORE(-10); break; case EFFECT_REFRESH: @@ -2128,7 +2131,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // don't scare away pokemon twice else if (aiData->hpPercents[battlerDef] < 10 && GetBattlerSecondaryDamage(battlerDef)) ADJUST_SCORE(-10); // don't blow away mon that will faint soon - else if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) + else if (gBattleMons[battlerDef].volatiles.perishSong) ADJUST_SCORE(-10); break; case EFFECT_CONVERSION: @@ -2200,14 +2203,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) //TODO break; case EFFECT_LOCK_ON: - if (gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS + if (gBattleMons[battlerDef].volatiles.lockOn || aiData->abilities[battlerAtk] == ABILITY_NO_GUARD || aiData->abilities[battlerDef] == ABILITY_NO_GUARD || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_LASER_FOCUS: - if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS) + if (gBattleMons[battlerDef].volatiles.laserFocus) ADJUST_SCORE(-10); else if (aiData->abilities[battlerDef] == ABILITY_SHELL_ARMOR || aiData->abilities[battlerDef] == ABILITY_BATTLE_ARMOR) ADJUST_SCORE(-8); @@ -2312,7 +2315,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_MIRACLE_EYE: - if (gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + if (gBattleMons[battlerDef].volatiles.miracleEye) ADJUST_SCORE(-10); if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 @@ -2431,7 +2434,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_YAWN: - if (gStatuses3[battlerDef] & STATUS3_YAWN) + if (gBattleMons[battlerDef].volatiles.yawn) ADJUST_SCORE(-10); else if (!AI_CanPutToSleep(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2651,7 +2654,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_EMBARGO: if (!IsBattlerItemEnabled(battlerAtk) - || gStatuses3[battlerDef] & STATUS3_EMBARGO + || gBattleMons[battlerDef].volatiles.embargo || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -2661,15 +2664,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_TELEKINESIS: - if (gStatuses3[battlerDef] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) - || gFieldStatuses & STATUS_FIELD_GRAVITY - || aiData->holdEffects[battlerDef] == HOLD_EFFECT_IRON_BALL - || IsTelekinesisBannedSpecies(gBattleMons[battlerDef].species) - || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + if (gBattleMons[battlerDef].volatiles.telekinesis + || gBattleMons[battlerDef].volatiles.root + || gBattleMons[battlerDef].volatiles.smackDown + || gFieldStatuses & STATUS_FIELD_GRAVITY + || aiData->holdEffects[battlerDef] == HOLD_EFFECT_IRON_BALL + || IsTelekinesisBannedSpecies(gBattleMons[battlerDef].species) + || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_HEAL_BLOCK: - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK + if (gBattleMons[battlerDef].volatiles.healBlock || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; @@ -2698,7 +2703,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HIT_ENEMY_HEAL_ALLY: // pollen puff if (IsTargetingPartner(battlerAtk, battlerDef)) { - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerDef].volatiles.healBlock) return 0; // cannot even select if (AI_BattlerAtMaxHp(battlerDef)) ADJUST_SCORE(-10); @@ -2806,9 +2811,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MAGNET_RISE: if (gFieldStatuses & STATUS_FIELD_GRAVITY - || gDisableStructs[battlerAtk].magnetRiseTimer > gBattleTurnCounter + || gDisableStructs[battlerAtk].magnetRiseTimer > gBattleTurnCounter || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_IRON_BALL - || gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_MAGNET_RISE | STATUS3_SMACKED_DOWN) + || gBattleMons[battlerAtk].volatiles.smackDown + || gBattleMons[battlerAtk].volatiles.root + || gBattleMons[battlerAtk].volatiles.magnetRise || !IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(-10); break; @@ -4205,7 +4212,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_SHEER_COLD: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS) + else if (gBattleMons[battlerAtk].volatiles.lockOn) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_MEAN_LOOK: @@ -4237,7 +4244,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_LEECH_SEED: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) - || gStatuses3[battlerDef] & STATUS3_LEECHSEED + || gBattleMons[battlerDef].volatiles.leechSeed || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) || aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) @@ -4286,7 +4293,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_BATON_PASS: if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].volatiles.substitute - || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) + || gBattleMons[battlerAtk].volatiles.powerTrick + || gBattleMons[battlerAtk].volatiles.magnetRise + || gBattleMons[battlerAtk].volatiles.aquaRing + || gBattleMons[battlerAtk].volatiles.root || AnyStatIsRaised(battlerAtk))) ADJUST_SCORE(BEST_EFFECT); break; @@ -4940,9 +4950,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_POWER_TRICK: - if (!(gStatuses3[battlerAtk] & STATUS3_POWER_TRICK) - && gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) + if (!gBattleMons[battlerAtk].volatiles.powerTrick + && gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack + && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEART_SWAP: @@ -5016,7 +5026,7 @@ case EFFECT_GUARD_SPLIT: if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) { ADJUST_SCORE(GOOD_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) + if (gBattleMons[battlerAtk].volatiles.yawn && IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(BEST_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) ADJUST_SCORE(WEAK_EFFECT); @@ -5026,7 +5036,7 @@ case EFFECT_GUARD_SPLIT: if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) { ADJUST_SCORE(GOOD_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_YAWN && IsBattlerGrounded(battlerAtk)) + if (gBattleMons[battlerAtk].volatiles.yawn && IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(BEST_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) ADJUST_SCORE(WEAK_EFFECT); @@ -5266,7 +5276,7 @@ case EFFECT_GUARD_SPLIT: break; case EFFECT_RAPID_SPIN: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) - || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].volatiles.wrapped)) + || (gBattleMons[battlerAtk].volatiles.leechSeed || gBattleMons[battlerAtk].volatiles.wrapped)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SPECTRAL_THIEF: @@ -5806,11 +5816,11 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor switch (effect) { case EFFECT_INGRAIN: - if (!(gStatuses3[battlerAtk] & STATUS3_ROOTED)) + if (!gBattleMons[battlerAtk].volatiles.root) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_AQUA_RING: - if (!(gStatuses3[battlerAtk] & STATUS3_AQUA_RING)) + if (!gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_PROTECT: @@ -5820,9 +5830,9 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_BATON_PASS: - if (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING)) + if (gBattleMons[battlerAtk].volatiles.root || gBattleMons[battlerAtk].volatiles.aquaRing) ADJUST_SCORE(DECENT_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) + if (gBattleMons[battlerAtk].volatiles.leechSeed) ADJUST_SCORE(-3); ADJUST_SCORE(CountPositiveStatStages(battlerAtk) - CountNegativeStatStages(battlerAtk)); break; @@ -5848,7 +5858,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || (moveType == TYPE_GROUND && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_EARTH_EATER) || (moveType == TYPE_WATER && (gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_DRY_SKIN || gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_WATER_ABSORB))) { - if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerDef].volatiles.healBlock) return 0; if (CanTargetFaintAi(FOE(battlerAtk), BATTLE_PARTNER(battlerAtk)) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 6f470d3c84..c11f448645 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -675,7 +675,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) bool32 hasStatRaised = AnyStatIsRaised(battler); //Perish Song - if (gStatuses3[battler] & STATUS3_PERISH_SONG + if (gBattleMons[battler].volatiles.perishSong && gDisableStructs[battler].perishSongTimer == 0 && monAbility != ABILITY_SOUNDPROOF && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) @@ -684,7 +684,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) { //Yawn - if (gStatuses3[battler] & STATUS3_YAWN + if (gBattleMons[battler].volatiles.yawn && CanBeSlept(battler, battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) // TODO: ask for help from pawwkie && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3 && RandomPercentage(RNG_AI_SWITCH_YAWN, GetSwitchChance(SHOULD_SWITCH_YAWN))) @@ -719,7 +719,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE && (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) && !gBattleMons[battler].volatiles.foresight - && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) + && !gBattleMons[battler].volatiles.miracleEye) switchMon = FALSE; if (switchMon) @@ -749,7 +749,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); //Leech Seed - if (gStatuses3[battler] & STATUS3_LEECHSEED + if (gBattleMons[battler].volatiles.leechSeed && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_SEEDED, GetSwitchChance(SHOULD_SWITCH_SEEDED)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -770,7 +770,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) bool32 hasStatRaised = AnyStatIsRaised(battler); //Check if ability is blocked - if (gStatuses3[battler] & STATUS3_GASTRO_ACID + if (gBattleMons[battler].volatiles.gastroAcid || IsNeutralizingGasOnField()) return FALSE; @@ -1109,7 +1109,7 @@ bool32 ShouldSwitch(u32 battler) return FALSE; if (gBattleMons[battler].volatiles.escapePrevention) return FALSE; - if (gStatuses3[battler] & STATUS3_ROOTED) + if (gBattleMons[battler].volatiles.root) return FALSE; if (IsAbilityPreventingEscape(battler)) return FALSE; @@ -1260,7 +1260,7 @@ void ModifySwitchAfterMoveScoring(u32 battler) return; if (gBattleMons[battler].volatiles.escapePrevention) return; - if (gStatuses3[battler] & STATUS3_ROOTED) + if (gBattleMons[battler].volatiles.root) return; if (IsAbilityPreventingEscape(battler)) return; @@ -2425,7 +2425,7 @@ static bool32 ShouldUseItem(u32 battler) || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) return FALSE; - if (gStatuses3[battler] & STATUS3_EMBARGO) + if (gBattleMons[battler].volatiles.embargo) return FALSE; if (AiExpectsToFaintPlayer(battler)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e044f7b3e9..8fe1067a19 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -467,7 +467,7 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) return TRUE; if (gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_SKY_DROP) return TRUE; - if (gStatuses3[battlerDef] & STATUS3_ROOTED) + if (gBattleMons[battlerDef].volatiles.root) return TRUE; if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return TRUE; @@ -1632,11 +1632,11 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; - if (gStatuses3[battlerId] & STATUS3_EMBARGO) + if (gBattleMons[battlerId].volatiles.embargo) return HOLD_EFFECT_NONE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return HOLD_EFFECT_NONE; - if (gAiLogicData->abilities[battlerId] == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) + if (gAiLogicData->abilities[battlerId] == ABILITY_KLUTZ && !gBattleMons[battlerId].volatiles.gastroAcid) return HOLD_EFFECT_NONE; return holdEffect; @@ -1890,7 +1890,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil if (!DoesBattlerIgnoreAbilityChecks(battlerAtk, atkAbility, move) && defAbility == ABILITY_STURDY) return FALSE; - if ((((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS) + if (((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) || atkAbility == ABILITY_NO_GUARD || defAbility == ABILITY_NO_GUARD) && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) @@ -1935,7 +1935,8 @@ bool32 IsBattlerDamagedByStatus(u32 battler) || gBattleMons[battler].volatiles.nightmare || gBattleMons[battler].volatiles.cursed || gBattleMons[battler].volatiles.saltCure - || gStatuses3[battler] & (STATUS3_PERISH_SONG | STATUS3_LEECHSEED) + || gBattleMons[battler].volatiles.leechSeed + || gBattleMons[battler].volatiles.perishSong || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); } @@ -2087,9 +2088,9 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) case STAT_ACC: if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) tempScore += WEAK_EFFECT; - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + if (gBattleMons[battlerDef].volatiles.leechSeed) tempScore += WEAK_EFFECT; - if (gStatuses3[battlerDef] & STATUS3_ROOTED) + if (gBattleMons[battlerDef].volatiles.root) tempScore += WEAK_EFFECT; if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; @@ -2097,9 +2098,9 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) case STAT_EVASION: if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) tempScore += WEAK_EFFECT; - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + if (gBattleMons[battlerDef].volatiles.leechSeed) tempScore += WEAK_EFFECT; - if (gStatuses3[battlerDef] & STATUS3_ROOTED) + if (gBattleMons[battlerDef].volatiles.root) tempScore += WEAK_EFFECT; if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; @@ -2864,13 +2865,13 @@ bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) } } -static u32 GetLeechSeedDamage(u32 battlerId) +static u32 GetLeechSeedDamage(u32 battler) { u32 damage = 0; - if ((gStatuses3[battlerId] & STATUS3_LEECHSEED) - && gBattleMons[gStatuses3[battlerId] & STATUS3_LEECHSEED_BATTLER].hp != 0) + u32 leechSeeder = gBattleMons[battler].volatiles.leechSeed; + if (leechSeeder && gBattleMons[leechSeeder - 1].hp != 0) { - damage = GetNonDynamaxMaxHP(battlerId) / 8; + damage = GetNonDynamaxMaxHP(battler) / 8; if (damage == 0) damage = 1; } @@ -3714,7 +3715,7 @@ bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) // using item or user goes first s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerAtk].volatiles.healBlock) healDmg = 0; if (CanTargetFaintAi(battlerDef, battlerAtk) @@ -3739,7 +3740,7 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) u32 healAmount = (healPercent * maxHP) / 100; if (healAmount > maxHP) healAmount = maxHP; - if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battlerAtk].volatiles.healBlock) healAmount = 0; if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) { @@ -3800,7 +3801,7 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo bool32 IsBattle1v1() { if (IsDoubleBattle() - && ((IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) + && ((IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) || (IsBattlerAlive(B_POSITION_OPPONENT_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_RIGHT)))) return FALSE; return TRUE; @@ -5154,9 +5155,9 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (gBattleMons[battlerDef].volatiles.substitute) ADJUST_SCORE_PTR(GOOD_EFFECT); - if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED) + if (gBattleMons[battlerAtk].volatiles.leechSeed) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (gStatuses3[battlerDef] & STATUS3_LEECHSEED) + if (gBattleMons[battlerDef].volatiles.leechSeed) ADJUST_SCORE_PTR(-2); } @@ -5209,7 +5210,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) scoreIncrease += BEST_EFFECT; } - if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) + if (gBattleMons[battlerDef].volatiles.perishSong) scoreIncrease += GOOD_EFFECT; if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) @@ -5250,9 +5251,9 @@ bool32 IsBattlerItemEnabled(u32 battler) return TRUE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return FALSE; - if (gStatuses3[battler] & STATUS3_EMBARGO) + if (gBattleMons[battler].volatiles.embargo) return FALSE; - if (gBattleMons[battler].ability == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) + if (gBattleMons[battler].ability == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) return FALSE; return TRUE; } @@ -5393,7 +5394,7 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct } } - if (gStatuses3[battlerDef] & STATUS3_GASTRO_ACID) + if (gBattleMons[battlerDef].volatiles.gastroAcid) return FALSE; u32 atkAbility = aiData->abilities[battlerAtk]; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 12bd7859b9..e49c9f2003 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6906,7 +6906,6 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) SWAP(gBattleSpritesDataPtr->battlerData[battlerAtk].invisible, gBattleSpritesDataPtr->battlerData[battlerPartner].invisible, temp); SWAP(gTransformedPersonalities[battlerAtk], gTransformedPersonalities[battlerPartner], temp); SWAP(gTransformedShininess[battlerAtk], gTransformedShininess[battlerPartner], temp); - SWAP(gStatuses3[battlerAtk], gStatuses3[battlerPartner], temp); SwapBattlerMoveData(battlerAtk, battlerPartner); diff --git a/src/battle_debug.c b/src/battle_debug.c index a991ac341a..149cb4065c 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -105,7 +105,6 @@ enum LIST_ITEM_STAT_STAGES, LIST_ITEM_STATUS1, LIST_ITEM_VOLATILE, - LIST_ITEM_STATUS3, LIST_ITEM_HAZARDS, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, @@ -140,30 +139,6 @@ enum LIST_STATUS1_FROSTBITE, }; -enum -{ - LIST_STATUS3_LEECH_SEED_HEALER, - LIST_STATUS3_LEECH_SEEDED, - LIST_STATUS3_ALWAYS_HITS, - LIST_STATUS3_PERISH_SONG, - LIST_STATUS3_MINIMIZED, - LIST_STATUS3_CHARGED_UP, - LIST_STATUS3_ROOTED, - LIST_STATUS3_YAWN, - LIST_STATUS3_IMPRISONED_OTHERS, - LIST_STATUS3_GRUDGE, - LIST_STATUS3_GASTRO_ACID, - LIST_STATUS3_EMBARGO, - LIST_STATUS3_SMACKED_DOWN, - LIST_STATUS3_TELEKINESIS, - LIST_STATUS3_MIRACLE_EYED, - LIST_STATUS3_MAGNET_RISE, - LIST_STATUS3_HEAL_BLOCK, - LIST_STATUS3_AQUA_RING, - LIST_STATUS3_LASER_FOCUS, - LIST_STATUS3_POWER_TRICK, -}; - enum { LIST_SIDE_STICKY_WEB, @@ -346,7 +321,6 @@ static const struct ListMenuItem sMainListItems[] = {COMPOUND_STRING("Stat Stages"), LIST_ITEM_STAT_STAGES}, {COMPOUND_STRING("Status1"), LIST_ITEM_STATUS1}, {COMPOUND_STRING("Volatiles"), LIST_ITEM_VOLATILE}, - {COMPOUND_STRING("Status3"), LIST_ITEM_STATUS3}, {COMPOUND_STRING("Hazards"), LIST_ITEM_HAZARDS}, {COMPOUND_STRING("Side Status"), LIST_ITEM_SIDE_STATUS}, {COMPOUND_STRING("AI"), LIST_ITEM_AI}, @@ -402,30 +376,25 @@ static const struct ListMenuItem sVolatileStatusListItems[] = {COMPOUND_STRING("Salt Cure"), VOLATILE_SALT_CURE}, {COMPOUND_STRING("Syrup Bomb"), VOLATILE_SYRUP_BOMB}, {COMPOUND_STRING("Glaive Rush"), VOLATILE_GLAIVE_RUSH}, -}; - -static const struct ListMenuItem sStatus3ListItems[] = -{ - {COMPOUND_STRING("Leech Seed Healer"), LIST_STATUS3_LEECH_SEED_HEALER}, - {COMPOUND_STRING("Leech Seeded"), LIST_STATUS3_LEECH_SEEDED}, - {COMPOUND_STRING("Always Hits"), LIST_STATUS3_ALWAYS_HITS}, - {COMPOUND_STRING("Perish Song"), LIST_STATUS3_PERISH_SONG}, - {COMPOUND_STRING("Minimized"), LIST_STATUS3_MINIMIZED}, - {COMPOUND_STRING("Charged Up"), LIST_STATUS3_CHARGED_UP}, - {COMPOUND_STRING("Rooted"), LIST_STATUS3_ROOTED}, - {COMPOUND_STRING("Yawn"), LIST_STATUS3_YAWN}, - {COMPOUND_STRING("Imprisoned Others"), LIST_STATUS3_IMPRISONED_OTHERS}, - {COMPOUND_STRING("Grudge"), LIST_STATUS3_GRUDGE}, - {COMPOUND_STRING("Gastro Acid"), LIST_STATUS3_GASTRO_ACID}, - {COMPOUND_STRING("Embargo"), LIST_STATUS3_EMBARGO}, - {COMPOUND_STRING("Smacked Down"), LIST_STATUS3_SMACKED_DOWN}, - {COMPOUND_STRING("Telekinesis"), LIST_STATUS3_TELEKINESIS}, - {COMPOUND_STRING("Miracle Eyed"), LIST_STATUS3_MIRACLE_EYED}, - {COMPOUND_STRING("Magnet Rise"), LIST_STATUS3_MAGNET_RISE}, - {COMPOUND_STRING("Heal Block"), LIST_STATUS3_HEAL_BLOCK}, - {COMPOUND_STRING("Aqua Ring"), LIST_STATUS3_AQUA_RING}, - {COMPOUND_STRING("Laser Focus"), LIST_STATUS3_LASER_FOCUS}, - {COMPOUND_STRING("Power Trick"), LIST_STATUS3_POWER_TRICK}, + {COMPOUND_STRING("Leech Seed"), VOLATILE_LEECH_SEED}, + {COMPOUND_STRING("Lock On"), VOLATILE_LOCK_ON}, + {COMPOUND_STRING("Perish Song"), VOLATILE_PERISH_SONG}, + {COMPOUND_STRING("Minimize"), VOLATILE_MINIMIZE}, + {COMPOUND_STRING("Charge"), VOLATILE_CHARGE}, + {COMPOUND_STRING("Root"), VOLATILE_ROOT}, + {COMPOUND_STRING("Yawn"), VOLATILE_YAWN}, + {COMPOUND_STRING("Imprison"), VOLATILE_IMPRISON}, + {COMPOUND_STRING("Grudge"), VOLATILE_GRUDGE}, + {COMPOUND_STRING("Gastro Acid"), VOLATILE_GASTRO_ACID}, + {COMPOUND_STRING("Embargo"), VOLATILE_EMBARGO}, + {COMPOUND_STRING("Smack Down"), VOLATILE_SMACK_DOWN}, + {COMPOUND_STRING("Telekinesis"), VOLATILE_TELEKINESIS}, + {COMPOUND_STRING("Miracle Eye"), VOLATILE_MIRACLE_EYE}, + {COMPOUND_STRING("Magnet Rise"), VOLATILE_MAGNET_RISE}, + {COMPOUND_STRING("Heal Block"), VOLATILE_HEAL_BLOCK}, + {COMPOUND_STRING("Aqua Ring"), VOLATILE_AQUA_RING}, + {COMPOUND_STRING("Laser Focus"), VOLATILE_LASER_FOCUS}, + {COMPOUND_STRING("Power Trick"), VOLATILE_POWER_TRICK}, }; static const struct ListMenuItem sHazardsListItems[] = @@ -1403,11 +1372,6 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) listTemplate.items = sVolatileStatusListItems; itemsCount = ARRAY_COUNT(sVolatileStatusListItems); break; - case LIST_ITEM_STATUS3: - listTemplate.items = sStatus3ListItems; - itemsCount = ARRAY_COUNT(sStatus3ListItems); - data->bitfield = sStatus3Bitfield; - break; case LIST_ITEM_AI: listTemplate.items = sAIListItems; itemsCount = ARRAY_COUNT(sAIListItems); @@ -2024,7 +1988,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; case LIST_ITEM_VOLATILE: - data->modifyArrows.currValue = GetMonVolatile(data->battlerId, data->currentSecondaryListItemId); + data->modifyArrows.currValue = GetBattlerVolatile(data->battlerId, data->currentSecondaryListItemId); data->modifyArrows.typeOfVal = VAL_VOLATILE; data->modifyArrows.minValue = 0; #define UNPACK_VOLATILE_MAX_SIZE(_enum, _fieldName, _typeMaxValue, ...) case _enum: data->modifyArrows.maxValue = min(MAX_u16, GET_VOLATILE_MAXIMUM(_typeMaxValue)); break; @@ -2045,11 +2009,6 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) } data->modifyArrows.maxDigits = MAX_DIGITS(data->modifyArrows.maxValue); break; - case LIST_ITEM_STATUS3: - data->modifyArrows.modifiedValPtr = &gStatuses3[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); - data->modifyArrows.typeOfVal = VAL_BITFIELD_32; - goto CASE_ITEM_STATUS; case LIST_ITEM_AI: data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->aiFlags[data->battlerId]; data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 87ed8542a7..c39e4e114a 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -163,14 +163,14 @@ static bool32 HandleEndTurnVarious(u32 battler) for (i = 0; i < gBattlersCount; i++) { - if (gStatuses3[i] & STATUS3_ALWAYS_HITS) - gStatuses3[i] -= STATUS3_ALWAYS_HITS_TURN(1); + if (gBattleMons[i].volatiles.lockOn > 0) + gBattleMons[i].volatiles.lockOn--; if (gDisableStructs[i].chargeTimer && --gDisableStructs[i].chargeTimer == 0) - gStatuses3[i] &= ~STATUS3_CHARGED_UP; + gBattleMons[i].volatiles.charge = FALSE; - if (gStatuses3[i] & STATUS3_LASER_FOCUS && gDisableStructs[i].laserFocusTimer == gBattleTurnCounter) - gStatuses3[i] &= ~STATUS3_LASER_FOCUS; + if (gBattleMons[i].volatiles.laserFocus && gDisableStructs[i].laserFocusTimer == gBattleTurnCounter) + gBattleMons[i].volatiles.laserFocus = FALSE; gBattleStruct->hpBefore[i] = gBattleMons[i].hp; } @@ -409,7 +409,7 @@ static bool32 HandleEndTurnWish(u32 battler) } gBattleStruct->moveDamage[battler] *= -1; - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.healBlock) BattleScriptExecute(BattleScript_WishButHealBlocked); else if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) BattleScriptExecute(BattleScript_WishButFullHp); @@ -486,7 +486,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerAlive(battler) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + && !gBattleMons[battler].volatiles.healBlock && !IsSemiInvulnerable(battler, CHECK_ALL) && IsBattlerGrounded(battler)) { @@ -542,8 +542,8 @@ static bool32 HandleEndTurnAquaRing(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_AQUA_RING - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.aquaRing + && !gBattleMons[battler].volatiles.healBlock && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { @@ -561,8 +561,8 @@ static bool32 HandleEndTurnIngrain(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_ROOTED - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.root + && !gBattleMons[battler].volatiles.healBlock && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { @@ -580,12 +580,12 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_LEECHSEED - && IsBattlerAlive(gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER) + if (gBattleMons[battler].volatiles.leechSeed + && IsBattlerAlive(gBattleMons[battler].volatiles.leechSeed - 1) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. + gBattlerTarget = gBattleMons[battler].volatiles.leechSeed - 1; // leech seed receiver gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); @@ -597,7 +597,7 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); } - else if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + else if (gBattleMons[gBattlerTarget].volatiles.healBlock) { BattleScriptExecute(BattleScript_LeechSeedTurnDrainHealBlock); } @@ -626,7 +626,7 @@ static bool32 HandleEndTurnPoison(u32 battler) { if (ability == ABILITY_POISON_HEAL) { - if (!IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; if (gBattleStruct->moveDamage[battler] == 0) @@ -946,9 +946,9 @@ static bool32 HandleEndTurnMagnetRise(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_MAGNET_RISE && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter) + if (gBattleMons[battler].volatiles.magnetRise && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter) { - gStatuses3[battler] &= ~STATUS3_MAGNET_RISE; + gBattleMons[battler].volatiles.magnetRise = FALSE; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); effect = TRUE; @@ -963,9 +963,9 @@ static bool32 HandleEndTurnTelekinesis(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_TELEKINESIS && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter) + if (gBattleMons[battler].volatiles.telekinesis && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter) { - gStatuses3[battler] &= ~STATUS3_TELEKINESIS; + gBattleMons[battler].volatiles.telekinesis = FALSE; BattleScriptExecute(BattleScript_TelekinesisEndTurn); effect = TRUE; } @@ -979,9 +979,9 @@ static bool32 HandleEndTurnHealBlock(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter) + if (gBattleMons[battler].volatiles.healBlock && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter) { - gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; + gBattleMons[battler].volatiles.healBlock = FALSE; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); effect = TRUE; @@ -996,9 +996,9 @@ static bool32 HandleEndTurnEmbargo(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_EMBARGO && gDisableStructs[battler].embargoTimer == gBattleTurnCounter) + if (gBattleMons[battler].volatiles.embargo && gDisableStructs[battler].embargoTimer == gBattleTurnCounter) { - gStatuses3[battler] &= ~STATUS3_EMBARGO; + gBattleMons[battler].volatiles.embargo = FALSE; BattleScriptExecute(BattleScript_EmbargoEndTurn); effect = TRUE; } @@ -1014,10 +1014,11 @@ static bool32 HandleEndTurnYawn(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (gStatuses3[battler] & STATUS3_YAWN) + if (gBattleMons[battler].volatiles.yawn > 0) { - gStatuses3[battler] -= STATUS3_YAWN_TURN(1); - if (!(gStatuses3[battler] & STATUS3_YAWN) && !(gBattleMons[battler].status1 & STATUS1_ANY) + gBattleMons[battler].volatiles.yawn--; + if (!gBattleMons[battler].volatiles.yawn + && !(gBattleMons[battler].status1 & STATUS1_ANY) && ability != ABILITY_VITAL_SPIRIT && ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(battler) @@ -1064,12 +1065,12 @@ static bool32 HandleEndTurnPerishSong(u32 battler) gBattleStruct->turnEffectsBattlerId++; - if (IsBattlerAlive(battler) && gStatuses3[battler] & STATUS3_PERISH_SONG) + if (IsBattlerAlive(battler) && gBattleMons[battler].volatiles.perishSong) { PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[battler].perishSongTimer); if (gDisableStructs[battler].perishSongTimer == 0) { - gStatuses3[battler] &= ~STATUS3_PERISH_SONG; + gBattleMons[battler].volatiles.perishSong = FALSE; gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; BattleScriptExecute(BattleScript_PerishSongTakesLife); } diff --git a/src/battle_main.c b/src/battle_main.c index ac60bab82a..b5bba9eebe 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -193,7 +193,6 @@ EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0}; -EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; @@ -3025,7 +3024,6 @@ static void BattleStartClearSetData(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - gStatuses3[i] = 0; gDisableStructs[i].isFirstTurn = 2; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; @@ -3148,9 +3146,9 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) { if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) gBattleMons[i].volatiles.escapePrevention = FALSE; - if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == battler) + if (gBattleMons[i].volatiles.lockOn && gDisableStructs[i].battlerWithSureHit == battler) { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; + gBattleMons[i].volatiles.lockOn = 0; gDisableStructs[i].battlerWithSureHit = 0; } } @@ -3168,26 +3166,19 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) * gBattleMons[battler].volatiles.escapePrevention = volatilesCopy->escapePrevention; * ...etc */ - gStatuses3[battler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED - | STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK - | STATUS3_AQUA_RING | STATUS3_POWER_TRICK); + for (i = 0; i < gBattlersCount; i++) { if (!IsBattlerAlly(battler, i) - && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0 + && gBattleMons[i].volatiles.lockOn != 0 && (gDisableStructs[i].battlerWithSureHit == battler)) { - gStatuses3[i] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2); + gBattleMons[i].volatiles.lockOn = 0; } } - if (gStatuses3[battler] & STATUS3_POWER_TRICK) + if (gBattleMons[battler].volatiles.powerTrick) SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, i); } - else - { - gStatuses3[battler] = 0; - } for (i = 0; i < gBattlersCount; i++) { @@ -3301,8 +3292,11 @@ const u8* FaintClearSetData(u32 battler) for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; + bool32 keepGastroAcid = FALSE; + if (gBattleMons[battler].volatiles.gastroAcid) + keepGastroAcid = TRUE; memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); - gStatuses3[battler] &= STATUS3_GASTRO_ACID; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. + gBattleMons[battler].volatiles.gastroAcid = keepGastroAcid; // Edge case: Keep Gastro Acid if pokemon's ability can have effect after fainting, for example Innards Out. for (i = 0; i < gBattlersCount; i++) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8bd6d3ab6a..86cb831bb0 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -369,7 +369,7 @@ static void Cmd_jumpifvolatile(void); static void Cmd_jumpifability(void); static void Cmd_jumpifsideaffecting(void); static void Cmd_jumpifstat(void); -static void Cmd_jumpifstatus3condition(void); +static void Cmd_unused_0x21(void); static void Cmd_jumpbasedontype(void); static void Cmd_getexp(void); static void Cmd_checkteamslost(void); @@ -467,7 +467,7 @@ static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); static void Cmd_trysetrest(void); static void Cmd_jumpifnotfirstturn(void); -static void Cmd_setmiracleeye(void); +static void Cmd_unused_0x83(void); static void Cmd_jumpifuproarwakes(void); static void Cmd_stockpile(void); static void Cmd_stockpiletobasedamage(void); @@ -535,7 +535,7 @@ static void Cmd_trysetfutureattack(void); static void Cmd_trydobeatup(void); static void Cmd_setsemiinvulnerablebit(void); static void Cmd_tryfiretwoturnmovenowbyeffect(void); -static void Cmd_setminimize(void); +static void Cmd_unused_0xC7(void); static void Cmd_unused_c8(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); @@ -557,7 +557,7 @@ static void Cmd_setroom(void); static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); static void Cmd_setstealthrock(void); -static void Cmd_setuserstatus3(void); +static void Cmd_trysetvolatile(void); static void Cmd_assistattackselect(void); static void Cmd_trysetmagiccoat(void); static void Cmd_trysetsnatch(void); @@ -628,7 +628,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_jumpifability, //0x1E Cmd_jumpifsideaffecting, //0x1F Cmd_jumpifstat, //0x20 - Cmd_jumpifstatus3condition, //0x21 + Cmd_unused_0x21, //0x21 Cmd_jumpbasedontype, //0x22 Cmd_getexp, //0x23 Cmd_checkteamslost, //0x24 @@ -726,7 +726,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_manipulatedamage, //0x80 Cmd_trysetrest, //0x81 Cmd_jumpifnotfirstturn, //0x82 - Cmd_setmiracleeye, //0x83 + Cmd_unused_0x83, //0x83 Cmd_jumpifuproarwakes, //0x84 Cmd_stockpile, //0x85 Cmd_stockpiletobasedamage, //0x86 @@ -794,7 +794,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_trydobeatup, //0xC4 Cmd_setsemiinvulnerablebit, //0xC5 Cmd_tryfiretwoturnmovenowbyeffect, //0xC6 - Cmd_setminimize, //0xC7 + Cmd_unused_0xC7, //0xC7 Cmd_unused_c8, //0xC8 Cmd_trymemento, //0xC9 Cmd_setforcedtarget, //0xCA @@ -816,7 +816,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_tryswapabilities, //0xDA Cmd_tryimprison, //0xDB Cmd_setstealthrock, //0xDC - Cmd_setuserstatus3, //0xDD + Cmd_trysetvolatile, //0xDD Cmd_assistattackselect, //0xDE Cmd_trysetmagiccoat, //0xDF Cmd_trysetsnatch, //0xE0 @@ -1364,7 +1364,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u if (move == NO_ACC_CALC_CHECK_LOCK_ON) { - if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + if (gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr = nextInstr; else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) gBattlescriptCurrInstr = failInstr; @@ -1621,7 +1621,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA { critChance = CRITICAL_HIT_BLOCKED; } - else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + else if (gBattleMons[battlerAtk].volatiles.laserFocus || MoveAlwaysCrits(move) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { @@ -1704,7 +1704,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec } // Guaranteed crits - else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + else if (gBattleMons[battlerAtk].volatiles.laserFocus || MoveAlwaysCrits(move) || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { @@ -3565,9 +3565,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; } - else if (!(gStatuses3[gEffectBattler] & STATUS3_HEAL_BLOCK)) + else if (!gBattleMons[gEffectBattler].volatiles.healBlock) { - gStatuses3[gEffectBattler] |= STATUS3_HEAL_BLOCK; + gBattleMons[gEffectBattler].volatiles.healBlock = TRUE; gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; @@ -3637,10 +3637,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai gBattlescriptCurrInstr = BattleScript_MoveEffectHaze; break; case MOVE_EFFECT_LEECH_SEED: - if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !(gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)) + if (!IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) && !gBattleMons[gBattlerTarget].volatiles.leechSeed) { - gStatuses3[gBattlerTarget] |= gBattlerAttacker; - gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; + gBattleMons[gBattlerTarget].volatiles.leechSeed = LEECHSEEDED_BY(gBattlerAttacker); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectLeechSeed; } @@ -3944,11 +3943,11 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } case MOVE_EFFECT_YAWN_FOE: { - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + if (gBattleMons[gBattlerTarget].volatiles.yawn == 0 && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + gBattleMons[gBattlerTarget].volatiles.yawn = 2; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; } @@ -4248,7 +4247,7 @@ static void Cmd_tryfaintmon(void) gBattleStruct->moveDamage[destinyBondBattler] = gBattleMons[destinyBondBattler].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } - if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE) + if (gBattleMons[gBattlerTarget].volatiles.grudge && !(gHitMarker & HITMARKER_GRUDGE) && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) @@ -4340,7 +4339,7 @@ static void Cmd_jumpifvolatile(void) u8 battler = GetBattlerForBattleScript(cmd->battler); const u8 *jumpInstr = cmd->jumpInstr; - if (GetMonVolatile(battler, cmd->_volatile) && IsBattlerAlive(battler)) + if (GetBattlerVolatile(battler, cmd->_volatile) != 0 && IsBattlerAlive(battler)) gBattlescriptCurrInstr = jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -4422,25 +4421,8 @@ static void Cmd_jumpifstat(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifstatus3condition(void) +static void Cmd_unused_0x21(void) { - CMD_ARGS(u8 battler, u32 flags, bool8 jumpIfTrue, const u8 *jumpInstr); - - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (cmd->jumpIfTrue) - { - if ((gStatuses3[battler] & cmd->flags) != 0) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - { - if ((gStatuses3[battler] & cmd->flags) != 0) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_jumpbasedontype(void) @@ -4772,7 +4754,7 @@ static void Cmd_getexp(void) if (battler != 0xFF) { CopyMonLevelAndBaseStatsToBattleMon(battler, &gPlayerParty[*expMonId]); - if (gStatuses3[battler] & STATUS3_POWER_TRICK) + if (gBattleMons[battler].volatiles.powerTrick) SWAP(gBattleMons[battler].attack, gBattleMons[battler].defense, temp); } @@ -5786,7 +5768,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) { BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet); } - else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) + else if (gBattleMons[gBattlerTarget].volatiles.root) { BattleScriptCall(BattleScript_PrintMonIsRootedRet); } @@ -5808,9 +5790,10 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { + gBattleMons[gBattlerTarget].volatiles.smackDown = TRUE; + gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; + gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; - gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS); BattleScriptCall(BattleScript_MoveEffectSmackDown); effect = TRUE; } @@ -6067,7 +6050,7 @@ static void Cmd_moveend(void) { case EFFECT_ABSORB: case EFFECT_DREAM_EATER: - if (!(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) + if (!gBattleMons[gBattlerAttacker].volatiles.healBlock && gBattleStruct->moveDamage[gBattlerTarget] > 0 && IsBattlerAlive(gBattlerAttacker)) { @@ -6927,7 +6910,7 @@ static void Cmd_moveend(void) if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - gStatuses3[gBattlerAttacker] &= ~(STATUS3_CHARGED_UP); + gBattleMons[gBattlerAttacker].volatiles.charge = FALSE; // check if Stellar type boost should be used up if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR @@ -7040,13 +7023,13 @@ static void Cmd_sethealblock(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + if (gBattleMons[gBattlerTarget].volatiles.healBlock) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; + gBattleMons[gBattlerTarget].volatiles.healBlock = TRUE; gDisableStructs[gBattlerTarget].healBlockTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -8583,7 +8566,7 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) { if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) + && !gBattleMons[battler].volatiles.healBlock && GetBattlerPartyState(battler)->ateBerry && !IsBattlerAtMaxHp(battler)) { @@ -9769,7 +9752,7 @@ static void Cmd_setseeded(void) { CMD_ARGS(); - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gBattleMons[gBattlerTarget].volatiles.leechSeed) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; @@ -9781,8 +9764,7 @@ static void Cmd_setseeded(void) } else { - gStatuses3[gBattlerTarget] |= gBattlerAttacker; - gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; + gBattleMons[gBattlerTarget].volatiles.leechSeed = LEECHSEEDED_BY(gBattlerAttacker); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; } @@ -9864,19 +9846,8 @@ static void Cmd_jumpifnotfirstturn(void) gBattlescriptCurrInstr = jumpInstr; } -static void Cmd_setmiracleeye(void) +static void Cmd_unused_0x83(void) { - CMD_ARGS(const u8 *failInstr); - - if (!(gStatuses3[gBattlerTarget] & STATUS3_MIRACLE_EYED)) - { - gStatuses3[gBattlerTarget] |= STATUS3_MIRACLE_EYED; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } } bool8 UproarWakeUpCheck(u8 battler) @@ -10953,7 +10924,7 @@ static void Cmd_tryKO(void) else { if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level - && ((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS + && ((gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) || IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_NO_GUARD) || IsAbilityAndRecord(gBattlerTarget, targetAbility, ABILITY_NO_GUARD))) @@ -11625,9 +11596,7 @@ static void Cmd_settypetorandomresistance(void) static void Cmd_setalwayshitflag(void) { CMD_ARGS(); - - gStatuses3[gBattlerTarget] &= ~STATUS3_ALWAYS_HITS; - gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2); + gBattleMons[gBattlerTarget].volatiles.lockOn = 2; gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12021,7 +11990,7 @@ static void Cmd_trysetperishsong(void) for (i = 0; i < gBattlersCount; i++) { - if (gStatuses3[i] & STATUS3_PERISH_SONG + if (gBattleMons[i].volatiles.perishSong || GetBattlerAbility(i) == ABILITY_SOUNDPROOF || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) || gBattleMons[i].volatiles.semiInvulnerable == STATE_COMMANDER) @@ -12030,7 +11999,7 @@ static void Cmd_trysetperishsong(void) } else { - gStatuses3[i] |= STATUS3_PERISH_SONG; + gBattleMons[i].volatiles.perishSong = TRUE; gDisableStructs[i].perishSongTimer = 3; } } @@ -12111,13 +12080,13 @@ static void Cmd_setembargo(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_EMBARGO) + if (gBattleMons[gBattlerTarget].volatiles.embargo) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gStatuses3[gBattlerTarget] |= STATUS3_EMBARGO; + gBattleMons[gBattlerTarget].volatiles.embargo = TRUE; gDisableStructs[gBattlerTarget].embargoTimer = gBattleTurnCounter + 5; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12355,10 +12324,9 @@ static void Cmd_rapidspinfree(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); BattleScriptCall(BattleScript_WrapFree); } - else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) + else if (gBattleMons[gBattlerAttacker].volatiles.leechSeed) { - gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED; - gStatuses3[gBattlerAttacker] &= ~STATUS3_LEECHSEED_BATTLER; + gBattleMons[gBattlerAttacker].volatiles.leechSeed = 0; BattleScriptCall(BattleScript_LeechSeedFree); } else if (AreAnyHazardsOnSide(atkSide)) @@ -12617,14 +12585,8 @@ static void Cmd_tryfiretwoturnmovenowbyeffect(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setminimize(void) +static void Cmd_unused_0xC7(void) { - CMD_ARGS(); - - if (gHitMarker & HITMARKER_OBEYS) - gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED; - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_c8(void) @@ -12678,7 +12640,7 @@ static void Cmd_setcharge(void) CMD_ARGS(u8 battler); u8 battler = GetBattlerForBattleScript(cmd->battler); - gStatuses3[battler] |= STATUS3_CHARGED_UP; + gBattleMons[battler].volatiles.charge = TRUE; if (B_CHARGE < GEN_9) gDisableStructs[battler].chargeTimer = 2; else @@ -12968,7 +12930,7 @@ static void Cmd_trywish(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + if (gBattleMons[gBattlerTarget].volatiles.healBlock) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13002,6 +12964,7 @@ static void Cmd_settoxicspikes(void) } } +// TODO: possible failing bug for when gastro acid is already active static void Cmd_setgastroacid(void) { CMD_ARGS(const u8 *failInstr); @@ -13015,7 +12978,7 @@ static void Cmd_setgastroacid(void) if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; - gStatuses3[gBattlerTarget] |= STATUS3_GASTRO_ACID; + gBattleMons[gBattlerTarget].volatiles.gastroAcid = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -13024,7 +12987,7 @@ static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & STATUS3_YAWN + if (gBattleMons[gBattlerTarget].volatiles.yawn || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) { gBattlescriptCurrInstr = cmd->failInstr; @@ -13043,7 +13006,7 @@ static void Cmd_setyawn(void) } else { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + gBattleMons[gBattlerTarget].volatiles.yawn = 2; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -13139,13 +13102,13 @@ static void Cmd_tryimprison(void) { CMD_ARGS(const u8 *failInstr); - if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS)) + if (gBattleMons[gBattlerAttacker].volatiles.imprison) { gBattlescriptCurrInstr = cmd->failInstr; } else if (B_IMPRISON >= GEN_5) { - gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; + gBattleMons[gBattlerAttacker].volatiles.imprison = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -13171,7 +13134,7 @@ static void Cmd_tryimprison(void) } if (attackerMoveId != MAX_MON_MOVES) { - gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; + gBattleMons[gBattlerAttacker].volatiles.imprison = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; break; } @@ -13198,23 +13161,30 @@ static void Cmd_setstealthrock(void) } } -static void Cmd_setuserstatus3(void) +static void Cmd_trysetvolatile(void) { - CMD_ARGS(u32 flags, const u8 *failInstr); + CMD_ARGS(u8 battler, u8 _volatile, const u8 *failInstr); - u32 flags = cmd->flags; + u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gStatuses3[gBattlerAttacker] & flags) + if (GetBattlerVolatile(battler, cmd->_volatile) != 0) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gStatuses3[gBattlerAttacker] |= flags; - if (flags & STATUS3_MAGNET_RISE) - gDisableStructs[gBattlerAttacker].magnetRiseTimer = gBattleTurnCounter + 5; - if (flags & STATUS3_LASER_FOCUS) - gDisableStructs[gBattlerAttacker].laserFocusTimer = gBattleTurnCounter + 2; + SetMonVolatile(battler, cmd->_volatile, TRUE); + switch (cmd->_volatile) + { + case VOLATILE_MAGNET_RISE: + gDisableStructs[battler].magnetRiseTimer = gBattleTurnCounter + 5; + break; + case VOLATILE_LASER_FOCUS: + gDisableStructs[battler].laserFocusTimer = gBattleTurnCounter + 2; + break; + default: + break; + } gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14459,7 +14429,9 @@ static void Cmd_settelekinesis(void) { CMD_ARGS(const u8 *failInstr); - if (gStatuses3[gBattlerTarget] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) + if (gBattleMons[gBattlerTarget].volatiles.telekinesis + || gBattleMons[gBattlerTarget].volatiles.root + || gBattleMons[gBattlerTarget].volatiles.smackDown || gFieldStatuses & STATUS_FIELD_GRAVITY || IsTelekinesisBannedSpecies(gBattleMons[gBattlerTarget].species)) { @@ -14467,7 +14439,7 @@ static void Cmd_settelekinesis(void) } else { - gStatuses3[gBattlerTarget] |= STATUS3_TELEKINESIS; + gBattleMons[gBattlerTarget].volatiles.telekinesis = TRUE; gDisableStructs[gBattlerTarget].telekinesisTimer = gBattleTurnCounter + 3; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16901,7 +16873,8 @@ void BS_GravityOnAirborneMons(void) CancelMultiTurnMoves(gBattlerTarget, SKY_DROP_GRAVITY_ON_AIRBORNE); gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; - gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS); + gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; + gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17674,7 +17647,7 @@ void BS_PowerTrick(void) { NATIVE_ARGS(); u32 temp; - gStatuses3[gBattlerAttacker] ^= STATUS3_POWER_TRICK; + gBattleMons[gBattlerAttacker].volatiles.powerTrick = !gBattleMons[gBattlerAttacker].volatiles.powerTrick; SWAP(gBattleMons[gBattlerAttacker].attack, gBattleMons[gBattlerAttacker].defense, temp); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -18297,9 +18270,9 @@ void BS_CureCertainStatuses(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; } // Check heal block - if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + if (gBattleMons[gBattlerTarget].volatiles.healBlock) { - gStatuses3[gBattlerTarget] &= ~(STATUS3_HEAL_BLOCK); + gBattleMons[gBattlerTarget].volatiles.healBlock = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; } // Check disable diff --git a/src/battle_tv.c b/src/battle_tv.c index e23712beab..6504a3cc43 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -591,7 +591,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].usedMoveSlot = moveSlot; AddMovePoints(PTS_MOVE_EFFECT, moveSlot, move, 0); AddPointsBasedOnWeather(weatherFlags, move, moveSlot); - if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP) + if (gBattleMons[gBattlerAttacker].volatiles.charge) AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); if (move == MOVE_WISH) diff --git a/src/battle_util.c b/src/battle_util.c index 13f830d953..8eb6a89bc1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1281,7 +1281,7 @@ static bool32 IsGravityPreventingMove(u32 move) bool32 IsHealBlockPreventingMove(u32 battler, u32 move) { - if (!(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + if (!gBattleMons[battler].volatiles.healBlock) return FALSE; return IsHealingMove(move); @@ -1656,7 +1656,7 @@ u8 GetImprisonedMovesCount(u32 battler, u16 move) for (i = 0; i < gBattlersCount; i++) { - if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) + if (battlerSide != GetBattlerSide(i) && gBattleMons[i].volatiles.imprison) { s32 j; for (j = 0; j < MAX_MON_MOVES; j++) @@ -1892,7 +1892,7 @@ void SetAtkCancellerForCalledMove(void) static enum MoveCanceller CancellerFlags(void) { gBattleMons[gBattlerAttacker].volatiles.destinyBond = FALSE; - gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE; + gBattleMons[gBattlerAttacker].volatiles.grudge = FALSE; gBattleMons[gBattlerAttacker].volatiles.glaiveRush = FALSE; return MOVE_STEP_SUCCESS; } @@ -2095,7 +2095,7 @@ static enum MoveCanceller CancellerDisabled(void) static enum MoveCanceller CancellerVolatileBlocked(void) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gBattleMons[gBattlerAttacker].volatiles.healBlock && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) { gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; gBattleScripting.battler = gBattlerAttacker; @@ -3173,7 +3173,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 return FALSE; case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: gBattleStruct->pledgeMove = FALSE; - if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK)) + if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) { if ((gProtectStructs[battlerAtk].notFirstStrike)) battleScript = BattleScript_MonMadeMoveUseless; @@ -4096,7 +4096,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() - && !(gStatuses3[partner] & STATUS3_HEAL_BLOCK) + && !gBattleMons[partner].volatiles.healBlock && gBattleMons[partner].hp < gBattleMons[partner].maxHP && IsBattlerAlive(partner)) { @@ -4213,7 +4213,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !IsBattlerAtMaxHp(battler) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + && !gBattleMons[battler].volatiles.healBlock) { BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal); gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -4230,7 +4230,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_RAIN_DISH: if (IsBattlerWeatherAffected(battler, B_WEATHER_RAIN) && !IsBattlerAtMaxHp(battler) - && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + && !gBattleMons[battler].volatiles.healBlock) { BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); @@ -4832,14 +4832,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) - && !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG)) + && !gBattleMons[gBattlerAttacker].volatiles.perishSong) { - if (!(gStatuses3[battler] & STATUS3_PERISH_SONG)) + if (!gBattleMons[battler].volatiles.perishSong) { - gStatuses3[battler] |= STATUS3_PERISH_SONG; + gBattleMons[battler].volatiles.perishSong = TRUE; gDisableStructs[battler].perishSongTimer = 3; } - gStatuses3[gBattlerAttacker] |= STATUS3_PERISH_SONG; + gBattleMons[gBattlerAttacker].volatiles.perishSong = TRUE; gDisableStructs[gBattlerAttacker].perishSongTimer = 3; BattleScriptCall(BattleScript_PerishBodyActivates); effect++; @@ -5339,7 +5339,7 @@ bool32 IsNeutralizingGasOnField(void) for (i = 0; i < gBattlersCount; i++) { - if (IsBattlerAlive(i) && gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !(gStatuses3[i] & STATUS3_GASTRO_ACID)) + if (IsBattlerAlive(i) && gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gBattleMons[i].volatiles.gastroAcid) return TRUE; } @@ -5348,7 +5348,7 @@ bool32 IsNeutralizingGasOnField(void) bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) { - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) + if (gBattleMons[battler].volatiles.gastroAcid) return FALSE; if (ability == ABILITY_MOLD_BREAKER @@ -5400,7 +5400,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS { // Edge case: pokemon under the effect of gastro acid transforms into a pokemon with Comatose (Todo: verify how other unsuppressable abilities behave) if (gBattleMons[battler].volatiles.transformed - && gStatuses3[battler] & STATUS3_GASTRO_ACID + && gBattleMons[battler].volatiles.gastroAcid && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; @@ -5410,7 +5410,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS return gBattleMons[battler].ability; } - if (gStatuses3[battler] & STATUS3_GASTRO_ACID) + if (gBattleMons[battler].volatiles.gastroAcid) return ABILITY_NONE; if (!hasAbilityShield @@ -5502,7 +5502,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check return FALSE; else if (gBattleMons[battler].volatiles.wrapped) return FALSE; - else if (gStatuses3[battler] & STATUS3_ROOTED) + else if (gBattleMons[battler].volatiles.root) return FALSE; else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return FALSE; @@ -5875,7 +5875,7 @@ bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId) static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, enum ItemCaseId caseID) { if (HasEnoughHpToEatBerry(battler, (B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2), itemId) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); @@ -6003,7 +6003,7 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battler) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && ((IsBattlerTurnDamaged(battler) && gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) { gBattleScripting.battler = battler; gBattleStruct->moveDamage[battler] = (gBattleMons[battler].maxHP * 25 / 100) * -1; @@ -6125,7 +6125,7 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, enum ItemCaseId caseID) static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 percentHeal) { if (!(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock) && HasEnoughHpToEatBerry(battler, 2, itemId)) { if (percentHeal) @@ -6196,9 +6196,9 @@ static bool32 GetMentalHerbEffect(u32 battler) ret = TRUE; } // Check heal block - if (gStatuses3[battler] & STATUS3_HEAL_BLOCK) + if (gBattleMons[battler].volatiles.healBlock) { - gStatuses3[battler] &= ~STATUS3_HEAL_BLOCK; + gBattleMons[battler].volatiles.healBlock = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; ret = TRUE; } @@ -6789,7 +6789,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_LEFTOVERS: LEFTOVERS: if (gBattleMons[battler].hp < gBattleMons[battler].maxHP - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; if (gBattleStruct->moveDamage[battler] == 0) @@ -7025,7 +7025,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) && IsBattlerAlive(gBattlerAttacker) && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT - && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) { gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; @@ -7299,7 +7299,7 @@ void ClearVariousBattlerFlags(u32 battler) gDisableStructs[battler].furyCutterCounter = 0; gBattleMons[battler].volatiles.destinyBond = FALSE; gBattleMons[battler].volatiles.glaiveRush = FALSE; - gStatuses3[battler] &= ~STATUS3_GRUDGE; + gBattleMons[battler].volatiles.grudge = FALSE; } void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands @@ -7539,11 +7539,11 @@ enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegati { if (checkNegating) { - if (gStatuses3[battler] & STATUS3_EMBARGO) + if (gBattleMons[battler].volatiles.embargo) return HOLD_EFFECT_NONE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return HOLD_EFFECT_NONE; - if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) + if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) return HOLD_EFFECT_NONE; } @@ -7708,13 +7708,13 @@ static bool32 IsBattlerGroundedInverseCheck(u32 battler, enum InverseBattleCheck return TRUE; if (gFieldStatuses & STATUS_FIELD_GRAVITY) return TRUE; - if (B_ROOTED_GROUNDING >= GEN_4 && gStatuses3[battler] & STATUS3_ROOTED) + if (B_ROOTED_GROUNDING >= GEN_4 && gBattleMons[battler].volatiles.root) return TRUE; - if (gStatuses3[battler] & STATUS3_SMACKED_DOWN) + if (gBattleMons[battler].volatiles.smackDown) return TRUE; - if (gStatuses3[battler] & STATUS3_TELEKINESIS) + if (gBattleMons[battler].volatiles.telekinesis) return FALSE; - if (gStatuses3[battler] & STATUS3_MAGNET_RISE) + if (gBattleMons[battler].volatiles.magnetRise) return FALSE; if (holdEffect == HOLD_EFFECT_AIR_BALLOON) return FALSE; @@ -8300,7 +8300,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (gSpecialStatuses[battlerAtk].gemBoost) modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); - if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) + if (gBattleMons[battlerAtk].volatiles.charge && moveType == TYPE_ELECTRIC) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (GetMoveEffect(gChosenMove) == EFFECT_ME_FIRST) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); @@ -9091,7 +9091,7 @@ static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageContext static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) { - if (MoveIncreasesPowerToMinimizedTargets(move) && gStatuses3[battlerDef] & STATUS3_MINIMIZED) + if (MoveIncreasesPowerToMinimizedTargets(move) && gBattleMons[battlerDef].volatiles.minimize) return UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -9569,7 +9569,7 @@ static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *m RecordAbilityBattle(ctx->battlerAtk, ctx->abilityAtk); } - if (ctx->moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[ctx->battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) + if (ctx->moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gBattleMons[ctx->battlerDef].volatiles.miracleEye && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); if (GetMoveEffect(ctx->move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(ctx->move)) mod = UQ_4_12(2.0); @@ -10524,7 +10524,7 @@ bool32 CanFling(u32 battler) if (item == ITEM_NONE || (B_KLUTZ_FLING_INTERACTION >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || gStatuses3[battler] & STATUS3_EMBARGO + || gBattleMons[battler].volatiles.embargo || GetFlingPowerFromItemId(item) == 0 || !CanBattlerGetOrLoseItem(battler, item)) return FALSE; @@ -10843,7 +10843,7 @@ bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) { if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY && IsBattlerAlly(battlerAtk, battlerDef) - && gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) + && gBattleMons[battlerAtk].volatiles.healBlock) return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff if (IsBattlerAlly(battlerAtk, battlerDef) && (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX || IsGimmickSelected(battlerAtk, GIMMICK_DYNAMAX))) @@ -11468,7 +11468,7 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) // Gets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred -u32 GetMonVolatile(u32 battler, enum Volatile _volatile) +u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile) { switch (_volatile) { @@ -11608,7 +11608,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - if ((gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) + if ((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) || (B_TOXIC_NEVER_MISS >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) || gBattleMons[battlerDef].volatiles.glaiveRush) { @@ -11630,7 +11630,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u ability = ABILITY_NO_GUARD; } // If the target is under the effects of Telekinesis, and the move isn't a OH-KO move, move hits. - else if (gStatuses3[battlerDef] & STATUS3_TELEKINESIS + else if (gBattleMons[battlerDef].volatiles.telekinesis && !IsSemiInvulnerable(battlerDef, CHECK_ALL) && moveEffect != EFFECT_OHKO && moveEffect != EFFECT_SHEER_COLD) @@ -11658,7 +11658,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u } } else if (B_MINIMIZE_DMG_ACC >= GEN_6 - && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) + && gBattleMons[battlerDef].volatiles.minimize && MoveIncreasesPowerToMinimizedTargets(move)) { effect = TRUE; @@ -11703,7 +11703,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (defAbility == ABILITY_UNAWARE) accStage = DEFAULT_STAT_STAGE; - if (gBattleMons[battlerDef].volatiles.foresight || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + if (gBattleMons[battlerDef].volatiles.foresight || gBattleMons[battlerDef].volatiles.miracleEye) buff = accStage; else buff = accStage + DEFAULT_STAT_STAGE - evasionStage; diff --git a/src/item_use.c b/src/item_use.c index 5895016399..a086737bd9 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1244,8 +1244,8 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) u16 hp = GetMonData(mon, MON_DATA_HP); // Embargo Check - if ((gPartyMenu.slotId == 0 && gStatuses3[B_POSITION_PLAYER_LEFT] & STATUS3_EMBARGO) - || (gPartyMenu.slotId == 1 && gStatuses3[B_POSITION_PLAYER_RIGHT] & STATUS3_EMBARGO)) + if ((gPartyMenu.slotId == 0 && gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.embargo) + || (gPartyMenu.slotId == 1 && gBattleMons[B_POSITION_PLAYER_RIGHT].volatiles.embargo)) { return TRUE; } From eab10dc2f0a2a19f53dafbcf394dcf4b3935e28d Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Tue, 12 Aug 2025 04:30:14 -0400 Subject: [PATCH 201/248] Fix AI's KO evaluation getting messed up by priority (#7533) --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 92 +++++++++++++++------------ src/battle_ai_util.c | 48 +++++++++----- test/battle/ai/ai.c | 29 +++++---- test/battle/ai/ai_flag_predict_move.c | 15 +++++ test/battle/ai/ai_switching.c | 15 +++++ 6 files changed, 130 insertions(+), 70 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 118fbf5984..5759427f4b 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -296,6 +296,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); +u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 430412966b..78f1b72b28 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -742,7 +742,10 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) u64 flags = gAiThinkingStruct->aiFlags[battler]; u32 opposingBattler = GetOppositeBattler(battler); + gAiThinkingStruct->aiLogicId = 0; + gAiThinkingStruct->movesetIndex = 0; gAiLogicData->partnerMove = 0; // no ally + while (flags != 0) { if (flags & 1) @@ -1078,6 +1081,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 i; u32 weather; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); u32 abilityAtk = aiData->abilities[battlerAtk]; u32 abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); @@ -1088,7 +1092,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsPowderMove(move) && !IsAffectedByPowder(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); - if (!BreaksThroughSemiInvulnerablity(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (!BreaksThroughSemiInvulnerablity(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) RETURN_SCORE_MINUS(10); if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) @@ -1320,7 +1324,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (moveEffect) { case EFFECT_HIT: // only applies to Vital Throw - if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && aiData->hpPercents[battlerAtk] < 40) + if (GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move) < 0 && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && aiData->hpPercents[battlerAtk] < 40) ADJUST_SCORE(-2); // don't want to move last break; default: @@ -1775,7 +1779,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) ADJUST_SCORE(-10); // no anticipated move to disable @@ -1797,7 +1801,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) ADJUST_SCORE(-10); // no anticipated move to encore @@ -2184,7 +2188,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SPITE: case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker should go first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker should go first { if (gLastMoves[battlerDef] == MOVE_NONE || gLastMoves[battlerDef] == 0xFFFF) @@ -2360,7 +2364,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards - && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the potential Defog + && AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // partner is going to set up before the potential Defog { ADJUST_SCORE(-10); break; // Don't use Defog if partner is going to set up hazards @@ -2388,7 +2392,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE - && AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && GetMoveEffect(predictedMove) == EFFECT_SEMI_INVULNERABLE) ADJUST_SCORE(-10); // Don't Fly/dig/etc if opponent is going to fly/dig/etc after you @@ -2536,7 +2540,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ME_FIRST: if (predictedMove != MOVE_NONE) { - if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); // Target is predicted to go first, Me First will fail else if (GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckBadMove(battlerAtk, battlerDef, predictedMove, score); @@ -2712,7 +2716,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_ELECTRIFY: - if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) //|| GetMoveTypeSpecial(battlerDef, predictedMove) == TYPE_ELECTRIC // Move will already be electric type || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2744,7 +2748,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INSTRUCT: { u32 instructedMove; - if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) instructedMove = predictedMove; else instructedMove = gLastMoves[battlerDef]; @@ -2781,21 +2785,21 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_QUASH: if (!hasPartner - || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_AFTER_YOU: if (!IsTargetingPartner(battlerAtk, battlerDef) || !hasPartner - || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_SUCKER_PUNCH: if ((HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_STATUS) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_CHANCE)) // Player has a status move || (IsBattleMoveStatus(predictedMove) && RandomPercentage(RNG_AI_SUCKER_PUNCH, SUCKER_PUNCH_PREDICTION_CHANCE) && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE)) // AI actively predicting incoming status move - || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Opponent going first + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent going first ADJUST_SCORE(-10); break; case EFFECT_TAILWIND: @@ -2832,7 +2836,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FLAIL: - if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) // Opponent should go first + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent should go first || aiData->hpPercents[battlerAtk] > 50) ADJUST_SCORE(-4); break; @@ -2867,7 +2871,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) ADJUST_SCORE(-10); else if (CanTargetFaintAi(battlerDef, battlerAtk) - && AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(-10); break; case EFFECT_JUNGLE_HEALING: @@ -2898,7 +2902,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 defPrio = GetBattleMovePriority(battlerDef, aiData->abilities[battlerDef], predictedMove); if (predictedMove == MOVE_NONE || IsBattleMoveStatus(predictedMove) - || AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) || defPrio < 1 || defPrio > 3) // Opponent going first or not using priority move ADJUST_SCORE(-10); @@ -2967,6 +2971,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 movesetIndex = gAiThinkingStruct->movesetIndex; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (IsTargetingPartner(battlerAtk, battlerDef)) return score; @@ -2978,7 +2983,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) && effect != EFFECT_EXPLOSION && effect != EFFECT_MISTY_EXPLOSION) { - if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(FAST_KILL); else ADJUST_SCORE(SLOW_KILL); @@ -3012,6 +3017,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) bool32 partnerProtecting = IsAllyProtectingFromMove(battlerAtk, move, aiData->partnerMove) && !MoveIgnoresProtect(move); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); @@ -3059,7 +3065,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Adjust for always crit moves if (MoveAlwaysCrits(aiData->partnerMove) && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT) { - if (AI_IsSlower(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY)) // Partner moving first + if (AI_IsSlower(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Partner moving first { // discourage raising our attack since it's about to be maxed out if (IsAttackBoostMoveEffect(effect)) @@ -3232,7 +3238,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_ANGER_POINT: if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && isFriendlyFireOK) { if (MoveAlwaysCrits(move)) @@ -3551,7 +3557,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_INSTRUCT: { u16 instructedMove; - if (AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMove, CONSIDER_PRIORITY)) + if (AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) instructedMove = aiData->partnerMove; else instructedMove = gLastMoves[battlerAtkPartner]; @@ -3568,8 +3574,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); - if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove, predictedMove, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner - && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner + if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner + && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner { if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last @@ -3578,8 +3584,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_HEAL_PULSE: case EFFECT_HIT_ENEMY_HEAL_ALLY: - if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move, predictedMove, CONSIDER_PRIORITY) - && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move, predictedMove, CONSIDER_PRIORITY) + if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && gBattleMons[battlerAtkPartner].hp < gBattleMons[battlerAtkPartner].maxHP / 2) RETURN_SCORE_PLUS(WEAK_EFFECT); break; @@ -3699,9 +3705,9 @@ static enum MoveComparisonResult CompareMoveAccuracies(u32 battlerAtk, u32 battl static enum MoveComparisonResult CompareMoveSpeeds(u32 battlerAtk, u32 battlerDef, u16 move1, u16 move2) { - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 speed1 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move1, predictedMove, CONSIDER_PRIORITY); - u32 speed2 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move2, predictedMove, CONSIDER_PRIORITY); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 speed1 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move1, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + u32 speed2 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move2, predictedMoveSpeedCheck, CONSIDER_PRIORITY); if (speed1 == AI_IS_FASTER && speed2 == AI_IS_SLOWER) return MOVE_WON_COMPARISON; @@ -3937,6 +3943,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) s32 score = 0; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); u32 predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); bool32 isBattle1v1 = IsBattle1v1(); @@ -4235,7 +4242,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move)); break; case EFFECT_MIMIC: - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { if (gLastMoves[battlerDef] != MOVE_NONE && gLastMoves[battlerDef] != 0xFFFF && (GetMoveEffect(gLastMoves[battlerDef]) != GetMoveEffect(move))) @@ -4307,7 +4314,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && (gLastMoves[battlerDef] != MOVE_NONE) && (gLastMoves[battlerDef] != 0xFFFF) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY))) + && (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) { if (CanTargetMoveFaintAi(gLastMoves[battlerDef], battlerDef, battlerAtk, 1)) ADJUST_SCORE(GOOD_EFFECT); // Disable move that can kill attacker @@ -4347,7 +4354,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_DESTINY_BOND: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk)) + else if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SPITE: @@ -4564,7 +4571,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (predictedMove != MOVE_NONE && isBattle1v1) { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); - if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && (predictedEffect == EFFECT_EXPLOSION || predictedEffect == EFFECT_MISTY_EXPLOSION || predictedEffect == EFFECT_PROTECT)) @@ -4613,7 +4620,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_ATTRACT: if (isBattle1v1 - && (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + && (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && BattlerWillFaintFromSecondaryDamage(battlerDef, aiData->abilities[battlerDef])) break; // Don't use if the attract won't have a change to activate if (gBattleMons[battlerDef].status1 & STATUS1_ANY @@ -4661,7 +4668,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (hasPartner) { if (IsHazardMove(aiData->partnerMove) // Partner is going to set up hazards - && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move, predictedMove, CONSIDER_PRIORITY)) // Partner going first + && AI_IsSlower(battlerAtk, BATTLE_PARTNER(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Partner going first break; // Don't use Defog if partner is going to set up hazards } ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_EVASION)); @@ -5155,7 +5162,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEAL_BLOCK: - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && predictedMove != MOVE_NONE && IsHealingMove(predictedMove)) ADJUST_SCORE(DECENT_EFFECT); // Try to cancel healing move else if (HasHealingEffect(battlerDef) || aiData->holdEffects[battlerDef] == HOLD_EFFECT_LEFTOVERS || (aiData->holdEffects[battlerDef] == HOLD_EFFECT_BLACK_SLUDGE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_POISON))) @@ -5189,7 +5196,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_QUASH: - if (hasPartner && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) + if (hasPartner && AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(DECENT_EFFECT); // Attacker partner wouldn't go before target break; case EFFECT_TAILWIND: @@ -5204,7 +5211,7 @@ case EFFECT_GUARD_SPLIT: if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first { if (predictedType == TYPE_GROUND) ADJUST_SCORE(GOOD_EFFECT); // Cause the enemy's move to fail @@ -5219,7 +5226,7 @@ case EFFECT_GUARD_SPLIT: } break; case EFFECT_CAMOUFLAGE: - if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) // Attacker goes first + if (predictedMove != MOVE_NONE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Attacker goes first && !IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(DECENT_EFFECT); break; @@ -5246,7 +5253,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_ENDEAVOR: - if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) && !CanTargetFaintAi(battlerDef, battlerAtk)) + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_REVIVAL_BLESSING: @@ -5516,7 +5523,7 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_THROAT_CHOP: if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) { - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); @@ -5571,8 +5578,10 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 || gBattleResults.battleTurnCounter != 0) return score; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING - && AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && CanTargetFaintAi(battlerDef, battlerAtk) && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) == 0) { @@ -6162,6 +6171,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // Switch benefit switch (moveEffect) @@ -6173,7 +6183,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); else if (hitsToKO == 1) ADJUST_SCORE(BEST_EFFECT); - else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move, predictedMove, CONSIDER_PRIORITY) == AI_IS_SLOWER) // Pursuit against fast U-Turn + else if (IsSwitchOutEffect(GetMoveEffect(predictedMove)) && AI_WhoStrikesFirst(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) == AI_IS_SLOWER) // Pursuit against fast U-Turn ADJUST_SCORE(DECENT_EFFECT); break; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 8fe1067a19..e6dec3e58d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -199,6 +199,14 @@ u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData return aiData->lastUsedMove[opposingBattler]; } +// When not predicting, don't want to reference player's previous move; leads to weird behaviour for cases like Fake Out or Protect, especially in doubles +u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) +{ + if (aiData->predictingMove && CanAiPredictMove()) + return aiData->predictedMove[opposingBattler]; + return MOVE_NONE; +} + void ClearBattlerMoveHistory(u32 battlerId) { memset(gBattleHistory->usedMoves[battlerId], 0, sizeof(gBattleHistory->usedMoves[battlerId])); @@ -497,6 +505,7 @@ u32 GetTotalBaseStat(u32 species) bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) { int i; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAI, opposingBattler, gAiLogicData); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -504,7 +513,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; - if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI), GetIncomingMove(battlerAI, opposingBattler, gAiLogicData), CONSIDER_PRIORITY)) + if (effect == EFFECT_SEMI_INVULNERABLE && AI_IsSlower(battlerAI, opposingBattler, GetAIChosenMove(battlerAI), predictedMoveSpeedCheck, CONSIDER_PRIORITY)) return TRUE; } return FALSE; @@ -2031,8 +2040,9 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, if (stat == STAT_SPEED) { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY) + return !(AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) && CountUsablePartyMons(battlerAtk) == 0 && !HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } @@ -2074,7 +2084,8 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += DECENT_EFFECT; break; case STAT_SPEED: - if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; break; case STAT_SPATK: @@ -3112,6 +3123,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov { bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class u32 battlerToSwitch; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); battlerToSwitch = gBattleStruct->AI_monToSwitchIntoId[battlerAtk]; @@ -3132,7 +3144,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (IsBattlerPredictedToSwitch(battlerDef)) return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent - if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) // Attacker goes first + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first { if (!CanAIFaintTarget(battlerAtk, battlerDef, 0)) // Can't KO foe otherwise { @@ -3514,10 +3526,11 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY))) // Opponent goes first + || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) // Opponent goes first { return 0; } @@ -3525,7 +3538,7 @@ u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbi || gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS || gBattleMons[battlerDef].volatiles.infatuation || gBattleMons[battlerDef].volatiles.confusionTurns > 0) - || ((AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) && CanTargetFaintAi(battlerDef, battlerAtk))) + || ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && CanTargetFaintAi(battlerDef, battlerAtk))) { return 2; // good idea to flinch } @@ -3558,7 +3571,8 @@ bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move) if (!MoveHasAdditionalEffect(move, MOVE_EFFECT_FLINCH)) return FALSE; - if (AI_IsSlower(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) return FALSE; u32 i; @@ -3710,7 +3724,8 @@ bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 mo bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) { - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { // using item or user goes first s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; @@ -3738,11 +3753,12 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) { u32 maxHP = gBattleMons[battlerAtk].maxHP; u32 healAmount = (healPercent * maxHP) / 100; + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (healAmount > maxHP) healAmount = maxHP; if (gBattleMons[battlerAtk].volatiles.healBlock) healAmount = 0; - if (AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), CONSIDER_PRIORITY)) + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) { if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) @@ -4479,7 +4495,8 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, { enum AIScore tempScore = NO_INCREASE; u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk); - u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; u32 statId = GetStatBeingChanged(statChange); @@ -5025,8 +5042,9 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str } else { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battler, opposingBattler, gAiLogicData); // will we go first? - if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove, GetIncomingMove(battler, opposingBattler, gAiLogicData), CONSIDER_PRIORITY) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) + if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) return USE_GIMMICK; } } @@ -5149,8 +5167,8 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) ADJUST_SCORE_PTR(GOOD_EFFECT); if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); - - if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move, GetIncomingMove(battlerAtk, battlerDef, gAiLogicData), DONT_CONSIDER_PRIORITY)) + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE_PTR(-10); if (gBattleMons[battlerDef].volatiles.substitute) ADJUST_SCORE_PTR(GOOD_EFFECT); @@ -5188,9 +5206,9 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st default: break; } - + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, opposingBattler, gAiLogicData); return (preventsStatLoss - && AI_IsFaster(battlerAtk, battlerAtkPartner, MOVE_NONE, GetIncomingMove(battlerAtk, opposingBattler, gAiLogicData), CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, battlerAtkPartner, MOVE_NONE, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)); } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 4c65a23489..4c86673473 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -661,20 +661,6 @@ AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player' } } -AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a move of the same priority bracket and the opponent is faster") -{ - GIVEN { - ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); - ASSUME(GetMovePriority(MOVE_SUCKER_PUNCH) == 1); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET) { Speed(300); Moves(MOVE_QUICK_ATTACK); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } - } WHEN { - TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SUCKER_PUNCH); } - TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } - } -} - AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a status move a percentage of the time") { PASSES_RANDOMLY(SUCKER_PUNCH_CHANCE, 100, RNG_AI_SUCKER_PUNCH); @@ -1022,3 +1008,18 @@ AI_SINGLE_BATTLE_TEST("AI has a chance to prioritize last chance priority damage TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_AQUA_JET); } } } + +AI_DOUBLE_BATTLE_TEST("AI won't be confused by player's previous priority moves when evaluating KOs") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_BEAUTIFLY) { Speed(1); Moves(MOVE_DETECT, MOVE_SCRATCH); } + PLAYER(SPECIES_MASQUERAIN) { Speed(10); Moves(MOVE_DETECT, MOVE_SCRATCH); } + OPPONENT(SPECIES_CRADILY) { Speed(5); Moves(MOVE_POWER_GEM); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_DETECT); EXPECT_MOVE(opponentLeft, MOVE_POWER_GEM, target:playerLeft); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); } + TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_DETECT); EXPECT_MOVE(opponentLeft, MOVE_POWER_GEM, target:playerLeft); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); } + } +} diff --git a/test/battle/ai/ai_flag_predict_move.c b/test/battle/ai/ai_flag_predict_move.c index 97a7c12afa..6a8554b734 100644 --- a/test/battle/ai/ai_flag_predict_move.c +++ b/test/battle/ai/ai_flag_predict_move.c @@ -27,3 +27,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_MOVE: AI will still attack you when it sh TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_LEAF_BLADE); } } } + +AI_SINGLE_BATTLE_TEST("AI won't use Sucker Punch if it expects a move of the same priority bracket and the opponent is faster") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); + ASSUME(GetMovePriority(MOVE_SUCKER_PUNCH) == 1); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Speed(300); Moves(MOVE_QUICK_ATTACK); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_SUCKER_PUNCH, MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_QUICK_ATTACK); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + } +} diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 79ffccc618..0a41343427 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1385,3 +1385,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider Hidden Power wh TURN { MOVE(player, MOVE_HIDDEN_POWER); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: Fake Out style moves won't confuse choiced AI into thinking it does no damage") +{ + + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_SCARF].holdEffect == HOLD_EFFECT_CHOICE_SCARF); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_FAKE_OUT, MOVE_SCRATCH); } + OPPONENT(SPECIES_INFERNAPE) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } + } WHEN { + TURN { MOVE(player, MOVE_FAKE_OUT); EXPECT_MOVE(opponent, MOVE_CLOSE_COMBAT); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_CLOSE_COMBAT); } + } +} From c6ee7feaa3cfe0d926f713fd95b3f24102e7779d Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Tue, 12 Aug 2025 14:45:02 +0100 Subject: [PATCH 202/248] Fixes some Ability Shield interactions (#7532) --- data/battle_scripts_1.s | 1 + src/battle_script_commands.c | 58 +++++++++++++----- src/battle_util.c | 11 +++- test/battle/hold_effect/ability_shield.c | 77 ++++++++++++++++++++++-- 4 files changed, 125 insertions(+), 22 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b7b4ec99cd..8318d7d214 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2459,6 +2459,7 @@ BattleScript_EffectGastroAcid:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + jumpifvolatile BS_TARGET, VOLATILE_GASTRO_ACID, BattleScript_ButItFailed setgastroacid BattleScript_ButItFailed attackanimation waitanimation diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 86cb831bb0..c58b85d187 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -335,6 +335,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u static void ResetValuesForCalledMove(void); static void TryRestoreDamageAfterCheekPouch(u32 battler); static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd); +static bool32 CanAbilityShieldActivateForBattler(u32 battler); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -12901,22 +12902,40 @@ static void Cmd_tryswapitems(void) } } +static bool32 CanAbilityShieldActivateForBattler(u32 battler) +{ + if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) + return FALSE; + + RecordItemEffectBattle(battler, HOLD_EFFECT_ABILITY_SHIELD); + gBattlerAbility = battler; + gLastUsedItem = gBattleMons[battler].item; + return TRUE; +} + // Role Play, Doodle static void Cmd_trycopyability(void) { CMD_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 partner = BATTLE_PARTNER(battler); u16 defAbility = gBattleMons[gBattlerTarget].ability; + bool32 shouldConsiderPartner = IsBattlerAlive(partner) && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE; if (gBattleMons[battler].ability == defAbility || defAbility == ABILITY_NONE || gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed - || (IsBattlerAlive(BATTLE_PARTNER(battler)) && gAbilitiesInfo[gBattleMons[BATTLE_PARTNER(battler)].ability].cantBeSuppressed && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE) + || (shouldConsiderPartner && gAbilitiesInfo[gBattleMons[partner].ability].cantBeSuppressed) || gAbilitiesInfo[defAbility].cantBeCopied) { gBattlescriptCurrInstr = cmd->failInstr; } + else if (CanAbilityShieldActivateForBattler(battler) || (shouldConsiderPartner && CanAbilityShieldActivateForBattler(partner))) + { + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); + } else { gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; @@ -12964,7 +12983,6 @@ static void Cmd_settoxicspikes(void) } } -// TODO: possible failing bug for when gastro acid is already active static void Cmd_setgastroacid(void) { CMD_ARGS(const u8 *failInstr); @@ -12973,6 +12991,11 @@ static void Cmd_setgastroacid(void) { gBattlescriptCurrInstr = cmd->failInstr; } + else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + gBattlescriptCurrInstr = cmd->failInstr; + } else { if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) @@ -13074,10 +13097,10 @@ static void Cmd_tryswapabilities(void) RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (CanAbilityShieldActivateForBattler(gBattlerAttacker) || CanAbilityShieldActivateForBattler(gBattlerTarget)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { @@ -14535,10 +14558,10 @@ static void Cmd_tryworryseed(void) RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (CanAbilityShieldActivateForBattler(gBattlerTarget)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { @@ -16645,10 +16668,15 @@ void BS_TryActivateAbilityShield(void) { NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 ability = GetBattlerAbility(battler); gBattlescriptCurrInstr = cmd->nextInstr; - if (GetBattlerAbilityNoAbilityShield(battler) != GetBattlerAbility(battler)) + if (ability != ABILITY_NONE // if ability would be negated by breaking effects Ability Shield doesn't print message + && ability == GetBattlerAbilityInternal(battler, TRUE, TRUE)) + return; + + if (GetBattlerAbilityNoAbilityShield(battler) != ability) { gLastUsedItem = gBattleMons[battler].item; RecordItemEffectBattle(battler, GetItemHoldEffect(gLastUsedItem)); @@ -17344,10 +17372,10 @@ void BS_SetSimpleBeam(void) RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (CanAbilityShieldActivateForBattler(gBattlerTarget)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { @@ -17369,10 +17397,10 @@ void BS_TryEntrainment(void) RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (CanAbilityShieldActivateForBattler(gBattlerTarget)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); - gBattlescriptCurrInstr = cmd->failInstr; + gBattlescriptCurrInstr = BattleScript_MoveEnd; + BattleScriptCall(BattleScript_AbilityShieldProtects); } else { diff --git a/src/battle_util.c b/src/battle_util.c index 8eb6a89bc1..ed00fb4d45 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3533,6 +3533,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; + if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; target1 = GetBattlerAtPosition(side); @@ -4529,7 +4531,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; @@ -4549,11 +4551,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped) { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } + if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); + break; + } gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; diff --git a/test/battle/hold_effect/ability_shield.c b/test/battle/hold_effect/ability_shield.c index ded39ff05b..9f98ea98ef 100644 --- a/test/battle/hold_effect/ability_shield.c +++ b/test/battle/hold_effect/ability_shield.c @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") } } -SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker") +SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker (no message)") { u32 item; @@ -50,16 +50,20 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker") TURN { MOVE(opponent, MOVE_EARTHQUAKE); } } SCENE { if (item == ITEM_ABILITY_SHIELD) { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Flygon's Ability is protected by the effects of its Ability Shield!"); + HP_BAR(player); + } ABILITY_POPUP(player, ABILITY_LEVITATE); - NOT HP_BAR(player); } else { - NOT ABILITY_POPUP(player, ABILITY_LEVITATE); HP_BAR(player); + NOT ABILITY_POPUP(player, ABILITY_LEVITATE); } } } -SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") +SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might (no message)") { u32 item; @@ -79,7 +83,10 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Vigoroth's Ability is protected by the effects of its Ability Shield!"); } + ABILITY_POPUP(player, ABILITY_VITAL_SPIRIT); } else { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); STATUS_ICON(player, sleep: TRUE); @@ -87,7 +94,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might") } } -SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") +SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike (no message)") { u32 item; @@ -103,10 +110,38 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike") } SCENE { if (item == ITEM_ABILITY_SHIELD) { NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Shedinja's Ability is protected by the effects of its Ability Shield!"); MESSAGE("Shedinja fainted!"); } + ABILITY_POPUP(player, ABILITY_WONDER_GUARD); } else { MESSAGE("Shedinja fainted!"); + NOT ABILITY_POPUP(player, ABILITY_WONDER_GUARD); + } + } +} + +SINGLE_BATTLE_TEST("Ability Shield protects the user's ability from being suppressed by Gastro Acid") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_BLAZIKEN) { Ability(ABILITY_SPEED_BOOST); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_GASTRO_ACID); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponent); + ABILITY_POPUP(player, ABILITY_SPEED_BOOST); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponent); + NOT ABILITY_POPUP(player, ABILITY_SPEED_BOOST); } } } @@ -130,9 +165,41 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap") ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); } else { ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); } } } + +SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap even if user has Klutz") +{ + u32 item; + + PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + PLAYER(SPECIES_LOPUNNY) { Ability(ABILITY_KLUTZ); Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SKILL_SWAP); } + } SCENE { + if (item == ITEM_ABILITY_SHIELD) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Lopunny's Ability is protected by the effects of its Ability Shield!"); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + } + } +} + +// These currently do not activate, but probably should do held item animation + message +TO_DO_BATTLE_TEST("Ability Shield prevents the user's Trace from changing its ability"); +TO_DO_BATTLE_TEST("Ability Shield prevents the user's Receiver from changing its ability"); +TO_DO_BATTLE_TEST("Ability Shield protects against Wandering Spirit"); +TO_DO_BATTLE_TEST("Ability Shield protects against Mummy/Lingering Aroma"); From 7fb5d98bf6d9a5f41eb416ebb2573f0191c9f24c Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 12 Aug 2025 17:12:45 -0400 Subject: [PATCH 203/248] AI uses Tailwind. (#7515) --- include/battle_ai_util.h | 1 - src/battle_ai_field_statuses.c | 8 +++--- src/battle_ai_main.c | 42 +++++++++++++++++++++++++++-- src/battle_ai_util.c | 21 --------------- test/battle/ai/ai_check_viability.c | 18 +++++++++++++ test/battle/ai/ai_doubles.c | 28 +++++++++++++++++++ 6 files changed, 90 insertions(+), 28 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 5759427f4b..2e62a1340b 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -125,7 +125,6 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability); bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability); bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move); bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex); -u32 GetBattlerSideSpeedAverage(u32 battler); bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 423910a0e5..bd7bdd8e17 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -429,13 +429,13 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) { // If we're in singles, we literally only care about speed. - if (!IsDoubleBattle()) + if (IsBattle1v1()) { - if (GetBattlerSideSpeedAverage(battler) < GetBattlerSideSpeedAverage(FOE(battler))) + if (gAiLogicData->speedStats[battler] < gAiLogicData->speedStats[FOE(battler)]) return FIELD_EFFECT_POSITIVE; // If we tie, we shouldn't change trick room state. - else if (GetBattlerSideSpeedAverage(battler) == GetBattlerSideSpeedAverage(FOE(battler))) - return FIELD_EFFECT_NEUTRAL; + else if (gAiLogicData->speedStats[battler] == gAiLogicData->speedStats[FOE(battler)]) + return FIELD_EFFECT_NEUTRAL; else return FIELD_EFFECT_NEGATIVE; } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 78f1b72b28..30093aafd4 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5092,6 +5092,9 @@ case EFFECT_GUARD_SPLIT: { if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); + // Set it for next pokemon in singles. + else if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !hasPartner && (CountUsablePartyMons(battlerAtk) != 0)) + ADJUST_SCORE(DECENT_EFFECT); // Don't unset it on last turn. else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != gBattleTurnCounter && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); @@ -5200,9 +5203,44 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); // Attacker partner wouldn't go before target break; case EFFECT_TAILWIND: - if (GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) - ADJUST_SCORE(GOOD_EFFECT); + { + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != gBattleTurnCounter) + break; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)) + ADJUST_SCORE(WEAK_EFFECT); + + if (isBattle1v1) + { + IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED); + + if (CountUsablePartyMons(battlerAtk) != 0) + ADJUST_SCORE(WEAK_EFFECT); + } + else + { + u32 tailwindScore = 0; + u32 speed = aiData->speedStats[battlerAtk]; + u32 partnerSpeed = aiData->speedStats[BATTLE_PARTNER(battlerAtk)]; + u32 foe1Speed = aiData->speedStats[FOE(battlerAtk)]; + u32 foe2Speed = aiData->speedStats[BATTLE_PARTNER(FOE(battlerAtk))]; + + if (speed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + if (speed <= foe2Speed && (speed * 2) > foe2Speed) + tailwindScore += 1; + if (partnerSpeed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + if (partnerSpeed <= foe1Speed && (speed * 2) > foe1Speed) + tailwindScore += 1; + + if (tailwindScore > 0) + tailwindScore += 1; + + ADJUST_SCORE(tailwindScore); + } break; + } case EFFECT_LUCKY_CHANT: if (isBattle1v1 && CountUsablePartyMons(battlerDef) > 0) ADJUST_SCORE(GOOD_EFFECT); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e6dec3e58d..a0e5e7716b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3687,27 +3687,6 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) return FALSE; } -u32 GetBattlerSideSpeedAverage(u32 battler) -{ - u32 speed1 = 0; - u32 speed2 = 0; - u32 numBattlersAlive = 0; - - if (IsBattlerAlive(battler)) - { - speed1 = gAiLogicData->speedStats[battler]; - numBattlersAlive++; - } - - if (HasPartner(battler)) - { - speed2 = gAiLogicData->speedStats[BATTLE_PARTNER(battler)]; - numBattlersAlive++; - } - - return (speed1 + speed2) / numBattlersAlive; -} - bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex) { if (recoilDmg >= gBattleMons[battlerAtk].hp //Recoil kills attacker diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index f18f7aceb1..c586b6fc81 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -340,6 +340,24 @@ AI_SINGLE_BATTLE_TEST("AI uses Skill Swap against Poison Heal") } } +AI_SINGLE_BATTLE_TEST("AI uses Trick Room (singles)") +{ + u32 speed; + PARAMETRIZE { speed = 10; } + PARAMETRIZE { speed = 20; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(11); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed); Moves(MOVE_TACKLE, MOVE_TRICK_ROOM); } + } WHEN { + if (speed == 10) + TURN { EXPECT_MOVE(opponent, MOVE_TRICK_ROOM); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_TRICK_ROOM); } + } +} + AI_SINGLE_BATTLE_TEST("AI uses Quick Guard against Quick Attack when opponent would take poison damage") { PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index ab6b4a4425..9e6edc4c56 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -594,6 +594,34 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") TURN { NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } } } + +AI_DOUBLE_BATTLE_TEST("AI uses Tailwind") +{ + u32 speed1, speed2, speed3, speed4; + + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 20; speed4 = 20; } + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 5; speed4 = 5; } + PARAMETRIZE { speed1 = 20; speed2 = 20; speed3 = 15; speed4 = 15; } + PARAMETRIZE { speed1 = 1; speed2 = 1; speed3 = 5; speed4 = 5; } + PARAMETRIZE { speed1 = 1; speed2 = 20; speed3 = 15; speed4 = 15; } + PARAMETRIZE { speed1 = 1; speed2 = 20; speed3 = 20; speed4 = 15; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(speed1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(speed2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed3); Moves(MOVE_TAILWIND, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(speed4); Moves(MOVE_TAILWIND, MOVE_HEADBUTT); } + } WHEN { + if (speed3 > 10) + TURN { EXPECT_MOVE(opponentLeft, MOVE_TAILWIND); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TAILWIND); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses Guard Split to improve its stats") { From 69cbd866aa82a40d1cd201db4f1b6f8ec4fa4b2b Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 12 Aug 2025 17:16:43 -0400 Subject: [PATCH 204/248] Fixing Refresh AI scoring (#7539) --- src/battle_ai_main.c | 4 ++-- test/battle/ai/ai_check_viability.c | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 30093aafd4..2d9e37d688 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2067,7 +2067,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_REFRESH: - if (!(gBattleMons[battlerDef].status1 & STATUS1_CAN_MOVE)) + if (!(gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE)) ADJUST_SCORE(-10); break; case EFFECT_PSYCHO_SHIFT: @@ -4861,7 +4861,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_REFRESH: - if (gBattleMons[battlerAtk].status1 & STATUS1_ANY) + if (gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TAKE_HEART: diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index c586b6fc81..4dff0e08ca 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -197,12 +197,22 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% c AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") { - u32 status1_0, status1_1, partnerAbility; + u32 status1_0, status1_1, partnerAbility, move; + + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; + move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SOUNDPROOF; } + + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; partnerAbility = ABILITY_SOUNDPROOF; } GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); @@ -210,11 +220,11 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, MOVE_HEAL_BELL, MOVE_ACID); Status1(status1_0); } + OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, move, MOVE_ACID); Status1(status1_0); } OPPONENT(SPECIES_EXPLOUD) { Status1(status1_1); Ability(partnerAbility); } } WHEN { if (status1_0 != STATUS1_NONE || (status1_1 != STATUS1_NONE && partnerAbility != ABILITY_SOUNDPROOF)) - TURN { EXPECT_MOVE(opponentLeft, MOVE_HEAL_BELL); } + TURN { EXPECT_MOVE(opponentLeft, move); } else TURN { EXPECT_MOVE(opponentLeft, MOVE_ROCK_SLIDE); } } From 9e49f55aaa4b5624d97dc6f073756fbfd07f227d Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 12 Aug 2025 17:17:08 -0400 Subject: [PATCH 205/248] Uncommenting out No Retreat, Clangorous Soul, and Extreme Evoboost from CheckBadMove (#7541) --- src/battle_ai_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2d9e37d688..6eeabc1823 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2853,18 +2853,18 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || GetBattlerWeight(battlerDef) >= 2000) //200.0 kg ADJUST_SCORE(-10); break; - /*case EFFECT_NO_RETREAT: - if (TrappedByNoRetreat(battlerAtk)) + case EFFECT_NO_RETREAT: + if (gDisableStructs[battlerAtk].noRetreat) ADJUST_SCORE(-10); break; case EFFECT_EXTREME_EVOBOOST: - if (MainStatsMaxed(battlerAtk)) + if (AreBattlersStatsMaxed(battlerAtk)) ADJUST_SCORE(-10); break; case EFFECT_CLANGOROUS_SOUL: if (gBattleMons[battlerAtk].hp <= gBattleMons[battlerAtk].maxHP / 3) ADJUST_SCORE(-10); - break;*/ + break; case EFFECT_REVIVAL_BLESSING: if (GetFirstFaintedPartyIndex(battlerAtk) == PARTY_SIZE) ADJUST_SCORE(-10); From 608c123c395a380e979df5cc3a843742c6599e73 Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 12 Aug 2025 17:18:18 -0400 Subject: [PATCH 206/248] AI should not use Dark Void or Hyperspace Fury while wrong species (#7540) --- src/battle_ai_main.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 6eeabc1823..65e61e2ff5 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2912,6 +2912,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; + case EFFECT_DARK_VOID: + if (B_DARK_VOID_FAIL >= GEN_7 && gBattleMons[battlerAtk].species != SPECIES_DARKRAI) + ADJUST_SCORE(-10); + break; + case EFFECT_HYPERSPACE_FURY: + if (gBattleMons[battlerAtk].species != SPECIES_HOOPA_UNBOUND) + ADJUST_SCORE(-10); + break; case EFFECT_PLACEHOLDER: return 0; // cannot even select } // move effect checks From 98a51bc97afe13a7b2bc0a00e3b9a87c2be63043 Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 12 Aug 2025 18:05:15 -0400 Subject: [PATCH 207/248] AI Tailwind singles fix correction. (#7543) --- src/battle_ai_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 65e61e2ff5..fe3ff13ee2 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5220,7 +5220,8 @@ case EFFECT_GUARD_SPLIT: if (isBattle1v1) { - IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED); + if (aiData->speedStats[battlerAtk] * 2 > aiData->speedStats[battlerDef]) + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); if (CountUsablePartyMons(battlerAtk) != 0) ADJUST_SCORE(WEAK_EFFECT); From 7b5844762dda10f163d7fd9b1fb5bee265a334c9 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Wed, 13 Aug 2025 09:39:55 +0100 Subject: [PATCH 208/248] make check TESTS="..." support for filenames and infix matches (#7536) --- Makefile | 2 +- include/test/battle.h | 7 ++++++- include/test/test.h | 8 ++++++++ test/test_runner.c | 45 ++++++++++++++++++++++++++++++++++++++----- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 759512ea63..8e5259ad1e 100644 --- a/Makefile +++ b/Makefile @@ -300,7 +300,7 @@ $(TESTELF): $(OBJ_DIR)/ld_script_test.ld $(OBJS) $(TEST_OBJS) libagbsyscall tool @echo "cd $(OBJ_DIR) && $(LD) -T ld_script_test.ld -o ../../$@ " @cd $(OBJ_DIR) && $(LD) $(TESTLDFLAGS) -T ld_script_test.ld -o ../../$@ $(OBJS_REL) $(TEST_OBJS_REL) $(LIB) $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) -d0 --silent - $(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS)\0" + $(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS:%*=%)\0" ifeq ($(GITHUB_REPOSITORY_OWNER),rh-hideout) TEST_SKIP_IS_FAIL := \x01 diff --git a/include/test/battle.h b/include/test/battle.h index b95038b09e..d909aa0332 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -2,8 +2,13 @@ * * To run all the tests use: * make check -j - * To run specific tests, e.g. Spikes ones, use: + * To run specific tests, e.g. Spikes ones, use either: * make check TESTS="Spikes" + * make check TESTS="*Spikes*" + * The first runs tests with names that start with Spikes, whereas the + * second runs tests with names that include Spikes anywhere in them. + * To run tests from a specific file, e.g. 'test/battle/move_effect/spikes.c', use: + * make check TESTS="test/battle/move_effect/spikes.c" * To build a ROM (pokemerald-test.elf) that can be opened in mgba to * view specific tests, e.g. Spikes ones, use: * make pokeemerald-test.elf TESTS="Spikes" diff --git a/include/test/test.h b/include/test/test.h index 835634df7b..48a6e84aa2 100644 --- a/include/test/test.h +++ b/include/test/test.h @@ -37,10 +37,18 @@ struct Test u16 sourceLine; }; +enum TestFilterMode +{ + TEST_FILTER_MODE_TEST_NAME_PREFIX, + TEST_FILTER_MODE_TEST_NAME_INFIX, + TEST_FILTER_MODE_FILENAME_EXACT, +}; + struct TestRunnerState { u8 state; u8 exitCode; + enum TestFilterMode filterMode:8; const char *skipFilename; u32 failedAssumptionsBlockLine; const struct Test *test; diff --git a/test/test_runner.c b/test/test_runner.c index 99ba3f42ab..fe9a5eccb6 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -34,6 +34,25 @@ static void Intr_Timer2(void); extern const struct Test __start_tests[]; extern const struct Test __stop_tests[]; +static enum TestFilterMode DetectFilterMode(const char *pattern) +{ + size_t n = strlen(pattern); + if (n > 2 && pattern[n-2] == '.' && pattern[n-1] == 'c') + return TEST_FILTER_MODE_FILENAME_EXACT; + else if (pattern[0] == '*') // TODO: Support '*pattern*'. + return TEST_FILTER_MODE_TEST_NAME_INFIX; + else + return TEST_FILTER_MODE_TEST_NAME_PREFIX; +} + +static bool32 ExactMatch(const char *pattern, const char *string) +{ + if (string == NULL) + return TRUE; + + return strcmp(pattern, string) == 0; +} + static bool32 PrefixMatch(const char *pattern, const char *string) { if (string == NULL) @@ -50,6 +69,14 @@ static bool32 PrefixMatch(const char *pattern, const char *string) } } +static bool32 InfixMatch(const char *pattern, const char *string) +{ + if (string == NULL) + return TRUE; + + return strstr(string, &pattern[1]) != NULL; +} + enum { STATE_INIT, @@ -171,6 +198,8 @@ top: return; } + gTestRunnerState.filterMode = DetectFilterMode(gTestRunnerArgv); + MoveSaveBlocks_ResetHeap(); ClearSav1(); ClearSav2(); @@ -231,11 +260,17 @@ top: gTestRunnerState.state = STATE_EXIT; return; } - if (gTestRunnerState.test->runner != &gAssumptionsRunner - && !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) - ++gTestRunnerState.test; - else - break; + if (gTestRunnerState.test->runner != &gAssumptionsRunner) + { + if ((gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_PREFIX && !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) + || (gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_INFIX && !InfixMatch(gTestRunnerArgv, gTestRunnerState.test->name)) + || (gTestRunnerState.filterMode == TEST_FILTER_MODE_FILENAME_EXACT && !ExactMatch(gTestRunnerArgv, gTestRunnerState.test->filename))) + { + ++gTestRunnerState.test; + continue; + } + } + break; } Test_MgbaPrintf(":N%s", gTestRunnerState.test->name); From 916f083852a7dd83e3152bdac3bb579570961e3e Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:02:41 +0100 Subject: [PATCH 209/248] Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines (#7425) --- include/data.h | 12 +++++++++- src/battle_controller_player_partner.c | 6 ++--- src/battle_transition.c | 2 +- src/data/battle_partners.party | 2 ++ src/data/pokemon/trainer_class_lookups.h | 12 ---------- tools/trainerproc/main.c | 30 ++++++++++++++++++++---- 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/include/data.h b/include/data.h index 4663bae33c..2128685e19 100644 --- a/include/data.h +++ b/include/data.h @@ -106,6 +106,7 @@ struct Trainer /*0x23*/ u8 poolPickIndex; /*0x24*/ u8 poolPruneIndex; /*0x25*/ u16 overrideTrainer; + /*0x26*/ u8 trainerBackPic; }; struct TrainerClass @@ -178,7 +179,6 @@ extern const union AnimCmd *const gAnims_MonPic[]; extern const union AnimCmd *const gAnims_Trainer[]; extern const struct TrainerSprite gTrainerSprites[]; extern const struct TrainerBacksprite gTrainerBacksprites[]; -extern const u16 gTrainerPicToTrainerBackPic[]; extern const struct Trainer gTrainers[DIFFICULTY_COUNT][TRAINERS_COUNT]; extern const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT]; @@ -261,6 +261,16 @@ static inline const u8 GetTrainerPicFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerPic; } +static inline const u8 GetTrainerBackPicFromId(u16 trainerId) +{ + enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); + + if (trainerId > TRAINER_PARTNER(PARTNER_NONE)) + return gBattlePartners[partnerDifficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; + + return GetTrainerStructFromId(trainerId)->trainerBackPic; +} + static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) { return GetTrainerStructFromId(trainerId)->startingStatus; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 513e286d12..5426f0239f 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -206,7 +206,7 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { - trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic; + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; xPos = 90; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } @@ -320,9 +320,9 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler) enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) - trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic].palette.data; else if (IsAiVsAiBattle()) - trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; + trainerPal = gTrainerSprites[GetTrainerBackPicFromId(gPartnerTrainerId)].palette.data; else trainerPal = gTrainerSprites[GetFrontierTrainerFrontSpriteId(gPartnerTrainerId)].palette.data; // 2 vs 2 multi battle in Battle Frontier, load front sprite and pal. diff --git a/src/battle_transition.c b/src/battle_transition.c index 4b350dd706..114248b93d 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2587,7 +2587,7 @@ static void Mugshots_CreateTrainerPics(struct Task *task) u8 trainerAPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentA); u8 trainerBPicId = GetTrainerPicFromId(TRAINER_BATTLE_PARAM.opponentB); - u8 partnerPicId = gTrainerPicToTrainerBackPic[GetTrainerPicFromId(gPartnerTrainerId)]; + u8 partnerPicId = GetTrainerPicFromId(gPartnerTrainerId); s16 opponentARotationScales = 0; s16 opponentBRotationScales = 0; diff --git a/src/data/battle_partners.party b/src/data/battle_partners.party index e1ecfe35fa..4b93292c6a 100644 --- a/src/data/battle_partners.party +++ b/src/data/battle_partners.party @@ -4,6 +4,7 @@ Class: Pkmn Trainer 1 Pic: Brendan Gender: Male Music: Male +Back Pic: Brendan === PARTNER_STEVEN === Name: STEVEN @@ -11,6 +12,7 @@ Class: Rival Pic: Steven Gender: Male Music: Male +Back Pic: Steven Metang Brave Nature diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h index b3f9282a43..9ce0b629e3 100644 --- a/src/data/pokemon/trainer_class_lookups.h +++ b/src/data/pokemon/trainer_class_lookups.h @@ -84,18 +84,6 @@ const u16 gFacilityClassToPicIndex[] = [FACILITY_CLASS_RS_MAY] = TRAINER_PIC_RS_MAY, }; -const u16 gTrainerPicToTrainerBackPic[] = -{ - [TRAINER_BACK_PIC_BRENDAN] = TRAINER_PIC_BRENDAN, - [TRAINER_BACK_PIC_MAY] = TRAINER_PIC_MAY, - [TRAINER_BACK_PIC_RED] = TRAINER_PIC_RED, - [TRAINER_BACK_PIC_LEAF] = TRAINER_PIC_LEAF, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = TRAINER_PIC_RS_BRENDAN, - [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = TRAINER_PIC_RS_MAY, - [TRAINER_BACK_PIC_WALLY] = TRAINER_PIC_WALLY, - [TRAINER_BACK_PIC_STEVEN] = TRAINER_PIC_STEVEN, -}; - const enum TrainerClassID gFacilityClassToTrainerClass[] = { [FACILITY_CLASS_HIKER] = TRAINER_CLASS_HIKER, diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 5330c9fe3d..8547735789 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -155,6 +155,9 @@ struct Trainer struct String macro; int macro_line; + + struct String back_pic; + int back_pic_line; }; static bool is_empty_string(struct String s) @@ -1300,6 +1303,13 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct trainer->macro_line = value.location.line; trainer->macro = token_string(&value); } + else if (is_literal_token(&key, "Back Pic")) + { + if (trainer->back_pic_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Back Pic'"); + trainer->back_pic_line = value.location.line; + trainer->back_pic = token_string(&value); + } else { any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Battle Type', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); @@ -1776,10 +1786,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par { fprintf(f, "#line %d\n", trainer->pic_line); fprintf(f, " .trainerPic = "); - if (starts_with(trainer->id, "PARTNER_")) - fprint_constant(f, "TRAINER_BACK_PIC", trainer->pic); - else - fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprint_constant(f, "TRAINER_PIC", trainer->pic); fprintf(f, ",\n"); } @@ -1884,6 +1891,21 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprint_string(f, trainer->copy_pool); fprintf(f, ",\n"); } + if (!is_empty_string(trainer->back_pic)) + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_BACK_PIC", trainer->back_pic); + fprintf(f, ",\n"); + } + else // defaults to front pic in absence of defined back pic + { + fprintf(f, "#line %d\n", trainer->back_pic_line); + fprintf(f, " .trainerBackPic = "); + fprint_constant(f, "TRAINER_PIC", trainer->pic); + fprintf(f, ",\n"); + } + if (trainer->macro_line) { fprintf(f, "#line %d\n", trainer->macro_line); From 5794b26a31462225b83141e0b231d80d55f76d17 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 13 Aug 2025 05:41:14 -0400 Subject: [PATCH 210/248] Remove funcResult from AiThinkingStruct (#7545) --- include/battle.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index e1cc318b25..5d37d8f500 100644 --- a/include/battle.h +++ b/include/battle.h @@ -344,7 +344,6 @@ struct AiThinkingStruct u8 movesetIndex; u16 moveConsidered; s32 score[MAX_MON_MOVES]; - u32 funcResult; u64 aiFlags[MAX_BATTLERS_COUNT]; u8 aiAction; u8 aiLogicId; From b4826b446ca2e983eace0fa4251cfd70480f7c7c Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 05:41:26 -0400 Subject: [PATCH 211/248] AI uses Rototiller. (#7542) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_ai_main.c | 26 ++++++++++++++++++++++++++ test/battle/move_effect/rototiller.c | 16 ++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index fe3ff13ee2..9789aa8339 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4134,6 +4134,32 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); break; + case EFFECT_ROTOTILLER: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) && IsBattlerGrounded(battlerAtk)) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); + } + if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(BATTLE_PARTNER(battlerAtk))) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); + } + if (IS_BATTLER_OF_TYPE(FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(FOE(battlerAtk))) + { + if (aiData->abilities[FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + if (IS_BATTLER_OF_TYPE(BATTLE_PARTNER(FOE(battlerAtk)), TYPE_GRASS) && IsBattlerGrounded(BATTLE_PARTNER(FOE(battlerAtk)))) + { + if (aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + break; case EFFECT_HAZE: if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) diff --git a/test/battle/move_effect/rototiller.c b/test/battle/move_effect/rototiller.c index 73ad6c9c85..7214133110 100644 --- a/test/battle/move_effect/rototiller.c +++ b/test/battle/move_effect/rototiller.c @@ -96,3 +96,19 @@ SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerab EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Rototiller") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TANGELA) { Moves(MOVE_ROTOTILLER, MOVE_POUND); } + OPPONENT(SPECIES_TANGELA); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_ROTOTILLER); } + } +} From 260b12337e8ef6c3d380f40ada2e8d3d10791b0d Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 10:21:13 -0400 Subject: [PATCH 212/248] Helping Hand logic (#7504) --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 55 ++++++++++++++++++++++++++++++++++--- src/battle_ai_util.c | 23 ++++++++++++++++ test/battle/ai/ai_doubles.c | 37 +++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 4 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 2e62a1340b..1b23dd7e1a 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -160,6 +160,7 @@ bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext); +u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9789aa8339..1bd9b0fb8d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -211,7 +211,7 @@ static u64 GetAiFlags(u16 trainerId) flags = GetTrainerAIFlagsFromId(trainerId); } - if (IsDoubleBattle()) + if (IsDoubleBattle() && flags != 0) { flags |= AI_FLAG_DOUBLE_BATTLE; } @@ -2042,7 +2042,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. - ADJUST_SCORE(-10); + ADJUST_SCORE(-20); break; case EFFECT_TRICK: case EFFECT_KNOCK_OFF: @@ -3030,6 +3030,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); + bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); bool32 hasPartner = HasPartner(battlerAtk); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); @@ -3088,8 +3089,54 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_HELPING_HAND: - if (!hasPartner || !HasDamagingMove(battlerAtkPartner)) - ADJUST_SCORE(-20); + if (!hasPartner + || !HasDamagingMove(battlerAtkPartner) + || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove))) + { + ADJUST_SCORE(WORST_EFFECT); + } + else + { + u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, FOE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, FOE(battlerAtk), AI_ATTACKING); + u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, FOE(battlerAtkPartner), AI_ATTACKING); + u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, FOE(battlerAtkPartner), AI_ATTACKING); + + if (hasTwoOpponents) + { + // Might be about to die + if (CanTargetFaintAi(FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(FOE(battlerAtkPartner), battlerAtk) + && AI_IsSlower(battlerAtk, FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, FOE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1 + && ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) + ADJUST_SCORE(GOOD_EFFECT); + } + else if (IsBattlerAlive(FOE(battlerAtk))) + { + // Might be about to die + if (CanTargetFaintAi(FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1) + ADJUST_SCORE(GOOD_EFFECT); + } + else if (IsBattlerAlive(FOE(battlerAtkPartner))) + { + // Might be about to die + if (CanTargetFaintAi(FOE(battlerAtkPartner), battlerAtk) + && AI_IsSlower(battlerAtk, FOE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + ADJUST_SCORE(GOOD_EFFECT); + + if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) + ADJUST_SCORE(GOOD_EFFECT); + + } + + } break; case EFFECT_PERISH_SONG: if (aiData->partnerMove != 0 && HasTrappingMoveEffect(battlerAtkPartner)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a0e5e7716b..2b31bdf98d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1252,6 +1252,29 @@ u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum D return GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData), battlerDef); } +u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) +{ + u32 result = 100; + u32 tempResult = 0; + + struct AiLogicData *aiData = gAiLogicData; + s32 moveIndex; + u16 *moves = GetMovesArray(battlerAtk); + u32 moveLimitations = aiData->moveLimitations[battlerAtk]; + + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; + + tempResult = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, calcContext); + if (tempResult != 0 && tempResult < result) + result = tempResult; + } + + return result; +} + u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { int bestDmg = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 9e6edc4c56..ff880fb2e2 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -595,6 +595,43 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") } } +AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") +{ + u32 hp; + + PARAMETRIZE { hp = 1; } + PARAMETRIZE { hp = 500; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { HP(hp); Moves(MOVE_HELPING_HAND, MOVE_MUDDY_WATER); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MUDDY_WATER); } + } WHEN { + if (hp == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if the ally does notably more damage") +{ + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_MUD_SLAP); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MUDDY_WATER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses Tailwind") { u32 speed1, speed2, speed3, speed4; From 296707434200a2e9272a3cd7751f2725c3124bc6 Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 12:06:16 -0400 Subject: [PATCH 213/248] AI handling for Autotomize. (#7550) --- src/battle_ai_main.c | 1 + src/battle_ai_util.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1bd9b0fb8d..34f0cb2d2f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4112,6 +4112,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_SPEED_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); break; + case EFFECT_AUTOTOMIZE: case EFFECT_SPEED_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED_2)); break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 2b31bdf98d..02915816e0 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2641,6 +2641,7 @@ bool32 IsStatRaisingEffect(enum BattleMoveEffects effect) case EFFECT_DEFENSE_UP: case EFFECT_DEFENSE_UP_2: case EFFECT_DEFENSE_UP_3: + case EFFECT_AUTOTOMIZE: case EFFECT_SPEED_UP: case EFFECT_SPEED_UP_2: case EFFECT_SPECIAL_ATTACK_UP: From a5f569d4ee52065e086b5848a763aab315f370a6 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Wed, 13 Aug 2025 21:27:59 +0200 Subject: [PATCH 214/248] Fix Shell Side Arm in battle test WITH_RNG (#7548) --- test/test_runner_battle.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index c009219e26..a116dd0b52 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -444,7 +444,7 @@ u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) if (sum == 0) Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomWeightedArray called with zero sum"); - if (gCurrentTurnActionNumber < gBattlersCount) + if (gCurrentTurnActionNumber < gBattlersCount || tag == RNG_SHELL_SIDE_ARM) { u32 battlerId = gBattlerByTurnOrder[gCurrentTurnActionNumber]; turn = &DATA.battleRecordTurns[gBattleResults.battleTurnCounter][battlerId]; @@ -2216,6 +2216,17 @@ void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) DATA.battleRecordTurns[DATA.turns][battlerId].secondaryEffect = 1 + ctx.secondaryEffect; if (ctx.explicitRNG) DATA.battleRecordTurns[DATA.turns][battlerId].rng = ctx.rng; + + u32 shellSideArmCount = 0; + for (u32 i = 0; i < STATE->battlersCount; i++) + { + if (DATA.battleRecordTurns[DATA.turns][i].rng.tag == RNG_SHELL_SIDE_ARM) + { + shellSideArmCount++; + if (shellSideArmCount > 1) + Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":L Tried to use fixed RNG for multiple Shell Side Arm moves in the same turn"); + } + } if (!(DATA.actionBattlers & (1 << battlerId))) { From 0ab811a239ccf29da3095b7f1499d23c3fa8bda9 Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 15:29:23 -0400 Subject: [PATCH 215/248] AI uses Stuff Cheeks; treating it simply as a def +2 move for now. (#7554) --- src/battle_ai_main.c | 1 + test/battle/move_effect/stuff_cheeks.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 34f0cb2d2f..81fd9716df 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4106,6 +4106,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_DEFENSE_UP_3: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; + case EFFECT_STUFF_CHEEKS: case EFFECT_DEFENSE_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF_2)); break; diff --git a/test/battle/move_effect/stuff_cheeks.c b/test/battle/move_effect/stuff_cheeks.c index 9e6a34c306..b8dda1d8b6 100644 --- a/test/battle/move_effect/stuff_cheeks.c +++ b/test/battle/move_effect/stuff_cheeks.c @@ -103,3 +103,16 @@ SINGLE_BATTLE_TEST("Stuff Cheeks fails if the user's berry is removed before the MESSAGE("But it failed!"); } } + +AI_SINGLE_BATTLE_TEST("AI uses Stuff Cheeks") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_STUFF_CHEEKS) == EFFECT_STUFF_CHEEKS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_HEADBUTT); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_HEADBUTT); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); Moves(MOVE_HEADBUTT, MOVE_STUFF_CHEEKS); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_STUFF_CHEEKS); } + } +} From 45a7c136560cb06fe52c04955974455f22743870 Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 15:30:03 -0400 Subject: [PATCH 216/248] Slight Purify adjustment for targeting ally; test that AI can use Purify. (#7553) --- src/battle_ai_main.c | 4 +++- test/battle/move_effect/purify.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 81fd9716df..2971e68bdb 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3562,7 +3562,9 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_PURIFY: if (gBattleMons[battlerAtkPartner].status1 & STATUS1_ANY) { - RETURN_SCORE_PLUS(WEAK_EFFECT); + if (gBattleMons[battlerAtkPartner].status1 & STATUS1_CAN_MOVE) + RETURN_SCORE_PLUS(WEAK_EFFECT); + RETURN_SCORE_PLUS(GOOD_EFFECT); } break; case EFFECT_SWAGGER: diff --git a/test/battle/move_effect/purify.c b/test/battle/move_effect/purify.c index 134c96119f..26cc661054 100644 --- a/test/battle/move_effect/purify.c +++ b/test/battle/move_effect/purify.c @@ -2,3 +2,25 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Purify (Move Effect) test titles") + +AI_DOUBLE_BATTLE_TEST("AI uses Purify") +{ + u32 status1; + + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_FREEZE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); Moves(MOVE_HEADBUTT); } + } WHEN { + if (status1 == STATUS1_NONE) + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_PURIFY); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_PURIFY, target: opponentRight); } + } +} + From 0a8c8ad338bab93bb2211964a8bb968b18487f2d Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 13 Aug 2025 15:31:05 -0400 Subject: [PATCH 217/248] AI handling for Howl. (#7549) --- src/battle_ai_main.c | 3 ++- src/battle_ai_util.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2971e68bdb..ddd0bf131b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4097,8 +4097,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (predictedMove && GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckViability(battlerAtk, battlerDef, predictedMove, score); break; - case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_USER_ALLY: + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + case EFFECT_ATTACK_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); break; case EFFECT_ATTACK_UP_2: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 02915816e0..2712c4499f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2636,6 +2636,7 @@ bool32 IsStatRaisingEffect(enum BattleMoveEffects effect) { switch (effect) { + case EFFECT_ATTACK_UP_USER_ALLY: case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_2: case EFFECT_DEFENSE_UP: From 905bda386fea36cfe0c612e70f3aac6ead7782ff Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 15 Aug 2025 03:03:33 -0400 Subject: [PATCH 218/248] Test that AI uses Dragon Cheer. (#7552) --- test/battle/move_effect/dragon_cheer.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index c6dfa3c4dd..a7fff9e7d5 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -103,3 +103,29 @@ DOUBLE_BATTLE_TEST("Dragon Cheer fails if critical hit stage was already increas } TO_DO_BATTLE_TEST("Baton Pass passes Dragon Cheer's effect"); + +AI_DOUBLE_BATTLE_TEST("AI uses Dragon Cheer") +{ + u32 species; + PARAMETRIZE { species = SPECIES_DRATINI; } + PARAMETRIZE { species = SPECIES_WOBBUFFET; } + + GIVEN { + ASSUME(GetSpeciesType(SPECIES_DRATINI, 0) == TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_DRAGON); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_DRAGON); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(species) { Moves(MOVE_DRAGON_CHEER, MOVE_POUND); } + OPPONENT(species) { Moves(MOVE_DRAGON_CHEER, MOVE_POUND); } + } WHEN { + if (species == SPECIES_DRATINI) + TURN { EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } + } +} + + + From 60f5f3302d591971245b0e6e5025b8e124f2307c Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 17 Aug 2025 21:49:53 +0200 Subject: [PATCH 219/248] Fix tossing a stack of berries hiding following berries (#7571) Co-authored-by: Hedara --- src/item.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/item.c b/src/item.c index 6802b2272c..162798acde 100644 --- a/src/item.c +++ b/src/item.c @@ -32,6 +32,7 @@ static bool32 CheckPyramidBagHasItem(u16 itemId, u16 count); static bool32 CheckPyramidBagHasSpace(u16 itemId, u16 count); static const u8 *GetItemPluralName(u16); static bool32 DoesItemHavePluralName(u16); +static void NONNULL BagPocket_CompactItems(struct BagPocket *pocket); EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; @@ -391,6 +392,9 @@ static bool32 NONNULL BagPocket_RemoveItem(struct BagPocket *pocket, u16 itemId, } } + if (totalQuantity == count) + BagPocket_CompactItems(pocket); + Free(tempPocketSlotQuantities); return totalQuantity >= count; } From 7d459fd6dccd76d11d47e9f3150e5e7fc0fd6492 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 18 Aug 2025 13:44:43 -0400 Subject: [PATCH 220/248] Fixed Transistor damage calculation test failing when `GEN_LATEST` is less than `GEN_9` (#7577) --- include/constants/generational_changes.h | 1 + include/generational_changes.h | 1 + src/battle_util.c | 2 +- test/battle/ai/check_bad_move.c | 1 + test/battle/damage_formula.c | 29 +++++++++++++++++------- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index e51d57915c..83c9caa203 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -29,6 +29,7 @@ enum GenConfigTag GEN_SNOW_WARNING, GEN_ALLY_SWITCH_FAIL_CHANCE, GEN_DREAM_EATER_LIQUID_OOZE, + GEN_CONFIG_TRANSISTOR_BOOST, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index 53991bab1f..a6f3a56ef7 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -32,6 +32,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_SNOW_WARNING] = B_SNOW_WARNING, [GEN_ALLY_SWITCH_FAIL_CHANCE] = B_ALLY_SWITCH_FAIL_CHANCE, [GEN_DREAM_EATER_LIQUID_OOZE] = B_DREAM_EATER_LIQUID_OOZE, + [GEN_CONFIG_TRANSISTOR_BOOST] = B_TRANSISTOR_BOOST, }; #if TESTING diff --git a/src/battle_util.c b/src/battle_util.c index ed00fb4d45..7729b0f67a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8706,7 +8706,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_TRANSISTOR: if (moveType == TYPE_ELECTRIC) { - if (B_TRANSISTOR_BOOST >= GEN_9) + if (GetGenConfig(GEN_CONFIG_TRANSISTOR_BOOST) >= GEN_9) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); else modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); diff --git a/test/battle/ai/check_bad_move.c b/test/battle/ai/check_bad_move.c index 79b960ec60..776dcd7de2 100644 --- a/test/battle/ai/check_bad_move.c +++ b/test/battle/ai/check_bad_move.c @@ -15,6 +15,7 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot PARAMETRIZE { ability = ABILITY_CLEAR_BODY; species = SPECIES_BELDUM; move = MOVE_NOBLE_ROAR; } GIVEN { + WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, move); } diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index 0679725510..f41f6a2145 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -231,23 +231,36 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation") #define NUM_DAMAGE_SPREADS (DMG_ROLL_PERCENT_HI - DMG_ROLL_PERCENT_LO) + 1 -static const s16 sThunderShockTransistorSpread[] = { 54, 55, 56, 57, 57, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 65 }; +static const s16 sThunderShockTransistorSpreadGen9[] = { 54, 55, 56, 57, 57, 58, 59, 60, 60, 60, 61, 62, 63, 63, 64, 65 }; +static const s16 sThunderShockTransistorSpreadGen8[] = { 63, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 75 }; static const s16 sThunderShockRegularSpread[] = { 42, 42, 43, 43, 44, 45, 45, 45, 46, 46, 47, 48, 48, 48, 49, 50 }; -static const s16 sWildChargeTransistorSpread[] = { 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145 }; +static const s16 sWildChargeTransistorSpreadGen9[] = { 123, 124, 126, 127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145 }; +static const s16 sWildChargeTransistorSpreadGen8[] = { 141, 143, 145, 147, 148, 150, 151, 153, 155, 156, 158, 160, 162, 163, 165, 167 }; static const s16 sWildChargeRegularSpread[] = { 94, 96, 96, 98, 99, 100, 101, 102, 103, 105, 105, 107, 108, 109, 110, 111 }; DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) { s16 expectedDamageTransistorSpec = 0, expectedDamageRegularPhys = 0, expectedDamageRegularSpec = 0, expectedDamageTransistorPhys = 0; s16 damagePlayerLeft, damagePlayerRight, damageOpponentLeft, damageOpponentRight; + u32 gen = 0; for (u32 spread = 0; spread < 16; ++spread) { - PARAMETRIZE { expectedDamageTransistorSpec = sThunderShockTransistorSpread[spread], + PARAMETRIZE { gen = GEN_9, + expectedDamageTransistorSpec = sThunderShockTransistorSpreadGen9[spread], + expectedDamageRegularSpec = sThunderShockRegularSpread[spread]; + expectedDamageTransistorPhys = sWildChargeTransistorSpreadGen9[spread], + expectedDamageRegularPhys = sWildChargeRegularSpread[spread]; + } + } + for (u32 spread = 0; spread < 16; ++spread) { + PARAMETRIZE { gen = GEN_8, + expectedDamageTransistorSpec = sThunderShockTransistorSpreadGen8[spread], expectedDamageRegularSpec = sThunderShockRegularSpread[spread], - expectedDamageTransistorPhys = sWildChargeTransistorSpread[spread], + expectedDamageTransistorPhys = sWildChargeTransistorSpreadGen8[spread], expectedDamageRegularPhys = sWildChargeRegularSpread[spread]; } } GIVEN { + WITH_CONFIG(GEN_CONFIG_TRANSISTOR_BOOST, gen); ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); @@ -260,10 +273,10 @@ DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) OPPONENT(SPECIES_REGIELEKI) { Ability(ABILITY_TRANSISTOR); } } WHEN { TURN { - MOVE(playerLeft, MOVE_THUNDER_SHOCK, target: opponentLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(playerRight, MOVE_THUNDER_SHOCK, target: opponentRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(opponentLeft, MOVE_WILD_CHARGE, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); - MOVE(opponentRight, MOVE_WILD_CHARGE, target: playerRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - i)); + MOVE(playerLeft, MOVE_THUNDER_SHOCK, target: opponentLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(playerRight, MOVE_THUNDER_SHOCK, target: opponentRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(opponentLeft, MOVE_WILD_CHARGE, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); + MOVE(opponentRight, MOVE_WILD_CHARGE, target: playerRight, WITH_RNG(RNG_DAMAGE_MODIFIER, 15 - (i % 16))); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, playerLeft); From 5c70eeb7ed57816cbc0acb09da3a77126ffe316a Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:45:18 -0400 Subject: [PATCH 221/248] Fix switch AI not seeing its own move PP (#7578) --- src/battle_ai_switch_items.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c11f448645..a52541c8c8 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -230,7 +230,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) @@ -254,7 +254,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { aiMove = gBattleMons[battler].moves[i]; aiMoveEffect = GetMoveEffect(aiMove); - if (aiMove != MOVE_NONE) + if (aiMove != MOVE_NONE && gBattleMons[battler].pp[i] > 0) { u32 nonVolatileStatus = GetMoveNonVolatileStatus(aiMove); // Check if mon has an "important" status move @@ -1972,7 +1972,7 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move @@ -1997,7 +1997,8 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 + && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move @@ -2135,6 +2136,10 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { + // Check that move has PP remaining before running calcs + if (gAiLogicData->switchinCandidate.battleMon.pp[j] < 1) + continue; + aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); From e60b9e979f78b846da9603034345ddeac64ccce1 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:45:41 -0400 Subject: [PATCH 222/248] Fix wrong battler argument in `GetBattleMovePriority` call (#7576) --- src/battle_ai_switch_items.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a52541c8c8..1bc3ae31f0 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -238,7 +238,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) maxDamageTaken = damageTaken; bestPlayerMove = playerMove; } - if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[battler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) { maxDamageTakenPriority = damageTaken; bestPlayerPriorityMove = playerMove; From 6c261fe41667363ad477ad7b09419906c18a143d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 18 Aug 2025 15:09:09 -0400 Subject: [PATCH 223/248] Fixed compile issue in gcc 11 (#7579) --- src/battle_ai_util.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 2712c4499f..84d247a617 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2107,10 +2107,12 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += DECENT_EFFECT; break; case STAT_SPEED: + { u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; break; + } case STAT_SPATK: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) tempScore += DECENT_EFFECT; @@ -3632,7 +3634,7 @@ bool32 HasChoiceEffect(u32 battler) if (ability == ABILITY_KLUTZ) return FALSE; - + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; switch (holdEffect) { @@ -3881,7 +3883,7 @@ bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 p return FALSE; u32 battlerDef = gBattleStruct->moveTarget[battlerAtk]; - + // We don't care the effect is basically the same; we would use this move anyway. if (GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) return FALSE; From 888783aaa5d90135da38f10beac6a001d879e8a6 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:22:19 +0100 Subject: [PATCH 224/248] Restore AI: Basic Trainer to PARTNER_STEVEN (#7586) --- src/battle_tower.c | 1 + src/data/battle_partners.party | 1 + 2 files changed, 2 insertions(+) diff --git a/src/battle_tower.c b/src/battle_tower.c index 6eeac96d4a..2d0cbbe11e 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -25,6 +25,7 @@ #include "battle_factory.h" #include "constants/abilities.h" #include "constants/apprentice.h" +#include "constants/battle_ai.h" #include "constants/battle_dome.h" #include "constants/battle_frontier.h" #include "constants/battle_frontier_mons.h" diff --git a/src/data/battle_partners.party b/src/data/battle_partners.party index 4b93292c6a..8de1dc0f2b 100644 --- a/src/data/battle_partners.party +++ b/src/data/battle_partners.party @@ -13,6 +13,7 @@ Pic: Steven Gender: Male Music: Male Back Pic: Steven +AI: Basic Trainer Metang Brave Nature From 553e5bd09c88f780d6fb93d1271f045b85d6ca6b Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 20 Aug 2025 17:26:48 +0100 Subject: [PATCH 225/248] Fixes refusing to replace a move on evolution causing a softlock (#7585) --- src/evolution_scene.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 1f9d2af8fa..fb3e79a655 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -986,7 +986,7 @@ static void Task_EvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; + gTasks[taskId].tLearnMoveState = (P_ASK_MOVE_CONFIRMATION) ? MVSTATE_ASK_CANCEL : MVSTATE_CANCEL; } else { @@ -1370,7 +1370,7 @@ static void Task_TradeEvolutionScene(u8 taskId) if (var == MAX_MON_MOVES) { // Didn't select move slot - gTasks[taskId].tLearnMoveNoState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; + gTasks[taskId].tLearnMoveState = (P_ASK_MOVE_CONFIRMATION) ? T_MVSTATE_ASK_CANCEL : T_MVSTATE_CANCEL; } else { From 8e5855108882d861deb638619fc2bb0f80b104f7 Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 21 Aug 2025 08:41:43 -0400 Subject: [PATCH 226/248] Tests to see that the AI uses moves. (#7555) --- test/battle/ai/can_use_all_moves.c | 702 +++++++++++++++++++++++++++++ 1 file changed, 702 insertions(+) create mode 100644 test/battle/ai/can_use_all_moves.c diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c new file mode 100644 index 0000000000..3bf33a98c1 --- /dev/null +++ b/test/battle/ai/can_use_all_moves.c @@ -0,0 +1,702 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +// All tests here compare the move to Splash, a move that does nothing and scores 90: the same as Thundershock on a ground type. +// The switch case for effects skips moves that have been human reviewed in three categories: something is wrong in some way; the move is equivalent to Splash for a good reason but a test is not known to exist; a test is known to exist. +// Jump to "TODO: AI HANDLING" and "TODO: AI TESTS" +// In many cases, AI handling exists but is likely insufficient in some way. + +AI_DOUBLE_BATTLE_TEST("AI uses Final Gambit") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_FINAL_GAMBIT); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FINAL_GAMBIT); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Guillotine") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_GUILLOTINE); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUILLOTINE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Sheer Cold") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_SHEER_COLD); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SHEER_COLD); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") +{ + u32 moveStart = 0; + u32 moveCap = 100; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_OHKO: // Guillotine is crashing the test entirely. + case EFFECT_MIST: + case EFFECT_TELEPORT: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_MIMIC: + case EFFECT_DISABLE: + + // tests exist elsewhere + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200") +{ + u32 moveStart = 100; + u32 moveCap = 200; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_LIGHT_SCREEN: + case EFFECT_REFLECT: + case EFFECT_BIDE: + case EFFECT_NIGHTMARE: + case EFFECT_SNORE: + case EFFECT_SKETCH: + case EFFECT_BELLY_DRUM: + case EFFECT_DESTINY_BOND: + case EFFECT_MIRROR_MOVE: + case EFFECT_REST: + case EFFECT_SUBSTITUTE: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_MIMIC: + case EFFECT_SOFTBOILED: + case EFFECT_DREAM_EATER: + case EFFECT_CONVERSION: + case EFFECT_PERISH_SONG: + case EFFECT_FOCUS_ENERGY: + case EFFECT_SPITE: + + // tests exist elsewhere + case EFFECT_HAZE: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") +{ + u32 moveStart = 200; + u32 moveCap = 300; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SLEEP_TALK: // logic exists but does not account for Rest correctly + case EFFECT_SAFEGUARD: // logic exists but does not account for Rest correctly + case EFFECT_FOLLOW_ME: + case EFFECT_SNATCH: + case EFFECT_GRUDGE: + case EFFECT_CAMOUFLAGE: + case EFFECT_IMPRISON: + case EFFECT_INGRAIN: + case EFFECT_MAGIC_COAT: + case EFFECT_MUD_SPORT: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_SOFTBOILED: + case EFFECT_ENDURE: + case EFFECT_BATON_PASS: + case EFFECT_ENCORE: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + case EFFECT_SYNTHESIS: + case EFFECT_SPIT_UP: + case EFFECT_SWALLOW: + case EFFECT_WISH: + case EFFECT_RECYCLE: + + // tests exist elsewhere + case EFFECT_HEAL_BELL: + case EFFECT_SUNNY_DAY: + case EFFECT_RAIN_DANCE: + case EFFECT_HAIL: + case EFFECT_ROLE_PLAY: + case EFFECT_REFRESH: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_SANDSTORM: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") +{ + u32 moveStart = 300; + u32 moveCap = 400; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SHEER_COLD: // Guillotine is crashing the test entirely. + case EFFECT_WATER_SPORT: + case EFFECT_LUCKY_CHANT: + case EFFECT_ME_FIRST: + case EFFECT_PSYCHO_SHIFT: + case EFFECT_COPYCAT: + case EFFECT_LAST_RESORT: + case EFFECT_AQUA_RING: + case EFFECT_GRAVITY: + case EFFECT_HEALING_WISH: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_ROOST: + case EFFECT_GUARD_SWAP: + case EFFECT_POWER_SWAP: + case EFFECT_HEART_SWAP: + case EFFECT_TAILWIND: + case EFFECT_POWER_TRICK: + case EFFECT_MAGNET_RISE: + + // tests exist elsewhere + case EFFECT_HEAL_BELL: + case EFFECT_ATTACK_UP_USER_ALLY: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") +{ + u32 moveStart = 400; + u32 moveCap = 500; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_HEALING_WISH: + case EFFECT_WONDER_ROOM: + case EFFECT_FOLLOW_ME: + case EFFECT_MAGIC_ROOM: + case EFFECT_AFTER_YOU: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_CAPTIVATE: + + // tests exist elsewhere + case EFFECT_TRICK_ROOM: + case EFFECT_GUARD_SPLIT: + case EFFECT_POWER_SPLIT: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") +{ + u32 moveStart = 515; + u32 moveCap = 600; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + case EFFECT_FINAL_GAMBIT: + //TODO: AI HANDLING + case EFFECT_ALLY_SWITCH: + case EFFECT_QUASH: + case EFFECT_REFLECT_TYPE: + case EFFECT_SKY_DROP: + case EFFECT_MAT_BLOCK: + case EFFECT_ION_DELUGE: + case EFFECT_AROMATIC_MIST: + case EFFECT_POWDER: + case EFFECT_FLOWER_SHIELD: + case EFFECT_ELECTRIFY: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_HEAL_PULSE: + case EFFECT_BELCH: + case EFFECT_TOPSY_TURVY: + case EFFECT_FAIRY_LOCK: + + // tests exist elsewhere + case EFFECT_ROTOTILLER: + case EFFECT_GRASSY_TERRAIN: + case EFFECT_MISTY_TERRAIN: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") +{ + u32 moveStart = 600; + u32 moveCap = 700; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_MAGNETIC_FLUX: + case EFFECT_GEAR_UP: + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + case EFFECT_STUFF_CHEEKS: + case EFFECT_NO_RETREAT: + case EFFECT_TEATIME: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_SHORE_UP: + case EFFECT_HEAL_PULSE: + case EFFECT_LASER_FOCUS: + case EFFECT_PURIFY: + case EFFECT_INSTRUCT: + case EFFECT_SOAK: + + // tests exist elsewhere + case EFFECT_ELECTRIC_TERRAIN: + case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_AURORA_VEIL: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") +{ + u32 moveStart = 700; + u32 moveCap = 800; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_CLANGOROUS_SOUL: + case EFFECT_LIFE_DEW: + case EFFECT_POLTERGEIST: + case EFFECT_COACHING: + case EFFECT_REVIVAL_BLESSING: + case EFFECT_FILLET_AWAY: + + //TODO: AI TESTS + case EFFECT_RESTORE_HP: + case EFFECT_STEEL_ROLLER: + case EFFECT_JUNGLE_HEALING: + case EFFECT_POWER_TRICK: + case EFFECT_TAKE_HEART: + + // tests exist elsewhere + case EFFECT_COURT_CHANGE: + case EFFECT_DOODLE: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") +{ + u32 moveStart = 800; + u32 moveCap = 900; + + if (moveCap > MOVES_COUNT) + moveCap = MOVES_COUNT - 1; + + s32 j; + u32 move = MOVE_NONE; + + enum BattleMoveEffects effect; + + for (j = moveStart + 1; j <= moveCap; j++) + { + effect = GetMoveEffect(j); + + // Stat raising effects are not meant to be used when you have only Splash. + if (IsStatRaisingEffect(effect)) + continue; + + switch (effect) + { + //TODO: AI HANDLING + case EFFECT_SHED_TAIL: + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + + //TODO: AI TESTS + case EFFECT_CHILLY_RECEPTION: + case EFFECT_TIDY_UP: + + // tests exist elsewhere + case EFFECT_SNOWSCAPE: + case EFFECT_DRAGON_CHEER: + + // Skipped on purpose. + case EFFECT_PROTECT: + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_DO_NOTHING: + case EFFECT_HOLD_HANDS: + case EFFECT_CELEBRATE: + case EFFECT_HAPPY_HOUR: + break; + default: + PARAMETRIZE { move = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, move); } + } +} From c80a41b730bf98f9c59d291f90189d601742ce79 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 21 Aug 2025 17:31:59 +0200 Subject: [PATCH 227/248] Suppress trainerproc compile warning for unused func (#7592) --- tools/trainerproc/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 8547735789..c3a39dc5a1 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -178,7 +178,7 @@ static bool is_literal_string(struct String s1, const char *s2) } } -static bool starts_with(struct String s, const char *prefix) +static bool __attribute__((unused)) starts_with(struct String s, const char *prefix) { int n = strlen(prefix); return strncmp((const char *)s.string, prefix, n) == 0; From 1e6bb4f47cdf5ae978e17d1297f889d44f1d5502 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Fri, 22 Aug 2025 20:23:18 +0200 Subject: [PATCH 228/248] Fix overlap between spin evolution and script evolution (#7593) --- asm/macros/event.inc | 2 +- include/constants/pokemon.h | 1 + src/pokemon.c | 49 ++++++++++++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 3bc6516097..da6d64edd4 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2175,7 +2175,7 @@ setvar VAR_0x8000, \evoMethod setvar VAR_0x8001, \canStopEvo setvar VAR_0x8002, \tryMultiple - special TrySpecialOverworldEvo + special TrySpecialScriptEvolution .endm .macro ai_vs_ai_battle trainer1:req, trainer2:req diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index af01007cd2..20cff8a30f 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -322,6 +322,7 @@ enum EvolutionMode { EVO_MODE_ITEM_CHECK, // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve EVO_MODE_BATTLE_SPECIAL, EVO_MODE_OVERWORLD_SPECIAL, + EVO_MODE_SCRIPT_TRIGGER, EVO_MODE_BATTLE_ONLY, // This mode is only used in battles to support Tandemaus' unique requirement }; diff --git a/src/pokemon.c b/src/pokemon.c index 62abadca7c..b76683254e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4896,7 +4896,6 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 switch (evolutions[i].method) { - case EVO_SCRIPT_TRIGGER: case EVO_SPIN: if (gSpecialVar_0x8000 == evolutions[i].param) conditionsMet = TRUE; @@ -4914,6 +4913,23 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } break; + case EVO_MODE_SCRIPT_TRIGGER: + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) + continue; + if (evolutions[i].method != EVO_SCRIPT_TRIGGER) + continue; + if (DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo, evoState)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; + break; + } + } + break; } // Pikachu, Meowth, Eevee and Duraludon cannot evolve if they have the @@ -6760,6 +6776,37 @@ void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) } // Attempts to perform non-level/item related overworld evolutions; called by tryspecialevo command. +void TryScriptEvolution(void) +{ + u8 i; + bool32 canStopEvo = gSpecialVar_0x8001; + u16 tryMultiple = gSpecialVar_0x8002; + + for (i = 0; i < PARTY_SIZE; i++) + { + u32 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_SCRIPT_TRIGGER, 0, NULL, &canStopEvo, CHECK_EVO); + + if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & (1u << i))) + { + GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_SCRIPT_TRIGGER, 0, NULL, &canStopEvo, DO_EVO); + sTriedEvolving |= 1u << i; + if(gMain.callback2 == TryScriptEvolution) // This fixes small graphics glitches. + EvolutionScene(&gPlayerParty[i], targetSpecies, canStopEvo, i); + else + BeginEvolutionScene(&gPlayerParty[i], targetSpecies, canStopEvo, i); + + if (tryMultiple) + gCB2_AfterEvolution = TryScriptEvolution; + else + gCB2_AfterEvolution = CB2_ReturnToField; + return; + } + } + + sTriedEvolving = 0; + SetMainCallback2(CB2_ReturnToField); +} + void TrySpecialOverworldEvo(void) { u8 i; From 9b5b69ae496f6005b194c3e15c43f76c97814e31 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 25 Aug 2025 05:40:52 -0400 Subject: [PATCH 229/248] switchinabilities also runs ON_WEATHER and ON_TERRAIN (#7612) Co-authored-by: ghoulslash --- src/battle_script_commands.c | 7 +++++++ test/battle/ability/mimicry.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bc97a288d8..0d90a3290d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10639,6 +10639,13 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->nextInstr; AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); + + if (gBattleWeather & B_WEATHER_ANY && HasWeatherEffect()) + AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); + + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); return; } diff --git a/test/battle/ability/mimicry.c b/test/battle/ability/mimicry.c index b9c3bb5fc3..df69e89b71 100644 --- a/test/battle/ability/mimicry.c +++ b/test/battle/ability/mimicry.c @@ -95,3 +95,32 @@ DOUBLE_BATTLE_TEST("Mimicry can trigger multiple times in a turn") } } +DOUBLE_BATTLE_TEST("Mimicry triggers after Skill Swap") +{ + GIVEN { + PLAYER(SPECIES_STUNFISK_GALAR) { Speed(40); Ability(ABILITY_MIMICRY); } + PLAYER(SPECIES_SHIFTRY) { Speed(50); Ability(ABILITY_CHLOROPHYLL); } + OPPONENT(SPECIES_SHUCKLE) { Speed(30); } + OPPONENT(SPECIES_CHANSEY) { Speed(20); } + } WHEN { + TURN { MOVE(playerRight, MOVE_GRASSY_TERRAIN); } + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); + MOVE(playerLeft, MOVE_SPLASH); + } + } SCENE { + // turn 1 + MESSAGE("Shiftry used Grassy Terrain!"); + ABILITY_POPUP(playerLeft, ABILITY_MIMICRY); + MESSAGE("Stunfisk's type changed to Grass!"); + // turn 2 + MESSAGE("Shiftry used Skill Swap!"); + ABILITY_POPUP(playerRight, ABILITY_MIMICRY); + MESSAGE("Shiftry's type changed to Grass!"); + MESSAGE("Stunfisk used Splash!"); // make sure popup occurs before the subsequent move + } THEN { + EXPECT_EQ(playerLeft->types[0], TYPE_GRASS); + EXPECT_EQ(playerLeft->types[1], TYPE_GRASS); + EXPECT_EQ(playerRight->types[0], TYPE_GRASS); + EXPECT_EQ(playerRight->types[1], TYPE_GRASS); + } +} From 53e7699649f1352613f2566841a05a5b965e8449 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:41:36 +0200 Subject: [PATCH 230/248] Fixes Explosion behavior when 3 mons can endure hit (#7594) --- src/battle_script_commands.c | 20 +++++++++----------- test/battle/spread_moves.c | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0d90a3290d..70540ef275 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2181,7 +2181,7 @@ static void Cmd_adjustdamage(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - bool32 enduredHit = FALSE; + u32 enduredHit = 0; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { @@ -2227,30 +2227,30 @@ static void Cmd_adjustdamage(void) if (moveEffect == EFFECT_FALSE_SWIPE) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; } else if (gProtectStructs[battlerDef].endured) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED; } else if (holdEffect == HOLD_EFFECT_FOCUS_BAND && rand < param) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordItemEffectBattle(battlerDef, holdEffect); gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; } else if (B_STURDY >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordAbilityBattle(battlerDef, ABILITY_STURDY); gLastUsedAbility = ABILITY_STURDY; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_STURDIED; } else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && IsBattlerAtMaxHp(battlerDef)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; RecordItemEffectBattle(battlerDef, holdEffect); gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; @@ -2261,20 +2261,18 @@ static void Cmd_adjustdamage(void) || (affectionScore == AFFECTION_FOUR_HEARTS && rand < 15) || (affectionScore == AFFECTION_THREE_HEARTS && rand < 10)) { - enduredHit = TRUE; + enduredHit |= 1u << battlerDef; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED_AFFECTION; } } // Handle reducing the dmg to 1 hp. - if (enduredHit) + if (enduredHit & 1u << battlerDef) { gBattleStruct->moveDamage[battlerDef] = gBattleMons[battlerDef].hp - 1; gSpecialStatuses[battlerDef].enduredDamage = TRUE; - } - - if (gSpecialStatuses[battlerDef].enduredDamage) gProtectStructs[battlerDef].assuranceDoubled = TRUE; + } } if (calcSpreadMoveDamage) diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c index 9ea104597a..d5e6b5c26d 100644 --- a/test/battle/spread_moves.c +++ b/test/battle/spread_moves.c @@ -433,3 +433,23 @@ DOUBLE_BATTLE_TEST("Spread Moves: Unless move hits every target user will not in MESSAGE("It's super effective on the opposing Torkoal and Torkoal!"); } } + +DOUBLE_BATTLE_TEST("Spread Moves: Focus Sash activates correctly") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WOBBUFFET) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WYNAUT) { HP(2); MaxHP(2); Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(playerRight, MOVE_HYPER_VOICE); MOVE(playerLeft, MOVE_EXPLOSION); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerRight); + MESSAGE("The opposing Wynaut hung on using its Focus Sash!"); + MESSAGE("The opposing Wobbuffet hung on using its Focus Sash!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, playerLeft); + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Wynaut hung on using its Focus Sash!"); + MESSAGE("The opposing Wynaut fainted!"); + } +} From ff3e8da00712fead2d13d7dfa54b1d2eda29aa7c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:46:23 +0200 Subject: [PATCH 231/248] Minor Clean up in battle_ai_main.c (#7551) --- src/battle_ai_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 95ac1e43b3..b287c53189 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1120,9 +1120,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case MOVE_EFFECT_BURN: ADJUST_SCORE(-5); break; + default: + break; } break; - break; case ABILITY_WONDER_GUARD: if (effectiveness < UQ_4_12(2.0)) RETURN_SCORE_MINUS(20); From 0a3c281cdd97ac5eb20371d6b175b100e14ac91b Mon Sep 17 00:00:00 2001 From: RavePossum <145081120+ravepossum@users.noreply.github.com> Date: Mon, 25 Aug 2025 05:48:52 -0400 Subject: [PATCH 232/248] Fix terastallization anims flickering (#7613) --- data/battle_anim_scripts.s | 3 ++- src/battle_anim_effects_3.c | 26 ++++++++++++++++++++++++++ src/battle_gfx_sfx_util.c | 7 ------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 50a9b51dc7..19109e190e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -28732,6 +28732,7 @@ MegaEvolutionSpinEffect: return gBattleAnimGeneral_TeraCharge:: + createvisualtask AnimTask_HideOpponentShadows, 2 @ Hide opponent shadows so they don't flicker between battle anims loadspritegfx ANIM_TAG_TERA_CRYSTAL loadspritegfx ANIM_TAG_TERA_SHATTER loadspritegfx ANIM_TAG_FOCUS_ENERGY @@ -28753,7 +28754,6 @@ gBattleAnimGeneral_TeraCharge:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish - createvisualtask AnimTask_TransformMon, 2, 1, 0 call TeraChargeParticles playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER clearmonbg ANIM_ATK_PARTNER @@ -28770,6 +28770,7 @@ TeraChargeParticles: return gBattleAnimGeneral_TeraActivate:: + createvisualtask AnimTask_SetOpponentShadowCallbacks, 2 @ Restore shadows hidden in the charge script createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 waitforvisualfinish diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 409244ccac..04be1553bc 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -2515,6 +2515,32 @@ void AnimTask_HideSwapSprite(u8 taskId) } } +void AnimTask_HideOpponentShadows(u8 taskId) +{ + u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible; + if (IsDoubleBattle()) + { + u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible; + } + DestroyAnimVisualTask(taskId); +} + +void AnimTask_SetOpponentShadowCallbacks(u8 taskId) +{ + u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + SetBattlerShadowSpriteCallback(battlerLeft, gBattleMons[battlerLeft].species); + if (IsDoubleBattle()) + { + u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + SetBattlerShadowSpriteCallback(battlerRight, gBattleMons[battlerRight].species); + } + DestroyAnimVisualTask(taskId); +} + void AnimTask_TransformMon(u8 taskId) { int i, j; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 6ca847a272..5b88ec642d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -1003,13 +1003,6 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); } - // Terastallization's tint - if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) - { - BlendPalette(paletteOffset, 16, 8, GetTeraTypeRGB(GetBattlerTeraType(battlerAtk))); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); - } - gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], 0); } From 6df3a48ca232068be1e9237f77d77f2275fbbf64 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:46:36 +0200 Subject: [PATCH 233/248] Fixes octolock not ending after user switched out (#7556) Co-authored-by: Bassoonian --- asm/macros/battle_script.inc | 5 ++- data/battle_scripts_1.s | 2 +- .../how_to_battle_script_command_macro.md | 33 +++++++++---------- include/battle.h | 2 +- src/battle_main.c | 4 +++ src/battle_script_commands.c | 12 +++---- test/battle/move_effect/octolock.c | 25 ++++++++++++++ test/battle/move_effect/sky_drop.c | 13 ++++++++ 8 files changed, 67 insertions(+), 29 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 721c844554..46581dfab2 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1440,9 +1440,8 @@ callnative BS_TryRevertWeatherForm .endm - .macro trysetoctolock battler:req, failInstr:req + .macro trysetoctolock failInstr:req callnative BS_TrySetOctolock - .byte \battler .4byte \failInstr .endm @@ -1737,7 +1736,7 @@ callnative BS_ActivateTerrainChangeAbilities .byte \battler .endm - + .macro resetterrainabilityflags callnative BS_ResetTerrainAbilityFlags .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bebce183e9..45f5a5babf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -868,7 +868,7 @@ BattleScript_EffectOctolock:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - trysetoctolock BS_TARGET, BattleScript_ButItFailed + trysetoctolock BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE diff --git a/docs/tutorials/how_to_battle_script_command_macro.md b/docs/tutorials/how_to_battle_script_command_macro.md index 2bbf503fbe..911da7d09c 100644 --- a/docs/tutorials/how_to_battle_script_command_macro.md +++ b/docs/tutorials/how_to_battle_script_command_macro.md @@ -12,36 +12,33 @@ In general, `gBattlescriptCurrInstr` tracks the current battle script position a ``` `callnative` uses the last battle script command ID in order to pass a native function as an argument. Additional optional arguments are added recursively via a macro, so no need to worry about how they need to align to the amount of instructions to skip. -Now, how might we add a custom `callnative` command? Here are the steps. We will use `BS_TrySetOctolock` as an example. +Now, how might we add a custom `callnative` command? Here are the steps. We will use `BS_JumpIfTerrainAffected` as an example. ### 1. Create a macro in `asm/macros/battle_script.inc`. For example: ```c - .macro trysetoctolock battler:req, failInstr:req - callnative BS_TrySetOctolock + .macro jumpifterrainaffected battler:req, terrainFlags:req, jumpInstr:req + callnative BS_JumpIfTerrainAffected .byte \battler - .4byte \failInstr + .4byte \terrainFlags + .4byte \jumpInstr .endm ``` ### 2. Add your new callnative command ID to `src/battle_script_commands.c`. For example: ```c -void BS_TrySetOctolock(void) +void BS_JumpIfTerrainAffected(void) { - NATIVE_ARGS(u8 battler, const u8 *failInstr); + NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gDisableStructs[battler].octolock) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + if (IsBattlerTerrainAffected(battler, cmd->flags)) + gBattlescriptCurrInstr = cmd->jumpInstr; else - { - gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; - } } ``` -Each of the arguments defined in the macro (`battler`, `failInstr`) need to be called at the start of the command using `NATIVE_ARGS`. +Each of the arguments defined in the macro (`battler`, `flags`, `failInstr`) need to be called at the start of the command using `NATIVE_ARGS`. The byte count in the macro should correspond to the type that will be used for the command (eg, `u8` is `byte`, while the pointer are `4byte`). -These arguments can then be accessed as `cmd->battler` and `cmd->battler`. -`gBattlescriptCurrInstr = cmd->nextInstr;` advances to the next instruction. +These arguments can then be accessed as `cmd->battler`, `cmd->flags` and `cmd->failInstr`. +Note that for `cmd->battler` we need to use `GetBattlerForBattleScript` to fetch the correct battler because with the macro we are accessing a scripting command that doesn't corresponds to `gBattlerTarget`, `gBattlerAttacker`, etc. +For the battler argument specifically, most of the time the battler is accessed through `gBattlerAttacker`, `gBattlerTarget` and the battler argument left out. +In the majority of cases, this is fine since the script commands are mostly used for moves and the interaction is usually between an attacker and target. +A script command usually ends with either a jump or next instruction `gBattlescriptCurrInstr = cmd->nextInstr / cmd->nextInstr;` advancing to the next instruction. diff --git a/include/battle.h b/include/battle.h index 179ea47769..d8b9c70102 100644 --- a/include/battle.h +++ b/include/battle.h @@ -133,7 +133,7 @@ struct DisableStruct u8 neutralizingGas:1; u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in - u8 padding:3; + u8 octolockedBy:3; }; // Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects diff --git a/src/battle_main.c b/src/battle_main.c index 50e4df8a50..efbe2dd0ff 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3173,6 +3173,8 @@ void SwitchInClearSetData(u32 battler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) + gDisableStructs[i].octolock = FALSE; } gActionSelectionCursor[battler] = 0; @@ -3291,6 +3293,8 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[i].status2 &= ~STATUS2_WRAPPED; if ((gStatuses4[i] & STATUS4_SYRUP_BOMB) && gBattleStruct->stickySyrupdBy[i] == battler) gStatuses4[i] &= ~STATUS4_SYRUP_BOMB; + if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) + gDisableStructs[i].octolock = FALSE; } gActionSelectionCursor[battler] = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 70540ef275..a9fc0c6f46 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17447,18 +17447,18 @@ void BS_TryReflectType(void) void BS_TrySetOctolock(void) { - NATIVE_ARGS(u8 battler, const u8 *failInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); + NATIVE_ARGS(const u8 *failInstr); - if (gDisableStructs[battler].octolock) + if (gDisableStructs[gBattlerTarget].octolock) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gDisableStructs[battler].octolock = TRUE; - gBattleMons[battler].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[battler].battlerPreventingEscape = gBattlerAttacker; + gDisableStructs[gBattlerTarget].octolock = TRUE; + gDisableStructs[gBattlerTarget].octolockedBy = gBattlerAttacker; + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/test/battle/move_effect/octolock.c b/test/battle/move_effect/octolock.c index e93f6f29cb..e50e7de514 100644 --- a/test/battle/move_effect/octolock.c +++ b/test/battle/move_effect/octolock.c @@ -152,3 +152,28 @@ SINGLE_BATTLE_TEST("Octolock triggers Defiant for both stat reductions") MESSAGE("The opposing Bisharp's Attack sharply rose!"); } } + +SINGLE_BATTLE_TEST("Octolock ends after user that set the lock switches out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_OCTOLOCK); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_OCTOLOCK, player); + MESSAGE("The opposing Wobbuffet can no longer escape because of Octolock!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Defense fell!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Sp. Def fell!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's Defense fell!"); + MESSAGE("The opposing Wobbuffet's Sp. Def fell!"); + } + + } +} diff --git a/test/battle/move_effect/sky_drop.c b/test/battle/move_effect/sky_drop.c index c2a1e104e1..3790fd4ef3 100644 --- a/test/battle/move_effect/sky_drop.c +++ b/test/battle/move_effect/sky_drop.c @@ -122,3 +122,16 @@ SINGLE_BATTLE_TEST("Sky Drop stops the confusion count until the target is dropp ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); } } + +SINGLE_BATTLE_TEST("Sky Drop fails if the targe is in a semi-invulnerable state") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_FLY); MOVE(player, MOVE_SKY_DROP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SKY_DROP, player); + } +} From 1bb9a1c86b46d87c708e1a9dae97649cbf630c6c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:36:43 +0200 Subject: [PATCH 234/248] Remove unused function (#7617) --- src/battle_script_commands.c | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a9fc0c6f46..a98fba7408 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6078,28 +6078,6 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect return TRUE; } -static inline bool32 IsProtectEffectAffected(u32 battler, u32 move) -{ - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - if (IsProtectivePadsProtected(battler, holdEffect)) - return TRUE; - - if (holdEffect == HOLD_EFFECT_CLEAR_AMULET) - { - RecordItemEffectBattle(battler, holdEffect); - return TRUE; - } - - u32 ability = GetBattlerAbility(gBattlerAttacker); - if (CanAbilityPreventStatLoss(ability)) - { - RecordAbilityBattle(battler, ability); - return TRUE; - } - - return FALSE; -} - static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_BUTTON From e2f24bbb3ff9811ecefd2314738f349a429f10b6 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:37:57 +0200 Subject: [PATCH 235/248] Prevents a regression for custom abilties (#7616) --- include/constants/battle.h | 17 +++++++++-------- src/battle_script_commands.c | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 0f83eaecae..926023359f 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -363,16 +363,17 @@ enum BattleWeather #define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) +// Explicit numbers until frostbite because those shouldn't be shifted enum __attribute__((packed)) MoveEffect { - MOVE_EFFECT_NONE, - MOVE_EFFECT_SLEEP, - MOVE_EFFECT_POISON, - MOVE_EFFECT_BURN, - MOVE_EFFECT_FREEZE, - MOVE_EFFECT_PARALYSIS, - MOVE_EFFECT_TOXIC, - MOVE_EFFECT_FROSTBITE, + MOVE_EFFECT_NONE = 0, + MOVE_EFFECT_SLEEP = 1, + MOVE_EFFECT_POISON = 2, + MOVE_EFFECT_BURN = 3, + MOVE_EFFECT_FREEZE = 4, + MOVE_EFFECT_PARALYSIS = 5, + MOVE_EFFECT_TOXIC = 6, + MOVE_EFFECT_FROSTBITE = 7, MOVE_EFFECT_CONFUSION, MOVE_EFFECT_FLINCH, MOVE_EFFECT_TRI_ATTACK, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c58b85d187..3d8041966f 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12906,7 +12906,7 @@ static bool32 CanAbilityShieldActivateForBattler(u32 battler) { if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) return FALSE; - + RecordItemEffectBattle(battler, HOLD_EFFECT_ABILITY_SHIELD); gBattlerAbility = battler; gLastUsedItem = gBattleMons[battler].item; @@ -14534,7 +14534,7 @@ static void Cmd_setnonvolatilestatus(void) switch (cmd->trigger) { case TRIGGER_ON_ABILITY: - if (gBattleScripting.moveEffect == MOVE_EFFECT_CONFUSION) + if (gBattleScripting.moveEffect >= MOVE_EFFECT_CONFUSION) SetMoveEffect(gBattleScripting.battler, gEffectBattler, FALSE, FALSE); else SetNonVolatileStatusCondition(gEffectBattler, gBattleScripting.moveEffect, TRIGGER_ON_ABILITY); From 8044255fee5e84b87168c23f904fcce7dc277c25 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Tue, 26 Aug 2025 06:25:18 -0700 Subject: [PATCH 236/248] Fix Vs Seeker Trainer Battle script issue (#7615) --- src/vs_seeker.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 15829c3bd5..1a7dc68c72 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -529,7 +529,6 @@ void ClearRematchMovementByTrainerId(void) TryGetObjectEventIdByLocalIdAndMap(objectEventTemplates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId); objectEvent = &gObjectEvents[objEventId]; - GetRandomFaceDirectionMovementType(&objectEventTemplates[i]); TryOverrideTemplateCoordsForObjectEvent(objectEvent, sFaceDirectionMovementTypeByFacingDirection[objectEvent->facingDirection]); if (gSelectedObjectEvent == objEventId) @@ -705,22 +704,11 @@ static u8 GetResponseMovementTypeFromTrainerGraphicsId(u8 graphicsId) #endif //FREE_MATCH_CALL static u16 GetTrainerFlagFromScript(const u8 *script) - /* - * The trainer flag is a little-endian short located +2 from - * the script pointer, assuming the trainerbattle command is - * first in the script. Because scripts are unaligned, and - * because the ARM processor requires shorts to be 16-bit - * aligned, this function needs to perform explicit bitwise - * operations to get the correct flag. - * - * 5c XX YY ZZ ... - * -- -- - */ { - u16 trainerFlag; - - script += 2; - trainerFlag = script[0]; + // The trainer flag is located 3 bytes (command + flags + localIdA) from the script pointer, assuming the trainerbattle command is first in the script. + // Because scripts are unaligned, and because the ARM processor requires shorts to be 16-bit aligned, this function needs to perform explicit bitwise operations to get the correct flag. + script += 3; + u16 trainerFlag = script[0]; trainerFlag |= script[1] << 8; return trainerFlag; } From a45d36d90f1e8943e33ce1543b57adeba50cf220 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 26 Aug 2025 22:16:57 +0200 Subject: [PATCH 237/248] The original attacker wasn't restored for Doodle (#7620) Co-authored-by: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Co-authored-by: Bassoonian --- data/battle_scripts_1.s | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 45f5a5babf..5f8e768c69 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -221,12 +221,13 @@ BattleScript_EffectDoodle:: attackstring ppreduce trycopyability BS_ATTACKER, BattleScript_ButItFailed + saveattacker attackanimation waitanimation setbyte gBattleCommunication, 0 goto BattleScript_EffectDoodle_AfterCopy BattleScript_EffectDoodle_CopyAbility: - trycopyability BS_ATTACKER, BattleScript_MoveEnd + trycopyability BS_ATTACKER, BattleScript_EffectDoodleMoveEnd BattleScript_EffectDoodle_AfterCopy: .if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker @@ -238,8 +239,10 @@ BattleScript_EffectDoodle_AfterCopy: switchinabilities BS_ATTACKER jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_MoveEnd addbyte gBattleCommunication, 1 - jumpifnoally BS_ATTACKER, BattleScript_MoveEnd + jumpifnoally BS_ATTACKER, BattleScript_EffectDoodleMoveEnd setallytonextattacker BattleScript_EffectDoodle_CopyAbility +BattleScript_EffectDoodleMoveEnd: + restoreattacker goto BattleScript_MoveEnd BattleScript_EffectGlaiveRush:: From 2fbf45d057ba5ead9746d913df95620200508b81 Mon Sep 17 00:00:00 2001 From: RavePossum <145081120+ravepossum@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:17:30 -0400 Subject: [PATCH 238/248] Restore X item friendship increase (#7583) --- include/battle_controllers.h | 1 + include/constants/item_effects.h | 4 +++ include/pokemon.h | 1 + src/battle_controllers.c | 46 +++++++++++++++++++++++++ src/battle_util.c | 6 ++++ src/data/pokemon/item_effects.h | 20 ----------- src/pokemon.c | 3 +- test/battle/item_effect/increase_stat.c | 23 +++++++++++++ test/battle/move_effect/embargo.c | 46 ++++++++++++++----------- 9 files changed, 107 insertions(+), 43 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 2ce28ca609..b628e69dc1 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -277,6 +277,7 @@ void InitBattleControllers(void); bool32 IsValidForBattle(struct Pokemon *mon); void TryReceiveLinkBattleData(void); void PrepareBufferDataTransferLink(u32 battler, u32 bufferId, u16 size, u8 *data); +void UpdateFriendshipFromXItem(u32 battler); // emitters void BtlController_EmitGetMonData(u32 battler, u32 bufferId, u8 requestId, u8 monToCheck); diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h index ac1c7d5c5b..dbe322beac 100644 --- a/include/constants/item_effects.h +++ b/include/constants/item_effects.h @@ -93,4 +93,8 @@ #define ITEM_EFFECT_HEAL_PP 21 #define ITEM_EFFECT_NONE 22 +// Since X item stat increases are now handled by battle scripts, the friendship increase effect is now handled by the battle controller in HandleAction_UseItem. +#define X_ITEM_FRIENDSHIP_INCREASE 1 // The amount of friendship gained by using an X item on a Pokémon in battle. +#define X_ITEM_MAX_FRIENDSHIP 200 // Friendship threshold at which Pokémon stop receiving a friendship increase from using X items on them in battle. + #endif // GUARD_CONSTANTS_ITEM_EFFECTS_H diff --git a/include/pokemon.h b/include/pokemon.h index edc37a1a0b..ebc21441d8 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -830,5 +830,6 @@ uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier) u32 GetRegionalFormByRegion(u32 species, u32 region); bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); u32 GetTeraTypeFromPersonality(struct Pokemon *mon); +bool8 ShouldSkipFriendshipChange(void); #endif // GUARD_POKEMON_H diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 885b2a922a..da18baee14 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -12,9 +12,11 @@ #include "battle_tv.h" #include "cable_club.h" #include "event_object_movement.h" +#include "item.h" #include "link.h" #include "link_rfu.h" #include "m4a.h" +#include "overworld.h" #include "palette.h" #include "party_menu.h" #include "recorded_battle.h" @@ -25,6 +27,7 @@ #include "util.h" #include "text.h" #include "constants/abilities.h" +#include "constants/item_effects.h" #include "constants/songs.h" #include "pokemon_animation.h" @@ -3260,3 +3263,46 @@ bool32 SwitchIn_TryShinyAnimUtil(u32 battler) return TRUE; } + +void UpdateFriendshipFromXItem(u32 battler) +{ + struct Pokemon *party = GetBattlerParty(battler); + + u8 friendship; + gBattleResources->bufferA[battler][1] = REQUEST_FRIENDSHIP_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &friendship); + + u16 heldItem; + gBattleResources->bufferA[battler][1] = REQUEST_HELDITEM_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], (u8*)&heldItem); + + if (friendship < X_ITEM_MAX_FRIENDSHIP) + { + if (GetItemHoldEffect(heldItem) == HOLD_EFFECT_FRIENDSHIP_UP) + friendship += 150 * X_ITEM_FRIENDSHIP_INCREASE / 100; + else + friendship += X_ITEM_FRIENDSHIP_INCREASE; + + u8 pokeball; + gBattleResources->bufferA[battler][1] = REQUEST_POKEBALL_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &pokeball); + + if (pokeball == BALL_LUXURY) + friendship++; + + u8 metLocation; + gBattleResources->bufferA[battler][1] = REQUEST_MET_LOCATION_BATTLE; + GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &metLocation); + + if (metLocation == GetCurrentRegionMapSectionId()) + friendship++; + + if (friendship > MAX_FRIENDSHIP) + friendship = MAX_FRIENDSHIP; + + gBattleMons[battler].friendship = friendship; + gBattleResources->bufferA[battler][3] = friendship; + gBattleResources->bufferA[battler][1] = REQUEST_FRIENDSHIP_BATTLE; + SetBattlerMonData(battler, GetBattlerParty(battler), gBattlerPartyIndexes[battler]); + } +} diff --git a/src/battle_util.c b/src/battle_util.c index 18b8570579..a683ff9989 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -44,6 +44,7 @@ #include "constants/battle_string_ids.h" #include "constants/hold_effects.h" #include "constants/items.h" +#include "constants/item_effects.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" @@ -580,6 +581,11 @@ void HandleAction_UseItem(void) ClearVariousBattlerFlags(gBattlerAttacker); gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][1] | (gBattleResources->bufferB[gBattlerAttacker][2] << 8); + if (X_ITEM_FRIENDSHIP_INCREASE > 0 + && GetItemEffectType(gLastUsedItem) == ITEM_EFFECT_X_ITEM + && !ShouldSkipFriendshipChange()) + UpdateFriendshipFromXItem(gBattlerAttacker); + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[GetItemBattleUsage(gLastUsedItem) - 1]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index 93ff78ad7c..851424021f 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -334,14 +334,8 @@ const u8 gItemEffect_PPMax[9] = { VITAMIN_FRIENDSHIP_CHANGE(6), }; -#define STAT_BOOST_FRIENDSHIP_CHANGE \ - [6] = 1, /* Friendship change, low */ \ - [7] = 1 /* Friendship change, mid */ - const u8 gItemEffect_GuardSpec[8] = { [3] = ITEM3_GUARD_SPEC, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; // The first item effect value for the stat boost items @@ -350,44 +344,30 @@ const u8 gItemEffect_GuardSpec[8] = { const u8 gItemEffect_DireHit[8] = { [0] = 1 << 5, // ITEM0_DIRE_HIT - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAttack[8] = { [1] = ITEM1_X_ATTACK, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XDefense[8] = { [1] = ITEM1_X_DEFENSE, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpeed[8] = { [1] = ITEM1_X_SPEED, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAccuracy[8] = { [1] = ITEM1_X_ACCURACY, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpecialAttack[8] = { [1] = ITEM1_X_SPATK, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpecialDefense[8] = { [1] = ITEM1_X_SPDEF, - [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_EvoItem[6] = { diff --git a/src/pokemon.c b/src/pokemon.c index 9b7ce57de1..6e0e7accb8 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -80,7 +80,6 @@ static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 perso static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DecryptBoxMon(struct BoxPokemon *boxMon); static void Task_PlayMapChosenOrBattleBGM(u8 taskId); -static bool8 ShouldSkipFriendshipChange(void); void TrySpecialOverworldEvo(); EWRAM_DATA static u8 sLearningMoveTableID = 0; @@ -6385,7 +6384,7 @@ bool8 HasTwoFramesAnimation(u16 species) && !gTestRunnerHeadless; } -static bool8 ShouldSkipFriendshipChange(void) +bool8 ShouldSkipFriendshipChange(void) { if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) return TRUE; diff --git a/test/battle/item_effect/increase_stat.c b/test/battle/item_effect/increase_stat.c index 3f162ea828..b56f1a2b84 100644 --- a/test/battle/item_effect/increase_stat.c +++ b/test/battle/item_effect/increase_stat.c @@ -1,5 +1,6 @@ #include "global.h" #include "test/battle.h" +#include "constants/item_effects.h" SINGLE_BATTLE_TEST("X Attack sharply raises battler's Attack stat", s16 damage) { @@ -257,3 +258,25 @@ SINGLE_BATTLE_TEST("Max Mushrooms raises battler's Speed stat", s16 damage) } } } + +SINGLE_BATTLE_TEST("Using X items in battle raises Friendship", s16 damage) +{ + u32 startingFriendship; + u8 metLocation = MAPSEC_NONE; + PARAMETRIZE { startingFriendship = 0; } + PARAMETRIZE { startingFriendship = X_ITEM_MAX_FRIENDSHIP; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); }; + // Set met location to MAPSEC_NONE to avoid getting the friendship boost + // from being met in the current map section + SetMonData(&PLAYER_PARTY[0], MON_DATA_MET_LOCATION, &metLocation); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_X_ACCURACY); MOVE(opponent, MOVE_CELEBRATE); } + } THEN { + if (startingFriendship == X_ITEM_MAX_FRIENDSHIP) + EXPECT_EQ(player->friendship, X_ITEM_MAX_FRIENDSHIP); + else + EXPECT_EQ(player->friendship, X_ITEM_FRIENDSHIP_INCREASE); + } +} diff --git a/test/battle/move_effect/embargo.c b/test/battle/move_effect/embargo.c index 3e86b60b0b..4b06b92fc1 100644 --- a/test/battle/move_effect/embargo.c +++ b/test/battle/move_effect/embargo.c @@ -114,28 +114,32 @@ SINGLE_BATTLE_TEST("Embargo negates a held item's Speed reduction") } } -WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect friendship") -{ - u32 initialFriendship; - u32 finalFriendship; +// This is a useful test, but under the current circumstances, we can't actually test this without modifying +// X_ITEM_FRIENDSHIP_INCREASE. Since HOLD_EFFECT_FRIENDSHIP_UP applies a 1.5x modifier, and the stock +// Friendship increase is 1, the held item effect actually does not affect the Friendship gained. +// +// WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect friendship") +// { +// u32 initialFriendship; +// u32 finalFriendship; - KNOWN_FAILING; // Pokémon are currently not obtaining Friendship for using items in battle. - GIVEN { - ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { USE_ITEM(player, ITEM_X_ACCURACY); } - TURN { MOVE(player, MOVE_SING); } - } SCENE { - MESSAGE("Wobbuffet used Sing!"); - MESSAGE("Wild Wobbuffet fell asleep!"); - } THEN { - initialFriendship = GetMonData(&PLAYER_PARTY[0], MON_DATA_FRIENDSHIP); - finalFriendship = GetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP); - EXPECT_EQ(finalFriendship, initialFriendship + 2); - } -} +// KNOWN_FAILING; // Pokémon are currently not obtaining Friendship for using items in battle. +// GIVEN { +// ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); +// PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); }; +// OPPONENT(SPECIES_WOBBUFFET); +// } WHEN { +// TURN { USE_ITEM(player, ITEM_X_ACCURACY); } +// TURN { MOVE(player, MOVE_SING); } +// } SCENE { +// MESSAGE("Wobbuffet used Sing!"); +// MESSAGE("Wild Wobbuffet fell asleep!"); +// } THEN { +// initialFriendship = GetMonData(&PLAYER_PARTY[0], MON_DATA_FRIENDSHIP); +// finalFriendship = GetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP); +// EXPECT_EQ(finalFriendship, initialFriendship + 2); +// } +// } SINGLE_BATTLE_TEST("Embargo doesn't block a held item's form-changing effect, but it does block its other effects", s16 damage) { From f0bd3d544e67a9b4afeddf5705ae144b64668f25 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 27 Aug 2025 15:16:11 +0100 Subject: [PATCH 239/248] Fixes Wonder Room interactions with Defense/Special Defense boosting effects (#7626) --- src/battle_util.c | 49 +++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a683ff9989..2850b7d23f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8865,6 +8865,14 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); } break; + case ABILITY_PURIFYING_SALT: + if (moveType == TYPE_GHOST) + { + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); + if (damageCalcData->updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_PURIFYING_SALT); + } + break; } // ally's abilities @@ -8947,31 +8955,38 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, uq4_12_t modifier; u32 battlerDef = damageCalcData->battlerDef; u32 move = damageCalcData->move; - u32 moveType = damageCalcData->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped - { - def = gBattleMons[battlerDef].spDefense; - spDef = gBattleMons[battlerDef].defense; - } - else - { - def = gBattleMons[battlerDef].defense; - spDef = gBattleMons[battlerDef].spDefense; - } + def = gBattleMons[battlerDef].defense; + spDef = gBattleMons[battlerDef].spDefense; if (moveEffect == EFFECT_PSYSHOCK || IsBattleMovePhysical(move)) // uses defense stat instead of sp.def { - defStat = def; + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + { + defStat = spDef; + usesDefStat = FALSE; + } + else + { + defStat = def; + usesDefStat = TRUE; + } defStage = gBattleMons[battlerDef].statStages[STAT_DEF]; - usesDefStat = TRUE; } else // is special { - defStat = spDef; + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + { + defStat = def; + usesDefStat = TRUE; + } + else + { + defStat = spDef; + usesDefStat = FALSE; + } defStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; - usesDefStat = FALSE; } // Self-destruct / Explosion cut defense in half @@ -9025,10 +9040,6 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; - case ABILITY_PURIFYING_SALT: - if (moveType == TYPE_GHOST) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); - break; } // ally's abilities From de790e481518834dbcca1682337a45defe042c0a Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Thu, 28 Aug 2025 07:51:02 -0400 Subject: [PATCH 240/248] Ally Switch attract battler swapping, test for leech seed (#7634) Co-authored-by: ghoulslash --- src/battle_anim_effects_1.c | 28 +++++++++++++ test/battle/move_effect/ally_switch.c | 58 +++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 74444065b8..570b2d1085 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6864,6 +6864,33 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp); } +static void TrySwapAttractBattlerIds(u32 battlerAtk, u32 battlerPartner) +{ + u32 attractedTo; + + // our own infatuation handled with gBattleMons struct data swapping + + // if another battler is infatuated with one of us, change to other battler + for (u32 i = 0; i < gBattlersCount; i++) { + if (i == battlerAtk || i == battlerPartner || !(gBattleMons[i].status2 & STATUS2_INFATUATION)) + continue; + + attractedTo = CountTrailingZeroBits((gBattleMons[i].status2 & STATUS2_INFATUATION) >> 0x10); + if (attractedTo == battlerAtk) + { + gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battlerAtk); + gBattleMons[i].status2 |= STATUS2_INFATUATED_WITH(battlerPartner); + break; + } + else if (attractedTo == battlerPartner) + { + gBattleMons[i].status2 &= ~STATUS2_INFATUATED_WITH(battlerPartner); + gBattleMons[i].status2 |= STATUS2_INFATUATED_WITH(battlerAtk); + break; + } + } +} + static void SwapBattlerMoveData(u32 battler1, u32 battler2) { u32 temp; @@ -6936,6 +6963,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) TrySwapSkyDropTargets(battlerAtk, battlerPartner); TrySwapStickyWebBattlerId(battlerAtk, battlerPartner); TrySwapWishBattlerIds(battlerAtk, battlerPartner); + TrySwapAttractBattlerIds(battlerAtk, battlerPartner); // For Snipe Shot and abilities Stalwart/Propeller Tail - keep the original target. for (i = 0; i < gBattlersCount; i++) diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index b808183fbd..e3f99cb73b 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -348,5 +348,63 @@ DOUBLE_BATTLE_TEST("Ally switch updates last used moves for Mimic") } } +DOUBLE_BATTLE_TEST("Ally Switch does not update leech seed battler") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_SOLOSIS); + OPPONENT(SPECIES_BULBASAUR) { HP(50); MaxHP(100); } + OPPONENT(SPECIES_RALTS) { HP(50); MaxHP(100); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_LEECH_SEED, target: playerLeft); } + TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } + TURN { ; } + } SCENE { + // turn 1 + MESSAGE("The opposing Bulbasaur used Leech Seed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, playerLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + + MESSAGE("The opposing Ralts used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); + MESSAGE("The opposing Ralts and the opposing Bulbasaur switched places!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, playerLeft); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); // Ralts now gets hp gain + } THEN { + EXPECT_GT(opponentLeft->hp, 50); + EXPECT_GT(opponentRight->hp, 50); + } +} + +DOUBLE_BATTLE_TEST("Ally Switch updates attract battler") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Gender(MON_MALE); } + PLAYER(SPECIES_SOLOSIS) { Speed(50); } + OPPONENT(SPECIES_CLEFAIRY) { Speed(20); Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } + OPPONENT(SPECIES_RALTS) { Speed(30); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } + TURN { ; } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Tackle!"); + HP_BAR(opponentLeft); + ABILITY_POPUP(opponentLeft, ABILITY_CUTE_CHARM); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, playerLeft); + MESSAGE("The opposing Clefairy's Cute Charm infatuated Wobbuffet!"); + // turn 2 + MESSAGE("The opposing Ralts used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); + MESSAGE("The opposing Ralts and the opposing Clefairy switched places!"); + // turn 3 + MESSAGE("Wobbuffet is in love with the opposing Clefairy!"); // tracks attract battler + } +} + // Triple Battles required to test //TO_DO_BATTLE_TEST("Ally Switch fails if the user is in the middle of the field in a Triple Battle"); From ce77c48142234ee1e355ed14ae3b380885bc094b Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Thu, 28 Aug 2025 14:23:44 +0200 Subject: [PATCH 241/248] remove unused var --- src/battle_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 0655831db1..de7cec8d58 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8872,7 +8872,6 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) uq4_12_t modifier; u32 battlerDef = ctx->battlerDef; u32 move = ctx->move; - u32 moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); def = gBattleMons[battlerDef].defense; From d812b58064fce57ce74252a688742ee65b1973b3 Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 28 Aug 2025 15:49:29 +0200 Subject: [PATCH 242/248] Expansion version 1.12.3 --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.12.x/1.12.3.md | 118 ++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 docs/changelogs/1.12.x/1.12.3.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index b48cda404c..5c7bf2b5cf 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.2 (Latest release) + - 1.12.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.2 - 1.12.1 - 1.12.0 - 1.11.4 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 95b00ef2d1..ed94c1355e 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.2 (Latest release) + - 1.12.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.2 - 1.12.1 - 1.12.0 - 1.11.4 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index d955d09cbc..a391c6473d 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.2 (Latest release) + - 1.12.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.2 - 1.12.1 - 1.12.0 - 1.11.4 diff --git a/README.md b/README.md index 4cd0a5f161..b6a78a3736 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.12.2 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.12.3 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 89767de31b..89b86087c1 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -20,6 +20,7 @@ - [Day/Night System FAQ](tutorials/dns.md) - [Changelog](./CHANGELOG.md) - [1.12.x]() + - [Version 1.12.3](changelogs/1.12.x/1.12.3.md) - [Version 1.12.2](changelogs/1.12.x/1.12.2.md) - [Version 1.12.1](changelogs/1.12.x/1.12.1.md) - [Version 1.12.0](changelogs/1.12.x/1.12.0.md) diff --git a/docs/changelogs/1.12.x/1.12.3.md b/docs/changelogs/1.12.x/1.12.3.md new file mode 100644 index 0000000000..a4deece835 --- /dev/null +++ b/docs/changelogs/1.12.x/1.12.3.md @@ -0,0 +1,118 @@ +```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.12.3 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Restore git history check by @ravepossum in [#7463](https://github.com/rh-hideout/pokeemerald-expansion/pull/7463) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Changed default print level for DebugPrintf for mGBA to MGBA_LOG_WARN by @hedara90 in [#7567](https://github.com/rh-hideout/pokeemerald-expansion/pull/7567) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) + +## 🗺️ Overworld 🗺️ +### Changed +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) + +### Fixed +* Bug fix: add handling for forced movements into/after ledge jumps with follower NPCs by @Bivurnum in [#7055](https://github.com/rh-hideout/pokeemerald-expansion/pull/7055) +* Fixed compile issue `OW_TIMES_OF_DAY` is `GEN_3` by @AsparagusEduardo in [#7499](https://github.com/rh-hideout/pokeemerald-expansion/pull/7499) +* Remove shadow and hide follower on stair warp by @cornixsenex in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) + +## ⚔️ Battle General ⚔️ +### Changed +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) + +### Fixed +* Fixes Magnet Rise when user is Rooted/Smacked Down by @PhallenTree in [#7449](https://github.com/rh-hideout/pokeemerald-expansion/pull/7449) +* Fixes Leech Seed recovery not applying behind Sub by @AlexOn1ine in [#7468](https://github.com/rh-hideout/pokeemerald-expansion/pull/7468) +* Fixes Round and Fusion moves doubling power from previous turn's move by @PhallenTree in [#7476](https://github.com/rh-hideout/pokeemerald-expansion/pull/7476) +* Fixes shadows and mon animations for transformed battlers by @AsparagusEduardo in [#7500](https://github.com/rh-hideout/pokeemerald-expansion/pull/7500) +* Fixes Life Orb still activating if move was absorbed by @AlexOn1ine in [#7521](https://github.com/rh-hideout/pokeemerald-expansion/pull/7521) +* Fix Mimicry Only Activating Once per Turn by @ghoulslash in [#7537](https://github.com/rh-hideout/pokeemerald-expansion/pull/7537) +* Fixes Knock Off still activating when there is no Item by @AlexOn1ine in [#7496](https://github.com/rh-hideout/pokeemerald-expansion/pull/7496) +* Fixed `B_PSYWAVE_DMG` by @AsparagusEduardo in [#7557](https://github.com/rh-hideout/pokeemerald-expansion/pull/7557) +* Fixes Counter / Mirror Coat / Metal Burst damage assignment by @AlexOn1ine in [#7538](https://github.com/rh-hideout/pokeemerald-expansion/pull/7538) +* Fix in-game partner battles always causing a whiteout by @ravepossum in [#7587](https://github.com/rh-hideout/pokeemerald-expansion/pull/7587) +* Fix B_ANIMATE_MON_AFTER_KO with a new counter by @hedara90 in [#7531](https://github.com/rh-hideout/pokeemerald-expansion/pull/7531) +* Fixes Rage Fist counter increment by @AlexOn1ine in [#7582](https://github.com/rh-hideout/pokeemerald-expansion/pull/7582) +* Fixes moveend_absorb hitmarker by @AlexOn1ine in [#7591](https://github.com/rh-hideout/pokeemerald-expansion/pull/7591) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Fixes Explosion behavior when 3 mons can endure hit by @AlexOn1ine in [#7594](https://github.com/rh-hideout/pokeemerald-expansion/pull/7594) +* Fixes octolock not ending after user switched out by @AlexOn1ine in [#7556](https://github.com/rh-hideout/pokeemerald-expansion/pull/7556) +* The original attacker wasn't restored for Doodle by @AlexOn1ine in [#7620](https://github.com/rh-hideout/pokeemerald-expansion/pull/7620) +* Restore X item friendship increase by @ravepossum in [#7583](https://github.com/rh-hideout/pokeemerald-expansion/pull/7583) +* Fixes Wonder Room interactions with Defense/Special Defense boosting effects by @PhallenTree in [#7626](https://github.com/rh-hideout/pokeemerald-expansion/pull/7626) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) + +## 🤹 Moves 🤹 +### Fixed +* Clear gScanlineEffect to fix timeout in acid downpour animation by @FosterProgramming in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* Fix terastallization anims flickering by @ravepossum in [#7613](https://github.com/rh-hideout/pokeemerald-expansion/pull/7613) + +## 🧶 Items 🧶 +### Changed +* Fix using town map as registered item by @ravepossum in [#7482](https://github.com/rh-hideout/pokeemerald-expansion/pull/7482) + +### Fixed +* Implement using party menu items from field by @ravepossum in [#7481](https://github.com/rh-hideout/pokeemerald-expansion/pull/7481) + +## 🤖 Battle AI 🤖 +### Changed +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) + +### Fixed +* Incorrect call in Rest by @surskitty in [#7569](https://github.com/rh-hideout/pokeemerald-expansion/pull/7569) +* Fix duplicate switch in after faint by @AlexOn1ine in [#7600](https://github.com/rh-hideout/pokeemerald-expansion/pull/7600) + +## 🧹 Other Cleanup 🧹 +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) + +## 🧪 Test Runner 🧪 +### Changed +* Clean up some Normalize tests to make them make sense by @hedara90 in [#7461](https://github.com/rh-hideout/pokeemerald-expansion/pull/7461) +* Add Synthesis + Utililty Umbrella test by @ghoulslash in [#7472](https://github.com/rh-hideout/pokeemerald-expansion/pull/7472) +* Add test for BoxPokemon integrity by @hedara90 in [#7487](https://github.com/rh-hideout/pokeemerald-expansion/pull/7487) +* Re-order moves in fling test by @hedara90 in [#7559](https://github.com/rh-hideout/pokeemerald-expansion/pull/7559) +* Wrote some tests by @AsparagusEduardo in [#7563](https://github.com/rh-hideout/pokeemerald-expansion/pull/7563) +* Added Ability TODO tests - Volume C by @AsparagusEduardo in [#7562](https://github.com/rh-hideout/pokeemerald-expansion/pull/7562) +* Added missing Move Effect TODO tests - Volume F by @AsparagusEduardo in [#7605](https://github.com/rh-hideout/pokeemerald-expansion/pull/7605) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) + +### Fixed +* Clear out parties between battle tests by @hedara90 in [#7460](https://github.com/rh-hideout/pokeemerald-expansion/pull/7460) +* Fixed most failed tests with `GEN_LATEST GEN_8` by @AsparagusEduardo in [#7498](https://github.com/rh-hideout/pokeemerald-expansion/pull/7498) +* Corrected Liquid Ooze test by @AsparagusEduardo in [#7527](https://github.com/rh-hideout/pokeemerald-expansion/pull/7527) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) + +## 📚 Documentation 📚 +* Update how_to_new_pokemon.md by @kevinwklawrence in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* Updating a link to porytiles in INSTALL.md by @ThePeeps191 in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) + +## New Contributors +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.12.3 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index cdfaa6228e..fffde51959 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 -// Last version: 1.12.2 +// Last version: 1.12.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 12 #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 FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From 7056aaba6eda97a83aa22765c8dff3ca39e69920 Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 28 Aug 2025 16:15:09 +0200 Subject: [PATCH 243/248] Expansion version 1.13.0 --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 10 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 10 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 9 +- README.md | 2 +- docs/SUMMARY.md | 2 + docs/changelogs/1.13.x/1.13.0.md | 483 ++++++++++++++++++ include/constants/expansion.h | 2 +- 7 files changed, 496 insertions(+), 22 deletions(-) create mode 100644 docs/changelogs/1.13.x/1.13.0.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 5c7bf2b5cf..0d323435b4 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,18 +43,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.3 (Latest release) + - 1.13.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.3 - 1.12.2 - 1.12.1 - 1.12.0 - - 1.11.4 - - 1.11.3 - - 1.11.2 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - pre-1.12.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index ed94c1355e..a00d5f4d2c 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,18 +43,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.3 (Latest release) + - 1.13.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.3 - 1.12.2 - 1.12.1 - 1.12.0 - - 1.11.4 - - 1.11.3 - - 1.11.2 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - pre-1.12.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index a391c6473d..53bf274899 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,17 +43,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.12.3 (Latest release) + - 1.13.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.12.3 - 1.12.2 - 1.12.1 - 1.12.0 - - 1.11.4 - - 1.11.3 - - 1.11.1 - - 1.11.0 - - pre-1.11.0 + - pre-1.12.0 validations: required: true - type: input diff --git a/README.md b/README.md index b6a78a3736..6c91a3ad84 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.12.3 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.13.0 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 89b86087c1..667fcce2a4 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,6 +19,8 @@ - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Day/Night System FAQ](tutorials/dns.md) - [Changelog](./CHANGELOG.md) + - [1.13.x]() + - [Version 1.13.0](changelogs/1.13.x/1.13.0.md) - [1.12.x]() - [Version 1.12.3](changelogs/1.12.x/1.12.3.md) - [Version 1.12.2](changelogs/1.12.x/1.12.2.md) diff --git a/docs/changelogs/1.13.x/1.13.0.md b/docs/changelogs/1.13.x/1.13.0.md new file mode 100644 index 0000000000..52babd0b43 --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.0.md @@ -0,0 +1,483 @@ +```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.13.0 +`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Refactor field moves by @cawtds in [#6660](https://github.com/rh-hideout/pokeemerald-expansion/pull/6660) +* Refactors Final Gambit + Tests by @AlexOn1ine in [#7005](https://github.com/rh-hideout/pokeemerald-expansion/pull/7005) +* Combines Super Fang and Guardian of Alola effects by @AlexOn1ine in [#7048](https://github.com/rh-hideout/pokeemerald-expansion/pull/7048) +* Refactor damage calculations aruguments by using a struct context by @AlexOn1ine in [#7108](https://github.com/rh-hideout/pokeemerald-expansion/pull/7108) +* Add damage context to effectiveness multiplier by @AlexOn1ine in [#7111](https://github.com/rh-hideout/pokeemerald-expansion/pull/7111) +* Decouple Status set by ability from SetMoveEffect by @AlexOn1ine in [#7125](https://github.com/rh-hideout/pokeemerald-expansion/pull/7125) +* Converted Relic Song into a proper form change by @AsparagusEduardo in [#7139](https://github.com/rh-hideout/pokeemerald-expansion/pull/7139) + - Added `FORM_CHANGE_BATTLE_AFTER_MOVE` to parametrize Relic Song's form change +* Removed Mind Blown effect in favor of move flag by @AsparagusEduardo in [#7138](https://github.com/rh-hideout/pokeemerald-expansion/pull/7138) +* Volatile status refactoring by @cfmnephrite in [#6983](https://github.com/rh-hideout/pokeemerald-expansion/pull/6983) +* Bag refactor (groundwork for expansion) by @cfmnephrite in [#7018](https://github.com/rh-hideout/pokeemerald-expansion/pull/7018) + - If you're using @ghoulslash's bag sort branch, this PR will break it +* Stat Change (Animation) Refactor by @PhallenTree in [#7144](https://github.com/rh-hideout/pokeemerald-expansion/pull/7144) + `setgraphicalstatchangevalues` and `playstatchangeanimation` have been removed and now Stat Change Animations are handled in `statbuffchange`. + - To update your custom battle scripts: + `setgraphicalstatchangevalues` is often accompanied by `playanimation X, B_ANIM_STATS_CHANGE`. When I refer to deleting `setgraphicalstatchangevalues` below, that command should also be deleted. + 1. If `statbuffchange` is before `setgraphicalstatchangevalues`/`playstatchangeanimation` and there is something in between them (for example, `attackanimation` and `waitanimation`), add the flag `STAT_CHANGE_ONLY_CHECKING` and replace the command (`setgraphicalstatchangevalues`/`playstatchangeanimation`) with a copy of the original `statbuffchange`. + 2. If `statbuffchange` is after `setgraphicalstatchangevalues`/`playstatchangeanimation` or there is nothing in between, you should delete those commands (`setgraphicalstatchangevalues`/`playstatchangeanimation`) and no further changes other than those in _3._ should be required. + 3. If `playstatchangeanimation` had bits assigned to them (`BIT_ATK | BIT_SPATK`, for example), add ", " followed by those bits to the first `statbuffchange`; for the following `statbuffchange`s, remove stats that have already been increased/decreased. +* Untangle `InitBtlControllers` functions by @AsparagusEduardo in [#6748](https://github.com/rh-hideout/pokeemerald-expansion/pull/6748) +* Use battler arguments for SetMoveEffect by @AlexOn1ine in [#7156](https://github.com/rh-hideout/pokeemerald-expansion/pull/7156) +* Easier expandability of debug menu by @AsparagusEduardo in [#6910](https://github.com/rh-hideout/pokeemerald-expansion/pull/6910) +* Use dedicated functions for Mud/Water Sport by @AlexOn1ine in [#7248](https://github.com/rh-hideout/pokeemerald-expansion/pull/7248) +* Expanding and Refactoring Skill Swap and other ability-changing moves by @surskitty in [#7238](https://github.com/rh-hideout/pokeemerald-expansion/pull/7238) +* Refactor move Synchronise by @AlexOn1ine in [#7271](https://github.com/rh-hideout/pokeemerald-expansion/pull/7271) +* Adds hazard queue by @AlexOn1ine in [#7295](https://github.com/rh-hideout/pokeemerald-expansion/pull/7295) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* battle_interface: overhaul ability pop up by @mudskipper13 in [#7227](https://github.com/rh-hideout/pokeemerald-expansion/pull/7227) + - The layout of the ability pop up's image (`graphics/battle_interface/ability_pop_up.png`) has been changed. +* Bag refactor 2 by @cfmnephrite in [#7166](https://github.com/rh-hideout/pokeemerald-expansion/pull/7166) +* Replaces STATUS2 usage with volatiles in code by @cfmnephrite in [#7262](https://github.com/rh-hideout/pokeemerald-expansion/pull/7262) + - Replaced all references to STATUS2 in the code with volatiles (but left the old bitfield behind for compatibility with downstream users). The list of volatiles is in `include/constants/battle.h` and includes information such as an enum, a field name, type and max size, and whether or not the move is Baton Passable. Users can use VOLATILE_X with any function that previously took STATUS2_X in scripts, and can check/set volatiles in C with `gBattleMons[battler].volatiles.{field name}` syntax instead of checking a flag in a bitfield. +* Refactor battle environment by @fdeblasio in [#4891](https://github.com/rh-hideout/pokeemerald-expansion/pull/4891) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* AI refactor for weather-setting, terrain-setting, Trick Room behaviors; doubles-focused by @surskitty in [#7319](https://github.com/rh-hideout/pokeemerald-expansion/pull/7319) + - AI is more likely to use Trick Room in double battles and Terrains in general. +* Convert Status4 to volatiles by @AlexOn1ine in [#7411](https://github.com/rh-hideout/pokeemerald-expansion/pull/7411) +* Split Sheer Force tests by gen instead of by four by @AlexOn1ine in [#7260](https://github.com/rh-hideout/pokeemerald-expansion/pull/7260) +* Modify move prediction to work in doubles by @AlexOn1ine in [#7087](https://github.com/rh-hideout/pokeemerald-expansion/pull/7087) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines by @grintoul1 in [#7425](https://github.com/rh-hideout/pokeemerald-expansion/pull/7425) + +## 🧬 General 🧬 +### Added +* New sprite compressor by @hedara90, @DizzyEggg Improved performance massively for the instruction decoding., @mrgriffin, SBird and @tertu-m who has done even more optimization and answered questions about the GBA hardware whenever I had them. and @rayrobdod for the better migration script. in [#5627](https://github.com/rh-hideout/pokeemerald-expansion/pull/5627) + - `LZDecompressVram` and `LZDecompressWram` has been deprecated. All calls do decompress LZ compressed data should be using the wrapper functions `DecompressDataWithHeaderVram` or `DecompressDataWithHeaderWram`. + - A new sprite compression format has been introduced. To use it, replace files with `.4bpp.lz` with `.4bpp.smol` or `.4bpp.fastSmol`. + - `.smol` is a compression format utilizing entropy encoding in the form of tabled Asymmetric Numeral Systems (tANS) and a modified LZ style RLE/Dictionary encoding scheme specialized for the sprites used in Pokemon games. This is approximately 25% smaller than the default LZ77 compression. + - `.fastSmol` skips the entropy encoding and is therefore slightly larger than the default LZ77 compression, but decoding sprites is faster than the default LZ77 compression. + - `.smolTM` is a compression scheme for tilemaps. + - Might have unexpected behavior if user introduced decompression during hardware interrupts. + - Has a migration script that handles all files under `src/`, `migration_scripts/1.12/convert_compressed_files.py`. +* Adds FRLG asserts to Alloc/Free by @cawtds in [#7025](https://github.com/rh-hideout/pokeemerald-expansion/pull/7025) +* Debug parties and battles by @SBird1337 in [#6884](https://github.com/rh-hideout/pokeemerald-expansion/pull/6884) + - Adds options to set debug parties and battles using the debug menu +* Added naive line break by @hedara90 in [#7076](https://github.com/rh-hideout/pokeemerald-expansion/pull/7076) +* Disable unowned evo methods by @Bolt-Strike in [#7103](https://github.com/rh-hideout/pokeemerald-expansion/pull/7103) +* lto support by @DizzyEggg in [#7182](https://github.com/rh-hideout/pokeemerald-expansion/pull/7182) +* Improve trainer back pic-related data and code (+ smol documentation) by @mudskipper13 in [#6821](https://github.com/rh-hideout/pokeemerald-expansion/pull/6821) +* Add Set Hidden Nature option to the debug menu by @AlexOn1ine in [#7281](https://github.com/rh-hideout/pokeemerald-expansion/pull/7281) +* Instant Win option in Battle Debug by @AlexOn1ine in [#7333](https://github.com/rh-hideout/pokeemerald-expansion/pull/7333) +* `trainerproc` copy other trainer party by @hedara90 in [#7251](https://github.com/rh-hideout/pokeemerald-expansion/pull/7251) + - Adds the `Copy Pool` command to `trainerproc` which copies the party/pool from another trainer. +* Show chosen move in the battle debug menu by @AlexOn1ine in [#7382](https://github.com/rh-hideout/pokeemerald-expansion/pull/7382) +* Rock climb by ghoulslash by @pokesidv in [#7432](https://github.com/rh-hideout/pokeemerald-expansion/pull/7432) + - Added rock climb field effect + +### Changed +* Restore git history check by @ravepossum in [#7463](https://github.com/rh-hideout/pokeemerald-expansion/pull/7463) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Changed default print level for DebugPrintf for mGBA to MGBA_LOG_WARN by @hedara90 in [#7567](https://github.com/rh-hideout/pokeemerald-expansion/pull/7567) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Refactor field moves by @cawtds in [#6660](https://github.com/rh-hideout/pokeemerald-expansion/pull/6660) +* Replace all usages of lz compression with smol by @hedara90 in [#7032](https://github.com/rh-hideout/pokeemerald-expansion/pull/7032) +* `BtlController_EmitTwoReturnValues` cleanup by @AsparagusEduardo in [#6855](https://github.com/rh-hideout/pokeemerald-expansion/pull/6855) +* Put the gen 1 compression tests behind a config by @hedara90 in [#7033](https://github.com/rh-hideout/pokeemerald-expansion/pull/7033) +* Converts a bunch of defines to enums by @Bassoonian in [#7041](https://github.com/rh-hideout/pokeemerald-expansion/pull/7041) +* chore: remove unused section from credits by @Emiliasky in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* Simplify white out messages by @kittenchilly in [#6961](https://github.com/rh-hideout/pokeemerald-expansion/pull/6961) +* Improve music/se macros and fix names by @cawtds in [#7030](https://github.com/rh-hideout/pokeemerald-expansion/pull/7030) +* Bag refactor (groundwork for expansion) by @cfmnephrite in [#7018](https://github.com/rh-hideout/pokeemerald-expansion/pull/7018) + - If you're using @ghoulslash's bag sort branch, this PR will break it +* Converts more defines to enums and name unnamed enums by @Bassoonian in [#7071](https://github.com/rh-hideout/pokeemerald-expansion/pull/7071) +* Add config options for removing bard phoneme audio to save ROM space by @poetahto in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* Fix debug text order by @hedara90 in [#7149](https://github.com/rh-hideout/pokeemerald-expansion/pull/7149) +* More battle controller function consolidation. by @AsparagusEduardo in [#6877](https://github.com/rh-hideout/pokeemerald-expansion/pull/6877) +* Easier expandability of debug menu by @AsparagusEduardo in [#6910](https://github.com/rh-hideout/pokeemerald-expansion/pull/6910) +* Update .gitignore to add heal locations by @Bassoonian in [#7050](https://github.com/rh-hideout/pokeemerald-expansion/pull/7050) +* Add 'Give Decoration' function to overworld debug menu by @rayrobdod in [#7219](https://github.com/rh-hideout/pokeemerald-expansion/pull/7219) +* Changes pre-proc to a normal if for Item Desc Header by @AlexOn1ine in [#7231](https://github.com/rh-hideout/pokeemerald-expansion/pull/7231) +* Use compound strings in battle debug menu by @AsparagusEduardo in [#7282](https://github.com/rh-hideout/pokeemerald-expansion/pull/7282) +* Remove competitive syntax config by @hedara90 in [#7154](https://github.com/rh-hideout/pokeemerald-expansion/pull/7154) + - This change can be reverted by doing `git revert 14dbbf63d454073dbb198b941cc3566168c89f11`. +* Turn `OW_FRLG_WHITEOUT` into `OW_WHITEOUT_CUTSCENE` and make it generational by @kittenchilly in [#6962](https://github.com/rh-hideout/pokeemerald-expansion/pull/6962) +* Add `Macro` key to trainerproc by @hedara90 in [#7157](https://github.com/rh-hideout/pokeemerald-expansion/pull/7157) +* preproc: Support __attribute__ in enums by @mrgriffin in [#7344](https://github.com/rh-hideout/pokeemerald-expansion/pull/7344) +* Enum conversion for `enum MoveEffects` and `enum BattleMoveEffects` by @hedara90 in [#7366](https://github.com/rh-hideout/pokeemerald-expansion/pull/7366) + - This enables `-Wenum-conversion`, additional compilation errors can occur +* Get/SetMonData optimisation by @cfmnephrite in [#7313](https://github.com/rh-hideout/pokeemerald-expansion/pull/7313) +* Bag refactor3 + Ghoulslash's sorting feature port by @cfmnephrite in [#7330](https://github.com/rh-hideout/pokeemerald-expansion/pull/7330) +* Replace all usages of rl compression with smol by @rayrobdod in [#7458](https://github.com/rh-hideout/pokeemerald-expansion/pull/7458) +* Bag sorting cleanup by @mrgriffin in [#7489](https://github.com/rh-hideout/pokeemerald-expansion/pull/7489) +* Adds ghouls Rock Climb git history by @AlexOn1ine in [#7493](https://github.com/rh-hideout/pokeemerald-expansion/pull/7493) +* Changed item name/pluralName to a compound string by @cfmnephrite in [#7359](https://github.com/rh-hideout/pokeemerald-expansion/pull/7359) +* Added trainerBackPic to Trainer struct to de-couple trainer pic and trainer back pic defines by @grintoul1 in [#7425](https://github.com/rh-hideout/pokeemerald-expansion/pull/7425) +* Suppress trainerproc compile warning for unused func by @AlexOn1ine in [#7592](https://github.com/rh-hideout/pokeemerald-expansion/pull/7592) + +### Fixed +* Fix .smol compression in debug builds by @hedara90 in [#7090](https://github.com/rh-hideout/pokeemerald-expansion/pull/7090) +* Improve smol compressor by @hedara90 in [#7073](https://github.com/rh-hideout/pokeemerald-expansion/pull/7073) +* Increased heap by 768 bytes by @hedara90 in [#7097](https://github.com/rh-hideout/pokeemerald-expansion/pull/7097) +* Fix healthbox when blending effects happen by @AsparagusEduardo in [#7203](https://github.com/rh-hideout/pokeemerald-expansion/pull/7203) +* Fixed Fake RTC debug menu by @AsparagusEduardo in [#7218](https://github.com/rh-hideout/pokeemerald-expansion/pull/7218) +* Added missing braces by @cfmnephrite in [#7288](https://github.com/rh-hideout/pokeemerald-expansion/pull/7288) +* Fixed Flag Vars menu keeping artifacts from bag menu + cleanup by @AsparagusEduardo in [#7226](https://github.com/rh-hideout/pokeemerald-expansion/pull/7226) +* Fix HGSS dex running out of heap by @hedara90 in [#7317](https://github.com/rh-hideout/pokeemerald-expansion/pull/7317) +* battle intro: fix issues with follower slide-in and wild shiny mon by @mudskipper13 in [#7325](https://github.com/rh-hideout/pokeemerald-expansion/pull/7325) +* Fix sorting bag by type by @mrgriffin in [#7488](https://github.com/rh-hideout/pokeemerald-expansion/pull/7488) +* Hacky support for enums in C asm statements by @mrgriffin in [#7494](https://github.com/rh-hideout/pokeemerald-expansion/pull/7494) +* Fixed compile issue in gcc 11 by @AsparagusEduardo in [#7579](https://github.com/rh-hideout/pokeemerald-expansion/pull/7579) +* Fix overlap between spin evolution and script evolution by @FosterProgramming in [#7593](https://github.com/rh-hideout/pokeemerald-expansion/pull/7593) + +## 🗺️ Overworld 🗺️ +### Added +* Added createfollowernpc macro to make a new follower from a gfx id by @Bivurnum in [#7196](https://github.com/rh-hideout/pokeemerald-expansion/pull/7196) + - Follower NPCs can now be created without using an existing NPC, using the `createfollowernpc` macro. +* feat: separate water and rock smash encounter rate checks by @khbsd in [#7293](https://github.com/rh-hideout/pokeemerald-expansion/pull/7293) + +### Changed +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* added Ash Greninja overworld sprites by @wiz1989 in [#6976](https://github.com/rh-hideout/pokeemerald-expansion/pull/6976) +* Update FRLG whiteouts to new pret system by @Bassoonian in [#7040](https://github.com/rh-hideout/pokeemerald-expansion/pull/7040) + - Make sure to migrate your changes to the now deleted `heal_locations_pkm_center.h` to the json file. +* Use CanAbilityAbsorbMove in GetOverworldTypeEffectiveness by @AlexOn1ine in [#7115](https://github.com/rh-hideout/pokeemerald-expansion/pull/7115) +* Add config options for removing bard phoneme audio to save ROM space by @poetahto in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* Add debug options for follower NPCs by @Bivurnum in [#7215](https://github.com/rh-hideout/pokeemerald-expansion/pull/7215) +* Better system for Follower NPC running frames by @Bivurnum in [#7222](https://github.com/rh-hideout/pokeemerald-expansion/pull/7222) +* Update follower NPC tutorial doc for createfollowernpc macro by @Bivurnum in [#7230](https://github.com/rh-hideout/pokeemerald-expansion/pull/7230) + +### Fixed +* Bug fix: add handling for forced movements into/after ledge jumps with follower NPCs by @Bivurnum in [#7055](https://github.com/rh-hideout/pokeemerald-expansion/pull/7055) +* Fixed compile issue `OW_TIMES_OF_DAY` is `GEN_3` by @AsparagusEduardo in [#7499](https://github.com/rh-hideout/pokeemerald-expansion/pull/7499) +* Remove shadow and hide follower on stair warp by @cornixsenex in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) +* Fix follower compression by @hedara90 in [#7038](https://github.com/rh-hideout/pokeemerald-expansion/pull/7038) +* Changing P_ONLY_OBTAINABLE_SHINIES to truly be Only Obtainable Shinies by @surskitty in [#7275](https://github.com/rh-hideout/pokeemerald-expansion/pull/7275) + +## 🐉 Pokémon 🐉 +### Added +* Add P_ASK_MOVE_CONFIRMATION by @pkmnsnfrn in [#7132](https://github.com/rh-hideout/pokeemerald-expansion/pull/7132) + - This will change the behavior of the game for players, as a new default is being set. +* Added `CRY_MODE_DYNAMAX` by @AsparagusEduardo in [#6933](https://github.com/rh-hideout/pokeemerald-expansion/pull/6933) +* Wild Pokémon animate after breaking out of Poké Ball by @LinathanZel in [#7339](https://github.com/rh-hideout/pokeemerald-expansion/pull/7339) + +### Changed +* Add dedicated getter functions for Pokémon types and abilities by @Bassoonian in [#7043](https://github.com/rh-hideout/pokeemerald-expansion/pull/7043) +* added Ash Greninja overworld sprites by @wiz1989 in [#6976](https://github.com/rh-hideout/pokeemerald-expansion/pull/6976) +* Get/SetMonData optimisation by @cfmnephrite in [#7313](https://github.com/rh-hideout/pokeemerald-expansion/pull/7313) + +### Fixed +* fixes #7129: 'add to full party' feature in the safari zone by @fakuzatsu in [#7147](https://github.com/rh-hideout/pokeemerald-expansion/pull/7147) +* Fix substruct offsets from #7313 by @mrgriffin in [#7431](https://github.com/rh-hideout/pokeemerald-expansion/pull/7431) +* Fixes refusing to replace a move on evolution causing a softlock by @PhallenTree in [#7585](https://github.com/rh-hideout/pokeemerald-expansion/pull/7585) + +## ⚔️ Battle General ⚔️ +### Added +* Add Gen 2 Moonlight, Morning Sun, Synthesis configuration by @i0brendan0 in [#7209](https://github.com/rh-hideout/pokeemerald-expansion/pull/7209) +* Add a heal animation to Hospitality recovery by @AlexOn1ine in [#7426](https://github.com/rh-hideout/pokeemerald-expansion/pull/7426) +* Updated Dream Eater/Liquid Ooze's interaction to Gen 5 standards by @AsparagusEduardo in [#7528](https://github.com/rh-hideout/pokeemerald-expansion/pull/7528) + +### Changed +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Clean up battlescript calls with func BattleScriptCall by @AlexOn1ine in [#6873](https://github.com/rh-hideout/pokeemerald-expansion/pull/6873) +* Refactors Final Gambit + Tests by @AlexOn1ine in [#7005](https://github.com/rh-hideout/pokeemerald-expansion/pull/7005) +* `GetBattlerMon` cleanup by @AsparagusEduardo in [#6967](https://github.com/rh-hideout/pokeemerald-expansion/pull/6967) +* Change GetZMaxMoveAgainstProtectionModifier to prevent regressions by @AlexOn1ine in [#7047](https://github.com/rh-hideout/pokeemerald-expansion/pull/7047) +* Combines Super Fang and Guardian of Alola effects by @AlexOn1ine in [#7048](https://github.com/rh-hideout/pokeemerald-expansion/pull/7048) +* Remove more instances of hard-coded Move IDs by @AsparagusEduardo in [#7056](https://github.com/rh-hideout/pokeemerald-expansion/pull/7056) + - Added `EFFECT_SHEER_COLD` to parametrize Sheer Cold's interactions with Ice types +* Deprecate sStatusFlagsForMoveEffects by @AlexOn1ine in [#7063](https://github.com/rh-hideout/pokeemerald-expansion/pull/7063) +* Removes duplicate AI ability func by @AlexOn1ine in [#7045](https://github.com/rh-hideout/pokeemerald-expansion/pull/7045) +* Deprecate absent member from battlerState by @AlexOn1ine in [#7091](https://github.com/rh-hideout/pokeemerald-expansion/pull/7091) +* Refactor damage calculations aruguments by using a struct context by @AlexOn1ine in [#7108](https://github.com/rh-hideout/pokeemerald-expansion/pull/7108) +* Add damage context to effectiveness multiplier by @AlexOn1ine in [#7111](https://github.com/rh-hideout/pokeemerald-expansion/pull/7111) +* Decouple Status set by ability from SetMoveEffect by @AlexOn1ine in [#7125](https://github.com/rh-hideout/pokeemerald-expansion/pull/7125) +* Removed redundant Damp check by @AsparagusEduardo in [#7134](https://github.com/rh-hideout/pokeemerald-expansion/pull/7134) +* Converted Relic Song into a proper form change by @AsparagusEduardo in [#7139](https://github.com/rh-hideout/pokeemerald-expansion/pull/7139) + - Added `FORM_CHANGE_BATTLE_AFTER_MOVE` to parametrize Relic Song's form change +* Removed Mind Blown effect in favor of move flag by @AsparagusEduardo in [#7138](https://github.com/rh-hideout/pokeemerald-expansion/pull/7138) +* Volatile status refactoring by @cfmnephrite in [#6983](https://github.com/rh-hideout/pokeemerald-expansion/pull/6983) +* Repurposes IsMagicGuardProtected into a general function by @AlexOn1ine in [#7114](https://github.com/rh-hideout/pokeemerald-expansion/pull/7114) +* Stat Change (Animation) Refactor by @PhallenTree in [#7144](https://github.com/rh-hideout/pokeemerald-expansion/pull/7144) + -`setgraphicalstatchangevalues` and `playstatchangeanimation` have been removed and now Stat Change Animations are handled in `statbuffchange`. + - To update your custom battle scripts: + `setgraphicalstatchangevalues` is often accompanied by `playanimation X, B_ANIM_STATS_CHANGE`. When I refer to deleting `setgraphicalstatchangevalues` below, that command should also be deleted. + 1. If `statbuffchange` is before `setgraphicalstatchangevalues`/`playstatchangeanimation` and there is something in between them (for example, `attackanimation` and `waitanimation`), add the flag `STAT_CHANGE_ONLY_CHECKING` and replace the command (`setgraphicalstatchangevalues`/`playstatchangeanimation`) with a copy of the original `statbuffchange`. + 2. If `statbuffchange` is after `setgraphicalstatchangevalues`/`playstatchangeanimation` or there is nothing in between, you should delete those commands (`setgraphicalstatchangevalues`/`playstatchangeanimation`) and no further changes other than those in _3._ should be required. + 3. If `playstatchangeanimation` had bits assigned to them (`BIT_ATK | BIT_SPATK`, for example), add ", " followed by those bits to the first `statbuffchange`; for the following `statbuffchange`s, remove stats that have already been increased/decreased. +* Use `argument.type` for `EFFECT_SOAK` by @AsparagusEduardo in [#7141](https://github.com/rh-hideout/pokeemerald-expansion/pull/7141) +* Untangle `InitBtlControllers` functions by @AsparagusEduardo in [#6748](https://github.com/rh-hideout/pokeemerald-expansion/pull/6748) +* Increase party action limit by @cawtds in [#7119](https://github.com/rh-hideout/pokeemerald-expansion/pull/7119) +* Adds Gen5+ Encore config by @AlexOn1ine in [#7051](https://github.com/rh-hideout/pokeemerald-expansion/pull/7051) +* Attackcanceller clean up by @AlexOn1ine in [#7210](https://github.com/rh-hideout/pokeemerald-expansion/pull/7210) +* Remove redundant move result flag checks by @AlexOn1ine in [#7223](https://github.com/rh-hideout/pokeemerald-expansion/pull/7223) +* Use dedicated functions for Mud/Water Sport by @AlexOn1ine in [#7248](https://github.com/rh-hideout/pokeemerald-expansion/pull/7248) +* Script clean up for Flame Burst and Costar by @AlexOn1ine in [#7264](https://github.com/rh-hideout/pokeemerald-expansion/pull/7264) +* Renaming STATUS1_REFRESH and adding more constants for common STATUS1 checks. by @surskitty in [#7284](https://github.com/rh-hideout/pokeemerald-expansion/pull/7284) +* Refactor move Synchronise by @AlexOn1ine in [#7271](https://github.com/rh-hideout/pokeemerald-expansion/pull/7271) +* Adds hazard queue by @AlexOn1ine in [#7295](https://github.com/rh-hideout/pokeemerald-expansion/pull/7295) +* Removed all instances of .chance = 100, SHEER_FORCE_NO_BOOST by @cfmnephrite in [#7300](https://github.com/rh-hideout/pokeemerald-expansion/pull/7300) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* Replaces STATUS2 usage with volatiles in code by @cfmnephrite in [#7262](https://github.com/rh-hideout/pokeemerald-expansion/pull/7262) + - Replaced all references to STATUS2 in the code with volatiles (but left the old bitfield behind for compatibility with downstream users). The list of volatiles is in `include/constants/battle.h` and includes information such as an enum, a field name, type and max size, and whether or not the move is Baton Passable. Users can use VOLATILE_X with any function that previously took STATUS2_X in scripts, and can check/set volatiles in C with `gBattleMons[battler].volatiles.{field name}` syntax instead of checking a flag in a bitfield. +* Refactor battle environment by @fdeblasio in [#4891](https://github.com/rh-hideout/pokeemerald-expansion/pull/4891) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* Remove leftover code by @AlexOn1ine in [#7397](https://github.com/rh-hideout/pokeemerald-expansion/pull/7397) +* Moved some fields to BattlerState/PartyState by @AsparagusEduardo in [#7409](https://github.com/rh-hideout/pokeemerald-expansion/pull/7409) +* Additional effects tweak by @cfmnephrite in [#7392](https://github.com/rh-hideout/pokeemerald-expansion/pull/7392) +* Clean up noResultString by @AlexOn1ine in [#7408](https://github.com/rh-hideout/pokeemerald-expansion/pull/7408) +* Convert Status4 to volatiles by @AlexOn1ine in [#7411](https://github.com/rh-hideout/pokeemerald-expansion/pull/7411) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Prevents a regression for custom abilties by @AlexOn1ine in [#7616](https://github.com/rh-hideout/pokeemerald-expansion/pull/7616) + +### Fixed +* Fixes Magnet Rise when user is Rooted/Smacked Down by @PhallenTree in [#7449](https://github.com/rh-hideout/pokeemerald-expansion/pull/7449) +* Fixes Leech Seed recovery not applying behind Sub by @AlexOn1ine in [#7468](https://github.com/rh-hideout/pokeemerald-expansion/pull/7468) +* Fixes Round and Fusion moves doubling power from previous turn's move by @PhallenTree in [#7476](https://github.com/rh-hideout/pokeemerald-expansion/pull/7476) +* Fixes shadows and mon animations for transformed battlers by @AsparagusEduardo in [#7500](https://github.com/rh-hideout/pokeemerald-expansion/pull/7500) +* Fixes Life Orb still activating if move was absorbed by @AlexOn1ine in [#7521](https://github.com/rh-hideout/pokeemerald-expansion/pull/7521) +* Fix Mimicry Only Activating Once per Turn by @ghoulslash in [#7537](https://github.com/rh-hideout/pokeemerald-expansion/pull/7537) +* Fixes Knock Off still activating when there is no Item by @AlexOn1ine in [#7496](https://github.com/rh-hideout/pokeemerald-expansion/pull/7496) +* Fixed `B_PSYWAVE_DMG` by @AsparagusEduardo in [#7557](https://github.com/rh-hideout/pokeemerald-expansion/pull/7557) +* Fixes Counter / Mirror Coat / Metal Burst damage assignment by @AlexOn1ine in [#7538](https://github.com/rh-hideout/pokeemerald-expansion/pull/7538) +* Fix in-game partner battles always causing a whiteout by @ravepossum in [#7587](https://github.com/rh-hideout/pokeemerald-expansion/pull/7587) +* Fix B_ANIMATE_MON_AFTER_KO with a new counter by @hedara90 in [#7531](https://github.com/rh-hideout/pokeemerald-expansion/pull/7531) +* Fixes Rage Fist counter increment by @AlexOn1ine in [#7582](https://github.com/rh-hideout/pokeemerald-expansion/pull/7582) +* Fixes moveend_absorb hitmarker by @AlexOn1ine in [#7591](https://github.com/rh-hideout/pokeemerald-expansion/pull/7591) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Fixes Explosion behavior when 3 mons can endure hit by @AlexOn1ine in [#7594](https://github.com/rh-hideout/pokeemerald-expansion/pull/7594) +* Fixes octolock not ending after user switched out by @AlexOn1ine in [#7556](https://github.com/rh-hideout/pokeemerald-expansion/pull/7556) +* The original attacker wasn't restored for Doodle by @AlexOn1ine in [#7620](https://github.com/rh-hideout/pokeemerald-expansion/pull/7620) +* Restore X item friendship increase by @ravepossum in [#7583](https://github.com/rh-hideout/pokeemerald-expansion/pull/7583) +* Fixes Wonder Room interactions with Defense/Special Defense boosting effects by @PhallenTree in [#7626](https://github.com/rh-hideout/pokeemerald-expansion/pull/7626) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) +* Fixes Defiant/Competitive not resetting stat change animations and stat change related cleanup by @PhallenTree in [#7004](https://github.com/rh-hideout/pokeemerald-expansion/pull/7004) +* Use battler arguments for SetMoveEffect by @AlexOn1ine in [#7156](https://github.com/rh-hideout/pokeemerald-expansion/pull/7156) +* Fixes Booster Energy timing activation + Clean up by @AlexOn1ine in [#7175](https://github.com/rh-hideout/pokeemerald-expansion/pull/7175) +* Fixes Eject Pack not resolving correctly during switch in effects by @AlexOn1ine in [#7002](https://github.com/rh-hideout/pokeemerald-expansion/pull/7002) +* Adds Ability Shield activation message by @PhallenTree in [#7224](https://github.com/rh-hideout/pokeemerald-expansion/pull/7224) +* Fix incorrect type input by @hedara90 in [#7228](https://github.com/rh-hideout/pokeemerald-expansion/pull/7228) +* Set correct Instruction by @AlexOn1ine in [#7236](https://github.com/rh-hideout/pokeemerald-expansion/pull/7236) +* Fixes Life Dew playing anim when it is not supposed to + tests by @AlexOn1ine in [#7239](https://github.com/rh-hideout/pokeemerald-expansion/pull/7239) +* Fixes instances of battler mutation for abilities by @AlexOn1ine in [#7250](https://github.com/rh-hideout/pokeemerald-expansion/pull/7250) +* Fix Psych Up message and cleanup and don't allow switching to self in tests by @PhallenTree in [#7277](https://github.com/rh-hideout/pokeemerald-expansion/pull/7277) +* Fix incorrect status in beneficial ability Guts check by @grintoul1 in [#7285](https://github.com/rh-hideout/pokeemerald-expansion/pull/7285) +* battle_interface: overhaul ability pop up by @mudskipper13 in [#7227](https://github.com/rh-hideout/pokeemerald-expansion/pull/7227) + - The layout of the ability pop up's image (`graphics/battle_interface/ability_pop_up.png`) has been changed. +* Fixes Status overwrites and Effect Spore wrong func args by @AlexOn1ine in [#7340](https://github.com/rh-hideout/pokeemerald-expansion/pull/7340) +* Fixes various Choice lock issues by @AlexOn1ine in [#7383](https://github.com/rh-hideout/pokeemerald-expansion/pull/7383) +* Fixes draining moves recovering 1 HP when dealing 0 damage by @LinathanZel in [#7523](https://github.com/rh-hideout/pokeemerald-expansion/pull/7523) + +## 🤹 Moves 🤹 +### Changed +* New Attack Animations: 25w20a by @ShinyVolcarona in [#6886](https://github.com/rh-hideout/pokeemerald-expansion/pull/6886) + - Added move animations for multiple moves by @LinathanZel + - Dynamax Cannon, Behemoth Blade, Behemoth Bash, Eternabeam, Glaive Rush, Triple Dive, Doodle, Ruination, Collision Course, Electro Drift, Blazing Torque, Wicked Torque, Noxious Torque, Combat Torque, Magical Torque, Psyblade, Mighty Cleave, Supercell Slam +* Documented usage of `delay X` by @AsparagusEduardo in [#6951](https://github.com/rh-hideout/pokeemerald-expansion/pull/6951) +* Animation documentation by @AsparagusEduardo in [#7052](https://github.com/rh-hideout/pokeemerald-expansion/pull/7052) +* New and polished battle animations by @LinathanZel in [#7074](https://github.com/rh-hideout/pokeemerald-expansion/pull/7074) + +### Fixed +* Clear gScanlineEffect to fix timeout in acid downpour animation by @FosterProgramming in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* Fix terastallization anims flickering by @ravepossum in [#7613](https://github.com/rh-hideout/pokeemerald-expansion/pull/7613) + +## 🧶 Items 🧶 +### Changed +* Fix using town map as registered item by @ravepossum in [#7482](https://github.com/rh-hideout/pokeemerald-expansion/pull/7482) +* Compound strings for hold effect names by @AsparagusEduardo in [#7140](https://github.com/rh-hideout/pokeemerald-expansion/pull/7140) +* Untangled TMs and HMs from item ids by @cfmnephrite in [#7173](https://github.com/rh-hideout/pokeemerald-expansion/pull/7173) +* Bag refactor 2 by @cfmnephrite in [#7166](https://github.com/rh-hideout/pokeemerald-expansion/pull/7166) + +### Fixed +* Implement using party menu items from field by @ravepossum in [#7481](https://github.com/rh-hideout/pokeemerald-expansion/pull/7481) +* Fixed TM and Berries disappearing when sorting by @AsparagusEduardo in [#7168](https://github.com/rh-hideout/pokeemerald-expansion/pull/7168) +* Fixed item swapping bug (#7428) by @cfmnephrite in [#7430](https://github.com/rh-hideout/pokeemerald-expansion/pull/7430) +* Fixes some Ability Shield interactions by @PhallenTree in [#7532](https://github.com/rh-hideout/pokeemerald-expansion/pull/7532) +* Fix tossing a stack of berries hiding following berries by @hedara90 in [#7571](https://github.com/rh-hideout/pokeemerald-expansion/pull/7571) + +## 🤖 Battle AI 🤖 +### Added +* AI: Add AI_SMART_TERA flag to make smarter decisions about when to terastalize. by @jfb1337 in [#6705](https://github.com/rh-hideout/pokeemerald-expansion/pull/6705) + - Only single battles are currently supported. +* Haze Boosting AI Followup by @Pawkkie in [#6966](https://github.com/rh-hideout/pokeemerald-expansion/pull/6966) +* Improved logic for Guard Split and Power Split. by @surskitty in [#7298](https://github.com/rh-hideout/pokeemerald-expansion/pull/7298) +* Add AI_FLAG_ASSUME_STAB by @Pawkkie in [#6797](https://github.com/rh-hideout/pokeemerald-expansion/pull/6797) +* AI checks the partner's moves for Flatter, Swagger, and Soak. by @surskitty in [#7306](https://github.com/rh-hideout/pokeemerald-expansion/pull/7306) +* AI uses After You to help set up Trick Room. by @surskitty in [#7310](https://github.com/rh-hideout/pokeemerald-expansion/pull/7310) +* AI assumes Magnitude / Present damage by @Pawkkie in [#7334](https://github.com/rh-hideout/pokeemerald-expansion/pull/7334) +* AI_FLAG_ASSUME_STATUS_MOVES -- AI flag to randomly know some of the player's status moves by @surskitty in [#7324](https://github.com/rh-hideout/pokeemerald-expansion/pull/7324) +* Improve AI's setup logic by @Pawkkie in [#7345](https://github.com/rh-hideout/pokeemerald-expansion/pull/7345) +* Improve AI's ShouldRecover by @Pawkkie in [#7342](https://github.com/rh-hideout/pokeemerald-expansion/pull/7342) +* Switch AI can see weather abilities of switchin candidates during damage calcs by @Pawkkie in [#7373](https://github.com/rh-hideout/pokeemerald-expansion/pull/7373) +* AI refactor for weather-setting, terrain-setting, Trick Room behaviors; doubles-focused by @surskitty in [#7319](https://github.com/rh-hideout/pokeemerald-expansion/pull/7319) + - AI is more likely to use Trick Room in double battles and Terrains in general. +* Improve AI type matchup calcs by @Pawkkie in [#7364](https://github.com/rh-hideout/pokeemerald-expansion/pull/7364) +* Multibattle Partner AI Flags and 2vs1 battler3 AI Flags fix by @grintoul1 in [#7378](https://github.com/rh-hideout/pokeemerald-expansion/pull/7378) +* Improve AI's Sucker Punch handling by @Pawkkie in [#7389](https://github.com/rh-hideout/pokeemerald-expansion/pull/7389) +* Improve AI's priority handling by @Pawkkie in [#7337](https://github.com/rh-hideout/pokeemerald-expansion/pull/7337) +* Fix dynamic move types in switching by @Pawkkie in [#7415](https://github.com/rh-hideout/pokeemerald-expansion/pull/7415) +* Adds AI_FLAG_ASSUMPTIONS as a constant for semi-omniscience by @surskitty in [#7435](https://github.com/rh-hideout/pokeemerald-expansion/pull/7435) +* AI_FLAG_ATTACKS_PARTNER with a config for bloodthirstiness by @surskitty in [#7401](https://github.com/rh-hideout/pokeemerald-expansion/pull/7401) +* Improved Guaranteed Flinch logic (fake out et al) by @surskitty in [#7501](https://github.com/rh-hideout/pokeemerald-expansion/pull/7501) +* AI uses Court Change. by @surskitty in [#7525](https://github.com/rh-hideout/pokeemerald-expansion/pull/7525) +* AI uses Tailwind. by @surskitty in [#7515](https://github.com/rh-hideout/pokeemerald-expansion/pull/7515) +* AI should not use Dark Void or Hyperspace Fury while wrong species by @surskitty in [#7540](https://github.com/rh-hideout/pokeemerald-expansion/pull/7540) +* AI uses Rototiller. by @surskitty in [#7542](https://github.com/rh-hideout/pokeemerald-expansion/pull/7542) +* Helping Hand logic by @surskitty in [#7504](https://github.com/rh-hideout/pokeemerald-expansion/pull/7504) + +### Changed +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Remove redundancy for ShouldLowerStat functions by @AlexOn1ine in [#6577](https://github.com/rh-hideout/pokeemerald-expansion/pull/6577) +* Expanding and Refactoring Skill Swap and other ability-changing moves by @surskitty in [#7238](https://github.com/rh-hideout/pokeemerald-expansion/pull/7238) +* Changes AccuracyCalcHelper into CanMoveSkipAccuracyCalc by @AlexOn1ine in [#7303](https://github.com/rh-hideout/pokeemerald-expansion/pull/7303) +* AI Tests + accompanying bugfixes for Skill Swap, Worry Seed, weather setting in double battles, and Discharging into an ally's lightningrod by @surskitty in [#7297](https://github.com/rh-hideout/pokeemerald-expansion/pull/7297) +* Fix AI resisted move scoring by @Pawkkie in [#7350](https://github.com/rh-hideout/pokeemerald-expansion/pull/7350) +* Fiddling with CanLowerStat. by @surskitty in [#7510](https://github.com/rh-hideout/pokeemerald-expansion/pull/7510) +* Improved hazards logic and Mycelium Might ignores ability checks by @surskitty in [#7509](https://github.com/rh-hideout/pokeemerald-expansion/pull/7509) +* AI handling for similar utility moves by @surskitty in [#7513](https://github.com/rh-hideout/pokeemerald-expansion/pull/7513) +* Modify move prediction to work in doubles by @AlexOn1ine in [#7087](https://github.com/rh-hideout/pokeemerald-expansion/pull/7087) +* Uncommenting out No Retreat, Clangorous Soul, and Extreme Evoboost from CheckBadMove by @surskitty in [#7541](https://github.com/rh-hideout/pokeemerald-expansion/pull/7541) +* AI Tailwind singles fix correction. by @surskitty in [#7543](https://github.com/rh-hideout/pokeemerald-expansion/pull/7543) +* Remove funcResult from AiThinkingStruct by @Pawkkie in [#7545](https://github.com/rh-hideout/pokeemerald-expansion/pull/7545) +* AI handling for Autotomize. by @surskitty in [#7550](https://github.com/rh-hideout/pokeemerald-expansion/pull/7550) +* AI uses Stuff Cheeks; treating it simply as a def +2 move for now. by @surskitty in [#7554](https://github.com/rh-hideout/pokeemerald-expansion/pull/7554) +* Slight Purify adjustment for targeting ally; test that AI can use Purify. by @surskitty in [#7553](https://github.com/rh-hideout/pokeemerald-expansion/pull/7553) +* AI handling for Howl. by @surskitty in [#7549](https://github.com/rh-hideout/pokeemerald-expansion/pull/7549) +* Test that AI uses Dragon Cheer. by @surskitty in [#7552](https://github.com/rh-hideout/pokeemerald-expansion/pull/7552) +* Tests to see that the AI uses moves. by @surskitty in [#7555](https://github.com/rh-hideout/pokeemerald-expansion/pull/7555) + +### Fixed +* Incorrect call in Rest by @surskitty in [#7569](https://github.com/rh-hideout/pokeemerald-expansion/pull/7569) +* Fix duplicate switch in after faint by @AlexOn1ine in [#7600](https://github.com/rh-hideout/pokeemerald-expansion/pull/7600) +* Feature/ai/wide guard quick guard singles by @Emiliasky in [#7086](https://github.com/rh-hideout/pokeemerald-expansion/pull/7086) +* Add missing break by @Pawkkie in [#7356](https://github.com/rh-hideout/pokeemerald-expansion/pull/7356) +* fixed-damage-move-ai-calc-fix by @grintoul1 in [#7385](https://github.com/rh-hideout/pokeemerald-expansion/pull/7385) +* Avoid doubling up on status moves in double battles. by @surskitty in [#7452](https://github.com/rh-hideout/pokeemerald-expansion/pull/7452) +* Fix doubles switch AI to use new type matchup system by @Pawkkie in [#7495](https://github.com/rh-hideout/pokeemerald-expansion/pull/7495) +* Fix Bad Odds not seeing damage properly by @Pawkkie in [#7492](https://github.com/rh-hideout/pokeemerald-expansion/pull/7492) +* Fix GetSwitchinHitsToKO one shot heal calcs by @Pawkkie in [#7502](https://github.com/rh-hideout/pokeemerald-expansion/pull/7502) +* Fix AI's KO evaluation getting messed up by priority by @Pawkkie in [#7533](https://github.com/rh-hideout/pokeemerald-expansion/pull/7533) +* Fixing Refresh AI scoring by @surskitty in [#7539](https://github.com/rh-hideout/pokeemerald-expansion/pull/7539) +* Fix switch AI not seeing its own move PP by @Pawkkie in [#7578](https://github.com/rh-hideout/pokeemerald-expansion/pull/7578) +* Fix wrong battler argument in `GetBattleMovePriority` call by @Pawkkie in [#7576](https://github.com/rh-hideout/pokeemerald-expansion/pull/7576) +* Restore AI: Basic Trainer to PARTNER_STEVEN by @grintoul1 in [#7586](https://github.com/rh-hideout/pokeemerald-expansion/pull/7586) + +## 🧹 Other Cleanup 🧹 +* Macro-for-AI-Flag-definitions by @grintoul1 in [#7471](https://github.com/rh-hideout/pokeemerald-expansion/pull/7471) +* Moved summary screen nature colors to summary_screen.h by @RubyRaven6 in [#7560](https://github.com/rh-hideout/pokeemerald-expansion/pull/7560) +* fix: remove unused wild_encounters.json.txt jinja file by @khbsd in [#7581](https://github.com/rh-hideout/pokeemerald-expansion/pull/7581) +* Fix Form Change Item Task Data and Clean Up Field Use Funcs by @ravepossum in [#7535](https://github.com/rh-hideout/pokeemerald-expansion/pull/7535) +* Fixed Teleport's description not being updated based on `B_TELEPORT_BEHAVIOR` by @AsparagusEduardo in [#7580](https://github.com/rh-hideout/pokeemerald-expansion/pull/7580) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Minor Clean up in battle_ai_main.c by @AlexOn1ine in [#7551](https://github.com/rh-hideout/pokeemerald-expansion/pull/7551) +* Remove unused function by @AlexOn1ine in [#7617](https://github.com/rh-hideout/pokeemerald-expansion/pull/7617) +* Fix Vs Seeker Trainer Battle script issue by @pkmnsnfrn in [#7615](https://github.com/rh-hideout/pokeemerald-expansion/pull/7615) +* Clean up battlescript calls with func BattleScriptCall by @AlexOn1ine in [#6873](https://github.com/rh-hideout/pokeemerald-expansion/pull/6873) +* Replace all usages of lz compression with smol by @hedara90 in [#7032](https://github.com/rh-hideout/pokeemerald-expansion/pull/7032) +* `BtlController_EmitTwoReturnValues` cleanup by @AsparagusEduardo in [#6855](https://github.com/rh-hideout/pokeemerald-expansion/pull/6855) +* `GetBattlerMon` cleanup by @AsparagusEduardo in [#6967](https://github.com/rh-hideout/pokeemerald-expansion/pull/6967) +* Converts a bunch of defines to enums by @Bassoonian in [#7041](https://github.com/rh-hideout/pokeemerald-expansion/pull/7041) +* Change GetZMaxMoveAgainstProtectionModifier to prevent regressions by @AlexOn1ine in [#7047](https://github.com/rh-hideout/pokeemerald-expansion/pull/7047) +* Remove more instances of hard-coded Move IDs by @AsparagusEduardo in [#7056](https://github.com/rh-hideout/pokeemerald-expansion/pull/7056) + - Added `EFFECT_SHEER_COLD` to parametrize Sheer Cold's interactions with Ice types +* Animation documentation by @AsparagusEduardo in [#7052](https://github.com/rh-hideout/pokeemerald-expansion/pull/7052) +* Deprecate sStatusFlagsForMoveEffects by @AlexOn1ine in [#7063](https://github.com/rh-hideout/pokeemerald-expansion/pull/7063) +* chore: remove unused section from credits by @Emiliasky in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* Removes duplicate AI ability func by @AlexOn1ine in [#7045](https://github.com/rh-hideout/pokeemerald-expansion/pull/7045) +* Remove redundancy for ShouldLowerStat functions by @AlexOn1ine in [#6577](https://github.com/rh-hideout/pokeemerald-expansion/pull/6577) +* Deprecate absent member from battlerState by @AlexOn1ine in [#7091](https://github.com/rh-hideout/pokeemerald-expansion/pull/7091) +* Use CanAbilityAbsorbMove in GetOverworldTypeEffectiveness by @AlexOn1ine in [#7115](https://github.com/rh-hideout/pokeemerald-expansion/pull/7115) +* Removed redundant Damp check by @AsparagusEduardo in [#7134](https://github.com/rh-hideout/pokeemerald-expansion/pull/7134) +* Improve music/se macros and fix names by @cawtds in [#7030](https://github.com/rh-hideout/pokeemerald-expansion/pull/7030) +* Compound strings for hold effect names by @AsparagusEduardo in [#7140](https://github.com/rh-hideout/pokeemerald-expansion/pull/7140) +* Repurposes IsMagicGuardProtected into a general function by @AlexOn1ine in [#7114](https://github.com/rh-hideout/pokeemerald-expansion/pull/7114) +* Converts more defines to enums and name unnamed enums by @Bassoonian in [#7071](https://github.com/rh-hideout/pokeemerald-expansion/pull/7071) +* Use `argument.type` for `EFFECT_SOAK` by @AsparagusEduardo in [#7141](https://github.com/rh-hideout/pokeemerald-expansion/pull/7141) +* More battle controller function consolidation. by @AsparagusEduardo in [#6877](https://github.com/rh-hideout/pokeemerald-expansion/pull/6877) +* Add assumes for bag tests by @Bassoonian in [#7188](https://github.com/rh-hideout/pokeemerald-expansion/pull/7188) +* Fixes Booster Energy timing activation + Clean up by @AlexOn1ine in [#7175](https://github.com/rh-hideout/pokeemerald-expansion/pull/7175) +* Update .gitignore to add heal locations by @Bassoonian in [#7050](https://github.com/rh-hideout/pokeemerald-expansion/pull/7050) +* Attackcanceller clean up by @AlexOn1ine in [#7210](https://github.com/rh-hideout/pokeemerald-expansion/pull/7210) +* Remove redundant move result flag checks by @AlexOn1ine in [#7223](https://github.com/rh-hideout/pokeemerald-expansion/pull/7223) +* Add P_ASK_MOVE_CONFIRMATION by @pkmnsnfrn in [#7132](https://github.com/rh-hideout/pokeemerald-expansion/pull/7132) + - This will change the behavior of the game for players, as a new default is being set. +* Script clean up for Flame Burst and Costar by @AlexOn1ine in [#7264](https://github.com/rh-hideout/pokeemerald-expansion/pull/7264) +* Use compound strings in battle debug menu by @AsparagusEduardo in [#7282](https://github.com/rh-hideout/pokeemerald-expansion/pull/7282) +* Renaming STATUS1_REFRESH and adding more constants for common STATUS1 checks. by @surskitty in [#7284](https://github.com/rh-hideout/pokeemerald-expansion/pull/7284) +* Removed all instances of .chance = 100, SHEER_FORCE_NO_BOOST by @cfmnephrite in [#7300](https://github.com/rh-hideout/pokeemerald-expansion/pull/7300) +* AI Tests + accompanying bugfixes for Skill Swap, Worry Seed, weather setting in double battles, and Discharging into an ally's lightningrod by @surskitty in [#7297](https://github.com/rh-hideout/pokeemerald-expansion/pull/7297) +* Turn `OW_FRLG_WHITEOUT` into `OW_WHITEOUT_CUTSCENE` and make it generational by @kittenchilly in [#6962](https://github.com/rh-hideout/pokeemerald-expansion/pull/6962) +* Fix AI resisted move scoring by @Pawkkie in [#7350](https://github.com/rh-hideout/pokeemerald-expansion/pull/7350) +* Convert various to callnatives by @AlexOn1ine in [#7355](https://github.com/rh-hideout/pokeemerald-expansion/pull/7355) +* Remove leftover code by @AlexOn1ine in [#7397](https://github.com/rh-hideout/pokeemerald-expansion/pull/7397) +* Moved some fields to BattlerState/PartyState by @AsparagusEduardo in [#7409](https://github.com/rh-hideout/pokeemerald-expansion/pull/7409) +* Additional effects tweak by @cfmnephrite in [#7392](https://github.com/rh-hideout/pokeemerald-expansion/pull/7392) +* Clean up noResultString by @AlexOn1ine in [#7408](https://github.com/rh-hideout/pokeemerald-expansion/pull/7408) +* Bag sorting cleanup by @mrgriffin in [#7489](https://github.com/rh-hideout/pokeemerald-expansion/pull/7489) +* Convert statuses3 to volatiles by @AlexOn1ine in [#7514](https://github.com/rh-hideout/pokeemerald-expansion/pull/7514) +* Uncommenting out No Retreat, Clangorous Soul, and Extreme Evoboost from CheckBadMove by @surskitty in [#7541](https://github.com/rh-hideout/pokeemerald-expansion/pull/7541) +* AI Tailwind singles fix correction. by @surskitty in [#7543](https://github.com/rh-hideout/pokeemerald-expansion/pull/7543) +* Remove funcResult from AiThinkingStruct by @Pawkkie in [#7545](https://github.com/rh-hideout/pokeemerald-expansion/pull/7545) +* Suppress trainerproc compile warning for unused func by @AlexOn1ine in [#7592](https://github.com/rh-hideout/pokeemerald-expansion/pull/7592) +* Prevents a regression for custom abilties by @AlexOn1ine in [#7616](https://github.com/rh-hideout/pokeemerald-expansion/pull/7616) + +## 🧪 Test Runner 🧪 +### Changed +* Clean up some Normalize tests to make them make sense by @hedara90 in [#7461](https://github.com/rh-hideout/pokeemerald-expansion/pull/7461) +* Add Synthesis + Utililty Umbrella test by @ghoulslash in [#7472](https://github.com/rh-hideout/pokeemerald-expansion/pull/7472) +* Add test for BoxPokemon integrity by @hedara90 in [#7487](https://github.com/rh-hideout/pokeemerald-expansion/pull/7487) +* Re-order moves in fling test by @hedara90 in [#7559](https://github.com/rh-hideout/pokeemerald-expansion/pull/7559) +* Wrote some tests by @AsparagusEduardo in [#7563](https://github.com/rh-hideout/pokeemerald-expansion/pull/7563) +* Added Ability TODO tests - Volume C by @AsparagusEduardo in [#7562](https://github.com/rh-hideout/pokeemerald-expansion/pull/7562) +* Added missing Move Effect TODO tests - Volume F by @AsparagusEduardo in [#7605](https://github.com/rh-hideout/pokeemerald-expansion/pull/7605) +* Fixed typo in test name by @hedara90 in [#7610](https://github.com/rh-hideout/pokeemerald-expansion/pull/7610) +* Add assumes for bag tests by @Bassoonian in [#7188](https://github.com/rh-hideout/pokeemerald-expansion/pull/7188) +* Split Sheer Force tests by gen instead of by four by @AlexOn1ine in [#7260](https://github.com/rh-hideout/pokeemerald-expansion/pull/7260) +* make check TESTS="..." support for filenames and infix matches by @mrgriffin in [#7536](https://github.com/rh-hideout/pokeemerald-expansion/pull/7536) +* Fix shell side arm rng in battle tests moves by @FosterProgramming in [#7548](https://github.com/rh-hideout/pokeemerald-expansion/pull/7548) +* Test that AI uses Dragon Cheer. by @surskitty in [#7552](https://github.com/rh-hideout/pokeemerald-expansion/pull/7552) +* Tests to see that the AI uses moves. by @surskitty in [#7555](https://github.com/rh-hideout/pokeemerald-expansion/pull/7555) + +### Fixed +* Clear out parties between battle tests by @hedara90 in [#7460](https://github.com/rh-hideout/pokeemerald-expansion/pull/7460) +* Fixed most failed tests with `GEN_LATEST GEN_8` by @AsparagusEduardo in [#7498](https://github.com/rh-hideout/pokeemerald-expansion/pull/7498) +* Corrected Liquid Ooze test by @AsparagusEduardo in [#7527](https://github.com/rh-hideout/pokeemerald-expansion/pull/7527) +* switchinabilities also runs ON_WEATHER and ON_TERRAIN by @ghoulslash in [#7612](https://github.com/rh-hideout/pokeemerald-expansion/pull/7612) +* Ally Switch attract battler swapping, test for leech seed by @ghoulslash in [#7634](https://github.com/rh-hideout/pokeemerald-expansion/pull/7634) +* Fixed changed effect for Sheer Cold by @hedara90 in [#7099](https://github.com/rh-hideout/pokeemerald-expansion/pull/7099) +* Fixed Transistor damage calculation test failing when `GEN_LATEST` is less than `GEN_9` by @AsparagusEduardo in [#7577](https://github.com/rh-hideout/pokeemerald-expansion/pull/7577) + +## 📚 Documentation 📚 +* Update how_to_new_pokemon.md by @kevinwklawrence in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* Updating a link to porytiles in INSTALL.md by @ThePeeps191 in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* Added comment in event.inc for simple menus in dynmultichoice by @RubyRaven6 in [#7568](https://github.com/rh-hideout/pokeemerald-expansion/pull/7568) +* Documented usage of `delay X` by @AsparagusEduardo in [#6951](https://github.com/rh-hideout/pokeemerald-expansion/pull/6951) +* Update follower NPC tutorial doc for createfollowernpc macro by @Bivurnum in [#7230](https://github.com/rh-hideout/pokeemerald-expansion/pull/7230) +* Improve trainer back pic-related data and code (+ smol documentation) by @mudskipper13 in [#6821](https://github.com/rh-hideout/pokeemerald-expansion/pull/6821) +* Update trainer.h usage warning by @hedara90 in [#7439](https://github.com/rh-hideout/pokeemerald-expansion/pull/7439) + +## New Contributors +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.12.3 + +## New Contributors +* @ShinyVolcarona made their first contribution in [#6886](https://github.com/rh-hideout/pokeemerald-expansion/pull/6886) +* @Emiliasky made their first contribution in [#7085](https://github.com/rh-hideout/pokeemerald-expansion/pull/7085) +* @poetahto made their first contribution in [#7155](https://github.com/rh-hideout/pokeemerald-expansion/pull/7155) +* @Bolt-Strike made their first contribution in [#7103](https://github.com/rh-hideout/pokeemerald-expansion/pull/7103) +* @kevinwklawrence made their first contribution in [#7440](https://github.com/rh-hideout/pokeemerald-expansion/pull/7440) +* @FosterProgramming made their first contribution in [#7442](https://github.com/rh-hideout/pokeemerald-expansion/pull/7442) +* @ThePeeps191 made their first contribution in [#7490](https://github.com/rh-hideout/pokeemerald-expansion/pull/7490) +* @cornixsenex made their first contribution in [#7368](https://github.com/rh-hideout/pokeemerald-expansion/pull/7368) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.12.2...expansion/1.13.0 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 1ac702a4f8..c604aeabb6 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.12.3 +// Last version: 1.13.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 13 #define EXPANSION_VERSION_PATCH 0 From 9ff4c48f7757ca493f6b7c547ef6a3cd2aa8303e Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 28 Aug 2025 16:16:40 +0200 Subject: [PATCH 244/248] Start of 1.13.1 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index c604aeabb6..e4468a82b4 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.13.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 13 -#define EXPANSION_VERSION_PATCH 0 +#define EXPANSION_VERSION_PATCH 1 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif From a4c473e73c4bacc8c60905f98741755455542da9 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 29 Aug 2025 10:11:32 +0200 Subject: [PATCH 245/248] Update README.md (#7639) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6c91a3ad84..93c6b3a913 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # About `pokeemerald-expansion` -![Gif that shows debugging functionality that is unique to pokeemerald-expansion such as rerolling Trainer Id, Cheat Start, PC from Debug Menu, Debug PC Fill, Pokemon Sprite Visualizer, Debug Warp to Map, and Battle Debug Menu](https://github.com/user-attachments/assets/cf9dfbee-4c6b-4bca-8e0a-07f116ef891c) ![Gif that shows overworld functionality that is unique to pokeemerald-expansion such as indoor running, BW2 style map popups, overworld followers, DNA Splicers, Gen 1 style fishing, OW Item descriptions, Quick Run from Battle, Use Last Ball, Wild Double Battles, and Catch from EXP](https://github.com/user-attachments/assets/383af243-0904-4d41-bced-721492fbc48e) ![Gif that shows off a number of modern Pokemon battle mechanics happening in the pokeemerald-expansion engine: 2 vs 1 battles, modern Pokemon, items, moves, abilities, fully customizable opponents and partners, Trainer Slides, and generational gimmicks](https://github.com/user-attachments/assets/50c576bc-415e-4d66-a38f-ad712f3316be) +![Gif that shows debugging functionality that is unique to pokeemerald-expansion such as rerolling Trainer ID, Cheat Start, PC from Debug Menu, Debug PC Fill, Pokémon Sprite Visualizer, Debug Warp to Map, and Battle Debug Menu](https://github.com/user-attachments/assets/cf9dfbee-4c6b-4bca-8e0a-07f116ef891c) ![Gif that shows overworld functionality that is unique to pokeemerald-expansion such as indoor running, BW2 style map popups, overworld followers, DNA Splicers, Gen 1 style fishing, OW Item descriptions, Quick Run from Battle, Use Last Ball, Wild Double Battles, and Catch from EXP](https://github.com/user-attachments/assets/383af243-0904-4d41-bced-721492fbc48e) ![Gif that shows off a number of modern Pokémon battle mechanics happening in the pokeemerald-expansion engine: 2 vs 1 battles, modern Pokémon, items, moves, abilities, fully customizable opponents and partners, Trainer Slides, and generational gimmicks](https://github.com/user-attachments/assets/50c576bc-415e-4d66-a38f-ad712f3316be) @@ -8,7 +8,7 @@ # [Features](FEATURES.md) -**`pokeemerald-expansion`** offers hundreds of features from various [core series Pokémon games](https://bulbapedia.bulbagarden.net/wiki/Core_series), along with popular quality-of-life enhancements designed to streamline development and improve the player experience. A full list of those featues can be found in [`FEATURES.md`](FEATURES.md). +**`pokeemerald-expansion`** offers hundreds of features from various [core series Pokémon games](https://bulbapedia.bulbagarden.net/wiki/Core_series), along with popular quality-of-life enhancements designed to streamline development and improve the player experience. A full list of those features can be found in [`FEATURES.md`](FEATURES.md). # [Credits](CREDITS.md) @@ -32,7 +32,7 @@ Please consider [crediting all contributors](CREDITS.md) involved in the project ❗❗ **Important**: Do not use GitHub's "Download Zip" option as it will not include commit history. This is necessary if you want to update or merge other feature branches. -If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide on forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides: +If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide to forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides: ## 📥 [Installing **`pokeemerald-expansion`**](INSTALL.md) ## 🏗️ [Building **`pokeemerald-expansion`**](INSTALL.md#Building-pokeemerald-expansion) @@ -50,4 +50,4 @@ If you are looking to [report a bug](CONTRIBUTING.md#Bug-Report), [open a pull r [![](https://dcbadge.limes.pink/api/server/6CzjAG6GZk)](https://discord.gg/6CzjAG6GZk) -Our community uses the [Rom Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! +Our community uses the [ROM Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! From 7302de4209491ed30d214f3d1ed2182b2f58bb47 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 30 Aug 2025 11:22:02 +0200 Subject: [PATCH 246/248] Replace boolean multiplications with ternaries (#7653) Co-authored-by: Hedara --- src/battle_script_commands.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c08324b6e8..6845e760f4 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1630,12 +1630,12 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA } else { - critChance = 2 * (gBattleMons[battlerAtk].volatiles.focusEnergy != 0) - + 1 * (gBattleMons[battlerAtk].volatiles.dragonCheer != 0) + critChance = (gBattleMons[battlerAtk].volatiles.focusEnergy != 0 ? 2 : 0) + + (gBattleMons[battlerAtk].volatiles.dragonCheer != 0 ? 1 : 0) + GetMoveCriticalHitStage(move) + GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk) - + 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) - + (abilityAtk == ABILITY_SUPER_LUCK) + + ((B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) ? 2 : 0) + + (abilityAtk == ABILITY_SUPER_LUCK ? 1 : 0) + gBattleStruct->bonusCritStages[gBattlerAttacker]; if (critChance >= ARRAY_COUNT(sCriticalHitOdds)) From 674cd136595cb5cd700c0bc869f0b85c75a227fa Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sun, 31 Aug 2025 14:53:23 -0400 Subject: [PATCH 247/248] Added sortType to Douse Drive (#7664) --- src/data/items.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/items.h b/src/data/items.h index d86a610eb4..9927191d64 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -5033,6 +5033,7 @@ const struct Item gItemsInfo[] = "Techno Blast to\n" "Water-type."), .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_DRIVE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, From 84f5aa6dae62da212efa2e8de11585bad189a031 Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 1 Sep 2025 15:43:04 -0400 Subject: [PATCH 248/248] Helping Hand bugfix; used FOE instead of BATTLE_OPPOSITE. (#7659) --- src/battle_ai_main.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ebbabf93c8..0623faf864 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1,3 +1,5 @@ +// Note that FOE specifically returns the left-side battler; BATTLE_OPPOSITE is the diagonal. + #include "global.h" #include "main.h" #include "malloc.h" @@ -3098,45 +3100,44 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, FOE(battlerAtk), AI_ATTACKING); - u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, FOE(battlerAtk), AI_ATTACKING); - u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, FOE(battlerAtkPartner), AI_ATTACKING); - u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, FOE(battlerAtkPartner), AI_ATTACKING); + u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, BATTLE_OPPOSITE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), AI_ATTACKING); + u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), AI_ATTACKING); + u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), AI_ATTACKING); if (hasTwoOpponents) { // Might be about to die - if (CanTargetFaintAi(FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(FOE(battlerAtkPartner), battlerAtk) - && AI_IsSlower(battlerAtk, FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) - && AI_IsSlower(battlerAtk, FOE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) && CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) + && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1 && ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) ADJUST_SCORE(GOOD_EFFECT); } - else if (IsBattlerAlive(FOE(battlerAtk))) + else if (IsBattlerAlive(BATTLE_OPPOSITE(battlerAtk))) { // Might be about to die - if (CanTargetFaintAi(FOE(battlerAtk), battlerAtk) - && AI_IsSlower(battlerAtk, FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1) ADJUST_SCORE(GOOD_EFFECT); } - else if (IsBattlerAlive(FOE(battlerAtkPartner))) + else if (IsBattlerAlive(BATTLE_OPPOSITE(battlerAtkPartner))) { // Might be about to die - if (CanTargetFaintAi(FOE(battlerAtkPartner), battlerAtk) - && AI_IsSlower(battlerAtk, FOE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) + && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) ADJUST_SCORE(GOOD_EFFECT); - } - + } } break; case EFFECT_PERISH_SONG: