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