using System.Collections.Generic; using UnityEngine; using Northbound.Data; namespace Northbound { /// /// 플레이어 스탯 계산 컴포넌트 /// 기본 스탯 + 업그레이드 보너스를 계산하여 반환 /// public class PlayerStats : MonoBehaviour { [Header("Base Stats")] [SerializeField] private int baseMaxHp = 100; [SerializeField] private int baseDamage = 10; [SerializeField] private int baseCapacity = 100; [SerializeField] private float baseManpower = 10f; [SerializeField] private float baseMoveSpeed = 5f; [SerializeField] private float baseSight = 10f; [SerializeField] private float baseAttackRange = 2f; private PlayerUpgradeManager _upgradeManager; private void Awake() { _upgradeManager = GetComponent(); } /// /// 특정 스탯에 대한 업그레이드 보너스 계산 (ADD만 지원) /// private float CalculateStatBonus(string statName) { float bonus = 0f; if (_upgradeManager == null) return bonus; var ownedUpgrades = _upgradeManager.GetOwnedUpgradeData(); foreach (var upgrade in ownedUpgrades) { if (upgrade == null) continue; // effectStatList에서 해당 스탯 찾기 for (int i = 0; i < upgrade.effectStatList.Count; i++) { if (i >= upgrade.effectOpList.Count || i >= upgrade.effectValueList.Count) continue; if (upgrade.effectStatList[i] == statName) { string op = upgrade.effectOpList[i]; float value = upgrade.effectValueList[i]; // ADD 연산만 지원 if (op == "add") { bonus += value; } } } } return bonus; } /// /// 최대 체력 반환 /// public int GetMaxHp() { float bonus = CalculateStatBonus("player_max_hp"); return baseMaxHp + (int)bonus; } /// /// 공격력 반환 /// public int GetDamage() { float bonus = CalculateStatBonus("player_atk_damage"); return baseDamage + (int)bonus; } /// /// 자원 용량 반환 /// public int GetCapacity() { float bonus = CalculateStatBonus("player_capacity"); return baseCapacity + (int)bonus; } /// /// 노동력(건설/채굴 작업량) 반환 /// public float GetManpower() { float bonus = CalculateStatBonus("player_manpower"); return baseManpower + bonus; } /// /// 이동 속도 반환 /// public float GetMoveSpeed() { float bonus = CalculateStatBonus("player_move_speed"); // move_speed는 mul 연산이지만, 우선 ADD만 지원하므로 add로 처리 return baseMoveSpeed + bonus; } /// /// 시야 범위 반환 /// public float GetSight() { float bonus = CalculateStatBonus("player_sight"); return baseSight + bonus; } /// /// 공격 범위 반환 /// public float GetAttackRange() { float bonus = CalculateStatBonus("player_atk_range"); return baseAttackRange + bonus; } #region Base Stat Setters (에디터/초기화용) public void SetBaseMaxHp(int value) => baseMaxHp = value; public void SetBaseDamage(int value) => baseDamage = value; public void SetBaseCapacity(int value) => baseCapacity = value; public void SetBaseManpower(float value) => baseManpower = value; public void SetBaseMoveSpeed(float value) => baseMoveSpeed = value; public void SetBaseSight(float value) => baseSight = value; public void SetBaseAttackRange(float value) => baseAttackRange = value; #endregion /// /// 현재 스탯 정보 출력 (디버그용) /// public void PrintCurrentStats() { Debug.Log($"[PlayerStats] 현재 스탯:\n" + $" Max HP: {GetMaxHp()} (기본: {baseMaxHp})\n" + $" Damage: {GetDamage()} (기본: {baseDamage})\n" + $" Capacity: {GetCapacity()} (기본: {baseCapacity})\n" + $" Manpower: {GetManpower()} (기본: {baseManpower})\n" + $" Move Speed: {GetMoveSpeed()} (기본: {baseMoveSpeed})\n" + $" Sight: {GetSight()} (기본: {baseSight})\n" + $" Attack Range: {GetAttackRange()} (기본: {baseAttackRange})"); if (_upgradeManager != null) { var ownedIds = _upgradeManager.GetOwnedUpgradeIdList(); Debug.Log($"[PlayerStats] 보유 업그레이드 수: {ownedIds.Count}"); } } } }