187 lines
4.6 KiB
C#
187 lines
4.6 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class QuestManager : MonoBehaviour
|
||
{
|
||
private const string LevelCompletePanelKey = "LevelComplete";
|
||
|
||
public static QuestManager Instance { get; private set; }
|
||
|
||
[SerializeField] private int totalNotes = 3;
|
||
[SerializeField] private Text statusText;
|
||
[SerializeField] private GameObject questCompletePanel;
|
||
[SerializeField] private Text questCompleteText;
|
||
[SerializeField] private GameObject exitDoor;
|
||
[SerializeField] private GameObject exitTrigger;
|
||
[SerializeField] private GameObject levelCompletePanel;
|
||
[SerializeField] private Text levelCompleteText;
|
||
|
||
private int notesCollected;
|
||
private bool talkedToNPC;
|
||
private bool questCompleted;
|
||
private bool levelFinished;
|
||
|
||
public int TotalNotes => totalNotes;
|
||
public int NotesCollected => notesCollected;
|
||
public bool TalkedToNPC => talkedToNPC;
|
||
public bool IsQuestCompleted => questCompleted;
|
||
public bool HasCollectedAllNotes => notesCollected >= totalNotes;
|
||
public bool IsLevelFinished => levelFinished;
|
||
|
||
public void Configure(
|
||
Text statusLabel,
|
||
GameObject completionPanel,
|
||
Text completionLabel,
|
||
GameObject doorObject,
|
||
GameObject exitTriggerObject,
|
||
GameObject levelFinishedPanel,
|
||
Text levelFinishedLabel,
|
||
int requiredNotes)
|
||
{
|
||
statusText = statusLabel;
|
||
questCompletePanel = completionPanel;
|
||
questCompleteText = completionLabel;
|
||
exitDoor = doorObject;
|
||
exitTrigger = exitTriggerObject;
|
||
levelCompletePanel = levelFinishedPanel;
|
||
levelCompleteText = levelFinishedLabel;
|
||
totalNotes = Mathf.Max(1, requiredNotes);
|
||
|
||
if (questCompletePanel != null)
|
||
{
|
||
questCompletePanel.SetActive(false);
|
||
}
|
||
|
||
if (exitTrigger != null)
|
||
{
|
||
exitTrigger.SetActive(false);
|
||
}
|
||
|
||
if (levelCompletePanel != null)
|
||
{
|
||
levelCompletePanel.SetActive(false);
|
||
}
|
||
|
||
UpdateStatus();
|
||
}
|
||
|
||
private void Awake()
|
||
{
|
||
if (Instance != null && Instance != this)
|
||
{
|
||
Destroy(gameObject);
|
||
return;
|
||
}
|
||
|
||
Instance = this;
|
||
|
||
if (questCompletePanel != null)
|
||
{
|
||
questCompletePanel.SetActive(false);
|
||
}
|
||
|
||
if (exitTrigger != null)
|
||
{
|
||
exitTrigger.SetActive(false);
|
||
}
|
||
|
||
if (levelCompletePanel != null)
|
||
{
|
||
levelCompletePanel.SetActive(false);
|
||
}
|
||
|
||
UpdateStatus();
|
||
}
|
||
|
||
public void NoteCollected()
|
||
{
|
||
notesCollected = Mathf.Min(notesCollected + 1, totalNotes);
|
||
UpdateStatus();
|
||
CheckCompletion();
|
||
}
|
||
|
||
public void NPCTalked()
|
||
{
|
||
if (talkedToNPC)
|
||
{
|
||
return;
|
||
}
|
||
|
||
talkedToNPC = true;
|
||
UpdateStatus();
|
||
CheckCompletion();
|
||
}
|
||
|
||
public void FinishLevel()
|
||
{
|
||
if (!questCompleted || levelFinished)
|
||
{
|
||
return;
|
||
}
|
||
|
||
levelFinished = true;
|
||
|
||
if (levelCompletePanel != null)
|
||
{
|
||
levelCompletePanel.SetActive(true);
|
||
}
|
||
|
||
if (levelCompleteText != null)
|
||
{
|
||
levelCompleteText.text = "Уровень завершен!\nЛабораторная работа пройдена.";
|
||
}
|
||
|
||
GameUIState.SetPanelOpen(LevelCompletePanelKey, true);
|
||
UpdateStatus();
|
||
}
|
||
|
||
private void CheckCompletion()
|
||
{
|
||
if (questCompleted || notesCollected < totalNotes || !talkedToNPC)
|
||
{
|
||
return;
|
||
}
|
||
|
||
questCompleted = true;
|
||
|
||
if (exitDoor != null)
|
||
{
|
||
exitDoor.SetActive(false);
|
||
}
|
||
|
||
if (exitTrigger != null)
|
||
{
|
||
exitTrigger.SetActive(true);
|
||
}
|
||
|
||
if (questCompletePanel != null)
|
||
{
|
||
questCompletePanel.SetActive(true);
|
||
}
|
||
|
||
if (questCompleteText != null)
|
||
{
|
||
questCompleteText.text = "Квест выполнен!\nВыход открыт.";
|
||
}
|
||
|
||
UpdateStatus();
|
||
}
|
||
|
||
private void UpdateStatus()
|
||
{
|
||
if (statusText == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
statusText.text =
|
||
$"Записки: {notesCollected}/{totalNotes}\n" +
|
||
$"Диалог с NPC: {(talkedToNPC ? "✓" : "✗")}\n" +
|
||
(levelFinished
|
||
? "Статус: уровень завершен"
|
||
: questCompleted
|
||
? "Статус: пройдите к выходу"
|
||
: "Статус: исследуйте уровень");
|
||
}
|
||
}
|