calic 77832c07b2 feat(map-editor): v0.2.0c.1 — drag-paint strokes
LMB-hold strokes a line of paints (Auto-Tile: each hovered vertex;
Direct: each hovered cell as an override). RMB-hold strokes a line
of erases (clear_vertex / clear_override). On mouse-press inside the
UI (toolbar / palette / side-panel) the drag never enters paint-mode
so toolbar interaction stays unaffected.

State machine:
 - press(button) outside UI -> drag_paint = "paint"|"erase"
 - while drag_paint and corresponding button still down -> dispatch
   paint at current snap_vertex / mouse_cell each frame
 - button release -> drag_paint = nil

Idempotency: maps.set_vertex / set_override / clear_* are no-op when
the target state is unchanged, so the per-frame repaint is cheap and
doesn't grow the JSON on save.
2026-05-29 01:05:39 +02:00

sporel-module-map-editor

Interactive map editor for v2 Sporel map files. Click-to-paint, vertical layer-chip overlay on the left edge, collapsible atlas+tile picker bottom-left.

Run

Default — edit the module's in-place work map:

bash scripts/run-map-editor.sh

With a target — copy a real map in, edit, copy back out:

bash scripts/run-map-editor.sh ~/Projects/Sporel/sporel-modules/spine-prototype/maps/demo.map.json

UI

  • Layer chips (left edge, vertical): top-of-stack down. Rf at top toggles roof-edit mode; the other eight chips select the active layer.
    • Left-click = set active layer (or toggle roof mode)
    • Right-click = toggle layer visibility (Rf chip ignores right-click)
  • Atlas + tile picker (bottom-left): collapsed chip shows the active tile. Click to expand; click again or outside to collapse.
  • Status chip (bottom-right): current mouse-cell coordinate plus a * when the map has unsaved changes.

Hotkeys

Key Action
Left click on map Paint cell with active tile (or set roof flag in roof-mode)
E Erase the cell under the mouse
R Cycle rotation 0 → 1 → 2 → 3 → 0
S Save to disk (overwrites the work map)
Esc Quit

Limitations (v0.1.0)

  • Tile thumbnails in the picker render as gray placeholders with tile-IDs as text — lib-core.maps v0.4.0 does not expose per-tile UVs to Lua, so visual thumbnails are a v0.2.0 task.
  • Atlas list in the picker is purely informational; if a map declares multiple atlases, the active atlas is set from state.lua defaults at startup and cannot yet be switched via UI (v0.2.0 hit-tests inside the expanded picker).
  • Engine bindings engine.render.draw_rect_lines and engine.render.draw_line are not yet registered — active-chip borders, hidden-layer strikethroughs, and the entity-slot divider will trigger runtime errors when their code paths execute. Adding the bindings is a small engine-side follow-up.
  • No undo/redo, no multi-tile brush, no entity placement, no heightmap editing — see the design spec §1 for the full out-of-scope list.

Spec

docs/superpowers/specs/2026-05-23-sporel-module-map-editor-design.md in the sporel-meta repo.

Description
Interactive map editor for v2 Sporel map files.
Readme 603 KiB
Languages
Lua 98.3%
Shell 1.7%