// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using System; namespace PixelCrushers.QuestMachine { /// /// References a literal value or quest counter value. /// [Serializable] public class QuestNumber { public enum ValueType { Literal, CounterValue, CounterMinValue, CounterMaxValue } [Tooltip("The source of this number's value.")] [SerializeField] private ValueType m_valueType = ValueType.Literal; [Tooltip("Literal value.")] [SerializeField] private int m_literalValue; [Tooltip("A counter defined in the quest. Inspect the quest's main info to view/edit counters.")] [SerializeField] private int m_counterIndex; /// /// The source of this number's value. /// public ValueType valueType { get { return m_valueType; } set { m_valueType = value; } } /// /// Literal value. /// public int literalValue { get { return m_literalValue; } set { m_literalValue = value; } } /// /// A counter defined in the quest. /// public int counterIndex { get { return m_counterIndex; } set { m_counterIndex = value; } } /// /// Returns the current value of this quest number. /// /// The quest to which this quest number pertains. public int GetValue(Quest quest) { switch (valueType) { default: return literalValue; case ValueType.CounterValue: case ValueType.CounterMinValue: case ValueType.CounterMaxValue: if (quest == null) { if (Debug.isDebugBuild) Debug.LogWarning("Quest Machine: Want to get value of counter at index " + counterIndex + " but quest is null."); return 0; } var counter = quest.GetCounter(counterIndex); if (counter == null) { if (Debug.isDebugBuild) Debug.LogWarning("Quest Machine: There is no counter at index " + counterIndex + "' in quest '" + quest.GetEditorName() + ".", quest); return 0; } switch (valueType) { default: case ValueType.CounterValue: return counter.currentValue; case ValueType.CounterMinValue: return counter.minValue; case ValueType.CounterMaxValue: return counter.maxValue; } } } public QuestNumber() { } /// /// Creates a quest number corresponding to a literal integer value. /// /// public QuestNumber(int literalValue) { m_valueType = ValueType.Literal; m_literalValue = literalValue; } /// /// Creates a quest number corresponding to the current counter value of a quest counter. /// /// Quest containing the counter. /// Name of the counter. public QuestNumber(Quest quest, string counterName) { m_valueType = ValueType.CounterValue; m_counterIndex = (quest != null) ? quest.GetCounterIndex(counterName) : -1; } /// /// Creates a quest number corresponding to a specified type of value of a quest counter. /// /// Quest containing the counter. /// Name of the counter. /// The value type (current, min, or max). public QuestNumber(Quest quest, StringField counterName, ValueType valueType) { m_valueType = valueType; m_counterIndex = (quest != null) ? quest.GetCounterIndex(counterName) : -1; } public string GetEditorName(Quest quest) { if (valueType == ValueType.Literal) return literalValue.ToString(); var counter = (quest != null) ? quest.GetCounter(counterIndex) : null; var counterName = (counter != null) ? StringField.GetStringValue(counter.name) : ("counter #" + counterIndex); switch (valueType) { default: case ValueType.CounterValue: return counterName; case ValueType.CounterMinValue: return counterName + " Min Value"; case ValueType.CounterMaxValue: return counterName + " Max Value"; } } } }