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 own levels (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: value files: 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.