Vertical slice part 1: tunable config, day/dusk/night clock, noise subsystem, lootable containers, inventory and hub stockpile
Specification
Motivation
This is part 1 of 3 of the Seminole playable vertical slice. It delivers the non-combat core systems that later parts build on: tunable config, the day/dusk/night clock, the noise system, looting into an inventory, and depositing into a hub stockpile. Parts 2 (canoe, weapons, infected) and 3 (night defense, barricades, full game flow and result) are separate proposals.
Constraints (confirmed by proposer)
- No compiler or CI in the sandbox. The maintainer compiles and runs the tests locally. Code must:
- follow existing project patterns and UE 5.8 APIs exactly;
- avoid uncommon or speculative engine APIs;
- keep each change small and compile-safe.
- Placeholder content only. All content is C++ runtime-spawned placeholder primitives that extend the #22 test environment. No new .uasset maps, meshes, animations, audio or widget blueprints.
- Solo only.
- No networking code or networking tests.
- Where cheap, put authoritative state (clock phase, stockpile totals) in GameMode/GameState or world subsystems so later replication is not blocked.
Assumptions
- A1 Config: One
UDeveloperSettingssubclass (C++ defaults, editable in Project Settings) holds all tunables:- Day 480 s, Dusk 60 s.
- Bow noise radius 500 uu, rifle noise radius 3000 uu. These are read by part 2.
- Container search duration 2 s.
- Supply amounts per container.
- A2 Clock end state: The clock runs Day → Dusk → Night and stops at Night. It broadcasts a phase-changed delegate and exposes
ResetToDay(). Part 3 consumes this delegate for night defense and the Result state. - A3 Noise listeners: Noise listeners implement a C++ interface (e.g.
INoiseListener). Part 2's infected will implement it. In part 1, a simple placeholder listener actor or a test double verifies delivery. - A4 HUD: The HUD is drawn with an
AHUDCanvas in C++ to avoid widget assets. - A5 Input: Interact uses the project's existing Enhanced Input setup.
- If an Interact action exists, reuse it.
- If not, add one following the #22 pattern.
- If no asset-free path exists, document the manual step needed.
- A6 Supplies: Supply types are an enum
{Food, Ammo, Materials}stored as integer counts.
Scope / Acceptance criteria
- Config: A settings class exposes every value in A1. No gameplay code hard-codes these values.
- Day clock:
- A subsystem or GameState-owned clock advances automatically from game start: Day, then Dusk, then Night.
- Each transition broadcasts a delegate with the new phase.
- Time remaining in the current phase is queryable.
ResetToDay()restores Day with full duration.- The game starts in Day without console commands.
- Lighting:
- The test environment's directional light (and sky light, if present) intensity interpolates from day to dusk values.
- Lighting reaches the night value at Night.
- HUD:
- Shows the current phase and time remaining.
- Shows a visible dusk warning when Dusk begins.
- Shows the player's carried supplies and the stockpile totals.
- Noise system:
- A world subsystem offers
EmitNoise(Location, Radius, Instigator). - Only registered listeners within
Radius(3D distance) receive the event, which includes location and instigator. - Listeners outside the radius do not receive it.
- A world subsystem offers
- Inventory: A
UActorComponenton the player pawn stores per-type supply counts, with add, remove and query functions. - Searchable containers:
- At least 3 containers are spawned at a designated scavenging area in the test environment.
- Interacting starts a timed search of the configured duration.
- On completion the container grants its configured supplies to the interactor's inventory.
- A searched container cannot be searched again and shows a visual change (e.g. a material or colour swap on the primitive).
- Stockpile:
- A stockpile actor is spawned at the hub.
- Interacting transfers all carried supplies into the stockpile, leaving inventory at zero.
- Stockpile totals live in authoritative state (GameState or the stockpile actor).
- A spend function (e.g.
TrySpend(Materials, N)) returns false without changing totals if the stockpile is insufficient. This is for part 3.
- Tests:
IMPLEMENT_SIMPLE_AUTOMATION_TEST(or the project's existing test pattern) covers:- Noise filtering: a listener inside the radius receives the event; one outside does not.
- Clock transitions: Day → Dusk → Night fire in order with correct durations (time advanced deterministically, not in real time); reset returns to Day.
- Loot flow:
- container search grants supplies;
- a second search grants nothing;
- stockpile deposit moves totals and empties inventory;
TrySpendsucceeds and fails correctly.
- Docs:
- ARCHITECTURE.md and/or a new ADR describe the config, clock, noise, inventory, container and stockpile systems and their extension points for parts 2 and 3.
- Docs explain how to try the slice in the editor.
- Manual verification list: The PR description lists everything the maintainer must verify manually: compile, test run, input binding, lighting.
- No regressions: Code is written to compile cleanly, and existing tests are not modified except where required.
Out of scope
- Canoe, weapons, infected AI (part 2).
- Night defense waves, barricades, repair, win/lose, Result state and restart (part 3).
- Co-op/networking.
- Save/load.
- New binary assets.
- Art, audio and polish.
Build #22
FAILEDModel claude-fable-5-1 · ceiling $13.75 · started 2 hours ago · finished 1 hour ago
10agent turns
208.3Ktokens
$0.63spent at list price
Builder summary
Build crashed: sleep interrupted
Agent log
2026-10-05T09:22:22Z Build job #22 started for feature #23 on Claude Managed Agents using claude-fable-5-1 at high effort (spend cap $13.75) 2026-10-05T09:22:24Z Managed Agents session sesn_01FTzQf8t3Qh27e6UthJjZNp (agent agent_016XFr3GNwJwne19m6LhhwTU v2, running claude-fable-5-1 at high effort, spend cap $13.75) 2026-10-05T09:22:24Z Watch it live: https://platform.claude.com/workspaces/default/sessions/sesn_01FTzQf8t3Qh27e6UthJjZNp 2026-10-05T09:22:31Z [claude] I'll start by exploring the repository to understand its structure and conventions. 2026-10-05T09:22:31Z [bash] cd /workspace/repo && git status && git log --oneline | head -20 && find . -type f -not -path './.git/*' | head -100 2026-10-05T09:22:37Z [bash] cd /workspace/repo && git branch -a && git ls-remote --heads origin 2>/dev/null | head -20; cat Seminole.uproject Source/Seminole/Seminole.Build.cs Source/Seminole/Seminole.cpp Source/Seminole/Seminole.h Source/Seminole.Target.cs Source/SeminoleEditor.Target.cs Config/*.ini 2026-10-05T09:22:44Z [claude] The spec references the "#22 test environment". There's an unmerged branch `nabled/feature-22-job-21`. Let me inspect it. 2026-10-05T09:22:44Z [bash] cd /workspace/repo && git fetch origin nabled/feature-22-job-21 && git log --oneline main..origin/nabled/feature-22-job-21 && git diff --stat main origin/nabled/feature-22-job-21 2026-10-05T09:22:44Z [tool error] fatal: couldn't find remote ref nabled/feature-22-job-21 2026-10-05T09:22:48Z [bash] cd /workspace/repo && git remote -v && git ls-remote origin 2>&1 | head; git fetch origin 2>&1 | tail -5; git branch -a 2026-10-05T09:22:53Z [claude] Main has advanced on the remote (likely #22 merged). Let me update. 2026-10-05T09:22:53Z [bash] cd /workspace/repo && git pull origin main 2>&1 | tail -3 && git log --oneline | head -5 && git ls-remote origin 'refs/pull/*/head' && find Source Config Content docs -type f | sort 2026-10-05T09:22:59Z [claude] Now let me read the #22 code thoroughly. 2026-10-05T09:22:59Z [bash] cd /workspace/repo && cat Source/Seminole/SeminoleGameMode.h Source/Seminole/SeminoleGameMode.cpp Source/Seminole/SeminolePlaceholderCharacter.h Source/Seminole/SeminolePlaceholderCharacter.cpp 2026-10-05T09:23:04Z [bash] cd /workspace/repo && cat Source/Seminole/SeminoleTestEnvironment.h Source/Seminole/SeminoleTestEnvironment.cpp Source/Seminole/Seminole.h Source/Seminole/Seminole.cpp Source/Seminole/Seminole.Build.cs Config/DefaultInput.ini Config/DefaultEngine.ini 2026-10-05T09:23:09Z [bash] cd /workspace/repo && cat docs/ARCHITECTURE.md docs/VALIDATION.md docs/adr/README.md docs/adr/0004-noise-event-system.md 2026-10-05T09:23:14Z [bash] cd /workspace/repo && cat README.md | head -150 && cat Source/Seminole/*/README.md && cat .gitignore && ls scripts scripts/editor && cat scripts/editor/create_test_map.py | head -60 2026-10-05T09:23:21Z [bash] cd /workspace/repo && git log --oneline main..origin/nabled/feature-162-job-194 | head -3; git diff --stat main origin/nabled/feature-162-job-194 | tail -3; git log --oneline main..origin/nabled/feature-163-job-225 | head -3; git diff --stat main origin/nabled/feature-163-job-225 | tail -3; sed -n 1... 2026-10-05T09:28:53Z Build crashed: sleep interrupted
Discussion · 0
No comments yet.