using UnityEngine; namespace ProjectM.Client { /// /// Live-tunable knobs for — the Phase 1.5 "dynamic-light-first" layer /// (RoR2 trick: dark ambient + moving point lights carry the readability). Mirrors the /// bridge idiom: a MonoBehaviour placed in the gameplay scene with a /// static the client presentation system reads (falling back to these same /// defaults when absent). Pure presentation — never touches the simulation. Colours are sRGB. /// public sealed class DynamicLightConfig : MonoBehaviour { public static DynamicLightConfig Instance; [Header("Master")] public bool Enabled = true; [Header("Projectile lights (pooled, follow every live projectile ghost)")] [Min(0)] public int MaxProjectileLights = 24; public Color ProjectileColor = new Color(0.45f, 0.85f, 1f, 1f); [Tooltip("Un-owned (enemy) projectiles — Spitter spit reads toxic green vs the player's cyan.")] public Color EnemyProjectileColor = new Color(0.55f, 1f, 0.35f, 1f); [Min(0f)] public float ProjectileIntensity = 2.6f; [Min(0.5f)] public float ProjectileRange = 7f; [Header("Portal light (RoomExplore loot window — same position authority as the beacon)")] public Color PortalColor = new Color(0.55f, 0.95f, 1f, 1f); [Min(0f)] public float PortalIntensity = 3.5f; [Min(0f)] public float PortalPulseAmp = 1.2f; [Min(0.5f)] public float PortalRange = 13f; [Header("Resource-node glow (soft pickup readability)")] public bool NodeGlow = true; [Min(0)] public int MaxNodeLights = 12; public Color NodeColor = new Color(0.40f, 1f, 0.75f, 1f); [Min(0f)] public float NodeIntensity = 1.3f; [Min(0.5f)] public float NodeRange = 4.5f; [Header("Impact flashes (fed by CombatFeedbackSystem's burst funnel)")] [Min(0)] public int MaxFlashLights = 8; public Color FlashDefaultColor = new Color(1f, 0.85f, 0.55f, 1f); [Min(0f)] public float FlashIntensity = 3.2f; [Min(0.5f)] public float FlashRange = 6.5f; [Min(0.02f)] public float FlashDuration = 0.18f; void OnEnable() { Instance = this; } void OnDisable() { if (Instance == this) Instance = null; } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void ResetStatics() { Instance = null; } } }