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>
This commit is contained in:
2026-07-21 13:27:50 -07:00
parent 9d6977cd64
commit 2aebc37115
25 changed files with 598 additions and 64 deletions
@@ -0,0 +1,22 @@
#if UNITY_EDITOR
using UnityEngine;
namespace ProjectM.Client
{
/// <summary>07-21 G4 (review wf_98bf1268) — editor-only saturation-stress toggle, flipped by the DebugOverlay
/// row. While ON, CombatFeedbackSystem synthesizes the ally attack package at 3 orbiting fake-caster positions
/// (the 4-player worst case without 4 connections). Lives in the Debug family, NOT FeelConfig —
/// FeelProfileService.SaveCurrent snapshots every FeelConfig field and a captured profile would re-arm stress
/// mode on Apply (review finding). Resets on play-enter per the static-presentation-bridge ★ rule (statics
/// survive fast-enter-playmode reloads; a leaked-on flag would spew phantom ally FX with no overlay in
/// Game.unity to clear it).</summary>
public static class CombatStressDebug
{
/// <summary>While true, CombatFeedbackSystem emits the fake-caster ally-FX package every ~0.5 s.</summary>
public static bool StressAllyFx;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void ResetOnEnterPlayMode() => StressAllyFx = false;
}
}
#endif