Further Tests & Progress
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace ProjectM.Client
|
||||
{
|
||||
/// <summary>
|
||||
/// Live-tunable knobs for the client-only COMBAT-FEEL slice (Stage E). A static bridge — mirrors
|
||||
/// <see cref="AimPresentation"/> — so values can be poked at runtime via MCP <c>execute_code</c>
|
||||
/// (e.g. <c>ProjectM.Client.FeelConfig.HitShakeLocal = 0.4f;</c>) WITHOUT a recompile, for interactive
|
||||
/// tuning. Read ONLY by client-presentation systems (<see cref="CombatFeedbackSystem"/>,
|
||||
/// <see cref="AimReticleSystem"/>) and the <see cref="PrototypeCameraRig"/> MonoBehaviour — all non-Burst,
|
||||
/// main-thread. NEVER read these from a <c>[BurstCompile]</c> system (managed-static + Color/enum-in-Burst
|
||||
/// hazards); they are presentation-only and never touch the deterministic simulation.
|
||||
/// <para>
|
||||
/// Defaults match the values previously hardcoded in CombatFeedbackSystem so behaviour is byte-identical
|
||||
/// until a knob is poked. <see cref="ResetDefaults"/> re-stamps every field on play-enter via
|
||||
/// <c>[RuntimeInitializeOnLoadMethod(SubsystemRegistration)]</c> because statics survive fast-enter-playmode
|
||||
/// domain reloads — without it a poked value would leak across play-enters and flash stale feel (the exact
|
||||
/// bug <see cref="AimPresentation"/>'s reset prevents).
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public static class FeelConfig
|
||||
{
|
||||
// ---- Feature 1: hit camera punch + (camera-only) hit-stop ----
|
||||
/// <summary>Camera shake when the LOCAL player is hit (fed to PrototypeCameraRig.AddShake, clamp 0.8).</summary>
|
||||
public static float HitShakeLocal;
|
||||
/// <summary>Camera shake when a remote player / Husk is hit.</summary>
|
||||
public static float HitShakeRemote;
|
||||
/// <summary>Hit-spark particle burst count (procedural fallback path).</summary>
|
||||
public static int HitBurstCount;
|
||||
/// <summary>Hit SFX volume.</summary>
|
||||
public static float HitSfxVolume;
|
||||
/// <summary>Degrees of transient FOV "kick" on a LOCAL hit — the netcode-safe hit-stop (NEVER Time.timeScale). 0 = off.</summary>
|
||||
public static float HitStopFovKick;
|
||||
/// <summary>Milliseconds the FOV kick eases back to base.</summary>
|
||||
public static float HitStopDurationMs;
|
||||
|
||||
// ---- Feature 1/2: death camera punch ----
|
||||
/// <summary>Camera shake on LOCAL player death (loudest event by design).</summary>
|
||||
public static float PlayerDeathShake;
|
||||
/// <summary>Camera shake on a remote player's death.</summary>
|
||||
public static float RemotePlayerDeathShake;
|
||||
/// <summary>Base death-burst particle count (player death + Husk-death base).</summary>
|
||||
public static int DeathBurstCount;
|
||||
|
||||
// ---- Feature 2: kill-shot fanfare (Husk death) ----
|
||||
/// <summary>Camera shake on a Husk kill (nudged above a glancing hit, kept under PlayerDeathShake).</summary>
|
||||
public static float KillShake;
|
||||
/// <summary>Multiplier on DeathBurstCount for a Husk kill (result clamped by MaxActiveVfx).</summary>
|
||||
public static float KillBurstScale;
|
||||
/// <summary>Optional FOV kick on a kill (degrees). 0 = off.</summary>
|
||||
public static float KillFovKick;
|
||||
/// <summary>Husk-death SFX volume.</summary>
|
||||
public static float KillSfxVolume;
|
||||
|
||||
// ---- Feature 3: respawn shimmer / fade-in (local player recovery) ----
|
||||
/// <summary>Master gate for the local-player respawn shimmer.</summary>
|
||||
public static bool RespawnShimmerEnabled;
|
||||
/// <summary>Particle burst count for the recovery shimmer.</summary>
|
||||
public static int RespawnShimmerBurst;
|
||||
/// <summary>Light camera punch on recovery so respawn reads as "reinforcing".</summary>
|
||||
public static float RespawnShimmerShake;
|
||||
|
||||
// ---- Feature 4: reticle lock-on tether (cosmetic aim HINT) ----
|
||||
/// <summary>Master gate for the lock-on tether.</summary>
|
||||
public static bool LockOnEnabled;
|
||||
/// <summary>Show the tether only on the Gamepad scheme (mirrors the server's gamepad-only auto-target assist).</summary>
|
||||
public static bool LockOnGamepadOnly;
|
||||
/// <summary>Max world distance from the player to a tethered Husk.</summary>
|
||||
public static float LockOnRange;
|
||||
/// <summary>Forward half-arc (degrees) around PlayerFacing within which a Husk is eligible.</summary>
|
||||
public static float LockOnArcDegrees;
|
||||
/// <summary>Tether line tint (subtle highlight, not a laser).</summary>
|
||||
public static Color LockOnLineColor;
|
||||
/// <summary>Tether line width (world units).</summary>
|
||||
public static float LockOnLineWidth;
|
||||
|
||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
||||
public static void ResetDefaults()
|
||||
{
|
||||
// Feature 1
|
||||
HitShakeLocal = 0.32f;
|
||||
HitShakeRemote = 0.10f;
|
||||
HitBurstCount = 10;
|
||||
HitSfxVolume = 0.70f;
|
||||
HitStopFovKick = 1.5f;
|
||||
HitStopDurationMs = 90f;
|
||||
|
||||
// Feature 1/2 death
|
||||
PlayerDeathShake = 0.50f;
|
||||
RemotePlayerDeathShake = 0.25f;
|
||||
DeathBurstCount = 28;
|
||||
|
||||
// Feature 2 kill-shot
|
||||
KillShake = 0.20f;
|
||||
KillBurstScale = 1.5f;
|
||||
KillFovKick = 1.0f;
|
||||
KillSfxVolume = 0.75f;
|
||||
|
||||
// Feature 3 respawn
|
||||
RespawnShimmerEnabled = true;
|
||||
RespawnShimmerBurst = 24;
|
||||
RespawnShimmerShake = 0.12f;
|
||||
|
||||
// Feature 4 tether
|
||||
LockOnEnabled = true;
|
||||
LockOnGamepadOnly = true;
|
||||
LockOnRange = 9.0f;
|
||||
LockOnArcDegrees = 60f;
|
||||
LockOnLineColor = new Color(0.55f, 0.9f, 1f, 0.35f);
|
||||
LockOnLineWidth = 0.05f;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user