Compare commits

...

2 Commits

Author SHA1 Message Date
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
3 changed files with 81 additions and 3 deletions
@@ -29,7 +29,7 @@ Catalog of the Synty Polygon packs under `Assets/Synty/`, produced by the [[DR-0
- **PolygonNature**: trees/rocks/foliage/water + skybox — terrain dressing, harvestable-node visuals. - **PolygonNature**: trees/rocks/foliage/water + skybox — terrain dressing, harvestable-node visuals.
- **PNB_Core**: shared sky/weather/water/aurora atmosphere (rain/snow/fog FX, skydome, 9 ShaderGraphs — verify under URP 17.4; use the skydome in the classic-URP cosmetic root, not baked EG meshes). - **PNB_Core**: shared sky/weather/water/aurora atmosphere (rain/snow/fog FX, skydome, 9 ShaderGraphs — verify under URP 17.4; use the skydome in the classic-URP cosmetic root, not baked EG meshes).
- **PolygonKaiju** (env half): 23 buildings incl. **pre-destroyed** highrises/blocks + 40 props (cars, boats, bridge+rubble, neon signs, powerlines, crane, jet, missile) — a ruined-city map + FX meshes (bullets/fire/stomp). - **PolygonKaiju** (env half): 23 buildings incl. **pre-destroyed** highrises/blocks + 40 props (cars, boats, bridge+rubble, neon signs, powerlines, crane, jet, missile) — a ruined-city map + FX meshes (bullets/fire/stomp).
- **PolygonFantasyKingdom**: castle/base kit + 15 **siege engines** → turret/structure visuals. **PolygonGeneric** `Models/Base`: sci-fi wall/floor kit with destroyed variants → buildable structures. **PolygonWestern/DungeonRealms/Carnival**: modular building kits, props. - **PolygonFantasyKingdom**: castle/base kit + 15 **siege engines** → turret/structure visuals. **PolygonGeneric** `Models/Base`: sci-fi wall/floor kit with destroyed variants → buildable structures. **PolygonWestern/DungeonRealms/Carnival**: modular building kits, props. **DungeonRealms `SM_Wep_*` IN USE 07-19**: `SM_Wep_Axe_Large_01` = the player's salvage axe (rigid-skinned to Hand_R via `PlayerRigTools.AttachMeleeWeapon`; atlas `Dungeons_2_Texture_01_A`); large axes/maces/picks ship as future per-frame weapon variants.
## FX / props ## FX / props
@@ -46,7 +46,7 @@ Catalog of the Synty Polygon packs under `Assets/Synty/`, produced by the [[DR-0
- **AnimationBaseLocomotion** (original): the 8-direction Run + **Walk** strafe sets (+RootMotion variants), idles, in-air, transitions — **IN USE**: the player's Locomotion tree runs the WALK strafe set (07-16c, `PlayerRigTools.WireUnderwaterFeelClips`); `A_Walk_FwdStrafeF_RootMotion` averageSpeed 1.46 u/s = the `FeelConfig.TrudgeNaturalSpeed` StrideScale reference. - **AnimationBaseLocomotion** (original): the 8-direction Run + **Walk** strafe sets (+RootMotion variants), idles, in-air, transitions — **IN USE**: the player's Locomotion tree runs the WALK strafe set (07-16c, `PlayerRigTools.WireUnderwaterFeelClips`); `A_Walk_FwdStrafeF_RootMotion` averageSpeed 1.46 u/s = the `FeelConfig.TrudgeNaturalSpeed` StrideScale reference.
- **AnimationIdles** (NEW): ~330 masc + feminine idle clips, Polygon + Sidekick rigs. Masculine/Polygon categories (clips): ArmsFolded 6 · **Base 1 (IN USE — the player Idle + Locomotion center since 07-16d)** · Bored 4 · CheckWatch 1 · Drink 6 · Eat 6 · HandsOnHips 6 · HeadNod 4 · HeadShake 3 · Inspect 5 · Lean 27 · Look 8 · PickNose 4 · PlayWithHair 3 · Plead 2 · PointHand 6 · Posture 12 (Aggressive/Dramatic/Shy/Slumped Enter/Loop/Exit) · Pray 7 · Stretch 6 · Sway 3 (Drunk — too wobbly for the diver) · Thoughtful 8 · UsePhone 25 · Wave 9 · WeightShift 2 · Yawn 1. Most stances ship Enter/Loop/Exit triplets → ready-made **idle-fidget rotation** (Bored/Look/WeightShift/Stretch fit the Bathynaut; a random-fidget sub-state machine is the natural follow-up). Props included (phone/cup/donut/comb — needs `Tools/SyntyPropBoneTool`). - **AnimationIdles** (NEW): ~330 masc + feminine idle clips, Polygon + Sidekick rigs. Masculine/Polygon categories (clips): ArmsFolded 6 · **Base 1 (IN USE — the player Idle + Locomotion center since 07-16d)** · Bored 4 · CheckWatch 1 · Drink 6 · Eat 6 · HandsOnHips 6 · HeadNod 4 · HeadShake 3 · Inspect 5 · Lean 27 · Look 8 · PickNose 4 · PlayWithHair 3 · Plead 2 · PointHand 6 · Posture 12 (Aggressive/Dramatic/Shy/Slumped Enter/Loop/Exit) · Pray 7 · Stretch 6 · Sway 3 (Drunk — too wobbly for the diver) · Thoughtful 8 · UsePhone 25 · Wave 9 · WeightShift 2 · Yawn 1. Most stances ship Enter/Loop/Exit triplets → ready-made **idle-fidget rotation** (Bored/Look/WeightShift/Stretch fit the Bathynaut; a random-fidget sub-state machine is the natural follow-up). Props included (phone/cup/donut/comb — needs `Tools/SyntyPropBoneTool`).
- **AnimationSwordCombat** (NEW, parked for the combat-anim pass): Polygon-rig clips — Attack 42 (Light/Heavy Combo01 chains A/B/C + ReturnToIdle, HeavyStab, HeavyFlourish, LightFencing, LightLeaping; each with RootMotion variants, `*_Sword` suffix, no Masc/Femn split) · Block 13 · Death 8 · Dodge 16 · Hit 19 (React/Stagger/KnockDown/Stun) · Idle 20 (Base/Fidgets/Menacing01/Sheathed). **The melee-verb upgrade path**: Swing1/2/3 LightCombo01 A/B/C, MeleeSwing tells → Menacing idle, real death/hit-react variety. - **AnimationSwordCombat** (**IN USE since 07-18** — [[2026-07-18_SwordCombat_Attack_Anims]]): Polygon-rig clips — Attack 42 (Light/Heavy Combo01 chains A/B/C + ReturnToIdle, HeavyStab, HeavyFlourish, LightFencing, LightLeaping; each with RootMotion variants, `*_Sword` suffix, no Masc/Femn split) · Block 13 · Death 8 · Dodge 16 · Hit 19 (React/Stagger/KnockDown/Stun) · Idle 20 (Base/Fidgets/Menacing01/Sheathed). **Wired via `PlayerRigTools.WireSwordCombatAttackClips`:** Swing1/2/3 = LightCombo01 A/B/C, SpecialSlam = HeavyCombo01A, Death = Death_B_01, CombatIdle = looped Menacing01 (InCombat param). NOTE: attack FBX are **multi-take** (full + WindUp/Hit/FollowThrough) — load by exact clip name. Still unused: Hit-react/Block/Dodge sets.
- **Tools/SyntyPropBoneTool** (NEW): Synty's prop-to-bone attachment utility (editor tooling for the idle/combat prop clips). - **Tools/SyntyPropBoneTool** (NEW): Synty's prop-to-bone attachment utility (editor tooling for the idle/combat prop clips).
## Roadmap hooks (from this catalog) ## Roadmap hooks (from this catalog)
@@ -55,5 +55,5 @@ Catalog of the Synty Polygon packs under `Assets/Synty/`, produced by the [[DR-0
2. **Quadruped Swarmer** — PolygonDog as a separate Rukhanka rig + dog controller (its bundled Attack/Death clips enable a real death anim). 2. **Quadruped Swarmer** — PolygonDog as a separate Rukhanka rig + dog controller (its bundled Attack/Death clips enable a real death anim).
3. **Ruined-city / off-world maps** — Kaiju destroyed-city + NatureBiomes Arid_Desert for the base + expedition regions. 3. **Ruined-city / off-world maps** — Kaiju destroyed-city + NatureBiomes Arid_Desert for the base + expedition regions.
4. **Combat/heal/portal VFX** — wire PolygonParticleFX into `VFXConfig`. 4. **Combat/heal/portal VFX** — wire PolygonParticleFX into `VFXConfig`.
5. **Melee combat animation pass (NEXT, operator-flagged 07-16)** — AnimationSwordCombat: LightCombo01 A/B/C onto Swing1/2/3, Menacing01 combat idle, Hit/Death variety; idle-fidget rotation from AnimationIdles (Bored/Look/WeightShift/Stretch). 5. **Melee combat animation pass** — ✅ CORE SHIPPED 07-18 ([[2026-07-18_SwordCombat_Attack_Anims]]): LightCombo01 A/B/C onto Swing1/2/3, HeavyCombo01A slam, Death_B_01, Menacing01 combat idle. Remaining: hit-react variety (needs a damage-edge param) + idle-fidget rotation from AnimationIdles (Bored/Look/WeightShift/Stretch).
5. **HUD polish** — ✅ DONE ([[DR-024_HUD_Synty_Skin_Theme]]): harvested Interface* sprites/fonts (status/map/inventory icons, HUD panels/bars/pips/gradients/glow, 640 input glyphs, Orbitron + Exo 2.0) into the UITK HUD via a build-safe `HudTheme` ScriptableObject. PolygonIcons (3D meshes) still un-baked — a future render-to-sprite option if more icon variety is wanted. 5. **HUD polish** — ✅ DONE ([[DR-024_HUD_Synty_Skin_Theme]]): harvested Interface* sprites/fonts (status/map/inventory icons, HUD panels/bars/pips/gradients/glow, 640 input glyphs, Orbitron + Exo 2.0) into the UITK HUD via a build-safe `HudTheme` ScriptableObject. PolygonIcons (3D meshes) still un-baked — a future render-to-sprite option if more icon variety is wanted.
@@ -0,0 +1,40 @@
# 2026-07-18 — SwordCombat attack animations (melee-anim pass)
**Goal:** utilize the new `AnimationSwordCombat` pack (imported 07-16) for the player's attacks — the operator-flagged roadmap hook in [[Synty_Asset_Inventory]] ("Melee combat animation pass").
## What shipped
**Controller wiring** (`PlayerRigTools.WireSwordCombatAttackClips`, menu `ProjectM/Animation/Player - Wire Sword Combat Attacks (LANTERN)`, idempotent):
| State | Clip (was) | Clip (now) | speed |
|---|---|---|---|
| Swing1 | A_Swing_R2L (Blender placeholder) | `A_Attack_LightCombo01A_Sword` (0.80s) | 2.0 |
| Swing2 | A_Swing_L2R | `A_Attack_LightCombo01B_Sword` (0.67s) | 1.2 |
| Swing3 | A_Swing_Finisher | `A_Attack_LightCombo01C_Sword` (0.73s) | 2.2 |
| SpecialSlam | A_Special_Slam | `A_Attack_HeavyCombo01A_Sword` (2.03s, overhead chop) | 5.0 |
| Death | A_Death_FallBack | `A_Death_B_01_Sword` (1.70s backward collapse) | 1.0 |
| CombatIdle (NEW) | — | `A_Idle_Menacing01_Sword` (looped) | 1.0 |
- **Speed math:** the swing anim window is `k_AttackAnimTicks = CastFacingTicks = 13` ticks (~0.217s @60Hz) + 0.12s exit blend. Each pack FBX ships **WindUp / Hit / FollowThrough sub-takes** alongside the full take — the WindUp take length = the hit-start second, and each state's `speed` places that hit inside the window (e.g. LightCombo01A hit @0.333s → 0.17s at speed 2.0). Re-tune by editing the `swaps` table in the tool.
- **Menacing01 combat idle:** new `InCombat` bool param + `CombatIdle` state. `Idle → CombatIdle [InCombat]` is appended **after** the existing `Idle → Locomotion [Speed>0.1]` so movement keeps transition priority; `CombatIdle → Idle [!InCombat]` (0.4 blend) + `CombatIdle → Locomotion [Speed>0.1]`. The pack take ships `loopTime=false` — the tool flips it on the pack FBX importer once (the only `Assets/Synty/**` change: that `.fbx.meta`).
- **Drive:** `PlayerAnimationDriveSystem` writes `InCombat = TickWindowMath.SwingActive(melee, serverTick, combatIdleTicks)` — the same wrap-safe predicate as the swing pulse with a wider window, on **both** local + remote paths (`MeleeCombo` replicates → teammates menace too). Window = `FeelConfig.CombatIdleHoldSec` (default 4s, live-tunable static) × 60. No new `[GhostField]`s, no netcode surface — client presentation only.
## Validation
- L1: console error-free (only known-benign tick-batching/leak-notice warnings during the MCP-driven Play).
- L2: EditMode suite green (411 at the time). Play smoke: both netcode worlds boot; the re-baked Rukhanka rig carries all 12 params incl. `InCombat`.
- L3: forced-pose screenshots (drive system disabled, params written via the parameter buffer, `EditorApplication.update` guardian for the mid-swing frames): Swing1 wind-up + follow-through frames and the crouched Menacing01 stance all read clearly on the Bathynaut.
## Notes / gotchas (session-scoped)
- Synty SwordCombat attack FBX = **multi-take** (full + WindUp/Hit/FollowThrough) — load pack clips by **exact clip name**, never "the AnimationClip in the FBX" (the first/last sub-asset is a random section; this bit the first clip-length probe).
- The pack's HeavyFlourish sub-takes drop the "01" (`A_Attack_HeavyFlourish_WindUp_Sword`) — name-match per clip, don't pattern-derive.
- `AnimatorControllerParameterComponent` has no `name` field at runtime — match by `FastAnimatorParameter(name).hash`.
## Open follow-ups (from the same pack, not in this pass)
- Hit-react variety (Hit/React/Stagger/KnockDown/Stun sets) — needs a damage-edge window param; presentation-only.
- Idle-fidget rotation from `AnimationIdles` (Bored/Look/WeightShift/Stretch) — the natural next idle pass.
- Dodge/Block/Parry clips — gameplay verbs first (design fork, operator's call).
**Next-session intent:** operator eyes/ears-on feel pass over the new swings (speeds are the `swaps` table + `FeelConfig.CombatIdleHoldSec`).
@@ -0,0 +1,38 @@
# 2026-07-19 — Melee weight pass: heavy cadence + salvage axe + FX retone
**Operator feedback on the 07-18 pass:** the swings read jerky (0.70.8 s mocap crammed into a 0.22 s window at 25× speed), the diver swings empty-handed, and the bright slash arc doesn't fit the murk. Direction delegated ("bulkier weapon and lighter fx… you figure it out").
**The read:** the three problems share one fix — a heavy underwater diver should swing SLOW. A weighty cadence lets the clips play near natural speed (kills the jerk), justifies a bulky tool in hand, and wants subdued water-wake FX instead of a laser arc.
## What shipped
**1. Heavy swing timing (gameplay feel, no wire change)**
- `PlayerAimSystem.CastFacingTicks` 13 → **26** (~0.43 s): the cast-turn + swing-anim window now tracks the full swing. Invariant: MUST stay < `MeleeRecoverTicks` (the anim pulse needs a false gap between chained swings to re-trigger the Any-State transition).
- `TuningConfig.Defaults()`: `MeleeRecoverTicks` 16 → **30** (~0.50 s lock), `MeleeChainGraceTicks` 18 → 24, `MeleeDamage` 18 → **30** (DPS ≈ held), `MeleeFinisherMult` 1.8 → **1.5** (finisher recover was ballooning at the heavy cadence). All live knobs.
- Clip speeds re-set near natural: Swing1 **1.25×**, Swing2 **1.0×**, Swing3 **1.1×**; entry blends 0.03 → 0.06, exits 0.12 → 0.15.
- **SpecialSlam = a custom take** `A_Attack_HeavyCombo01A_Slam_Sword` (starts 22% into the fbx, skipping ~2/3 of the 1 s windup) at 1.5× — no more comic 5× compression. Take is created idempotently by the wire tool on the pack fbx importer.
- **Tests:** `MeleeComboTests.MakeWorld` now PINS an explicit `TuningConfig` (the values the mechanics assertions were authored against) — live feel defaults are free to drift without breaking mechanics tests. The ComboLength2 test modifies the pinned singleton instead of creating a second one (two singletons = `TryGetSingleton` false = silent Defaults fallback).
**2. Salvage axe in hand** (`PlayerRigTools.AttachMeleeWeapon`, menu `ProjectM/Animation/Player - Attach Melee Weapon (LANTERN)`, idempotent)
- `SM_Wep_Axe_Large_01` (PolygonDungeonRealms) rigid-skinned 100% to **Hand_R** — an in-engine variant of the GraftSmr rebase recipe for a STATIC source mesh: verts baked to hand-rest world space × a grip offset, bindpose = rigid hand-rest inverse, `RecalculateTangents` (mandatory), mesh persisted GUID-stably (`Rebased_SM_Wep_Melee.asset`). Grip offset consts (`WeaponGripPos/Euler`) at the top of the tool — nudge + re-run.
- Material `M_Weapon_Animated.mat` = AnimatedLitShader clone of the suit material + the **explicit** `Dungeons_2_Texture_01_A` atlas. **Gotcha confirmed again: the fbx importer material carries NO texture** — a `mainTexture` fallback silently kept the suit atlas, caught ONLY by the material-VALUES check (the murk render masked it). Axe reads bronze head / wood handle — matches the brass kit.
**3. FX retone (CombatFeedbackSystem)**
- Slash arc: dim bioluminescent teal (0.5,0.9,1.05 → 0.8,1.3,1.4 per step), finisher = lamp-warm amber (1.7,1.25,0.5); inner alpha 0.55 → 0.35; life 0.150.28 → **0.300.50** (tracks the heavy swing); scale pop 0.10 → 0.06; connected boost 1.6 → 1.4. Remote arcs match (life 0.34/0.50, `RemoteSlashColor` dimmed).
- New knobs: `FeelConfig.MeleeArcIntensity` (1.0; live dimmer) + `MeleeArcBubbles` (6) — a small bubble burst sheds along the cleave path per swing (the murk answers the swing).
**4. Dev harness:** `DebugInputInjectionSystem.Attack(frames)` — injects the melee Attack button (was Fire/sockets/move only), so a real predicted swing (sim + anim + arc + bubbles) is drivable headless. Used for the validation captures.
## Validation
- L1 console error-free. L2 EditMode green (411 at the time — pinned melee tests included).
- L3 end-to-end: injected real Attack input → guardian-timed captures show windup/hit/follow-through at the new pacing with the axe in hand and the toned arc; material VALUES verified (`_BaseColorMap` = the Dungeons atlas).
## Open follow-ups
- **Grip micro-polish is operator eyes-on**: `WeaponGripPos/Euler` consts in `AttachMeleeWeapon` (currently pos (0,0.06,0.02), euler (0,0,-90)) — the axe reads right in stills but only a live look judges the blade plane through the whole swing.
- If the arc now reads TOO faint in play: `FeelConfig.MeleeArcIntensity` (live-pokeable).
- Melee DPS was re-balanced by feel-math (30 dmg / 0.5 s ≈ old 67/s → 60/s); a proper balance pass over enemy HP may want a look.
- Weapon variants per frame-kind (axe/mace/pick all ship in DungeonRealms) — the tool takes one const path today.
**Next-session intent:** operator eyes/ears-on: swing weight (knobs: `MeleeRecoverTicks`, clip speeds in the `swaps` table), grip offset, arc intensity.