Polishes
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: Demo-Readiness Polish Pass — redesign closeout review + full four-area polish
|
||||
date: 2026-07-04
|
||||
tags: [session, polish, demo, review, netcode, hud, audio, onboarding, dots-dev]
|
||||
permalink: gamevault/07-sessions/2026/2026-07-04-demo-polish-pass
|
||||
---
|
||||
|
||||
# Demo-Readiness Polish Pass (/dots-dev, ultracode)
|
||||
|
||||
Operator brief: *"overall complete polish pass, ready for a game demo"* → intake locked: hands-off public demo,
|
||||
standalone Windows co-op build, finish-the-redesign baseline, all four polish areas. Full decisions + finding
|
||||
table: [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]].
|
||||
|
||||
## How it went
|
||||
1. **Ground fan-out** (`wf_d3f1890a-8ca`, 3 read-only agents) — headline: the 07-02 log said "steps 1–11" but
|
||||
`Run Re-Do` already contained 12a/12b/13/14. Only the post-impl review + doc bookend were missing.
|
||||
2. **Baseline verify** — 452/452 EditMode + clean netcode Play boot (born-correct Staging on both worlds).
|
||||
3. **Post-impl adversarial review** (`wf_38ef58c2-8bd`, 3 lenses → per-finding critics, 15 agents, 0 failures)
|
||||
— 7 confirmed / 3 refuted. All 7 fixed same-session + pinned (`RunRosterRegressionTests`,
|
||||
`TerminalCampaignRollTests`); the two contradictory critic verdicts on the respawn stray line were
|
||||
adjudicated by reading the code (artifact confirmed, deleted).
|
||||
4. **Stability slice** — ConnectionWatchdog/SessionEnd/menu-reason plumbing; mode-aware outcome banner;
|
||||
terminal-save roll-forward; save-before-restart.
|
||||
5. **UI slice** — READY panel, drawn route map (Painter2D DAG + client path trace), onboarding re-author
|
||||
(the dead at-base Mine step was a first-run soft-lock), How-to-Play rewrite, DOWNED countdown.
|
||||
6. **Feel/audio slice** — 4-layer phase-locked procedural music, Fabricator can-die parity, core-hit alarm,
|
||||
landing grace, slash-arc reach fold (local+remote), Warrior cone VFX, boss bar+roar, rarity borders,
|
||||
depth dots, outcome flourish, shop pips, core-crystal tint system.
|
||||
7. **Sweep** — build scenes → MainMenu+Game only; `com.unity.ai.assistant` removed; corrupt whitespace-only
|
||||
`Simulation/Meta.meta` (committed in Run Re-Do; surfaced on the package re-resolve) deleted → regenerated.
|
||||
|
||||
## Validation
|
||||
456/456 EditMode · repeated Play smokes (launch conscription sampled tick-by-tick; wipe-abort self-validated;
|
||||
zero exceptions) · L3 screenshots: staging READY panel + meta shop, route map with lit path + depth dots,
|
||||
rarity boon modal. The route-map/boon states were forced via the disable-the-driver idiom
|
||||
(`ResolveSystemStateRef(handle).Enabled = false` on `RunDirectorSystem`, then write `RunInfo` server-side).
|
||||
|
||||
## Gotchas worth remembering
|
||||
- **A session log can lag the commit** — ground the working tree, not the log's "Remaining" section.
|
||||
- **Two critics can contradict each other** (one refuted, one confirmed the same stray line) — adjudicate at
|
||||
the source before acting.
|
||||
- **A committed `.meta` can be whitespace-corrupt and stay latent** until a package re-resolve forces a full
|
||||
reimport ("GUID cannot be extracted"); Unity's own advice applies — delete it, let it regenerate (folder
|
||||
GUIDs are unreferenced; script GUIDs live in their own metas).
|
||||
- **`CombatFeedbackSystem` already owns the `AbilityCooldown` fire-edge latch** (muzzle flash) — a second
|
||||
consumer needs its OWN latch field or it never sees the edge (CS0102 caught the collision).
|
||||
- The idle-player death→respawn→wipe-abort arc is the system working, not a bug — but it exposed the missing
|
||||
landing grace.
|
||||
|
||||
## Operator-side next steps
|
||||
Standalone build (`ProjectM/Build/Windows Player`) + 2-instance smoke: `-mhost` / `-mjoin 127.0.0.1`, then kill
|
||||
the host and expect `[ConnectionWatchdog] CONNECTION LOST…` in the joiner log (that line also proves the join
|
||||
connected); a dead-IP join should log the 12 s timeout. Onboarding fun-gate via Settings → Force Each Launch.
|
||||
Explicitly deferred to operator art curation: HudTheme structure icons, projectile/pickup placeholder meshes.
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
id: DR-044
|
||||
title: Expedition Redesign SHIPPED (steps 1–14) + Demo-Readiness Polish Pass
|
||||
date: 2026-07-04
|
||||
status: locked
|
||||
tags: [decision, expedition, roguelite, netcode, demo, polish, onboarding, audio]
|
||||
supersedes: parts of DR-031/DR-042 (base-mining loop text); completes the [[2026-06-29_Expedition_Redesign_Build_Spec]]
|
||||
---
|
||||
|
||||
# DR-044 — Expedition Redesign SHIPPED + Demo-Readiness Polish
|
||||
|
||||
## 1. The redesign is COMPLETE and reviewed
|
||||
|
||||
All 14 steps of the [[2026-06-29_Expedition_Redesign_Build_Spec]] (§§1–6 + §7 addendum) are built and live in
|
||||
commit `16e396841` "Run Re-Do" — the 2026-07-02 interim log stopped at "steps 1–11" but the commit itself
|
||||
contains 12a/12b/13 (permanent meta: `MetaCatalog` blob + born-correct seeding + SaveData **v6** +
|
||||
`MetaSpendSystem`) and 14 (HUD panels + biome + screenshots). **Lesson recorded: verify the working tree
|
||||
against the session log before planning — logs can lag the commit.**
|
||||
|
||||
The never-run **post-impl adversarial review** (3 lenses + per-finding critics, `wf_38ef58c2-8bd`, 15 agents)
|
||||
confirmed 7 distinct findings — ALL fixed + regression-pinned this session (456/456 EditMode):
|
||||
|
||||
| # | Finding (severity) | Fix |
|
||||
|---|---|---|
|
||||
| 1 | Stale `BoonOffer.Pending` on a dead-respawned (base-region) player stalls every reward gate 30 s and wedges the modal into the next fight (major) | RoomReward gate counts EXPEDITION players only; NO offer survives the gate exit (both paths zero all offers); HUD modal gated on `Lifecycle==RoomReward`. Pinned in `RunRosterRegressionTests`. |
|
||||
| 2 | `EnterRoom` conscripts EVERY `PlayerTag` — a mid-run late joiner is yanked into the fight (medium) | Server-only **`RunParticipant`** roster tag: stamped on all players at the launch edge, gates every advance/return teleport, released on Returning. Dead-respawned members keep the tag → re-conscripted (operator-locked default); late joiners stay home. |
|
||||
| 3 | HUD launch countdown used raw uint tick subtraction → wraps to ~71 M when the client's predicted tick passes `LaunchTick` (medium) | Signed `NetworkTick.TicksSince` with a >0 clamp (the ★ tick rule). |
|
||||
| 4 | `PlayerRespawnSystem` stray line unconditionally overwrote the spawn-center fallback with `PlotCenter(default)` (medium; edit-tool artifact) | Stray line deleted. |
|
||||
| 5 | Boon modal keyed on a lossy byte XOR — 1/256 stale-label collision on the unpicked-offer path (minor) | Exact `(o0\|o1<<8\|o2<<16)+1` int signature. |
|
||||
| 6 | HUD meta shop missed the D-F5 tier display clamp (minor) | Clamped. |
|
||||
| 7 | Edit-tool text artifacts in 5 files (comment mangles, stray `;;`) (minor) | All cleaned. Corrupt whitespace-only `Simulation/Meta.meta` (committed in Run Re-Do) deleted → Unity regenerated. |
|
||||
|
||||
## 2. Demo-readiness decisions (operator-locked this session)
|
||||
|
||||
Demo = **hands-off public play, standalone Windows co-op build**. Baseline = finish redesign, then polish all
|
||||
four areas (stability · combat feel · UI/session flow · audio/atmosphere).
|
||||
|
||||
- **Connection watchdog (`ConnectionWatchdogSystem` + `SessionEnd`):** a pure-join client whose ACCEPTED
|
||||
connection vanishes tears down to the menu with "CONNECTION LOST — the host ended the session."; a join that
|
||||
never connects times out at 12 s; an unparseable IP aborts immediately (`SessionEnd.Abort`, reason set by
|
||||
`ClientConnectionControlSystem`). `MainMenuController` shows the reason once. `[ConnectionWatchdog]` log
|
||||
lines double as join-success evidence in headless build smokes.
|
||||
- **PLAY AGAIN = clean teardown for all (operator fork):** the outcome banner branches on
|
||||
`WorldLauncher.LastMode` — Host: "END SESSION — ALL TO MENU"; Join: "LEAVE TO MENU"; Single: PLAY AGAIN
|
||||
Continues (loadSave). `StartSession` now checkpoints a live server before disposal.
|
||||
- **Terminal-save roll-forward (`SaveService.RollTerminalCampaignForward`):** a Victory/Loss save Continues as
|
||||
a FRESH campaign — outcome/goal/core reset to 0 (restore guards re-map), meta tiers/counters/ledger/
|
||||
structures survive. Without it Continue re-latched the dead banner from the first snapshot. EditMode-pinned.
|
||||
- **Procedural music (operator fork → asset-free):** `MusicSystem` — four phase-locked 9.6 s loop layers
|
||||
(bass/pad/arp/pulse; Am–F–C–G @100 BPM; bar-edge envelopes = click-free loops & chord changes), mixed by
|
||||
replicated state (Staging/launch/combat/boss/lull/siege/final-siege/outcome) + victory/defeat stings.
|
||||
- **Drawn route map (operator fork):** Slay-the-Spire node-map panel in `HudSystem` — client regenerates the
|
||||
full DAG from `RunInfo.RunSeed` (display only; Painter2D edges), walked path traced client-side, clickable
|
||||
next-layer nodes bind ONLY to the authoritative `RouteOpt*` bytes.
|
||||
- **Onboarding re-authored:** the old at-base **Mine step was a first-run SOFT-LOCK** (base nodes were removed
|
||||
in Step 11 — `OreNow > OreBaseline` could never satisfy at base). New cascade: Welcome → Move → Build
|
||||
(grubstake) → Fabricator → **ReadyUp** → Rooms (mine in-run) → Boon → Return → Defend → Done. Same 10 bits
|
||||
(re-meant, never renamed); veteran masks stay dormant. How-to-Play "The Loop"/Threats/Controls/Economy tabs
|
||||
rewritten for the run loop.
|
||||
|
||||
## 3. Polish additions (this session)
|
||||
|
||||
Clickable READY panel (toggle + party pips + 3-2-1 countdown + abort) · run-depth dots (room i/N through the
|
||||
whole run) · boss presence bar ("ALPHA HUSK" + red HP; client heuristic: a Boss room spawns exactly ONE enemy)
|
||||
+ arrival roar · boon rarity borders from draw `Weight` (100/60/30/10 → quiet/green/violet/gold) · meta-shop
|
||||
tier pips + auto-height rows · outcome flash + camera kick on the banner edge · DOWNED respawn countdown
|
||||
(client-local: death-edge latch + baked `DelayTicks`) · core crystal dims/blood-shifts with `CoreIntegrity` +
|
||||
white-hot hit flash (`CoreVisualFeedbackSystem` — the crystals are CLASSIC GameObjects in Game.unity;
|
||||
MaterialPropertyBlock, property-guarded) + core-hit alarm sting · countdown tick beeps ·
|
||||
**`Tuning.RoomEntryGraceTicks` = 100** (landing grace before the first enemy slot — an idle player died in
|
||||
~2 s of teleport-in) · **slash-arc reach fix**: the arc now folds the player's `StatModifier`s
|
||||
(`StatMath.Apply(MeleeRange)`) exactly like the server — class seed/boons/meta were missing from the visual
|
||||
(local AND remote arcs) · **Warrior cone ability VFX** (Slice-2 deferred): predicted `AbilityCooldown` edge +
|
||||
blob archetype gate → slash-arc sweep with the ability's effective geometry · Fabricator **can-die parity**
|
||||
(DR-032: bakes Health 120/DamageEvent/Destructible; it was invulnerable-by-exclusion from the AI snapshot) ·
|
||||
Staging top-line copy → intent framing (the READY panel owns the action) · EditorBuildSettings trimmed to
|
||||
MainMenu+Game · `com.unity.ai.assistant` package removed (console noise).
|
||||
|
||||
## 4. Validation
|
||||
|
||||
456/456 EditMode (from 452 at session start; +4 new pins, 2 traversal/2 room-director tests updated to the new
|
||||
contracts). Live Play: launch conscription arc sampled (Staging→Launching→InRoom, x=1000, participant=True),
|
||||
wipe-abort self-validated twice, L3 screenshots (READY panel · route map with traced path · rarity boon modal ·
|
||||
depth dots · meta shop). Console clean (the only remaining editor noise was the removed AI package).
|
||||
|
||||
## 5. Open / operator-side
|
||||
|
||||
Standalone build + 2-instance LAN smoke (operator runs it; `-mhost`/`-mjoin`, watchdog log lines = evidence) ·
|
||||
onboarding fun-gate playthrough (Force-Each-Launch toggle) · tick-batching perf re-measure in the build ·
|
||||
HudTheme structure icons vs new silhouettes + projectile/pickup placeholder meshes (art curation — needs
|
||||
operator eyes; explicitly deferred) · GoalProgress.Target demo pacing (currently 4 runs).
|
||||
@@ -395,3 +395,17 @@ DR-043's first-run onboarding shipped + Play-validated green (20/20 EditMode; li
|
||||
- **Forcing a specific step in a live Play smoke without input:** the step machine's `_step`/`_mask`/`_stepInit` are private — set them via reflection on `world.GetExistingSystemManaged(typeof(OnboardingSystem))`; remember an MCP `screenshot` can leave the editor **paused** (`EditorApplication.isPaused`), so the field write won't surface until you unpause. Pause + reflection-restyle the `_pointer` Label is also how to get a clean glyph capture (OnUpdate would otherwise overwrite the style next frame).
|
||||
|
||||
Net-zero: archive-only add (no CLAUDE.md bytes changed), so no inline condensation needed.
|
||||
|
||||
## 2026-07-04 — Demo polish pass: superseded CLAUDE.md core-loop bullet (archived verbatim)
|
||||
|
||||
Replaced in CLAUDE.md by the DR-044 ready-check-runs bullet (the expedition redesign retired
|
||||
`BaseFieldSpawnSystem`/`ExpeditionGateSystem`/`ExpeditionFieldSystem`):
|
||||
|
||||
> - **Core loop is base-local ★ (DR-031 · DR-042):** `BaseFieldSpawnSystem` (server) tops up `RegionTag{Base}` Ore nodes around `BaseGridMath.PlotCenter` (DISTINCT `BaseFieldSpawner`; `SetComponent`-override Region+Ore — Add throws; Ore-only). **Win = expedition CLEARS (DR-042):** `ExpeditionGateSystem` is sole writer of `GoalProgress.Charge` (+1/clear on RETURN); base sieges = **retaliation only**, blind `ScheduleEnabled` baked OFF (★ a serialized prefab bool ignores the C# initializer — flip `CycleDirector.prefab`, not the authoring default). `ExpeditionFieldSystem` teardown Expedition-filtered (else wipes base field); dormant expedition at `base+(1000,0,0)` hidden via `GhostRelevancy`. See [[DR-031_Base_Mining_Loop_Cohesion]] · [[DR-013_M6_Aether_Cycle_Region_Split]] · [[DR-042_Loop_Reshape_Expedition_Driven]].
|
||||
|
||||
Also archived from the same pass: the Stack "History" long sentence (6.4.7→6.5.0 validation detail — DR-002 +
|
||||
the 2026-06-17 session log hold it), and the harvest bullet's dead BASE→ledger half (base nodes no longer
|
||||
exist; in-run nodes → personal `InventorySlot`, spill→ledger, `G`=deposit is unchanged). One-off corruption
|
||||
note: `Assets/_Project/Scripts/Simulation/Meta.meta` was committed whitespace-only in `Run Re-Do` and stayed
|
||||
latent until a package re-resolve forced a full reimport ("The GUID … cannot be extracted") — deleted so Unity
|
||||
regenerated it; folder-meta GUIDs are unreferenced, so regeneration is safe.
|
||||
|
||||
Reference in New Issue
Block a user