// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). // It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) using System.Collections.Generic; using UnityEngine; namespace Fungus { /// /// Serializable container for a string variable. /// [System.Serializable] public class StringVar { [SerializeField] protected string key; [SerializeField] protected string value; #region Public methods public string Key { get { return key; } set { key = value; } } public string Value { get { return value; } set { this.value = value; } } #endregion } /// /// Serializable container for an integer variable. /// [System.Serializable] public class IntVar { [SerializeField] protected string key; [SerializeField] protected int value; #region Public methods public string Key { get { return key; } set { key = value; } } public int Value { get { return value; } set { this.value = value; } } #endregion } /// /// Serializable container for a float variable. /// [System.Serializable] public class FloatVar { [SerializeField] protected string key; [SerializeField] protected float value; #region Public methods public string Key { get { return key; } set { key = value; } } public float Value { get { return value; } set { this.value = value; } } #endregion } /// /// Serializable container for a boolean variable. /// [System.Serializable] public class BoolVar { [SerializeField] protected string key; [SerializeField] protected bool value; #region Public methods public string Key { get { return key; } set { key = value; } } public bool Value { get { return value; } set { this.value = value; } } #endregion } /// /// Serializable container for encoding the state of a Flowchart's variables. /// [System.Serializable] public class FlowchartData { [SerializeField] protected string flowchartName; [SerializeField] protected List stringVars = new List(); [SerializeField] protected List intVars = new List(); [SerializeField] protected List floatVars = new List(); [SerializeField] protected List boolVars = new List(); #region Public methods /// /// Gets or sets the name of the encoded Flowchart. /// public string FlowchartName { get { return flowchartName; } set { flowchartName = value; } } /// /// Gets or sets the list of encoded string variables. /// public List StringVars { get { return stringVars; } set { stringVars = value; } } /// /// Gets or sets the list of encoded integer variables. /// public List IntVars { get { return intVars; } set { intVars = value; } } /// /// Gets or sets the list of encoded float variables. /// public List FloatVars { get { return floatVars; } set { floatVars = value; } } /// /// Gets or sets the list of encoded boolean variables. /// public List BoolVars { get { return boolVars; } set { boolVars = value; } } /// /// Encodes the data in a Flowchart into a structure that can be stored by the save system. /// public static FlowchartData Encode(Flowchart flowchart) { var flowchartData = new FlowchartData(); flowchartData.FlowchartName = flowchart.name; for (int i = 0; i < flowchart.Variables.Count; i++) { var v = flowchart.Variables[i]; // Save string var stringVariable = v as StringVariable; if (stringVariable != null) { var d = new StringVar(); d.Key = stringVariable.Key; d.Value = stringVariable.Value; flowchartData.StringVars.Add(d); } // Save int var intVariable = v as IntegerVariable; if (intVariable != null) { var d = new IntVar(); d.Key = intVariable.Key; d.Value = intVariable.Value; flowchartData.IntVars.Add(d); } // Save float var floatVariable = v as FloatVariable; if (floatVariable != null) { var d = new FloatVar(); d.Key = floatVariable.Key; d.Value = floatVariable.Value; flowchartData.FloatVars.Add(d); } // Save bool var boolVariable = v as BooleanVariable; if (boolVariable != null) { var d = new BoolVar(); d.Key = boolVariable.Key; d.Value = boolVariable.Value; flowchartData.BoolVars.Add(d); } } return flowchartData; } /// /// Decodes a FlowchartData object and uses it to restore the state of a Flowchart in the scene. /// public static void Decode(FlowchartData flowchartData) { var go = GameObject.Find(flowchartData.FlowchartName); if (go == null) { Debug.LogError("Failed to find flowchart object specified in save data"); return; } var flowchart = go.GetComponent(); if (flowchart == null) { Debug.LogError("Failed to find flowchart object specified in save data"); return; } for (int i = 0; i < flowchartData.BoolVars.Count; i++) { var boolVar = flowchartData.BoolVars[i]; flowchart.SetBooleanVariable(boolVar.Key, boolVar.Value); } for (int i = 0; i < flowchartData.IntVars.Count; i++) { var intVar = flowchartData.IntVars[i]; flowchart.SetIntegerVariable(intVar.Key, intVar.Value); } for (int i = 0; i < flowchartData.FloatVars.Count; i++) { var floatVar = flowchartData.FloatVars[i]; flowchart.SetFloatVariable(floatVar.Key, floatVar.Value); } for (int i = 0; i < flowchartData.StringVars.Count; i++) { var stringVar = flowchartData.StringVars[i]; flowchart.SetStringVariable(stringVar.Key, stringVar.Value); } } #endregion } }