using Chickensoft.Collections; using Chickensoft.Introspection; using Chickensoft.Serialization; using Godot; namespace Zennysoft.Game.Ma; [Meta, Id("player_stats")] public partial record PlayerStats { [Save("currentHP")] public int CurrentHP { get; init; } [Save("maximumHP")] public int MaximumHP { get; init; } [Save("currentVT")] public int CurrentVT { get; init; } [Save("maximumVT")] public int MaximumVT { get; init; } [Save("currentExp")] public double CurrentExp { get; init; } [Save("currentLevel")] public int CurrentLevel { get; init; } [Save("currentAttack")] public int CurrentAttack { get; init; } [Save("bonusAttack")] public int BonusAttack { get; init; } [Save("maxAttack")] public int MaxAttack { get; init; } [Save("currentDefense")] public int CurrentDefense { get; init; } [Save("bonusDefense")] public int BonusDefense { get; init; } [Save("maxDefense")] public int MaxDefense { get; init; } [Save("expToNextLevel")] public int ExpToNextLevel { get; init; } [Save("luck")] public double Luck { get; init; } } public class PlayerStatController { public void Init(PlayerStats playerStats) { _currentHP.OnNext(playerStats.CurrentHP); _maximumHP.OnNext(playerStats.MaximumHP); _currentVT.OnNext(playerStats.CurrentVT); _maximumVT.OnNext(playerStats.MaximumVT); _currentExp.OnNext(playerStats.CurrentExp); _currentLevel.OnNext(playerStats.CurrentLevel); _currentAttack.OnNext(playerStats.CurrentAttack); _bonusAttack.OnNext(playerStats.BonusAttack); _maxAttack.OnNext(playerStats.MaxAttack); _currentDefense.OnNext(playerStats.CurrentDefense); _bonusDefense.OnNext(playerStats.BonusDefense); _maxDefense.OnNext(playerStats.MaxDefense); _expToNextLevel.OnNext(playerStats.ExpToNextLevel); _luck.OnNext(playerStats.Luck); } public IAutoProp CurrentHP => _currentHP; public IAutoProp MaximumHP => _maximumHP; public IAutoProp CurrentVT => _currentVT; public IAutoProp MaximumVT => _maximumVT; public IAutoProp CurrentAttack => _currentAttack; public IAutoProp MaxAttack => _maxAttack; public IAutoProp BonusAttack => _bonusAttack; public IAutoProp CurrentDefense => _currentDefense; public IAutoProp MaxDefense => _maxDefense; public IAutoProp BonusDefense => _bonusDefense; public IAutoProp CurrentExp => _currentExp; public IAutoProp ExpToNextLevel => _expToNextLevel; public IAutoProp CurrentLevel => _currentLevel; public IAutoProp Luck => _luck; public void SetCurrentHP(int newValue) { var clampedValue = Mathf.Clamp(newValue, 0, MaximumHP.Value); _currentHP.OnNext(clampedValue); } public void SetMaximumHP(int newValue) { _maximumHP.OnNext(newValue); } public void SetCurrentVT(int newValue) { var clampedValue = Mathf.Clamp(newValue, 0, MaximumVT.Value); _currentVT.OnNext(clampedValue); } public void SetMaximumVT(int newValue) { _maximumVT.OnNext(newValue); } public void SetCurrentExp(double newValue) { _currentExp.OnNext(newValue); } public void SetCurrentLevel(int newValue) { _currentLevel.OnNext(newValue); } public void SetCurrentAttack(int newValue) { var clampedValue = Mathf.Clamp(newValue, 0, MaxAttack.Value); _currentAttack.OnNext(clampedValue); } public void SetBonusAttack(int newValue) { _bonusAttack.OnNext(newValue); } public void SetMaxAttack(int newValue) { _maxAttack.OnNext(newValue); } public void SetCurrentDefense(int newValue) { var clampedValue = Mathf.Clamp(newValue, 0, MaxDefense.Value); _currentDefense.OnNext(clampedValue); } public void SetBonusDefense(int newValue) { _bonusDefense.OnNext(newValue); } public void SetMaxDefense(int newValue) { _maxDefense.OnNext(newValue); } public void SetExpToNextLevel(int newValue) { _expToNextLevel.OnNext(newValue); } public void SetLuck(double newValue) { var clampedValue = Mathf.Clamp(newValue, 0, 1.0); _luck.OnNext(clampedValue); } private readonly AutoProp _currentHP = new(-1); private readonly AutoProp _maximumHP = new(-1); private readonly AutoProp _currentVT = new(-1); private readonly AutoProp _maximumVT = new(-1); private readonly AutoProp _currentExp = new(-1); private readonly AutoProp _currentLevel = new(-1); private readonly AutoProp _currentAttack = new(-1); private readonly AutoProp _bonusAttack = new(-1); private readonly AutoProp _maxAttack = new(-1); private readonly AutoProp _currentDefense = new(-1); private readonly AutoProp _bonusDefense = new(-1); private readonly AutoProp _maxDefense = new(-1); private readonly AutoProp _expToNextLevel = new(-1); private readonly AutoProp _luck = new(-1); }