From ce0faafb72901c1f99389e33944dd59be455a258 Mon Sep 17 00:00:00 2001 From: Luis Gonzalez Date: Tue, 21 Jul 2026 00:13:49 -0700 Subject: [PATCH] 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 --- .../Animation/AC_PlayerTopDown.controller | 6 +-- .../Scripts/Client/Presentation/FeelConfig.cs | 6 +-- .../Scripts/Simulation/Debug/TuningConfig.cs | 12 ++--- .../Tuning/Profiles/baseline-0720.json | 20 ++++---- .../Tuning/Profiles/heavy-committed.json | 49 ++++++++++++++----- 5 files changed, 61 insertions(+), 32 deletions(-) diff --git a/Assets/_Project/Animation/AC_PlayerTopDown.controller b/Assets/_Project/Animation/AC_PlayerTopDown.controller index ebf1ad229..6469a0fbb 100644 --- a/Assets/_Project/Animation/AC_PlayerTopDown.controller +++ b/Assets/_Project/Animation/AC_PlayerTopDown.controller @@ -633,7 +633,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Swing3 - m_Speed: 1.1 + m_Speed: 0.88 m_CycleOffset: 0 m_Transitions: - {fileID: 7246856984932168808} @@ -779,7 +779,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Swing2 - m_Speed: 1 + m_Speed: 0.85 m_CycleOffset: 0 m_Transitions: - {fileID: -7565464033697258994} @@ -1050,7 +1050,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Swing1 - m_Speed: 1.25 + m_Speed: 1 m_CycleOffset: 0 m_Transitions: - {fileID: -1792799526728587842} diff --git a/Assets/_Project/Scripts/Client/Presentation/FeelConfig.cs b/Assets/_Project/Scripts/Client/Presentation/FeelConfig.cs index 73143e089..bd7d605e4 100644 --- a/Assets/_Project/Scripts/Client/Presentation/FeelConfig.cs +++ b/Assets/_Project/Scripts/Client/Presentation/FeelConfig.cs @@ -267,7 +267,7 @@ namespace ProjectM.Client // Combat feel pass (2026-06) HitFlashBurstCount = 16; - MeleeConnectFovKick = 0.8f; + MeleeConnectFovKick = 1.1f; // 07-21 HEAVY LOCK: meatier bite MeleeConnectVolume = 0.55f; KillFlashBurstCount = 20; FootstepVolume = 0.30f; // 07-15: heavier, more present underwater thud @@ -287,9 +287,9 @@ namespace ProjectM.Client ShoulderLampIntensity = 8f; // 07-16e: the suit lamp actually lights (3 got lost in the murk ambient) ShoulderLampRange = 12f; CombatIdleHoldSec = 4f; // 07-18: Menacing01 combat-idle hold after the last swing - MeleeArcIntensity = 1f; // 07-19: arc colors are pre-toned dim; this scales from there + MeleeArcIntensity = 0.8f; // 07-21 HEAVY LOCK: the weapon is the read, the arc recedes further MeleeArcBubbles = 6; - FinisherHoldFrames = 5; // 07-20 G5: the finisher's heavy beat (~83ms), capped well under the 8-frame ladder ceiling + FinisherHoldFrames = 7; // 07-21 HEAVY LOCK: a fatter finisher beat (~117ms, still under the 8-frame ladder cap) RumbleEnabled = true; diff --git a/Assets/_Project/Scripts/Simulation/Debug/TuningConfig.cs b/Assets/_Project/Scripts/Simulation/Debug/TuningConfig.cs index 9df620061..b930a61a5 100644 --- a/Assets/_Project/Scripts/Simulation/Debug/TuningConfig.cs +++ b/Assets/_Project/Scripts/Simulation/Debug/TuningConfig.cs @@ -84,18 +84,18 @@ namespace ProjectM.Simulation ChargerLungeDurationTicks = 18f, ChargerWhiffStaggerTicks = 36f, GruntWindupTicks = Tuning.AttackWindupTicks, // canonical Grunt-windup source (TelegraphTests couples to it) - MeleeDamage = 30f, // 07-19 heavy-weapon retime: bigger hit, slower cadence (DPS ~held: 18/0.27s -> 30/0.50s) + MeleeDamage = 36f, // 07-21 HEAVY LOCK (operator A/B): DPS ~held at 60 (dmg = recover ticks) MeleeRange = 2.2f, // 07-20 G2.2 reach honesty: axe tip ~1.8m + a 0.4m player-favoring margin (was 2.6) MeleeConeHalfAngleRad = 0.9f, // ~51.5 deg half-angle (~103 deg cleave arc) - MeleeRecoverTicks = 30f, // heavy-swing lock/recovery (~0.50s; 07-19 weighty-melee retime) - MeleeChainGraceTicks = 24f, // window after the lock to chain the next hit (~0.4s) - MeleeSwingMoveScale = 0.35f, // movement-commit while swinging (0..1) + MeleeRecoverTicks = 36f, // 07-21 HEAVY LOCK: 0.60s light lock (finisher x1.5 = 54t) + MeleeChainGraceTicks = 28f, // 07-21 HEAVY LOCK: ~0.47s chain window after the lock + MeleeSwingMoveScale = 0.25f, // 07-21 HEAVY LOCK: deeper movement commit while swinging MeleeKnockbackSpeed = 6f, MeleeFinisherMult = 1.5f, // finisher (last hit) scales dmg/range/recover/knockback (07-19: 1.8 -> 1.5, recover was ballooning at the heavy cadence) MeleeComboLength = 3f, // light, light, finisher MeleeFinisherRangeMult = 1.25f, // 07-20 G2.2: finisher REACH (damage/recover/knockback keep MeleeFinisherMult) - MeleeBufferTicks = 8f, // 07-20 G7: attack press remembered in the last ~0.13s of a lock (0 = off) - MeleeContactTicks = 16f, // 07-20 G2.1: blade lands ~0.27s after swing start (per-step via MeleeTiming; 0 = legacy immediate) + MeleeBufferTicks = 10f, // 07-21 HEAVY LOCK: wider buffer fits the slower cadence (0 = off) + MeleeContactTicks = 20f, // 07-21 HEAVY LOCK: blade lands 20/12/25t per step -- clip speeds retuned to MATCH (wire tool 1.0/0.85/0.88; audit must show zero drift). Step-3 (25t) sits 1 tick under CastFacingTicks 26 -- do NOT raise without raising the cast window. StructureAggroWeight = 0.7f, // EB-1: <1 prefers structures (fortress aggro); live-tunable StaggerKnockbackSpeed = 7f, // B2 poise: kb.Speed >= this interrupts windups/lunges; below = nudge only SeparationMaxSpeed = 3f, // B1: max separation push (units/s) so soft-collision can't fling diff --git a/Assets/_Project/Tuning/Profiles/baseline-0720.json b/Assets/_Project/Tuning/Profiles/baseline-0720.json index 00e8fbd7b..41851fba9 100644 --- a/Assets/_Project/Tuning/Profiles/baseline-0720.json +++ b/Assets/_Project/Tuning/Profiles/baseline-0720.json @@ -1,20 +1,22 @@ { - "name": "baseline-0720", - "notes": "The shipped 07-20 defaults (forks 1-6). Apply to RESET after experiments. DPS ~60 held: dmg = recover ticks.", + "name": "baseline-heavy-0721", + "notes": "THE SHIPPED DEFAULTS (heavy feel locked 07-21 from the operator A/B). Apply to RESET after experiments. DPS 60 held (dmg = recover ticks); clip speeds 1.0/0.85/0.88 match contact 20/12/25.", "sim": [ - { "k": "MeleeDamage", "v": "30" }, + { "k": "MeleeDamage", "v": "36" }, { "k": "MeleeRange", "v": "2.2" }, - { "k": "MeleeRecoverTicks", "v": "30" }, - { "k": "MeleeChainGraceTicks", "v": "24" }, + { "k": "MeleeRecoverTicks", "v": "36" }, + { "k": "MeleeChainGraceTicks", "v": "28" }, { "k": "MeleeFinisherMult", "v": "1.5" }, { "k": "MeleeFinisherRangeMult", "v": "1.25" }, - { "k": "MeleeBufferTicks", "v": "8" }, - { "k": "MeleeContactTicks", "v": "16" } + { "k": "MeleeBufferTicks", "v": "10" }, + { "k": "MeleeContactTicks", "v": "20" }, + { "k": "MeleeSwingMoveScale", "v": "0.25" } ], "feel": [ - { "k": "MeleeArcIntensity", "v": "1" }, + { "k": "MeleeArcIntensity", "v": "0.8" }, { "k": "MeleeArcBubbles", "v": "6" }, - { "k": "FinisherHoldFrames", "v": "5" }, + { "k": "FinisherHoldFrames", "v": "7" }, + { "k": "MeleeConnectFovKick", "v": "1.1" }, { "k": "CombatIdleHoldSec", "v": "4" } ] } diff --git a/Assets/_Project/Tuning/Profiles/heavy-committed.json b/Assets/_Project/Tuning/Profiles/heavy-committed.json index 37a23ca8f..c73d0a69d 100644 --- a/Assets/_Project/Tuning/Profiles/heavy-committed.json +++ b/Assets/_Project/Tuning/Profiles/heavy-committed.json @@ -1,17 +1,44 @@ { "name": "heavy-committed", - "notes": "Slower, weightier: MonHun-lean. Longer lock + contact, bigger hit + hold, dimmer arc (the weapon is the read). DPS ~60 held.", + "notes": "LOCKED into code defaults 2026-07-21 (kept as the record of the winning A/B candidate). Slower, weightier: MonHun-lean. Longer lock + contact, bigger hit + hold, dimmer arc (the weapon is the read). DPS ~60 held.", "sim": [ - { "k": "MeleeDamage", "v": "36" }, - { "k": "MeleeRecoverTicks", "v": "36" }, - { "k": "MeleeChainGraceTicks", "v": "28" }, - { "k": "MeleeContactTicks", "v": "20" }, - { "k": "MeleeBufferTicks", "v": "10" }, - { "k": "MeleeSwingMoveScale", "v": "0.25" } + { + "k": "MeleeDamage", + "v": "36" + }, + { + "k": "MeleeRecoverTicks", + "v": "36" + }, + { + "k": "MeleeChainGraceTicks", + "v": "28" + }, + { + "k": "MeleeContactTicks", + "v": "20" + }, + { + "k": "MeleeBufferTicks", + "v": "10" + }, + { + "k": "MeleeSwingMoveScale", + "v": "0.25" + } ], "feel": [ - { "k": "MeleeArcIntensity", "v": "0.8" }, - { "k": "FinisherHoldFrames", "v": "7" }, - { "k": "MeleeConnectFovKick", "v": "1.1" } + { + "k": "MeleeArcIntensity", + "v": "0.8" + }, + { + "k": "FinisherHoldFrames", + "v": "7" + }, + { + "k": "MeleeConnectFovKick", + "v": "1.1" + } ] -} +} \ No newline at end of file