Skip to content
Cl3mus33 edited this page Aug 27, 2026 · 2 revisions

For Mod Authors: A Practical Guide

Naming Conventions is the quick-reference table. This page walks through actual file layouts — statics, landscape textures, grass, and PBR — so you can see exactly what to drop next to your existing files to get automatic seasonal support, with no ini or plugin work on your end.

The short version: put a season-suffixed copy next to the base file, same folder, same name plus a suffix. AutoSeasons does the rest — finding it, duplicating the record, and writing the ini. You never need to touch Data/Seasons yourself unless you specifically want to declare your own swap instead of letting AutoSeasons generate one (see Opting out, below).

Example 1: A simple retexture (static/activator/furniture/tree/flora)

Say you're retexturing a rock formation used by a Static record, currently:

textures\landscape\rocks\rock01.dds
textures\landscape\rocks\rock01_n.dds      (normal map)

To add a winter variant, ship:

textures\landscape\rocks\rock01.dds
textures\landscape\rocks\rock01_n.dds
textures\landscape\rocks\rock01_win.dds     <- new
textures\landscape\rocks\rock01_win_n.dds   <- new

That's it. AutoSeasons finds rock01_win.dds, sees it shares the same base name and folder as the Static's existing diffuse texture, and generates a winter duplicate of every record using that texture — automatically also picking up rock01_win_n.dds as its normal map, and any other shader slot (environment mask, parallax, glow, etc.) that follows the same <base>_win<suffix> pattern.

You don't have to provide all four seasons. If you only ship a winter variant, only a winter duplicate gets generated — spring/summer/autumn are left showing your base texture, unchanged.

Accepted suffixes (case-insensitive): _win/_winter, _spr/_spring, _sum/_summer, _aut/_autumn/_fall. Full detail in Naming Conventions.

Example 2: A landscape texture (LandscapeTexture / LTEX)

Landscape textures work the same way, just at the LandscapeTexture record level instead of Static:

textures\landscape\dirt02.dds
textures\landscape\dirt02_n.dds
textures\landscape\dirt02_aut.dds     <- new
textures\landscape\dirt02_aut_n.dds   <- new

Any LandscapeTexture record whose diffuse is dirt02.dds gets an autumn duplicate pointed at dirt02_aut.dds.

Grass rides along automatically — with one extra step

If your landscape texture has a Grasses list (grass placed on that terrain type), AutoSeasons carries that same grass list over to the seasonal duplicate by default — so your autumn dirt texture still grows the same grass it always did, unless you also ship seasonal grass meshes (see Example 3) or opt into dropping grass entirely for winter (Remove grass in winter in Using AutoSeasons — end-user setting, on by default).

Example 3: Seasonal grass meshes

Grass uses a slightly different (wider) suffix list than everything else, because several existing grass packs already use short two-letter forms:

meshes\landscape\grass\grass01.nif
meshes\landscape\grass\grass01_sn.nif      <- winter (Cathedral-style short form)

or equivalently:

meshes\landscape\grass\grass01_winter.nif

Both are recognized. Full list: winter win/winter/sn, spring spr/spring/sp, summer sum/summer/su, autumn aut/autumn/fall/au.

Important: grass in Skyrim isn't a placed object — it's drawn from whichever LandscapeTexture's Grasses list currently wins on a patch of terrain. This means shipping a seasonal grass mesh only matters for grass types that are actually referenced by a LandscapeTexture's Grasses list somewhere in the load order. A grass mesh sitting unreferenced on disk does nothing.

If a LandscapeTexture references several grass types and only some of them have a winter variant, AutoSeasons decides this per grass slot, not per texture — types with a winter mesh use it, types without one either keep showing their base appearance or get dropped for winter, depending on the end user's Remove grass in winter setting.

Authoring a dedicated grass mod (not just adding a seasonal variant to an existing one)? See the Grass Mod Guide for the full mechanism, including the alternative of authoring your own seasonal Grass record by EditorID instead of relying on the mesh-naming convention.

Example 4: PBR textures

If you're shipping Community Shaders PBR variants, mirror the vanilla path under textures\pbr\, exactly like PGPatcher's own convention:

textures\pbr\landscape\rocks\rock01_win.dds
textures\pbr\landscape\rocks\rock01_win_n.dds
textures\pbr\landscape\rocks\rock01_win_rmaos.dds

If your mod already ships a PBRNIFPatcher\...\rock01.json rule for the base texture, AutoSeasons reuses its non-slot settings (roughness scale, subsurface, multilayer, etc.) when it authors the seasonal rule, so your PBR tuning carries over to the seasonal variant automatically.

If your rule for a variant happens to omit the normal or RMAOS slot, AutoSeasons still fills it in from <base>_n.dds / <base>_rmaos.dds if that file genuinely exists on disk — but it's best practice to author your own PBR rules completely rather than rely on that fallback. See PBR Support for the full mechanics, including how DefaultPBRLand is handled.

Opting out: shipping your own Data/Seasons ini instead

If you'd rather hand-author your own seasonal swap for a record — a custom grass rotation, a non-standard naming scheme, anything AutoSeasons' file-convention detection wouldn't catch on its own — ship your own Data/Seasons/*.ini the same way Seasons of Skyrim itself expects. AutoSeasons detects any foreign mod's own declared coverage and defers to it by default (see Season Mod Conflicts), so your own swap and AutoSeasons' generated ones coexist without fighting each other — you don't need to do anything special to make AutoSeasons step aside.

Checklist before you ship

  • Seasonal files live in the exact same folder as the base file, with only the suffix added to the filename.
  • You're not relying on a record type AutoSeasons doesn't scan — only Static, Activator, Furniture, MovableStatic, Tree, Flora, and LandscapeTexture are covered.
  • If it's interior-only content, don't expect AutoSeasons' defaults to pick it up — interiors are excluded by default on the end-user side (tunable, but off out of the box).
  • For PBR, your seasonal variant sits under the same textures\pbr\... mirror as your base PBR texture, and (ideally) has its own complete PBRNIFPatcher rule.
  • Test with AutoSeasons' Preview only (dry run) option and check the log — it reports exactly what it did and didn't pick up, which is the fastest way to confirm your naming is being recognized correctly.

Clone this wiki locally