// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using System.Collections.Generic; namespace PixelCrushers.QuestMachine { /// /// Quest Machine-specific messages used with the MessageSystem. /// public static class QuestMachineMessages { #region Messages /// /// Sent when a quest state or quest node state changes. /// - Parameter: Quest ID. /// - Argument 0: [StringField] Quest node ID, or null for main quest state. /// - Argument 1: [QuestState] / [QuestNodeState] New state. /// public const string QuestStateChangedMessage = "Quest State Changed"; /// /// Sent when a quest's track toggle changes (i.e., turn progress tracking on or off). /// - Parameter: Quest ID. /// - Argument 0: [bool] New track state. /// public const string QuestTrackToggleChangedMessage = "Quest Track Toggle Changed"; /// /// Sent when a quest state is abandoned. /// - Parameter: Quest ID. /// public const string QuestAbandonedMessage = "Quest Abandoned"; /// /// Sent to tell a quest to re-check its offer conditions in case /// the quest is no longer offerable. /// - Parameter: Quest ID. /// public const string CheckOfferConditionsMessage = "Check Offer Conditions"; /// /// Sent when a quest's counter changes value. /// - Parameter: Quest ID. /// - Argument 0: [StringField] Counter name. /// - Argument 1: [int] New value. /// public const string QuestCounterChangedMessage = "Quest Counter Changed"; /// /// Sent to tell a counter to set its value. /// - Parameter: Quest ID. /// - Argument 0: Counter name. /// - Argument 1: [int] New value. /// public const string SetQuestCounterMessage = "Set Quest Counter"; /// /// Sent every second if a timer condition is active. /// public const string TimerTickMessage = "Timer Tick"; /// /// Sent to tell a counter to increment its value. /// - Parameter: Quest ID. /// - Argument 1: [StringField] Counter name. /// - Argument 0: [int] Amount to increment (or decrement if negative). /// public const string IncrementQuestCounterMessage = "Increment Quest Counter"; /// /// Sent to set an entity's quest indicator state. /// - Target: Entity ID. /// - Parameter: Quest ID. /// - Argument 0: [QuestIndicatorState] State. /// public const string SetIndicatorStateMessage = "Set Indicator State"; /// /// Sent to tell an entity to refresh its indicator by checking all quests. /// - Target: Entity ID, or blank for all entities with QuestIndicatorManagers. /// - Parameter: Entity ID, or blank for all. /// public const string RefreshIndicatorMessage = "Refresh Indicator"; /// /// Send to tell all UIs to refresh, typically after loading a saved game. /// public const string RefreshUIsMessage = "Refresh UIs"; /// /// Sent when an alert message is raised. /// - Parameter: Quest ID. /// - Argument 0: List of QuestUIContent items. /// public const string QuestAlertMessage = "Quest Alert"; /// /// Sent just prior to starting dialogue with a QuestGiver. /// - Target: QuestGiver being greeted. /// - Parameter: [StringField] QuestGiver's ID. /// public const string GreetMessage = "Greet"; /// /// Sent just after starting dialogue with a QuestGiver. /// - Target: QuestGiver being greeted. /// - Parameter: [StringField] QuestGiver's ID. /// public const string GreetedMessage = "Greeted"; /// /// Sent just prior to starting a dialogue about a specific quest. /// - Target: QuestGiver being talked to. /// - Parameter: [StringField] Quest ID. /// - Argument 0: [string] QuestGiver's ID. /// public const string DiscussQuestMessage = "Discuss Quest"; /// /// Sent just after starting a dialogue about a specific quest. /// - Target: QuestGiver being talked to. /// - Parameter: [StringField] Quest ID. /// - Argument 0: [string] QuestGiver's ID. /// public const string DiscussedQuestMessage = "Discussed Quest"; /// /// Send to start a spawner. /// - Parameter: [StringField/string] Spawner name. /// public const string StartSpawnerMessage = "Start Spawner"; /// /// Send to stop a spawner. /// - Parameter: [StringField/string] Spawner name. /// public const string StopSpawnerMessage = "Stop Spawner"; /// /// Send to stop a spawner and tell it to despawn all spawned objects. /// - Parameter: [StringField/string] Spawner name. /// public const string DespawnSpawnerMessage = "Despawn Spawner"; /// /// Argument 0: [int] Group number. /// public const string GroupButtonClickedMessage = "Group Button Clicked"; #endregion #region Utility Methods public static void QuestStateChanged(object sender, StringField questID, QuestState state) { MessageSystem.SendMessage(sender, QuestStateChangedMessage, questID, null, state); } public static void QuestNodeStateChanged(object sender, StringField questID, StringField questNodeID, QuestNodeState state) { MessageSystem.SendMessage(sender, QuestStateChangedMessage, questID, questNodeID, state); } public static void QuestTrackToggleChanged(object sender, StringField questID, bool state) { MessageSystem.SendMessage(sender, QuestTrackToggleChangedMessage, questID, state); } public static void QuestAbandoned(object sender, StringField questID) { MessageSystem.SendMessage(sender, QuestAbandonedMessage, questID); } public static void QuestCounterChanged(object sender, StringField questID, StringField counterName, int counterValue) { MessageSystem.SendMessage(sender, QuestCounterChangedMessage, questID, counterName, counterValue); } public static void SetQuestCounter(object sender, StringField questID, StringField counterName, int counterValue) { MessageSystem.SendMessage(sender, SetQuestCounterMessage, questID, counterName, counterValue); } public static void IncrementQuestCounter(object sender, StringField questID, StringField counterName, int amount) { MessageSystem.SendMessage(sender, IncrementQuestCounterMessage, questID, counterName, amount); } public static void SetIndicatorState(object sender, StringField entityID, StringField questID, QuestIndicatorState state) { MessageSystem.SendMessageWithTarget(sender, entityID, SetIndicatorStateMessage, questID, state); } public static void RefreshIndicator(object sender, StringField entityID) { MessageSystem.SendMessageWithTarget(sender, entityID, RefreshIndicatorMessage, entityID); } public static void RefreshIndicators(object sender) { RefreshIndicator(sender, null); } public static void RefreshUIs(object sender) { MessageSystem.SendMessage(sender, RefreshUIsMessage, string.Empty); } public static void QuestAlert(object sender, StringField questID, List contents) { MessageSystem.SendMessage(sender, QuestAlertMessage, questID, contents); } public static void Greet(object sender, object target, StringField targetID) { MessageSystem.SendMessageWithTarget(sender, target, GreetMessage, targetID); } public static void Greeted(object sender, object target, StringField targetID) { MessageSystem.SendMessageWithTarget(sender, target, GreetedMessage, targetID); } public static void DiscussQuest(object sender, object target, StringField targetID, StringField questID) { MessageSystem.SendMessageWithTarget(sender, target, DiscussQuestMessage, questID, targetID); } public static void DiscussedQuest(object sender, object target, StringField targetID, StringField questID) { MessageSystem.SendMessageWithTarget(sender, target, DiscussedQuestMessage, questID, targetID); } public static void StartSpawner(StringField spawnerName) { MessageSystem.SendMessage(QuestMachineConfiguration.instance, StartSpawnerMessage, spawnerName); } public static void StopSpawner(StringField spawnerName) { MessageSystem.SendMessage(QuestMachineConfiguration.instance, StopSpawnerMessage, spawnerName); } public static void DespawnSpawner(StringField spawnerName) { MessageSystem.SendMessage(QuestMachineConfiguration.instance, DespawnSpawnerMessage, spawnerName); } public static void SendCompositeMessage(object sender, string message) { if (string.IsNullOrEmpty(message)) return; if (QuestMachine.debug) Debug.Log("Quest Machine: Sending to Message System: '" + message, sender as UnityEngine.Object); MessageSystem.SendCompositeMessage(sender, message); } #endregion #region Parameters & IDs /// /// Gets the string value of a message argument. Some arguments such as quest node IDs can be /// passed as StringField or string. This utility method simplifies retrieval of the value. /// public static string ArgToString(object arg) { var argType = (arg != null) ? arg.GetType() : null; if (argType == typeof(StringField)) return StringField.GetStringValue(arg as StringField); if (argType == typeof(string)) return (string)arg; return (arg != null) ? arg.ToString() : string.Empty; } /// /// Gets the int value of a message argument. /// public static int ArgToInt(object arg) { return (arg != null && arg.GetType() == typeof(int)) ? (int)arg : -1; } public static bool IsRequiredID(object obj, string id) { return string.IsNullOrEmpty(id) || StringField.Equals(GetID(obj), id); } /// /// Gets the ID of an object. This is either a QuestGiver ID, QuestEntity ID, /// a string, or the default value. /// public static StringField GetID(object obj, StringField defaultID = null) { if (obj is GameObject) { var go = obj as GameObject; var questList = go.GetComponentInChildren(); if (questList != null) return questList.id; var entity = go.GetComponentInChildren(); if (entity != null) return entity.id; var idComponent = go.GetComponentInChildren(); if (idComponent != null) return idComponent.id; questList = go.GetComponentInParent(); if (questList != null) return questList.id; entity = go.GetComponentInParent(); if (entity != null) return entity.id; idComponent = go.GetComponentInParent(); if (idComponent != null) return idComponent.id; } else if (obj is IdentifiableQuestListContainer) { return (obj as IdentifiableQuestListContainer).id; } else if (obj is QuestEntity) { return (obj as QuestEntity).id; } else if (obj is IQuestMachineID) { return (obj as IQuestMachineID).id; } else if (obj is StringField) { return obj as StringField; } else if (obj != null && obj.GetType() == typeof(string)) { return (new StringField((string)obj)); } return defaultID; } /// /// Gets the display name of an object. This is either a QuestEntity ID, a string, /// or the default value. /// public static StringField GetDisplayName(object obj, StringField defaultDisplayName = null) { if (obj is GameObject) { var go = obj as GameObject; var questList = go.GetComponentInChildren(); if (questList != null) return questList.displayName; var entity = go.GetComponentInChildren(); if (entity != null) return entity.displayName; var idComponent = go.GetComponentInChildren(); if (idComponent != null) return idComponent.displayName; questList = go.GetComponentInParent(); if (questList != null) return questList.displayName; entity = go.GetComponentInParent(); if (entity != null) return entity.displayName; idComponent = go.GetComponentInParent(); if (idComponent != null) return idComponent.displayName; } else if (obj is IdentifiableQuestListContainer) { return (obj as IdentifiableQuestListContainer).displayName; } else if (obj is QuestEntity) { return (obj as QuestEntity).displayName; } else if (obj is IQuestMachineID) { return (obj as IQuestMachineID).displayName; } else if (obj is StringField) { return obj as StringField; } else if (obj != null && obj.GetType() == typeof(string)) { return (new StringField((string)obj)); } return defaultDisplayName; } /// /// Returns the GameObject with the specified ID, giving preference to quest list /// containers, then quest entities, and finally by GameObject name. /// /// ID to search for. public static GameObject FindGameObjectWithID(StringField id) { return StringField.IsNullOrEmpty(id) ? null : FindGameObjectWithID(id.value); } /// /// Returns the GameObject with the specified ID, giving preference to quest list /// containers, then quest entities, and finally by GameObject name. /// /// ID to search for. public static GameObject FindGameObjectWithID(string id) { // Try registered quest list containers first (quest givers, quest journal): var qlc = QuestMachine.GetQuestListContainer(id); if (qlc != null) return qlc.gameObject; //// Otherwise try entities: ////--- Replaced by IQuestMachineID below. //var entities = GameObject.FindObjectsOfType(); //for (int i = 0; i < entities.Length; i++) //{ // var entity = entities[i]; // if (string.Equals(entity.id, id)) return entity.gameObject; //} var monobehaviours = GameObject.FindObjectsOfType(); for (int i = 0; i < monobehaviours.Length; i++) { var identifiable = (monobehaviours[i] as IQuestMachineID); if (identifiable != null && string.Equals(identifiable.id, id)) return monobehaviours[i].gameObject; } // Otherwise search scene for GameObject name: return GameObject.Find(id); } #endregion } }