The suit .blend was rigged, but the base body/armour/head had vertex groups with NO Armature
modifier (why the export baked a static T-pose) and 2 orphan lamp parts were unweighted. Added the
modifiers, weighted the lamp parts to Spine_03, posed a grounded combat-ready stance (shoulders
down ~63deg, elbows braced forward ~22deg), baked the pose into static geometry (depsgraph
new_from_object) and re-exported. Master .blend keeps the rig+pose re-editable; the in-place GLB
overwrite flowed into the connected ArtStaging prefab instance (38 parts intact, materials +
extracted staging emissive preserved). Suit width 2.05m T-pose -> 1.04m posed; A0 silhouette now
reads from the top-down game camera.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes the empty-bar leak into ArtStaging / menu / pre-connect: AbilityBarSystem.OnUpdate
early-returns when there is no valid NetworkTime, so the 'hide when no local player' line never
ran. Root now DisplayStyle.None at build, flips to Flex only when the local player is found —
also kills any pre-connect flash in gameplay.
Global fill cut (KeyWarm 1.25->0.15, CausticsSpot 32->9, GloamFill 0.5->0.22) so the scene
goes dark-except-where-ours-reaches; WarmPool point light -> downward warm SPOT = a defined
ground-territory disc that lights the suit top-down (a low point light was blasting the chest
into a blown bloom streak). Suit lamp + Drowner gloam emissives extracted from .glb sub-assets
to durable .mat assets (M_Suit_LampWarm_Staging, M_Drowner_GloamAccent_Staging). Recomposed the
triad (crate in-pool / Drowner faced-to-camera at the lit edge / suit center). Grayscale-verified:
the beacon dome is the value winner + the warm disc reads as territory. Suit pose still T-pose
(a Blender rig sitting; A3-adjacent).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>