Reference
File formats
Every file type a mod can ship, its syntax, where it goes, and how a later mod overrides it.
| Extension / file | Syntax | Where | Identity | Override | Page |
|---|---|---|---|---|---|
.ulmod |
KEY: value |
Mod root | Folder name | — | Anatomy |
.ulscene |
Lua table | Anywhere | File name | Replace | Scenes |
.ulaction |
Lua table | Anywhere | ACTION_UNIQUEID |
Replace | Actions |
.ulstat |
Lua table | Anywhere | STAT_ID |
Replace | Stats |
.ulquest |
Lua table | Anywhere | QUEST_UNIQUEID |
Replace | Quests |
.ultip |
Lua table | Anywhere | — (all shown) | Add | Small content |
.ulmajors |
Lua list | Anywhere | Major NAME |
Replace per major | Jobs |
.ulhistory |
Lua list | History/ |
Event id |
Replace per event | History |
Lua/*.lua |
Lua code | Lua/ |
— (all run) | Run after | Libraries |
AI/*.lua |
Lua function body | AI/, AI/high_priority/ |
— (all run) | Add | NPC routines |
Map/Hud/*.lua, Menu/*.lua |
Lua table | those folders | — | Add | Mod UI |
.uldesc, .ultalk |
Line bank (## entries) |
Anywhere | — | Add | Sex scenes |
.ulanimtags |
Base=Tag|Tag lines |
Anywhere | Base name | Replace per name | Animations |
.ulactivity |
JSON | Animations/ |
Activity id | Replace per id | Animations |
.ulcharacter |
CATEGORY Param: w% value |
Anywhere | File name | Replace | Presets |
.ulcloth |
Key: value |
Clothes/ |
File name | Replace | Clothing |
.ulhair |
Key: value |
Hair/ |
File name | Replace | Hair |
.ulhairphysics |
Key: value |
HairPhysics/ |
Key | Replace per key | Hair |
.ulbody |
Key: value |
Bodies/ |
File name | Replace | Bodies |
.ulheight |
JSON | Bodies/ |
Mesh path | Replace per mesh | Bodies |
.ulskin |
Key: value + pictures |
Skins/ |
File name | Replace | Bodies |
.ulrig |
Key: value |
Rigs/ |
G8 bone | Add names | Bodies |
.ulpenis |
JSON | Bodies/ |
Control name | Replace per control | Bodies |
.ulitem |
Key: value |
Items/ |
File name | Replace | Shops |
.ulrarity |
JSON | Items/ |
Tier id |
Replace per tier | Clothing |
room_objects.json |
JSON | Items/ |
Kind key | Replace per field | Shops |
storage.json |
JSON | Items/ |
containers: rule; other tables: key |
containers added in front; the rest replace per key |
Shops |
.ulperk |
JSON | Perks/ |
Perk / branch id |
Replace per id | Perks |
.ulknowledge |
JSON | Knowledge/ |
Node / field id |
Replace per id | Knowledge |
.uljobs |
Lua list | Jobs/ |
Job ID |
Replace per job | Jobs |
.ulshop |
Key: value + Item: lines |
Shops/ |
File name | Replace | Shops |
.ulcity |
Key: value |
Cities/ |
File name | Replace | Cities |
.osm |
OpenStreetMap XML | Cities/ |
File name | Replace | Cities |
Phenotypes.txt |
key: Ethnicity | Label |
Cities/ |
Phenotype | Add | Cities |
Names/*.txt, Names/<culture>/*.txt, Names/cultures.txt |
One name per line; cultures.txt: <Ethnicity>: culture weight, ... |
Names/ |
— | Merge (a cultures.txt line replaces that ethnicity's) |
Cities |
amenities.json |
JSON | Map/ |
Venue tag | Merge per field | Map |
city_styles.json |
JSON | Map/ |
Style name | Replace per style | Map |
vehicles.json (+ loose .glb) |
JSON | Map/ |
Vehicle id | Replace per vehicle; traffic merges per field |
Map |
player_panel.json |
JSON | Map/ |
Stat id | Add / remove | Stats |
.ullook |
JSON | Looks/ |
Venue tag | Merge per field | Looks |
.ulweather |
JSON | Weather/ |
Type or climate id | Replace | Weather and seasons |
.ulaudio (+ loose .mp3/.wav/.flac) |
JSON | Audio/ |
Cue name | Replace per cue | Sound |
.ulvoice |
JSON | Voice/Voices/ |
Id |
Replace per voice | Spoken lines |
Moods.ulvoicemood |
JSON | Voice/ |
Mood name | Replace per mood | Spoken lines |
Engine.ulvoiceengine |
JSON | Voice/ |
— | Last mod wins | Spoken lines |
.ulroom |
Lua table | Rooms/ |
AMENITY |
Replace | Rooms |
.ulgrammar |
Lua table | Rooms/Grammars/ |
NAME / file name |
Replace | Rooms |
.ulset |
JSON (generated) | Rooms/Sets/<Set>/ |
Set folder | Replace | Rooms |
.ultheme |
JSON | Rooms/Sets/<Set>/ |
— | — | Rooms |
.ulmat |
JSON (generated) | Rooms/Sets/<Set>/Pieces/<Set>/ |
Piece name | Replace | Rooms |
.ulroomlayout |
JSON | Rooms/Layouts/ |
File name | Add | Rooms |
canvas.ulcanvas (+ .jpg/.png) |
JSON | Rooms/Canvas/ |
Rules: tried mod first; images: file | Rules added in front; images added | Rooms |
FeatureMorphs.txt |
Page.Group: Morph = Label |
CharGen/ |
Group | Merge | Character creator |
MorphMap.txt |
Control = Dial*w + … |
CharGen/ |
Control | — | Character creator |
outfits_<F|M>[_set].txt |
item-id blocks | Clothes/Outfits/ |
— | Added together | People |
uniforms.txt |
4-line blocks | Clothes/Outfits/ |
Name | Replace per name | People |
restraints.txt |
name = a + b, c |
Clothes/Outfits/ |
Name | Replace per name | People |
MorphAliases.txt |
name = Dial*w + … | Dial*w … |
CharGen/ |
Name | Replace per name | Character creator |
.png |
Image | Images/, Map/Icons/, Thumbs/, Loading/… |
Relative path | Replace | Assets |
.fbx |
Daz Studio export, Genesis 8 | Meshes/ |
Relative path | Replace | Assets |
.glb |
glTF binary | Rooms/ |
Relative path | Replace | Rooms |
A generated set's catalog.ulset describes each piece in cm from its origin (the centre of its footprint on the floor), with x to the right, y to the back and z up; the front faces −y. Besides its size, a piece can carry:
levels: the surfaces things stand on,[[z, x0, y0, x1, y1, clear], …].parts: its doors, lids and drawers. A part that moves has its ownlevels(a drawer's floor, the racks inside a fridge door).rails: its hanging rails,[[z, x0, y0, x1, y1, drop], …].
The shapes are described under Rooms.
Syntax families
- Lua table files
return { … }and are read as data: no game functions are available while they load. Key: valuefiles: one pair per line,#starts a comment, unknown keys are ignored (so newer fields never break older mods).- JSON files are standard JSON; keys starting with
_(such as_comment) are ignored by convention.