Baileywiki Better Levels

Baileywiki Better Levels

by Baileywiki

Claimed by Baileywiki
v1.8.11
Updated Aug 4, 2026
Description

Multi-floor scenes that just work — built, audited, and fixed for you.

Foundry's native Scene Levels are powerful, but building a tower, a dungeon with a basement, or a ship with a deck below is fiddly and easy to get subtly wrong. Better Levels automates the tedious parts — generating levels, tracing floor surfaces, wiring stairs, naming things — and then continuously audits your scene for the easy-to-miss mistakes that quietly break Levels, with one-click fixes for each.

The whole thing is additive to Foundry: it builds with real Levels, ordinary Regions, and ordinary Tiles. Nothing proprietary, nothing locked away — so your scenes stay portable, export/import with Foundry's own tools, and every module you already use keeps working.

Tutorials

Check out the How-to Guide for building with Levels.


✨ Highlights

  • Show visible tokens only. (experimental — off by default) In v14, when one token sees another on a different floor, Foundry unoccludes every tile above it — exposing that token's whole surroundings, and sometimes removing the floor under the viewer. Turn this on and the building stays intact: the seen token is drawn on top of its cover with a dashed outline, still hoverable and targetable, tracking true line of sight per player. Any number of tokens at once. This is the v13 Levels behaviour, brought back for v14.

  • Auto-Build Levels. Say how many floors, how many basements, whether to add a roof, and the floor height — Better Levels creates the whole stack in seconds, names each band by its elevation range (e.g. Level 02 (10 | 20)), and auto-wires visibility by rule: above-ground floors see each other, basements stay sealed. Bands that already match are preserved.

  • One-click tile setup with pixel-perfect surfaces. Tile HUD buttons configure a tile as Floor / Roof / Basement / Balcony and generate its walk-on Surface region in one click — tracing the tile's actual non-transparent footprint (via Mass Edit) instead of a blunt rectangle, and assigning it to every level that can see it so occlusion works in both directions. Got a whole floor to do? Select them all and mark them at once.

  • Tagging = under warranty. Or ignore it. Marking a tile as Floor or Roof puts it under continuous supervision: from then on the audit checks its surface region, occlusion, light and weather blocking, and fog reveal — and can repair all of them. Better Levels never guesses that a tile is a floor (it can't tell a floor plate from a rug), so you tell it once and it looks after it forever. For genuine decoration there's an ignore toggle — on the tile HUD and in the Fix dialog, and it works for regions and lights too — which drops that entity out of the audit until you toggle it back. Two answers, and anything you haven't answered still gets flagged, because untagged usually means forgotten.

  • Level Manager with a visibility grid. Click the level count to open a building-style manager: see how many tiles, lights, regions, walls, and tokens live on each floor; rename, re-elevate, add, or remove levels. A visibility grid shows at a glance which levels can see which, with a click-to-toggle eye for every pair — in one direction or both. Apply backs up, cleans up orphaned tags, and flags any remaining work in the Audit.

  • Live Audit & Self-Repair — 32 rules. Catches the conflicts that break Levels: roofs and floors missing surface regions, surfaces that don't reach the levels that can see them (the classic "I can see through the floor" leak), floor openings that aren't carried through to the level below so tokens can't see each other through a stairwell, one-way stairs, visibility leaks, light tagging, occlusion modes, degenerate or overlapping bands, leftover legacy flags, and more. Issues sort into green / amber / red buckets (cosmetic → settings → creates-or-deletes), each collapsible with its own Fix All. Fix one, fix a category, fix everything, or switch a rule off per scene — and bulk fixes report once with a summary instead of burying you in notifications. Also auto-converts pre-v14 scenes and prefabs to v14 standards.

  • Every rule teaches you Levels. Hover any rule and it explains the concept behind it — what's wrong, why it matters, what the fix does. Reading through them is a genuinely fast education in how v14 Levels actually works.

  • Build Mode. A single toggle that turns the scene into a clean build surface — hides overhead tiles and the surface regions from floors above (which otherwise stack up and steal your clicks) so you can see and work on the level you're actually building. Never touches scenes that don't use Levels.

  • Fix Entity — configure anything in one click. Select any placeable and hit Fix. It infers what it can (a tile's role, a region's surface-vs-stair purpose, the right level) and only asks when it genuinely can't tell, batching questions into one dialog with smart defaults — then sets it up end-to-end and offers a "Go to that level" jump to see the result.

  • Better token level changes. Core Foundry's "change level" button moves a token's level but leaves it standing at the old height. Better Levels puts it on the destination floor — up or down, any number of floors, landing exactly on the floor every time.

  • Tile Entity Sorting and Enhancements. Sort tiles by z order instead of name. Drag-and-drop groups of tiles to reorder. See thumbnails of tiles for easier identification. Auto-filter Tiles and other entities to the active Level.

  • Region tools. Auto-Stair mode turns any region you draw into a Change Level stair to the floor above; Make Surface turns any region into a walk-on surface with no tile required; and managed regions get clear names like Surface Level 02 and Stair Level 01 ↔ Level 02.

  • Vehicles. One click turns a prefab's regions into a Mass Edit Link Token "deck" so tokens ride the ship, elevator, or moving platform.

  • Backup & Restore. Create a named restore point before risky changes and roll the whole scene back to any saved point — one button, with a confirmation that offers to back up the current state first.

  • Sample scene included. A multi-level Tudor building with a basement that audits completely clean — zero issues, because every tile has an answer: the structural ones tagged, the decoration ignored — roof surfaces assigned upward, floor openings carried through between levels, window walls, and stairs that work in both directions. Import it and poke at a scene that already works.


🛠️ How it works

A compact, draggable helper panel appears on scenes that have multiple levels (or open it anytime from the Tiles toolbar button). It centralizes the live toggles and actions — Generate, Build Mode, Level Manager, Fix, Audit, Backup — and shows your scene's live audit count at a glance, so configuration mistakes surface the moment they happen instead of mid-session.

Everything it creates is a native Foundry document, so you can hand-tune anything afterward, and the audit will simply notice and offer to reconcile whatever you change.


📋 Compatibility & recommended modules

  • Foundry VTT v14. System-agnostic — works with any game system.

  • Baileywiki Mass Edit (recommended) — enables pixel-perfect Surface regions traced to a tile's true footprint, powers the Vehicle / Link Token decks, and is required for converting v13 scenes to v14. Everything degrades gracefully to a bounding rectangle without it.

  • Better Roofs (optional) — Better Levels can set its "Reveals Fog of War" flag on roofs when present.


💜 From Baileywiki

Made by Baileywiki and the Foundry VTT community. If multi-level scenes have ever fought you, this is the assistant that does the bookkeeping — so you can spend your time building the dungeon, not debugging it.

Contents not yet indexed.

Releases

v1.8.11
2.7 MBAug 4, 2026Core 1414

## 1.8.11 — 2026-08-04 ### Fixed - **Hardened the Placeables tile-thumbnail decorator against locking up the interface**, following a report of Foundry crashing whenever the Tile Controls or the Placeables -> Tiles tab were opened. A tab that dies without an exception is a freeze or an out-of-memory, and this code had three ways to cause one: - Its MutationObserver watched the same rows it then modified. Alone that settles, but against another module that also rebuilds those rows the two wake each other indefinitely. It now ignores its own writes, coalesces bursts into one pass per animation frame, and stands down permanently — saying so in the console — if it is still being woken 25 times in two seconds. - The row scan was `querySelectorAll("*")` combined with a per-tile substring search, so one pass cost roughly elements x attributes x tiles, and the observer re-ran it on every DOM change. It now scans row-shaped elements only, and the substring fallback is bounded. - Every animated tile created its own `<video>` decoder. Capped, with a static icon beyond it; the number of decorated rows is capped too. If the tab still misbehaves, "Tile thumbnails in the Placeables tab" in the module settings turns this feature off entirely. - **A failure building our scene-control buttons can no longer damage the rest of the toolbar.** Every listener on `getSceneControlButtons` mutates one shared object, so an exception from ours abandons the chain and removes other modules' tools, or core's — and our tools are injected into the Tiles group, the very menu that was reported crashing. Wrapped: ours failing now costs only ours.

v1.8.10
2.7 MBAug 3, 2026Core 1414

## 1.8.10 — 2026-08-03 ### Added - **Setting: "Show the Audit issue badge"** (on by default). Turn it off to make Audit & Fix purely on-demand — the button stays exactly where it is and works exactly as before, it just stops putting a red count on the helper panel. For GMs who deliberately build scenes the audit has opinions about, a permanent badge over a deliberate choice is nagging rather than helping. Per-client, so it doesn't change the world for anyone else.

v1.8.9
2.7 MBJul 31, 2026Core 1414

## 1.8.9 — 2026-07-31 ### Fixed - **Tokens invisible on a scene built from a flat map image.** Generating levels — or adding one in the Level Manager — copied the ground floor's background image onto every new level. In v14 the background belongs to the Level and is painted across the whole canvas at that level's elevation, so a five-level scene drew five opaque copies of the map stacked above the ground floor. Tokens standing there were buried: their artwork vanished while their hitbox, selection border and elevation badge kept drawing, which made it look as though the tokens themselves were broken. New levels now inherit the ground floor's background *colour* only. The floor below still shows through, via that level's Visible Levels list — which is what the field is for. Scenes whose artwork comes from tiles were never affected, which is why this went unnoticed for so long. ### Added - **Audit rule: "Duplicated level background"** — finds levels already damaged by the above and clears the repeated image with one click. Only flags an upper level whose image is identical to the ground floor's, so deliberately different artwork on an upper floor is left alone. Regenerating levels also self-heals.

v1.8.11
Aug 4, 2026

1.8.11 — 2026-08-04

Fixed

  • Hardened the Placeables tile-thumbnail decorator against locking up the interface, following a report of Foundry crashing whenever the Tile Controls or the Placeables -> Tiles tab were opened. A tab that dies without an exception is a freeze or an out-of-memory, and this code had three ways to cause one:
    • Its MutationObserver watched the same rows it then modified. Alone that settles, but against another module that also rebuilds those rows the two wake each other indefinitely. It now ignores its own writes, coalesces bursts into one pass per animation frame, and stands down permanently — saying so in the console — if it is still being woken 25 times in two seconds.
    • The row scan was querySelectorAll("*") combined with a per-tile substring search, so one pass cost roughly elements x attributes x tiles, and the observer re-ran it on every DOM change. It now scans row-shaped elements only, and the substring fallback is bounded.
    • Every animated tile created its own <video> decoder. Capped, with a static icon beyond it; the number of decorated rows is capped too. If the tab still misbehaves, "Tile thumbnails in the Placeables tab" in the module settings turns this feature off entirely.
  • A failure building our scene-control buttons can no longer damage the rest of the toolbar. Every listener on getSceneControlButtons mutates one shared object, so an exception from ours abandons the chain and removes other modules' tools, or core's — and our tools are injected into the Tiles group, the very menu that was reported crashing. Wrapped: ours failing now costs only ours.
v1.8.10
Aug 3, 2026

1.8.10 — 2026-08-03

Added

  • Setting: "Show the Audit issue badge" (on by default). Turn it off to make Audit & Fix purely on-demand — the button stays exactly where it is and works exactly as before, it just stops putting a red count on the helper panel. For GMs who deliberately build scenes the audit has opinions about, a permanent badge over a deliberate choice is nagging rather than helping. Per-client, so it doesn't change the world for anyone else.
v1.8.9
Jul 31, 2026

1.8.9 — 2026-07-31

Fixed

  • Tokens invisible on a scene built from a flat map image. Generating levels — or adding one in the Level Manager — copied the ground floor's background image onto every new level. In v14 the background belongs to the Level and is painted across the whole canvas at that level's elevation, so a five-level scene drew five opaque copies of the map stacked above the ground floor. Tokens standing there were buried: their artwork vanished while their hitbox, selection border and elevation badge kept drawing, which made it look as though the tokens themselves were broken. New levels now inherit the ground floor's background colour only. The floor below still shows through, via that level's Visible Levels list — which is what the field is for. Scenes whose artwork comes from tiles were never affected, which is why this went unnoticed for so long.

Added

  • Audit rule: "Duplicated level background" — finds levels already damaged by the above and clears the repeated image with one click. Only flags an upper level whose image is identical to the ground floor's, so deliberately different artwork on an upper floor is left alone. Regenerating levels also self-heals.
v1.8.8
Jul 30, 2026

1.8.8 — 2026-07-30

Fixed

  • Closing the helper panel now also leaves Create Stairs mode, for the same reason it leaves Build Mode: the panel is the only place either mode is visible, and with it closed every region you draw would silently become a stair. Both modes switch off on every close path.
v1.8.7
Jul 30, 2026

1.8.7 — 2026-07-30

Fixed

  • Closing the helper panel now leaves Build Mode. Build Mode hides every tile and region above the level you are working on, and the panel was the only thing on screen saying it was switched on — so closing the panel left the scene silently missing its roofs, with no visible control to explain or undo it. Build Mode now switches off on every close path (the panel's own button, the window header, ESC, and the automatic dismissal on scenes without multiple levels), restoring exactly the tiles and regions it had hidden.
v1.8.6
Jul 30, 2026

1.8.6 — 2026-07-29

Fixed

  • The level visibility grid no longer clips its labels. The grid was being compressed to fit its container, so the row and column names overflowed and were cut off — widening the window freed up the first column but never the headers. The grid now keeps its natural size and scrolls sideways if it has to, and column headers read bottom-to-top so a long level name no longer needs a metre of width.

Changed

  • Both axes of the visibility grid now show each level's elevation band alongside its name, so levels whose names only differ near the end ("Level - Castle Deck" / "Level - Castle Keep") can be told apart. The full label is also available on hover.
  • The Level Manager opens slightly wider, so a twelve-level building's grid fits without resizing.
v1.8.5
Jul 28, 2026

1.8.5 — 2026-07-28

Changed

  • The Floor / Roof / Basement / Balcony buttons on the Tile HUD are now toggles, and the active one lights up blue. A tile is exactly one thing, so the four roles behave like radio buttons: the role a tile already carries is highlighted, and clicking a different one switches to it. You can now see what any tile was meant to be at a glance, without opening a dialog.
  • Clicking a tile's current role clears it, the same way the Ignore toggle works. Clearing restores the occlusion, light/weather restrictions, level tags and elevation the tile had before Better Levels first configured it — captured once when the first role is applied, so switching roles never overwrites the original. The Surface region is removed too, but only if Better Levels created it and no other tile is still using it; hand-drawn and shared regions are unlinked and left alone.
v1.8.4
Jul 28, 2026

1.8.4 — 2026-07-28

Fixed

  • The Level Manager now scrolls. On scenes with many levels the window grew past the bottom of the screen — a ten-storey tower put Add Level, Commit and Cancel out of reach with nothing to scroll. The window is now capped to the viewport, the level table and visibility matrix scroll, and the action bar stays pinned at the bottom where it is always clickable. The Backups, Status and Sample Scenes windows got the same ceiling, since their lists can grow without bound for the same reason.
v1.8.3
Jul 28, 2026

1.8.3 — 2026-07-28

Changed

  • The "tiles with no role assigned" notice now identifies each tile by id as well as name. Scenes routinely contain several copies of the same art, so ignoring one copy left an identical-looking finding behind and made the ignore toggle appear broken when it had worked. Each tile is now listed as "name [id]", so duplicates are visibly distinct entities.
v1.8.2
Jul 28, 2026

1.8.2 — 2026-07-28

Fixed

  • "Floor openings carry through" findings no longer come back after being fixed. The fix genuinely worked — the opening really was copied into the surface below — but the audit kept re-reporting it. The check asked "does the lower surface have a hole containing this point?", using the opening's average centre; for a CONCAVE opening (an L-shaped stairwell is the usual case) that centre lies outside the opening's own outline, so the answer was "no" even immediately after it had been copied. Detection is now structural — matching the opening's geometry, plus a record of what's already been carried down — so a fixed opening stays fixed.
  • Findings involving same-named regions are now distinguishable. A scene often has several regions called e.g. "Surface Level 02 (10 | 20)", which produced findings that looked identical; each now carries a short id and the number of openings involved.
v1.8.1
Jul 28, 2026

1.8.1 — 2026-07-28

Fixed

  • Audit findings now name the tile the way the Placeables tab does. Tile findings read "Tile a1b2c3" — an internal id you can't search for — because the label was reading a flag the module never writes. It now uses the tile's actual name, falling back to its texture filename, so a finding can be located immediately in the Placeables list. The "tiles with no role assigned" notice also lists the tiles by name instead of only naming the level.
v1.8.0
Jul 28, 2026

1.8.0 — 2026-07-27

Stable release — rolls up everything since 1.7.5.

Added

  • Ignore a tile, region or light in the Audit. An eye toggle on the Tile HUD, and an "Ignore this entity in the Audit" checkbox in the Fix / Configure dialog, remove that entity from every audit rule that inspects it — so deliberate decoration, backdrops and one-off art stop being reported without switching a whole rule off for the scene. It's reversible from either place, and the Fix dialog reaches entities the HUD can't (Build Mode hides overhead tiles — select them in the Placeables list instead). The default is unchanged and deliberate: an untouched tile is still audited and still reported as having no role assigned, because "untagged" usually means "forgot", not "deliberate".

Changed

  • The sample Tudor scene now audits completely clean. Its structural tiles are tagged and audited; its decoration and backdrop tiles are marked ignored. Importing it shows a finished scene rather than a list of notices, and demonstrates the tag-it / ignore-it decision on every tile.

Fixed

  • "Show visible tokens only" (experimental): hovering a ghosted token no longer wipes the roof above it on the GM view. Core's occlusion mask takes surfaces as well as tokens, and hovering a token nominates the surfaces above it — drawn across their whole footprint. Ghosted tokens are now kept out of hover entirely, and the ghost provides its own highlight and click-to-target. Player-side behaviour can still vary depending on your module set; the feature remains off by default.
v1.7.5
Jul 27, 2026

1.7.5 — 2026-07-27

Stable release — rolls up everything since 1.7.0.

Added

  • New audit rule: "Tiles with no role assigned (unmonitored)." Every floor/roof check — surface region, occlusion, light and weather, fog reveal — only inspects tiles you've marked as Floor, Roof, Basement or Balcony. That meant a half-configured scene could audit completely clean while unmarked tiles went unchecked. The audit now reports, per level, how many tiles are unmonitored and points you at the tile HUD buttons or "Mark selected tiles as Floor". It is deliberately informational with no auto-fix: Better Levels can't tell a floor plate from a rug or a shadow overlay, and guessing would create surface regions your tokens then stand on. It sits in the green (safe) category, and you can switch it off for scenes that are mostly props.

Changed

  • Bulk fixes now post one summary instead of dozens of notifications. Fix All, the per-category Fix All buttons, "Mark selected tiles as Floor" and multi-select Fix Entity previously fired a toast for every tile and region they touched, burying the result. They now report once, with a breakdown of what changed ("Fixed 23 issue(s) — Floor tile has no Define Surface region (8), Stair spans its connected levels (5), …"), and the full detail goes to the console. Warnings and errors are never suppressed.
v1.7.0
Jul 26, 2026

1.7.0 — 2026-07-26

Stable release — rolls up everything since 1.6.0.

Added

  • Show visible tokens only (EXPERIMENTAL, module setting, default off). Brings back the v13 Levels behaviour for cross-level sightlines. In v14, when a token sees a token on another level (through a window or floor opening), core unoccludes every tile above it — exposing its entire surroundings — and can even remove the floor under the viewer. With this on, cross-level tokens no longer trigger tile unocclusion; each seen token is instead drawn on top of its cover as its artwork with a dashed outline, tracking true line of sight per client. Seen tokens stay hoverable and targetable; any number can be revealed at once. Same-level occlusion (a roof fading over your own token) is untouched.
  • Level Manager visibility grid. A matrix showing which levels each level can see (its "Visible Levels"), with click-to-toggle eyes for any pair in either direction, and a "Reset to policy" button. Changes apply on Apply; once you hand-customise visibility, the audit stops overriding it.
  • New audit rules that close real cross-level sight leaks: every roof tile must carry a Define Surface region; every surface must be assigned to its level and every level that can see it (this replaces the old one-level-per-surface model — the audit fix re-tags them); floor/roof openings (stairwells, trapdoors, balconies) must be carried through to the surface of the level below, and the fix copies them down; floor/roof/basement/balcony tiles must occlude light and weather; one-way stairs (top edge not inclusive) are detected and fixed; a level with content but no surface gets one created.
  • Every audit rule now teaches. All rules carry a rewritten "what's wrong → why it matters → what the fix does" explanation, shown on the issue's "Why this change?" expander AND as a hover tooltip on each rule toggle — the Audit doubles as a course in how Foundry v14 Levels works.

Changed

  • Audit window overhaul: results scroll; Red / Amber / Green categories collapse, each with its own "Fix All (n)" button; the Rules list is grouped by the same severities. Fewer, clearer rules: the two region-naming rules merged (surfaces and stairs still named distinctly), the stair-topology rules merged into one, and duplicate "missing surface" reports were eliminated.
  • Build Mode now hides overhead regions as well as overhead tiles, so the level you're working on is the one you can grab — visuals only, occlusion behaviour untouched.
  • Sample Tudor scene rebuilt as a reference: roof surfaces assigned upward, proper floor openings carried through between levels, window walls (sight/light proximity) instead of invisible walls, floor tiles marked as floors, and the whole scene audits clean.

Fixed

  • Changing a token's level now lands it exactly on the destination floor — up or down, including the first change after a scene load. (Previously the elevation correction collided with core's move animation and stopped at the midpoint, showing a stray elevation badge.)
  • Auto-configuring a roof reliably sets Better Roofs' "Reveals Fog of War" (now written via the canonical flag API), both from the HUD and from the audit fix.
  • The audit again catches a level whose surface region was deleted.
v1.6.0
Jul 26, 2026

1.6.0 — 2026-07-25

Stable release — rolls up everything since 1.5.2.

Fixed

  • Cross-level token vision is no longer affected by the Placeables filter. "Sync to Levels Elevation" now filters only the Placeables sidebar list — it never changes what's drawn on the canvas. Previously, with Sync on (the default), tokens standing on other floors could be hidden from view, and from each other's line of sight, so combatants couldn't see one another between levels. If you build multi-level scenes, this is the important one.
  • Build Mode no longer disturbs tile rendering when it's off. It now leaves tile visibility entirely to Foundry unless you're actively using it to build.
  • The "corrupt region shapes — Repair" warning no longer stacks banners on your map. When a scene has broken regions, the Repair action lives on a quiet button in the helper panel instead.

Added

  • Setting: "Sync to Levels Elevation only in Build Mode" (default off). Optionally restrict the placeables-list filtering to Build Mode, so the list shows everything during play.
v1.5.2
Jul 26, 2026

1.5.2 — 2026-07-25

Fixed

  • Changing a token's level via the HUD didn't move its elevation — most visibly going down onto a band boundary. A hook trace showed why: a HUD level change is a move, and core doesn't put level in the incoming preUpdateToken changes — it derives the destination level during processing and only writes it into the committed update. Our handler recorded its target in preUpdateToken gated on "level" in changes, which is never true there, so it never actually ran. What looked like "works going up" was core animating the elevation on its own. The elevation is now set in updateToken, the hook where level genuinely appears, so it fires reliably in both directions and lands the token on the new level's floor. (The follow-up write is elevation-only, so it can't loop.)
v1.5.1
Jul 19, 2026

1.5.1 — 2026-07-18

Fixed

  • "Sync to Levels Elevation" was missing from the level dropdown on most scenes. The menu was identified by looking for the literal text Level (, so it was only recognised on scenes whose levels happen to be named exactly that way. A scene naming its levels Level 01 (0 | 10), Ground Floor or Basement was never matched and never got the entry. The menu is now identified by matching its items against the scene's actual level names, so it works whatever you call your levels.
v1.5.0
Jul 11, 2026

1.5.0 — 2026-07-11

Removed

  • Restack Tiles has been removed — the helper-panel button, the preview window, and the bring-to-front / send-to-back buttons on the Tiles toolbar. Drag-to-reorder in the Placeables tab does the same job in the place you are already working, so this was a second way to do one thing.
  • Unaffected: drag-to-reorder in the Placeables tab (Shift = range, Ctrl/Cmd = toggle), the depth-ordered tile list, and "Mark selected tiles as Floor" on the Tiles toolbar.
v1.4.1
Jul 11, 2026

1.4.1 — 2026-07-11

Changed

  • "Sync to Levels Elevation" is now ON by default. An unfiltered placeables list on a real scene runs to hundreds of rows, so the filtered view is the useful default. Your choice is remembered from the moment you toggle it — including turning it off, which sticks.
v1.4.0
Jul 11, 2026

1.4.0 — 2026-07-11

Fixed

  • A level's FLOOR tiles were appearing in the list of the level below it — which also silently broke group drag-to-reorder, because selecting them produced a group spanning two elevations, which cannot be restacked.

    Neither available signal can say which level owns a tile. levels tags describe visibility, not ownership — in the tavern scene 54 of 86 tiles are tagged to all four levels, so tags would put a tile on every floor. And elevation is ambiguous at a boundary: elevation 10 is both the ceiling of Level (0|10) and the floor of Level (10|20), so a 2nd-floor floor tile genuinely sits inside the 1st floor's band. No test over those two fields can separate them.

    Better Levels now records ownership explicitly: a tile configured with a role (floor/roof/basement/ balcony) is stamped with the level it belongs to, and the Placeables filter and the restack both treat that as authoritative. Tiles Better Levels has not configured behave exactly as before.

    Self-healing: tiles configured before this release still point at their Define Surface region, and that region is tagged to exactly one level — so ownership is recovered from it automatically. No migration, and nothing to re-configure.

v1.3.3
Jul 11, 2026

1.3.3 — 2026-07-11

Fixed

  • Drag worked exactly once, then stopped. The listeners live on the tab's element, and core replaces that markup whenever the tab re-renders — which it does immediately after a drop, since the drop updates tiles. The install guard was a symbol on the application, so once the element and its listeners were replaced, the guard prevented ever re-binding: first drag fine, every drag after it dead until a reload. Binding is now tracked on the element, so a fresh element is always freshly bound.
  • Dragging a group did nothing. control() is a no-op while the Tiles layer is not the active canvas layer, so selecting rows in the sidebar could look selected while canvas.tiles.controlled stayed empty — and the drag quietly degraded to dragging just the row under the cursor. The Tiles layer is now activated before any selection change.
  • A refused drop now says why. Releasing on an illegal target used to do nothing at all, which was indistinguishable from the drag being broken. It now warns — and specifically calls out a selection that spans several elevations, which cannot be restacked together because sort is only compared within one elevation.
v1.3.2
Jul 11, 2026

1.3.2 — 2026-07-11

Fixed

  • Placeables-tab features are now installed independently. They previously ran as four bare calls in a row at init, so a throw in any one of them silently killed every feature registered after it — and drag-to-reorder, being last, was always the first casualty. A failure is now caught, logged loudly by name, and cannot take the others down with it.
v1.3.1
Jul 11, 2026

1.3.1 — 2026-07-11

Fixed

  • The Better Levels panel would not open on 1.3.0. The new "Region is both a Surface and a Stair" audit rule called hasBehavior(), which lives in fix-entity.mjs and was never defined in audit.mjs — so auditScene() threw the moment the panel asked it for an issue count, taking the whole panel down. It now uses audit.mjs's own isSurfaceRegion/isStairRegion.
v1.3.0
Jul 11, 2026

1.3.0 — 2026-07-11

Fixed

  • Stair elevation bands reached into levels the stair does not connect — and the audit was ENFORCING it. A stair's band ran from the lower level's floor to the upper level's ceiling. A level's ceiling is the next level up's floor, so the band swallowed a level too many: in the tavern scene a token standing at elevation 20 (on the 2nd floor) was inside all four ground-floor stairs at once. Worse, the stair-elevation audit rule expected that same wrong band, so every "Fix All" wrote the bug back. Bands now run floor-to-floor — from the lowest connected level's floor to the highest connected level's floor — which still contains the elevation a token stands at on both levels, but reaches no further. Across the tavern's 7 stairs this drops the number containing elevation 20 from 7 to 3 (the 3 that legitimately connect it). It also removes the infinite-top case on the roof stair.
  • A tile could steal another tile's surface region. Two overlapping floor plates both matched the same Define Surface region, so the second silently adopted the first's footprint and ended up with a surface that wasn't its own shape. A region already claimed by another tile is now skipped.

Added

  • Audit rule (red): "Region is both a Surface and a Stair." A region can be a floor you stand on, or a stair that moves you — never both, or standing on it teleports you. Nothing detected the ones that already existed. The fix strips the Change Level behavior and leaves it a Surface.
  • Audit rule (red): "Floor tile has no Define Surface region." Every other surface rule only validated regions that already existed, so a floor that never got one was invisible to the audit — which is exactly how the tavern's floors went un-surfaced and left tokens with nothing to stand on. Also catches a dangling link (region deleted) and a shared link (two tiles, one region).
  • "Mark selected tiles as Floor" on the Tiles toolbar — applies the floor preset and gives each tile its own Define Surface region. Better Levels cannot reliably guess that a tile is a floor, so this is the honest interface: you select, it applies.
v1.2.0
Jul 11, 2026

1.2.0 — 2026-07-11

Removed

  • Stair trigger gating has been removed entirely. Better Levels no longer intercepts the core Change Level behavior, so stairs now behave exactly as Foundry intends — a token changes level on entering the region, with no interference from this module. The "Stairs trigger when" and "Ignore stairs on the far side of a wall" world settings are gone, along with the per-region stairTrigger flag override. The approach proved unreliable in play and was not worth the risk to token movement.
  • Unaffected: Create Stairs mode (new regions become Change Level stairs), the stair audit rules, and everything else stair-related. Only the movement gating is gone.
v1.1.5
Jul 11, 2026

1.1.5 — 2026-07-11

Fixed

  • The drop did nothing. endDrag() cleared the drag state before calling the commit, and the commit read the dragged tile ids from that state — so it always saw an empty list and returned without writing anything. The drag UI worked perfectly and then threw the payload away. The ids are now passed through explicitly.
v1.1.4
Jul 11, 2026

1.1.4 — 2026-07-11

Fixed

  • Drag-to-reorder: the tile thumbnails were eating the drag. An <img> is draggable by default, so pressing on a row's thumbnail started a native image drag — and a native drag swallows every pointer event until it ends. That is why nothing happened during the press, the "N tile(s)" badge only appeared after the mouse was released, and the badges then piled up on screen (the pointerup that cleans them up never arrived). The thumbnails are no longer draggable, and native drag is suppressed outright inside the placeables list.
  • The drag now takes pointer capture, so move/up are delivered even if the row is re-rendered mid-drag, and it cleans up on pointercancel — no more orphaned badges.
v1.1.3
Jul 11, 2026

1.1.3 — 2026-07-11

Fixed

  • Drag-to-reorder now actually drags. Marking the rows draggable was not enough: core calls preventDefault() on the row's pointerdown for its own click handling, and a cancelled default there stops the browser ever raising dragstart. The handlers were installed and simply never invoked — no error, nothing to see. The drag no longer uses HTML5 drag-and-drop at all; it is driven from pointer events in the capture phase, which core cannot cancel out from under us.
  • A press only becomes a drag after the pointer moves ~5px, so a plain click still selects as before. A floating "N tile(s)" badge follows the cursor, the orange line shows where the drop lands, and Escape cancels the drag mid-flight.
v1.1.2
Jul 11, 2026

1.1.2 — 2026-07-11

Fixed

  • Drag-to-reorder did nothing at all. The tile rows never carried draggable="true", and a browser fires no drag events whatsoever on an element without it — so the listeners were live but were never called. Rows are now marked draggable, and re-marked after every re-render (core rebuilds them on search/filter). The drag also guarantees a non-empty dataTransfer, without which the browser cancels the drag the instant it starts.
  • Added game.modules.get("baileywiki-better-levels").api.drag.debug() — reports rows found, how many are draggable, and whether the handlers installed.
v1.1.1
Jul 11, 2026

1.1.1 — 2026-07-11

Added

  • Drag tile rows in the Placeables tab to restack them. An orange line shows exactly where the drop will land (above or below the row you are hovering). Dragging an unselected row drags just that row; dragging a selected one drags the whole selection, preserving its internal order. Dragging a row out onto the canvas still works as before.
  • Dropping reindexes that elevation band with even spacing rather than squeezing a value into a gap — deterministic, collision-free, and it repairs interleaved legacy sort values as a side effect. It reindexes over every tile at that elevation, including ones hidden by a filter, so reordering a filtered list can never scramble what you cannot see.

Fixed

  • Selection modifiers in the Placeables tab were backwards. Shift+click behaved like a toggle and Ctrl+click did nothing. Now: Shift+click selects the whole range between the anchor row and the clicked row (in displayed order), and Ctrl/Cmd+click toggles a single row in or out of the selection. Plain click selects one row and sets the anchor. Selection is the canvas selection, so the sidebar and canvas can never disagree.

Notes

  • Tiles can only be restacked within their own elevationsort is only ever compared between tiles at the same elevation, so honouring a cross-elevation drag would mean rewriting the tile's elevation, which in a Levels scene silently moves it to another floor. Such a drop is refused and the row is marked in red.
v1.1.0
Jul 11, 2026

1.1.0 — 2026-07-11

Added

  • Tiles in the Placeables tab are now listed by DEPTH, not alphabetically. Top of the list = drawn in front. The comparator is v14's real depth rule (elevation, then sort), so the list and the canvas finally agree, and you can see at a glance that a wall tile is sitting under a floor tile. Can be turned off in Settings.
  • Restack Tiles — select tiles on the canvas and move them above (or below) everything else. Solves the common legacy-scene problem where wall/door tiles are stacked beneath the room floor tiles that cover them. Tiles you did not select keep their exact stacking; only the selection moves, and its own relative order is preserved. Measure against the active level or the whole scene. The window previews every sort change (from -> to) before you commit, and offers a scene backup first. Quick bring to front / send to back buttons are also on the Tiles toolbar.
v1.0.12
Jul 11, 2026

1.0.12 — 2026-07-11

Fixed

  • Sync to Levels Elevation now drives core's own elevation filter — the min/max pair in the Placeables tab's Advanced Filter panel. That is the native mechanism for precisely this job, and it is what makes the feature actually work; the previous attempts reimplemented filtering on top of core's undocumented internals instead of just filling in the fields core already has. Turning Sync on fills Elevation min/max from the active level's band and refills them whenever you change level. A level with an infinite roof sets an OPEN upper bound rather than a literal Infinity, so the top level is not filtered down to nothing. Level assignment is still filtered alongside it.
v1.0.11
Jul 11, 2026

1.0.11 — 2026-07-11

Fixed

  • Sync to Levels Elevation still was not filtering. The wraps were installed on PlaceableTab.prototype, but the concrete subclasses (TileTab, WallTab, ...) define their own isEntryVisible / _matchesFilter / _onFilterByLevel, which shadow the parent — so none of our code ran. Every wrap is now applied to the tab instance, where an own-property always wins over the prototype chain.
  • Added a DOM enforcement pass as the guarantee: each row is resolved to its document via core's own _getPlaceableFromElement() and hidden directly if it fails the rule. Sync no longer depends on core's undocumented filter internals being called in the order we expect. It only ever touches rows it hid itself, so core's own hiding and the search box are untouched.
  • api.syncLevels.debug() now prints a readable table (elevation / levels / assigned / in-band / should-show / actually-hidden) plus a count of rows that should be hidden but are not.
v1.0.10
Jul 11, 2026

1.0.10 — 2026-07-11

Fixed

  • Sync to Levels Elevation was not actually filtering anything. The rule was hung solely on _matchesFilter, but core only calls that hook when _hasAdvancedFilters() reports an active advanced filter — and Sync is not one of core's filters, so the hook never fired and every entry passed. A ground-floor tile (elevation 0) stayed listed with Level 20–30 selected. The rule now also drives isEntryVisible() — the authoritative "is this row shown" gate — and forces the advanced filter path on while Sync is active.
  • Added game.modules.get("baileywiki-better-levels").api.syncLevels.debug(), which reports the active level, the installed wraps, and a per-tile verdict (assigned / in-band / shown).
v1.0.9
Jul 11, 2026

1.0.9 — 2026-07-11

Changed

  • Sync to Levels Elevation now tests level ASSIGNMENT as well as elevation. An entry must be both tagged to the active level and sitting inside its elevation band. Elevation alone was not a sufficient proxy for relevance — and for walls, which carry no elevation at all, it was no proxy whatsoever, so a wall tagged to the 2nd floor could show while you worked on the ground floor. Untagged placeables (empty levels) still count as "visible on every level" and are shown when their elevation is in band, so nothing legitimate silently vanishes on a partially-tagged scene.
v1.0.8
Jul 11, 2026

1.0.8 — 2026-07-11

Added

  • "Sync to Levels Elevation" — a new option in the Placeables tab's level dropdown. Instead of pinning the list to one hand-picked level, it follows the level you are working on in the Levels nav, narrowing a several-hundred-row placeables list down to the floor you are actually on. An entry shows when it is both visible to the active level and its elevation sits inside that level's band. Turning Sync on clears any explicitly-picked level; picking a level (or Clear) turns Sync off.
v1.0.7
Jul 11, 2026

1.0.7 — 2026-07-11

Fixed

  • Placeables-tab tile thumbnails now actually appear. The first cut located rows by matching a bare tile id in a data-* attribute; core tags rows with a UUID (Scene.x.Tile.y), so nothing matched and no thumbnails were drawn. Row lookup now resolves bare ids, UUIDs and embedded ids, attaches via render hooks as well as the palette class, and re-decorates rows the Filter box rebuilds as you type.
  • Added game.modules.get("baileywiki-better-levels").api.thumbs.debug() to report what the thumbnail code can see, for troubleshooting.
v1.0.6
Jul 11, 2026

1.0.6 — 2026-07-11

Added

  • Tile thumbnails in the Placeables tab. Each tile row in the v14 Placeables sidebar now shows a small preview of its own art, and hovering a row pops a large preview (with the tile's name, on a checkerboard so transparency reads clearly) — so you can hunt for a tile by sight instead of by name. Animated .webm / .mp4 tiles show a poster frame that loops on hover. Thumbnails are lazy-loaded for scenes with hundreds of tiles, and the whole feature can be turned off in Settings.
v1.0.5
Jul 11, 2026

1.0.5 — 2026-07-11

Fixed

  • Audit & Fix no longer throws "top: must be a finite number" on scenes with a roof level. Foundry stores an infinite level/region top as null, but the live document reports it as Infinity — and top ?? 0 does not catch Infinity, so we wrote it straight back and Foundry rejected the update. Every write of an elevation top now goes through one helper that converts a non-finite value to null (= infinite). This fixes the Fix All crash and the same latent bug in stair creation, surface regions, and tile auto-config.
  • The Level Manager no longer silently destroys an infinite roof. An infinite top used to load as Infinity, render as a blank number field, and get written back as 0. Blank now means infinite (with an "∞" placeholder), round-trips correctly, and passes validation.
  • The Audit window now refreshes itself after a migration. Running the v13 → v14 migration from the Audit left the window showing the stale "this scene needs migrating" result, so it looked like nothing had happened. The migration now waits for its document updates to settle and then re-runs any open Audit window against the converted scene, so you immediately see the real, v14-ready audit.
v1.0.4
Jul 11, 2026

1.0.4 — 2026-07-11

Changed

  • Stair triggering, redone. The 1.0.3 "token's centre" mode turned out to be a no-op — Foundry's own containment is already effectively centre-based, so testing the centre changed nothing (and could never fix the wrong-side-of-a-wall case, since a token across a wall is still inside the region polygon). It has been removed. The two mechanisms that actually work are now separated:
    • "Stairs trigger when"On entering (Foundry default) or Only when the token stops on the stair (new default), which waits for the move to genuinely finish before deciding.
    • "Ignore stairs on the far side of a wall" (new, on by default) → a stair region usually bleeds through a wall; this only fires the stair when no movement-blocking wall lies between the token and the staircase itself. This is the real fix for tokens going up from the wrong side of a wall.

Fixed

  • Migrated scenes no longer keep asking to be migrated. The legacy detector flagged any non-empty flags.levels, but a successful migration leaves harmless crumbs behind — backgroundElevation on the Scene and tokenHeight on Tokens — so an already-converted v14 scene flagged itself forever (and kept flagging itself after you migrated it). Detection now keys off the data that actually proves a scene is still v13: flags.levels.sceneLevels on the Scene, and flags.levels.rangeBottom / rangeTop on placeables. Verified against a real migrated scene (clean) and a real v13 scene (still caught).
  • "Only when the token stops" never fired. It tested movement.pending for remaining waypoints, but tokenMoveIn fires during the move — so waypoints are always pending and the condition never passed. It now hangs a continuation off movement.finished (non-blocking, to avoid deadlocking the movement pipeline) and re-tests the token where it actually comes to rest.
v1.0.3
Jul 11, 2026

1.0.3 — 2026-07-11

Added

  • Stairs no longer trigger prematurely. Foundry's Change Level behaviour fires the instant any part of a token's movement crosses into the stair region — which sends tokens up early, sometimes from the wrong side of a wall. A new "Stairs trigger when" setting controls this: On entering (Foundry default), When the token's centre ends up on the stair (new default), or Only when the token stops on the stair. A single stair can override the world setting via a flags.baileywiki-better-levels.stairTrigger flag. Works on every existing stair — no migration.
  • Legacy (v13) Levels scenes are migrated first. Scenes built with the old Levels module store their elevation data in flags.levels. The Audit now detects this and surfaces one red issue — "Migrate this scene to v14 Levels" — suppressing every other check until you do, because auditing (or fixing) un-migrated data is meaningless. The fix runs Mass Edit's well-tested migrateScene, which converts the entities to v14 core standards and turns the legacy Levels settings into real v14 levels (expanding flat levels and generating surface regions), with a scene backup offered first.

Changed

  • The "strip legacy Levels flags" fix is now suppressed on un-migrated scenes — it would have destroyed the very data the migration reads.
v1.0.2
Jun 27, 2026

1.0.2 — 2026-06-27

Added

  • Sample scenes. A new Sample scenes button on the helper panel opens a picker of bundled, ready-to-explore Levels scenes. The first is "Sample Tudor Building with Basement" — a four-storey Tudor tavern over a basement with fully wired Scene Levels (floor surfaces, stairs, lights, and walls). Importing creates a fresh, fully-editable copy and opens it — no compendium required.

Fixed

  • No more black-background floors. Generating levels (and Add level in the Level Manager) now gives every new floor the first floor's background instead of defaulting to black, and the ground floor's background is preserved when you regenerate.
  • Dropping a Mass Edit prefab no longer turns its regions into stairs — even with Create Stairs mode on, a prefab's own regions are left exactly as authored.
  • A Surface region can never also be a stair. Surfaces now strip any Change Level behaviour, and the stair auto-conversion is suppressed while a surface is being built (this also cleanly converts a region drawn as a stair into a pure surface via Make Surface).
v1.0.1
Jun 25, 2026

Baileywiki Better Levels — First Release (v0.0.1)

Better Levels makes Foundry VTT's native Scene Levels feature fast, forgiving, and hard to misconfigure. It automates the tedious parts of building multi-floor scenes — generating levels, tagging surfaces, wiring stairs, naming things — and continuously audits your scene for the easy-to-miss mistakes that break Levels, with one-click fixes.

Requirements: Foundry VTT v14 (system-agnostic — works with any game system). The Vehicle button additionally requires Baileywiki Mass Edit (multi-token-edit).


✨ Highlights

🏗️ Auto-Build Levels

Generate a complete, correctly-wired set of levels in seconds. Tell it how many above-ground floors, how many basements, whether to add a roof, and the floor height — Better Levels creates the level bands, names them with their elevation range (e.g. Level 02 (10 | 20)), and auto-assigns visibility between them by rule: above-ground floors see each other, basements stay sealed. Existing bands that already match are preserved.

🧱 Build Mode

A single toggle that turns your scene into a clean build surface:

  • Hides overhead clutter — tiles on the current floor's ceiling and any higher level are hidden, so you can see and work on the level you're building.
  • Adds Tile HUD buttons (shown only while Build Mode is on) for one-click configuration:
    • Auto-configure Floor — sets the tile up as a floor and creates its Surface region
    • Auto-configure Roof
    • Auto-configure Basement
    • Auto-configure Balcony
    • Auto-configure Vehicle — turns every region attached to the selected prefab into a Mass Edit Link Token "deck," so tokens ride it (requires Mass Edit)
    • Move to Level — retag and re-elevate the selected tile to another level

🩺 Scene Audit & Self-Repair

A live audit that catches the configuration mistakes that quietly break Levels — 26 rules covering elevation/level conflicts, missing or mis-placed surfaces, stair and elevator wiring, level visibility, light tagging, roof/floor occlusion, degenerate or overlapping bands, leftover legacy flags, and more.

  • Fix any issue with one click, or Fix All at once
  • Ignore an individual issue, or disable a whole rule per scene, when a build intentionally breaks convention
  • The helper panel shows a live count so you always know your scene's health

✨ Auto-Fix (Fix Entity)

Select any placeable and click Fix in the helper panel — Better Levels configures it from scratch. It infers everything it can from the entity itself (a tile's role, a region's surface-vs-stair purpose, the right level from a level tag or a deliberate elevation) and only asks when it genuinely can't tell — batching any questions into a single dialog with best-guess defaults pre-selected. It then configures the entity end-to-end (sets a tile's role + Surface region, wires a stair, tags lights/sounds/drawings/walls to the right level) and finishes with a one-click "Go to that level" button so you can immediately see the result. It deliberately does not assume a level from an elevation of 0 (the default placement state), asking instead.

🪜 Region Tools

  • Auto-Stair mode — while on, any region you draw becomes a Change Level stair connecting the current level to the one above, with movement and elevation pre-wired
  • Make Surface — turn any selected region(s) into a level surface, no tile required
  • Smart naming — new tiles are named from their texture filename instead of a random GUID, and managed regions are named by purpose and level: Surface Level 02 (10 | 20), Stair Level 01 ↔ Level 02

🎛️ Helper Panel

A compact, draggable panel that docks under the Levels nav and collapses to a single floating button. Centralizes the live toggles (Build Mode, Create Stairs) and actions (Generate, Audit, Set Defaults), and surfaces the current audit count at a glance.


⚙️ Configuration

Set Defaults

Opinionated, scene-building preferences you can turn on or off:

  • Seal basements (not visible to other levels)
  • Apply line-of-sight occlusion to floor tiles (not just roofs)
  • Give auto-configured roofs a Surface region of infinite height
  • Set Better Roofs' "Reveals Fog of War" on roofs

Module Settings

Additional feature toggles in the standard Foundry module settings:

  • Show the Better Levels toolbar button
  • Auto-show the helper panel on Levels scenes
  • Match elevation to level on token level-change — changing a token's level now also moves its elevation to that level's band (on by default; turn it off here to keep the old elevation-stays-put behavior)
  • Auto-set a light's elevation to its band on drop (lights stay untagged)
  • Auto-name tiles from their filename

📦 Install & Notes

  1. Install/enable Baileywiki Better Levels in any Foundry v14 world.
  2. (Optional) Install Baileywiki Mass Edit to enable the Vehicle / Link Token button.
  3. Open a scene, hit Generate Levels, then toggle Build Mode and start configuring tiles from the HUD.

This is an early first release (v0.0.1) — feedback and bug reports are very welcome.

v1.0.0
Jun 24, 2026

Baileywiki Better Levels — First Release (v0.0.1)

Better Levels makes Foundry VTT's native Scene Levels feature fast, forgiving, and hard to misconfigure. It automates the tedious parts of building multi-floor scenes — generating levels, tagging surfaces, wiring stairs, naming things — and continuously audits your scene for the easy-to-miss mistakes that break Levels, with one-click fixes.

Requirements: Foundry VTT v14 (system-agnostic — works with any game system). The Vehicle button additionally requires Baileywiki Mass Edit (multi-token-edit).


✨ Highlights

🏗️ Auto-Build Levels

Generate a complete, correctly-wired set of levels in seconds. Tell it how many above-ground floors, how many basements, whether to add a roof, and the floor height — Better Levels creates the level bands, names them with their elevation range (e.g. Level 02 (10 | 20)), and auto-assigns visibility between them by rule: above-ground floors see each other, basements stay sealed. Existing bands that already match are preserved.

🧱 Build Mode

A single toggle that turns your scene into a clean build surface:

  • Hides overhead clutter — tiles on the current floor's ceiling and any higher level are hidden, so you can see and work on the level you're building.
  • Adds Tile HUD buttons (shown only while Build Mode is on) for one-click configuration:
    • Auto-configure Floor — sets the tile up as a floor and creates its Surface region
    • Auto-configure Roof
    • Auto-configure Basement
    • Auto-configure Balcony
    • Auto-configure Vehicle — turns every region attached to the selected prefab into a Mass Edit Link Token "deck," so tokens ride it (requires Mass Edit)
    • Move to Level — retag and re-elevate the selected tile to another level

🩺 Scene Audit & Self-Repair

A live audit that catches the configuration mistakes that quietly break Levels — 26 rules covering elevation/level conflicts, missing or mis-placed surfaces, stair and elevator wiring, level visibility, light tagging, roof/floor occlusion, degenerate or overlapping bands, leftover legacy flags, and more.

  • Fix any issue with one click, or Fix All at once
  • Ignore an individual issue, or disable a whole rule per scene, when a build intentionally breaks convention
  • The helper panel shows a live count so you always know your scene's health

✨ Auto-Fix (Fix Entity)

Select any placeable and click Fix in the helper panel — Better Levels configures it from scratch. It infers everything it can from the entity itself (a tile's role, a region's surface-vs-stair purpose, the right level from a level tag or a deliberate elevation) and only asks when it genuinely can't tell — batching any questions into a single dialog with best-guess defaults pre-selected. It then configures the entity end-to-end (sets a tile's role + Surface region, wires a stair, tags lights/sounds/drawings/walls to the right level) and finishes with a one-click "Go to that level" button so you can immediately see the result. It deliberately does not assume a level from an elevation of 0 (the default placement state), asking instead.

🪜 Region Tools

  • Auto-Stair mode — while on, any region you draw becomes a Change Level stair connecting the current level to the one above, with movement and elevation pre-wired
  • Make Surface — turn any selected region(s) into a level surface, no tile required
  • Smart naming — new tiles are named from their texture filename instead of a random GUID, and managed regions are named by purpose and level: Surface Level 02 (10 | 20), Stair Level 01 ↔ Level 02

🎛️ Helper Panel

A compact, draggable panel that docks under the Levels nav and collapses to a single floating button. Centralizes the live toggles (Build Mode, Create Stairs) and actions (Generate, Audit, Set Defaults), and surfaces the current audit count at a glance.


⚙️ Configuration

Set Defaults

Opinionated, scene-building preferences you can turn on or off:

  • Seal basements (not visible to other levels)
  • Apply line-of-sight occlusion to floor tiles (not just roofs)
  • Give auto-configured roofs a Surface region of infinite height
  • Set Better Roofs' "Reveals Fog of War" on roofs

Module Settings

Additional feature toggles in the standard Foundry module settings:

  • Show the Better Levels toolbar button
  • Auto-show the helper panel on Levels scenes
  • Match elevation to level on token level-change — changing a token's level now also moves its elevation to that level's band (on by default; turn it off here to keep the old elevation-stays-put behavior)
  • Auto-set a light's elevation to its band on drop (lights stay untagged)
  • Auto-name tiles from their filename

📦 Install & Notes

  1. Install/enable Baileywiki Better Levels in any Foundry v14 world.
  2. (Optional) Install Baileywiki Mass Edit to enable the Vehicle / Link Token button.
  3. Open a scene, hit Generate Levels, then toggle Build Mode and start configuring tiles from the HUD.

This is an early first release (v0.0.1) — feedback and bug reports are very welcome.

Machine-readable feed: GET /api/v1/modules/baileywiki-better-levels/changelog

Comments(0)

Sign in to join the discussion.