Commit Graph

287 Commits

Author SHA1 Message Date
kronic e03be4861f Docs: 07-21 ArtStaging A0 value/composition rework log (J) + roadmap A0 update
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 20:46:26 -07:00
kronic 5569fcd552 Fix: socket auto-recast at every cooldown reopen (raw InputBufferData IsSet = ever-pressed)
Netcode accumulates InputEvent counts on the wire; only the decoded component is delta-corrected.
AbilityFireSystem's windup resolve gated on raw IsSet, so after the first press every socket
re-fired the instant its cooldown reopened (live repro: recasts at exactly t3933/t4353 with zero
input). Gate is now a count-STEP vs the previous tick's command; missing prior command = no-fire.
Also lands the G6 ConeContactPending schedule machinery + the cone test fixture (wire-true
monotonic counts) + regression Cast_Never_Refires_When_The_Cooldown_Reopens. 430/430; live proof:
one tap -> one cast -> silence across 2+ reopens.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:28:08 -07:00
kronic 040463ad07 HUD: ability/cooldown bar (sockets 1-4 + dash); socket-0 charge strip removed
AbilityBarSystem (own UIDocument, sortingOrder 49, the B5 sibling pattern): per-slot Spark
initials/name from the AbilityDatabase blob, archetype tint, drain overlay + seconds countdown +
ready flash; dash rides DashCooldown vs TuningConfig.DashCooldownTicks (Defaults() fallback).
HudSystem's single-socket blue charge strip removed (it tracked socket 0 only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:28:08 -07:00
kronic 2aebc37115 G6+G4: Cone damage-at-contact + zone fill telegraph (ZoneEffect GhostFields) + co-op saturation budget
Cone/SpecialSlam damage lands at its visual contact via ConeContactPending (knob 32, 0=legacy;
early-flush + resolve re-validate; death + BOTH class-swap paths drop armed pendings — fixes the
shipped melee death-strand in the same stroke). Zones: [GhostField] Caster/Radius/NextTick +
ZoneTelegraphSystem (Geyser latch contract on InterpolationTick; rim = true radius; arm grows,
persistent phase drains). Cone cues latch to contact (FireStartRaw, C14); TuningConfig.Defaults()
fallback at client cue sites (release-build timing fix). G4: SaturationMath ally-FX degrade
(living-enemy census, solo-exempt; enemy telegraphs structurally exempt) + CombatStressDebug +
overlay saturation rows. Reviews wf_98bf1268 (13 confirmed folded) / wf_9757d214 (5 confirmed fixed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:27:50 -07:00
kronic 9d6977cd64 Docs: 07-21 auto-recast root-cause correction (wire-count InputEvent ★), harness lessons, CLAUDE.md net-zero trims
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 13:19:16 -07:00
kronic 0e570f1c54 Docs: 07-21 session I log (auto-recast diagnosis + ability-bar rework)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 12:59:16 -07:00
kronic a5302a7eae Docs: 07-21 G6+G4 build spec + session log (H); guidelines shipped-notes; CLAUDE.md tick-source clause; validation-harness fixture notes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 12:35:29 -07:00
kronic c5f73c52dd Weapon grip: operator reverted the anchor to the seed grip and rebaked
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:29:07 -07:00
kronic cf31912519 Docs: 07-21 hit-react pass log + inventory/guidelines updated (vibrate superseded)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:28:12 -07:00
kronic 0ff11fe2a9 Enemy hit-reacts: React/Stagger anim tiers off Health-drop edges (the Rukhanka-safe flinch)
SwordCombat React (1.4x, 0.3s pulse) + Stagger (1.2x, 0.55s) as Any-State
states on AC_EnemyTopDown via EnemyRigTools.WireEnemyHitReacts; driven by
EnemyAnimationDriveSystem's cache (now Pos/Hp/ReactUntil/Heavy) off
replicated Health drops. Windup-honesty gate: light reacts require
!IsAttacking (a sub-poise hit never visually cancels a live windup);
the heavy tier tracks the server's B2 poise break (stagger threshold 50
= finisher staggers, light flinches at the locked tuning). Knobs:
HitReactSeconds (0=off) / HitStaggerSeconds / HitReactStaggerDamage.
Replaces the review-cut positional vibrate (Rukhanka inverse-fold no-op).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:28:11 -07:00
kronic 4e795a38e9 Docs: 07-21 heavy feel lock session log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:13:50 -07:00
kronic ce0faafb72 HEAVY FEEL LOCKED: the A/B winner folded into defaults, clips retimed to zero contact drift
recover 36 / dmg 36 (DPS 60 held) / contact 20 (20/12/25 per step) /
grace 28 / buffer 10 / move-commit 0.25; arc 0.8, finisher hold 7,
connect kick 1.1. Clip state speeds retimed 1.0/0.85/0.88 so the VISUAL
blade contact matches the damage tick exactly (audit: zero drift; probe:
gaps 36/36/54, contacts +20/+12/+25 measured). Step-3 contact sits 1
tick under CastFacingTicks 26 (documented coupling). baseline profile =
the locked defaults; heavy-committed kept as the record.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:13:49 -07:00
kronic 7f032571df Weapon grip anchor: gizmo-authored WYSIWYG grip + operator's hand-tuned grip baked
WeaponGripAnchor under Hand_R in Player.prefab carries the actual axe
mesh as an EditorOnly preview (baker skips it; play-verified single axe)
so grip manipulation is the real model live in the prefab stage;
AttachMeleeWeapon reads the anchor (consts = seed/fallback). Includes
the operator's first gizmo-tuned grip (rebaked mesh matches expected
radius exactly). PlayerRigTools also carries the heavy-lock clip
re-speeds (1.0/0.85/0.88) consumed by the next commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:13:48 -07:00
kronic 2710d680b4 Sandbox target dummy: planted EnemyTag ghost + DevSandbox respawn spawner
GymSub bakes no WaveDirector (why sandbox enemies never spawned); the
sandbox's combat target is now a TargetDummyTag'd enemy ghost all five
EnemyAISystem passes exclude (planted; knockback stamps inert), spawned
at player+3m with 400 HP by an editor-only scene-gated server system,
dying through the normal Dying path and respawning 1.5s after the corpse.
EnemyTag-reuse audited: sandbox-only by design (cleared-checks would
count it elsewhere).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:13:47 -07:00
kronic cd634a9df5 Docs: 07-20 weapon grip anchor session log (gizmo-authored WYSIWYG grip flow)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 22:58:14 -07:00
kronic 760c77c083 Docs: 07-20 sandbox target dummy session log (planted dummy + GymSub no-director diagnosis)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 22:05:40 -07:00
kronic c64cda6e44 Docs: 07-20 tuning bench session log (profiles / audit / probe workflow)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:28:34 -07:00
kronic 730bad3d74 Data-driven tuning bench: feel profiles (JSON gestalts + overlay A/B), asset-derived timing audit, server-measured combat probe
FeelProfileService: partial-apply profiles ride the authoritative SetTuning
path + FeelConfig reflection; Save-current captures hand-dialed state; 3
starter profiles (baseline-0720 / heavy-committed / snappier, DPS-held).
TuningAuditTools: contact truth derived from clip WindUp takes / state
speeds vs MeleeTiming (drift detector), coupling invariants, cadence/DPS,
reach-honesty ratio off the baked weapon mesh (now x0.93/x1.16, was >2x).
CombatProbe: dummy + injected mash chain, per-swing server-measured
start/contact/damage + cadence/DPS report. Verified live: snappier profile
apply -> measured 24/24/36 gaps, +12/+8/+15 contacts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:28:33 -07:00
kronic 2b742f0179 DebugOverlay: tuning rows for the 07-20 melee feel knobs (contact/buffer/finisher-reach)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:04:37 -07:00
kronic 7b65912f30 Melee feel overhaul: SwordCombat anims at heavy cadence, salvage axe, damage-at-contact + buffer + dash law (guidelines forks 1-6)
07-18/19/20 arc: LightCombo01/HeavyCombo01 clips onto Swing1-3/Slam at
~natural speed (26-tick window, 30-tick recover, DPS-held damage retune),
Menacing01 combat idle (InCombat), SM_Wep_Axe_Large_01 rigid-skinned to
Hand_R at x1.25, LANTERN FX retone + blade-smear ribbon. Forks 1-6 per
Combat_Attack_Feel_Guidelines (design review wf_000bc247): cleave resolves
at the CONTACT tick (MeleeCleavePending schedule-and-consume, knob 31,
0=legacy; connect cues moved to contact), MeleeRange 2.2 + reach-only
finisher mult 1.25 (knob 30), BufferedAttackTick GhostField input buffer
(knob 29, unlock-edge validity), dash refused pre-contact (lookup-based).
Tests: MeleeComboTests pin legacy knobs; +3 fork tests (414 green); live
server proof: HP drop exactly at swing+16 under tick batching.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:03:18 -07:00
kronic 2c187a17a9 Docs: melee feel forks 1-6 implementation log + guidelines fork table marked shipped
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 20:53:08 -07:00
kronic 7081869306 Docs: research-based Combat Attack & Ability Feel Guidelines (DRAFT for review) + session log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 13:29:40 -07:00
kronic 9079266397 Docs: 07-19 melee weight pass session log (heavy cadence, salvage axe, FX retone) + inventory
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 10:26:45 -07:00
kronic 4b18a368bd Docs: 07-18 melee-anim pass session log + SwordCombat pack marked IN USE
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:03:26 -07:00
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