인물정보, 소지품 분리
This commit is contained in:
@@ -25,10 +25,15 @@ private struct InitialAffection
|
||||
"진행도 초기값과 마찬가지로 플레이를 시작한 씬의 값만 적용되고, 씬 전환으로 넘어온 경우엔 무시된다")]
|
||||
[SerializeField] private List<InitialAffection> _initialAffections = new();
|
||||
|
||||
[Tooltip("플레이 시작 시 소지 아이템 — 이 씬만 직접 열어 테스트할 때 앞 과정 없이 증거품을 들고 시작하게. " +
|
||||
// 아래 두 목록은 찾기 쉽게 나눠 둔 것일 뿐, 항목의 실제 분류는 EvidenceDatabase의
|
||||
// 어느 목록에 등록했는지가 정한다. 여기서 자리를 바꿔도 창에 뜨는 분류는 달라지지 않는다.
|
||||
[Tooltip("플레이 시작 시 들고 있을 소지품 — 이 씬만 직접 열어 테스트할 때 앞 과정 없이 시작하게. " +
|
||||
"다른 초기값과 마찬가지로 플레이를 시작한 씬의 값만 적용되고, 씬 전환으로 넘어온 경우엔 무시된다. " +
|
||||
"실제 게임에서의 획득은 AddItem(터치존·버튼 UnityEvent 등)으로")]
|
||||
[SerializeField] private List<ItemData> _initialItems = new();
|
||||
"실제 게임에서의 획득은 AddEvidence(터치존·버튼 UnityEvent 등)으로")]
|
||||
[SerializeField] private List<EvidenceData> _initialItems = new();
|
||||
|
||||
[Tooltip("플레이 시작 시 열려 있을 인물 정보 — 위 소지품과 동작은 같다")]
|
||||
[SerializeField] private List<EvidenceData> _initialProfiles = new();
|
||||
|
||||
private StoryState _state = new();
|
||||
|
||||
@@ -47,10 +52,9 @@ private void Awake()
|
||||
if (init.Character != null)
|
||||
_state.Affection[IdOf(init.Character)] = init.Amount;
|
||||
|
||||
// 테스트용 초기 소지 아이템
|
||||
foreach (var item in _initialItems)
|
||||
if (item != null && !_state.Items.Contains(ItemIdOf(item)))
|
||||
_state.Items.Add(ItemIdOf(item));
|
||||
// 테스트용 초기 소지 증거품 항목 (두 목록 모두 같은 획득 이력으로 들어간다)
|
||||
AddInitialEvidence(_initialItems);
|
||||
AddInitialEvidence(_initialProfiles);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -58,6 +62,13 @@ private void Awake()
|
||||
}
|
||||
}
|
||||
|
||||
private void AddInitialEvidence(List<EvidenceData> list)
|
||||
{
|
||||
foreach (var entry in list)
|
||||
if (entry != null && !_state.Evidence.Contains(EvidenceIdOf(entry)))
|
||||
_state.Evidence.Add(EvidenceIdOf(entry));
|
||||
}
|
||||
|
||||
// ── 메인 진행도 ──────────────────────────────────────────────
|
||||
public int MainProgress
|
||||
{
|
||||
@@ -110,29 +121,29 @@ public void SetTrigger(string id)
|
||||
Changed?.Invoke();
|
||||
}
|
||||
|
||||
// ── 아이템(증거품) ───────────────────────────────────────────
|
||||
public IReadOnlyList<string> ItemIds => _state.Items;
|
||||
// ── 증거품 (소지품 · 인물) ───────────────────────────────────
|
||||
public IReadOnlyList<string> EvidenceIds => _state.Evidence;
|
||||
|
||||
public bool HasItem(ItemData item) => item != null && _state.Items.Contains(ItemIdOf(item));
|
||||
public bool HasEvidence(EvidenceData entry) => entry != null && _state.Evidence.Contains(EvidenceIdOf(entry));
|
||||
|
||||
// UnityEvent 연결용 (대화 터치존·월드 버튼 등에서 증거품 획득). 중복 획득은 무시된다.
|
||||
public void AddItem(ItemData item)
|
||||
// UnityEvent 연결용 (대화 터치존·월드 버튼 등에서 증거품 항목 획득). 중복 획득은 무시된다.
|
||||
public void AddEvidence(EvidenceData entry)
|
||||
{
|
||||
if (item == null) return;
|
||||
string id = ItemIdOf(item);
|
||||
if (_state.Items.Contains(id)) return;
|
||||
_state.Items.Add(id);
|
||||
if (entry == null) return;
|
||||
string id = EvidenceIdOf(entry);
|
||||
if (_state.Evidence.Contains(id)) return;
|
||||
_state.Evidence.Add(id);
|
||||
Changed?.Invoke();
|
||||
}
|
||||
|
||||
public void RemoveItem(ItemData item)
|
||||
public void RemoveEvidence(EvidenceData entry)
|
||||
{
|
||||
if (item == null || !_state.Items.Remove(ItemIdOf(item))) return;
|
||||
if (entry == null || !_state.Evidence.Remove(EvidenceIdOf(entry))) return;
|
||||
Changed?.Invoke();
|
||||
}
|
||||
|
||||
// ItemData의 Id를 키로 사용 (비어있으면 에셋 이름) — 캐릭터 IdOf와 같은 규칙
|
||||
private static string ItemIdOf(ItemData i) => string.IsNullOrEmpty(i.Id) ? i.name : i.Id;
|
||||
// EvidenceData의 Id를 키로 사용 (비어있으면 에셋 이름) — 캐릭터 IdOf와 같은 규칙
|
||||
private static string EvidenceIdOf(EvidenceData e) => string.IsNullOrEmpty(e.Id) ? e.name : e.Id;
|
||||
|
||||
// ── 선택 이력 ────────────────────────────────────────────────
|
||||
public bool HasChosen(string code) => _state.ChosenCodes.Contains(code);
|
||||
|
||||
Reference in New Issue
Block a user