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
}
}