FunctionMethod.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
  3. using NTERA.EmuEra.Game.EraEmu.Sub;
  4. namespace NTERA.EmuEra.Game.EraEmu.GameData.Function
  5. {
  6. internal abstract class FunctionMethod
  7. {
  8. public Type ReturnType { get; protected set; }
  9. protected Type[] argumentTypeArray;
  10. //引数の数・型が一致するかどうかのテスト
  11. //正しくない場合はエラーメッセージを返す。
  12. //引数の数が不定である場合や引数の省略を許す場合にはoverrideすること。
  13. public virtual string CheckArgumentType(string name, IOperandTerm[] arguments)
  14. {
  15. if (arguments.Length != argumentTypeArray.Length)
  16. return name + "関数の引数の数が正しくありません";
  17. for (int i = 0; i < argumentTypeArray.Length; i++)
  18. {
  19. if (arguments[i] == null)
  20. return name + "関数の" + (i + 1) + "番目の引数は省略できません";
  21. if (argumentTypeArray[i] != arguments[i].GetOperandType())
  22. return name + "関数の" +(i+1)+ "番目の引数の型が正しくありません";
  23. }
  24. return null;
  25. }
  26. //Argumentが全て定数の時にMethodを解体してよいかどうか。RANDやCharaを参照するものなどは不可
  27. public bool CanRestructure { get; protected set; }
  28. //FunctionMethodが固有のRestructure()を持つかどうか
  29. public bool HasUniqueRestructure { get; protected set; }
  30. //実際の計算。
  31. public virtual Int64 GetIntValue(ExpressionMediator exm, IOperandTerm[] arguments) { throw new ExeEE("戻り値の型が違う or 未実装"); }
  32. public virtual string GetStrValue(ExpressionMediator exm, IOperandTerm[] arguments, bool tryTranslate = false) { throw new ExeEE("戻り値の型が違う or 未実装"); }
  33. public virtual SingleTerm GetReturnValue(ExpressionMediator exm, IOperandTerm[] arguments, bool tryTranslate)
  34. {
  35. if (ReturnType == typeof(Int64))
  36. return new SingleTerm(GetIntValue(exm, arguments));
  37. return new SingleTerm(GetStrValue(exm, arguments));
  38. }
  39. /// <summary>
  40. /// 戻り値は全体をRestructureできるかどうか
  41. /// </summary>
  42. /// <param name="exm"></param>
  43. /// <param name="arguments"></param>
  44. /// <returns></returns>
  45. public virtual bool UniqueRestructure(ExpressionMediator exm, IOperandTerm[] arguments)
  46. { throw new ExeEE("未実装?"); }
  47. }
  48. }