v0.130.0 — Procedural maps: Dungeons and caverns
The third milestone of the procedural map generation program (M3): caverns, mines and lairs, dungeons and crypts with real walls and doors, and encounter slots on every template. The program's documents are in docs/programs/mapgen/; this milestone's tasks, decisions and test script are in docs/programs/mapgen/m3-dungeons-and-caverns.md. Released after v0.125.0 (M2), which ships first.
Caverns, mines and lairs
- [x] Cavern: chambers and twisting passages through rock, every part of the cave reachable, with pools, stalagmites, ledges and glowing fungi that light it. Once committed, the cave's walls block sight and movement. A token on the cave floor moves freely up to a wall and no further (found at the release gate: the floor had been blocked as if it were rock).
- [x] Mine: caves joined by straight tunnels with rails, timber supports, carts, ore veins and lanterns.
- [x] Lair: one great chamber at the end of a single approach, with bones, a hoard and nests.
Dungeons and crypts
- [x] Dungeon: rooms joined by corridors in loops, so there is more than one way through; locked doors with their keys elsewhere; wooden and iron doors and a portcullis before the last room; secret doors, placed only where the dungeon can still be finished without them. Once committed, walls and doors are map Objects: doors open and close like any door.
- [x] Room purposes (barracks, shrine, library, cell block, throne room…) appear as labels, to the GM only; braziers light the rooms; dressing and light are sliders.
- [x] Crypt: a dungeon of tombs, with sarcophagi, wall niches and altars.
Encounter slots
- [x] Every template marks where encounters belong (lairs, guard posts, camps, wanderers, ambushes), each with room around it, shown to the GM only. M6 will fill them from a roll table.
Privacy and security
- [x] Secret doors stay secret. A secret door set in a wall used to give its position away through the wall's data, for hand-placed doors too (since v0.122.0). Players now receive nothing that locates it: not the door, not an opening in the wall, not a gap in the wall's line of sight.
- [x] Copying a map no longer copies its hidden tokens into the new map.
- [x] Room labels, encounter slots and the map's recipe are never sent to players, including through the map's history.
- [x] Only who may edit a map can change its fog of war and walls. Any signed-in user could add, change or remove fog shapes and walls on any map, even one in a campaign they weren't in. Now it takes edit on the map (the GM and the map's editors). Until fog reveals are worked out by the server, a player's move no longer reveals fog; the GM's moves still do.
- [x] Drawing on a map, or changing or removing a drawing there, takes being able to see that map. Players still draw on the maps they're given; a campaign member could also draw on a map they hadn't been given.
- [x] Only who may edit a map can add, rename, hide or delete its layers. Before, any signed-in user could, on any map.
- [x] Players can no longer change a map's settings (its name, fog of war, whether it's hidden from players) or delete it. That takes edit on the map, and deleting it takes the GM.
- [x] Only who may edit a campaign can change its settings data: attribute groups, bars, actions, functions, currencies, damage types, light sources, vision types, prop types, property definitions, roll tables, conditions. Before, any signed-in user could create, change or delete them in any campaign.
Outdoor maps, from v0.125.0's gate
Found testing v0.125.0, and finished after it shipped:
- [x] A setting a preset overrides says so under it (Overridden by Road ambush, which needs a road through the map), and what choosing another value does; choosing it releases the preset's road or river, so your choice is what generates.
- [x] Contour lines are easier to read on high ground: thicker (heavier every 50 ft), a light line edged in dark that shows on any ground, and drawn over trees, rocks and bridges instead of under them. Still for the GM only.
Light and fog of war, from this release's gate
Found testing fog of war on generated maps:
- [x] The token you impersonate is always drawn for you, even in darkness or fog with no light and no darkvision, so you can find it, select it and open its sheet. It lights and reveals nothing, and a token the GM has hidden stays hidden.
- [x] Light sources in a token's right-click menu: the campaign's light sources, each a toggle, for anyone who may edit the token.
- [x] The full character sheet shows Vision & Light again (its light source and Light Enabled switch) when opened from the map: since v0.115.0 the sheet opened from Mini-Me wasn't given the token.
- [x] A light chosen in an editor now lights the map. Editors store a light source by its id, and the lighting looked it up by name, so a light set from the token editor or the token bar (and the new menu) never drew.
- [x] A generated map's walls and doors block players' sight and movement. They are Objects carrying their own vision blocking, and dragging a token and the players' vision mask only looked at the map's own VBL, so on a generated dungeon a player saw through every wall and walked through every door, secret doors included. Fog of war's reveal on a move, Reveal Fog of War and the GM's vision preview had the same gap. What the server sends players was already right: they still get nothing of a secret door.
- [x] …and through fog too: the token you impersonate is drawn above unrevealed fog of war, not only above darkness.
- [x] The Vision & Light dropdowns on the character sheet stay open. The section (and Conditions and Auras beside it) rebuilt itself on every refresh, closing any open dropdown.
- [x] Doors are labelled with the rooms. On a generated map the GM's labels now name every door, secret door and portcullis where it stands (Wooden door, Secret door), behind the same display toggle. A door set in a wall has no hover of its own, so this is the way to find one at a glance.
- [x] Encounter slots explain themselves. Hovering a slot's marker on a generated map shows the GM what it is: its kind (lair, guard, camp, wanderer, ambush), what it marks, and how many creatures it has room for. Only the GM sees slots or their tooltips, behind the same display toggle, in preview and once committed.
- [x] Nothing under unrevealed fog shows to players. A generated map's props, the art of its braziers and lanterns, its contour lines, and ordinary drawings' outlines drew over the fog, so a player saw them in rooms nobody had explored. A player's fog now hides everything beneath it; the GM's see-through fog is unchanged.
- [x] Reset Fog fogs the whole map again. It used to delete only the reveals the GM's own screen had loaded, one at a time, so a reveal it didn't have (a player's reveal on a move, one that arrived while the page was refreshing) stayed revealed, and one failed delete stopped the rest. It now clears every reveal on the map in one step, whatever made it: one Time Machine change, and every player's view clears at once.
Under the hood
- [x] CI runs the end-to-end suite in parallel. The render tests ran one at a time after the unit tests (53 at about 30 seconds each in software WebGL); their harness is now built once, they run two to a runner, and CI splits the suite across four runners beside the unit tests.
lint-and-testis now the summary of both, so the deploy gates check the same name. - [x]
map-art-procedural0.3.0, with M3's art: a server copies a module's art only when its version changes.
For module authors: Module API 1.46.0
- [x]
GeneratedMapView.structure(walls, doors, lights, labels, encounter slots),GeneratedMapSnapshot.gmOnly,GeneratedMapRendererProps.isGM, and batch keys on the write facade (key,parentKey,objectTypeId,objectState,objectOverrides,metadata), so one commit creates walls with their doors.