2026-06-11 12:14:46 +01:00

132 lines
4.7 KiB
C#

using Intrepid.Utilities;
using Sirenix.OdinInspector;
using UnityEngine;
namespace Intrepid.Gameplay.Entities.Player.Sentinel.Cadence
{
[CreateAssetMenu(fileName = "Cadence Profile", menuName = "GON/Services/Cadence/Cadence Profile")]
public sealed class CadenceProfile : ScriptableObject
{
[SerializeField, Min(1f)] private float totalTimeMS = 370f;
[GroupConfigurations("Normalized Band End Points"), SerializeField, Range(0f, 1f)] private float strainedEndP = 0.25f;
[GroupConfigurations("Normalized Band End Points"), SerializeField, Range(0f, 1f)] private float alignedEndP = 0.65f;
[GroupConfigurations("Normalized Band End Points"), SerializeField, Range(0f, 1f)] private float resonantEndP = 1f;
[GroupConfigurations("Settlement"), SerializeField, Range(0f, 1f)] private float strainedSettlement = 1f;
[GroupConfigurations("Settlement"), SerializeField, Range(0f, 1f)] private float alignedSettlement = 0.5f;
[GroupConfigurations("Settlement"), SerializeField, Range(0f, 1f)] private float resonantSettlement;
[GroupConfigurations("Settlement"), SerializeField, Range(0f, 1f)] private float lateSettlement = 1f;
[GroupConfigurations("Core Stability"), SerializeField, Range(0, 100)] private float maxCoreCost = 8f;
[GroupConfigurations("Core Stability"), SerializeField, Range(0, 100)] private float resonantRecovery = 8f;
public float TotalTimeMS => totalTimeMS;
public float TotalTime => TotalTimeMS * 0.001f;
public float StrainedEndP => strainedEndP;
public float AlignedEndP => alignedEndP;
public float ResonantEndP => resonantEndP;
// public float StrainedEndTime => TotalTime * strainedEndP;
// public float AlignedEndTime => TotalTime * alignedEndP;
// public float ResonantEndTime => TotalTime * resonantEndP;
//
// public float StrainedEndMS => totalTimeMS * strainedEndP;
// public float AlignedEndMS => totalTimeMS * alignedEndP;
// public float ResonantEndMS => totalTimeMS * resonantEndP;
public float StrainedSettlement => strainedSettlement;
public float AlignedSettlement => alignedSettlement;
public float ResonantSettlement => resonantSettlement;
public float LateSettlement => lateSettlement;
public float MaxCoreCost => maxCoreCost;
public float ResonantRecovery => resonantRecovery;
private void OnValidate()
{
Validate();
}
[GroupDebug, Button(ButtonSizes.Medium)]
private void Validate()
{
totalTimeMS = Mathf.Max(1f, totalTimeMS);
strainedEndP = Mathf.Clamp01(strainedEndP);
alignedEndP = Mathf.Clamp01(alignedEndP);
resonantEndP = Mathf.Clamp01(resonantEndP);
if (alignedEndP < strainedEndP)
{
alignedEndP = strainedEndP;
}
if (resonantEndP < alignedEndP)
{
resonantEndP = alignedEndP;
}
strainedSettlement = Mathf.Clamp01(strainedSettlement);
alignedSettlement = Mathf.Clamp01(alignedSettlement);
resonantSettlement = Mathf.Clamp01(resonantSettlement);
lateSettlement = Mathf.Clamp01(lateSettlement);
maxCoreCost = Mathf.Max(0f, maxCoreCost);
resonantRecovery = Mathf.Max(0f, resonantRecovery);
}
public CadenceEvaluation Evaluate(float elapsedTime)
{
if (TotalTime <= 0f)
{
return CadenceEvaluation.None;
}
var t = Mathf.Clamp01(elapsedTime / TotalTime);
if (t < StrainedEndP)
{
return new CadenceEvaluation(
t,
elapsedTime,
CadenceBand.Strained,
StrainedSettlement,
0f
);
}
if (t < AlignedEndP)
{
return new CadenceEvaluation(
t,
elapsedTime,
CadenceBand.Aligned,
AlignedSettlement,
0f
);
}
if (t < ResonantEndP)
{
return new CadenceEvaluation(
t,
elapsedTime,
CadenceBand.Resonant,
ResonantSettlement,
ResonantRecovery
);
}
return new CadenceEvaluation(
t,
elapsedTime,
CadenceBand.Late,
LateSettlement,
0f
);
}
}
}