165 lines
5.0 KiB
C#
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
|
|
}
|
|
}
|