// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; namespace PixelCrushers.DialogueSystem { /// /// Lua watch frequencies. /// public enum LuaWatchFrequency { /// /// Check every frame that Lua code was run. /// EveryUpdate, /// /// Check every time an actor speaks a DialogueEntry in a conversation. /// EveryDialogueEntry, /// /// Check at the end of conversations. /// EndOfConversation }; /// /// This class maintains a list of watchers by watch frequency. /// public class LuaWatchers { private LuaWatchList m_everyUpdateList = new LuaWatchList(); private LuaWatchList m_everyDialogueEntryList = new LuaWatchList(); private LuaWatchList m_endOfConversationList = new LuaWatchList(); /// /// Adds a Lua observer. /// /// /// Lua expression to observe. /// /// /// Frequency to check. /// /// /// Delegate to call when the expression changes. /// public void AddObserver(string luaExpression, LuaWatchFrequency frequency, LuaChangedDelegate luaChangedHandler) { switch (frequency) { case LuaWatchFrequency.EveryUpdate: m_everyUpdateList.AddObserver(luaExpression, luaChangedHandler); break; case LuaWatchFrequency.EveryDialogueEntry: m_everyDialogueEntryList.AddObserver(luaExpression, luaChangedHandler); break; case LuaWatchFrequency.EndOfConversation: m_endOfConversationList.AddObserver(luaExpression, luaChangedHandler); break; default: Debug.LogError("Dialogue System: Internal error - unexpected Lua watch frequency " + frequency); break; } } /// /// Removes a Lua observer. /// /// /// Lua expression. /// /// /// Frequency. /// /// /// Lua changed handler. /// public void RemoveObserver(string luaExpression, LuaWatchFrequency frequency, LuaChangedDelegate luaChangedHandler) { switch (frequency) { case LuaWatchFrequency.EveryUpdate: m_everyUpdateList.RemoveObserver(luaExpression, luaChangedHandler); break; case LuaWatchFrequency.EveryDialogueEntry: m_everyDialogueEntryList.RemoveObserver(luaExpression, luaChangedHandler); break; case LuaWatchFrequency.EndOfConversation: m_endOfConversationList.RemoveObserver(luaExpression, luaChangedHandler); break; default: Debug.LogError("Dialogue System: Internal error - unexpected Lua watch frequency " + frequency); break; } } /// /// Removes all Lua observers for a specified frequency. /// /// /// Frequency. /// public void RemoveAllObservers(LuaWatchFrequency frequency) { switch (frequency) { case LuaWatchFrequency.EveryUpdate: m_everyUpdateList.RemoveAllObservers(); break; case LuaWatchFrequency.EveryDialogueEntry: m_everyDialogueEntryList.RemoveAllObservers(); break; case LuaWatchFrequency.EndOfConversation: m_endOfConversationList.RemoveAllObservers(); break; default: Debug.LogError("Dialogue System: Internal error - unexpected Lua watch frequency " + frequency); break; } } /// /// Removes all Lua observers. /// public void RemoveAllObservers() { m_everyUpdateList.RemoveAllObservers(); m_everyDialogueEntryList.RemoveAllObservers(); m_endOfConversationList.RemoveAllObservers(); } /// /// Checks the observers for a specified frequency. /// /// /// Frequency. /// public void NotifyObservers(LuaWatchFrequency frequency) { switch (frequency) { case LuaWatchFrequency.EveryUpdate: m_everyUpdateList.NotifyObservers(); break; case LuaWatchFrequency.EveryDialogueEntry: m_everyDialogueEntryList.NotifyObservers(); break; case LuaWatchFrequency.EndOfConversation: m_endOfConversationList.NotifyObservers(); break; default: Debug.LogError("Dialogue System: Internal error - unexpected Lua watch frequency " + frequency); break; } } } }