diff --git a/Assets/Scripts/PointerManager.cs b/Assets/Scripts/PointerManager.cs index 89c0e28..ffc49de 100755 --- a/Assets/Scripts/PointerManager.cs +++ b/Assets/Scripts/PointerManager.cs @@ -183,8 +183,10 @@ namespace UntitledLogicGame private void SetCursor() { - Texture2D cursor = DefaultCursor; - Vector2 position = Vector2.zero; + var cursor = DefaultCursor; + var position = Vector2.zero; + + //TODO fix warning about invalid Texture2D if(!Interacting && GameManager.Instance.CurrentAnchor != null || Interacting && _currentCable != null) { diff --git a/Assets/Scripts/Utils.cs b/Assets/Scripts/Utils.cs index 2a44ba1..dbb642d 100755 --- a/Assets/Scripts/Utils.cs +++ b/Assets/Scripts/Utils.cs @@ -23,7 +23,7 @@ namespace UntitledLogicGame public static bool[][] AllBoolArrayValues(int length) { - int count = (int)Math.Pow(2, length); + var count = (int)Math.Pow(2, length); return new ArrayList[count].Select((v, i) => i.ToBoolArray(length)).ToArray(); } @@ -43,7 +43,7 @@ namespace UntitledLogicGame { public static bool[] ToBoolArray(this int value, int length) { - string str = Convert.ToString(value, 2).PadLeft(length, '0'); + var str = Convert.ToString(value, 2).PadLeft(length, '0'); return str.Select((x) => x == '1').ToArray(); } diff --git a/Assets/Scripts/Workspace/Gates/GateDefinition.cs b/Assets/Scripts/Workspace/Gates/GateDefinition.cs index 8a66032..d20375e 100755 --- a/Assets/Scripts/Workspace/Gates/GateDefinition.cs +++ b/Assets/Scripts/Workspace/Gates/GateDefinition.cs @@ -12,7 +12,7 @@ namespace UntitledLogicGame.Workspace.Gates public abstract string[] Outputs { get; } internal abstract Dictionary TruthTable { get; } public string Name { get; internal set; } - public bool HasState { get; } = false; + public bool HasState => false; public GateDefinition New => (GateDefinition)GetType().GetConstructor(new Type[0]).Invoke(new object[0]); private static void LoadAll() @@ -22,7 +22,7 @@ namespace UntitledLogicGame.Workspace.Gates { try { - Type t = Type.GetType($"{typeof(GateDefinition).Namespace}.{gateType}Gate", true); + var t = Type.GetType($"{typeof(GateDefinition).Namespace}.{gateType}Gate", true); Definitions[gateType] = (GateDefinition)t.GetConstructor(new Type[0]).Invoke(new object[0]); Definitions[gateType].Name = gateType.ToString(); } @@ -39,7 +39,7 @@ namespace UntitledLogicGame.Workspace.Gates if (Definitions == null) LoadAll(); - GateDefinition definition = Definitions[gateType]; + var definition = Definitions[gateType]; foreach (var inputName in definition.Inputs) { @@ -61,22 +61,36 @@ namespace UntitledLogicGame.Workspace.Gates internal GateDefinition() { - foreach(var key in TruthTable.Keys) + if (!HasState) { - if (key.Length != Inputs.Length) - throw new InvalidOperationException($"{GetType()} invalid inputs ({key})"); - } - if(Inputs.Length != 0) - { - foreach (var key in Utils.AllBoolArrayValues(Inputs.Length).Select(b => new InputState(b))) + if (TruthTable.Count > 0) { - if (!TruthTable.Keys.Contains(key)) - throw new InvalidOperationException($"{GetType()} no outputs for ({key})"); - var values = TruthTable[key]; - if (values.Length != Outputs.Length) - throw new InvalidOperationException($"{GetType()} invalid outputs for ({key})"); + foreach (var key in TruthTable.Keys) + { + if (key.Length != Inputs.Length) + throw new InvalidOperationException($"{GetType()} invalid inputs ({key})"); + } + if (Inputs.Length != 0) + { + foreach (var key in Utils.AllBoolArrayValues(Inputs.Length).Select(b => new InputState(b))) + { + if (!TruthTable.Keys.Contains(key)) + throw new InvalidOperationException($"{GetType()} no outputs for ({key})"); + var values = TruthTable[key]; + if (values.Length != Outputs.Length) + throw new InvalidOperationException($"{GetType()} invalid outputs for ({key})"); + } + } } } + else + { + // Only test basic value + var sample = new InputState(Inputs.Length); + var output = Compute(sample); + if(output.Length != Outputs.Length) + throw new InvalidOperationException($"{GetType()} invalid outputs for sample ({sample})"); + } } public bool[] GetState(Gate gate) @@ -86,8 +100,8 @@ namespace UntitledLogicGame.Workspace.Gates public void Compute(Gate gate) { - InputState input = new InputState(GetState(gate)); - State output = Compute(input); + var input = new InputState(GetState(gate)); + var output = Compute(input); foreach (var outputAnchor in Outputs.Select((name, i) => new { i, name })) gate.OutputAnchors.First(a => a.Name.Equals(outputAnchor.name)).Activated = output[outputAnchor.i]; } diff --git a/Assets/Scripts/Workspace/Gates/GateDefinitionList.cs b/Assets/Scripts/Workspace/Gates/GateDefinitionList.cs index a5e47cf..392ea5a 100755 --- a/Assets/Scripts/Workspace/Gates/GateDefinitionList.cs +++ b/Assets/Scripts/Workspace/Gates/GateDefinitionList.cs @@ -130,7 +130,7 @@ namespace UntitledLogicGame.Workspace.Gates internal class SRLatchGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "S", "R" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "SR Latch"; public new bool HasState => true; @@ -139,20 +139,20 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool s = input[0]; - bool r = input[1]; + var s = input[0]; + var r = input[1]; if (r) _q = false; else if (s) _q = true; - return new OutputState(_q); + return new OutputState(_q, !_q); } } internal class JKLatchGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "J", "K" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "JK Latch"; public new bool HasState => true; @@ -161,22 +161,22 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool j = input[0]; - bool k = input[1]; + var j = input[0]; + var k = input[1]; if (k && j) _q = !_q; else if (k) _q = false; else if (j) _q = true; - return new OutputState(_q); + return new OutputState(_q, !_q); } } internal class DLatchGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "D", "E" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "D Latch"; public new bool HasState => true; @@ -185,11 +185,11 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool d = input[0]; - bool e = input[1]; + var d = input[0]; + var e = input[1]; if (e) _q = d; - return new OutputState(_q); + return new OutputState(_q, !_q); } } @@ -200,7 +200,7 @@ namespace UntitledLogicGame.Workspace.Gates internal class SRFlipFlopGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "S", "R", "CLK" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "SR Flip-Flop"; public new bool HasState => true; @@ -210,23 +210,23 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool s = input[0]; - bool r = input[1]; - bool clk = input[2]; + var s = input[0]; + var r = input[1]; + var clk = input[2]; if (clk && !_lastClk) // rising edge if (r) _q = false; else if (s) _q = true; _lastClk = clk; - return new OutputState(_q); + return new OutputState(_q, !_q); } } internal class JKFlipFlopGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "J", "K", "CLK" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "JK Flip-Flop"; public new bool HasState => true; @@ -236,9 +236,9 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool j = input[0]; - bool k = input[1]; - bool clk = input[2]; + var j = input[0]; + var k = input[1]; + var clk = input[2]; if (clk && !_lastClk) // rising edge if (k && j) _q = !_q; @@ -247,14 +247,14 @@ namespace UntitledLogicGame.Workspace.Gates else if (j) _q = true; _lastClk = clk; - return new OutputState(_q); + return new OutputState(_q, !_q); } } internal class DFlipFlopGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "D", "CLK" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "D Flip-Flop"; public new bool HasState => true; @@ -264,19 +264,19 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool d = input[0]; - bool clk = input[1]; + var d = input[0]; + var clk = input[1]; if (clk && !_lastClk) // rising edge _q = d; _lastClk = clk; - return new OutputState(_q); + return new OutputState(_q, !_q); } } internal class TFlipFlopGate : GateDefinition { public override string[] Inputs { get; } = new string[] { "T", "CLK" }; - public override string[] Outputs { get; } = new string[] { "Q" }; + public override string[] Outputs { get; } = new string[] { "Q", "Q̅" }; internal override Dictionary TruthTable => EmptyTruthTable; public new string Name => "T Flip-Flop"; public new bool HasState => true; @@ -286,13 +286,13 @@ namespace UntitledLogicGame.Workspace.Gates internal new OutputState Compute(InputState input) { - bool t = input[0]; - bool clk = input[1]; + var t = input[0]; + var clk = input[1]; if (clk && !_lastClk) // rising edge if (t) _q = !_q; _lastClk = clk; - return new OutputState(_q); + return new OutputState(_q, !_q); } } diff --git a/TODO.txt b/TODO.txt index 6139a8d..1334f16 100755 --- a/TODO.txt +++ b/TODO.txt @@ -1,7 +1,7 @@ TODO -(0) mux/demux -(2) gate bar sub categories --(2) named anchors +-(2) named anchors (dezoom hide ?) -(3) clocks (1Hz, 5Hz, 10Hz, etc.) -(3) generic rect gates -(3) state gates