Repository navigation
For Mod Authors
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).
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.
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.
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).
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.
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.
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.
- 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, andLandscapeTextureare 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.