166 lines
5.5 KiB
C#
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>");
|
|
}
|
|
}
|
|
}
|
|
}
|