Commit Graph

263 Commits

Author SHA1 Message Date
kronic b143eb6bb5 LANTERN P1 step 1b: per-socket effective-stats fold (additive)
Per Phase1_Combat_Gym_Build_Spec §7 (additive; legacy single EffectiveAbilityStats + its
fold stay until steps 2/2.5 migrate readers, then retired):
- EffectiveSocketStats: 4-wide derived (non-replicated) per-socket effective-stats buffer.
- PlayerAuthoring bakes it (4 rows).
- StatRecomputeSystem: a SECOND fold loop (separate query, under the 7-arg cap) folds each
  socket's SparkId blob base with the SHARED StatModifier band (uniform; per-Spark warping =
  Phase 4) into EffectiveSocketStats[i]; empty socket (SparkId 0) -> zeroed default.
  Fixed CS1654 by writing through a mutable local copy of the buffer handle.
L1 clean; L2 489/489 (new SocketFold_Folds_Per_Socket_With_Uniform_Band).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:43:31 -07:00
kronic 67095024b9 LANTERN P1 step 1: 4-socket kit data model (player-ghost re-bake)
Additive socket data model per Phase1_Combat_Gym_Build_Spec §3 (no behaviour; legacy
AbilityRef/AbilityCooldown left intact for the step-2 migration):
- AbilitySocket: cold per-socket loadout buffer (EquipmentSlot-modelled, [GhostField] byte
  SparkId, SendToOwnerType.All, 4 rows baked empty).
- SocketCooldown: hot owner-predicted per-socket cooldown (4x [GhostField] uint + Burst-safe
  switch indexer; SendToOwnerType.All for remote ability-feel parity with AbilityCooldown).
- FrameId: replicated [GhostField] byte frame/class signal (SendToOwner; the class source the
  socket model needs since no single ability id maps 1:1 to a class).
Baked onto the player ghost in PlayerAuthoring. L1 clean compile + domain reload.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:35:58 -07:00
kronic 6474e8faff Docs: LANTERN Phase 1 combat review-hardened — Build Spec + DR-050
Adversarial pre-code review (wf_c7575828-934; 23 agents, 0 failures) over the Phase 1
combat-gym design raised 19 findings (8 CONFIRMED + 11 PARTIAL, 0 refuted) and caught
design-breakers before code:
- SpawnId bit budget exhausted (owner16|fireCount12|fork4) -> repack owner14|socket2|
  fireCount12|fork4 so 4 sockets don't collide/desync.
- "KEEP as-is" client feel layer is a real migration (CombatFeedback/PlayerAnimationDrive/
  HUD read the reworked AbilityRef/AbilityCooldown) + needs a new replicated class signal.
- predict-spawn is Projectile-only (Aoe/Hitscan/decoy = Cone-precedent server-only spawn);
  Blink = velocity-blink in its own system (not a transform teleport); SocketCooldown hot
  not cold; EffectiveAbilityStats 4-wide; windup needs a rollback-safe resolve tick;
  Harpooner reel + player zone = new server-only code, not salvage.

Verdict: pass-with-changes on all 3 lenses, no redesign. Phase1_Combat_Gym_Build_Spec =
the implementation contract (8-step build order, wire/bake churn, open risks, ledger).
DR-050 records it; pre-review design -> superseded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 08:57:11 -07:00
kronic 831c41c711 Art: LANTERN A0 material foundation — palette atlas + 3 master materials
The material-decision keystone (Art_Direction_Lantern / Lantern_Art_Pipeline_Recipes):
one shared palette atlas + ~3 materials, zero per-asset texturing.
- PaletteAtlas.png: 8x8 swatch grid encoding the ontology (warm-gold light / corpse-green
  + cold-blue gloam / lure-red bait / white-hot conversion / neutral / steel); sRGB, point,
  no-mip, clamp, uncompressed.
- M_Lit_Palette (statics, Lit URP graph), M_Skinned_Palette (creatures/suits, the
  deformation-aware AnimatedLitShader with per-instance tint + vertex-colour), M_Emissive_Gloam
  (URP/Lit + HDR emission; hue/intensity = the gloam param axis). All wired to the atlas.

Dedicated master-shader graphs (flicker param, Hybrid-Per-Instance on statics) + the
style-proof scene are the next A0 steps. Verified by material values, not just a render.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 08:47:31 -07:00
kronic 07a07ec64d Docs: LANTERN — record operator decisions (all parked questions resolved 2026-07-14)
Build Phase 1 gym first; standing ★-review auth; build A0 material foundation now;
delete siege branches. Phase 1: manual aim (auto-target cut), 4 discrete ability buttons,
Harpooner yanks target-to-you, roadmap 5 Sparks. Fresh save epoch (no migration).
Dark-side contact = non-telegraphed chip. Lantern = free-position plant.

Locked into: operator-questions (resolved summary), Phase 1 spec (open forks -> resolved),
currency spec (fresh saves), world-model Build Spec (operator-resolutions block).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 08:33:38 -07:00
kronic 0e2d51146d Docs: LANTERN tone bible (Phase 7 register bounds) — commit the file linked by prior commits
The tone bible was authored during the autonomous run but slipped between commit batches;
several already-pushed docs (Phase 7 design, operator questions, session log B) link to it.
Wordless Wicks + lamp-morse; per-voice register bounds (Keeper/Siren/Selkie/Klabautermann/
Anchorite/berths); warmth-against-dread; gates all bark generation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 00:01:51 -07:00
kronic d9c383cf33 Docs: LANTERN Phase 6/7 design notes (finale + station) — per-phase coverage complete
- Phase 6 (finale): shelf-boss on the BossState/BossAISystem chassis (multi-phase reskin,
  signature-Spark drop); one scripted Serpent-tide via the world-model burn/un-pin + hazard
  director + loss-floor, Siren-forecast; Loudness-driven co-op scaling.
- Phase 7 (station/voices): the hub = the world-model permanent home pocket; Lamp meter =
  GoalProgress + visible growth; rack/bench/library/Bell reuse class-swap/sockets/culture/
  transit; Keeper (OnboardingSystem skin) + Siren (hydrophone) + lamp-morse; tone bible gates barks.
- Roadmap index now links all phase design specs (full slice designed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 00:00:39 -07:00
kronic d005f140db Docs: LANTERN roadmap index + Phase 4/5 design passes + session log B
- Roadmap_Lantern_Slice: Phase-0 status callout + doc index (all Phase-0 artifacts linked).
- Phase 4 (mutations): mostly a re-theme of the shipped boon overhaul (DR-047) + Gloam gating
  + Tallow fixing (persistence) + raw-socketing + culture library; salvage map + gate.
- Phase 5 (death/recovery): the split, stranded suits (deterministic relocation), body-carry,
  flame-share revive, the Tender solo valve, Selkie tariff; builds on the world-model
  in-pocket-death decision (C4); the slice's 2nd falsifiable-test half.
- Session log Part B: the autonomous design pass + the world-model review record.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 23:58:47 -07:00
kronic fc31d066d0 Docs: LANTERN Phase 0.3 world-model review-hardened — Build Spec + DR-049
Adversarial design review (wf_aa6fb661-e25; 22 agents, 0 failures) over the world-model
proposal + ground-truth code raised 18 findings (12 CONFIRMED + 6 PARTIAL, 0 refuted) and
caught real design-breakers before any code:
- DP-1/RS-1 (HIGH): the seed model was self-contradictory (RunMapMath regenerates the WHOLE
  graph per seed, incompatible with a persistent pinned prefix) -> split: graph topology is
  a pure function of WorldSeed ONLY; DescentSalt re-knots content; pinning freezes PinnedSalt.
- NR-2/RS-3 (HIGH): salvaged respawn warps a dead Wick to base -> splits the co-located party
  -> in-pocket death; warp gated behind party-wipe; revive is new code, not salvage.
- DP-2 (HIGH): born-correct restore is per-entry lazy replay, not a boot one-shot.
- NR-1 phantom-kill CombatFeedback fix; NR-3 enemy wind-up gated on the light-union;
  RS-2 RegionTag->PocketTag is a ~23-site semantic rewrite, not a rename.

World_Model_Build_Spec.md = the review-hardened contract (all 18 folded, findings ledger,
build order, open risks). DR-049 records the decision. Spike -> reviewed; proposal -> superseded.
New forks parked (dark-contact policy, lantern placement, END-1/EB-1 mothball timing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 23:53:59 -07:00
kronic 73afab6ba5 Docs: LANTERN art-pipeline recipes (Workstream A0/A1) + currency re-mean spec
- Art pipeline recipes: the material foundation (palette atlas + 3 master shaders
  Lit-Palette/Emissive-Gloam/Skinned-Palette), statics recipe, skinned recipe (proven
  Rukhanka HUMANOID path), the 3 rig families (Drifter/Crawler/Strider), CreatureKit (A2)
  framing. Built on DR-022/023 + the proven Blender recipe; every carry-over gotcha flagged.
- Currency re-mean: Ore/Aether/Biomass/Charge -> Flame/Lumen/Gloam/Loudness/Salvage/Chum/
  Tallow with byte-id assignments; flags the fresh-saves-vs-migrate fork (Charge byte reuse).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 23:49:20 -07:00
kronic f53553581b Docs: LANTERN Phase 0.3 world-model proposal + Phase 1 combat-gym spec + operator-questions
- World-model design proposal (pre-review input): seed-pinning = freeze-salt + save-deltas;
  light-as-information = two hard-cull relevancy layers (pocket-scope + party light-union);
  descent lifecycle = renamed/extended RunDirectorSystem. Grounded in 3 read-only code passes
  + ctx7 on GhostRelevancy/GhostImportance. Feeds the running adversarial review.
- Phase 1 combat-gym build spec (design, pre-review): two frames (Bathynaut/Harpooner),
  4-socket manual-aim skillshot kit (AbilityRef -> socket buffer, 7-type-cap restructure),
  5 Sparks on the ability-blob + BoonEffects hook layer, light-relevancy prototype shares
  the world-model review. Grounded in a combat/ability/boon salvage pass.
- Operator-questions parking lot (autonomous run): code impl + extra reviews + A0 art
  execution parked pending operator; design forks flagged with recommendations.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 23:46:20 -07:00
kronic 89dd155f85 Docs: LANTERN Phase 0 — full pivot adoption + all-doc sweep
Adopt LANTERN as the operative direction (co-op action-RPG, light-as-territory),
superseding the Awakening Engine fiction + the Co-op Hades iteration. Existing
code becomes salvage quarry; the mechanical pillars hold.

Phase 0 deliverables (doc portions):
- DR-048 adoption decision record (0.1)
- Lantern_Strip_Mothball_Inventory — system-by-system keep/rework/mothball (0.2)
- Lantern_World_Model_Spike — pocket-graph + seed-pinning BRIEF, review-first (0.3)
- Art_Direction_Lantern — style bible + material decision + A0 gate (0.4)

Docs/skills sweep: Pillars pointers + LANTERN locked decisions; superseded
banners on Identity, Iteration_CoopHades, Path_to_Fun, Milestones, Backlog,
End_Of_Month (all redirect to the LANTERN roadmap); Home MoC + current-direction
callout (and stale serena line fixed); Systems_Index era note; CLAUDE.md
core-loop line -> LANTERN direction pointer (verbose co-op-Hades invariants
archived to the gotchas archive, net-neutral under the 40 KB budget); dots-dev
validation-harness expedition-run recipe flagged era-specific.

Two Phase-0 gate items remain OPEN (not doc work): the 0.3 world-model design
review and the 0.4 in-engine style-proof scene.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 23:13:13 -07:00
Luis Gonzalez 1b999e612a Docs: LANTERN vision refresh — theme exploration, review-hardened identity, slice roadmap
- Theme_Direction_Candidates: research-backed direction exploration (saturation map,
  load-bearing-theme patterns, 4 candidate directions); operator picked Direction A
- Identity_Lantern (final draft): tide-line persistence (lit=permanent via seed-pinning,
  dark re-knots), Wicks/drowned-sun night-sea mythology, Sparks + Gloam mutations,
  death split, readability law — hardened via 3 adversarial reviews, all findings folded
- Roadmap_Lantern_Slice: vertical-slice phases 0-7 + Workstream A (solo-dev art pipeline:
  palette-atlas materials, 3 rig families, CreatureKit factory)

Supersedes the Awakening Engine / Co-op Hades direction on adoption (Phase 0 DR pending).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 22:50:53 -07:00
kronic 24800f4bcb Attack Boon Changes 2026-07-13 18:30:41 -07:00
kronic 972e0d5b4f Docs: Phase 1.7 boon-overhaul build spec + DR-047 + session log + roadmap tick + CLAUDE.md 7-type-query gotcha
Boon overhaul CODE-COMPLETE (mechanic-changers): design forks locked,
pre-code review (11 findings folded), post-impl review (incomplete on a
session limit — raised findings self-verified, 2 real bugs fixed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 18:54:06 -07:00
kronic 6dcd8a243d World: critters + weather beats — AmbientLifeSystem (Phase 1.5b bundle 4)
Client-only, procedural, zero netcode — a sibling of AmbientMotionSystem,
biome-keyed + camera-following. Three cosmetic beats: fleeing critters (ground
bugs + a few birds that dart out of the flee radius = the scatter beat,
biome-tinted, recycled at the ring edge), drifting cloud-shadow discs, and
Blight-room-only double-blink directional lightning flash + delayed thunder
(dedicated flash light -> no RenderSettings fight with WorldAtmosphereSystem).
Reuses the FeedbackFx disc/scorch primitives + procedural SFX. Live knobs in
AmbientLifeConfig. 474/474 EditMode; live-verified at base (flee confirmed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 14:41:35 -07:00
kronic ff91e6e4d3 Docs: session log Part R + roadmap tick — Phase 1.5b bundle 4 shipped, 1.5b COMPLETE
Bundle 4 (critters + weather beats) shipped; all four World-Alive-II bundles
done. Next = the operator's Phase 1.5 gate lap.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 14:41:35 -07:00
kronic 4febf3dfe2 Hazard: Blight geyser — permanent periodic both-sides AoE (Phase 1.5b bundle 3)
Review-first netcode slice (design review wf_900e9965-8f0 -> 11 folded;
post-impl wf_5c8299f8-299 clean). A PERMANENT periodic telegraphed AoE in
Blight-biome rooms only; one new [GhostField] uint NextEruptTick.

- Geyser component + GeyserEruptSystem (server): inverted invalid-tick guard
  (a baked-0 tick must NEVER erupt -> lazy-stamps born-correct instead of the
  party-wiping per-tick barrage), inline both-sides gather (SourceNetworkId=-1),
  reschedule = now + period (never +=), never destroyed.
- GeyserTelegraphSystem (client): absolute-tick growing warning disc +
  erupt burst on the >0->=<0 crossing, latched per NextEruptTick + arm-guard
  (never edge-detects the replicated field -> no phantom on 0->stamp /
  relevancy re-entry). Reuses ScorchDecalSystem + DynamicLightSystem.
- Seeded in RoomFieldSystem (Blight-gated on plan.Biome, born-correct staggered
  stamp from live ServerTick), GeyserFieldSpawner + authoring wired into the
  Gameplay subscene. Geyser.prefab duplicated from ResourceNode (no collider).
- BuildDisc promoted to FeedbackFx (shared with the barrel fuse ring).
- 474/474 EditMode incl. the unstamped-storm regression; live no-storm end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 13:53:48 -07:00
kronic f271d5f47f Docs: Geyser Build Spec + session log Part Q + roadmap tick + CLAUDE.md gotcha — Phase 1.5b bundle 3
Blight geyser (bundle 3) shipped review-first. Records the design-review fold
(2 HIGH: no edge-detect on the replicated tick; invert the invalid-guard for a
baked scheduled-tick so a born-0 can't storm) and the new CLAUDE.md tick-sentinel
corollary for baked [GhostField] scheduled-ticks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 13:53:22 -07:00
kronic 649f656833 Decals: explosion scorch pool + cover damage-cracks + room-arena scars (Phase 1.5b bundle 2)
All procedural, client-only, observe-only in PresentationSystemGroup, zero
netcode surface (read existing replicated state). Shared FeedbackFx decal
primitives (scorch blob + crack star meshes + transparent decal material).
ScorchDecalSystem: static RequestScorch queue -> pooled fading discs
(mirrors DynamicLightSystem), wired from the barrel boom, reusable by the
geyser. CoverDamageSystem: crack accretion keyed on BlightClutter.Remaining
(Variant 4) + proximity-gated shatter-scorch. RoomDressingSystem: persistent
arena scars on a distinct hash sub-stream, torn down with dressing. Knobs in
DecalConfig. Cover cracks use decals (not URPMaterialPropertyBaseColor) because
the Synty prop shader is not Hybrid-Per-Instance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 12:58:33 -07:00
kronic b3ef846fb8 Docs: session log Part P + roadmap tick + CLAUDE.md gotcha — Phase 1.5b decals bundle shipped
Bundle 2 (decals): explosion scorch pool, cover damage-cracks, room-arena
scars — all procedural, client-only, zero netcode. Records the pivotal
finding that a stock Synty prop shadergraph's _BaseColor is Unity-Per-Material
(not Hybrid-Per-Instance), so URPMaterialPropertyBaseColor darkening silently
no-ops on cover — the fork to decal quads.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 11:04:43 -07:00
kronic 8da1402e25 Docs: session log Part O — baked splat ground iteration
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 23:25:20 -07:00
kronic 4e1ea3ecb9 World: baked splat ground — unique multi-texture base per biome, path/arena wear baked in, HP detail layer
Second ground iteration ("better but could be further improved"): the remaining
plainness was single-texture ground — noise only modulated brightness, never
MATERIAL. Now each biome bakes a unique 1024 splat-blended base map (zero
repetition at macro scale) with the fine texture moved to the detail slot as a
high-pass layer at real tiling:

- Meadow: grass + dirt + clover patches masked by fbm; the worn paths
  (storage->warpgate, storage->base-gate) and a congregation-wear disc at the
  storage crystal are baked INTO the splat as organic dirt zones (exact
  plane-UV mapping probed: u=0.5-x/90 — both axes inverted).
- Arid: sand + sand2 + arid-dirt patches + a subtle arena-wear disc at the
  quad center (= the room origin on both quads) + warm/cool hue drift.
- Detail slot: generated 2048 high-pass (full - 128-blur, 1.4x) of the
  grass/sand textures, LINEAR import, tiled 22x/26x — crisp up close, the
  splat carries identity at distance.
- Superseded assets removed: the overlay WornPath quads + material + texture
  (double-darkened over the baked wear and caught fog as a ghostly rectangle)
  and the old macro-noise detail textures.

Biome tint MPB + normals unchanged and still active. Measured ground luminance
0.30/0.33 (edit ambient) — play fog/dark ambient pulls it down; tints remain
the one-line brightness knob.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 23:23:17 -07:00
kronic 8d9d8d0d66 Docs: session log Part N — flora double-animation diagnosis + thinning
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 23:14:26 -07:00
kronic 9670465e25 World: flora feel fix — kill double-animation (root sway off, shader wind is the idle motion) + thin flowers
Operator: base flora too dense + "the waving/shader doesn't look great".
Diagnosis: EVERY Synty flora prop (both biomes) uses the Synty/Foliage
VERTEX-wind shader — the transform root-tilt sway has been double-animating
all flora since 1.5, and ground-flush carpet props (Flowers_Flat,
Grass_*_Plane) visibly lift their edges when tilted.

- AmbientMotionConfig.SwayEnabled -> false (code default + the serialized
  scene value): idle motion = the authored per-vertex shader wind (tips bend,
  bases planted). Knob kept for A/B; walk-through RUSTLE stays as the
  reactive layer the shader can't provide.
- AmbientMotionSystem: flat carpet props excluded from the flora cache
  entirely — no tilt even from rustle.
- Flower density thinned deterministically: Flowers_Flat keep 40%,
  Wildflowers/Sunflowers keep 50%, center (r<13) thinned harder (x0.6) —
  17/38 drifts off; play/build area reads clear, flowers become ring accents.

Console clean; sway/rustle knobs remain live-tunable in the scene.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 23:12:34 -07:00
kronic 741828e09d Docs: session log Part M + roadmap tick — Phase 1.5b ground bundle shipped
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 22:49:24 -07:00
kronic 2fc5ae9a10 World: ground bundle — macro-blend ground materials, per-room dressing scatter, biome ground tint, base flora + worn paths
Phase 1.5b ground bundle (operator: "the ground is very plain"):
- Ground materials rebuilt: Grass/Sand base maps at real tiling (22x/26x, was a
  2x smear across 90-130u) + Synty normal maps + a generated 0.5-centered macro
  noise detail texture (LINEAR import — sRGB detail mul2x darkens 2.3x) with
  baked rim vignette. Meadow ground moved OFF the shared Synty asset onto
  project-owned Mat_Ground_Meadow.
- WorldAtmosphereSystem: per-room-biome ground tint on the expedition quads via
  MaterialPropertyBlock (Meadow green / Cavern blue / Blight purple; Arid sand
  default), lerped alongside the existing fog/ambient palettes.
- RoomDressingSystem + RoomDressingConfig (new, client-only observe-only):
  26 biome-flavoured cosmetic props per room, scattered inside the room's ACTUAL
  shape (same RoomLayoutMath authority as the server, distinct 0xD2E55 hash
  stream), deterministic from the replicated run seed, torn down with the room,
  colliders stripped. 47 curated prefab refs wired in Game.unity (build-safe).
- Base: 357 curated flora props re-enabled (bushes/wildflowers/grass clumps;
  buildings/pond/FX stay parked) + generated worn-dirt paths storage->warpgate
  and storage->base gate.

Live-verified: dressing 26/26 inside x[981,1023] z[-11,12] y=0, 11 varieties,
0 colliders; teardown on run end; Meadow tint converged to exact target; 470
EditMode green; console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 22:47:44 -07:00
kronic cf206d356a Docs: roadmap — Phase 1.5b World Alive II locked (all four bundles)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:16:38 -07:00
kronic 6d7941bb40 Docs: session log Part L — barrel feel fix + 1.5 expansion round opened
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:14:02 -07:00
kronic eb7f572168 Fix: barrel fuse shows its blast radius + burns ~1.5s (was 0.6s)
Operator feel report: the explosion radius was unreadable and the fuse
too short to react to. Two changes:

- Tuning.BarrelFuseTicks 36 -> 90 (~1.5s): long enough to READ the
  danger and walk out, and better for baiting enemies onto a lit
  barrel.
- WorldFeedbackSystem draws a pulsing ground DISC at exactly
  Tuning.BarrelExplodeRadius under every lit fuse (keyed on the same
  replicated Remaining=0-on-a-live-barrel cue as the boom split; one
  shared pulsing material; removed via the existing prune path).

Verified live: disc appeared 0.07s after the pop (first fuse
snapshot), persisted to the boom at 1.54s, scale read exactly 3.25 =
the true detonation radius; 470/470 EditMode; console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:13:13 -07:00
kronic 03083eb735 Docs: destructible-cover Build Spec + session log Part K — PHASE 1.5 COMPLETE
CLAUDE.md: the enemy anti-stuck nudge is now cover-aware (budget 38.5 KB).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:17:45 -07:00
kronic bbf418e779 Hazard: destructible cover — carve-able rocks that genuinely block until broken
Phase 1.5 long-term #8, the LAST 1.5 item (design review wf_e14dd739-069:
both HIGHs + the distinct MEDs verified before the session limit ate the
duplicate verifiers; unverified leftovers reasoned-closed in the spec).

Cover = a BlightClutter ghost (Variant 4) with a baked Environment-layer
BoxCollider: the runtime ghost's collider joins BuildPhysicsWorld ->
blocks the player CC and the enemy sweep while alive, and the gap opens
the instant the entity dies. Both hit paths already break it (the
clutter chassis); 8 hits to carve.

Review folds:
- HIGH: the 07-07 anti-stuck nudge would phase enemies THROUGH cover
  after ~1.5s (it exists to prevent room soft-locks). The nudge is now
  COVER-AWARE: a SphereCast identifies the blocker; a live BlightClutter
  ghost suppresses the phase (no soft-lock possible - the blocker is
  destructible); static-geometry wedges still nudge.
- HIGH: yield==durability made tanky cover an economy faucet. Deposit
  is DECOUPLED from the decrement at both hit sites: ScrapPerHit=0 =
  breaks in Remaining hits, yields NOTHING; fractional POSITIVE yields
  still credit >=1 (the B1 immortal-sink test pinned this - zero means
  zero, positive floors to 1).
- MEDs: HitRadius 1.2 (visual core, not a shot-eating disc), NO cover
  in Boss rooms (no boss depenetration backstop), scatter keep-out >=7u
  from the room origin (player landing + portal), Variant=4 explicit
  (the clutter block's explosive reroll cannot leak).
- Old static layer removed: 8 WorldColliders_RoomCover colliders
  (subscene) + the RoomCover_Visuals root (Game.unity).

Verified live: 3 cover ghosts spawned with SOLID baked colliders;
BLOCK - NudgeUntilTick stayed 0 across 3.5s of forced zero-progress
(old code arms at 1.5s); DEPENETRATE - an enemy shoved inside a live
rock exited to 1.7u (backstop holds against ghost colliders); CARVE -
the rock died to the real sweep and the spot probed OPEN. 470/470
EditMode; console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:15:38 -07:00
kronic d8e724e40a Docs: exploding-barrels Build Spec + session log Part J + roadmap tick
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:42:41 -07:00
kronic cd607ae156 Hazard: exploding barrels — fused explosive clutter, friendly-fire bait
Phase 1.5 environmental hazard v1 (design-review wf_2cb10454-fdf: 13
findings confirmed + folded; Build Spec in the vault). ~25% of room
clutter seeds as EXPLOSIVE (Variant 3 on the existing replicated byte
- zero new GhostFields/prefabs/RPCs).

The FUSE is the review's fold - one mechanism closes both HIGHs:
- Pop sites (projectile sweep + isServer-gated melee harvest) do NOT
  destroy an explosive: they zero the replicated Remaining + add a
  server-only BarrelFuse (~36 ticks). The client sees Remaining=0 on a
  still-alive barrel across snapshots -> unambiguous fuse cue, and
  booms at despawn ONLY when cached Remaining<=0 - a teardown despawn
  carries Remaining>0, so portal-advance teardowns can never fire
  false booms (HIGH #1).
- HazardExplosionSystem (server, plain group, presence-gated on
  BarrelFuse, never lifecycle-gated) detonates at ExplodeTick: radius
  damage to LIVING enemies AND players (boss-slam player filter
  verbatim; friendly fire = the bait mechanic), SourceTick stamped at
  detonation = the authoring moment (HIGH #2: the authored-tick
  contract dash i-frames negate against), SourceNetworkId=-1 (the
  environment convention - a player id would consume Charger
  whiff-punish windows). Fuse rides the RoomTag'd barrel -> teardown
  cleans lit barrels free.
- Lit barrels are unhittable at both snapshot sites (no double-pop).
- Client: WorldFeedback caches Variant -> boom-vs-puff split (big
  burst + light flash + boom SFX vs the old puff); DynamicLightSystem
  gives Variant-3 barrels a red danger glow that STROBES once fused.

Verified: 470/470 EditMode (4 new: fused pop instead of destroy +
unhittable, both-sides damage w/ -1 source + authored tick, dead-player
+ radius filters, unelapsed-fuse inert); live smoke - seeded 3/8
explosive, real-sweep pop, CLIENT observed the fuse cue on the live
ghost, pinned bait enemy took exactly 26 (30->4), walk-out escape
confirmed; console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:41:47 -07:00
kronic cca8c1d44e Docs: session log Part I + roadmap — attack distinctness; 1.5 short-term complete
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 23:18:27 -07:00
kronic a335ca3f21 Feel: attack distinctness — per-kind telegraph colours, windup voices, spit light
Every enemy kind now has a unique read on the existing replicated
state (client-only, zero netcode):

- Telegraph COLOURS per EnemyTelegraph.Kind: grunt orange, charger
  crimson (boss shares it - shapes already differ: cone/wedge/ring),
  spitter toxic-green lane, swarmer yellow. Shapes were already
  per-kind; they all rendered the same HDR red.
- Windup VOICES at the onset edge (the existing _prevWindup edge +
  strike-beep distance gate): grunt low thud, charger rising roar,
  spitter wet hiss, swarmer chitter - kinds read by EAR before the
  telegraph ramps.
- Projectile light colour by ownership in DynamicLightSystem: owned
  shots stay player-cyan, un-owned (Spitter spit) glows toxic green
  (EnemyProjectileColor knob).

Verified live: 12 s combat histogram shows zones rendering with
EnemyDanger_K0 (grunt) + EnemyDanger_K1 (charger) materials keyed to
real windups (screenshot); 466/466 EditMode; console clean. Remaining
distinctness depth (per-kind anim clips, creature locomotion) rides
the parallel Blender workstream.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 23:17:43 -07:00
kronic 4ae022c5ad Docs: session log Part H + roadmap — breakable clutter feel pass
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 22:16:02 -07:00
kronic 8c2bf3c37b Tuning: operator pixel-panel slider state from the art-look lap (master stays OFF)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 22:15:10 -07:00
kronic 53bc21143d Feel: breakable clutter reads as Hades-style barrels, one-hit pop
The BlightClutter destructible-ghost chain (per-room seeding, unified
DR-018-safe sweep, melee + projectile breaking, personal-inventory
drops) already existed end-to-end - the roadmap item's gap was FEEL:

- Visual: prefab Model mesh swapped SM_Env_Rock_Chunk_01 (read as
  scenery) -> SM_Prop_Barrel_01 (FantasyKingdom, same proven atlas
  material). Base-pivot barrel offset -1 on the Model child (scatter
  y=1 is the capsule plane - the base-pivot float gotcha).
- One-hit pop: prefab Remaining 8 -> 2 (both hit paths decrement by
  max(1,(int)ScrapPerHit)=2, so one swing/shot shatters); authoring
  default kept in sync.
- Density: MaxClutterPerRoom 6 -> 8.

Verified live: 8 barrels seeded in a combat room, grounded (screenshot);
an injected projectile through the real ResourceHarvestSystem sweep
popped one barrel in ONE hit (8 -> 7) and credited 2 Biomass; 466/466
EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 22:14:43 -07:00
kronic 28a683b358 Docs: session log Part G + roadmap — art look locked, ambient motion shipped
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 21:02:10 -07:00
kronic 90d4bed381 Feel: ambient motion layer + art look locked (clean dark-Synty, pixel OFF)
Art look LOCKED by the operator from the artlook_* side-by-sides:
clean dark-Synty; PixelOutline._MasterEnabled=0 shipped (feature stays
dev-toggleable via F3; other fullscreen effects remain backlog).

New AmbientMotionSystem (client-only PresentationSystemGroup, the
"world alive" anti-static beat, zero netcode):
- per-biome DRIFT particles from one world-space emitter following the
  camera (meadow motes / arid wind-blown dust / cavern motes / blight
  spores; palette keys on camera-X region + replicated room biome,
  mirroring WorldAtmosphereSystem's switch)
- idle SWAY on the ACTIVE cosmetic flora prop roots near the camera
  (LOD children follow the root; probed: none static-batched)
- walk-through RUSTLE: flora brushed by the local player
  (GhostOwnerIsLocal idiom) gets a decaying energy shake
Rotations write around a cached base (lossless when toggled off);
knobs in AmbientMotionConfig (scene object, code defaults when absent).

Verified live: drift palettes exact in both regions (meadow
0.62/0.85/0.60 -> arid 0.85/0.68/0.45 on region cross), flora beside
the player rocked (0,0)->(-4.0,+5.0) deg within the rustle+sway
envelope, 466/466 EditMode, console clean. Discovery for follow-up:
the BASE biome's flora props are authored INACTIVE (84 bushes etc.) -
the base has no sway targets until some are re-enabled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 21:01:14 -07:00
kronic edc476adfd Docs: session log Part F — lighting/atmosphere pass + art-look gate open
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:38:23 -07:00
kronic 414f9ff62a Feel: Phase 1.5 lighting/atmosphere pass — dark ambient + dynamic lights
Dark-ambient, dynamic-light-first look (RoR2/Death Scourges reference),
built filter-agnostic so the pixel style composes on top:

- New DynamicLightSystem (client-only, PresentationSystemGroup): pooled
  point lights follow projectile ghosts; pulsing portal light during
  RoomExplore (same ExpeditionPortalPos authority as the beacon); soft
  resource-node glow that fades with harvest-shrink; short impact
  FLASHES fed by CombatFeedbackSystem's burst funnel (EmitColored +
  SpawnVfx -> RequestFlash). Knobs in DynamicLightConfig (scene object,
  code defaults when absent).
- Atmosphere darkened: WorldAtmosphereConfig/System palettes moved to
  the dark set (base cool dusk, arid burnt dusk, per-room biome consts
  darkened); scene fog switched Linear -> ExponentialSquared (the
  system's per-region DENSITY writes were dead in Linear mode);
  trilight ambient lowered; directional 1.9 -> 1.05 slightly warm.
- 6 landmark mood lights (warpgate cyan, artefact violet x2, survey
  camp warm x2, cabin warm); URP additional-lights-per-object 4 -> 8
  (was starving the existing Aether lights).
- Art-look gate material: Assets/Screenshots/artlook_{base,room}_
  pixel{ON,OFF}.png over the lit scene.

Verified: lights live in Play (20 static at base incl. new landmarks;
pooled dynamics active in-room: node glows + impact flashes), fog/
ambient values confirmed live, 466/466 EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:37:50 -07:00
kronic 30ddb6fbd0 Docs: session log Part E — planar Y-lock fix record
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:06:34 -07:00
kronic c58a17b8af Fix: planar Y-lock in CharacterProcessor — no more climbing/floating on sloped colliders
Field report: walking onto hilly-looking colliders (the new convex rock
hulls are ramps) raised the character's Y, and with gravity zero +
SnapToGround off nothing ever brought it back down - the character
floated and its shadow drifted away.

Fix inside CharacterProcessor.PhysicsUpdate: capture the pre-update Y
and restore it (plus zero RelativeVelocity.y) after the CC sequence -
the character update itself can never change the movement plane, while
spawn/teleport writes made outside the update stay honored.
Deterministic + idempotent (rollback-safe), identical on server +
predicted client.

Verified live: player shoved into a cover-hull sloped edge decollided
~1 u horizontally with Y bit-exact at 1.0000 (the case that previously
rode up the slope); 466/466 EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 20:06:05 -07:00
kronic 052764442d Docs: session log Part D — solid sweep + height pass record
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 19:46:17 -07:00
kronic 5382cbf341 World: collision-fidelity pass — fit walls/cover/landmarks to visuals + solid sweep
Phase 1.5 stabilize #2 (gate-approved incl. missing-collider adds + the
07-09 height/solid-sweep directive). New ColliderFitTools (Editor,
audit/apply, idempotent) refits the subscene Environment colliders to
the Game.unity render meshes:

- Boundary rings rebuilt 16/24/24 -> 54/82/82 segments (~3.5-4 u arcs)
  around the DESIGN radii (30/52 - fitting from the current segments
  ratchets inward on re-runs), inner faces fitted to ankle-band
  (0.45-2.5) cliff vertices so the wall stops the player before any
  visibly rising skirt.
- 8 room cover boxes -> convex MeshColliders of the actual CoverRock_*
  meshes (needed Read/Write on 2 PNB rock meshes: a MeshCollider bakes
  ONLY if the mesh is readable - InvalidOperationException per bake,
  classic scene view still shows the collider).
- 11 landmarks: hint-matched claim-once OBB fits (cabin/tent walk-into
  fixed; well/sign/artefact invisible walls removed).
- 85 adds: generic solid sweep (>=0.5 u tall, non-flora, walk-band
  geometry, gated by the LOCAL fitted wall radius) - cacti, succulents,
  boulders, bone piles, small rocks, craters (full set-piece blocks),
  crates, tree trunk, turbine poles, dish, solar rigs. Collider tops
  pinned to the visual top (cap 3): nothing solid-looking is
  walk-through or walk-over. Elevated-only geometry (rotors, panels)
  excluded - no phantom ground walls.

Verified: baked-CollisionWorld probes (ring closure 32/32/region, 10/10
solidity samples across base + both room slots, open ground free,
server==client parity at 323 static bodies), enemy backstop live smoke
(enemy embedded in the new crater block depenetrated out and re-engaged
across ~12 u; 4 others converged normally through ~40 obstacles),
466/466 EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 19:45:40 -07:00
kronic 0574e74e18 Docs: collision-fidelity pass record + MeshCollider Read/Write gotcha + guardian harness pattern
Session log Part C (execution + validation evidence), roadmap stabilize #2
ticked, CLAUDE.md gains the MeshCollider-bakes-only-if-Read/Write gotcha
(38.4 KB, in budget), validation-harness.md gains the EditorApplication.update
guardian + EditorPrefs handoff pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:48:32 -07:00
kronic 4cd9b6579d Docs: 2026-07-09 session log — B4d tail settled + collision-fidelity grounding
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:41:38 -07:00
kronic 813c829420 Hygiene B4d: PlayerResolve dedup + explicit Temp-ECB Dispose tail
- New Server/PlayerResolve.TryResolve single-sources the RPC
  SourceConnection -> NetworkId -> conn->player map resolve (3 sites:
  ClassSelectReceive, PrepPurchase, DebugCommandReceive); EntityManager
  reads keep it source-gen-safe from Bursted receivers.
- ecb.Dispose() after Playback in 9 Temp-ECB systems (explicit-lifetime
  hygiene).
- The TuningConfig.GetOrDefault(ref state) variant of this tail was
  REVERTED: state.GetEntityQuery in OnUpdate trips the Entities
  "creates a query during OnUpdate" diagnostic per system per world
  (caught in Play smoke) - the SystemAPI.TryGetSingleton idiom is
  already source-gen-optimal, confirming the original B4 deferral.

Verified: 466/466 EditMode green on the final tree, console clean,
Play smoke 0 errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:39:55 -07:00