Skip to content

Marker signs

Everything here is done by placing a sign in the build and re-saving the tile. No config, no restart, no plugin release.

Put a sign in the room. The first line is the keyword and the rest say what goes there:

[mob] [loot] [npc] [info]
grunt rare exit stats
50% 30%

Then re-select the tile and run:

/maze savetile v1 <tilename>

savetile re-reads the set as it writes, so the next dungeon has it. There is no separate reload step.

The sign itself never appears in the dungeon. It is read out of the schematic and replaced with air, and whatever it asked for is placed at exactly that block. The sign is not a label next to the thing; it stands where the thing will stand.

Keyword Means
[mob] something to fight stands here
[loot] a chest goes here
[npc] somebody to talk to stands here
[info] a board to read hangs here

Anything else on line one is an ordinary sign, left in the build. Case does not matter.

After line one the sign is read as tokens rather than positions. Each token is identified by its shape, so you can write the lines in whichever order looks best and leave any of them blank:

Token looks like Read as
50% or 0.5 chance this appears at all
x3 or 3 how many
anything else the role, first one wins

grunt x3 50% on one line and grunt / 50% / x3 on three lines are the same sign. Chance defaults to 1 and count to 1.

A sign with a keyword but no role is ignored. [mob] on its own is not an error, it is just not a marker.

A tile gets placed many times in one dungeon. A day’s maze is 141 to 234 rooms built from about thirty tiles, so a corridor tile appears dozens of times. At 100% a marker in a corridor means a monster in every one of them; at 25% you are not tired of it by room forty. Chance is rolled per placement, so the same tile is populated differently everywhere it appears.

Rooms that exist once, like the boss room, want 100%, which is the default.

Line two is a role rather than a monster. The role is resolved against the day’s element, which is what lets one corridor tile work in all five dungeons: place grunt and you get an ice grunt on an ice day and a fire grunt on a fire day.

Role What it becomes
grunt the day’s trash: four per element plus six that work anywhere
elite one of five mini-bosses, rare on purpose
boss steers the boss’s position in a boss_ room, see below
an exact MythicMob id that mob, ignoring the theme

The last row is the escape hatch. [mob] / grunt_ice_shiverling puts a shiverling there every day of the year. Use it for a room built around one specific monster and use roles for everything else.

A [mob] boss sign in a boss_ room does not summon the boss. It says where the boss will stand when somebody pulls the lever. Spawning it earlier would leave it standing at full health from the moment the maze exists, and the lever would mean nothing.

A boss room with no boss marker gets one placed automatically, by searching down from mid-height for solid floor near the centre. That works but it does not know where you wanted the fight.

boss in a room whose name does not start with boss_ does nothing useful.

Line two is a tier from dungeon/config.yml. Five ship today:

Tier Stars Draws Also pulls from
common ✦✧✧✧✧ 2 nothing
uncommon ✦✦✧✧✧ 2 the day’s trinkets
rare ✦✦✦✧✧ 3 the day’s gear
epic ✦✦✦✦✧ 3 the day’s gear
boss ✦✦✦✦✦ 4 the day’s gear

Adding a tier is an edit to loot.tiers in config.yml plus /dungeon reload, so a builder can use a new tier the same day.

A tier can name others it sometimes upgrades into, so the sign asks for a floor rather than an exact chest. As shipped, a common chest is common 80% of the time, uncommon 15% and rare 5%; uncommon reaches epic; rare reaches epic one time in five. epic and boss never move, so five stars stay boss-only.

Two things follow from how this works:

It is one hop. A common that rolls rare is a rare chest and is not then rolled against rare’s own upgrades, because compounding would make the real distribution stop resembling the written one.

It is rolled once per chest rather than per player, since the stars over the lid are a single shared entity. What stays per-player is which items come out.

A consequence worth knowing before you place a lot of common: the cheapest chest in the dungeon can now reach the gear pool, which it could not before.

The chest holds something different for every player, rolled on first open. The real chest never opens: clicking it is cancelled and you get your own inventory. Two people standing at one chest is fine, so there is no reason to place eight chests where the room wants one.

A misspelled tier is not silently ignored. That chest is skipped and the server log says which name it did not recognise.

Line two is a role from the npcs: block in dungeon/config.yml. One ships:

Role Who
exit click twice to end your run

A role says what they look like (any entity type, and PLAYER takes a skin), what they say, how many clicks they need, and what commands run. Commands run as the clicker unless prefixed console:, which runs them as the server for anything a player should not have permission to do. %player% and %run% are filled in.

npcs:
shop:
name: "<aqua>Quartermaster</aqua>"
type: PLAYER
skin: Notch
says: ["<gray>Trading, are we?</gray>"]
clicks: 1
commands: ["console: give %player% emerald 1"]

Names are MiniMessage and are parsed for both the nameplate and the chat prefix.

Adding a role is a config edit plus /dungeon reload, the same as a loot tier.

These NPCs are not saved in Citizens’ saves.yml and cannot be made with /npc create. A dungeon world is built at the start of a run and deleted at the end, so a saved NPC would point at a world that no longer exists, once per night forever. They are spawned into an in-memory registry instead.

If Citizens is uninstalled, [npc] signs do nothing and the rest of the dungeon is unaffected.

Line two says which board. Two exist:

Role Shows Seen by
dungeon today’s element, its boss, room count, date everyone
stats your shards, runs, clears, deaths only you

These signs go on the floor and the board is lifted above them, set by info.lift in dungeon/config.yml. Put the sign where you want to stand to read the board rather than where you want the board.

A tile has three blocks of vertical space counting the sign’s own block, so the whole board has to fit in the two above it. The default scale of 1.0 and lift of 1.2 fit a five-line board. Raising either can push the top rows into the ceiling, where they are hidden.

Both boards are fixed-facing, like the boss gate sign: they hang the way the sign faced and do not swivel to follow you.

The stats board is one entity per player. A text display carries one string for every viewer, so a shared board would show whoever placed it to everybody. Each member gets their own copy, spawned invisible and shown only to them. A party of eight is eight displays in one block, each seen by one person.

Boards redraw when your numbers change rather than on a timer.

The sign’s facing is the spawned thing’s facing. For a wall sign that is the direction the text reads towards you, so a sign on the north wall of a room, readable as you look north, faces south into the room.

A chest’s front comes out the same way, so a [loot] sign you can read is a chest whose latch you can see. Put the sign where you want to be standing when you open it.

Standing signs are read on all sixteen points, so a sign turned to a diagonal gives a mob or an NPC facing that diagonal. Turn the sign a notch and the thing turns 22.5 degrees with it. (A chest is still one of four, because a chest block only has four facings, so a [loot] sign on a diagonal rounds to the nearest.)

Rotation and mirroring are handled. The maze places tiles in all four orientations and markers turn with the blocks around them.

Things worth knowing before you place fifty of them

Section titled “Things worth knowing before you place fifty of them”

A [mob] sign switches off that room’s auto-grunt. With no signs anywhere, 45% of rooms get a grunt stood in the middle so the dungeon is playable at all. Any room with a [mob] sign is left exactly as you authored it, so the stopgap disappears room by room as you build instead of having to be hunted down later. A [loot] sign does not count, so a treasure room keeps its guards.

Put the sign where the thing goes in three dimensions. A wall sign at head height means a chest floating at head height. For chests, a standing sign on the floor is usually what you want.

Do not put two [loot] signs side by side. They become two separate single chests rather than one double chest.

The entry room never gets a monster from the fallback, but a [mob] sign you place there is honoured. Being jumped before you can see the room is not difficulty.

The front face is read first and the back face is the fallback, so a blank front and a marker on the back works if you want the sign facing into a wall.

/dungeon dryrun v1 builds a whole dungeon from the console, reports the room count, the monsters by kind, the chest count, the boss room and the lever, then throws it away. No player needed. /dungeon dryrun v1 7 does the same for a week from now, which is how you find out whether a marker only works on the element you happened to test on.