Files
Northbound/Assets/Scripts/PlayerStats.cs

166 lines
5.5 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using Northbound.Data;
namespace Northbound
{
/// <summary>
/// 플레이어 스탯 계산 컴포넌트
/// 기본 스탯 + 업그레이드 보너스를 계산하여 반환
/// </summary>
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<PlayerUpgradeManager>();
}
/// <summary>
/// 특정 스탯에 대한 업그레이드 보너스 계산 (ADD만 지원)
/// </summary>
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;
}
/// <summary>
/// 최대 체력 반환
/// </summary>
public int GetMaxHp()
{
float bonus = CalculateStatBonus("player_max_hp");
return baseMaxHp + (int)bonus;
}
/// <summary>
/// 공격력 반환
/// </summary>
public int GetDamage()
{
float bonus = CalculateStatBonus("player_atk_damage");
return baseDamage + (int)bonus;
}
/// <summary>
/// 자원 용량 반환
/// </summary>
public int GetCapacity()
{
float bonus = CalculateStatBonus("player_capacity");
return baseCapacity + (int)bonus;
}
/// <summary>
/// 노동력(건설/채굴 작업량) 반환
/// </summary>
public float GetManpower()
{
float bonus = CalculateStatBonus("player_manpower");
return baseManpower + bonus;
}
/// <summary>
/// 이동 속도 반환
/// </summary>
public float GetMoveSpeed()
{
float bonus = CalculateStatBonus("player_move_speed");
// move_speed는 mul 연산이지만, 우선 ADD만 지원하므로 add로 처리
return baseMoveSpeed + bonus;
}
/// <summary>
/// 시야 범위 반환
/// </summary>
public float GetSight()
{
float bonus = CalculateStatBonus("player_sight");
return baseSight + bonus;
}
/// <summary>
/// 공격 범위 반환
/// </summary>
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
/// <summary>
/// 현재 스탯 정보 출력 (디버그용)
/// </summary>
public void PrintCurrentStats()
{
Debug.Log($"<color=cyan>[PlayerStats] 현재 스탯:</color>\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($"<color=cyan>[PlayerStats] 보유 업그레이드 수: {ownedIds.Count}</color>");
}
}
}
}