UserDefinedMethodTerm.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System;
  2. using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
  3. using NTERA.EmuEra.Game.EraEmu.GameProc;
  4. using NTERA.EmuEra.Game.EraEmu.Sub;
  5. namespace NTERA.EmuEra.Game.EraEmu.GameData.Function
  6. {
  7. internal abstract class SuperUserDefinedMethodTerm : IOperandTerm
  8. {
  9. protected SuperUserDefinedMethodTerm(Type returnType)
  10. : base(returnType)
  11. {
  12. }
  13. public abstract UserDefinedFunctionArgument Argument { get;}
  14. public abstract CalledFunction Call { get; }
  15. public override long GetIntValue(ExpressionMediator exm)
  16. {
  17. SingleTerm term = exm.Process.GetValue(this);
  18. if (term == null)
  19. return 0;
  20. return term.Int;
  21. }
  22. public override string GetStrValue(ExpressionMediator exm, bool translate=false)
  23. {
  24. SingleTerm term = exm.Process.GetValue(this, translate);
  25. if (term == null)
  26. return "";
  27. return term.Str;
  28. }
  29. public override SingleTerm GetValue(ExpressionMediator exm, bool tryTranslate =false)
  30. {
  31. SingleTerm term = exm.Process.GetValue(this);
  32. if (term == null)
  33. {
  34. if (GetOperandType() == typeof(Int64))
  35. return new SingleTerm(0);
  36. return new SingleTerm("");
  37. }
  38. return term;
  39. }
  40. }
  41. internal sealed class UserDefinedMethodTerm : SuperUserDefinedMethodTerm
  42. {
  43. /// <summary>
  44. /// エラーならnullを返す。
  45. /// </summary>
  46. public static UserDefinedMethodTerm Create(FunctionLabelLine targetLabel, IOperandTerm[] srcArgs, out string errMes)
  47. {
  48. CalledFunction call = CalledFunction.CreateCalledFunctionMethod(targetLabel, targetLabel.LabelName);
  49. UserDefinedFunctionArgument arg = call.ConvertArg(srcArgs, out errMes);
  50. if (arg == null)
  51. return null;
  52. return new UserDefinedMethodTerm(arg, call.TopLabel.MethodType, call);
  53. }
  54. private UserDefinedMethodTerm(UserDefinedFunctionArgument arg, Type returnType, CalledFunction call)
  55. : base(returnType)
  56. {
  57. argment = arg;
  58. called = call;
  59. }
  60. public override UserDefinedFunctionArgument Argument => argment;
  61. public override CalledFunction Call => called;
  62. private readonly UserDefinedFunctionArgument argment;
  63. private readonly CalledFunction called;
  64. public override IOperandTerm Restructure(ExpressionMediator exm, bool tryTranslate=false)
  65. {
  66. Argument.Restructure(exm);
  67. return this;
  68. }
  69. }
  70. internal sealed class UserDefinedRefMethodTerm : SuperUserDefinedMethodTerm
  71. {
  72. public UserDefinedRefMethodTerm(UserDefinedRefMethod reffunc, IOperandTerm[] srcArgs)
  73. : base(reffunc.RetType)
  74. {
  75. this.srcArgs = srcArgs;
  76. this.reffunc = reffunc;
  77. }
  78. IOperandTerm[] srcArgs;
  79. readonly UserDefinedRefMethod reffunc;
  80. public override UserDefinedFunctionArgument Argument
  81. {
  82. get
  83. {
  84. if (reffunc.CalledFunction == null)
  85. throw new CodeEE("何も参照していない関数参照" + reffunc.Name + "を呼び出しました");
  86. string errMes;
  87. UserDefinedFunctionArgument arg = reffunc.CalledFunction.ConvertArg(srcArgs, out errMes);
  88. if (arg == null)
  89. throw new CodeEE(errMes);
  90. return arg;
  91. }
  92. }
  93. public override CalledFunction Call
  94. {
  95. get
  96. {
  97. if (reffunc.CalledFunction == null)
  98. throw new CodeEE("何も参照していない関数参照" + reffunc .Name+ "を呼び出しました");
  99. return reffunc.CalledFunction;
  100. }
  101. }
  102. public override IOperandTerm Restructure(ExpressionMediator exm, bool tryTranslate=false)
  103. {
  104. for (int i = 0; i < srcArgs.Length; i++)
  105. {
  106. if ((reffunc.ArgTypeList[i] & UserDifinedFunctionDataArgType.__Ref) == UserDifinedFunctionDataArgType.__Ref)
  107. srcArgs[i].Restructure(exm);
  108. else
  109. srcArgs[i] = srcArgs[i].Restructure(exm);
  110. }
  111. return this;
  112. }
  113. }
  114. internal sealed class UserDefinedRefMethodNoArgTerm : SuperUserDefinedMethodTerm
  115. {
  116. public UserDefinedRefMethodNoArgTerm(UserDefinedRefMethod reffunc)
  117. : base(reffunc.RetType)
  118. {
  119. this.reffunc = reffunc;
  120. }
  121. readonly UserDefinedRefMethod reffunc;
  122. public override UserDefinedFunctionArgument Argument => throw new CodeEE("引数のない関数参照" + reffunc.Name + "を呼び出しました");
  123. public override CalledFunction Call => throw new CodeEE("引数のない関数参照" + reffunc.Name + "を呼び出しました");
  124. public string GetRefName()
  125. {
  126. if (reffunc.CalledFunction == null)
  127. return "";
  128. return reffunc.CalledFunction.TopLabel.LabelName;
  129. }
  130. public override long GetIntValue(ExpressionMediator exm)
  131. { throw new CodeEE("引数のない関数参照" + reffunc.Name + "を呼び出しました"); }
  132. public override string GetStrValue(ExpressionMediator exm, bool translate=false)
  133. { throw new CodeEE("引数のない関数参照" + reffunc.Name + "を呼び出しました"); }
  134. public override SingleTerm GetValue(ExpressionMediator exm, bool tryTranslate =false)
  135. { throw new CodeEE("引数のない関数参照" + reffunc.Name + "を呼び出しました"); }
  136. public override IOperandTerm Restructure(ExpressionMediator exm, bool tryTranslate=false)
  137. {
  138. return this;
  139. }
  140. }
  141. }