From 25530ebbb31d421b8334babbc112d43e1ab3d6f9 Mon Sep 17 00:00:00 2001 From: LadyAliceMargatroid Date: Fri, 7 Feb 2025 08:29:24 -0800 Subject: [PATCH] DoorwayCleanup is now obselete Created new scripting system Added toggle for EventCallbackScenario for DevDebug window --- .../DunGenPlus/Components/DoorwayCleanup.cs | 1 + .../DCSConnectorBlockerSpawnedPrefab.cs | 2 + .../DCSRemoveDoorwayConnectedDoorway.cs | 5 +- .../DCSRemoveDoorwaySpawnedPrefab.cs | 2 + .../DCSRemoveGameObjectsConnectedDoorway.cs | 4 +- .../DoorwayCleanupScript.cs | 1 + .../DoorwayCleanupScriptDoorwayCompare.cs | 75 ++- .../Scripting/DoorwayScriptingParent.cs | 103 ++++ .../Components/Scripting/DunGenPlusScript.cs | 84 ++++ .../Scripting/DunGenPlusScriptingParent.cs | 152 ++++++ .../DevTools/Panels/DunGenPlusPanel.cs | 7 + DunGenPlus/DunGenPlus/DunGenPlus.csproj | 20 + .../DunGenPlus/DunGenPlus/DunGenPlus.dll | Bin 820736 -> 856064 bytes .../DunGenPlus/DunGenPlusEditor.dll | Bin 12288 -> 13312 bytes .../ExpressionParser/EvaluationContext.cs | 136 ++++++ .../DunGenPlus/ExpressionParser/Evaluator.cs | 438 ++++++++++++++++++ .../ExpressionParser/ExpressionToken.cs | 221 +++++++++ .../ExpressionParser/ExpressionTokenType.cs | 54 +++ .../ExpressionParser/FunctionRoutine.cs | 44 ++ .../Parsing/IExpressionTokenizer.cs | 16 + .../Parsing/InfixToPostfixTokenizer.cs | 148 ++++++ .../Parsing/InfixTokenizer.cs | 206 ++++++++ .../Parsing/KnownOperators.cs | 146 ++++++ .../ExpressionParser/Parsing/ListReader.cs | 89 ++++ .../ExpressionParser/Parsing/OperatorType.cs | 131 ++++++ .../ExpressionParser/Parsing/RawToken.cs | 95 ++++ .../ExpressionParser/Parsing/RawTokenizer.cs | 102 ++++ .../ExpressionParser/ValueTypeHint.cs | 17 + .../Generation/DunGenPlusGenerator.cs | 3 +- .../DunGenPlus/Managers/DoorwayManager.cs | 78 +++- .../DunGenPlus/Patches/RoundManagerPatch.cs | 7 + DunGenPlus/DunGenPlus/Plugin.cs | 5 +- DunGenPlus/DunGenPlus/Utils/Utility.cs | 27 +- .../DunGenPlusEditor/DunGenPlusEditor.csproj | 2 + .../NamedGameObjectReferencePropertyDrawer.cs | 27 ++ .../ScriptActionPropertyDrawer.cs | 43 ++ 36 files changed, 2467 insertions(+), 24 deletions(-) create mode 100644 DunGenPlus/DunGenPlus/Components/Scripting/DoorwayScriptingParent.cs create mode 100644 DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScript.cs create mode 100644 DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScriptingParent.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/EvaluationContext.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Evaluator.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/ExpressionToken.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/ExpressionTokenType.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/FunctionRoutine.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/IExpressionTokenizer.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixToPostfixTokenizer.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixTokenizer.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/KnownOperators.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/ListReader.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/OperatorType.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawToken.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawTokenizer.cs create mode 100644 DunGenPlus/DunGenPlus/ExpressionParser/ValueTypeHint.cs create mode 100644 DunGenPlus/DunGenPlusEditor/NamedGameObjectReferencePropertyDrawer.cs create mode 100644 DunGenPlus/DunGenPlusEditor/ScriptActionPropertyDrawer.cs diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanup.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanup.cs index a357ec2..a7696d8 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanup.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanup.cs @@ -11,6 +11,7 @@ using UnityEngine; namespace DunGenPlus.Components { public class DoorwayCleanup : MonoBehaviour, IDungeonCompleteReceiver { + [Header("OBSOLUTE. Please use DoorwayScriptingParent")] [Header("Doorway References")] [Tooltip("The doorway reference.")] public Doorway doorway; diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSConnectorBlockerSpawnedPrefab.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSConnectorBlockerSpawnedPrefab.cs index 55a47e1..80f383e 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSConnectorBlockerSpawnedPrefab.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSConnectorBlockerSpawnedPrefab.cs @@ -6,6 +6,8 @@ using System.Threading.Tasks; using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + + [Obsolete("Please use DoorwayScriptingParent")] public class DCSConnectorBlockerSpawnedPrefab : DoorwayCleanupScript { public enum Action { SwitchToConnector, SwitchToBlocker }; diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwayConnectedDoorway.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwayConnectedDoorway.cs index 02b1058..8c3e37b 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwayConnectedDoorway.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwayConnectedDoorway.cs @@ -6,17 +6,20 @@ using System.Threading.Tasks; using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + + [Obsolete("Please use DoorwayScriptingParent")] public class DCSRemoveDoorwayConnectedDoorway : DoorwayCleanupScriptDoorwayCompare { [Header("Removes Doorway Gameobject\nif the neighboring doorway's priority matches the operation comparison")] [Header("Operation Comparison")] public int doorwayPriority; + public int doorwayPriorityB; public Operation operation = Operation.Equal; public override void Cleanup(DoorwayCleanup parent) { var doorway = parent.doorway; if (doorway.connectedDoorway == null) return; - var result = GetOperation(operation).Invoke(doorway.connectedDoorway, doorwayPriority); + var result = GetOperation(operation).Invoke(doorway.connectedDoorway, new Arguments(doorwayPriority, doorwayPriorityB)); if (result) { parent.SwitchDoorwayGameObject(false); diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwaySpawnedPrefab.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwaySpawnedPrefab.cs index 2f2dbbe..98a3bae 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwaySpawnedPrefab.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveDoorwaySpawnedPrefab.cs @@ -6,6 +6,8 @@ using System.Threading.Tasks; using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + + [Obsolete("Please use DoorwayScriptingParent")] public class DCSRemoveDoorwaySpawnedPrefab : DoorwayCleanupScript { [Header("Removes Doorway Gameobject\nif Doorway instantiates a Connector/Blocker prefab with the target's name")] diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveGameObjectsConnectedDoorway.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveGameObjectsConnectedDoorway.cs index 82a0f1b..58f6699 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveGameObjectsConnectedDoorway.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DCSRemoveGameObjectsConnectedDoorway.cs @@ -6,12 +6,14 @@ using System.Threading.Tasks; using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + [Obsolete("Please use DoorwayScriptingParent")] public class DCSRemoveGameObjectsConnectedDoorway : DoorwayCleanupScriptDoorwayCompare { [Header("Removes target GameObjects\nif the neighboring doorway's priority matches the operation comparison")] [Header("Operation Comparison")] public int doorwayPriority; + public int doorwayPriorityB; public Operation operation = Operation.Equal; [Header("Targets")] @@ -20,7 +22,7 @@ namespace DunGenPlus.Components.DoorwayCleanupScripting { public override void Cleanup(DoorwayCleanup parent) { var doorway = parent.doorway; if (doorway.connectedDoorway == null) return; - var result = GetOperation(operation).Invoke(doorway.connectedDoorway, doorwayPriority); + var result = GetOperation(operation).Invoke(doorway.connectedDoorway, new Arguments(doorwayPriority, doorwayPriorityB)); if (result) { foreach(var t in targets) t.SetActive(false); } diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScript.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScript.cs index edd1b49..15374ea 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScript.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScript.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + [Obsolete("Please use DoorwayScriptingParent")] public abstract class DoorwayCleanupScript : MonoBehaviour { public abstract void Cleanup(DoorwayCleanup parent); diff --git a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScriptDoorwayCompare.cs b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScriptDoorwayCompare.cs index 8fef87c..beee7b2 100644 --- a/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScriptDoorwayCompare.cs +++ b/DunGenPlus/DunGenPlus/Components/DoorwayCleanupScripting/DoorwayCleanupScriptDoorwayCompare.cs @@ -4,13 +4,44 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEngine; namespace DunGenPlus.Components.DoorwayCleanupScripting { + [Obsolete("Please use DoorwayScriptingParent")] public abstract class DoorwayCleanupScriptDoorwayCompare : DoorwayCleanupScript { - public enum Operation { Equal, NotEqual, LessThan, GreaterThan } + public enum Operation { + [InspectorName("Equal (target == value)")] + Equal, + [InspectorName("NotEqual (target != value)")] + NotEqual, + [InspectorName("LessThan (target < value)")] + LessThan, + [InspectorName("GreaterThan (target > value)")] + GreaterThan, + [InspectorName("LessThanEq (target <= value)")] + LessThanEq, + [InspectorName("GreaterThanEw (target >= value)")] + GreaterThanEq, + [InspectorName("Between (value < target < valueB)")] + Between, + [InspectorName("BetweenEq (value <= target <= valueB)")] + BetweenEq + } - public Func GetOperation(Operation operation){ + public struct Arguments{ + public int parameterA; + public int parameterB; + + public Arguments(int parameterA, int parameterB){ + this.parameterA = parameterA; + this.parameterB = parameterB; + } + + public static explicit operator Arguments((int a, int b) pair) => new Arguments(pair.a, pair.b); + } + + public Func GetOperation(Operation operation){ switch(operation){ case Operation.Equal: return EqualOperation; @@ -20,24 +51,48 @@ namespace DunGenPlus.Components.DoorwayCleanupScripting { return LessThanOperation; case Operation.GreaterThan: return GreaterThanOperation; + case Operation.LessThanEq: + return LessThanEqualOperation; + case Operation.GreaterThanEq: + return GreaterThanEqualOperation; + case Operation.Between: + return BetweenOperation; + case Operation.BetweenEq: + return BetweenEqualOperation; } return null; } - public bool EqualOperation(Doorway other, int doorwayPriority){ - return other.DoorPrefabPriority == doorwayPriority; + public bool EqualOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority == arguments.parameterA; } - public bool NotEqualOperation(Doorway other, int doorwayPriority){ - return other.DoorPrefabPriority != doorwayPriority; + public bool NotEqualOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority != arguments.parameterA; } - public bool LessThanOperation(Doorway other, int doorwayPriority){ - return other.DoorPrefabPriority < doorwayPriority; + public bool LessThanOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority < arguments.parameterA; } - public bool GreaterThanOperation(Doorway other, int doorwayPriority){ - return other.DoorPrefabPriority > doorwayPriority; + public bool GreaterThanOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority > arguments.parameterA; + } + + public bool LessThanEqualOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority <= arguments.parameterA; + } + + public bool GreaterThanEqualOperation(Doorway other, Arguments arguments){ + return other.DoorPrefabPriority >= arguments.parameterA; + } + + public bool BetweenOperation(Doorway other, Arguments arguments){ + return arguments.parameterA < other.DoorPrefabPriority && other.DoorPrefabPriority < arguments.parameterB; + } + + public bool BetweenEqualOperation(Doorway other, Arguments arguments){ + return arguments.parameterA <= other.DoorPrefabPriority && other.DoorPrefabPriority <= arguments.parameterB; } } diff --git a/DunGenPlus/DunGenPlus/Components/Scripting/DoorwayScriptingParent.cs b/DunGenPlus/DunGenPlus/Components/Scripting/DoorwayScriptingParent.cs new file mode 100644 index 0000000..46b48c6 --- /dev/null +++ b/DunGenPlus/DunGenPlus/Components/Scripting/DoorwayScriptingParent.cs @@ -0,0 +1,103 @@ +using DunGen; +using DunGenPlus.Managers; +using Soukoku.ExpressionParser; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace DunGenPlus.Components.Scripting { + + public class DoorwayScriptingParent : DunGenPlusScriptingParent { + + [Header("Scripting Debug")] + public Doorway connectedDoorwayDebug; + + public override void Awake(){ + base.Awake(); + + if (targetReference == null) return; + + // steal the scene objects from the doorway and clear them + // before the doorway messes with them before us + // psycho energy + AddNamedReference("connectors", targetReference.ConnectorSceneObjects); + targetReference.ConnectorSceneObjects = new List(); + + AddNamedReference("blockers", targetReference.BlockerSceneObjects); + targetReference.BlockerSceneObjects = new List(); + } + + public override void Call(){ + if (targetReference == null) return; + + // start up like in original + var isConnected = targetReference.connectedDoorway != null; + SetNamedGameObjectState("connectors", isConnected); + SetNamedGameObjectState("blockers", !isConnected); + + base.Call(); + } + + Doorway GetDoorway(string name){ + switch(name) { + case "self": + return targetReference; + case "other": + return InDebugMode ? connectedDoorwayDebug : targetReference.ConnectedDoorway; + default: + Utils.Utility.PrintLog($"{name} is not valid doorway expression. Please use 'self' or 'other'", BepInEx.Logging.LogLevel.Error); + return null; + + } + } + + public override EvaluationContext CreateContext() { + var context = new EvaluationContext(GetFields); + context.RegisterFunction("doorwaySpawnedGameObject", new FunctionRoutine(2, doorwaySpawnedGameObjectFunction)); + + return context; + } + + ExpressionToken doorwaySpawnedGameObjectFunction(EvaluationContext context, ExpressionToken[] parameters) { + var targetName = parameters[0].Value; + var target = GetDoorway(targetName); + if (target != null) { + var name = parameters[1].Value; + foreach(Transform child in target.transform) { + if (child.gameObject.activeSelf && child.name.Contains(name)) return ExpressionToken.True; + } + } + return ExpressionToken.False; + } + + (object, ValueTypeHint) GetFields(string field) { + var split = field.Split('.'); + + if (split.Length <= 1) { + Utils.Utility.PrintLog($"{field} is not a valid field", BepInEx.Logging.LogLevel.Error); + return (0, ValueTypeHint.Auto); + } + + var targetName = split[0]; + var target = GetDoorway(targetName); + var getter = split[1]; + + switch(getter) { + case "priority": + if (target != null){ + return (target.DoorPrefabPriority, ValueTypeHint.Auto); + } + return (0, ValueTypeHint.Auto); + case "exists": + return (target != null, ValueTypeHint.Auto); + default: + Utils.Utility.PrintLog($"{getter} is not a valid getter", BepInEx.Logging.LogLevel.Error); + return (0, ValueTypeHint.Auto); + } + } + + } +} diff --git a/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScript.cs b/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScript.cs new file mode 100644 index 0000000..889e024 --- /dev/null +++ b/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScript.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Soukoku.ExpressionParser; +using DunGen; + +namespace DunGenPlus.Components.Scripting { + + public enum ScriptActionType { + SwitchToConnector, + SwitchToBlocker, + SetNamedReferenceState + } + + [System.Serializable] + public struct ScriptAction { + public ScriptActionType type; + public string namedReference; + public bool boolValue; + + public void CallAction(IDunGenScriptingParent parent){ + switch(type){ + case ScriptActionType.SwitchToConnector: + parent.SetNamedGameObjectState("connectors", true); + parent.SetNamedGameObjectState("blockers", false); + break; + case ScriptActionType.SwitchToBlocker: + parent.SetNamedGameObjectState("connectors", false); + parent.SetNamedGameObjectState("blockers", true); + break; + case ScriptActionType.SetNamedReferenceState: + parent.SetNamedGameObjectState(namedReference, boolValue); + break; + } + } + } + + public class DunGenPlusScript : MonoBehaviour { + + public static bool InDebugMode = false; + + public string expression; + public List actions; + + public bool EvaluateExpression(IDunGenScriptingParent parent){ + var context = parent.CreateContext(); + var evaluator = new Evaluator(context); + try { + InDebugMode = false; + var results = evaluator.Evaluate(expression, true); + return results.ToDouble(context) > 0; + } catch (Exception e) { + Plugin.logger.LogError($"Expression [{expression}] could not be parsed. Returning false"); + Plugin.logger.LogError(e.ToString()); + } + + return false; + } + + [ContextMenu("Verify")] + public void VerifyExpression(){ + var context = GetComponent().CreateContext(); + var evaluator = new Evaluator(context); + try { + InDebugMode = true; + var results = evaluator.Evaluate(expression, false); + Debug.Log($"Expression parsed successfully: {results.ToString()} ({evaluator.ConvertTokenToFalseTrue(results).ToString()})"); + } catch (Exception e) { + Debug.LogError($"Expression [{expression}] could not be parsed"); + Debug.LogError(e.ToString()); + } + } + + public void Call(IDunGenScriptingParent parent){ + if (EvaluateExpression(parent)){ + foreach(var action in actions) action.CallAction(parent); + } + } + + } +} diff --git a/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScriptingParent.cs b/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScriptingParent.cs new file mode 100644 index 0000000..93d33ad --- /dev/null +++ b/DunGenPlus/DunGenPlus/Components/Scripting/DunGenPlusScriptingParent.cs @@ -0,0 +1,152 @@ +using DunGen; +using DunGenPlus.Managers; +using Soukoku.ExpressionParser; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace DunGenPlus.Components.Scripting { + + public enum OverrideGameObjectState { + None, + Active, + Disabled + } + + [System.Serializable] + public class NamedGameObjectReference { + public string name; + public List gameObjects; + public OverrideGameObjectState overrideState; + + public NamedGameObjectReference(string name, List gameObjects){ + this.name = name; + this.gameObjects = gameObjects; + } + + public void SetState(bool state){ + foreach(var g in gameObjects){ + g?.SetActive(state); + } + } + + public void FixOverrideState(){ + if (overrideState == OverrideGameObjectState.None) return; + SetState(overrideState == OverrideGameObjectState.Active); + } + + public void DestroyInactiveGameObjects(){ + foreach(var g in gameObjects){ + if (g && !g.activeSelf) UnityEngine.Object.DestroyImmediate(g, false); + } + } + } + + public enum DunGenScriptingHook { + SetLevelObjectVariables, + OnMainEntranceTeleportSpawned + } + + + public interface IDunGenScriptingParent { + + DunGenScriptingHook GetScriptingHook { get; } + + void Call(); + + List GetNamedReferences { get; } + + void AddNamedReference(string name, List gameObjects); + + void SetNamedGameObjectState(string name, bool state); + void SetNamedGameObjectOverrideState(string name, OverrideGameObjectState state); + + EvaluationContext CreateContext(); + + } + + public abstract class DunGenPlusScriptingParent : MonoBehaviour, IDunGenScriptingParent, IDungeonCompleteReceiver where T: Component { + + public static bool InDebugMode => DunGenPlusScript.InDebugMode; + + [Header("REQUIRED")] + [Tooltip("The target reference.")] + public T targetReference; + public DunGenScriptingHook callHook = DunGenScriptingHook.OnMainEntranceTeleportSpawned; + + [Header("Named References")] + [Tooltip("Provide a variable name for a list of gameObjects. Used in DunGenScripting.")] + public List namedReferences = new List(); + public Dictionary namedDictionary = new Dictionary(); + + public DunGenScriptingHook GetScriptingHook => callHook; + public List GetNamedReferences => namedReferences; + + public void OnDungeonComplete(Dungeon dungeon) { + //SetBlockers(true); + //Debug.Log("ONDUNGEONCOMPLETE"); + DoorwayManager.AddDunGenScriptHook(this); + } + + public virtual void Awake(){ + foreach(var r in namedReferences){ + namedDictionary.Add(r.name, r); + } + } + + public virtual void Call() { + // call scripts + var scripts = GetComponentsInChildren(); + foreach(var c in scripts) c.Call(this); + + // apply any overrides + foreach(var n in namedReferences) n.FixOverrideState(); + + // clean up like in original + foreach(var n in namedReferences) DestroyInactiveGameObjects(n.gameObjects); + } + + public void AddNamedReference(string name, List gameObjects) { + var item = new NamedGameObjectReference(name, gameObjects); + namedReferences.Add(item); + namedDictionary.Add(name, item); + } + + public void SetNamedGameObjectState(string name, bool state){ + if (namedDictionary.TryGetValue(name, out var obj)){ + obj.SetState(state); + } else { + Plugin.logger.LogError($"Named reference: {name} does not exist"); + } + } + + public void SetNamedGameObjectOverrideState(string name, OverrideGameObjectState state){ + if (namedDictionary.TryGetValue(name, out var obj)){ + obj.overrideState = state; + } + } + + public void DestroyInactiveGameObjects(IEnumerable gameObjects){ + foreach(var g in gameObjects) { + if (g && !g.activeSelf) { + UnityEngine.Object.DestroyImmediate(g, false); + } + } + } + + protected bool CheckIfNotNull(object target, string name){ + if (target == null) { + Utils.Utility.PrintLog($"{name} was null", BepInEx.Logging.LogLevel.Error); + return false; + } + return true; + } + + public abstract EvaluationContext CreateContext(); + + } +} diff --git a/DunGenPlus/DunGenPlus/DevTools/Panels/DunGenPlusPanel.cs b/DunGenPlus/DunGenPlus/DevTools/Panels/DunGenPlusPanel.cs index 60ce84c..5782d40 100644 --- a/DunGenPlus/DunGenPlus/DevTools/Panels/DunGenPlusPanel.cs +++ b/DunGenPlus/DunGenPlus/DevTools/Panels/DunGenPlusPanel.cs @@ -32,6 +32,7 @@ namespace DunGenPlus.DevTools.Panels { private GameObject forcedTilesParentGameobject; private GameObject branchLoopBoostParentGameobject; private GameObject maxShadowsParentGameobject; + public bool eventCallbackValue = true; public override void AwakeCall() { Instance = this; @@ -70,6 +71,7 @@ namespace DunGenPlus.DevTools.Panels { } internal const string ActivateDunGenPlusTooltip = "If disabled, the dungeon generation will ignore this DunGenPlusExtender asset and simply create a vanilla dungeon instead when generating."; + internal const string EventCallbackScenarioTooltip = "Sets the EventCallbackScenario.IsDevDebug value"; public void SetupPanel() { selectedExtenderer = API.GetDunGenExtender(selectedDungeonFlow); @@ -77,6 +79,7 @@ namespace DunGenPlus.DevTools.Panels { var parentTransform = selectedListGameObject.transform; var properties = selectedExtenderer.Properties; manager.CreateBoolInputField(parentTransform, ("Activate DunGenPlus", ActivateDunGenPlusTooltip), selectedExtenderer.Active, SetActivateDunGenPlus); + manager.CreateBoolInputField(parentTransform, ("EventCallbackScenario state", EventCallbackScenarioTooltip), eventCallbackValue, SetDebugCallbackState); manager.CreateSpaceUIField(parentTransform); var mainPathTransform = manager.CreateVerticalLayoutUIField(parentTransform); @@ -168,6 +171,10 @@ namespace DunGenPlus.DevTools.Panels { selectedExtenderer.Active = state; } + public void SetDebugCallbackState(bool state){ + eventCallbackValue = state; + } + public void SetMainPathCount(int value) { selectedExtenderer.Properties.MainPathProperties.MainPathCount = value; mainPathParentGameobject.SetActive(value > 1); diff --git a/DunGenPlus/DunGenPlus/DunGenPlus.csproj b/DunGenPlus/DunGenPlus/DunGenPlus.csproj index afe53a0..cbf03b3 100644 --- a/DunGenPlus/DunGenPlus/DunGenPlus.csproj +++ b/DunGenPlus/DunGenPlus/DunGenPlus.csproj @@ -56,6 +56,9 @@ False ..\..\..\Libraries\MonoMod.Utils.dll + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + @@ -157,7 +160,24 @@ + + + + + + + + + + + + + + + + + diff --git a/DunGenPlus/DunGenPlus/DunGenPlus/DunGenPlus.dll b/DunGenPlus/DunGenPlus/DunGenPlus/DunGenPlus.dll index f168764262e998708a57b832201c6f9ad2367fe0..9c9ce473fe280ba0e08c3733577f4e1dcaba0be1 100644 GIT binary patch delta 187996 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�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
Ut|^0C+$a+`bGf%9>5Z%2503}UhNPSBC} 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 E2Pr+yC;$Ke delta 153131 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�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 T01N;C0N_2h5e^OS0g*5VibEk& diff --git a/DunGenPlus/DunGenPlus/DunGenPlus/DunGenPlusEditor.dll b/DunGenPlus/DunGenPlus/DunGenPlus/DunGenPlusEditor.dll index 6bf3722d02d4caf93d8f6ec5c0876ef71a545e31..95bfd196fb0da5363e8beceeb1c92110321320a9 100644 GIT binary patch literal 13312 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 delta 4586 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 + /// Context for storing and returning values during an expression evaluation. + /// + public class EvaluationContext + { + static Dictionary BuiltInFunctions = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "pow", new FunctionRoutine(2, (ctx, args)=> + new ExpressionToken( Math.Pow(args[0].ToDouble(ctx), args[1].ToDouble(ctx)).ToString(ctx.FormatCulture))) }, + { "sin", new FunctionRoutine(1, (ctx, args)=> + new ExpressionToken( Math.Sin(args[0].ToDouble(ctx)).ToString(ctx.FormatCulture)))}, + { "cos", new FunctionRoutine(1, (ctx, args)=> + new ExpressionToken( Math.Cos(args[0].ToDouble(ctx)).ToString(ctx.FormatCulture)))}, + { "tan", new FunctionRoutine(1, (ctx, args)=> + new ExpressionToken( Math.Tan(args[0].ToDouble(ctx)).ToString(ctx.FormatCulture)))} + }; + + static readonly Dictionary __staticFuncs = new Dictionary(StringComparer.OrdinalIgnoreCase); + readonly Dictionary _instanceFuncs = new Dictionary(StringComparer.OrdinalIgnoreCase); + + Func _fieldLookup; + + /// + /// Initializes a new instance of the class. + /// + public EvaluationContext() { } + + /// + /// Initializes a new instance of the class. + /// + /// The field value lookup routine. + public EvaluationContext(Func fieldLookupRoutine) + { + _fieldLookup = fieldLookupRoutine; + } + + /// + /// Resolves the field value. + /// + /// The field. + /// + public (object Value, ValueTypeHint TypeHint) ResolveFieldValue(string field) + { + if (_fieldLookup != null) { return _fieldLookup(field); } + return OnResolveFieldValue(field); + } + + readonly CultureInfo _usCulture = new CultureInfo("en-US"); + private CultureInfo _formatCulture = null; + + /// + /// Gets/sets the culture used to parse/format expressions. + /// Defaults to en-US for certain reasons. + /// + public CultureInfo FormatCulture + { + get { return _formatCulture ?? _usCulture; } + set { _formatCulture = value; } + } + + + /// + /// Gets the field value. + /// + /// The field. + /// + protected virtual (object Value, ValueTypeHint TypeHint) OnResolveFieldValue(string field) + { + return (string.Empty, ValueTypeHint.Auto); + } + + /// + /// Registers a custom function globally. + /// + /// Name of the function. + /// The information. + public static void RegisterGlobalFunction(string functionName, FunctionRoutine info) + { + __staticFuncs[functionName] = info; + } + + /// + /// Registers a custom function with this context instance. + /// + /// Name of the function. + /// The information. + public void RegisterFunction(string functionName, FunctionRoutine info) + { + _instanceFuncs[functionName] = info; + } + + /// + /// Gets the function registered with this context. + /// + /// Name of the function. + /// + /// + public FunctionRoutine GetFunction(string functionName) + { + if (_instanceFuncs.ContainsKey(functionName)) + { + return _instanceFuncs[functionName]; + } + if (__staticFuncs.ContainsKey(functionName)) + { + return __staticFuncs[functionName]; + } + if (BuiltInFunctions.ContainsKey(functionName)) + { + return BuiltInFunctions[functionName]; + } + return OnGetFunction(functionName) ?? + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Function \"{0}\" is not supported.", functionName)); + } + + + /// + /// Gets the function registered with this context. + /// + /// Name of the function. + /// + /// + protected virtual FunctionRoutine OnGetFunction(string functionName) + { + return null; + } + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Evaluator.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Evaluator.cs new file mode 100644 index 0000000..7b0b53b --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Evaluator.cs @@ -0,0 +1,438 @@ +using Soukoku.ExpressionParser.Parsing; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Text; +using UnityEngine.Events; + +namespace Soukoku.ExpressionParser +{ + /// + /// An expression evaluator. + /// + public class Evaluator + { + EvaluationContext _context; + Stack _stack; + + /// + /// Initializes a new instance of the class. + /// + /// The context. + /// context + public Evaluator(EvaluationContext context) + { + _context = context ?? throw new ArgumentNullException("context"); + } + + /// + /// Evaluates the specified input expression. + /// + /// The input expression (infix). + /// if set to true then the result will be coersed to boolean true/false if possible. + /// Anything not "false", "0", or "" is considered true. + /// + /// Unbalanced expression. + /// + public ExpressionToken Evaluate(string input, bool coerseToBoolean = false) + { + if (string.IsNullOrWhiteSpace(input)) + { + return coerseToBoolean ? ExpressionToken.False : new ExpressionToken(input); + } + + var tokens = new InfixToPostfixTokenizer().Tokenize(input); + // resolve field value and type hints here + foreach (var token in tokens.Where(tk => tk.TokenType == ExpressionTokenType.Field)) + { + token.FieldValue = _context.ResolveFieldValue(token.Value); + } + + var reader = new ListReader(tokens); + + // from https://en.wikipedia.org/wiki/Reverse_Polish_notation + _stack = new Stack(); + while (!reader.IsEnd) + { + var tk = reader.Read(); + switch (tk.TokenType) + { + case ExpressionTokenType.Value: + case ExpressionTokenType.DoubleQuoted: + case ExpressionTokenType.SingleQuoted: + case ExpressionTokenType.Field: + _stack.Push(tk); + break; + case ExpressionTokenType.Operator: + HandleOperator(tk.OperatorType); + break; + case ExpressionTokenType.Function: + HandleFunction(tk.Value); + break; + } + } + + if (_stack.Count == 1) + { + var res = _stack.Pop(); + if (coerseToBoolean) + { + return ConvertTokenToFalseTrue(res); + } + return res; + + //if (res.IsNumeric()) + //{ + // return res; + //} + //else if (IsTrue(res.Value)) + //{ + // return ExpressionToken.True; + //} + } + throw new NotSupportedException("Unbalanced expression."); + } + + public ExpressionToken ConvertTokenToFalseTrue(ExpressionToken token){ + // changed form Value to ToString() so fields by themselves evalute properly + if (IsFalse(token.ToString())) + { + return ExpressionToken.False; + } + return ExpressionToken.True; + } + + private void HandleFunction(string functionName) + { + var fun = _context.GetFunction(functionName); + var args = new Stack(fun.ArgumentCount); + + while (args.Count < fun.ArgumentCount) + { + args.Push(_stack.Pop()); + } + + _stack.Push(fun.Evaluate(_context, args.ToArray())); + } + + #region operator handling + + static bool IsDate(string lhs, string rhs, out DateTime lhsDate, out DateTime rhsDate) + { + lhsDate = default(DateTime); + rhsDate = default(DateTime); + + if (DateTime.TryParse(lhs, out lhsDate)) + { + DateTime.TryParse(rhs, out rhsDate); + return true; + } + else if (DateTime.TryParse(rhs, out rhsDate)) + { + DateTime.TryParse(lhs, out lhsDate); + return true; + } + return false; + } + bool IsNumber(string lhs, string rhs, out decimal lhsNumber, out decimal rhsNumber) + { + lhsNumber = 0; + rhsNumber = 0; + + var islNum = decimal.TryParse(lhs, ExpressionToken.NumberParseStyle, _context.FormatCulture, out lhsNumber); + var isrNum = decimal.TryParse(rhs, ExpressionToken.NumberParseStyle, _context.FormatCulture, out rhsNumber); + + return islNum && isrNum; + } + static bool IsBoolean(string lhs, string rhs, out bool lhsBool, out bool rhsBool) + { + bool lIsBool = false; + bool rIsBool = false; + lhsBool = false; + rhsBool = false; + + if (!string.IsNullOrEmpty(lhs)) + { + if (string.Equals(lhs, "true", StringComparison.OrdinalIgnoreCase) || lhs == "1") + { + lhsBool = true; + lIsBool = true; + } + else if (string.Equals(lhs, "false", StringComparison.OrdinalIgnoreCase) || lhs == "0") + { + lIsBool = true; + } + } + + if (lIsBool && !string.IsNullOrEmpty(rhs)) + { + if (string.Equals(rhs, "true", StringComparison.OrdinalIgnoreCase) || rhs == "1") + { + rhsBool = true; + rIsBool = true; + } + else if (string.Equals(rhs, "false", StringComparison.OrdinalIgnoreCase) || rhs == "0") + { + rIsBool = true; + } + } + return lIsBool && rIsBool; + + //lhsBool = false; + //rhsBool = false; + + //if (string.Equals(lhs, "true", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(rhs)) + //{ + // lhsBool = true; + // rhsBool = IsTrue(rhs); + // return true; + //} + //else if (string.Equals(lhs, "false", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(rhs)) + //{ + // rhsBool = IsTrue(rhs); + // return true; + //} + //else if (string.Equals(rhs, "true", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(lhs)) + //{ + // rhsBool = true; + // lhsBool = IsTrue(lhs); + // return true; + //} + //else if (string.Equals(rhs, "false", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(lhs)) + //{ + // lhsBool = IsTrue(lhs); + // return true; + //} + //return false; + } + + private void HandleOperator(OperatorType op) + { + switch (op) + { + case OperatorType.Addition: + BinaryNumberOperation((a, b) => a + b); + break; + case OperatorType.Subtraction: + BinaryNumberOperation((a, b) => a - b); + break; + case OperatorType.Multiplication: + BinaryNumberOperation((a, b) => a * b); + break; + case OperatorType.Division: + BinaryNumberOperation((a, b) => a / b); + break; + case OperatorType.Modulus: + BinaryNumberOperation((a, b) => a % b); + break; + // these logical comparision can be date/num/string! + case OperatorType.LessThan: + var rhsToken = _stack.Pop(); + var lhsToken = _stack.Pop(); + var rhs = rhsToken.ToString(); + var lhs = lhsToken.ToString(); + + if (IsNumber(lhs, rhs, out decimal lhsNum, out decimal rhsNum)) + { + _stack.Push(lhsNum < rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate < rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) < 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.LessThanOrEqual: + rhsToken = _stack.Pop(); + lhsToken = _stack.Pop(); + rhs = rhsToken.ToString(); + lhs = lhsToken.ToString(); + + if (IsNumber(lhs, rhs, out lhsNum, out rhsNum)) + { + _stack.Push(lhsNum <= rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate <= rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) <= 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.GreaterThan: + rhsToken = _stack.Pop(); + lhsToken = _stack.Pop(); + rhs = rhsToken.ToString(); + lhs = lhsToken.ToString(); + + if (IsNumber(lhs, rhs, out lhsNum, out rhsNum)) + { + _stack.Push(lhsNum > rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate > rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) > 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.GreaterThanOrEqual: + rhsToken = _stack.Pop(); + lhsToken = _stack.Pop(); + rhs = rhsToken.ToString(); + lhs = lhsToken.ToString(); + + if (IsNumber(lhs, rhs, out lhsNum, out rhsNum)) + { + _stack.Push(lhsNum >= rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate >= rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) >= 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.Equal: + rhsToken = _stack.Pop(); + lhsToken = _stack.Pop(); + rhs = rhsToken.ToString(); + lhs = lhsToken.ToString(); + + if (IsBoolean(lhs, rhs, out bool lhsBool, out bool rhsBool)) + { + _stack.Push(lhsBool == rhsBool ? ExpressionToken.True : ExpressionToken.False); + } + else if ((AllowAutoFormat(lhsToken) || AllowAutoFormat(rhsToken)) && + IsNumber(lhs, rhs, out lhsNum, out rhsNum)) + { + _stack.Push(lhsNum == rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate == rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) == 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.NotEqual: + rhsToken = _stack.Pop(); + lhsToken = _stack.Pop(); + rhs = rhsToken.ToString(); + lhs = lhsToken.ToString(); + + if (IsBoolean(lhs, rhs, out lhsBool, out rhsBool)) + { + _stack.Push(lhsBool != rhsBool ? ExpressionToken.True : ExpressionToken.False); + } + else if ((AllowAutoFormat(lhsToken) || AllowAutoFormat(rhsToken)) && + IsNumber(lhs, rhs, out lhsNum, out rhsNum)) + { + _stack.Push(lhsNum != rhsNum ? ExpressionToken.True : ExpressionToken.False); + } + else if (IsDate(lhs, rhs, out DateTime lhsDate, out DateTime rhsDate)) + { + _stack.Push(lhsDate != rhsDate ? ExpressionToken.True : ExpressionToken.False); + } + else + { + _stack.Push(string.Compare(lhs, rhs, StringComparison.OrdinalIgnoreCase) != 0 ? ExpressionToken.True : ExpressionToken.False); + } + break; + case OperatorType.BitwiseAnd: + BinaryNumberOperation((a, b) => (int)a & (int)b); + break; + case OperatorType.BitwiseOr: + BinaryNumberOperation((a, b) => (int)a | (int)b); + break; + case OperatorType.LogicalAnd: + BinaryLogicOperation((a, b) => IsTrue(a) && IsTrue(b)); + break; + case OperatorType.LogicalOr: + BinaryLogicOperation((a, b) => IsTrue(a) || IsTrue(b)); + break; + case OperatorType.UnaryMinus: + UnaryNumberOperation(a => -1 * a); + break; + case OperatorType.UnaryPlus: + // no action + break; + case OperatorType.LogicalNegation: + UnaryLogicOperation(a => !IsTrue(a)); + break; + case OperatorType.PreIncrement: + UnaryNumberOperation(a => a + 1); + break; + case OperatorType.PreDecrement: + UnaryNumberOperation(a => a - 1); + break; + // TODO: handle assignments & post increments + default: + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "The {0} operation is not currently supported.", op)); + } + } + + static bool AllowAutoFormat(ExpressionToken token) + { + return token.TokenType != ExpressionTokenType.Field || token.FieldValue.TypeHint != ValueTypeHint.Text; + } + + static bool IsTrue(string value) + { + return string.Equals("true", value, StringComparison.OrdinalIgnoreCase) || value == "1"; + } + + static bool IsFalse(string value) + { + return string.Equals("false", value, StringComparison.OrdinalIgnoreCase) || value == "0" || string.IsNullOrWhiteSpace(value); + } + + void UnaryNumberOperation(Func operation) + { + var op1 = _stack.Pop().ToDecimal(_context); + var res = operation(op1); + + _stack.Push(new ExpressionToken(res.ToString(_context.FormatCulture))); + } + void UnaryLogicOperation(Func operation) + { + var op1 = _stack.Pop(); + var res = operation(op1.ToString()) ? "1" : "0"; + + _stack.Push(new ExpressionToken(res)); + } + void BinaryLogicOperation(Func operation) + { + var op2 = _stack.Pop(); + var op1 = _stack.Pop(); + + var res = operation(op1.ToString(), op2.ToString()) ? "1" : "0"; + + _stack.Push(new ExpressionToken(res)); + } + void BinaryNumberOperation(Func operation) + { + var op2 = _stack.Pop().ToDecimal(_context); + var op1 = _stack.Pop().ToDecimal(_context); + + var res = operation(op1, op2); + + _stack.Push(new ExpressionToken(res.ToString(_context.FormatCulture))); + } + + #endregion + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionToken.cs b/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionToken.cs new file mode 100644 index 0000000..963e5a3 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionToken.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using Soukoku.ExpressionParser.Parsing; + +namespace Soukoku.ExpressionParser +{ + /// + /// A token split from the initial text input. + /// + public class ExpressionToken + { + /// + /// Canonical true value. Actual value is numerical "1". + /// + public static readonly ExpressionToken True = new ExpressionToken("1"); + /// + /// Canonical false value. Actual value is numerical "0". + /// + public static readonly ExpressionToken False = new ExpressionToken("0"); + + internal static readonly NumberStyles NumberParseStyle = NumberStyles.Integer | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol | NumberStyles.Number; + + /// + /// Initializes a new instance of the class. + /// + public ExpressionToken() { } + + /// + /// Initializes a new frozen instance of the class + /// with the specified value. + /// + /// The value. + public ExpressionToken(string value) + { + _type = ExpressionTokenType.Value; + _value = value; + } + + + RawToken _rawToken; // the raw token that makes this token + + /// + /// Gets the raw token that made this list. + /// + /// + public RawToken RawToken { get { return _rawToken; } } + + const string FrozenErrorMsg = "Cannot modify frozen token."; + + /// + /// Appends the specified token to this expression. + /// + /// The token. + /// + public void Append(RawToken token) + { + if (IsFrozen) { throw new InvalidOperationException(FrozenErrorMsg); } + + if (_rawToken == null) { _rawToken = token; } + else { _rawToken.Append(token); } + } + + /// + /// Gets a value indicating whether this instance is frozen from append. + /// + /// + /// true if this instance is frozen; otherwise, false. + /// + public bool IsFrozen { get { return _value != null; } } + + /// + /// Freezes this instance from being appended. + /// + /// + public void Freeze() + { + if (IsFrozen) { throw new InvalidOperationException(FrozenErrorMsg); } + + _value = _rawToken?.ToString(); + } + + private ExpressionTokenType _type; + /// + /// Gets or sets the type of the token. + /// + /// + /// The type of the token. + /// + public ExpressionTokenType TokenType + { + get { return _type; } + set { if (_value == null) { _type = value; } } + } + + /// + /// Gets or sets the type of the operator. This is only used if the + /// is . + /// + /// + /// The type of the operator. + /// + public OperatorType OperatorType { get; set; } + + string _value; + + /// + /// Gets the raw token value. + /// + /// + /// The value. + /// + public string Value { get { return _value ?? _rawToken?.ToString(); } } + + /// + /// Gets the resolved field value and type hint if token is a field. + /// + public (object Value, ValueTypeHint TypeHint) FieldValue { get; internal set; } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() + { + switch (TokenType) + { + case ExpressionTokenType.Field: + return FieldValue.Value?.ToString() ?? ""; + default: + return Value ?? ""; + } + } + + + #region conversion routines + + ///// + ///// Check if the value is considered numeric. + ///// + ///// + //public bool IsNumeric() + //{ + // if (TokenType == ExpressionTokenType.Field && FieldValue.TypeHint == ValueTypeHint.Text) return false; + + // return decimal.TryParse(Value, NumberParseStyle, CultureInfo.InvariantCulture, out decimal dummy); + //} + + ///// + ///// Check if the value is considered true. + ///// + ///// + //public bool IsTrue(string value) + //{ + // if (TokenType == ExpressionTokenType.Field && FieldValue.TypeHint == ValueTypeHint.Text) return false; + + // return string.Equals("true", Value, StringComparison.OrdinalIgnoreCase) || value == "1"; + //} + + ///// + ///// Check if the value is considered false. + ///// + ///// + //public bool IsFalse(string value) + //{ + // if (TokenType == ExpressionTokenType.Field && FieldValue.TypeHint == ValueTypeHint.Text) return false; + + // return string.Equals("false", Value, StringComparison.OrdinalIgnoreCase) || value == "0"; + //} + + /// + /// Converts to the double value. + /// + /// + /// + /// + public double ToDouble(EvaluationContext context) + { + switch (TokenType) + { + case ExpressionTokenType.Value: + case ExpressionTokenType.SingleQuoted: + case ExpressionTokenType.DoubleQuoted: + return double.Parse(Value, NumberParseStyle, context.FormatCulture); + case ExpressionTokenType.Field: + return double.Parse(FieldValue.Value?.ToString(), NumberParseStyle, context.FormatCulture); + default: + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Cannot convert {0}({1}) to a numeric value.", TokenType, Value)); + } + } + + /// + /// Converts to the decimal value. + /// + /// + /// + /// + public decimal ToDecimal(EvaluationContext context) + { + switch (TokenType) + { + case ExpressionTokenType.Value: + case ExpressionTokenType.SingleQuoted: + case ExpressionTokenType.DoubleQuoted: + return decimal.Parse(Value, NumberParseStyle, context.FormatCulture); + case ExpressionTokenType.Field: + return decimal.Parse(FieldValue.Value?.ToString(), NumberParseStyle, context.FormatCulture); + default: + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Cannot convert {0}({1}) to a numeric value.", TokenType, Value)); + } + } + + #endregion + } + + +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionTokenType.cs b/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionTokenType.cs new file mode 100644 index 0000000..ff77a01 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/ExpressionTokenType.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser +{ + /// + /// Indicates the expression token type. + /// + public enum ExpressionTokenType + { + /// + /// Invalid token type. + /// + None, + /// + /// The token is an operator. + /// + Operator, + /// + /// The token is an open parenthesis. + /// + OpenParenthesis, + /// + /// The token is a close parenthesis. + /// + CloseParenthesis, + /// + /// The token is a function. + /// + Function, + /// + /// The token is a comma. + /// + Comma, + /// + /// The token is a field reference. + /// + Field, + /// + /// The token is from single quoted value. + /// + SingleQuoted, + /// + /// The token is from double quoted value. + /// + DoubleQuoted, + /// + /// The token is a yet-to-be-parsed value. + /// + Value, + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/FunctionRoutine.cs b/DunGenPlus/DunGenPlus/ExpressionParser/FunctionRoutine.cs new file mode 100644 index 0000000..3da2116 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/FunctionRoutine.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser +{ + /// + /// Defines a basic function routine. + /// + public class FunctionRoutine + { + Func _routine; + + /// + /// Initializes a new instance of the class. + /// + /// The argument count. + /// The routine. + /// routine + public FunctionRoutine(int argCount, Func routine) + { + if (routine == null) { throw new ArgumentNullException("routine"); } + ArgumentCount = argCount; + _routine = routine; + } + + /// + /// Gets the expected argument count. + /// + /// + /// The argument count. + /// + public int ArgumentCount { get; private set; } + + /// + /// Evaluates using the function routine. + /// + /// The context. + /// The arguments. + /// + public ExpressionToken Evaluate(EvaluationContext context, ExpressionToken[] args) { return _routine(context, args); } + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/IExpressionTokenizer.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/IExpressionTokenizer.cs new file mode 100644 index 0000000..a2a967c --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/IExpressionTokenizer.cs @@ -0,0 +1,16 @@ +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// Interface for something that can tokenize an expression. + /// + public interface IExpressionTokenizer + { + /// + /// Splits the specified input expression into a list of values. + /// + /// The input. + /// + /// + ExpressionToken[] Tokenize(string input); + } +} \ No newline at end of file diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixToPostfixTokenizer.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixToPostfixTokenizer.cs new file mode 100644 index 0000000..d85cd5e --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixToPostfixTokenizer.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// A tokenizer that parses an input expression string in infix notation into tokens without white spaces + /// in the orders of postfix expressions. + /// + public class InfixToPostfixTokenizer : IExpressionTokenizer + { + const string UnbalancedParenMsg = "Unbalanced parenthesis in expression."; + + List _output; + Stack _stack; + + /// + /// Splits the specified input into a list of values + /// in postfix order. + /// + /// The input. + /// + /// + public ExpressionToken[] Tokenize(string input) + { + var infixTokens = new InfixTokenizer().Tokenize(input); + _output = new List(); + _stack = new Stack(); + + // this is the shunting-yard algorithm + // https://en.wikipedia.org/wiki/Shunting-yard_algorithm + + foreach (var inToken in infixTokens) + { + switch (inToken.TokenType) + { + case ExpressionTokenType.Value: + case ExpressionTokenType.DoubleQuoted: + case ExpressionTokenType.SingleQuoted: + case ExpressionTokenType.Field: + _output.Add(inToken); + break; + case ExpressionTokenType.Function: + _stack.Push(inToken); + break; + case ExpressionTokenType.Comma: + HandleComma(); + break; + case ExpressionTokenType.Operator: + HandleOperatorToken(inToken); + break; + case ExpressionTokenType.OpenParenthesis: + _stack.Push(inToken); + break; + case ExpressionTokenType.CloseParenthesis: + HandleCloseParenthesis(); + break; + } + } + + while (_stack.Count > 0) + { + var op = _stack.Pop(); + if (op.TokenType == ExpressionTokenType.OpenParenthesis) + { + throw new NotSupportedException(UnbalancedParenMsg); + } + _output.Add(op); + } + + return _output.ToArray(); + } + + private void HandleComma() + { + bool closed = false; + while (_stack.Count > 1) + { + var peek = _stack.Peek(); + if (peek.TokenType == ExpressionTokenType.OpenParenthesis) + { + closed = true; + break; + } + _output.Add(_stack.Pop()); + } + + if (!closed) + { + throw new NotSupportedException(UnbalancedParenMsg); + } + } + + private void HandleOperatorToken(ExpressionToken inToken) + { + while (_stack.Count > 0) + { + var op2 = _stack.Peek(); + if (op2.TokenType == ExpressionTokenType.Operator) + { + var op1Prec = KnownOperators.GetPrecedence(inToken.OperatorType); + var op2Prec = KnownOperators.GetPrecedence(op2.OperatorType); + var op1IsLeft = KnownOperators.IsLeftAssociative(inToken.OperatorType); + + if ((op1IsLeft && op1Prec <= op2Prec) || + (!op1IsLeft && op1Prec < op2Prec)) + { + _output.Add(_stack.Pop()); + continue; + } + } + break; + } + _stack.Push(inToken); + } + + private void HandleCloseParenthesis() + { + bool closed = false; + while (_stack.Count > 0) + { + var pop = _stack.Pop(); + if (pop.TokenType == ExpressionTokenType.OpenParenthesis) + { + closed = true; + break; + } + _output.Add(pop); + } + + if (!closed) + { + throw new NotSupportedException(UnbalancedParenMsg); + } + else if (_stack.Count > 0) + { + var next = _stack.Peek(); + if (next != null && next.TokenType == ExpressionTokenType.Function) + { + _output.Add(_stack.Pop()); + } + } + } + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixTokenizer.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixTokenizer.cs new file mode 100644 index 0000000..fb01ee1 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/InfixTokenizer.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// A tokenizer that parses an input expression string in infix notation into tokens without white spaces. + /// + public class InfixTokenizer : IExpressionTokenizer + { + List _currentTokens; + + /// + /// Splits the specified input into a list of values. + /// + /// The input. + /// + /// + public ExpressionToken[] Tokenize(string input) + { + _currentTokens = new List(); + ExpressionToken lastExpToken = null; + + var reader = new ListReader(new RawTokenizer().Tokenize(input)); + + while (!reader.IsEnd) + { + var curRawToken = reader.Read(); + switch (curRawToken.TokenType) + { + case RawTokenType.WhiteSpace: + // generially ends previous token outside other special scopes + lastExpToken = null; + break; + case RawTokenType.Literal: + if (lastExpToken == null || lastExpToken.TokenType != ExpressionTokenType.Value) + { + lastExpToken = new ExpressionToken { TokenType = ExpressionTokenType.Value }; + _currentTokens.Add(lastExpToken); + } + lastExpToken.Append(curRawToken); + break; + case RawTokenType.Symbol: + // first do operator match by checking the prev op + // and see if combined with current token would still match a known operator + if (KnownOperators.IsKnown(curRawToken.Value)) + { + if (lastExpToken != null && lastExpToken.TokenType == ExpressionTokenType.Operator) + { + var testOpValue = lastExpToken.Value + curRawToken.Value; + if (KnownOperators.IsKnown(testOpValue)) + { + // just append it + lastExpToken.Append(curRawToken); + continue; + } + } + // start new one + lastExpToken = new ExpressionToken { TokenType = ExpressionTokenType.Operator }; + _currentTokens.Add(lastExpToken); + lastExpToken.Append(curRawToken); + } + else + { + lastExpToken = HandleNonOperatorSymbolToken(reader, lastExpToken, curRawToken); + } + break; + default: + // should never happen + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Unsupported token type {0} at position {1}.", curRawToken.TokenType, curRawToken.Position)); + } + } + + MassageTokens(_currentTokens); + + return _currentTokens.ToArray(); + } + + ExpressionToken HandleNonOperatorSymbolToken(ListReader reader, ExpressionToken lastExpToken, RawToken curRawToken) + { + switch (curRawToken.Value) + { + case ",": + lastExpToken = new ExpressionToken { TokenType = ExpressionTokenType.Comma }; + _currentTokens.Add(lastExpToken); + lastExpToken.Append(curRawToken); + break; + case "(": + // if last one is string make it a function + if (lastExpToken != null && lastExpToken.TokenType == ExpressionTokenType.Value) + { + lastExpToken.TokenType = ExpressionTokenType.Function; + } + + lastExpToken = new ExpressionToken { TokenType = ExpressionTokenType.OpenParenthesis }; + _currentTokens.Add(lastExpToken); + lastExpToken.Append(curRawToken); + break; + case ")": + lastExpToken = new ExpressionToken { TokenType = ExpressionTokenType.CloseParenthesis }; + _currentTokens.Add(lastExpToken); + lastExpToken.Append(curRawToken); + break; + case "{": + // read until end of } + lastExpToken = ReadToLiteralAs(reader, "}", ExpressionTokenType.Field); + break; + case "\"": + // read until end of " + lastExpToken = ReadToLiteralAs(reader, "\"", ExpressionTokenType.DoubleQuoted); + break; + case "'": + // read until end of ' + lastExpToken = ReadToLiteralAs(reader, "'", ExpressionTokenType.SingleQuoted); + break; + } + + return lastExpToken; + } + + ExpressionToken ReadToLiteralAs(ListReader reader, string literalValue, ExpressionTokenType tokenType) + { + ExpressionToken lastExpToken = new ExpressionToken { TokenType = tokenType }; + _currentTokens.Add(lastExpToken); + while (!reader.IsEnd) + { + var next = reader.Read(); + if (next.TokenType == RawTokenType.Symbol && next.Value == literalValue) + { + break; + } + lastExpToken.Append(next); + } + + return lastExpToken; + } + + static void MassageTokens(List tokens) + { + // do final token parsing based on contexts and cleanup + + var reader = new ListReader(tokens); + while (!reader.IsEnd) + { + var tk = reader.Read(); + + if (tk.TokenType == ExpressionTokenType.Operator) + { + // special detection for operators depending on where it is :( + DetermineOperatorType(reader, tk); + } + + tk.Freeze(); + } + } + + private static void DetermineOperatorType(ListReader reader, ExpressionToken tk) + { + tk.OperatorType = KnownOperators.TryMap(tk.Value); + switch (tk.OperatorType) + { + case OperatorType.PreDecrement: + case OperatorType.PreIncrement: + // detect if it's really post ++ -- versions + var prev = reader.Position > 1 ? reader.Peek(-2) : null; + if (prev != null && prev.TokenType == ExpressionTokenType.Value) + { + if (tk.OperatorType == OperatorType.PreIncrement) + { + tk.OperatorType = OperatorType.PostIncrement; + } + else + { + tk.OperatorType = OperatorType.PostDecrement; + } + } + break; + case OperatorType.Addition: + case OperatorType.Subtraction: + // detect if unary + - + prev = reader.Position > 1 ? reader.Peek(-2) : null; + if (prev == null || + (prev.TokenType == ExpressionTokenType.Operator && + prev.OperatorType != OperatorType.PostDecrement && + prev.OperatorType != OperatorType.PostIncrement)) + { + if (tk.OperatorType == OperatorType.Addition) + { + tk.OperatorType = OperatorType.UnaryPlus; + } + else + { + tk.OperatorType = OperatorType.UnaryMinus; + } + } + break; + case OperatorType.None: + throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "Operator {0} is not supported.", tk.Value)); + } + } + } + +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/KnownOperators.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/KnownOperators.cs new file mode 100644 index 0000000..44bd770 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/KnownOperators.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// Contains recognized operator info. + /// + public static class KnownOperators + { + static readonly Dictionary DefaultMap = new Dictionary + { + // double char + {"++", OperatorType.PreIncrement }, + {"--", OperatorType.PreDecrement }, + {"+=", OperatorType.AdditionAssignment }, + {"-=", OperatorType.SubtractionAssignment }, + {"*=", OperatorType.MultiplicationAssignment }, + {"/=", OperatorType.DivisionAssignment }, + {"%=", OperatorType.ModulusAssignment }, + {"==", OperatorType.Equal }, + {"!=", OperatorType.NotEqual}, + {"<=", OperatorType.LessThanOrEqual }, + {">=", OperatorType.GreaterThanOrEqual }, + {"&&", OperatorType.LogicalAnd }, + {"||", OperatorType.LogicalOr }, + + // single char + {"+", OperatorType.Addition }, + {"-", OperatorType.Subtraction }, + {"*", OperatorType.Multiplication }, + {"/", OperatorType.Division }, + {"=", OperatorType.Assignment }, + {"%", OperatorType.Modulus }, + //"^", + {"<", OperatorType.LessThan }, + {">", OperatorType.GreaterThan }, + //"~", + {"&", OperatorType.BitwiseAnd }, + {"|", OperatorType.BitwiseOr }, + {"!", OperatorType.LogicalNegation }, + }; + + /// + /// Determines whether the specified operator value is recognized. + /// + /// The operator value. + /// + public static bool IsKnown(string operatorValue) + { + return DefaultMap.ContainsKey(operatorValue); + } + + /// + /// Try to get the enum version of the operator string value. + /// + /// The operator value. + /// + public static OperatorType TryMap(string operatorValue) + { + if (DefaultMap.ContainsKey(operatorValue)) + { + return DefaultMap[operatorValue]; + } + return OperatorType.None; + } + + /// + /// Gets the precedence of an operator. + /// + /// The type. + /// + public static int GetPrecedence(OperatorType type) + { + switch (type) + { + case OperatorType.PostDecrement: + case OperatorType.PostIncrement: + return 100; + case OperatorType.PreDecrement: + case OperatorType.PreIncrement: + case OperatorType.UnaryMinus: + case OperatorType.UnaryPlus: + case OperatorType.LogicalNegation: + return 90; + case OperatorType.Multiplication: + case OperatorType.Division: + case OperatorType.Modulus: + return 85; + case OperatorType.Addition: + case OperatorType.Subtraction: + return 80; + case OperatorType.LessThan: + case OperatorType.LessThanOrEqual: + case OperatorType.GreaterThan: + case OperatorType.GreaterThanOrEqual: + return 75; + case OperatorType.Equal: + case OperatorType.NotEqual: + return 70; + case OperatorType.BitwiseAnd: + case OperatorType.BitwiseOr: + return 65; + case OperatorType.LogicalAnd: + case OperatorType.LogicalOr: + return 60; + case OperatorType.Assignment: + case OperatorType.AdditionAssignment: + case OperatorType.DivisionAssignment: + case OperatorType.ModulusAssignment: + case OperatorType.MultiplicationAssignment: + case OperatorType.SubtractionAssignment: + return 20; + } + return 0; + } + + /// + /// Determines whether the operator is left-to-right associative (true) or right-to-left (false). + /// + /// The type. + /// + public static bool IsLeftAssociative(OperatorType type) + { + switch (type) + { + case OperatorType.PreDecrement: + case OperatorType.PreIncrement: + case OperatorType.UnaryMinus: + case OperatorType.UnaryPlus: + case OperatorType.LogicalNegation: + case OperatorType.Assignment: + case OperatorType.AdditionAssignment: + case OperatorType.DivisionAssignment: + case OperatorType.ModulusAssignment: + case OperatorType.MultiplicationAssignment: + case OperatorType.SubtractionAssignment: + return false; + } + return true; + } + } + +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/ListReader.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/ListReader.cs new file mode 100644 index 0000000..b3c0834 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/ListReader.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// A simple reader for an IList. + /// + /// The type of the item in the list. + public class ListReader + { + IList _list; + + /// + /// Initializes a new instance of the class. + /// + /// The list to read. + /// list + public ListReader(IList list) + { + if (list == null) { throw new ArgumentNullException("list"); } + + _list = list; + } + + private int _position; + /// + /// Gets or sets the position of the reader. This is the 0-based index. + /// + /// + /// The position. + /// + /// + public int Position + { + get { return _position; } + set + { + if (value < 0 || value > _list.Count) + { + throw new ArgumentOutOfRangeException("value"); + } + _position = value; + } + } + + /// + /// Gets a value indicating whether the reader has reached the end of list. + /// + /// + /// true if this instance is eol; otherwise, false. + /// + public bool IsEnd { get { return _position >= _list.Count; } } + + /// + /// Reads the current item in the list and moves the forward. + /// + /// + /// + public TItem Read() + { + return _list[Position++]; + } + + /// + /// Peeks the current item in the list without moving the . + /// + /// + /// + public TItem Peek() + { + return Peek(0); + } + + /// + /// Peeks the item in the list without moving the . + /// + /// The offset from current position. + /// + /// + public TItem Peek(int offset) + { + // let list throw the exception. + return _list[Position + offset]; + } + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/OperatorType.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/OperatorType.cs new file mode 100644 index 0000000..d6c5075 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/OperatorType.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// Indicates the recognized operator types. + /// + public enum OperatorType + { + /// + /// Unspecified default value. + /// + None, + /// + /// ++ after a value. + /// + PostIncrement, + /// + /// -- after a value. + /// + PostDecrement, + /// + /// ++ before a value. + /// + PreIncrement, + /// + /// -- before a value. + /// + PreDecrement, + /// + /// + before a value. + /// + UnaryPlus, + /// + /// - before a value. + /// + UnaryMinus, + /// + /// ! before a value. + /// + LogicalNegation, + /// + /// * between values. + /// + Multiplication, + /// + /// / between values. + /// + Division, + /// + /// % between values. + /// + Modulus, + /// + /// + between values. + /// + Addition, + /// + /// - between values. + /// + Subtraction, + /// + /// < between values. + /// + LessThan, + /// + /// <= between values. + /// + LessThanOrEqual, + /// + /// > between values. + /// + GreaterThan, + /// + /// >= between values. + /// + GreaterThanOrEqual, + /// + /// == between values. + /// + Equal, + /// + /// != between values. + /// + NotEqual, + /// + /// & between values. + /// + BitwiseAnd, + /// + /// | between values. + /// + BitwiseOr, + /// + /// && between values. + /// + LogicalAnd, + /// + /// || between values. + /// + LogicalOr, + /// + /// = between values. + /// + Assignment, + /// + /// += between values. + /// + AdditionAssignment, + /// + /// -= between values. + /// + SubtractionAssignment, + /// + /// *= between values. + /// + MultiplicationAssignment, + /// + /// /= between values. + /// + DivisionAssignment, + /// + /// %= between values. + /// + ModulusAssignment, + + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawToken.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawToken.cs new file mode 100644 index 0000000..60277d2 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawToken.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Soukoku.ExpressionParser.Parsing +{ + + /// + /// A low-level token split from the initial text input. + /// + public class RawToken + { + /// + /// Initializes a new instance of the class. + /// + /// The type. + /// The position. + internal RawToken(RawTokenType type, int position) + { + TokenType = type; + Position = position; + ValueBuilder = new StringBuilder(); + } + + /// + /// Gets the token type. + /// + /// + /// The type. + /// + public RawTokenType TokenType { get; private set; } + + /// + /// Gets the starting position of this token in the original input. + /// + /// + /// The position. + /// + public int Position { get; private set; } + + // TODO: test pef on using builder or using string directly + internal StringBuilder ValueBuilder { get; private set; } + + internal void Append(RawToken token) + { + if (token != null) + { + ValueBuilder.Append(token.ValueBuilder); + } + } + + /// + /// Gets the token value. + /// + /// + /// The value. + /// + public string Value { get { return ValueBuilder.ToString(); } } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() + { + return Value; + } + } + + /// + /// Indicates the low-level token type. + /// + public enum RawTokenType + { + /// + /// Invalid token type. + /// + None, + /// + /// Token is white space. + /// + WhiteSpace, + /// + /// Token is a symbol. + /// + Symbol, + /// + /// Token is not symbol or white space. + /// + Literal, + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawTokenizer.cs b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawTokenizer.cs new file mode 100644 index 0000000..b31fdd2 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/Parsing/RawTokenizer.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace Soukoku.ExpressionParser.Parsing +{ + /// + /// A low-level tokenizer that parses an input expression string into tokens. + /// + public class RawTokenizer + { + static readonly char[] DefaultSymbols = new[] + { + '+', '-', '*', '/', '=', '%', '^', + ',', '<', '>', '&', '|', '!', + '(', ')', '{', '}', '[', ']', + '"', '\'', '~' + }; + + + /// + /// Initializes a new instance of the class. + /// + public RawTokenizer() : this(null) { } + + /// + /// Initializes a new instance of the class. + /// + /// The char values to count as symbols. If null the will be used. + public RawTokenizer(params char[] symbols) + { + _symbols = symbols ?? DefaultSymbols; + } + + char[] _symbols; + + /// + /// Gets the char values that count as symbols for this tokenizer. + /// + /// + /// The symbols. + /// + public char[] GetSymbols() { return (char[])_symbols.Clone(); } + + /// + /// Splits the specified input into a list of values using white space and symbols. + /// The tokens can be recombined to rebuild the original input exactly. + /// + /// The input. + /// + public RawToken[] Tokenize(string input) + { + var tokens = new List(); + + if (input != null) + { + RawToken lastToken = null; + for (int i = 0; i < input.Length; i++) + { + var ch = input[i]; + if (char.IsWhiteSpace(ch)) + { + lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.WhiteSpace, i); + } + else if (_symbols.Contains(ch)) + { + lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.Symbol, i); + } + else + { + lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.Literal, i); + } + + if (ch == '\\' && ++i < input.Length) + { + // assume escape and just append next char as-is + var next = input[i]; + lastToken.ValueBuilder.Append(next); + } + else + { + lastToken.ValueBuilder.Append(ch); + } + } + } + return tokens.ToArray(); + } + + static RawToken NewTokenIfNecessary(List tokens, RawToken lastToken, RawTokenType curTokenType, int position) + { + if (lastToken == null || lastToken.TokenType != curTokenType || + curTokenType == RawTokenType.Symbol) // for symbol always let it be by itself + { + lastToken = new RawToken(curTokenType, position); + tokens.Add(lastToken); + } + return lastToken; + } + } +} diff --git a/DunGenPlus/DunGenPlus/ExpressionParser/ValueTypeHint.cs b/DunGenPlus/DunGenPlus/ExpressionParser/ValueTypeHint.cs new file mode 100644 index 0000000..9b95d38 --- /dev/null +++ b/DunGenPlus/DunGenPlus/ExpressionParser/ValueTypeHint.cs @@ -0,0 +1,17 @@ +namespace Soukoku.ExpressionParser +{ + /// + /// Used to indicate how to handle resolve field value. + /// + public enum ValueTypeHint + { + /// + /// Value is converted to suitable type for comparison purposes. + /// + Auto, + /// + /// Value is forced to be text for comparison purposes. + /// + Text, + } +} diff --git a/DunGenPlus/DunGenPlus/Generation/DunGenPlusGenerator.cs b/DunGenPlus/DunGenPlus/Generation/DunGenPlusGenerator.cs index 713cea5..fae2e1e 100644 --- a/DunGenPlus/DunGenPlus/Generation/DunGenPlusGenerator.cs +++ b/DunGenPlus/DunGenPlus/Generation/DunGenPlusGenerator.cs @@ -17,6 +17,7 @@ using UnityEngine.Rendering.HighDefinition; using BepInEx.Logging; using DunGenPlus.DevTools; using DunGenPlus.Patches; +using DunGenPlus.DevTools.Panels; [assembly: SecurityPermission( SecurityAction.RequestMinimum, SkipVerification = true )] namespace DunGenPlus.Generation { @@ -36,7 +37,7 @@ namespace DunGenPlus.Generation { ActiveAlternative = true; var props = extender.Properties.Copy(extender.Version); - var callback = new EventCallbackScenario(DevDebugManager.Instance); + var callback = new EventCallbackScenario(DunGenPlusPanel.Instance && DunGenPlusPanel.Instance.eventCallbackValue); Instance.Events.OnModifyDunGenExtenderProperties.Invoke(props, callback); props.NormalNodeArchetypesProperties.SetupProperties(generator); Properties = props; diff --git a/DunGenPlus/DunGenPlus/Managers/DoorwayManager.cs b/DunGenPlus/DunGenPlus/Managers/DoorwayManager.cs index dd1c3e9..36ccd99 100644 --- a/DunGenPlus/DunGenPlus/Managers/DoorwayManager.cs +++ b/DunGenPlus/DunGenPlus/Managers/DoorwayManager.cs @@ -1,36 +1,92 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; +using DunGen; using DunGen.Adapters; using DunGenPlus.Components; +using DunGenPlus.Components.Scripting; using DunGenPlus.Generation; using DunGenPlus.Utils; +using static DunGenPlus.Managers.DoorwayManager; namespace DunGenPlus.Managers { public static class DoorwayManager { public static ActionList onMainEntranceTeleportSpawnedEvent = new ActionList("onMainEntranceTeleportSpawned"); - public static List doorwayCleanupList; + //public static List doorwayCleanupList; + + public class Scripts { + public List scriptList; + public List actionList; + + public Scripts(){ + scriptList = new List(); + actionList = new List(); + } + + public void Add(IDunGenScriptingParent script) { + scriptList.Add(script); + } + + public void Add(Action action) { + actionList.Add(action); + } + + public bool Call(){ + foreach(var s in scriptList){ + s.Call(); + } + + foreach(var a in actionList){ + a.Invoke(); + } + + return scriptList.Count + actionList.Count > 0; + } + + } + + public static Dictionary scriptingLists; public static void ResetList(){ - doorwayCleanupList = new List(); + //doorwayCleanupList = new List(); + scriptingLists = new Dictionary(); + foreach(DunGenScriptingHook e in Enum.GetValues(typeof(DunGenScriptingHook))){ + scriptingLists.Add(e, new Scripts()); + } } public static void AddDoorwayCleanup(DoorwayCleanup cleanup){ - doorwayCleanupList.Add(cleanup); + //doorwayCleanupList.Add(cleanup); } - public static void onMainEntranceTeleportSpawnedFunction(){ + public static void AddDunGenScriptHook(IDunGenScriptingParent script){ + scriptingLists[script.GetScriptingHook].Add(script); + } + + public static void AddActionHook(DunGenScriptingHook hook, Action action){ + scriptingLists[hook].Add(action); + } + + public static void OnMainEntranceTeleportSpawnedFunction(){ if (DunGenPlusGenerator.Active) { - foreach(var d in doorwayCleanupList){ - d.SetBlockers(false); - d.Cleanup(); + + //foreach(var d in doorwayCleanupList){ + // d.SetBlockers(false); + // d.Cleanup(); + // Plugin.logger.LogWarning(d.GetComponentInParent().gameObject.name); + //} + + var anyFunctionCalled = false; + foreach(var d in scriptingLists.Values){ + anyFunctionCalled = anyFunctionCalled | d.Call(); } // we can leave early if doorway cleanup is not used (most likely for most dungeons anyway) - if (doorwayCleanupList.Count == 0) return; + if (!anyFunctionCalled) return; try{ var dungeonGen = RoundManager.Instance.dungeonGenerator; @@ -45,5 +101,11 @@ namespace DunGenPlus.Managers { } } + public static void SetLevelObjectVariablesFunction(){ + if (DunGenPlusGenerator.Active) { + scriptingLists[DunGenScriptingHook.SetLevelObjectVariables ].Call(); + } + } + } } diff --git a/DunGenPlus/DunGenPlus/Patches/RoundManagerPatch.cs b/DunGenPlus/DunGenPlus/Patches/RoundManagerPatch.cs index ea1cd17..651cb56 100644 --- a/DunGenPlus/DunGenPlus/Patches/RoundManagerPatch.cs +++ b/DunGenPlus/DunGenPlus/Patches/RoundManagerPatch.cs @@ -69,5 +69,12 @@ namespace DunGenPlus.Patches { } } + [HarmonyPrefix] + [HarmonyPriority(Priority.First)] + [HarmonyPatch(typeof(RoundManager), "SetLevelObjectVariables")] + public static void SetLevelObjectVariablesPatch (ref RoundManager __instance) { + DoorwayManager.SetLevelObjectVariablesFunction(); + } + } } diff --git a/DunGenPlus/DunGenPlus/Plugin.cs b/DunGenPlus/DunGenPlus/Plugin.cs index 62f81b0..cd968da 100644 --- a/DunGenPlus/DunGenPlus/Plugin.cs +++ b/DunGenPlus/DunGenPlus/Plugin.cs @@ -3,6 +3,7 @@ using BepInEx.Logging; using DunGen; using DunGen.Graph; using DunGenPlus.Collections; +using DunGenPlus.Components.Scripting; using DunGenPlus.Generation; using DunGenPlus.Managers; using DunGenPlus.Patches; @@ -26,7 +27,7 @@ namespace DunGenPlus { internal const string modGUID = "dev.ladyalice.dungenplus"; private const string modName = "Dungeon Generation Plus"; - private const string modVersion = "1.3.4"; + private const string modVersion = "1.4.0"; internal readonly Harmony Harmony = new Harmony(modGUID); @@ -62,7 +63,7 @@ namespace DunGenPlus { Assets.LoadAssets(); Assets.LoadAssetBundle(); - DoorwayManager.onMainEntranceTeleportSpawnedEvent.AddEvent("DoorwayCleanup", DoorwayManager.onMainEntranceTeleportSpawnedFunction); + DoorwayManager.onMainEntranceTeleportSpawnedEvent.AddEvent("DoorwayCleanup", DoorwayManager.OnMainEntranceTeleportSpawnedFunction); } } diff --git a/DunGenPlus/DunGenPlus/Utils/Utility.cs b/DunGenPlus/DunGenPlus/Utils/Utility.cs index 7cca9db..0fef72d 100644 --- a/DunGenPlus/DunGenPlus/Utils/Utility.cs +++ b/DunGenPlus/DunGenPlus/Utils/Utility.cs @@ -1,8 +1,11 @@ -using System; +using BepInEx.Logging; +using DunGenPlus.Components.Scripting; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEngine; using UnityEngine.Events; namespace DunGenPlus.Utils { @@ -52,4 +55,26 @@ namespace DunGenPlus.Utils { } } + public static class Utility { + + public static void PrintLog(string message, LogLevel logLevel){ + if (DunGenPlusScript.InDebugMode){ + switch(logLevel){ + case LogLevel.Error: + case LogLevel.Fatal: + Debug.LogError(message); + break; + case LogLevel.Warning: + Debug.LogWarning(message); + break; + default: + Debug.Log(message); + break; + } + } else { + Plugin.logger.Log(logLevel, message); + } + } + } + } diff --git a/DunGenPlus/DunGenPlusEditor/DunGenPlusEditor.csproj b/DunGenPlus/DunGenPlusEditor/DunGenPlusEditor.csproj index ef5f06b..b1bd4f9 100644 --- a/DunGenPlus/DunGenPlusEditor/DunGenPlusEditor.csproj +++ b/DunGenPlus/DunGenPlusEditor/DunGenPlusEditor.csproj @@ -73,10 +73,12 @@ + + diff --git a/DunGenPlus/DunGenPlusEditor/NamedGameObjectReferencePropertyDrawer.cs b/DunGenPlus/DunGenPlusEditor/NamedGameObjectReferencePropertyDrawer.cs new file mode 100644 index 0000000..26dbb31 --- /dev/null +++ b/DunGenPlus/DunGenPlusEditor/NamedGameObjectReferencePropertyDrawer.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine.UIElements; +using DunGenPlus; +using DunGenPlus.Collections; +using DunGenPlus.Components.Scripting; +using UnityEditor.UIElements; + +namespace DunGenPlusEditor { + + [CustomPropertyDrawer(typeof(NamedGameObjectReference))] + public class NamedGameObjectReferencePropertyDrawer : PropertyDrawer { + public override VisualElement CreatePropertyGUI(SerializedProperty property) { + + var container = new VisualElement(); + container.Add(new PropertyField(property.FindPropertyRelative("name"))); + container.Add(new PropertyField(property.FindPropertyRelative("gameObjects"))); + container.Add(new PropertyField(property.FindPropertyRelative("overrideState"))); + + return container; + } + } +} diff --git a/DunGenPlus/DunGenPlusEditor/ScriptActionPropertyDrawer.cs b/DunGenPlus/DunGenPlusEditor/ScriptActionPropertyDrawer.cs new file mode 100644 index 0000000..32fb9b2 --- /dev/null +++ b/DunGenPlus/DunGenPlusEditor/ScriptActionPropertyDrawer.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine.UIElements; +using DunGenPlus; +using DunGenPlus.Collections; +using DunGenPlus.Components.Scripting; +using UnityEditor.UIElements; + +namespace DunGenPlusEditor { + + [CustomPropertyDrawer(typeof(ScriptAction))] + public class ScriptActionPropertyDrawer : PropertyDrawer { + public override VisualElement CreatePropertyGUI(SerializedProperty property) { + + var container = new VisualElement(); + var typeProperty = property.FindPropertyRelative("type"); + container.Add(new PropertyField(typeProperty)); + + switch((ScriptActionType)typeProperty.intValue){ + case ScriptActionType.SetNamedReferenceState: + AddPropertyFields(container, property, ("namedReference", "Named Reference"), ("boolValue", "State")); + break; + default: + break; + } + + + container.Add(new PropertyField(property.FindPropertyRelative("overrideState"))); + + return container; + } + + private void AddPropertyFields(VisualElement container, SerializedProperty property, params (string field, string label)[] pairs){ + foreach(var pair in pairs){ + container.Add(new PropertyField(property.FindPropertyRelative(pair.field), pair.label)); + } + } + } +}