64 lines
1.6 KiB
C#
64 lines
1.6 KiB
C#
using Chickensoft.Collections;
|
|
using Godot;
|
|
using System;
|
|
using Zennysoft.Ma.Adapter;
|
|
|
|
namespace Zennysoft.Game.Ma;
|
|
|
|
public class AttackComponent : IAttackComponent
|
|
{
|
|
public IAutoProp<int> CurrentAttack => _currentAttack;
|
|
|
|
public IAutoProp<int> MaximumAttack => _maximumAttack;
|
|
|
|
private readonly AutoProp<int> _currentAttack;
|
|
|
|
private readonly AutoProp<int> _maximumAttack;
|
|
|
|
private readonly int _initialValue;
|
|
|
|
public AttackComponent(int attackValue)
|
|
{
|
|
_maximumAttack = new AutoProp<int>(attackValue);
|
|
_currentAttack = new AutoProp<int>(attackValue);
|
|
_initialValue = attackValue;
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
_maximumAttack.OnNext(_initialValue);
|
|
_currentAttack.OnNext(_initialValue);
|
|
}
|
|
|
|
public void Restore(int restoreAmount)
|
|
{
|
|
var cappedAmount = Math.Min(restoreAmount + _currentAttack.Value, _maximumAttack.Value);
|
|
_currentAttack.OnNext(cappedAmount);
|
|
}
|
|
|
|
public void Reduce(int reduceAmount)
|
|
{
|
|
var cappedAmount = Math.Max(_currentAttack.Value - reduceAmount, 0);
|
|
_currentAttack.OnNext(cappedAmount);
|
|
}
|
|
|
|
public void SetAttack(int attack)
|
|
{
|
|
var cappedAmount = Math.Min(attack, _maximumAttack.Value);
|
|
_currentAttack.OnNext(cappedAmount);
|
|
}
|
|
|
|
public void RaiseMaximumAttack(int raiseAmount)
|
|
{
|
|
_maximumAttack.OnNext(_maximumAttack.Value + raiseAmount);
|
|
Restore(raiseAmount);
|
|
}
|
|
|
|
public void LowerMaximumAttack(int lowerAmount)
|
|
{
|
|
_maximumAttack.OnNext(Mathf.Max(_maximumAttack.Value - lowerAmount, 1));
|
|
if (_currentAttack.Value > _maximumAttack.Value)
|
|
_currentAttack.OnNext(_maximumAttack.Value);
|
|
}
|
|
}
|