using Chickensoft.Collections; using Godot; namespace Zennysoft.Game.Implementation.Components; public class DefenseComponent { public IAutoProp CurrentDefense => _currentDefense; public IAutoProp MaximumDefense => _maximumDefense; public IAutoProp BonusDefense => _bonusDefense; private readonly AutoProp _currentDefense; private readonly AutoProp _maximumDefense; private readonly AutoProp _bonusDefense; public int TotalDefense => CurrentDefense.Value + BonusDefense.Value; public DefenseComponent(int defenseValue) { _maximumDefense = new AutoProp(defenseValue); _currentDefense = new AutoProp(defenseValue); _bonusDefense = new AutoProp(0); } public void Restore(int restoreAmount) { var cappedAmount = Math.Min(restoreAmount + _currentDefense.Value, _maximumDefense.Value); _currentDefense.OnNext(cappedAmount); } public void Reduce(int reduceAmount) { var cappedAmount = Math.Max(_currentDefense.Value - reduceAmount, 0); _currentDefense.OnNext(cappedAmount); } public void SetDefense(int attack) { var cappedAmount = Math.Min(attack, _maximumDefense.Value); _currentDefense.OnNext(cappedAmount); } public void RaiseMaximumDefense(int raiseAmount) { _maximumDefense.OnNext(raiseAmount); Restore(raiseAmount); } public void RaiseBonusDefense(int raiseAmount) { _bonusDefense.OnNext(_bonusDefense.Value + raiseAmount); } public void ResetBonusDefense() { _bonusDefense.OnNext(0); } }