Files
PIM_Laba4/Assets/Scripts/QuestManager.cs
T
2026-05-25 23:53:50 +03:00

187 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
? "Статус: пройдите к выходу"
: "Статус: исследуйте уровень");
}
}