CaseExpression.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Reflection;
  3. namespace NTERA.EmuEra.Game.EraEmu.GameData.Expression
  4. {
  5. //難読化用属性。enum.ToString()やenum.Parse()を行うなら(Exclude=true)にすること。
  6. [Obfuscation(Exclude=false)]
  7. internal enum CaseExpressionType
  8. {
  9. Normal = 1,
  10. To = 2,
  11. Is = 3
  12. }
  13. internal sealed class CaseExpression
  14. {
  15. public CaseExpressionType CaseType = CaseExpressionType.Normal;
  16. public IOperandTerm LeftTerm;
  17. public IOperandTerm RightTerm;
  18. public OperatorCode Operator;
  19. public Type GetOperandType()
  20. {
  21. if(LeftTerm != null)
  22. return LeftTerm.GetOperandType();
  23. return typeof(void);
  24. }
  25. public void Reduce(ExpressionMediator exm)
  26. {
  27. LeftTerm = LeftTerm.Restructure(exm);
  28. if (CaseType == CaseExpressionType.To)
  29. RightTerm = RightTerm.Restructure(exm);
  30. }
  31. public override string ToString()
  32. {
  33. switch (CaseType)
  34. {
  35. case CaseExpressionType.Normal:
  36. return LeftTerm.ToString();
  37. case CaseExpressionType.Is:
  38. return "Is " + Operator + " " + LeftTerm;
  39. case CaseExpressionType.To:
  40. return LeftTerm + " To " + RightTerm;
  41. }
  42. return base.ToString();
  43. }
  44. public bool GetBool(Int64 Is, ExpressionMediator exm)
  45. {
  46. if (CaseType == CaseExpressionType.To)
  47. return LeftTerm.GetIntValue(exm) <= Is && Is <= RightTerm.GetIntValue(exm);
  48. if (CaseType == CaseExpressionType.Is)
  49. {
  50. IOperandTerm term = OperatorMethodManager.ReduceBinaryTerm(Operator, new SingleTerm(Is), LeftTerm);
  51. return term.GetIntValue(exm) != 0;
  52. }
  53. return LeftTerm.GetIntValue(exm) == Is;
  54. }
  55. public bool GetBool(string Is, ExpressionMediator exm)
  56. {
  57. if (CaseType == CaseExpressionType.To)
  58. {
  59. return string.Compare(LeftTerm.GetStrValue(exm), Is, Config.Config.SCExpression) <= 0
  60. && string.Compare(Is, RightTerm.GetStrValue(exm), Config.Config.SCExpression) <= 0;
  61. }
  62. if (CaseType == CaseExpressionType.Is)
  63. {
  64. IOperandTerm term = OperatorMethodManager.ReduceBinaryTerm(Operator, new SingleTerm(Is), LeftTerm);
  65. return term.GetIntValue(exm) != 0;
  66. }
  67. return LeftTerm.GetStrValue(exm) == Is;
  68. }
  69. }
  70. }