Replace the fraction-of-window positioning (which overlapped and didn't
scale) with a small layout system: the sidebar is authored in one fixed
virtual coordinate space and rendered at native panel resolution, so
element sizes stay constant relative to the panel at any window size and
fonts scale with it.
- level_editor/layout.lua: sections, scrolling list (with clip + hit-test
by point), scrollbar. Clip rects are scaled to real canvas pixels.
- Room view split into non-overlapping divs: search/back header, a
scrollable asset list (replaces the old row-paging + forward buttons),
a status strip, and a compact bottom control cluster.
- Mouse wheel scrolls the list; clicks map from window coords into the
virtual space via the same transform used to render.
- Sidebar canvas is panel-sized and blitted 1:1 (nearest filter, never
averaged) to stay crisp; editorDraw runs under a scale transform.
- Center text-only fields (level name) in their rect.
Also carried in main.lua (share the file, can't split cleanly here):
narrator require path fixed via love.filesystem.setRequirePath; sfxr
static uses waveform=NOISE again after the field rename; low-pass +
lower volume on the static loop.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
These were committed as empty submodule gitlinks with no .gitmodules,
so the folders were never populated and the game could not load
(require of libs/hump/timer, libs/sfxrlua/sfxr, narrator.narrator).
Checked out each at its pinned commit and vendored the files, matching
the existing bundled-libs convention. Removed the junk libs/libs/ tree.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
next-steps plan for cross-conversation dialogue state: WorldState as the
serialized source of truth, Ink books as disposable views.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>