DirkScripts
Backstories
Backstories are admin-built character archetypes that players pick on character creation. Each one comes with its own scripted intro scene, starter inventory, and (optionally) Discord-role-gated access. They're the same thing as the Lifestyles referenced in the Lua API β internally the schema field is lifestyles, but the player-facing label is "Backstory".
#What a Backstory Contains
Each entry has four tabs in the admin editor:
| Tab | Purpose |
|---|---|
| General | Name, label, description β what the player sees when choosing. |
| Access | Locked toggle. When on, you can gate the backstory behind Discord role IDs so only specific players can pick it. |
| Items | Starter inventory β compact SelectItem list with inline expand for picking item + quantity. |
| Scenes | One or more scripted intro scenes that play after the player confirms their choice. |
#The Intro (multichar 2.0)
Each backstory can have an intro: a short film a new character plays through the first time they load in. Open it with Edit intro on the backstory's card in Config Studio. The editor works like a video editor:
- Scenes run along the top of the timeline. A scene is one place, with its own time of day, weather and how busy the streets are. It begins with a fade, a cut or a blend, and it can be marked as not skippable.
- Tracks underneath hold everything that happens: camera shots, what your character does, what they hold and how they walk, other people in the scene, screen effects, title cards and sounds.
- The library on the left has ready-made moves, people, props, walk styles, effects, text and transitions. Drag one onto the timeline, or click it to add it at the playhead.
- Places and shots are set in game. Frame it in game opens a free camera (F keeps the shot), Set to where I stand uses your position, and Walk it in game records a route as you walk it.
- Play in game runs the intro on your own character, as staged, and brings you back to where you stood. You can also play from any scene.
Changes are staged: Apply puts them on the backstory, and Config Studio's Save changes keeps them. /testbackstory [id] replays a backstory's intro on your character.
Backstories made before 2.0 keep playing their old intro scenes until an intro is built in the editor.
#Player Flow
- Player clicks Create New Character in the multichar selector.
- After clothing customisation, they see the backstory list (filtered by their Discord roles if any backstories are locked).
- They pick one β scripted scene plays β character spawns with the starter items granted.
#Discord Role Gating
Inside the Access tab, the Locked toggle reveals a Discord role-ID input. Add as many roles as you want β the player needs at least one of them to see the backstory. This is also how the dirk_multichar configurator gates admin access elsewhere, so the same role model applies.
#Registering a Backstory From Another Resource
External resources can register a backstory at runtime via the registerBackstory export (2.0 β before that it is registerLifestyle, which still works) β useful when a separate script (e.g. a jobs system) wants to surface its own archetype without admins manually adding it.
luaexports.dirk_multichar:registerBackstory('mybackstory', { label = 'My Backstory', description = 'A short description for the player.', items = { { name = 'phone', amount = 1 }, { name = 'wallet', amount = 1 }, }, -- additional fields mirror what's in the configurator's Backstories tab })
Registered backstories appear in the player's selector alongside admin-configured ones.
#Reacting to a Backstory (multichar 2.0)
When a new character finishes their intro, the client fires two events: one named after the backstory, and one for any backstory.
luaAddEventHandler('dirk_multichar:onBackstoryLoad:homeless', function() -- a new homeless character is in the world end) AddEventHandler('dirk_multichar:onBackstoryLoad', function(backstoryId) print('new character, backstory:', backstoryId) end)
#Live Editing
Every backstory edit applies live β players choosing a backstory immediately after a save will see the new state. The Lua side subscribes to lib.scriptConfig.on('lifestyles', ...) and rebuilds its runtime cache on every save.
Last updated on 30 September 2026
