Make your own god
Every god is a YAML pack: who speaks, who fights, what drops and the lines they say. The AI writes new lines in the pack’s voice; the pack’s own lines are the fallback, so a pack works with no AI at all.
There are two kinds:
- Gamemaster: a whole season. A god, a nemesis, lieutenants and four to eight acts. Your world runs one.
- Expansion: one extra act that stacks on any gamemaster, like Nether Invasion.
Custom packs run on your own Director today. Put them in the packs folder.
Start a pack
npx tsx src/cli.ts pack new frost-giants --type expansion
npx tsx src/cli.ts pack validate ../packs/frost-giants/pack.yaml
pack validate explains every error in plain words: a mob that isn’t allowed, a loot table nobody uses, a line with a placeholder that can’t be filled.
A complete expansion
This one is valid as written:
id: frost-giants
type: expansion
name: Frost Giants
author: You
description: A winter act. Strays march down from the mountains.
extra_act:
name: The Long Winter
goal: The cold comes for the base.
archetypes: [omen, rumour, raid, gift]
characters:
- { name: Old Rime, mob: stray, gear_tier: 2, bio: "Has been cold for a thousand years and blames you personally." }
mobs:
frostbitten: { mob: stray, count: [3, 5] }
loot:
thaw:
- { item: campfire, count: 2, weight: 2 }
- { item: cooked_beef, count: [6, 12], weight: 3 }
beats:
omen:
- title: "The rivers stop"
subtitle: "Something is coming down the mountain."
weather: rain
lines: ["Feel that, {player}? The cold remembers you."]
raid:
- group: frostbitten
title: "The Long Winter"
subtitle: "{leader} came down from the peaks."
bossbar: "{leader}'s frostbitten"
lines: ["They walked a thousand miles to stand outside your door."]
speaker_lines: ["Your fires are small, {player}."]
gift:
- loot: thaw
lines: ["Here, {player}. Stay warm. I want you alive for the next part."]
Then add it to a world: world set our-smp --addons frost-giants.
Beats
A beat is one thing the god does. Each archetype is a list of recipes; the Director picks one that fits what just happened.
| Archetype | When |
|---|---|
greeting |
A player joins. Use when: first_join or when: returning. |
omen, rumour |
Build-up. Titles, weather, hints about what’s coming. |
raid |
A named villain and their group spawn near a player. Needs group. |
bounty |
A villain gets a price on their head. Needs group and loot. |
bounty_claimed |
Someone killed a bountied villain. Pays the loot. |
kill_reaction |
A player killed one of the god’s villains. |
death_taunt |
A player died. |
pray_answer |
Someone used /pray. Set answer: gift, curse, mock or omen. |
gift, curse |
Needs loot or effect. |
Recipe fields: lines, speaker_lines (said by the villain), title, subtitle, sound, weather, group, count, bossbar, loot, effect, effect_seconds, finale, weight.
Placeholders
{player} |
the player the beat is about |
{god}, {nemesis}, {nemesis_title} |
from the gamemaster’s persona |
{leader} |
the villain leading this raid |
{killer}, {cause} |
what killed the player, for death taunts |
{deaths} |
how many times this player has died |
{fact} |
something the god remembers about this player |
{prayer_topic} |
what the prayer was about |
Limits every pack lives with
Packs can’t widen the safety rules, only narrow them. Mobs come from a fixed list (zombies, skeletons, illagers, spiders, Nether mobs and the like; no withers, wardens or dragons). Effects come from fixed lists with hard time caps. Items like TNT, lava, spawners, command blocks and spawn eggs can never be given, whatever the pack says.