From d72f92b9595b392da5c6a468dde2021600bfad83 Mon Sep 17 00:00:00 2001 From: chrisgregan Date: Mon, 19 Jan 2015 22:24:10 +0000 Subject: [PATCH] Changes to make it easier to add new conditional commands --- .../Scripts/Commands/Condition.cs | 52 +++++ .../Scripts/Commands/Condition.cs.meta | 8 + .../FungusScript/Scripts/Commands/If.cs | 208 ++++++------------ .../Scripts/VariableTypes/BooleanVariable.cs | 24 +- .../Scripts/VariableTypes/FloatVariable.cs | 34 ++- .../Scripts/VariableTypes/IntegerVariable.cs | 34 ++- .../Scripts/VariableTypes/StringVariable.cs | 23 +- 7 files changed, 234 insertions(+), 149 deletions(-) create mode 100644 Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs create mode 100644 Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs.meta diff --git a/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs b/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs new file mode 100644 index 00000000..98607903 --- /dev/null +++ b/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs @@ -0,0 +1,52 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +namespace Fungus +{ + public enum CompareOperator + { + Equals, // == + NotEquals, // != + LessThan, // < + GreaterThan, // > + LessThanOrEquals, // <= + GreaterThanOrEquals // >= + } + + [AddComponentMenu("")] + public abstract class Condition : Command + { + [Tooltip("The type of comparison to be performed")] + public CompareOperator compareOperator; + + public static string GetOperatorDescription(CompareOperator compareOperator) + { + string summary = ""; + switch (compareOperator) + { + case CompareOperator.Equals: + summary += "=="; + break; + case CompareOperator.NotEquals: + summary += "!="; + break; + case CompareOperator.LessThan: + summary += "<"; + break; + case CompareOperator.GreaterThan: + summary += ">"; + break; + case CompareOperator.LessThanOrEquals: + summary += "<="; + break; + case CompareOperator.GreaterThanOrEquals: + summary += ">="; + break; + } + + return summary; + } + } + +} \ No newline at end of file diff --git a/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs.meta b/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs.meta new file mode 100644 index 00000000..1a3eefda --- /dev/null +++ b/Assets/Fungus/FungusScript/Scripts/Commands/Condition.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5a19bbd99c314af6aa3f3319ca323b2 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Fungus/FungusScript/Scripts/Commands/If.cs b/Assets/Fungus/FungusScript/Scripts/Commands/If.cs index 1c043cff..a533edc9 100644 --- a/Assets/Fungus/FungusScript/Scripts/Commands/If.cs +++ b/Assets/Fungus/FungusScript/Scripts/Commands/If.cs @@ -4,21 +4,12 @@ using System.Collections.Generic; namespace Fungus { - public enum CompareOperator - { - Equals, // == - NotEquals, // != - LessThan, // < - GreaterThan, // > - LessThanOrEquals, // <= - GreaterThanOrEquals // >= - } [CommandInfo("Scripting", "If", "If the test expression is true, execute the following block of commands.")] [AddComponentMenu("")] - public class If : Command + public class If : Condition { [Tooltip("Variable to use in expression")] @@ -28,9 +19,6 @@ namespace Fungus typeof(StringVariable))] public Variable variable; - [Tooltip("The type of comparison to be performed")] - public CompareOperator compareOperator; - [Tooltip("Boolean value to compare against")] public BooleanData booleanData; @@ -50,143 +38,93 @@ namespace Fungus return; } - bool condition = false; - if (variable == null) { Continue(); return; } - if (variable.GetType() == typeof(BooleanVariable)) - { - bool lhs = (variable as BooleanVariable).value; - bool rhs = booleanData.Value; + EvaluateCondition(); + } - switch (compareOperator) - { - case CompareOperator.Equals: - condition = lhs == rhs; - break; - case CompareOperator.NotEquals: - default: - condition = lhs != rhs; - break; - } + protected void EvaluateCondition() + { + BooleanVariable booleanVariable = variable as BooleanVariable; + IntegerVariable integerVariable = variable as IntegerVariable; + FloatVariable floatVariable = variable as FloatVariable; + StringVariable stringVariable = variable as StringVariable; + + bool condition = false; + + if (booleanVariable != null) + { + condition = booleanVariable.Evaluate(compareOperator, booleanData.Value); } - else if (variable.GetType() == typeof(IntegerVariable)) + else if (integerVariable != null) { - int lhs = (variable as IntegerVariable).value; - int rhs = integerData.Value; - - switch (compareOperator) - { - case CompareOperator.Equals: - condition = lhs == rhs; - break; - case CompareOperator.NotEquals: - condition = lhs != rhs; - break; - case CompareOperator.LessThan: - condition = lhs < rhs; - break; - case CompareOperator.GreaterThan: - condition = lhs > rhs; - break; - case CompareOperator.LessThanOrEquals: - condition = lhs <= rhs; - break; - case CompareOperator.GreaterThanOrEquals: - condition = lhs >= rhs; - break; - } + condition = integerVariable.Evaluate(compareOperator, integerData.Value); } - else if (variable.GetType() == typeof(FloatVariable)) + else if (floatVariable != null) { - float lhs = (variable as FloatVariable).value; - float rhs = floatData.Value; - - switch (compareOperator) - { - case CompareOperator.Equals: - condition = lhs == rhs; - break; - case CompareOperator.NotEquals: - condition = lhs != rhs; - break; - case CompareOperator.LessThan: - condition = lhs < rhs; - break; - case CompareOperator.GreaterThan: - condition = lhs > rhs; - break; - case CompareOperator.LessThanOrEquals: - condition = lhs <= rhs; - break; - case CompareOperator.GreaterThanOrEquals: - condition = lhs >= rhs; - break; - } + condition = floatVariable.Evaluate(compareOperator, floatData.Value); } - else if (variable.GetType() == typeof(StringVariable)) + else if (stringVariable != null) { - string lhs = (variable as StringVariable).value; - string rhs = stringData.Value; - - switch (compareOperator) - { - case CompareOperator.Equals: - condition = lhs == rhs; - break; - case CompareOperator.NotEquals: - default: - condition = lhs != rhs; - break; - } + condition = stringVariable.Evaluate(compareOperator, stringData.Value); } if (condition) { - Continue(); + OnTrue(); } else { - // Find the next Else or EndIf command at the same indent level as this If command - for (int i = commandIndex + 1; i < parentSequence.commandList.Count; ++i) - { - Command nextCommand = parentSequence.commandList[i]; + OnFalse(); + } + } + + public void OnTrue() + { + Continue(); + } - // Find next command at same indent level as this If command - // Skip disabled commands & comments - if (!nextCommand.enabled || - nextCommand.GetType() == typeof(Comment) || - nextCommand.indentLevel != indentLevel) + public void OnFalse() + { + // Find the next Else or EndIf command at the same indent level as this If command + for (int i = commandIndex; i < parentSequence.commandList.Count; ++i) + { + Command nextCommand = parentSequence.commandList[i]; + + // Find next command at same indent level as this If command + // Skip disabled commands & comments + if (!nextCommand.enabled || + nextCommand.GetType() == typeof(Comment) || + nextCommand.indentLevel != indentLevel) + { + continue; + } + + System.Type type = nextCommand.GetType(); + if (type == typeof(Else) || + type == typeof(EndIf) || // Legacy support for old EndIf command + type == typeof(End)) + { + if (i >= parentSequence.commandList.Count - 1) { - continue; + // Last command in Sequence, so stop + Stop(); } - - System.Type type = nextCommand.GetType(); - if (type == typeof(Else) || - type == typeof(EndIf) || // Legacy support for old EndIf command - type == typeof(End)) + else { - if (i >= parentSequence.commandList.Count - 1) - { - // Last command in Sequence, so stop - Stop(); - } - else - { - // Execute command immediately after the Else or End command - Continue(nextCommand); - return; - } + // Execute command immediately after the Else or End command + Continue(nextCommand); + return; } } - - // No matching End command found, so just stop the sequence - Stop(); } + + // No matching End command found, so just stop the sequence + Stop(); } public override string GetSummary() @@ -196,28 +134,8 @@ namespace Fungus return "Error: No variable selected"; } - string summary = variable.key; - switch (compareOperator) - { - case CompareOperator.Equals: - summary += " == "; - break; - case CompareOperator.NotEquals: - summary += " != "; - break; - case CompareOperator.LessThan: - summary += " < "; - break; - case CompareOperator.GreaterThan: - summary += " > "; - break; - case CompareOperator.LessThanOrEquals: - summary += " <= "; - break; - case CompareOperator.GreaterThanOrEquals: - summary += " >= "; - break; - } + string summary = variable.key + " "; + summary += Condition.GetOperatorDescription(compareOperator) + " "; if (variable.GetType() == typeof(BooleanVariable)) { diff --git a/Assets/Fungus/FungusScript/Scripts/VariableTypes/BooleanVariable.cs b/Assets/Fungus/FungusScript/Scripts/VariableTypes/BooleanVariable.cs index 659c9c69..e8ff1ea7 100644 --- a/Assets/Fungus/FungusScript/Scripts/VariableTypes/BooleanVariable.cs +++ b/Assets/Fungus/FungusScript/Scripts/VariableTypes/BooleanVariable.cs @@ -8,7 +8,29 @@ namespace Fungus [VariableInfo("", "Boolean")] [AddComponentMenu("")] public class BooleanVariable : VariableBase - {} + { + public virtual bool Evaluate(CompareOperator compareOperator, bool booleanValue) + { + bool condition = false; + + bool lhs = value; + bool rhs = booleanValue; + + switch (compareOperator) + { + case CompareOperator.Equals: + condition = lhs == rhs; + break; + case CompareOperator.NotEquals: + default: + condition = lhs != rhs; + break; + } + + return condition; + } + + } [System.Serializable] public struct BooleanData diff --git a/Assets/Fungus/FungusScript/Scripts/VariableTypes/FloatVariable.cs b/Assets/Fungus/FungusScript/Scripts/VariableTypes/FloatVariable.cs index 879915a6..c50df12e 100644 --- a/Assets/Fungus/FungusScript/Scripts/VariableTypes/FloatVariable.cs +++ b/Assets/Fungus/FungusScript/Scripts/VariableTypes/FloatVariable.cs @@ -6,7 +6,39 @@ namespace Fungus [VariableInfo("", "Float")] [AddComponentMenu("")] public class FloatVariable : VariableBase - {} + { + public virtual bool Evaluate(CompareOperator compareOperator, float floatValue) + { + float lhs = value; + float rhs = floatValue; + + bool condition = false; + + switch (compareOperator) + { + case CompareOperator.Equals: + condition = lhs == rhs; + break; + case CompareOperator.NotEquals: + condition = lhs != rhs; + break; + case CompareOperator.LessThan: + condition = lhs < rhs; + break; + case CompareOperator.GreaterThan: + condition = lhs > rhs; + break; + case CompareOperator.LessThanOrEquals: + condition = lhs <= rhs; + break; + case CompareOperator.GreaterThanOrEquals: + condition = lhs >= rhs; + break; + } + + return condition; + } + } [System.Serializable] public struct FloatData diff --git a/Assets/Fungus/FungusScript/Scripts/VariableTypes/IntegerVariable.cs b/Assets/Fungus/FungusScript/Scripts/VariableTypes/IntegerVariable.cs index 1d2b9a11..a490214b 100644 --- a/Assets/Fungus/FungusScript/Scripts/VariableTypes/IntegerVariable.cs +++ b/Assets/Fungus/FungusScript/Scripts/VariableTypes/IntegerVariable.cs @@ -6,7 +6,39 @@ namespace Fungus [VariableInfo("", "Integer")] [AddComponentMenu("")] public class IntegerVariable : VariableBase - {} + { + public virtual bool Evaluate(CompareOperator compareOperator, int integerValue) + { + int lhs = value; + int rhs = integerValue; + + bool condition = false; + + switch (compareOperator) + { + case CompareOperator.Equals: + condition = lhs == rhs; + break; + case CompareOperator.NotEquals: + condition = lhs != rhs; + break; + case CompareOperator.LessThan: + condition = lhs < rhs; + break; + case CompareOperator.GreaterThan: + condition = lhs > rhs; + break; + case CompareOperator.LessThanOrEquals: + condition = lhs <= rhs; + break; + case CompareOperator.GreaterThanOrEquals: + condition = lhs >= rhs; + break; + } + + return condition; + } + } [System.Serializable] public struct IntegerData diff --git a/Assets/Fungus/FungusScript/Scripts/VariableTypes/StringVariable.cs b/Assets/Fungus/FungusScript/Scripts/VariableTypes/StringVariable.cs index 08e7f907..321adbe8 100644 --- a/Assets/Fungus/FungusScript/Scripts/VariableTypes/StringVariable.cs +++ b/Assets/Fungus/FungusScript/Scripts/VariableTypes/StringVariable.cs @@ -7,7 +7,28 @@ namespace Fungus [VariableInfo("", "String")] [AddComponentMenu("")] public class StringVariable : VariableBase - {} + { + public virtual bool Evaluate(CompareOperator compareOperator, string stringValue) + { + string lhs = value; + string rhs = stringValue; + + bool condition = false; + + switch (compareOperator) + { + case CompareOperator.Equals: + condition = lhs == rhs; + break; + case CompareOperator.NotEquals: + default: + condition = lhs != rhs; + break; + } + + return condition; + } + } [System.Serializable] public struct StringData