Commit Graph

313 Commits

Author SHA1 Message Date
kronic 7571091394 LANTERN feel pass (DR-052 + gap list): SoD facing, underwater feel, Bathynaut kit, walk/run gait, suit lamp + new Synty anim packs
- SoD facing: PlayerFacing = body-yaw only (move-facing / cast-turn / idle-hold); every fire
  direction re-sourced to FacingMath.ResolveAim (pre-code review blocking catch); TickWindowMath
  shared windows with Movement-skip; reticle/FX coupled to the damage direction; cursor-dash kept.
- Underwater feel: sharpness 15->6, turn 720->360, MoveSpeed 6->4.2; TuningKnob 26-28
  (0 = no-override sentinels, dev-protocol bump on DebugTuningReport); stride footsteps + silt +
  cadence floor; bubbles; underwater ambience bed + distant groans; camera drag + dev scroll zoom.
- Bathynaut kit in-engine: dome/tank/shoulder-lamp + bare head grafted (GraftSmr rigid rebase,
  RecalculateTangents); EmissiveGloamSkinned shader (Rukhanka deformation); shoulder lamp CASTS
  (warm steady spot on body yaw).
- Gait: two-ring walk/run FreeformDirectional tree (walk @0.35, run @1.0) + blended-natural
  StrideScale; additive Posture(Bank) + Lead(chest-lead) layers; idle = AnimationIdles Base;
  banking driven from facing turn rate; flat terrain (Env_SeabedKit seabed squashed - CC is planar).
- New packs: Synty AnimationIdles + AnimationSwordCombat (combat pass queued) + SyntyPropBoneTool;
  four authored clips (sway/trudge/banks/lean) + Anim_Player_Underwater.blend + suit-kit FBX.
- Validation: 411/411 EditMode green; Play smokes (server==client facing, Aim-true projectile,
  bank/stride live-sampled, lamp beam verified); pre-code + post-impl adversarial reviews applied.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:56:02 -07:00
kronic 385d0de08e Docs: round 4 — MoveSpeed 4.2 + two-ring walk/run gait, blended StrideScale, shoulder-lamp beam
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:38:31 -07:00
kronic f496212f93 Docs: walk-set swap + dev zoom + AnimationIdles/SwordCombat catalogue (07-16 rounds 3)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:15:41 -07:00
kronic 1f6f985936 Docs: foot-skate + flat-terrain fix round appended to the 07-16 session log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 12:56:59 -07:00
kronic 8625cea819 Docs: gap-list pass bookend — underwater clips/bubbles/ambience/camera-drag session log, Blender 5.1 zero-takes export gotcha (cookbook + CLAUDE.md)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 12:31:55 -07:00
kronic a083e77a9e Docs: DR-052 SoD facing + underwater feel — build spec, session log, gotchas archive 07-16, skinned-kit cookbook recipe, CLAUDE.md facing contract (net-zero condensations)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:54:53 -07:00
kronic 4fa2cb0de4 Docs: DR-051 + session log — LANTERN realignment & purge bookend
DR-051 (delete-not-mothball, four-scene contract, one look, Bathynaut in),
session log w/ commit table + field notes, strip/mothball inventory status
banner (MOTHBALL rows -> DELETED), CLAUDE.md updated (scene contract, DR-051
purge bullet, LANTERN murk world bullet, save v7, retired bullets archived
07-15; 39.8 KB, under budget).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:37:14 -07:00
kronic 210d307406 LANTERN realignment P5: Bathynaut suit body onto Player.prefab (in place)
New PlayerRigTools.BuildBathynautPlayer (menu: ProjectM/Animation) - forks the
proven EnemyRigTools recipe: strips the Synty-soldier skeleton+SMRs from
Player.prefab IN PLACE (GUID preserved; ghost/authoring/CC/Animator/
RigDefinitionAuthoring untouched), flattens the SpaceSoldier_HelmetArmor suit
body under the root, keeps the -0.90 feet offset, re-slots
M_SuitFrame_Bathynaut_Animated on every SMR, adopts the shared CharactersAvatar
(AC_PlayerTopDown muscle clips retarget). 17 inactive Synty variant SMRs stripped.
Both frames share this visual until per-frame models land; the brass-dome/tank
kitbash attachments are a follow-up /art-dev export.

Play-verified in DevSandbox: suit renders + idles correctly under the LANTERN
murk, Rukhanka rig baked with all 9 drive params, dev overlay alive in the
renamed scene, no console errors.

=> Movement/animation tuning is now UNBLOCKED (the operator's next priority).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:31:07 -07:00
kronic 12d5b96b71 LANTERN realignment P4: Gameplay subscene -> seabed arena roster + old enemy prefabs deleted
- WaveDirector + ZoneEnemyDirector rosters re-pointed (ORDER-CRITICAL before prefab
  deletion: null-skip pools collapse kinds): [Drowner, Grindylow, Drowner, Drowner]
  (grunt/charger(boss)/spitter-slot/swarmer-slot; ranged+pack kinds fall back to
  Drowner until LANTERN kinds land in Phase 2).
- WorldColliders_Landmarks + WorldColliders_Props deleted from the subscene (their
  visuals died with the host-scene biomes -> they were invisible walls). Boundary
  rings + room cover + all spawners/configs kept.
- 10 old-theme enemy prefabs deleted (Enemy, Brute, Charger, ChargerMuscle,
  Spitter, Swarmer(+Undead), Werewolf(+Undead), Kaiju); EnemySpit kept for a
  future ranged kind. Zero dangling GUID refs (verified).

Play-verified in Game: Drowner wave spawns, seeks, strikes; AFK player dies and
respawns (full loop); no console errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:24:31 -07:00
kronic c58439d33a LANTERN realignment P3: one look everywhere + scene surgery
- PostFX_Lantern.asset: the ONE shared grade (ACES, bloom 0.6 cool-tinted for the
  HDR gloam, vignette 0.28, faint teal filter) applied to Game, DevSandbox, and
  ArtStaging; PostFX_DarkSciFi / PostFX_Daylight / Sky_DaytimeProcedural deleted.
- Env_SeabedKit.prefab: ArtStaging's environment (seabed, flora, rocks, marine
  snow, caustics, warm pool, gloam fill, key light, StagingAmbiance animator)
  prefab-ized and placed in Game + DevSandbox; ArtStaging connected to it.
- Scene surgery: old DevSandbox.unity deleted; Gym.unity RENAMED DevSandbox.unity
  (GUID preserved -> GymSub wiring + the F1/F2 dev scripts that gate on the
  'DevSandbox' name come back to life). SyntyWorld root deleted from DevSandbox;
  BaseBiome/ExpeditionBiome/Slot1 deleted from Game.
- RenderSettings unified: no skybox, Exp2 teal fog {0.02,0.10,0.12} @ 0.035, flat
  near-black ambient {0.03,0.055,0.08}; camera clearFlags -> solid deep-water.
- ScenePolicy.IsGameplayScene() replaces the six scene.name=="Game" string gates
  (Game + DevSandbox share the dynamic look; menu/ArtStaging untouched).
- WorldAtmosphereSystem rewritten as water-column murk (LANTERN defaults; biome
  variants re-meant to kelp/trench/gloam-bloom; Ground_Arid tint block deleted).

390 green; Play-verified in Game: murk values live, warm-vs-cold reads, no errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 16:12:00 -07:00
kronic 77de740b63 LANTERN purge B7: rename CharacterId -> FrameKind (frame terminology)
Enum renamed in StatIds.cs (byte values unchanged - serialized definitions/saves
never re-mean); all call sites + doc mentions swept (ClassTraits, PlayerAuthoring,
CharacterStatsDefinition field type, menu/UI, tests). CharacterStatsDefinition SO
CLASS name kept (asset-binding risk; deferred per plan). 390 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 15:51:48 -07:00
kronic 4a8220ad3e LANTERN purge B6: delete the legacy single-ability path (sockets are THE ability model)
AbilityRef, AbilityCooldown, EffectiveAbilityStats, DefaultAbility deleted.
GoInGameServerSystem seeds the per-frame 4-socket Spark loadout UNCONDITIONALLY
(was gym-only); ClassSelectReceiveSystem + DebugOp.SetClass swap FrameId +
re-seed sockets + zero SocketCooldown; ClassSwapUtil.Apply drops newAbilityId;
EquipSystem weapons become stat-sticks (GrantedAbilityId removed from the item
blob/authoring); StatRecomputeSystem folds CharacterStatsRef + sockets only;
HUD cooldown bar reads socket 0 of SocketCooldown/EffectiveSocketStats; class
HUD readers are FrameId-only (ClassForAbility/AbilityFor deleted);
DebugModifierInjectionSystem drops CycleAbility.

390 tests green; Play-verified: a non-gym spawn gets frame=2 with Sparks
[7,8,6,9] and no console errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 15:47:12 -07:00
kronic b34945c2d2 LANTERN purge B3+B5: delete the cycle/core/win-lose spine + onboarding; save epoch v7
Deletes CyclePhaseSystem, GoalReachedSystem, CoreDamage/CoreRestore, ThreatDirector,
CoreIntegrity/GoalProgress/RunPhase/RunOutcome/ThreatState components,
CoreVisualFeedbackSystem, and the whole Client/Onboarding slice (+6 test files).

Keepers reworked: RunDirectorSystem (UpdateBefore attr + launch guard + goal/threat
bank removed; sole SaveRequest raiser now), CycleDirectorSpawnSystem (ledger/meta
host only), WaveSystem UNGATED (waves run wherever a WaveDirector is baked),
EnemyAISystem core-fallback stripped, AmbientAudioSystem reworked (bed + run cues;
no CycleState gate), MusicSystem RunInfo-only, HudSystem big trim (goal meter, core
bar, siege banner, terminal banner, outcome flash, onboarding hook all gone),
MetaShop/ClassPrep/AimReticle siege gates dropped, DebugOverlay/ops re-meant
(SpawnWave=force next wave, EndSiege=quiet arena; SetCalm/AdvanceGoal/SetHeat
retired, bytes reserved), TuningConfig Core knobs retired (ids 20-23 reserved),
StorageMath.DrainFraction deleted, HowToPlay copy rewritten.

Save epoch v7 (fresh epoch, operator-approved): SaveData drops goal/core/outcome +
conveyor/machine-IO fields; MinLoadableVersion=7; PendingSave/PendingStructure
trimmed; RollTerminalCampaignForward deleted; SaveStructureScan signature slimmed.

390 tests green; Play world-creation clean (player + waves live, no exceptions).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 15:27:12 -07:00
kronic 835dace213 LANTERN purge B2: delete EB-2 turret defense
TurretFireSystem, TurretAuthoring, Turret.prefab, Turret component, turret cap,
B hotkey, HUD Charge chip + out-of-ammo cue, catalog entry, Tuning consts, tests
(-7, 452 green). StructureType.Turret byte + ResourceId.Charge stay reserved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 14:40:12 -07:00
kronic a0f6d4a5c4 LANTERN purge B1: delete the automation chain (Harvester/Conveyor/Fabricator)
Deletes the M7 production systems, automation components/math, authoring, 3
machine prefabs, and 6 test files (-43 tests, 459 green). Trims the automation
paths out of BaseRestoreSystem/SaveStructureScan/BuildPlaceSystem/BuildSendSystem/
HudSystem/HudTheme/StructureCatalogAuthoring/Tuning. RuntimePlacedTag (save
marker, a keeper) re-homed into StructureComponents.cs. StructureType byte codes
stay reserved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 14:32:11 -07:00
kronic 511e78556b Checkpoint: pre-realignment working tree (Gym->GymSub repoint + SyntyWorld/PostFX re-enable, SampleScene removed, PostFX_Daylight retune, ai.assistant pkg re-added)
Baseline before the LANTERN realignment & purge (plan: one look, four scenes,
Bathynaut on the player). Gym.unity edits are operator-made in-editor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 14:16:00 -07:00
kronic 78d4489699 Docs: session log + roadmap — full Phase-1 remainder (windups, frames/FrameId, light-relevancy, gym scene)
Session 2026-07-15 continued: powered through the Phase-1 remainder per operator
direction. Log + roadmap Phase-1 status updated (500 EditMode green; deferred
items surfaced: underwater tuning, AbilityRef removal, CharacterId rename, L3/
gamma/rollback, ★ adversarial review).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 08:55:39 -07:00
kronic d30d96952c LANTERN P1: enemy-test Gym scene (DevSandbox-based host + minimal GymSub subscene)
Gym.unity = the dev-test host re-based on DevSandbox (camera + DebugOverlay dev UI
+ world visuals), its SubScene repointed to GymSub. GymSub.unity = a fresh minimal
baked subscene (PlayerSpawner, AbilityDatabase with all 9 abilities incl. the 5
Sparks, NetCodePhysicsConfig, WorldCollisionConfig, ProjectileSpawner, GymRoster =
GymTag + Drowner/Grindylow roster). Open Gym.unity + Play → GymTag clean-spawn with
a per-frame Spark loadout; on-demand SpawnEnemy. Subscene GameObjects still named
*_Copy (cosmetic); visuals = the operator's future underwater-match pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 08:55:39 -07:00
kronic aeb979f8d5 LANTERN P1 step 8: light-as-territory relevancy prototype (★)
Per connection, marks every ENEMY ghost OUTSIDE the player's lamp radius
IRRELEVANT (monsters in the dark aren't replicated — the gamma test). Modelled
on the proven RegionRelevancySystem: SetIsIrrelevant so players/global ghosts
stay relevant for free. Shared-set discipline — RegionRelevancySystem is the SOLE
clearer (runs every tick); LightRelevancySystem is [UpdateAfter] it and only ADDs
light hides via TryAdd (no clear; defensive against a region+light overlap dup).
Gated on GymTag (LANTERN-only; legacy region relevancy untouched). Pure decision
in LightRelevancyMath (+3 EditMode tests, 500 green). Per-player dim/bright
(variable radius) + the L3 gamma-test verification are follow-ups; the ★adversarial
netcode review is recommended before this ships.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 08:51:24 -07:00
kronic 342a39a540 LANTERN P1 step 5 + §8: two-frame identity via FrameId + per-frame gym loadouts
FrameId (replicated frame/class signal) now WRITTEN server-side at spawn for all
players; the two class-HUD readers (ClassPrepPortal, MetaShop) read FrameId (with
an AbilityRef fallback for pre-FrameId players) instead of ClassForAbility. The
gym seeds a PER-FRAME default Spark loadout via ClassTraits.FrameLoadout —
Harpooner (Ranger slot): reel/mobility/skillshots; Bathynaut (Warrior slot):
pull-in/dash/zone-control. FrameId uses ecb.AddComponent (baked on the real
player; absent on the minimal MetaSeeding test prefab). 497 EditMode green.

Deferred to a focused pass (risky wholesale refactor, "still works" via the
transition): full removal of legacy AbilityRef/AbilityCooldown/EffectiveAbility
Stats (woven through equip/class/meta/StatRecompute + tests) and the CharacterId
Bathynaut/Harpooner rename.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 08:45:45 -07:00
kronic 8f099c32ba LANTERN P1 step 6: manual-aim windups (SoD readable telegraphs)
AbilityDefBlob/AbilityDefinition gain WindupTicks. AbilityFireSystem's socket
loop resolves each socket at the historical command (serverTick - WindupTicks)
via GetDataAtTick — a pure fn of replicated data on both worlds (Build Spec §4/
DB-6: no local fireAtTick that would diverge under reprediction; fireCount from
that command, spawn uses the current tick's aim/pos; history gap = no-fire).
WindupTicks set on the 4 non-Blink Sparks (Blink is movement, resolved by
BlinkSystem). 497 EditMode green (no regression). Client telegraph VFX + the
reprediction L3 test are operator-eyes / netcode-world follow-ups.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 08:35:20 -07:00
kronic 98c8da3fd7 Docs: session log + roadmap — P1 Group B (5-Spark systems + gym tooling)
Session 2026-07-15: the 5-Spark systems, content, and enemy-test-gym CODE done
(497 EditMode green); the fresh Gym.unity scene assembly + the L3 feel gate remain.
Roadmap Phase-1 status updated. Reusable gotchas banked (reel via re-aimed
KnockbackState; GymTag bypasses the meta spawn guard; manage_scriptable_object
target-object quirk).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 00:01:23 -07:00
kronic b92cc7196b LANTERN P1: enemy-test gym tooling — on-demand spawn + GymTag clean-spawn
GymTag + GymEnemyRoster (+ GymRosterAuthoring) bake the gym singletons. New
DebugOp.SpawnEnemy (client SpawnEnemy wrapper + server receive case) spawns a
chosen enemy KIND (Drowner/Grindylow) from the baked roster near the sender —
replacing the wave-roster hack per the roadmap's Enemy-test GYM direction.
GoInGameServerSystem takes a GymTag branch: bypass the meta-catalog spawn guard
(a fresh gym has no CycleDirector) + seed a default Spark loadout on keys 1-4.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 00:01:13 -07:00
kronic b011a367e3 LANTERN P1 Group B: 5 Spark defs + effect ghost prefabs
The 5 AbilityDefinition SOs (DecoyWisp/HookPull/Vortex/Blink/LightZone) with
archetypes, tunables, EffectFlags (HookPull=Reel), and prefab refs. Three
interpolated ownerless-ghost prefabs (EffectVortex w/ Vortex flag, EffectLightZone,
DecoyWisp) via the duplicate-ResourceNode recipe + ZoneAuthoring/DecoyAuthoring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 00:00:55 -07:00
kronic 36950ca21d LANTERN P1 Group B: 5-Spark systems — Aoe/Hitscan dispatch + reel/zone/decoy
Aoe/Hitscan archetype dispatch in AbilityFireSystem (both-worlds cooldown;
server-only ecb.Instantiate — the client-never-instantiates invariant; ZoneEffect
vs DecoyTag chosen by prefab membership). Harpooner REEL as a homing state
(ReelState + ReelSystem re-aim the hit Husk's KnockbackState toward the caster's
live position each tick; EnemyAISystem stays sole Position writer), stamped by
ProjectileDamageSystem on a Reel-flag hit. ZonePulseSystem (enemy-only periodic
AoE, caster attribution, no friendly fire, Vortex pull, born-0 lazy-stamp).
Decoy aggro in EnemyAISystem + DecoySystem despawn. AbilityDefBlob gains
EffectFlags (Reel) + DurationTicks. +3 ZonePulseSystem EditMode tests (497 green).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 00:00:41 -07:00
kronic 8f070ff83c Docs: roadmap — enemy-test GYM as the animated-validation home (operator direction)
Defer the in-game skinned-enemy animated check to a purpose-built semi-permanent
gym scene (Phase 1's 'no world - a gym') with spawn-a-chosen-enemy tooling, rather
than hacking the shared wave roster. Survives the coming enemy-system rework; the
3 skinned prefabs are ready to drop in.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:27:16 -07:00
kronic eaf3d51370 Docs: roadmap — rig-type verified HUMANOID (discrepancy resolved)
animationType=Human (enum 3, not Generic); CharactersAvatar.isHuman=true.
CLAUDE.md correct; the grounding agent misread the enum.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:21:08 -07:00
kronic cb26e68839 Art/anim: Drowner glowing eyes + Grindylow + Bathynaut suit-frame prefabs
EnemyDrowner: Emissive-Gloam eyes bone-parented to Head + boneEntityStrippingMode
=None (attachments ride the rig). New skinned prefabs EnemyGrindylow +
SuitFrame_Bathynaut. Pipeline run 3x -> A1 repeatability exceeded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:21:07 -07:00
kronic 4302687be4 Art/anim: EnemyRigTools + Grindylow + Bathynaut suit-frame builders
BuildGrindylow (SciFiSpace Alien, gloam-blue) = 2nd creature (A1 'twice'
repeatability); BuildBathynautFrame (armored+helmeted soldier, warm-neutral)
= suit-frame preview proving the suit body skins via Rukhanka.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:21:06 -07:00
kronic ec0e3ce5dc Docs: roadmap — Emissive-Gloam shader + skinned Drowner bind (art progress)
A0: all 3 master shaders now present (Emissive-Gloam authored as HLSL w/
in-shader flicker). A1: skinned recipe proven for a LANTERN creature
(EnemyRigTools.BuildDrowner -> EnemyDrowner.prefab); in-game animated run +
custom-kit reattach + suit/2nd-creature still open. Flags the Generic-vs-
Humanoid rig-type discrepancy vs CLAUDE.md to reconcile.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:02:28 -07:00
kronic cb224be81b Art/anim: skinned Drowner enemy via EnemyRigTools (LANTERN)
EnemyRigTools.BuildDrowner (menu ProjectM/Animation) — SciFiSpace Crew_Male
body (same rig/atlas/avatar as the player) through the proven DR-023 path:
EnemyDrowner.prefab = ownerless interpolated ghost + AnimatedLitShader
(Skinned-Palette) gloam material + AC_EnemyTopDown + RigDefinitionAuthoring.
Structurally identical to the shipping werewolf/charger enemies -> animates
in-game via the same EG/Rukhanka path. (Renders only in the baked ECS world,
not a plain scene; ArtStaging keeps the static bake for art review.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 22:00:38 -07:00
kronic 593897d978 Art(shader): Emissive-Gloam master shader (in-shader flicker cadence)
ProjectM/EmissiveGloam — URP HLSL, HDR emission (Bloom-catching), with the
readability 'steady=true / flicker=false' channel as a material param
(_FlickerAmount), no script. Applied to the staging flora bulbs (cold, flicker).
The other two master shaders already exist (Lit URP graph, AnimatedLitShader).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:49:05 -07:00
kronic 27b41a37a4 Art(engine): ArtStaging lighting — value separation (grayscale-safe)
Warm beacon brightest/tightest (true light strong), gloam flora dimmer/softer +
emissive dialed down, so warm-vs-cold reads by value, not hue alone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:42:33 -07:00
kronic 9ca27e626a Client: StagingAmbiance — steady beacon, gloam flicker (readability cadence)
Beacon left unmodulated (steady=true light); cold flora gutter on Perlin flicker
(flicker=false light) so the warm/cold read survives with hue removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:42:32 -07:00
kronic 693f70308a Docs: roadmap — A0 style-proof scene built (art progress 2026-07-14)
Phase-0 status + Workstream A0/A1 callouts: the in-engine ArtStaging style-proof
scene is built (prop+creature+suit triad under murk + light-is-territory pool
lighting, passes full/200px/grayscale); statics recipe validated in-engine;
skinned Rukhanka bake + 3 master shaders still open.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:42:32 -07:00
kronic 52f0b87148 Art(engine): ArtStaging underwater ambiance + hero triad baked in
Underwater staging: undulating seabed mesh (no platform edge), caustics
cookie spot, marine-snow particles, teal depth fog, and 'light is territory'
pool lighting (warm beacon + cold bioluminescent pools, deep dark between).
Baked posed statics into the slots: SM_Suit_Bathynaut + SM_Creature_Drowner
(glTFast) alongside the crate + flora clutter + rocks. Completes the A0
style-proof triad (prop+creature+suit) in-engine under gameplay conditions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:32:14 -07:00
kronic fe8a14e539 Art: posed-static hero + flora glb exports (staging bake source)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:32:00 -07:00
kronic 3103214e76 Client: StagingAmbiance dev component (ArtStaging Play-mode juice)
Light-only ambiance animator (caustics spin, beacon flicker, bioluminescent
pulse); self-wires by name; no material writes so nothing persists on Play exit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:31:59 -07:00
kronic 011037e70c Docs: art-dev cookbook — locked lighting + posed-static hero bake
'Light is territory' pool lighting (reads top-down; vertical god-rays don't),
undulating seabed mesh, Play-mode ambiance script, and the apply-armature +
visual-transform static hero-bake recipe for style-proof placement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 21:31:58 -07:00
kronic 481cc54a28 Art(engine): ArtStaging style-proof scene + first baked statics
Assets/Scenes/ArtStaging.unity — murk env + warm-key/cold-gloam lights +
game-angle camera + bloom/ACES post volume + pedestal + SLOT markers.
Baked statics (glTFast): SM_Prop_CargoCrate (shared M_Lit_Palette) +
SM_Prop_GlowFlora (palette stalks + HDR-teal emissive bulbs -> blooms).
Validates the palette pipeline + Emissive-Gloam bloom in URP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 14:56:52 -07:00
kronic 81f7db0cfa Docs: art-dev cookbook — Unity render-harness + staging-scene recipes
Adds the in-engine verification recipe (URP SubmitRenderRequest render
harness, layer sign-bit gotcha, game-camera check) and the persistent
ArtStaging scene recipe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 14:56:52 -07:00
kronic 4ee73e3872 Art: LANTERN A0 style-proof asset set (Blender source)
5 master .blend + crate .glb under ArtSource/Blender/ (outside Assets/):
Prop_CargoCrate, Prop_GlowFlora, Creature_WispMote, Creature_Drowner,
Suit_Bathynaut_Kitbash. Palette-atlas single-material + emissive; Synty
kitbashes licensed. Silhouette concepts pending the in-engine bake.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 14:40:21 -07:00
kronic 2b78c68424 Docs: /art-dev skill + art-track kickoff session log
New /art-dev skill (SKILL.md + blender-cookbook + style-and-practices refs)
driving LANTERN Blender art work: Auto (headless) for simple changes, the
hybrid nudge-and-bake loop for precision/aesthetics, game-camera verification,
Blender-beginner coaching. Session log covers the A0 style-proof asset set +
the Bathynaut refinement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 14:40:08 -07:00
kronic 8edae9f439 Docs: session log — Group B started (Blink Spark shipped) + remaining-Group-B plan
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:45:57 -07:00
kronic 52818d0dd6 LANTERN P1 Group B: Blink Spark (Movement archetype) + BlinkSystem
Per Phase1_Combat_Gym_Build_Spec §6 (the Blink Spark = a second, socketed dash):
- AbilityArchetype += Movement (falls through AbilityFireSystem; a sibling system drives it).
- AbilityId += the 5 Phase-1 Sparks (DecoyWisp/HookPull/Vortex/Blink/LightZone).
- BlinkState: predicted, non-replicated blink window (DashState sibling).
- BlinkSystem: velocity blink (never a LocalTransform write), triggered by the Movement-
  archetype socket, dash-wins precedence ([UpdateAfter(DashSystem)]), sole writer of its
  socket's SocketCooldown row; reads socket loadout/cooldown by entity via lookups (query at 6
  args, under the 7-cap). Baked BlinkState on the player.
L1 clean; L2 494/494. Dead until a Blink Spark def is socketed (ability-database SO = next).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:45:06 -07:00
kronic 89a0fc739a Docs: session log — group-A L3 netcode gate PASS (live server==client + SpawnId fix)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:29:38 -07:00
kronic 58c2eaca58 LANTERN P1: dev injector — socket-fire injection (enables the L3 netcode validation)
DebugInputInjectionSystem (#if UNITY_EDITOR) gains FireSocket(i, frames) + per-socket hold
frames + the OnUpdate socket-event sets, mirroring the legacy Fire injection. Drives the real
gather->command->prediction->AbilityFireSystem path per socket for headless validation.

Used to validate group-A live (instant-play ServerWorld+ClientWorld): socket 0&1 = a projectile
Spark, injected same-frame -> maxSrvProj=2, maxCliProj=2 (server==client parity),
distinctSpawnIds=2 with distinctSocketBits=2 (the SpawnId desync fix confirmed LIVE), both
per-socket cooldowns advanced. Netcode half of the group-A gate: PASS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:29:08 -07:00
kronic 5761836bbb Docs: session log — LANTERN Phase 1 Group A (4-socket combat kit) + A0 materials
Records the A0 material foundation + Phase 1 Group A implementation (steps 1/1b/2/2.5:
socket data model, per-socket stats, AbilityFireSystem restructure + SpawnId repack, feel-layer
migration), 494 green, the editor-focus correction, and the deferrals (L3 gate, AbilityRef
cleanup, Group B content).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:14:25 -07:00
kronic 21f609c6c4 LANTERN P1 step 2.5: client feel layer migrated to the socket kit
Per Phase1_Combat_Gym_Build_Spec §8 (the "KEEP as-is" feel layer was really a migration):
- PlayerAnimationDriveSystem: both jobs (Local/Remote) now read SocketCooldown +
  DynamicBuffer<AbilitySocket>/<EffectiveSocketStats> instead of the single AbilityCooldown/
  AbilityRef/EffectiveAbilityStats; shared SocketFireAndCone helper (any-socket-firing model:
  IsFiring if any socketed Spark's per-socket cooldown window is mid-fire; IsCone if any such
  is Cone).
- CombatFeedbackSystem: the muzzle-flash + cone-cue blocks unified into one per-socket
  fire-edge loop over SocketCooldown (per-socket uint cache); non-Cone -> muzzle flash,
  Cone -> the aimed slash-arc cue. Dropped the now-dead single-cooldown latches.
L1 clean; L2 494/494 (no regression).

Deferred to the AbilityRef-removal cleanup (surfaced, NOT silent): the FrameId server-writer +
the 2 class-HUD re-points (ClassPrepPortalHudSystem/MetaShopHudSystem) + HudSystem's ability
bar. Rationale: AbilityRef is still baked + set (EquipSystem/ClassSwapUtil), so ClassForAbility
remains a valid class signal through the transition; FrameId is baked ready. No feel regression.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:13:05 -07:00
kronic 12f86c86de LANTERN P1 step 2: AbilityFireSystem socket restructure + SpawnId repack
The netcode core of the 4-socket kit (Phase1_Combat_Gym_Build_Spec §1,§2,§5; review NP-1/
RS-1/DB-1/DB-3):
- PlayerInput: +4 Socket0..3 InputEvents + Burst-safe GetSocket(i); legacy Fire kept vestigial.
- PlayerInputGatherSystem: gather sockets from keyboard 1..4 (+gamepad RT/LB/RB); socket 0 also
  fires on the legacy primary (right-click / pad LT) as a bridge.
- AbilityFireSystem: query dropped to 4 type args (PlayerInput/PlayerFacing/LocalTransform/
  GhostOwner) + BufferLookup<AbilitySocket>/ComponentLookup<SocketCooldown>/BufferLookup<
  EffectiveSocketStats> (the 7-arg-cap fix); loops 4 sockets; per-socket cooldown + per-socket
  effective stats; Cone + Projectile dispatch per socket (predict-spawn Projectile-only).
- ProjectileSpawnId.Pack: pure Burst-safe key owner14|socket2|fireCount12|fork4 so same-tick
  multi-socket projectiles never collide; AbilityFireSystem uses it.
L1 clean; L2 494/494 (+5 ProjectileSpawnId tests: distinct-per-socket, fork, owner, bit-ranges,
count-wrap). L3 two-player + rollback is the group-A gate (after step 2.5). Note: the client
feel layer (muzzle/anim) still reads the legacy cooldown until step 2.5; sockets bake empty
until content (step 4), so nothing fires in-game yet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:59:45 -07:00