Elin Decompiled Documentation EA 23.315 Nightly
Loading...
Searching...
No Matches
DramaValueExpression.cs
Go to the documentation of this file.
1using System.Text.RegularExpressions;
2using UnityEngine;
3
5{
6 private static readonly Regex _listSyntaxRegex = new Regex("^(?<op>>=|<=|==|!=|--|\\+\\+|[><=+\\-*/x])?(?<number>.*)$", RegexOptions.Compiled);
7
8 public string Expression { get; }
9
10 public string Op { get; }
11
12 public string Rhs { get; }
14 public DramaValueExpression(string expression)
15 {
16 Expression = expression.Trim();
17 Match match = _listSyntaxRegex.Match(Expression);
18 Op = match.Groups["op"].Value;
19 Rhs = match.Groups["number"].Value;
20 }
21
22 public static bool TryParse(string expression, out DramaValueExpression valueExpr)
23 {
24 valueExpr = new DramaValueExpression(expression);
25 return true;
26 }
27
28 public static implicit operator DramaValueExpression(string expr)
29 {
30 return new DramaValueExpression(expr);
31 }
32
33 public static implicit operator string(DramaValueExpression expr)
34 {
35 return expr.Expression;
36 }
37
38 public int Calc(int lhs)
39 {
40 if (Expression.IsEmpty())
41 {
42 return lhs;
43 }
44 if (!$"{lhs} {Expression}".TryEvaluateAsCalc(out int result, (object)null))
45 {
46 return lhs;
47 }
48 return result;
49 }
50
51 public float Calc(float lhs)
52 {
53 if (Expression.IsEmpty())
54 {
55 return lhs;
56 }
57 if (!$"{lhs} {Expression}".TryEvaluateAsCalc(out float result, (object)null))
58 {
59 return lhs;
60 }
61 return result;
62 }
63
64 public float Diff(float lhs)
65 {
66 return ModOrSet(lhs) - lhs;
67 }
68
69 public int Diff(int lhs)
70 {
71 return ModOrSet(lhs) - lhs;
72 }
73
74 public float ModOrSet(float lhs)
75 {
76 if (Expression.IsEmpty())
77 {
78 return lhs;
79 }
80 string op = Op;
81 if (!(op == "++"))
82 {
83 if (op == "--")
84 {
85 return lhs - 1f;
86 }
87 if (!float.TryParse(Rhs, out var result))
88 {
89 return lhs;
90 }
91 switch (Op)
92 {
93 case "+":
94 return lhs + result;
95 case "-":
96 return lhs - result;
97 case "*":
98 case "x":
99 return lhs * result;
100 case "/":
101 return lhs / result;
102 case "=":
103 case "==":
104 return result;
105 case "":
106 return result;
107 default:
108 return lhs;
109 }
110 }
111 return lhs + 1f;
112 }
113
114 public int ModOrSet(int lhs)
115 {
116 if (Expression.IsEmpty())
117 {
118 return lhs;
119 }
120 string op = Op;
121 if (!(op == "++"))
122 {
123 if (op == "--")
124 {
125 return lhs - 1;
126 }
127 if (!int.TryParse(Rhs, out var result))
128 {
129 return lhs;
130 }
131 switch (Op)
132 {
133 case "+":
134 return lhs + result;
135 case "-":
136 return lhs - result;
137 case "*":
138 case "x":
139 return lhs * result;
140 case "/":
141 return lhs / result;
142 case "=":
143 case "==":
144 return result;
145 case "":
146 return result;
147 default:
148 return lhs;
149 }
150 }
151 return lhs + 1;
152 }
153
154 public bool Compare(float lhs)
155 {
156 if (Expression.IsEmpty())
157 {
158 return false;
159 }
160 if (Op == "")
161 {
162 if (float.TryParse(Rhs, out var result))
163 {
164 return Mathf.Approximately(lhs, result);
165 }
166 return false;
167 }
168 if (!float.TryParse(Rhs, out var result2))
169 {
170 return false;
171 }
172 switch (Op)
173 {
174 case ">":
175 return lhs > result2;
176 case "<":
177 return lhs < result2;
178 case "=":
179 case "==":
180 return Mathf.Approximately(lhs, result2);
181 case ">=":
182 return lhs >= result2;
183 case "<=":
184 return lhs <= result2;
185 case "!=":
186 return !Mathf.Approximately(lhs, result2);
187 default:
188 return false;
189 }
190 }
191
192 public bool Compare(int lhs)
193 {
194 if (Expression.IsEmpty())
195 {
196 return false;
197 }
198 if (Op == "")
199 {
200 if (int.TryParse(Rhs, out var result))
201 {
202 return lhs == result;
203 }
204 return false;
205 }
206 if (!int.TryParse(Rhs, out var result2))
207 {
208 return false;
209 }
210 switch (Op)
211 {
212 case ">":
213 return lhs > result2;
214 case "<":
215 return lhs < result2;
216 case "=":
217 case "==":
218 return lhs == result2;
219 case ">=":
220 return lhs >= result2;
221 case "<=":
222 return lhs <= result2;
223 case "!=":
224 return lhs != result2;
225 default:
226 return false;
227 }
228 }
229}
float Calc(float lhs)
float Diff(float lhs)
float ModOrSet(float lhs)
bool Compare(float lhs)
static readonly Regex _listSyntaxRegex