first commit
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
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
|
||||
? "Статус: пройдите к выходу"
|
||||
: "Статус: исследуйте уровень");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user