A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections; 3using System.Collections.Generic; 4 5namespace Unity.VisualScripting 6{ 7 [SerializationVersion("A")] 8 public sealed class VariableDeclarations : IEnumerable<VariableDeclaration>, ISpecifiesCloner 9 { 10 public VariableDeclarations() 11 { 12 collection = new VariableDeclarationCollection(); 13 } 14 15 public VariableKind Kind; 16 17 [Serialize, InspectorWide(true)] 18 private VariableDeclarationCollection collection; 19 20 internal Action OnVariableChanged; 21 22 public object this[[InspectorVariableName(ActionDirection.Any)] string variable] 23 { 24 get => Get(variable); 25 set => Set(variable, value); 26 } 27 28 public void Set([InspectorVariableName(ActionDirection.Set)] string variable, object value) 29 { 30 if (string.IsNullOrEmpty(variable)) 31 { 32 // Do nothing: safer for e.g. default event configurations, 33 // where we don't specify a variable name. If we specified a default, 34 // we might override a user value inadvertently. 35 return; 36 } 37 38 if (collection.TryGetValue(variable, out var declaration)) 39 { 40 if (declaration.value != value) 41 { 42 declaration.value = value; 43 OnVariableChanged?.Invoke(); 44 } 45 } 46 else 47 { 48 collection.Add(new VariableDeclaration(variable, value)); 49 OnVariableChanged?.Invoke(); 50 } 51 } 52 53 public object Get([InspectorVariableName(ActionDirection.Get)] string variable) 54 { 55 if (string.IsNullOrEmpty(variable)) 56 { 57 throw new ArgumentException("No variable name specified.", nameof(variable)); 58 } 59 60 if (collection.TryGetValue(variable, out var declaration)) 61 { 62 return declaration.value; 63 } 64 65 throw new InvalidOperationException($"Variable not found: '{variable}'."); 66 } 67 68 public T Get<T>([InspectorVariableName(ActionDirection.Get)] string variable) 69 { 70 return (T)Get(variable, typeof(T)); 71 } 72 73 public object Get([InspectorVariableName(ActionDirection.Get)] string variable, Type expectedType) 74 { 75 return ConversionUtility.Convert(Get(variable), expectedType); 76 } 77 78 public void Clear() 79 { 80 collection.Clear(); 81 } 82 83 public bool IsDefined([InspectorVariableName(ActionDirection.Any)] string variable) 84 { 85 if (string.IsNullOrEmpty(variable)) 86 { 87 throw new ArgumentException("No variable name specified.", nameof(variable)); 88 } 89 90 return collection.Contains(variable); 91 } 92 93 public VariableDeclaration GetDeclaration(string variable) 94 { 95 if (collection.TryGetValue(variable, out var declaration)) 96 { 97 return declaration; 98 } 99 100 throw new InvalidOperationException($"Variable not found: '{variable}'."); 101 } 102 103 public IEnumerator<VariableDeclaration> GetEnumerator() 104 { 105 return collection.GetEnumerator(); 106 } 107 108 IEnumerator IEnumerable.GetEnumerator() 109 { 110 return ((IEnumerable)collection).GetEnumerator(); 111 } 112 113 ICloner ISpecifiesCloner.cloner => VariableDeclarationsCloner.instance; 114 } 115}