Files
Northbound/Assets/Scripts/UpgradeDatabase.cs
T

165 lines
5.0 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using Northbound.Data;
namespace Northbound
{
/// <summary>
/// 씬에서 직접 참조한 UpgradeData ScriptableObject를 조회하는 싱글톤
/// </summary>
public class UpgradeDatabase : MonoBehaviour
{
private static UpgradeDatabase _instance;
public static UpgradeDatabase Instance => _instance;
[Header("ScriptableObject Data")]
[Tooltip("업그레이드 데이터의 단일 원본 목록입니다. Resources 자동 검색 대신 SO를 직접 등록합니다.")]
[SerializeField] private List<UpgradeData> _upgradeDataList = new List<UpgradeData>();
// 조회용 딕셔너리
private Dictionary<int, UpgradeData> _upgradeById = new Dictionary<int, UpgradeData>();
private Dictionary<string, List<UpgradeData>> _upgradesByCategory = new Dictionary<string, List<UpgradeData>>();
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
BuildLookupTables();
}
/// <summary>
/// 조회용 테이블 구축
/// </summary>
private void BuildLookupTables()
{
_upgradeById.Clear();
_upgradesByCategory.Clear();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade == null) continue;
// ID로 조회
if (!_upgradeById.ContainsKey(upgrade.id))
{
_upgradeById[upgrade.id] = upgrade;
}
else
{
Debug.LogError($"[UpgradeDatabase] 중복 업그레이드 ID: {upgrade.id}", upgrade);
continue;
}
// 카테고리로 조회
string category = upgrade.upgradeCategory;
if (!_upgradesByCategory.ContainsKey(category))
{
_upgradesByCategory[category] = new List<UpgradeData>();
}
_upgradesByCategory[category].Add(upgrade);
}
}
/// <summary>
/// 데이터 다시 로드 (에디터에서 데이터 변경 시 호출)
/// </summary>
public void ReloadData()
{
BuildLookupTables();
}
#region Getters
/// <summary>
/// ID로 업그레이드 데이터 조회
/// </summary>
public UpgradeData GetUpgradeById(int id)
{
if (_upgradeById.TryGetValue(id, out var upgrade))
{
return upgrade;
}
Debug.LogWarning($"[UpgradeDatabase] ID {id}에 해당하는 업그레이드를 찾을 수 없습니다.");
return null;
}
/// <summary>
/// 카테고리로 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetUpgradesByCategory(string category)
{
if (_upgradesByCategory.TryGetValue(category, out var upgrades))
{
return new List<UpgradeData>(upgrades);
}
return new List<UpgradeData>();
}
/// <summary>
/// 개인 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetPersonalUpgrades()
{
var result = new List<UpgradeData>();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade != null && upgrade.upgradeTarget == "person")
{
result.Add(upgrade);
}
}
return result;
}
/// <summary>
/// 팀 업그레이드 목록 조회
/// </summary>
public List<UpgradeData> GetTeamUpgrades()
{
var result = new List<UpgradeData>();
foreach (var upgrade in _upgradeDataList)
{
if (upgrade != null && upgrade.upgradeTarget == "share")
{
result.Add(upgrade);
}
}
return result;
}
/// <summary>
/// 모든 업그레이드 데이터 반환
/// </summary>
public List<UpgradeData> GetAllUpgrades()
{
return new List<UpgradeData>(_upgradeDataList);
}
/// <summary>
/// 선행 업그레이드 조건 충족 여부 확인
/// </summary>
public bool ArePrerequisitesMet(int upgradeId, HashSet<int> ownedUpgradeIds)
{
var upgrade = GetUpgradeById(upgradeId);
if (upgrade == null) return false;
foreach (int requiredId in upgrade.requireUpgradeId)
{
if (!ownedUpgradeIds.Contains(requiredId))
{
return false;
}
}
return true;
}
#endregion
}
}