Getting started

Everything is a mod

The one rule Underlives is built on, what it means for you, and how we hold ourselves to it.

The rule

If something can be a mod, it is a mod.

The engine holds the systems: time, movement, rendering, saving, how a scene runs, how a shop sells. The content lives in mod files: which scenes exist, which actions are on the phone, what a café looks like, which stats a character has, what time the bakery opens, which icons the map uses, what the loading screen says.

When we add a feature to Underlives, the question is never "where do we hardcode this list?" It is "which file does a modder open to change it?" If the honest answer is "none, it is in C++", the feature is not finished.

What it means in practice

The base game is a mod. Everything the game ships with lives in modules like ul_Base, ul_Pregnancy or ul_Health, in the same format you write in. Nothing it does uses a private back door. If ul_Base can add a stat, so can you, with the same file, the same fields, the same result.

You never need the engine. No Unreal Editor, no cooking, no packaging. Scenes and rules are Lua. Data is plain text, Lua tables or JSON. Images are .png. Meshes and animations are .glb or .fbx exported straight from Blender or Daz Studio, loaded at runtime.

You can replace anything, not just add. A file with the same name or the same id as one in an earlier mod replaces it. You can rewrite one of ul_Base's scenes, rebalance its actions, retexture the city, or change the café grammar without touching its files. See Load order and overrides.

Content is data, even when it looks like configuration. Opening hours of every venue, the weight a building type is rolled with on the map, the colour of street lamps, the chips on the player panel, the list of illnesses in the health mod, the university majors: all of these are mod files. A mod can append to them or take entries away.

Mods build on mods. A library in Lua/ can add methods to every person in the game (Actor:infect("flu") comes from the ul_Health mod, not from the engine), and other mods call them as if they were built in.

modder

You will see this box across the docs. It marks the places where the rule shapes how something works, usually: "this looks like it should be engine code, and here is the file that controls it instead."

Why we work this way

  • The game outlives any one team. Life sims stay alive for years when their community can write content. We want that from the first day, not bolted on later.
  • It keeps us honest. If the base game can only do something through a private path, modders are second-class. Building the base content through the public mod surface is how we know that surface actually works.
  • It keeps content out of code. A venue list in C++ needs a programmer and a new build to change. The same list in a mod file needs a text editor.

What stays in the engine

Some things cannot sensibly be a mod, and we do not pretend otherwise:

  • Rendering and the core simulation: lighting, physics, the movement of people, the time system, saving and loading.
  • The rules of the file formats themselves: what a field in an .ulaction means is engine code; which actions exist is not.
  • Performance-critical loops: the NPC routine scheduler runs your AI/*.lua scripts, but the scheduler itself is C++.

When a system is engine code, it still reads its numbers from mod data whenever a modder could want to change them.

When the rule is broken

Sometimes a thing is still hardcoded because nobody has moved it yet. That is a bug, not a design choice. If you want to change something and find no file that controls it, report it: it is exactly the kind of gap we want to close.