VariableIdentifier.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System;
  2. using System.Collections.Generic;
  3. using NTERA.EmuEra.Game.EraEmu.Sub;
  4. namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
  5. {
  6. //1756 全ての機能をVariableTokenとManagerに委譲、消滅
  7. //……しようと思ったがConstantDataから参照されているので捨て切れなかった。
  8. /// <summary>
  9. /// VariableCodeのラッパー
  10. /// </summary>
  11. internal sealed class VariableIdentifier
  12. {
  13. private VariableIdentifier(VariableCode code)
  14. { this.code = code; }
  15. private VariableIdentifier(VariableCode code, string scope)
  16. { this.code = code; this.scope = scope; }
  17. readonly VariableCode code;
  18. readonly string scope;
  19. public VariableCode Code => code;
  20. public string Scope => scope;
  21. public int CodeInt => (int)(code & VariableCode.__LOWERCASE__);
  22. public VariableCode CodeFlag => code & VariableCode.__UPPERCASE__;
  23. //public int Dimension
  24. //{
  25. // get
  26. // {
  27. // int dim = 0;
  28. // if ((code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__)
  29. // dim++;
  30. // if ((code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__)
  31. // dim++;
  32. // if ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
  33. // dim += 2;
  34. // return dim;
  35. // }
  36. //}
  37. public bool IsNull => code == VariableCode.__NULL__;
  38. public bool IsCharacterData => ((code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__);
  39. public bool IsInteger => ((code & VariableCode.__INTEGER__) == VariableCode.__INTEGER__);
  40. public bool IsString => ((code & VariableCode.__STRING__) == VariableCode.__STRING__);
  41. public bool IsArray1D => ((code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__);
  42. public bool IsArray2D => ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__);
  43. public bool IsArray3D => ((code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__);
  44. public bool Readonly => ((code & VariableCode.__UNCHANGEABLE__) == VariableCode.__UNCHANGEABLE__);
  45. public bool IsCalc => ((code & VariableCode.__CALC__) == VariableCode.__CALC__);
  46. public bool IsLocal => ((code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__);
  47. //public bool IsConstant
  48. //{
  49. // get
  50. // {
  51. // return ((code & VariableCode.__CONSTANT__) == VariableCode.__CONSTANT__);
  52. // }
  53. //}
  54. public bool CanForbid => ((code & VariableCode.__CAN_FORBID__) == VariableCode.__CAN_FORBID__);
  55. static readonly Dictionary<string, VariableCode> nameDic = new Dictionary<string, VariableCode>();
  56. static readonly Dictionary<string, VariableCode> localvarNameDic = new Dictionary<string, VariableCode>();
  57. static readonly Dictionary<VariableCode, List<VariableCode>> extSaveListDic = new Dictionary<VariableCode, List<VariableCode>>();
  58. public static Dictionary<string, VariableCode> GetVarNameDic()
  59. {
  60. return nameDic;
  61. }
  62. static VariableIdentifier()
  63. {
  64. Array array = Enum.GetValues(typeof(VariableCode));
  65. nameDic.Add(VariableCode.__FILE__.ToString(), VariableCode.__FILE__);
  66. nameDic.Add(VariableCode.__LINE__.ToString(), VariableCode.__LINE__);
  67. nameDic.Add(VariableCode.__FUNCTION__.ToString(), VariableCode.__FUNCTION__);
  68. foreach (object name in array)
  69. {
  70. VariableCode code = (VariableCode)name;
  71. string key = code.ToString();
  72. if ((key == null) || (key.StartsWith("__") && key.EndsWith("__")))
  73. continue;
  74. if (Config.Config.ICVariable)
  75. key = key.ToUpper();
  76. if (nameDic.ContainsKey(key))
  77. continue;
  78. #if DEBUG
  79. if ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
  80. {
  81. if ((code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__)
  82. throw new ExeEE("ARRAY2DとARRAY1Dは排他");
  83. }
  84. if (((code & VariableCode.__INTEGER__) != VariableCode.__INTEGER__)
  85. && ((code & VariableCode.__STRING__) != VariableCode.__STRING__))
  86. throw new ExeEE("INTEGERとSTRINGのどちらかは必須");
  87. if (((code & VariableCode.__INTEGER__) == VariableCode.__INTEGER__)
  88. && ((code & VariableCode.__STRING__) == VariableCode.__STRING__))
  89. throw new ExeEE("INTEGERとSTRINGは排他");
  90. if((code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__)
  91. {
  92. if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  93. throw new ExeEE("SAVE_EXTENDEDにはEXTENDEDフラグ必須");
  94. if ((code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__)
  95. throw new ExeEE("LOCALにはEXTENDEDフラグ必須");
  96. if ((code & VariableCode.__GLOBAL__) == VariableCode.__GLOBAL__)
  97. throw new ExeEE("GLOBALにはEXTENDEDフラグ必須");
  98. if ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
  99. throw new ExeEE("ARRAY2DにはEXTENDEDフラグ必須");
  100. }
  101. if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  102. && ((code & VariableCode.__UNCHANGEABLE__) == VariableCode.__UNCHANGEABLE__))
  103. throw new ExeEE("CALCとSAVE_EXTENDEDは排他");
  104. if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  105. && ((code & VariableCode.__CALC__) == VariableCode.__CALC__))
  106. throw new ExeEE("UNCHANGEABLEとSAVE_EXTENDEDは排他");
  107. if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  108. && ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
  109. && ((code & VariableCode.__STRING__) == VariableCode.__STRING__))
  110. throw new ExeEE("STRINGかつARRAY2DのSAVE_EXTENDEDは未実装");
  111. #endif
  112. nameDic.Add(key, code);
  113. ////セーブが必要な変数リストの作成
  114. ////__SAVE_EXTENDED__フラグ持ち
  115. //if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  116. //{
  117. // if ((code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__)
  118. // charaSaveDataList.Add(code);
  119. // else
  120. // saveDataList.Add(code);
  121. //}
  122. //else if ( ((code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__)
  123. // && ((code & VariableCode.__CALC__) != VariableCode.__CALC__)
  124. // && ((code & VariableCode.__UNCHANGEABLE__) != VariableCode.__UNCHANGEABLE__)
  125. // && ((code & VariableCode.__LOCAL__) != VariableCode.__LOCAL__)
  126. // && (!key.StartsWith("NOTUSE_")) )
  127. //{//eramaker由来の変数でセーブするもの
  128. // VariableCode flag = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__ | VariableCode.__CHARACTER_DATA__);
  129. // int codeInt = (int)VariableCode.__LOWERCASE__ & (int)code;
  130. // switch (flag)
  131. // {
  132. // case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__:
  133. // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__)
  134. // charaSaveDataList.Add(code);
  135. // break;
  136. // case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__:
  137. // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__)
  138. // charaSaveDataList.Add(code);
  139. // break;
  140. // case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  141. // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__)
  142. // charaSaveDataList.Add(code);
  143. // break;
  144. // case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  145. // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__)
  146. // charaSaveDataList.Add(code);
  147. // break;
  148. // case VariableCode.__INTEGER__:
  149. // if (codeInt < (int)VariableCode.__COUNT_SAVE_INTEGER__)
  150. // saveDataList.Add(code);
  151. // break;
  152. // case VariableCode.__STRING__:
  153. // if (codeInt < (int)VariableCode.__COUNT_SAVE_STRING__)
  154. // saveDataList.Add(code);
  155. // break;
  156. // case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  157. // if (codeInt < (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__)
  158. // saveDataList.Add(code);
  159. // break;
  160. // case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  161. // if (codeInt < (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__)
  162. // saveDataList.Add(code);
  163. // break;
  164. // }
  165. //}
  166. if ((code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__)
  167. localvarNameDic.Add(key, code);
  168. if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  169. {
  170. VariableCode flag = code &
  171. (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__INTEGER__);
  172. if (!extSaveListDic.ContainsKey(flag))
  173. extSaveListDic.Add(flag, new List<VariableCode>());
  174. extSaveListDic[flag].Add(code);
  175. }
  176. }
  177. }
  178. public static List<VariableCode> GetExtSaveList(VariableCode flag)
  179. {
  180. VariableCode gFlag = flag &
  181. (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__INTEGER__);
  182. if (!extSaveListDic.ContainsKey(gFlag))
  183. return new List<VariableCode>();
  184. return extSaveListDic[gFlag];
  185. }
  186. public static VariableIdentifier GetVariableId(VariableCode code)
  187. {
  188. return new VariableIdentifier(code);
  189. }
  190. public static VariableIdentifier GetVariableId(string key)
  191. {
  192. return GetVariableId(key, null);
  193. }
  194. public static VariableIdentifier GetVariableId(string key, string subStr)
  195. {
  196. VariableCode ret = VariableCode.__NULL__;
  197. if (string.IsNullOrEmpty(key))
  198. return null;
  199. if (Config.Config.ICVariable)
  200. key = key.ToUpper();
  201. if (subStr != null)
  202. {
  203. if (Config.Config.ICFunction)
  204. subStr = subStr.ToUpper();
  205. if (localvarNameDic.TryGetValue(key, out ret))
  206. return new VariableIdentifier(ret, subStr);
  207. if (nameDic.ContainsKey(key))
  208. throw new CodeEE("ローカル変数でない変数" + key + "に対して@が使われました");
  209. throw new CodeEE("@の使い方が不正です");
  210. }
  211. nameDic.TryGetValue(key, out ret);
  212. return new VariableIdentifier(ret);
  213. }
  214. public override string ToString()
  215. {
  216. return code.ToString();
  217. }
  218. }
  219. }