Commit Graph
314 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.6 ea9cf554c6 fix(client): decode tile_kind and fix entity alignment (#412)
Protocol decoder now reads tile_kind from VisibleTile and maps it to
the client's tile type string (floor/wall/door/object). GameState
falls back to visible_tiles when the test-mode tiles array is absent,
enabling live server tile rendering.

Fix entity-to-tile alignment: server sends tile-center render coords
(tile 16 -> 16.5) but entity renderer was using raw floats, placing
entities half a tile off. Now floors the coords to get the tile index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 02:07:29 +01:00
jpmschweitzerandClaude Opus 4.6 29c5003403 fix(simulation): add TileKind to VisibleTile wire protocol (#412)
Server was sending visible_tiles without tile type data, so the client
could not distinguish floor from wall in live mode. Add TileKind enum
(Floor/Wall/Door/Object) to VisibleTile, populated from WalkabilityMap
in the NaturalVision perception query. Update test fixtures to include
the new field. Uses #[serde(default)] for backward compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 02:07:19 +01:00
jpmschweitzerandClaude Opus 4.6 33f4f6078c feat(client): add input roundtrip integration test (#411)
Three tests validating the full client-server input path through a
live server: movement roundtrip (MoveNorth/MoveEast with position
verification), interact roundtrip (unit variant accepted as no-op),
and mixed sequence (movement then interact preserves position).

Catches integration seams that unit tests miss — each test spawns a
real server binary on a random port, connects via LocalBridge, and
exercises the TCP→deserialize→simulation→snapshot→decode pipeline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:48:35 +01:00
jpmschweitzerandClaude Opus 4.6 721e54491c chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:46:27 +01:00
jpmschweitzerandClaude Opus 4.6 473eda03cd feat(client): add live server mode with make game target
Add SR_LIVE=1 environment variable to switch SimBridge from test mode
to TCP connection. Default behavior unchanged (test mode).

- sim_bridge.gd: read SR_LIVE env var instead of hardcoded test_mode
- game_state.gd: find player entity by kind.variant == "Player" instead
  of hardcoded entity_id 1 (real server assigns different IDs)
- Makefile: add 'make game' (builds server, starts it, launches client
  with SR_LIVE=1, kills server on exit) and 'make stop' helper

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:46:09 +01:00
jpmschweitzerandClaude Opus 4.6 67978d0819 feat(client): wire interaction prompt target+verb to server (#405)
Enable the interaction data attachment in main.gd game loop. When E
is pressed and the prompt is active, target_entity_id and verb are
attached to the Interact action before sending to the server. Without
a target, bare Interact is still sent as safe fallback.

Completes the v0.1 interaction prompt data flow:
server sends nearby_interactions → client shows prompt → E press
attaches target+verb → SimBridge encodes and sends to server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:46:02 +01:00
jpmschweitzer 88cfded5b5 Merge branch 'server' into main — Sprint 4 server delivery (#18) 2026-02-13 01:21:02 +01:00
jpmschweitzerandClaude Opus 4.6 1fe03ac27d chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:20:13 +01:00
jpmschweitzerandClaude Opus 4.6 661769f028 feat(simulation): add line previewer CLI (#407)
CLI tool to preview monologue/dialogue line selection for a given game
state. 4 subcommands: dialogue (D-028 4-layer pipeline), monologue
(trigger + prerequisite evaluation), coverage (dead conversation
detection), sequence (walk-through simulation). Authoring tool for
content team — tests line trigger logic without running the full game.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:46 +01:00
jpmschweitzerandClaude Opus 4.6 67fef58020 feat(simulation): add YAML to RON converter tool (#403)
Build-time converter reads content YAML and emits RON format. Lives in
tooling/content-converter/ as standalone Rust crate. Runs via make
content-ron. Supports --dry-run, --verbose, --content-type filtering.
Not on critical path — engine consumes YAML in v0.1, RON is future-
proofing for runtime performance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:40 +01:00
jpmschweitzerandClaude Opus 4.6 d3b68012d9 docs(architecture): add seed configuration schema design (#394)
Design document defining what the randomizer produces at game-start:
FRIEND selections, pool draws, template assignments, triangle config,
entanglement config, contraband selection, starting knowledge. Includes
ChaCha20 RNG protocol, validation rules, and implementation roadmap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:34 +01:00
jpmschweitzerandClaude Opus 4.6 267d415173 feat(simulation): implement content loader Phase 2 (#408)
Extend content loader to read and instantiate real YAML content into
ECS entities. 2-phase spawn pipeline: Phase 1 creates entities with
core components (Want, Tolerance, Contentment, Personality, Tells,
Skills), Phase 2 resolves cross-references (Relationships, Secrets,
Information via KnowledgeGraph, DailyRoutine).

Loads enums, entity attributes, pools, templates, triangles, and NPC
profiles. Handles stub files gracefully. 7 integration tests against
real content files plus edge case tests for invalid data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:29 +01:00
jpmschweitzerandClaude Opus 4.6 4c008d6191 data(content): use WantKind enum keywords in NPC profiles
Change want.primary from narrative strings to WantKind enum keywords
(Safety, Wealth, Knowledge, etc.) across all 20 NPC profiles. Move
narrative text to want.description. Add Happiness to WantKind enum.
Add enum constraint to npc-profile.schema.json so make validate-content
catches invalid values at authoring time.

Fixes silent Want component drop where parse_want_kind() returned None
for all real NPCs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:21 +01:00
jpmschweitzerandClaude Opus 4.6 90e6dcb8e9 fix(content): update dialogue-pool schema arrays per D-035
situation, topic, and mood fields changed from single string to
array type to match D-035 specification (list<enum>). access and
trust were already correct as arrays.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:15 +01:00
jpmschweitzerandClaude Opus 4.6 3d1bf54fcc data(content): add pools, templates, and triangles for v0.1 (#389, #390, #391)
5 seed-time pools (single-candidate for deterministic v0.1 testing),
3 social site templates (logistics-hub, bar, smuggling-ring) with
role slot definitions per D-025, and 5 triangles (3 active fork,
2 passive) per D-024 workshop synthesis.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:10 +01:00
jpmschweitzerandClaude Opus 4.6 b0fec9af09 data(content): populate global enums and entity attributes (#387, #388)
Populate 9 enum YAML files (situations, topics, moods, triggers,
access-tiers, trust-tiers, activities, patterns, motivations) from
D-035 taxonomy and 16 canonical entity attribute keys from D-024
with A7 workshop updates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:19:02 +01:00
jpmschweitzerandClaude Opus 4.6 e309f66c99 chore(db): update database backup after copy merge
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 01:00:29 +01:00
jpmschweitzerandClaude Opus 4.6 e7f6444567 feat(content): add monologue pool and news ticker headlines (#399, #395)
200 monologue lines (100 per character) across 8 location files:
arrival flavor, NPC commentary, knowledge-gated contradiction lines.
20 dual-lens news ticker headlines for The Last Shift bar. First real
content load for the monologue system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:58:57 +01:00
jpmschweitzerandClaude Opus 4.6 086988a42f feat(content): populate NPC YAML profiles and PC-as-NPC briefs (#398, #383, #373)
Convert 17 wiki NPC profiles to engine-readable YAML. Add PC-as-NPC
behavior profiles for detective and smuggler. Add smuggler-perspective
FactId progression text (27 FactIds with asymmetric knowledge paths).
Add off-stage NPC nils-davan. All files validate against npc-profile
schema (32 files, 0 errors).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:58:52 +01:00
jpmschweitzerandClaude Opus 4.6 b672b9c269 feat(docs): restructure wiki taxonomy with templates and Krenn System entry (#301, #319)
Move wiki from docs/wiki/ to root wiki/. Add 14 category templates with
YAML frontmatter, governance model, hierarchical spatial structure
(system > station > district > location). Populate Krenn System entry
as first concrete star system. Update cross-references in workshop and
sprint docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:58:45 +01:00
jpmschweitzer baa348a70a Merge remote-tracking branch 'origin/client'
# Conflicts:
#	CHANGELOG.md
2026-02-13 00:10:37 +01:00
jpmschweitzerandClaude Opus 4.6 8117f775c5 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:05:25 +01:00
jpmschweitzerandClaude Opus 4.6 a1c5db9490 fix(client): make E2E tests resilient to entity ordering
Server proof room now has 3 NPCs instead of 1. Find player entity
by kind instead of assuming entities[0]. Wall-hides test checks
specific NPC position (16.5, 13.5) rather than asserting zero NPC
count. Corner-reveal test searches for NPC1 by position.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:05:07 +01:00
jpmschweitzerandClaude Opus 4.6 52972e6f21 fix(client): align tests and data with server v4 protocol changes
Server team shipped strict PROTOCOL_VERSION enforcement (c05ff7b),
1-indexed verb priorities, and "Observe" label for ExamineNpc.
Updates all test snapshots to include version: 4, fixes sim_bridge
test mode priorities (0-indexed → 1-indexed) and labels, replaces
v1 backward-compat tests with strict version rejection tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:04:58 +01:00
jpmschweitzerandClaude Opus 4.6 fdb88840bc chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:02:41 +01:00
jpmschweitzerandClaude Opus 4.6 d1cb0d129d docs(sprints): add sprint 4 "Feel" team briefings
Content conversion and authoring sprint — 19 tickets across copy (8),
server (9), client (1 carry-over), and CI (1). Critical path runs
through wiki→YAML NPC conversion (#398) to content loader (#408).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:02:28 +01:00
jpmschweitzer 7af8de0117 Merge remote-tracking branch 'origin/main' into client
# Conflicts:
#	CHANGELOG.md
#	client/scripts/autoloads/sim_bridge.gd
2026-02-12 23:45:48 +01:00
jpmschweitzerandClaude Opus 4.6 5d94363d48 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:43:52 +01:00
jpmschweitzerandClaude Opus 4.6 6bebbd9933 feat(client): add interaction prompt system (#405)
Server-driven interaction prompt that displays "E - Talk" when near
an interactable NPC. Decodes v4 nearby_interactions from snapshot,
stores in GameState, renders via InteractionPrompt UI with fade
animation. Extensible interface (get_interaction_target/get_selected_verb)
for future radial verb menu (v0.2).

- Protocol: decode nearby_interactions array with nested VerbOption structs,
  entity relationship/observation fields, tick_rate in GameTime
- GameState: store/clear nearby_interactions per snapshot
- SimBridge: test mode generates v4 format with structured verbs
- InteractionPrompt: PanelContainer with fade in/out, polls GameState
- Tests: 19 new test cases covering protocol, state, sim bridge, UI, encoding
- Fixture assertions updated for v4 protocol version

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:43:37 +01:00
jpmschweitzer 07e3c4bafd Merge remote-tracking branch 'origin/server'
# Conflicts:
#	CHANGELOG.md
2026-02-12 23:40:13 +01:00
jpmschweitzerandClaude Opus 4.6 c765572bea chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:33:10 +01:00
jpmschweitzerandClaude Opus 4.6 c05ff7b063 feat(client): enforce PROTOCOL_VERSION check in snapshot decode
Client now rejects snapshots where version != PROTOCOL_VERSION (4).
Returns null with error log on mismatch. Test snapshot updated to
use Protocol.PROTOCOL_VERSION and v4 game_time format (tick_rate
replaces paused field).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:32:49 +01:00
jpmschweitzerandClaude Opus 4.6 18d8253bfe refactor(server): decompose observer pipeline and fix interaction boundary
Extract visibility geometry into a separate system behind a
PerceptionQuery trait, enabling D-017 perception mode swapping.
Two-stage pipeline: compute_visibility_geometry writes to
VisibilityGeometry resource, compute_observer_snapshot reads it.

Remove KnowledgeGraph from compute_nearby_interactions (simulation
phase boundary violation). Verb availability stays in simulation;
POI-based priority adjustment moves to observer via
apply_poi_verb_priority helper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:32:41 +01:00
jpmschweitzer 30f6666d7d Merge remote-tracking branch 'origin/main' into visual 2026-02-12 23:28:25 +01:00
jpmschweitzerandClaude Opus 4.6 ebcaff1a05 chore(config): remove client .uid/.import gitignore additions
These patterns were added for the renderer (now separate). Client
gitignore rules are the client team's responsibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:26:39 +01:00
jpmschweitzerandClaude Opus 4.6 921d2aef0d refactor(assets): move sprite renderer to standalone project at renderer/
Separates the 3D-to-2D render pipeline from the game client into its
own minimal Godot project. No autoloads, no plugins, no game code —
just the render scene, models, textures, and export script. Eliminates
SimBridge parse errors and gdUnit4 scanning during renders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:26:16 +01:00
jpmschweitzerandClaude Opus 4.6 8a1b10786f chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:22:38 +01:00
jpmschweitzerandClaude Opus 4.6 3a01d9659f chore(config): add .uid and recursive .import to gitignore
Godot 4.6 generates .uid files for script resources and .import files
in subdirectories. Both are editor-local and should not be tracked.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:22:16 +01:00
jpmschweitzerandClaude Opus 4.6 2ed8fb5b37 feat(assets): add 3D-to-2D sprite render pipeline and /render-sprite skill
Godot @tool render scene that takes a textured 3D model and produces
2D sprites at 1024/256/64 from 4 cardinal directions with outlines
applied at working resolution. Camera at "the angle" (-72.5deg ortho).
Includes two POC wall models with Nano Banana textures, CLI wrapper
script with headless import step, and .uid files added to gitignore.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:21:41 +01:00
jpmschweitzerandClaude Opus 4.6 0358eedbc5 docs(workshops): archive art direction & mood board workshop (3 rounds + closing)
Four-agent workshop (Araminta, Ozzie, Miri, Gore) establishing visual
identity for The Settled Reach. 9 mood board images, 16 art direction
principles, 10 candidate decisions (D-042 through D-051), v0.1.1 sprite
plan. Post-workshop technical session resolved 3D render pipeline,
resolution chain (1024/256/64), and camera angle lock ("the angle").
Pipeline test samples included: Era 1 institutional wall + bar green
wall rendered through the full Nano Banana -> 3D model -> sprite chain.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:21:09 +01:00
jpmschweitzerandClaude Opus 4.6 e6bd577a5a chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:53:23 +01:00
jpmschweitzerandClaude Opus 4.6 0c91f5af21 chore(tooling): add make validate-content for schema validation
Python script validates campaign YAML files against JSON schemas in
content/_schema/. Maps files to schemas by directory context (npcs/
→ npc-profile.schema.json, etc.). Skips comment-only placeholder stubs.

Addresses Hoshe #2 review item.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:53:05 +01:00
jpmschweitzerandClaude Opus 4.6 0157d1fa38 test(server): add Entity::to_bits roundtrip and TickRate switch tests
- Entity::to_bits() roundtrip test guards against bevy version changes
  silently breaking wire IDs (Hoshe #1)
- PROTOCOL_VERSION constant used in test helpers instead of hardcoded 4
- TickRate switch mid-accumulation test verifies Half→Full→Paused→Half
  transitions preserve accumulator state correctly (Tyre N3)
- POI mid-range test now asserts priority=1 (Hoshe #4)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:52:59 +01:00
jpmschweitzerandClaude Opus 4.6 02fa89b1d7 refactor(server): extract observer tests to separate file
Split observer/mod.rs (820 lines) into production code (244 lines) and
tests (480 lines). Reduces module size per Hoshe #3 review item.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:52:52 +01:00
jpmschweitzerandClaude Opus 4.6 6f9537fff3 refactor(server): NearbyInteractionBuffer from Resource to Component
Per-entity Component attached to PlayerCharacter instead of global
Resource. Makes the interaction buffer multiplayer-ready (D-009) —
each observer gets their own buffer without pipeline refactoring.

Updated all 8 files touching the buffer: system signatures, player
spawn bundles, and ~30 test spawn sites.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:52:47 +01:00
jpmschweitzerandClaude Opus 4.6 c970d2eba7 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:23:17 +01:00
jpmschweitzerandClaude Opus 4.6 ba867564a8 fix(server): add error logging, protocol version, and architecture docs
- Replace silent Entity::to_bits() fallbacks with tracing::error in
  observer.rs and interaction.rs (makes unregistered entities loud)
- Add PROTOCOL_VERSION constant to types.rs, use in observer snapshot
- Document single-observer assumption on NearbyInteractionBuffer
- Document proximity-only (no LOS) limitation on compute_nearby_interactions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:34 +01:00
jpmschweitzerandClaude Opus 4.6 e2f2f4e590 refactor(server): remove dead generate_snapshot function
Delete generate_snapshot from bridge/mod.rs — superseded by
perception::observer::compute_observer_snapshot. Not referenced
in any schedule or test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:28 +01:00
jpmschweitzerandClaude Opus 4.6 9d53869ca7 refactor(data): restructure content directory for galaxy scale
Replace flat content/districts/ with hierarchical campaign/system/
station/district structure. Path mirrors canonical IDs, enables
glob-based discovery, and is multi-campaign/DLC ready.

- git mv 46 files preserving history
- New metadata: campaign.yaml, system.yaml, station.yaml
- Rewrite content.yaml with glob-based district discovery
- Add campaign, system, station JSON schemas
- Update district schema: hierarchy fields derived from path
- Update npc-profile schema: accept district-scoped IDs
- Add TODO to 17 dialogue/monologue pool files for generator revision
- Update _meta/README.md with new hierarchy documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:23 +01:00
jpmschweitzerandClaude Opus 4.6 8cd7ef21ae chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:14:56 +01:00