9152aded4b
feat(command): route use X on Y to the combination engine
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-01 17:31:07 +02:00
6eabebff00
fix(combinations): guard null response; reject self-combination at load
...
- Combinations.tryUse: only write response when non-null and non-blank,
preventing NPE/IllegalArgument for effects-only recipes.
- CombinationFactory.fromDto: throw WorldLoadException when a == b,
since item singletons make a self-combination impossible at runtime.
- Tests: +effectsOnlyRecipeAppliesEffectsWithoutProduceOrResponse
(CombinationsTest 7→8), +rejectsSelfCombination
(CombinationFactoryTest 4→5).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 17:28:32 +02:00
ae7f9d6b05
feat(game): Combinations engine for use X on Y
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 17:22:16 +02:00
2747659800
test(loader): cover unknown consume id rejection
2026-06-01 17:19:41 +02:00
100b54c4d1
feat(loader): CombinationDto + CombinationFactory with id validation
2026-06-01 17:17:25 +02:00
c91bc3afea
feat(model): World.combinations field + backward-compatible constructors
2026-06-01 17:13:05 +02:00
022973dc75
style(test): drop unused import in CombinationTest
2026-06-01 17:11:37 +02:00
cf592edc57
feat(model): Combination recipe record + order-independent key
2026-06-01 17:08:14 +02:00
b41ac80194
feat(io): themed full-window menu overlay in the GUI
...
Replace the plain Swing JDialog menu with a glass-pane overlay that fills
the whole window: dark background matching the game palette, bundled font,
lavender heading, flat hover-highlighted buttons, Escape = last option. The
overlay hides the game chrome (HUD/map/quest panels) while in the menu and
rebuilds at the current frameScale*zoom on window resize, so it scales
correctly from startup.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-01 16:21:46 +02:00
182a6911a0
fix: EOF ends game loop (ConsoleIO returns null on EOF); settings.json excluded from save slots
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-01 15:39:08 +02:00
88e959adee
docs: mark main menu + save/load implemented; note minimal settings scope
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 15:30:51 +02:00
98b1561ef2
feat(io): SwingIO.choose renders the menu as buttons
2026-06-01 15:27:15 +02:00
361fd0939c
refactor(app): drop dead newSession param, unused import, restore main javadoc
...
- Remove unused `saves` parameter from `newSession(GameIO, SaveService)`
→ signature is now `newSession(GameIO)`, call site updated accordingly
- Remove unused `import thb.jeanluc.adventure.menu.MenuAction` (switch
uses unqualified constants; import was dead, compile confirmed clean)
- Restore `/** Standard JVM entry point. @param args ignored */` Javadoc
on `main` and restore full log message "Fatal error during game startup"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 15:25:01 +02:00
4604952f63
feat(app): main-menu shell loop wiring; gitignore saves/
...
Replace App.run with a main-menu shell (New Game / Load / Settings /
Quit) above the game loop, wire SaveCommand + MenuCommand into the
registry with an autosave callback, and remove the now-unused
QuitCommand. Migrate GameTest from QuitCommand to MenuCommand.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-01 15:17:46 +02:00
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