Files

187 lines
4.6 KiB
C#
Raw Permalink Normal View History

2026-05-25 23:53:50 +03:00
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
? "Статус: пройдите к выходу"
: "Статус: исследуйте уровень");
}
}