// This code is part of the Fungus library (https://github.com/snozbot/fungus) // It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) using System; using System.Collections.Generic; using UnityEngine; namespace Fungus { /// /// A single line of dialog /// [Serializable] public class Line { [SerializeField] public string name; [SerializeField] public string text; } /// /// Serializable object to store Narrative Lines /// [Serializable] public class NarrativeData { [SerializeField] public List lines; public NarrativeData() { lines = new List(); } } /// /// Controls dialog history /// public class NarrativeLog : MonoBehaviour { /// /// NarrativeAdded signal. Sent when a line is added. /// public static event NarrativeAddedHandler OnNarrativeAdded; public delegate void NarrativeAddedHandler(); public static void DoNarrativeAdded() { if (OnNarrativeAdded != null) OnNarrativeAdded(); } NarrativeData history; protected virtual void Awake() { history = new NarrativeData(); } protected virtual void OnEnable() { WriterSignals.OnWriterState += OnWriterState; } protected virtual void OnDisable() { WriterSignals.OnWriterState -= OnWriterState; } protected virtual void OnWriterState(Writer writer, WriterState writerState) { if (writerState == WriterState.End) { var sd = SayDialog.GetSayDialog(); var from = sd.NameText; var line = sd.StoryText; AddLine(from, line); } } #region Public Methods /// /// Add a line of dialog to the Narrative Log /// /// Character Name /// Narrative Text public void AddLine(string name, string text) { Line line = new Line(); line.name = name; line.text = text; history.lines.Add(line); DoNarrativeAdded(); } /// /// Clear all lines of the narrative log /// Usually used on restart /// public void Clear() { history.lines.Clear(); } /// /// Convert history into Json for saving in SaveData /// /// public string GetJsonHistory() { string jsonText = JsonUtility.ToJson(history, true); return jsonText; } /// /// Show previous lines for display purposes /// /// public string GetPrettyHistory(bool previousOnly = false) { string output = "\n "; int count; count = previousOnly ? history.lines.Count - 1: history.lines.Count; for (int i = 0; i < count; i++) { output += "" + history.lines[i].name + "\n"; output += history.lines[i].text + "\n\n"; } return output; } /// /// Load History from Json /// /// public void LoadHistory(string narrativeData) { if (narrativeData == null) { Debug.LogError("Failed to decode History save data item"); return; } history = JsonUtility.FromJson(narrativeData); } #endregion } }