EType.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Island.StandardLib;
  2. using Island.StandardLib.Math;
  3. using System;
  4. namespace EXTS
  5. {
  6. public abstract class ETypeInstance
  7. {
  8. public bool AllDefined(EValue[] args)
  9. {
  10. for (int i = 0; i < args.Length; i++)
  11. if (!args[i].Defined) return false;
  12. return true;
  13. }
  14. public bool AllTypeEqual<T>(EValue[] args) where T : ETypeInstance
  15. {
  16. for (int i = 0; i < args.Length; i++)
  17. if (!(args[i]?.Instance is T)) return false;
  18. return true;
  19. }
  20. public void ParameterTypeError(string className, string methodName, string expectClassName) => throw new RuntimeException($"{className}:{methodName} Request {expectClassName} parameters.");
  21. public void MethodNotFound(string className, string methodName) => throw new RuntimeException($"class {className} has no public method named {methodName}.");
  22. public void UseUndefinedValue() => throw new RuntimeException("Use undefined variable as parameters.");
  23. public void UsageError(string className, string methodName) => throw new RuntimeException($"{className}:{methodName} Error method usage (parameters error).");
  24. public abstract EValue PassCall(string callFuncName, EValue[] args);
  25. }
  26. public class ENumber : ETypeInstance
  27. {
  28. public float Value;
  29. public ENumber(float val) => Value = val;
  30. public override EValue PassCall(string callFuncName, EValue[] args)
  31. {
  32. EValue result = new EValue();
  33. switch (callFuncName)
  34. {
  35. case "add":
  36. {
  37. if (!AllDefined(args)) UseUndefinedValue();
  38. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Number", callFuncName, "Number");
  39. float val = Value;
  40. args.Do((it) => val += ((ENumber)it.Instance).Value);
  41. result = new EValue(new ENumber(val));
  42. }
  43. break;
  44. case "sub":
  45. {
  46. if (!AllDefined(args)) UseUndefinedValue();
  47. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Number", callFuncName, "Number");
  48. float val = Value;
  49. args.Do((it) => val -= ((ENumber)it.Instance).Value);
  50. result = new EValue(new ENumber(val));
  51. }
  52. break;
  53. case "mul":
  54. {
  55. if (!AllDefined(args)) UseUndefinedValue();
  56. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Number", callFuncName, "Number");
  57. float val = Value;
  58. args.Do((it) => val *= ((ENumber)it.Instance).Value);
  59. result = new EValue(new ENumber(val));
  60. }
  61. break;
  62. case "div":
  63. {
  64. if (!AllDefined(args)) UseUndefinedValue();
  65. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Number", callFuncName, "Number");
  66. float val = Value;
  67. args.Do((it) => val /= ((ENumber)it.Instance).Value);
  68. result = new EValue(new ENumber(val));
  69. }
  70. break;
  71. case "pow":
  72. {
  73. if (!AllDefined(args)) UseUndefinedValue();
  74. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Number", callFuncName, "Number");
  75. float val = Value;
  76. args.Do((it) => val = (float)Math.Pow(val, ((ENumber)it.Instance).Value));
  77. result = new EValue(new ENumber(val));
  78. }
  79. break;
  80. case "str": return new EValue(new EString(Value.ToString()));
  81. default: MethodNotFound("Number", callFuncName); break;
  82. }
  83. return result;
  84. }
  85. }
  86. public class EVec3 : ETypeInstance
  87. {
  88. public Vector3 Value;
  89. public EVec3(Vector3 val) => Value = val;
  90. public override EValue PassCall(string callFuncName, EValue[] args)
  91. {
  92. EValue result = new EValue();
  93. switch (callFuncName)
  94. {
  95. case "add":
  96. {
  97. if (!AllDefined(args)) UseUndefinedValue();
  98. if (!AllTypeEqual<EVec3>(args)) ParameterTypeError("Vec3", callFuncName, "Vec3");
  99. Vector3 val = Value;
  100. args.Do((it) => val += ((EVec3)it.Instance).Value);
  101. result = new EValue(new EVec3(val));
  102. }
  103. break;
  104. case "sub":
  105. {
  106. if (!AllDefined(args)) UseUndefinedValue();
  107. if (!AllTypeEqual<EVec3>(args)) ParameterTypeError("Vec3", callFuncName, "Vec3");
  108. Vector3 val = Value;
  109. args.Do((it) => val -= ((EVec3)it.Instance).Value);
  110. result = new EValue(new EVec3(val));
  111. }
  112. break;
  113. case "x": result = new EValue(new ENumber(Value.x)); break;
  114. case "y": result = new EValue(new ENumber(Value.y)); break;
  115. case "z": result = new EValue(new ENumber(Value.z)); break;
  116. case "dot":
  117. {
  118. if (!AllDefined(args)) UseUndefinedValue();
  119. if (!AllTypeEqual<ENumber>(args)) ParameterTypeError("Vec3", callFuncName, "Number");
  120. float val = 1;
  121. args.Do((it) => val *= it.As<ENumber>().Value);
  122. result = new EValue(new EVec3(val * Value));
  123. }
  124. break;
  125. case "distance":
  126. {
  127. if (!AllDefined(args)) UseUndefinedValue();
  128. if (!AllTypeEqual<EVec3>(args)) ParameterTypeError("Vec3", callFuncName, "Vec3");
  129. if (args.Length != 1) UsageError("Vec3", callFuncName);
  130. result = new EValue(new ENumber(args[0].As<EVec3>().Value.DistanceOf(Value)));
  131. }
  132. break;
  133. case "str": return new EValue(new EString(Value.ToString()));
  134. default: MethodNotFound("Vec3", callFuncName); break;
  135. }
  136. return result;
  137. }
  138. }
  139. public class EString : ETypeInstance
  140. {
  141. public string Value;
  142. public EString(string val) => Value = val;
  143. public override EValue PassCall(string callFuncName, EValue[] args)
  144. {
  145. EValue result = new EValue();
  146. switch (callFuncName)
  147. {
  148. case "add":
  149. {
  150. if (!AllDefined(args)) UseUndefinedValue();
  151. if (!AllTypeEqual<EString>(args)) ParameterTypeError("String", callFuncName, "String");
  152. string val = Value;
  153. args.Do((it) => val += it.As<EString>().Value);
  154. result = new EValue(new EString(val));
  155. }
  156. break;
  157. case "log":
  158. {
  159. Console.WriteLine(Value);
  160. }
  161. break;
  162. case "str": return new EValue(new EString(Value.ToString()));
  163. default: MethodNotFound("String", callFuncName); break;
  164. }
  165. return result;
  166. }
  167. }
  168. }