084b39e501
feat(game): autosave on quest completion
2026-06-01 15:12:18 +02:00
0f05680170
feat(command): save + menu commands (QuitCommand removal deferred to Task 11)
2026-06-01 15:10:10 +02:00
e4238e4553
test(menu): cover pickSlot selection and Back sentinel
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 15:03:18 +02:00
687e88e20a
feat(menu): MainMenu, SettingsMenu, MenuAction (frontend-agnostic)
2026-06-01 14:58:41 +02:00
d847928587
test(settings): cover corrupt settings file falls back to defaults
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 14:56:14 +02:00
206fc758a5
feat(settings): Settings + SettingsStore; runtime-togglable ConsoleIO
2026-06-01 14:52:28 +02:00
ed41418434
test(save): cover version mismatch + slug; clean up tmp on move failure
...
Add loadRejectsIncompatibleVersion test asserting SaveException on schema
version 999, assert derived slug in listReturnsSlotMetadata, and harden
save() to delete the orphaned .tmp file when the non-atomic fallback move
also fails before re-throwing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 14:50:10 +02:00
6a68d7e2f5
feat(save): SaveService disk persistence (atomic write, list, load)
2026-06-01 14:44:32 +02:00
3c7c9d2ad4
fix(save): restore visited set before setting current room; strengthen null-tolerance test
...
Reorder apply() so visitedRoomIds is restored before setCurrentRoom() is
called, ensuring the current room is never accidentally stripped from the
visited set by the subsequent clear(). Also adds a post-condition assertion
to applyToleratesMissingCollections that proves null roomItemIds leaves
room item tables empty after apply.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 14:42:15 +02:00
3be1036142
feat(save): SaveCodec capture/apply over a fresh world; tolerate null collections
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 14:34:48 +02:00
c92c143058
feat(save): SaveData/SaveSlotInfo/SaveException model
2026-06-01 14:29:55 +02:00
310ee65285
feat(io): GameIO.choose numbered-menu primitive (console default)
2026-06-01 14:26:43 +02:00
c392f80ed0
feat: restore hooks for flags, quest progress, switch state
2026-06-01 14:21:56 +02:00
58352087c4
test(game): strengthen legacy-constructor delegation assertions
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 14:19:54 +02:00
18336ecc44
feat(game): GameSession bundles savable state; turn + autosave hook
2026-06-01 14:15:44 +02:00
4ed1fa1010
feat(content): dark dungeon needs the lit lamp
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 23:08:42 +02:00
569cef20fe
feat: darkness gating for go/look/take/examine + HUD light
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 23:07:36 +02:00
c3d80f86d7
feat: Room.dark + Item.light flags and Light helper
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 23:04:42 +02:00
b23f706521
feat(content): victory & flee endings; front-door flee switch
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:50:46 +02:00
2238aa6ff5
feat(game): EndingEngine + per-turn end check with summary
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:49:00 +02:00
3ec540e41b
feat: Ending model + endings.yaml loading (ordered, optional)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:47:38 +02:00
1b22c996e1
feat(content): demo quest 'restore_power'; document quests command
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:34:57 +02:00
e3fb0c9fa6
feat(io): GUI quest-box under the map
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:33:57 +02:00
310d476264
feat(io,command): quests command, QuestText, per-turn quest tick
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:31:33 +02:00
a3600eadd7
feat(loader): quests.yaml loading + startQuest effect mapping
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:29:52 +02:00
513c7cb8d9
feat(game): QuestEngine (auto-advance + announcements) and QuestView
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:27:18 +02:00
dd16d1326b
feat(game): Quest model, QuestLog, START_QUEST effect
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:25:58 +02:00
a0b80f2a4b
feat(content): demo the state engine (generator unlocks/lights the cellar)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 22:01:57 +02:00
00bad46661
feat: switchable items apply effects when turned on
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:59:46 +02:00
258ab4f63b
feat: NPC reactions gated by conditions, applying effects
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:57:23 +02:00
268c24d4e3
feat: conditional NPC dialogue
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:55:15 +02:00
c9c019cea1
feat: state-dependent room descriptions (LookCommand resolution)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:52:57 +02:00
df4a46ae5b
feat: condition-locked exits (+ room/dialogue state plumbing)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:52:06 +02:00
228efaffcb
feat(loader): ConditionDto/EffectDto with toModel mapping
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:47:11 +02:00
5546b63d47
feat(game): world-state engine (GameState, Condition/Effect, evaluator/applier)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:46:29 +02:00
9b28e2927e
docs: note quest-log GUI box (under map) for quest sub-project
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:37:37 +02:00
8ab39cd535
fix(io): auto-scale GUI text with window size, consistent with the map
...
Body text/HUD font now derives from a window-relative auto-scale (starting
at uiScale, growing as the window grows) and is re-applied on resize, so the
text tracks the window like the map does. Ctrl +/- zoom still multiplies on
top of both. Removes the resize hiccup where only the map reacted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:26:09 +02:00
e80c6b65bb
fix(io): fit the GUI map to the side panel; re-fit on resize
...
MapPanel now scales the map to fit the side panel (min over width/height),
with the Ctrl +/- zoom as a multiplier on top, so it no longer overflows
and scrolls at normal zoom. The map re-fits whenever the window/side panel
is resized; side panel grows a little more (28%, max 460px) before capping.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:21:27 +02:00
f6f62b66d8
fix(io): scale the GUI map with HiDPI factor and live zoom
...
MapPanel had fixed pixel sizes and an 11pt font, so it ignored uiScale and
the Ctrl +/- zoom. It now multiplies all dimensions, strokes and the label
font by a scale set from uiScale x zoom in SwingIO.applyFonts().
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:14:31 +02:00
5ebbd2ce42
feat(io): adaptive ASCII map width; document map command, mark sub-project done
...
AsciiMap sizes room boxes to the longest visible name (capped) so names
like 'Dark Hallway' are no longer truncated; connector centering follows.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:09:08 +02:00
7948aa2088
feat(io): GUI MapPanel (Graphics2D) in the side panel; drop exits text
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:06:48 +02:00
a0560a6ec5
feat(game): push map to the IO each turn (GUI live update)
...
Game now derives the MapView from the world each turn; GameTest gains a
real World (the per-turn map push needs it).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:04:14 +02:00
fcf8083b7c
feat(io,command): map command + GameIO setMap/showMap, console ASCII
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:02:17 +02:00
9ce939167c
feat(io): AsciiMap console renderer for MapView
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 21:00:35 +02:00
c03123d5ae
feat(map): MapLayout BFS grid layout with fog of war
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:59:52 +02:00
e10ff2cf99
feat(io): MapView model (CellState, RoomCell, Connection, MapView)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:58:58 +02:00
42dbcd9696
feat(model): track visited rooms on Player for the map
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:58:21 +02:00
13f34e1694
fix: correct .gitignore for .superpowers/ (was glued to .DS_Store line)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:38:10 +02:00
b042d7e0ef
fix(io): responsive side-panel width (ratio of window, clamped min/max)
...
Side panel (map slot) now sizes to ~25% of window width, clamped to
[160, 320] scaled px, recomputed on resize — instead of a fixed width.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:29:51 +02:00
9316f67c31
docs: mark presentation layer (sub-project 1) as implemented
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-05-31 20:25:42 +02:00