Files

77 lines
2.4 KiB
C#

using BumpCombat.Player;
using BumpCombat.Core;
using UnityEngine;
namespace BumpCombat.Progression
{
[CreateAssetMenu(
fileName = "ModifierDefinition",
menuName = "BumpCombat/Progression/Modifier Definition")]
public sealed class ModifierDefinition : ScriptableObject
{
[SerializeField] private string modifierId;
[SerializeField] private string displayName;
[SerializeField] private CharacterStat stat;
[SerializeField] private ModifierOperation operation;
[SerializeField] private float value;
[SerializeField, Min(1)] private int maximumStacks = 1;
[SerializeField, Min(0f)] private float healOnApply;
public string ModifierId => modifierId;
public string DisplayName => displayName;
public CharacterStat Stat => stat;
public ModifierOperation Operation => operation;
public float Value => value;
public int MaximumStacks => maximumStacks;
public float HealOnApply => healOnApply;
public bool CanApply(PlayerStats playerStats)
{
return playerStats != null
&& playerStats.GetStackCount(modifierId, stat) < maximumStacks;
}
public bool TryApply(
PlayerStats playerStats,
PlayerHealth playerHealth)
{
if (!CanApply(playerStats)
|| !playerStats.AddModifier(new StatModifier(
modifierId,
stat,
operation,
value,
maximumStacks)))
{
return false;
}
if (healOnApply > 0f && playerHealth != null)
{
playerHealth.Heal(healOnApply);
}
return true;
}
#if UNITY_EDITOR
public void Configure(
string id,
string label,
CharacterStat targetStat,
ModifierOperation modifierOperation,
float modifierValue,
int maxStacks,
float immediateHeal = 0f)
{
modifierId = id;
displayName = label;
stat = targetStat;
operation = modifierOperation;
value = modifierValue;
maximumStacks = Mathf.Max(1, maxStacks);
healOnApply = Mathf.Max(0f, immediateHeal);
}
#endif
}
}