diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 0e0a56bec..c1942d76e 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -76,6 +76,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER .4byte gFieldEffectScript_TracksBug @ FLDEFF_TRACKS_BUG .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT + .4byte gFieldEffectScript_SnowFootprints @ FLDEFF_SNOW_FOOTPRINTS gFldEffScript_ExclamationMarkIcon:: callnative FldEff_ExclamationMarkIcon1 @@ -360,3 +361,7 @@ gFieldEffectScript_TracksSpot:: gFieldEffectScript_TracksSlither:: loadfadedpal_callnative gSpritePalette_GeneralFieldEffect0, FldEff_TracksSlither end + +gFieldEffectScript_SnowFootprints:: + loadfadedpal_callnative gSpritePalette_GeneralFieldEffect2, FldEff_SnowFootprints + end diff --git a/data/tilesets/primary/general_winter/metatile_attributes.bin b/data/tilesets/primary/general_winter/metatile_attributes.bin index 45f6f352e..f539e9cd7 100644 Binary files a/data/tilesets/primary/general_winter/metatile_attributes.bin and b/data/tilesets/primary/general_winter/metatile_attributes.bin differ diff --git a/graphics/field_effects/palettes/general_2.pal b/graphics/field_effects/palettes/general_2.pal new file mode 100644 index 000000000..ee050e18a --- /dev/null +++ b/graphics/field_effects/palettes/general_2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 238 +204 204 204 +170 170 170 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 diff --git a/graphics/field_effects/pics/pokefirered.gba:Zone.Identifier b/graphics/field_effects/pics/pokefirered.gba:Zone.Identifier new file mode 100644 index 000000000..e69de29bb diff --git a/graphics/field_effects/pics/snow_footprints.png b/graphics/field_effects/pics/snow_footprints.png new file mode 100644 index 000000000..b585d5404 Binary files /dev/null and b/graphics/field_effects/pics/snow_footprints.png differ diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 6505b9602..69c048755 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -75,11 +75,13 @@ #define FLDEFF_TRACKS_SLITHER 70 #define FLDEFF_TRACKS_SPOT 71 #define FLDEFF_TRACKS_BUG 72 +#define FLDEFF_SNOW_FOOTPRINTS 73 -#define FLDEFF_COUNT 73 +#define FLDEFF_COUNT 74 #define FLDEFF_PAL_TAG_GENERAL_0 0x1004 #define FLDEFF_PAL_TAG_GENERAL_1 0x1005 +#define FLDEFF_PAL_TAG_GENERAL_2 0x1006 #define FLDEFF_PAL_TAG_POKEBALL_TRAIL 0x1009 #define FLDEFF_PAL_TAG_ASH 0x100D #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F @@ -124,5 +126,6 @@ #define FLDEFFOBJ_TRACKS_SLITHER 37 #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 +#define FLDEFFOBJ_SNOW_FOOTPRINTS 40 #endif // GUARD_CONSTANTS_FIELD_EFFECTS_H diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 38a02075f..1c5894fe1 100644 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -127,6 +127,7 @@ // #define MB_CYCLING_ROAD_PULL_DOWN 0xD0 #define MB_CYCLING_ROAD_PULL_DOWN_GRASS 0xD1 +#define MB_SNOW 0xEF // #define NUM_METATILE_BEHAVIORS 0xF0 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 64aafce21..b17ea052f 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -78,6 +78,7 @@ typedef void (*MovementAction)(u8 direction); #define GROUND_EFFECT_FLAG_SHORT_GRASS (1 << 17) #define GROUND_EFFECT_FLAG_HOT_SPRINGS (1 << 18) #define GROUND_EFFECT_FLAG_SEAWEED (1 << 19) +#define GROUND_EFFECT_FLAG_SNOW (1 << 20) struct PairedPalettes { diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index e378e77ff..7f090ea62 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -135,5 +135,6 @@ bool8 MetatileBehavior_IsBurglary(u8 metatileBehavior); bool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior); bool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior); bool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior); +bool8 MetatileBehavior_IsSnow(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR 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 1f5c27ed4..a00bb1543 100644 --- a/src/data/field_effects/field_effect_object_template_pointers.h +++ b/src/data/field_effects/field_effect_object_template_pointers.h @@ -10,6 +10,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow; const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass; const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints; +const struct SpriteTemplate gFieldEffectObjectTemplate_SnowFootprints; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash; const struct SpriteTemplate gFieldEffectObjectTemplate_Splash; const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash; @@ -72,4 +73,5 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { [FLDEFFOBJ_ASH_LAUNCH] = &gFieldEffectObjectTemplate_AshLaunch, [FLDEFFOBJ_BUBBLES] = &gFieldEffectObjectTemplate_Bubbles, [FLDEFFOBJ_SMALL_SPARKLE] = &gFieldEffectObjectTemplate_SmallSparkle, + [FLDEFFOBJ_SNOW_FOOTPRINTS] = &gFieldEffectObjectTemplate_SnowFootprints, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 96ff54209..448b100f6 100644 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -3,6 +3,7 @@ const struct SpritePalette gSpritePalette_GeneralFieldEffect1 = { .data = gField const struct SpritePalette gSpritePalette_GeneralFieldEffect1Summer = { .data = gFieldEffectObjectPalette1Summer, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; const struct SpritePalette gSpritePalette_GeneralFieldEffect1Autumn = { .data = gFieldEffectObjectPalette1Autumn, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; const struct SpritePalette gSpritePalette_GeneralFieldEffect1Winter = { .data = gFieldEffectObjectPalette1Winter, .tag = FLDEFF_PAL_TAG_GENERAL_1 }; +const struct SpritePalette gSpritePalette_GeneralFieldEffect2 = { .data = gFieldEffectObjectPalette2, .tag = FLDEFF_PAL_TAG_GENERAL_2 }; static const union AnimCmd sAnim_Shadow[] = { @@ -462,6 +463,23 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = .callback = UpdateFootprintsTireTracksFieldEffect, }; +static const struct SpriteFrameImage sPicTable_SnowFootprints[] = +{ + overworld_frame(gFieldEffectObjectPic_SnowFootprints, 2, 2, 0), + overworld_frame(gFieldEffectObjectPic_SnowFootprints, 2, 2, 1), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_SnowFootprints = +{ + .tileTag = TAG_NONE, + .paletteTag = FLDEFF_PAL_TAG_GENERAL_2, + .oam = &gObjectEventBaseOam_16x16, + .anims = sAnimTable_SandFootprints, + .images = sPicTable_SnowFootprints, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateFootprintsTireTracksFieldEffect, +}; + static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = { overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 0), diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 35c5a3fea..b186245c4 100644 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -202,6 +202,7 @@ const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effects/pale const u16 gFieldEffectObjectPalette1Summer[] = INCBIN_U16("graphics/field_effects/palettes/general_1_summer.gbapal"); const u16 gFieldEffectObjectPalette1Autumn[] = INCBIN_U16("graphics/field_effects/palettes/general_1_autumn.gbapal"); const u16 gFieldEffectObjectPalette1Winter[] = INCBIN_U16("graphics/field_effects/palettes/general_1_winter.gbapal"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effects/palettes/general_2.gbapal"); const u16 sFiller2[0x10] = {}; const u16 gFieldEffectObjectPic_GroundImpactDust[] = INCBIN_U16("graphics/field_effects/pics/ground_impact_dust.4bpp"); const u16 gFieldEffectObjectPic_UnusedGrass3[] = INCBIN_U16("graphics/field_effects/pics/unused_grass_3.4bpp"); // Unused @@ -217,6 +218,7 @@ const u16 gFieldEffectObjectPic_TallGrassAutumn[] = INCBIN_U16("graphics/field_e const u16 gFieldEffectObjectPic_TallGrassWinter[] = INCBIN_U16("graphics/field_effects/pics/tall_grass_winter.4bpp"); const u16 gFieldEffectObjectPic_ShortGrass[] = INCBIN_U16("graphics/field_effects/pics/short_grass.4bpp"); const u16 gFieldEffectObjectPic_SandFootprints[] = INCBIN_U16("graphics/field_effects/pics/sand_footprints.4bpp"); +const u16 gFieldEffectObjectPic_SnowFootprints[] = INCBIN_U16("graphics/field_effects/pics/snow_footprints.4bpp"); const u16 gFieldEffectObjectPic_DeepSandFootprints[] = INCBIN_U16("graphics/field_effects/pics/deep_sand_footprints.4bpp"); const u16 gFieldEffectObjectPic_BikeTireTracks[] = INCBIN_U16("graphics/field_effects/pics/bike_tire_tracks.4bpp"); const u16 gFieldEffectObjectPic_UnusedSand[] = INCBIN_U16("graphics/field_effects/pics/unused_sand.4bpp"); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f3f831dbf..4c61a375a 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -9599,6 +9599,10 @@ static void GetGroundEffectFlags_Tracks(struct ObjectEvent *objEvent, u32 *flags { *flags |= GROUND_EFFECT_FLAG_SAND; } + else if (MetatileBehavior_IsSnow(objEvent->previousMetatileBehavior)) + { + *flags |= GROUND_EFFECT_FLAG_SNOW; + } } static void GetGroundEffectFlags_SandHeap(struct ObjectEvent *objEvent, u32 *flags) @@ -10017,6 +10021,12 @@ void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 0); } +void GroundEffects_Snow(struct ObjectEvent *objEvent, struct Sprite *sprite) +{ + const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); + sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 2); +} + void GroundEffect_DeepSandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); @@ -10030,9 +10040,10 @@ static void DoTracksGroundEffect_None(struct ObjectEvent *objEvent, struct Sprit static void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) { // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { + u16 sandFootprints_FieldEffectData[3] = { FLDEFF_SAND_FOOTPRINTS, - FLDEFF_DEEP_SAND_FOOTPRINTS + FLDEFF_DEEP_SAND_FOOTPRINTS, + FLDEFF_SNOW_FOOTPRINTS, }; gFieldEffectArguments[0] = objEvent->previousCoords.x; @@ -10179,7 +10190,8 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_JumpLandingDust, GroundEffect_ShortGrass, GroundEffect_HotSprings, - GroundEffect_Seaweed + GroundEffect_Seaweed, + GroundEffects_Snow, }; static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 346d30163..295ce85f8 100644 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -674,6 +674,24 @@ u32 FldEff_SandFootprints(void) return 0; } +u32 FldEff_SnowFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SNOW_FOOTPRINTS], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[7] = FLDEFF_SNOW_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return 0; +} + u32 FldEff_DeepSandFootprints(void) { u8 spriteId; diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index ce2736647..c01280df4 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -77,6 +77,11 @@ bool8 MetatileBehavior_IsSand(u8 metatileBehavior) return FALSE; } +bool8 MetatileBehavior_IsSnow(u8 metatileBehavior) +{ + return metatileBehavior == MB_SNOW; +} + bool8 MetatileBehavior_IsSandOrShallowFlowingWater(u8 metatileBehavior) { if (metatileBehavior == MB_SAND || metatileBehavior == MB_SHALLOW_WATER)