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
|
|||
|
|
? "Статус: пройдите к выходу"
|
|||
|
|
: "Статус: исследуйте уровень");
|
|||
|
|
}
|
|||
|
|
}
|