Commit Graph

297 Commits

Author SHA1 Message Date
Bastian Wagner
d0eecc45d6 sprites 2026-08-23 19:25:57 +02:00
Bastian Wagner
bbd5dbbd1f traveling 2026-08-23 18:47:11 +02:00
Bastian Wagner
5fa344dbe2 seed 2026-08-23 18:31:31 +02:00
Bastian Wagner
8125a4396c Merge branch 'slice/0.10-abandoned-watchpost' 2026-08-23 17:36:06 +02:00
Bastian Wagner
67287faf96 docs: move acceptance-criteria evidence out of the spec document
The 0.10 spec is the project owner's requirements document, not a place
for an implementer's verification narrative. Move the per-criterion
evidence added for the ten ticked boxes into the implementation notes
as a new section 8, leaving the spec's Acceptance Criteria section as
just the ten checkboxes. While moving it, make explicit that criterion
2's evidence (server-authoritative travel timing) is inference over a
generic TravelService test plus this connection's seed values, not a
test exercising the Burned Road to Watchpost leg directly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 17:34:08 +02:00
Bastian Wagner
c39ba369c3 art 2026-08-23 17:28:56 +02:00
Bastian Wagner
0dfb62bfc4 fix(api): clean up this slice's own lint violations
Fixed five prettier/prettier formatting errors in the three spec files
Slice 0.10 wrote or edited (world-discovery.service.spec.ts,
local-location-interaction.spec.ts, vertical-slice.seed.spec.ts).
Scoped by hand to just those locations so the pre-existing errors
elsewhere in the workspace, unrelated to this slice, are left alone.

Also corrects the implementation notes, which previously understated
the lint state as entirely pre-existing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 17:24:03 +02:00
Bastian Wagner
cf05941b9a Merge branch 'slice/0.10-abandoned-watchpost' 2026-08-23 17:18:03 +02:00
Bastian Wagner
8b6b42c19b docs: record the Slice 0.10 watchpost implementation and its deviations
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 17:14:01 +02:00
Bastian Wagner
5c479e1f93 art 2026-08-23 17:06:47 +02:00
Bastian Wagner
40d69693ba feat(web): announce a newly discovered route 2026-08-23 16:56:48 +02:00
Bastian Wagner
25f8d0218a art 2026-08-23 16:52:00 +02:00
Bastian Wagner
06721f24e0 fix(web): style combat guard/enrage banners off semantic classes, not test hooks 2026-08-23 16:51:07 +02:00
Bastian Wagner
b2a7fc59d0 feat(web): show monster guard and rage on the combat screen 2026-08-23 16:44:07 +02:00
Bastian Wagner
2489b9308f fix(web): resize the Raider Captain icon to actual icon size
The hand-made captain icon was copied verbatim at its 1254x1254 authoring
resolution instead of being scaled down, shipping an 80x heavier PNG under
a -128 filename to every hunt card and combat surface showing the Captain.
Resize it to 128x128 like its siblings while keeping the authored
composition; also stop the loop from writing a throwaway cropped icon for
that key before the hand-made one overwrites it.
2026-08-23 12:09:55 +02:00
Bastian Wagner
06450a0d36 feat(web): derive and register the watchpost artwork 2026-08-23 12:02:20 +02:00
Bastian Wagner
b3ca4687dc feat(seed): open the abandoned watchpost and the route beyond it 2026-08-23 11:50:21 +02:00
Bastian Wagner
35964683f7 feat(seed): add the watchpost trade goods and their loot tables 2026-08-23 11:38:12 +02:00
Bastian Wagner
ac7750902a perf(api): load the discovery set once per location request
getCurrentLocation was calling isTravelAllowed per connection, re-querying
the character's discovered locations once per gated exit. Extract the
gating rule into a pure, synchronous WorldDiscoveryService.isRouteOpen so
the map filter can load the discovery set once and filter in memory, while
isTravelAllowed (TravelService's entry point) keeps its exact signature and
behaviour by delegating to the same rule. Also pins that discoversLocationKey
never reaches the client payload.
2026-08-23 11:28:42 +02:00
Bastian Wagner
37d025f401 feat(api): reveal the ash pit route from the watchpost hotspot 2026-08-23 11:18:20 +02:00
Bastian Wagner
aaa7146c0c feat(api): refuse travel down an undiscovered route 2026-08-23 11:05:53 +02:00
Bastian Wagner
3f336bfc34 fix(api): add activeGuard and enraged fields to CombatMonsterState 2026-08-23 10:57:28 +02:00
Bastian Wagner
604581be34 feat(api): track which locations a character has discovered 2026-08-23 10:52:45 +02:00
Bastian Wagner
420205a254 feat(api): report monster guard and enrage state in the combat DTO 2026-08-23 10:45:35 +02:00
Bastian Wagner
8a053123b9 feat(api): let wounded monsters turn aggressive 2026-08-23 10:37:22 +02:00
Bastian Wagner
739467861a feat(api): let monsters raise a breakable defensive guard 2026-08-23 10:27:01 +02:00
Bastian Wagner
dd73f708c7 feat(api): add schema for watchpost discovery and guard events 2026-08-23 10:15:10 +02:00
Bastian Wagner
e3afc13c52 chore: ignore the superpowers scratch directory
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012NjEPjZ8R8e9c23z3vR8bt
2026-08-23 10:12:29 +02:00
Bastian Wagner
3e4599c8b4 docs: plan the Slice 0.10 Abandoned Watchpost implementation
Thirteen TDD tasks from the approved design: schema, the guard and
enrage combat abilities, the discovery service and its two enforcement
points, the seed content, the derived artwork, and the two frontend
surfaces. Each task carries its own failing test, the code to make it
pass and a commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012NjEPjZ8R8e9c23z3vR8bt
2026-08-23 10:08:54 +02:00
Bastian Wagner
bdcfe211ca docs: design the Slice 0.10 Abandoned Watchpost
Records the seven decisions taken while brainstorming the slice: a
per-character discovery table gating the Ash Pit route, a stub Ash Pit
so the route has a real target, guard and enrage as content-driven
combat abilities, a POI rather than a quest as the investigation, two
new trade goods above the Burned Road tier, a dedicated
WorldDiscoveryService, and the deliberate crossing of the two raider
artwork files so each enemy matches its role.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012NjEPjZ8R8e9c23z3vR8bt
2026-08-23 09:54:20 +02:00
Bastian Wagner
2435d25d0a art 2026-08-23 09:48:31 +02:00
Bastian Wagner
ca237cbfa2 Merge branch 'slice/0.9-first-quest-and-bag-tutorial' 2026-08-23 09:08:43 +02:00
Bastian Wagner
c25397b544 test(seed): follow the retuned trade-good drop chances
Commit 9391645 lowered the three common guaranteed trade goods from a certain
drop to 60% and left the rare Charred Raider Insignia at 100%, but the seed
test kept asserting 1.0000 for all four and has been failing since.

Asserts the real per-item value instead of one shared constant, so the next
retune fails on the number that actually changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 09:08:31 +02:00
Bastian Wagner
2c96163a03 Merge branch 'master' into slice/0.9-first-quest-and-bag-tutorial
master turned the gate watch into painted scenery with its own portrait and
result image; Slice 0.9 turns that same hotspot into a real NPC. Kept the
NPC doorway and dropped the result text and image with it -- a hotspot
carries one or the other, never both.

The warden now uses master's `graufurt-gate-watch.png` instead of the raw
copy this branch added: same figure, already optimized. Borin keeps master's
optimized portrait for the same reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 08:58:21 +02:00
Bastian Wagner
70ee207f1f docs: record the Slice 0.9 quest system and its deviations
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:36:42 +02:00
Bastian Wagner
3a84fd5371 feat(web): show quest markers on location hotspots
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:28:55 +02:00
Bastian Wagner
ff8b7c8b78 feat(web): run quest steps from the NPC screen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:19:16 +02:00
Bastian Wagner
bc0d910190 feat(web): add the quest journal
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:12:09 +02:00
Bastian Wagner
636efb6b5a feat(web): add quest API contracts
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:05:53 +02:00
Bastian Wagner
7b738a072d art 2026-08-22 23:03:48 +02:00
Bastian Wagner
81542eb5bb feat(quests): expose the quest log and step endpoints
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:03:17 +02:00
Bastian Wagner
8f37c15654 feat(npcs): derive quest markers for the local view
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:59:22 +02:00
Bastian Wagner
b9dafd56ff feat(quests): accept, advance and complete a quest chain
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:54:44 +02:00
Bastian Wagner
d1cca086c6 feat(conditions): evaluate QUEST_ACTIVE and QUEST_COMPLETED
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:48:02 +02:00
Bastian Wagner
69a26460ae notice board 2026-08-22 22:46:58 +02:00
Bastian Wagner
e13f6533e5 feat(quests): read quest progress from owned items and bag capacity
Adds a hint to the second pelt hunt: the Hide Bag holds five of any hide,
so Tough Hides can crowd out the fifth pelt with no way forward shown.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:44:53 +02:00
Bastian Wagner
fb7a96f032 layout interactions 2026-08-22 22:42:55 +02:00
Bastian Wagner
3a67dca86c feat(quests): derive the active objective from owned quantity
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:40:47 +02:00
Bastian Wagner
242c0935fa feat(quests): seed Trouble Beyond the Gate and the South Gate Warden
The demo character no longer starts with a free Basic Hide Bag: the
bagless HIDE capacity of 1 is what the quest chain exists to teach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:39:30 +02:00
Bastian Wagner
93916457cb icons 2026-08-22 22:34:51 +02:00