VariableData.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. using System;
  2. using System.Collections.Generic;
  3. using NTERA.EmuEra.Game.EraEmu.GameProc;
  4. using NTERA.EmuEra.Game.EraEmu.Sub;
  5. namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
  6. {
  7. /// <summary>
  8. /// 変数全部
  9. /// </summary>
  10. internal sealed partial class VariableData : IDisposable
  11. {
  12. readonly Int64[] dataInteger;
  13. readonly string[] dataString;
  14. readonly Int64[][] dataIntegerArray;
  15. readonly string[][] dataStringArray;
  16. readonly Int64[][,] dataIntegerArray2D;
  17. readonly string[][,] dataStringArray2D;
  18. readonly Int64[][, ,] dataIntegerArray3D;
  19. readonly string[][, ,] dataStringArray3D;
  20. //readonly VariableLocal<Int64, Int64Calculator> localVars;
  21. //readonly VariableLocal<string, StringCalculator> localString;
  22. //readonly VariableLocal<Int64, Int64Calculator> argVars;
  23. //readonly VariableLocal<string, StringCalculator> argString;
  24. readonly List<CharacterData> characterList;
  25. public Int64[] DataInteger => dataInteger;
  26. public string[] DataString => dataString;
  27. public Int64[][] DataIntegerArray => dataIntegerArray;
  28. public string[][] DataStringArray => dataStringArray;
  29. public Int64[][,] DataIntegerArray2D => dataIntegerArray2D;
  30. public string[][,] DataStringArray2D => dataStringArray2D;
  31. public Int64[][, ,] DataIntegerArray3D => dataIntegerArray3D;
  32. public string[][, ,] DataStringArray3D => dataStringArray3D;
  33. //public VariableLocal<Int64, Int64Calculator> LocalVars { get { return localVars; } }
  34. //public VariableLocal<string, StringCalculator> LocalString { get { return localString; } }
  35. //public VariableLocal<Int64, Int64Calculator> ArgVars { get { return argVars; } }
  36. //public VariableLocal<string, StringCalculator> ArgString { get { return argString; } }
  37. public List<CharacterData> CharacterList => characterList;
  38. readonly GameBase gamebase;
  39. readonly ConstantData constant;
  40. internal GameBase GameBase => gamebase;
  41. internal ConstantData Constant => constant;
  42. public Int64 LastLoadVersion = -1;
  43. public Int64 LastLoadNo = -1;
  44. public string LastLoadText = "";
  45. Dictionary<string, VariableToken> varTokenDic = new Dictionary<string, VariableToken>();
  46. Dictionary<string, VariableLocal> localvarTokenDic = new Dictionary<string, VariableLocal>();
  47. /// <summary>
  48. /// ユーザー変数のうちStaticかつ非Globalなもの。ERHでのDIM(非GLOBAL) と関数でのDIM (STATIC)の両方。ロードやリセットで初期化が必要。キャラクタ変数は除く。
  49. /// </summary>
  50. List<UserDefinedVariableToken> userDefinedStaticVarList = new List<UserDefinedVariableToken>();
  51. /// <summary>
  52. /// ユーザー広域変数のうちグローバル属性持ち。
  53. /// </summary>
  54. List<UserDefinedVariableToken> userDefinedGlobalVarList = new List<UserDefinedVariableToken>();
  55. /// <summary>
  56. /// ユーザー広域変数のうちセーブされるもの。グローバル、キャラクタ変数は除く。
  57. /// </summary>
  58. List<UserDefinedVariableToken>[] userDefinedSaveVarList = new List<UserDefinedVariableToken>[6];
  59. /// <summary>
  60. /// ユーザー広域変数のうち、グローバルかつセーブされるもの。
  61. /// </summary>
  62. List<UserDefinedVariableToken>[] userDefinedGlobalSaveVarList = new List<UserDefinedVariableToken>[6];
  63. /// <summary>
  64. /// ユーザー広域変数のうち、キャラクタ変数であるもの。初期化やセーブされるかどうかはCharacterDataの方で判断。
  65. /// </summary>
  66. public List<UserDefinedCharaVariableToken> UserDefinedCharaVarList = new List<UserDefinedCharaVariableToken>();
  67. public VariableData(GameBase gamebase, ConstantData constant)
  68. {
  69. this.gamebase = gamebase;
  70. this.constant = constant;
  71. characterList = new List<CharacterData>();
  72. //localVars = new VariableLocal<Int64, Int64Calculator>(constant.VariableIntArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.LOCAL)]);
  73. //localString = new VariableLocal<string, StringCalculator>(constant.VariableStrArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.LOCALS)]);
  74. //argVars = new VariableLocal<Int64, Int64Calculator>(constant.VariableIntArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.ARG)]);
  75. //argString = new VariableLocal<string, StringCalculator>(constant.VariableStrArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.ARGS)]);
  76. dataInteger = new Int64[(int)VariableCode.__COUNT_INTEGER__];
  77. dataIntegerArray = new Int64[(int)VariableCode.__COUNT_INTEGER_ARRAY__][];
  78. for (int i = 0; i < dataIntegerArray.Length; i++)
  79. dataIntegerArray[i] = new Int64[constant.VariableIntArrayLength[i]];
  80. dataString = new string[(int)VariableCode.__COUNT_STRING__];
  81. dataStringArray = new string[(int)VariableCode.__COUNT_STRING_ARRAY__][];
  82. for (int i = 0; i < dataStringArray.Length; i++)
  83. dataStringArray[i] = new string[constant.VariableStrArrayLength[i]];
  84. dataIntegerArray2D = new Int64[(int)VariableCode.__COUNT_INTEGER_ARRAY_2D__][,];
  85. for (int i = 0; i < dataIntegerArray2D.Length; i++)
  86. {
  87. Int64 length64 = constant.VariableIntArray2DLength[i];
  88. int length = (int)(length64 >> 32);
  89. int length2 = (int)(length64 & 0x7FFFFFFF);
  90. dataIntegerArray2D[i] = new Int64[length, length2];
  91. }
  92. dataStringArray2D = new string[(int)VariableCode.__COUNT_STRING_ARRAY_2D__][,];
  93. for (int i = 0; i < dataStringArray2D.Length; i++)
  94. {
  95. Int64 length64 = constant.VariableStrArray2DLength[i];
  96. int length = (int)(length64 >> 32);
  97. int length2 = (int)(length64 & 0x7FFFFFFF);
  98. dataStringArray2D[i] = new string[length, length2];
  99. }
  100. dataIntegerArray3D = new Int64[(int)VariableCode.__COUNT_INTEGER_ARRAY_3D__][, ,];
  101. for (int i = 0; i < dataIntegerArray3D.Length; i++)
  102. {
  103. Int64 length64 = constant.VariableIntArray3DLength[i];
  104. int length = (int)(length64 >> 40);
  105. int length2 = (int)((length64 >> 20) & 0xFFFFF);
  106. int length3 = (int)(length64 & 0xFFFFF);
  107. dataIntegerArray3D[i] = new Int64[length, length2, length3];
  108. }
  109. dataStringArray3D = new string[(int)VariableCode.__COUNT_STRING_ARRAY_3D__][, ,];
  110. for (int i = 0; i < dataStringArray3D.Length; i++)
  111. {
  112. Int64 length64 = constant.VariableStrArray3DLength[i];
  113. int length = (int)(length64 >> 40);
  114. int length2 = (int)((length64 >> 20) & 0xFFFFF);
  115. int length3 = (int)(length64 & 0xFFFFF);
  116. dataStringArray3D[i] = new string[length, length2, length3];
  117. }
  118. for (int i = 0; i < 6; i++)
  119. {
  120. userDefinedSaveVarList[i] = new List<UserDefinedVariableToken>();
  121. userDefinedGlobalSaveVarList[i] = new List<UserDefinedVariableToken>();
  122. }
  123. SetDefaultValue(constant);
  124. varTokenDic.Add("DAY", new Int1DVariableToken(VariableCode.DAY, this));
  125. varTokenDic.Add("MONEY", new Int1DVariableToken(VariableCode.MONEY, this));
  126. varTokenDic.Add("ITEM", new Int1DVariableToken(VariableCode.ITEM, this));
  127. varTokenDic.Add("FLAG", new Int1DVariableToken(VariableCode.FLAG, this));
  128. varTokenDic.Add("TFLAG", new Int1DVariableToken(VariableCode.TFLAG, this));
  129. varTokenDic.Add("UP", new Int1DVariableToken(VariableCode.UP, this));
  130. varTokenDic.Add("PALAMLV", new Int1DVariableToken(VariableCode.PALAMLV, this));
  131. varTokenDic.Add("EXPLV", new Int1DVariableToken(VariableCode.EXPLV, this));
  132. varTokenDic.Add("EJAC", new Int1DVariableToken(VariableCode.EJAC, this));
  133. varTokenDic.Add("DOWN", new Int1DVariableToken(VariableCode.DOWN, this));
  134. varTokenDic.Add("RESULT", new Int1DVariableToken(VariableCode.RESULT, this));
  135. varTokenDic.Add("COUNT", new Int1DVariableToken(VariableCode.COUNT, this));
  136. varTokenDic.Add("TARGET", new Int1DVariableToken(VariableCode.TARGET, this));
  137. varTokenDic.Add("ASSI", new Int1DVariableToken(VariableCode.ASSI, this));
  138. varTokenDic.Add("MASTER", new Int1DVariableToken(VariableCode.MASTER, this));
  139. varTokenDic.Add("NOITEM", new Int1DVariableToken(VariableCode.NOITEM, this));
  140. varTokenDic.Add("LOSEBASE", new Int1DVariableToken(VariableCode.LOSEBASE, this));
  141. varTokenDic.Add("SELECTCOM", new Int1DVariableToken(VariableCode.SELECTCOM, this));
  142. varTokenDic.Add("ASSIPLAY", new Int1DVariableToken(VariableCode.ASSIPLAY, this));
  143. varTokenDic.Add("PREVCOM", new Int1DVariableToken(VariableCode.PREVCOM, this));
  144. varTokenDic.Add("TIME", new Int1DVariableToken(VariableCode.TIME, this));
  145. varTokenDic.Add("ITEMSALES", new Int1DVariableToken(VariableCode.ITEMSALES, this));
  146. varTokenDic.Add("PLAYER", new Int1DVariableToken(VariableCode.PLAYER, this));
  147. varTokenDic.Add("NEXTCOM", new Int1DVariableToken(VariableCode.NEXTCOM, this));
  148. varTokenDic.Add("PBAND", new Int1DVariableToken(VariableCode.PBAND, this));
  149. varTokenDic.Add("BOUGHT", new Int1DVariableToken(VariableCode.BOUGHT, this));
  150. varTokenDic.Add("A", new Int1DVariableToken(VariableCode.A, this));
  151. varTokenDic.Add("B", new Int1DVariableToken(VariableCode.B, this));
  152. varTokenDic.Add("C", new Int1DVariableToken(VariableCode.C, this));
  153. varTokenDic.Add("D", new Int1DVariableToken(VariableCode.D, this));
  154. varTokenDic.Add("E", new Int1DVariableToken(VariableCode.E, this));
  155. varTokenDic.Add("F", new Int1DVariableToken(VariableCode.F, this));
  156. varTokenDic.Add("G", new Int1DVariableToken(VariableCode.G, this));
  157. varTokenDic.Add("H", new Int1DVariableToken(VariableCode.H, this));
  158. varTokenDic.Add("I", new Int1DVariableToken(VariableCode.I, this));
  159. varTokenDic.Add("J", new Int1DVariableToken(VariableCode.J, this));
  160. varTokenDic.Add("K", new Int1DVariableToken(VariableCode.K, this));
  161. varTokenDic.Add("L", new Int1DVariableToken(VariableCode.L, this));
  162. varTokenDic.Add("M", new Int1DVariableToken(VariableCode.M, this));
  163. varTokenDic.Add("N", new Int1DVariableToken(VariableCode.N, this));
  164. varTokenDic.Add("O", new Int1DVariableToken(VariableCode.O, this));
  165. varTokenDic.Add("P", new Int1DVariableToken(VariableCode.P, this));
  166. varTokenDic.Add("Q", new Int1DVariableToken(VariableCode.Q, this));
  167. varTokenDic.Add("R", new Int1DVariableToken(VariableCode.R, this));
  168. varTokenDic.Add("S", new Int1DVariableToken(VariableCode.S, this));
  169. varTokenDic.Add("T", new Int1DVariableToken(VariableCode.T, this));
  170. varTokenDic.Add("U", new Int1DVariableToken(VariableCode.U, this));
  171. varTokenDic.Add("V", new Int1DVariableToken(VariableCode.V, this));
  172. varTokenDic.Add("W", new Int1DVariableToken(VariableCode.W, this));
  173. varTokenDic.Add("X", new Int1DVariableToken(VariableCode.X, this));
  174. varTokenDic.Add("Y", new Int1DVariableToken(VariableCode.Y, this));
  175. varTokenDic.Add("Z", new Int1DVariableToken(VariableCode.Z, this));
  176. varTokenDic.Add("GLOBAL", new Int1DVariableToken(VariableCode.GLOBAL, this));
  177. varTokenDic.Add("RANDDATA", new Int1DVariableToken(VariableCode.RANDDATA, this));
  178. varTokenDic.Add("SAVESTR", new Str1DVariableToken(VariableCode.SAVESTR, this));
  179. varTokenDic.Add("TSTR", new Str1DVariableToken(VariableCode.TSTR, this));
  180. varTokenDic.Add("STR", new Str1DVariableToken(VariableCode.STR, this));
  181. varTokenDic.Add("RESULTS", new Str1DVariableToken(VariableCode.RESULTS, this));
  182. varTokenDic.Add("GLOBALS", new Str1DVariableToken(VariableCode.GLOBALS, this));
  183. varTokenDic.Add("SAVEDATA_TEXT", new StrVariableToken(VariableCode.SAVEDATA_TEXT, this));
  184. varTokenDic.Add("ISASSI", new CharaIntVariableToken(VariableCode.ISASSI, this));
  185. varTokenDic.Add("NO", new CharaIntVariableToken(VariableCode.NO, this));
  186. varTokenDic.Add("BASE", new CharaInt1DVariableToken(VariableCode.BASE, this));
  187. varTokenDic.Add("MAXBASE", new CharaInt1DVariableToken(VariableCode.MAXBASE, this));
  188. varTokenDic.Add("ABL", new CharaInt1DVariableToken(VariableCode.ABL, this));
  189. varTokenDic.Add("TALENT", new CharaInt1DVariableToken(VariableCode.TALENT, this));
  190. varTokenDic.Add("EXP", new CharaInt1DVariableToken(VariableCode.EXP, this));
  191. varTokenDic.Add("MARK", new CharaInt1DVariableToken(VariableCode.MARK, this));
  192. varTokenDic.Add("PALAM", new CharaInt1DVariableToken(VariableCode.PALAM, this));
  193. varTokenDic.Add("SOURCE", new CharaInt1DVariableToken(VariableCode.SOURCE, this));
  194. varTokenDic.Add("EX", new CharaInt1DVariableToken(VariableCode.EX, this));
  195. varTokenDic.Add("CFLAG", new CharaInt1DVariableToken(VariableCode.CFLAG, this));
  196. varTokenDic.Add("JUEL", new CharaInt1DVariableToken(VariableCode.JUEL, this));
  197. varTokenDic.Add("RELATION", new CharaInt1DVariableToken(VariableCode.RELATION, this));
  198. varTokenDic.Add("EQUIP", new CharaInt1DVariableToken(VariableCode.EQUIP, this));
  199. varTokenDic.Add("TEQUIP", new CharaInt1DVariableToken(VariableCode.TEQUIP, this));
  200. varTokenDic.Add("STAIN", new CharaInt1DVariableToken(VariableCode.STAIN, this));
  201. varTokenDic.Add("GOTJUEL", new CharaInt1DVariableToken(VariableCode.GOTJUEL, this));
  202. varTokenDic.Add("NOWEX", new CharaInt1DVariableToken(VariableCode.NOWEX, this));
  203. varTokenDic.Add("DOWNBASE", new CharaInt1DVariableToken(VariableCode.DOWNBASE, this));
  204. varTokenDic.Add("CUP", new CharaInt1DVariableToken(VariableCode.CUP, this));
  205. varTokenDic.Add("CDOWN", new CharaInt1DVariableToken(VariableCode.CDOWN, this));
  206. varTokenDic.Add("TCVAR", new CharaInt1DVariableToken(VariableCode.TCVAR, this));
  207. varTokenDic.Add("NAME", new CharaStrVariableToken(VariableCode.NAME, this));
  208. varTokenDic.Add("CALLNAME", new CharaStrVariableToken(VariableCode.CALLNAME, this));
  209. varTokenDic.Add("NICKNAME", new CharaStrVariableToken(VariableCode.NICKNAME, this));
  210. varTokenDic.Add("MASTERNAME", new CharaStrVariableToken(VariableCode.MASTERNAME, this));
  211. varTokenDic.Add("CSTR", new CharaStr1DVariableToken(VariableCode.CSTR, this));
  212. varTokenDic.Add("CDFLAG", new CharaInt2DVariableToken(VariableCode.CDFLAG, this));
  213. varTokenDic.Add("DITEMTYPE", new Int2DVariableToken(VariableCode.DITEMTYPE, this));
  214. varTokenDic.Add("DA", new Int2DVariableToken(VariableCode.DA, this));
  215. varTokenDic.Add("DB", new Int2DVariableToken(VariableCode.DB, this));
  216. varTokenDic.Add("DC", new Int2DVariableToken(VariableCode.DC, this));
  217. varTokenDic.Add("DD", new Int2DVariableToken(VariableCode.DD, this));
  218. varTokenDic.Add("DE", new Int2DVariableToken(VariableCode.DE, this));
  219. varTokenDic.Add("TA", new Int3DVariableToken(VariableCode.TA, this));
  220. varTokenDic.Add("TB", new Int3DVariableToken(VariableCode.TB, this));
  221. varTokenDic.Add("ITEMPRICE", new Int1DConstantToken(VariableCode.ITEMPRICE, this, constant.ItemPrice));
  222. varTokenDic.Add("ABLNAME", new Str1DConstantToken(VariableCode.ABLNAME, this, "Abl"));
  223. varTokenDic.Add("TALENTNAME", new Str1DConstantToken(VariableCode.TALENTNAME, this, "Talent"));
  224. varTokenDic.Add("EXPNAME", new Str1DConstantToken(VariableCode.EXPNAME, this, "Exp"));
  225. varTokenDic.Add("MARKNAME", new Str1DConstantToken(VariableCode.MARKNAME, this, "Mark"));
  226. varTokenDic.Add("PALAMNAME", new Str1DConstantToken(VariableCode.PALAMNAME, this, "Palam"));
  227. varTokenDic.Add("ITEMNAME", new Str1DConstantToken(VariableCode.ITEMNAME, this, "Item"));
  228. varTokenDic.Add("TRAINNAME", new Str1DConstantToken(VariableCode.TRAINNAME, this, "Train"));
  229. varTokenDic.Add("BASENAME", new Str1DConstantToken(VariableCode.BASENAME, this, "Base"));
  230. varTokenDic.Add("SOURCENAME", new Str1DConstantToken(VariableCode.SOURCENAME, this, "Source"));
  231. varTokenDic.Add("EXNAME", new Str1DConstantToken(VariableCode.EXNAME, this, "Ex"));
  232. varTokenDic.Add("EQUIPNAME", new Str1DConstantToken(VariableCode.EQUIPNAME, this,"EQUIP"));
  233. varTokenDic.Add("TEQUIPNAME", new Str1DConstantToken(VariableCode.TEQUIPNAME, this, "TEQUIP"));
  234. varTokenDic.Add("FLAGNAME", new Str1DConstantToken(VariableCode.FLAGNAME, this, "Flag"));
  235. varTokenDic.Add("TFLAGNAME", new Str1DConstantToken(VariableCode.TFLAGNAME, this, "TFLAG"));
  236. varTokenDic.Add("CFLAGNAME", new Str1DConstantToken(VariableCode.CFLAGNAME, this, "Cflag"));
  237. varTokenDic.Add("TCVARNAME", new Str1DConstantToken(VariableCode.TCVARNAME, this, "Tcvar"));
  238. varTokenDic.Add("CSTRNAME", new Str1DConstantToken(VariableCode.CSTRNAME, this, "CSTR"));
  239. varTokenDic.Add("STAINNAME", new Str1DConstantToken(VariableCode.STAINNAME, this, "Stain"));
  240. varTokenDic.Add("CDFLAGNAME1", new Str1DConstantToken(VariableCode.CDFLAGNAME1, this, "Cdflag1"));
  241. varTokenDic.Add("CDFLAGNAME2", new Str1DConstantToken(VariableCode.CDFLAGNAME2, this, "Cdflag2"));
  242. varTokenDic.Add("STRNAME", new Str1DConstantToken(VariableCode.STRNAME, this, "Str"));
  243. varTokenDic.Add("TSTRNAME", new Str1DConstantToken(VariableCode.TSTRNAME, this, "TSTR"));
  244. varTokenDic.Add("SAVESTRNAME", new Str1DConstantToken(VariableCode.SAVESTRNAME, this, "SaveStr"));
  245. varTokenDic.Add("GLOBALNAME", new Str1DConstantToken(VariableCode.GLOBALNAME, this, "GLOBAL"));
  246. varTokenDic.Add("GLOBALSNAME", new Str1DConstantToken(VariableCode.GLOBALSNAME, this, "GLOBALS"));
  247. StrConstantToken token = new StrConstantToken(VariableCode.GAMEBASE_AUTHOR, this, gamebase.ScriptAutherName);
  248. varTokenDic.Add("GAMEBASE_AUTHER", token);
  249. varTokenDic.Add("GAMEBASE_AUTHOR", token);
  250. varTokenDic.Add("GAMEBASE_INFO", new StrConstantToken(VariableCode.GAMEBASE_INFO, this, gamebase.ScriptDetail));
  251. varTokenDic.Add("GAMEBASE_YEAR", new StrConstantToken(VariableCode.GAMEBASE_YEAR, this, gamebase.ScriptYear));
  252. varTokenDic.Add("GAMEBASE_TITLE", new StrConstantToken(VariableCode.GAMEBASE_TITLE, this, gamebase.ScriptTitle));
  253. varTokenDic.Add("GAMEBASE_GAMECODE", new IntConstantToken(VariableCode.GAMEBASE_GAMECODE, this, gamebase.ScriptUniqueCode));
  254. varTokenDic.Add("GAMEBASE_VERSION", new IntConstantToken(VariableCode.GAMEBASE_VERSION, this, gamebase.ScriptVersion));
  255. varTokenDic.Add("GAMEBASE_ALLOWVERSION", new IntConstantToken(VariableCode.GAMEBASE_ALLOWVERSION, this, gamebase.ScriptCompatibleMinVersion));
  256. varTokenDic.Add("GAMEBASE_DEFAULTCHARA", new IntConstantToken(VariableCode.GAMEBASE_DEFAULTCHARA, this, gamebase.DefaultCharacter));
  257. varTokenDic.Add("GAMEBASE_NOITEM", new IntConstantToken(VariableCode.GAMEBASE_NOITEM, this, gamebase.DefaultNoItem));
  258. VariableToken rand;
  259. if (Config.Config.CompatiRAND)
  260. rand = new CompatiRandToken(VariableCode.RAND, this);
  261. else
  262. rand = new RandToken(VariableCode.RAND, this);
  263. varTokenDic.Add("RAND", rand);
  264. varTokenDic.Add("CHARANUM", new CHARANUM_Token(VariableCode.CHARANUM, this));
  265. varTokenDic.Add("LASTLOAD_TEXT", new LASTLOAD_TEXT_Token(VariableCode.LASTLOAD_TEXT, this));
  266. varTokenDic.Add("LASTLOAD_VERSION", new LASTLOAD_VERSION_Token(VariableCode.LASTLOAD_VERSION, this));
  267. varTokenDic.Add("LASTLOAD_NO", new LASTLOAD_NO_Token(VariableCode.LASTLOAD_NO, this));
  268. varTokenDic.Add("LINECOUNT", new LINECOUNT_Token(VariableCode.LINECOUNT, this));
  269. varTokenDic.Add("ISTIMEOUT", new ISTIMEOUTToken(VariableCode.ISTIMEOUT, this));
  270. varTokenDic.Add("__INT_MAX__", new __INT_MAX__Token(VariableCode.__INT_MAX__, this));
  271. varTokenDic.Add("__INT_MIN__", new __INT_MIN__Token(VariableCode.__INT_MIN__, this));
  272. varTokenDic.Add("EMUERA_VERSION", new EMUERA_VERSIONToken(VariableCode.EMUERA_VERSION, this));
  273. varTokenDic.Add("WINDOW_TITLE", new WINDOW_TITLE_Token(VariableCode.WINDOW_TITLE, this));
  274. varTokenDic.Add("MONEYLABEL", new MONEYLABEL_Token(VariableCode.MONEYLABEL, this));
  275. varTokenDic.Add("DRAWLINESTR", new DRAWLINESTR_Token(VariableCode.DRAWLINESTR, this));
  276. if (!Program.DebugMode)
  277. {
  278. varTokenDic.Add("__FILE__", new EmptyStrToken(VariableCode.__FILE__, this));
  279. varTokenDic.Add("__FUNCTION__", new EmptyStrToken(VariableCode.__FUNCTION__, this));
  280. varTokenDic.Add("__LINE__", new EmptyIntToken(VariableCode.__LINE__, this));
  281. }
  282. else
  283. {
  284. varTokenDic.Add("__FILE__", new Debug__FILE__Token(VariableCode.__FILE__, this));
  285. varTokenDic.Add("__FUNCTION__", new Debug__FUNCTION__Token(VariableCode.__FUNCTION__, this));
  286. varTokenDic.Add("__LINE__", new Debug__LINE__Token(VariableCode.__LINE__, this));
  287. }
  288. int size = constant.VariableIntArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.LOCAL)];
  289. localvarTokenDic.Add("LOCAL", new VariableLocal(VariableCode.LOCAL, size, CreateLocalInt));
  290. size = constant.VariableIntArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.ARG)];
  291. localvarTokenDic.Add("ARG", new VariableLocal(VariableCode.ARG, size, CreateLocalInt));
  292. size = constant.VariableStrArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.LOCALS)];
  293. localvarTokenDic.Add("LOCALS", new VariableLocal(VariableCode.LOCALS, size, CreateLocalStr));
  294. size = constant.VariableStrArrayLength[(int)(VariableCode.__LOWERCASE__ & VariableCode.ARGS)];
  295. localvarTokenDic.Add("ARGS", new VariableLocal(VariableCode.ARGS, size, CreateLocalStr));
  296. }
  297. private LocalVariableToken CreateLocalInt(VariableCode varCode, string subKey, int size)
  298. {
  299. return new LocalInt1DVariableToken(varCode, this, subKey, size);
  300. }
  301. private LocalVariableToken CreateLocalStr(VariableCode varCode, string subKey, int size)
  302. {
  303. return new LocalStr1DVariableToken(varCode, this, subKey, size);
  304. }
  305. public Dictionary<string, VariableToken> GetVarTokenDicClone()
  306. {
  307. Dictionary<string, VariableToken> clone = new Dictionary<string, VariableToken>();
  308. foreach (KeyValuePair<string, VariableToken> pair in varTokenDic)
  309. clone.Add(pair.Key, pair.Value);
  310. return clone;
  311. }
  312. public Dictionary<string, VariableToken> GetVarTokenDic()
  313. {
  314. return varTokenDic;
  315. }
  316. public Dictionary<string, VariableLocal> GetLocalvarTokenDic() { return localvarTokenDic; }
  317. public VariableToken GetSystemVariableToken(string str)
  318. {
  319. return varTokenDic[str];
  320. }
  321. public UserDefinedCharaVariableToken CreateUserDefCharaVariable(UserDefinedVariableData data)
  322. {
  323. UserDefinedCharaVariableToken ret = null;
  324. if (data.CharaData)
  325. {
  326. int index = UserDefinedCharaVarList.Count;
  327. if (data.TypeIsStr)
  328. switch (data.Dimension)
  329. {
  330. case 1: ret = new UserDefinedCharaStr1DVariableToken(data, this, index); break;
  331. case 2: ret = new UserDefinedCharaStr2DVariableToken(data, this, index); break;
  332. default: throw new ExeEE("異常な変数宣言");
  333. }
  334. else
  335. switch (data.Dimension)
  336. {
  337. case 1: ret = new UserDefinedCharaInt1DVariableToken(data, this, index); break;
  338. case 2: ret = new UserDefinedCharaInt2DVariableToken(data, this, index); break;
  339. default: throw new ExeEE("異常な変数宣言");
  340. }
  341. }
  342. UserDefinedCharaVarList.Add(ret);
  343. return ret;
  344. }
  345. public UserDefinedVariableToken CreateUserDefVariable(UserDefinedVariableData data)
  346. {
  347. UserDefinedVariableToken ret = null;
  348. if (data.TypeIsStr)
  349. switch (data.Dimension)
  350. {
  351. case 1: ret = new StaticStr1DVariableToken(data); break;
  352. case 2: ret = new StaticStr2DVariableToken(data); break;
  353. case 3: ret = new StaticStr3DVariableToken(data); break;
  354. default: throw new ExeEE("異常な変数宣言");
  355. }
  356. else
  357. switch (data.Dimension)
  358. {
  359. case 1: ret = new StaticInt1DVariableToken(data); break;
  360. case 2: ret = new StaticInt2DVariableToken(data); break;
  361. case 3: ret = new StaticInt3DVariableToken(data); break;
  362. default: throw new ExeEE("異常な変数宣言");
  363. }
  364. if (ret.IsGlobal)
  365. userDefinedGlobalVarList.Add(ret);
  366. else
  367. userDefinedStaticVarList.Add(ret);
  368. if (ret.IsSavedata)
  369. {
  370. int type = ret.Dimension * 2 - 2;
  371. if (!ret.IsString)
  372. type++;
  373. if (ret.IsGlobal)
  374. userDefinedGlobalSaveVarList[type].Add(ret);
  375. else
  376. userDefinedSaveVarList[type].Add(ret);
  377. }
  378. return ret;
  379. }
  380. public UserDefinedVariableToken CreatePrivateVariable(UserDefinedVariableData data)
  381. {
  382. UserDefinedVariableToken ret = null;
  383. if (data.Reference)//参照型
  384. {//すべて非Staticなはず
  385. if (data.TypeIsStr)
  386. {
  387. switch (data.Dimension)
  388. {
  389. case 1: ret = new ReferenceStr1DToken(data); break;
  390. case 2: ret = new ReferenceStr2DToken(data); break;
  391. case 3: ret = new ReferenceStr3DToken(data); break;
  392. default: throw new ExeEE("異常な変数宣言");
  393. }
  394. }
  395. else
  396. {
  397. switch (data.Dimension)
  398. {
  399. case 1: ret = new ReferenceInt1DToken(data); break;
  400. case 2: ret = new ReferenceInt2DToken(data); break;
  401. case 3: ret = new ReferenceInt3DToken(data); break;
  402. default: throw new ExeEE("異常な変数宣言");
  403. }
  404. }
  405. }
  406. else if (data.Static)
  407. {
  408. if (data.TypeIsStr)
  409. {
  410. switch (data.Dimension)
  411. {
  412. case 1: ret = new StaticStr1DVariableToken(data); break;
  413. case 2: ret = new StaticStr2DVariableToken(data); break;
  414. case 3: ret = new StaticStr3DVariableToken(data); break;
  415. default: throw new ExeEE("異常な変数宣言");
  416. }
  417. }
  418. else
  419. {
  420. switch (data.Dimension)
  421. {
  422. case 1: ret = new StaticInt1DVariableToken(data); break;
  423. case 2: ret = new StaticInt2DVariableToken(data); break;
  424. case 3: ret = new StaticInt3DVariableToken(data); break;
  425. default: throw new ExeEE("異常な変数宣言");
  426. }
  427. }
  428. userDefinedStaticVarList.Add(ret);
  429. }
  430. else
  431. {
  432. if (data.TypeIsStr)
  433. {
  434. switch (data.Dimension)
  435. {
  436. case 1: ret = new PrivateStr1DVariableToken(data); break;
  437. case 2: ret = new PrivateStr2DVariableToken(data); break;
  438. case 3: ret = new PrivateStr3DVariableToken(data); break;
  439. default: throw new ExeEE("異常な変数宣言");
  440. }
  441. }
  442. else
  443. {
  444. switch (data.Dimension)
  445. {
  446. case 1: ret = new PrivateInt1DVariableToken(data); break;
  447. case 2: ret = new PrivateInt2DVariableToken(data); break;
  448. case 3: ret = new PrivateInt3DVariableToken(data); break;
  449. default: throw new ExeEE("異常な変数宣言");
  450. }
  451. }
  452. }
  453. return ret;
  454. }
  455. public void SetDefaultGlobalValue()
  456. {
  457. Int64[] globalInt = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.GLOBAL];
  458. string[] globalStr = dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.GLOBALS];
  459. for (int i = 0; i < globalInt.Length; i++)
  460. globalInt[i] = 0;
  461. for (int i = 0; i < globalStr.Length; i++)
  462. globalStr[i] = null;
  463. foreach (UserDefinedVariableToken var in userDefinedGlobalVarList)
  464. var.SetDefault();
  465. }
  466. public void SetDefaultLocalValue()
  467. {
  468. foreach (VariableLocal local in localvarTokenDic.Values)
  469. local.SetDefault();
  470. foreach (UserDefinedVariableToken var in userDefinedStaticVarList)
  471. var.SetDefault();
  472. }
  473. public void ClearLocalValue()
  474. {
  475. foreach (VariableLocal local in localvarTokenDic.Values)
  476. local.Clear();
  477. }
  478. /// <summary>
  479. /// ローカルとグローバル以外初期化
  480. /// </summary>
  481. public void SetDefaultValue(ConstantData constant)
  482. {
  483. for (int i = 0; i < dataInteger.Length; i++)
  484. dataInteger[i] = 0;
  485. for (int i = 0; i < dataIntegerArray.Length; i++)
  486. {
  487. switch (i)
  488. {
  489. case (int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBAL):
  490. break;
  491. case (int)(VariableCode.__LOWERCASE__ & VariableCode.ITEMPRICE):
  492. //constant.ItemPrice.CopyTo(dataIntegerArray[i], 0);
  493. Buffer.BlockCopy(constant.ItemPrice, 0, dataIntegerArray[i], 0, 8 * dataIntegerArray[i].Length);
  494. break;
  495. default:
  496. for (int j = 0; j < dataIntegerArray[i].Length; j++)
  497. dataIntegerArray[i][j] = 0;
  498. break;
  499. }
  500. }
  501. for (int i = 0; i < dataString.Length; i++)
  502. dataString[i] = null;
  503. for (int i = 0; i < dataStringArray.Length; i++)
  504. {
  505. switch (i)
  506. {
  507. case (int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBALS):
  508. break;
  509. case (int)(VariableCode.__LOWERCASE__ & VariableCode.STR):
  510. {
  511. string[] csvStrData = constant.GetCsvNameList(VariableCode.__DUMMY_STR__);
  512. csvStrData.CopyTo(dataStringArray[i], 0);
  513. break;
  514. }
  515. default:
  516. for (int j = 0; j < dataStringArray[i].Length; j++)
  517. dataStringArray[i][j] = null;
  518. break;
  519. }
  520. }
  521. for (int i = 0; i < dataIntegerArray2D.Length; i++)
  522. {
  523. Int64[,] array2D = dataIntegerArray2D[i];
  524. int length0 = array2D.GetLength(0);
  525. int length1 = array2D.GetLength(1);
  526. for (int x = 0; x < length0; x++)
  527. for (int y = 0; y < length1; y++)
  528. array2D[x, y] = 0;
  529. }
  530. for (int i = 0; i < dataStringArray2D.Length; i++)
  531. {
  532. string[,] array2D = dataStringArray2D[i];
  533. int length0 = array2D.GetLength(0);
  534. int length1 = array2D.GetLength(1);
  535. for (int x = 0; x < length0; x++)
  536. for (int y = 0; y < length1; y++)
  537. array2D[x, y] = null;
  538. }
  539. for (int i = 0; i < dataIntegerArray3D.Length; i++)
  540. {
  541. Int64[, ,] array3D = dataIntegerArray3D[i];
  542. int length0 = array3D.GetLength(0);
  543. int length1 = array3D.GetLength(1);
  544. int length2 = array3D.GetLength(2);
  545. for (int x = 0; x < length0; x++)
  546. for (int y = 0; y < length1; y++)
  547. for (int z = 0; z < length2; z++)
  548. array3D[x, y, z] = 0;
  549. }
  550. for (int i = 0; i < dataStringArray3D.Length; i++)
  551. {
  552. string[, ,] array3D = dataStringArray3D[i];
  553. int length0 = array3D.GetLength(0);
  554. int length1 = array3D.GetLength(1);
  555. int length2 = array3D.GetLength(2);
  556. for (int x = 0; x < length0; x++)
  557. for (int y = 0; y < length1; y++)
  558. for (int z = 0; z < length2; z++)
  559. array3D[x, y, z] = null;
  560. }
  561. Int64[] palamlv = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.PALAMLV];
  562. List<Int64> defPalam = Config.Config.PalamLvDef;
  563. defPalam.CopyTo(0, palamlv, 0, Math.Min(palamlv.Length, defPalam.Count));
  564. //palamlv[0] = 0;
  565. //palamlv[1] = 100;
  566. //palamlv[2] = 500;
  567. //palamlv[3] = 3000;
  568. //palamlv[4] = 10000;
  569. //palamlv[5] = 30000;
  570. //palamlv[6] = 60000;
  571. //palamlv[7] = 100000;
  572. //palamlv[8] = 150000;
  573. //palamlv[9] = 250000;
  574. Int64[] explv = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXPLV];
  575. List<Int64> defExpLv = Config.Config.ExpLvDef;
  576. defExpLv.CopyTo(0, explv, 0, Math.Min(explv.Length, defExpLv.Count));
  577. //explv[0] = 0;
  578. //explv[1] = 1;
  579. //explv[2] = 4;
  580. //explv[3] = 20;
  581. //explv[4] = 50;
  582. //explv[5] = 200;
  583. //dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ASSIPLAY][0] = 0;
  584. //dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MASTER][0] = 0;
  585. long[] array;
  586. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ASSI];
  587. if (array.Length > 0) array[0] = -1;
  588. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TARGET];
  589. if (array.Length > 0) array[0] = 1;
  590. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.PBAND];
  591. if (array.Length > 0) array[0] = Config.Config.PbandDef;
  592. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EJAC];
  593. if (array.Length > 0) array[0] = 10000;
  594. LastLoadVersion = -1;
  595. LastLoadNo = -1;
  596. LastLoadText = "";
  597. }
  598. const int strCount = (int)VariableCode.__COUNT_SAVE_STRING__;
  599. const int intCount = (int)VariableCode.__COUNT_SAVE_INTEGER__;
  600. const int intArrayCount = (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__;
  601. const int strArrayCount = (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__;
  602. public void SaveToStream(EraDataWriter writer)
  603. {
  604. for (int i = 0; i < strCount; i++)
  605. writer.Write(dataString[i]);
  606. for (int i = 0; i < intCount; i++)
  607. writer.Write(dataInteger[i]);
  608. for (int i = 0; i < intArrayCount; i++)
  609. writer.Write(dataIntegerArray[i]);
  610. for (int i = 0; i < strArrayCount; i++)
  611. writer.Write(dataStringArray[i]);
  612. }
  613. public void LoadFromStream(EraDataReader reader)
  614. {
  615. for (int i = 0; i < strCount; i++)
  616. dataString[i] = reader.ReadString();
  617. for (int i = 0; i < intCount; i++)
  618. dataInteger[i] = reader.ReadInt64();
  619. for (int i = 0; i < intArrayCount; i++)
  620. reader.ReadInt64Array(dataIntegerArray[i]);
  621. for (int i = 0; i < strArrayCount; i++)
  622. reader.ReadStringArray(dataStringArray[i]);
  623. }
  624. public void SaveToStreamExtended(EraDataWriter writer)
  625. {
  626. List<VariableCode> codeList = null;
  627. //dataString
  628. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__STRING__);
  629. foreach (VariableCode code in codeList)
  630. writer.WriteExtended(code.ToString(), dataString[(int)VariableCode.__LOWERCASE__ & (int)code]);
  631. writer.EmuSeparete();
  632. //datainteger
  633. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__INTEGER__);
  634. foreach (VariableCode code in codeList)
  635. writer.WriteExtended(code.ToString(), dataInteger[(int)VariableCode.__LOWERCASE__ & (int)code]);
  636. writer.EmuSeparete();
  637. //dataStringArray
  638. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_1D__ | VariableCode.__STRING__);
  639. foreach (VariableCode code in codeList)
  640. writer.WriteExtended(code.ToString(), dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  641. writer.EmuSeparete();
  642. //dataIntegerArray
  643. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_1D__ | VariableCode.__INTEGER__);
  644. foreach (VariableCode code in codeList)
  645. writer.WriteExtended(code.ToString(), dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  646. writer.EmuSeparete();
  647. //dataStringArray2D
  648. //StringArray2Dの保存は未実装
  649. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_2D__ | VariableCode.__STRING__);
  650. foreach (VariableCode code in codeList)
  651. writer.WriteExtended(code.ToString(), dataStringArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  652. writer.EmuSeparete();
  653. //dataIntegerArray2D
  654. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_2D__ | VariableCode.__INTEGER__);
  655. foreach (VariableCode code in codeList)
  656. writer.WriteExtended(code.ToString(), dataIntegerArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  657. writer.EmuSeparete();
  658. //dataStringArray3D
  659. //StringArray3Dの保存は未実装
  660. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_3D__ | VariableCode.__STRING__);
  661. foreach (VariableCode code in codeList)
  662. writer.WriteExtended(code.ToString(), dataStringArray3D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  663. writer.EmuSeparete();
  664. //dataIntegerArray3D
  665. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_3D__ | VariableCode.__INTEGER__);
  666. foreach (VariableCode code in codeList)
  667. writer.WriteExtended(code.ToString(), dataIntegerArray3D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  668. writer.EmuSeparete();
  669. for (int i = 0; i < 6; i++)
  670. {
  671. foreach (UserDefinedVariableToken var in userDefinedSaveVarList[i])
  672. {
  673. //if (!var.IsSavedata) continue;
  674. switch (i)
  675. {
  676. case 0: writer.WriteExtended(var.Name, (string[])var.GetArray()); break;
  677. case 1: writer.WriteExtended(var.Name, (Int64[])var.GetArray()); break;
  678. case 2: writer.WriteExtended(var.Name, (string[,])var.GetArray()); break;
  679. case 3: writer.WriteExtended(var.Name, (Int64[,])var.GetArray()); break;
  680. case 4: writer.WriteExtended(var.Name, (string[, ,])var.GetArray()); break;
  681. case 5: writer.WriteExtended(var.Name, (Int64[, ,])var.GetArray()); break;
  682. }
  683. }
  684. writer.EmuSeparete();
  685. }
  686. }
  687. public void LoadFromStreamExtended(EraDataReader reader, int version)
  688. {
  689. Dictionary<string, string> strDic = reader.ReadStringExtended();
  690. Dictionary<string, Int64> intDic = reader.ReadInt64Extended();
  691. Dictionary<string, List<string>> strListDic = reader.ReadStringArrayExtended();
  692. Dictionary<string, List<Int64>> intListDic = reader.ReadInt64ArrayExtended();
  693. Dictionary<string, List<string[]>> str2DListDic = reader.ReadStringArray2DExtended();
  694. Dictionary<string, List<Int64[]>> int2DListDic = reader.ReadInt64Array2DExtended();
  695. Dictionary<string, List<List<string[]>>> str3DListDic = reader.ReadStringArray3DExtended();
  696. Dictionary<string, List<List<Int64[]>>> int3DListDic = reader.ReadInt64Array3DExtended();
  697. List<VariableCode> codeList = null;
  698. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__STRING__);
  699. foreach (VariableCode code in codeList)
  700. if (strDic.ContainsKey(code.ToString()))
  701. dataString[(int)VariableCode.__LOWERCASE__ & (int)code] = strDic[code.ToString()];
  702. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__INTEGER__);
  703. foreach (VariableCode code in codeList)
  704. if (intDic.ContainsKey(code.ToString()))
  705. dataInteger[(int)VariableCode.__LOWERCASE__ & (int)code] = intDic[code.ToString()];
  706. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_1D__ | VariableCode.__STRING__);
  707. foreach (VariableCode code in codeList)
  708. if (strListDic.ContainsKey(code.ToString()))
  709. copyListToArray(strListDic[code.ToString()], dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  710. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_1D__ | VariableCode.__INTEGER__);
  711. foreach (VariableCode code in codeList)
  712. if (intListDic.ContainsKey(code.ToString()))
  713. copyListToArray(intListDic[code.ToString()], dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  714. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_2D__ | VariableCode.__STRING__);
  715. foreach (VariableCode code in codeList)
  716. if (str2DListDic.ContainsKey(code.ToString()))
  717. copyListToArray2D(str2DListDic[code.ToString()], dataStringArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  718. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_2D__ | VariableCode.__INTEGER__);
  719. foreach (VariableCode code in codeList)
  720. if (int2DListDic.ContainsKey(code.ToString()))
  721. copyListToArray2D(int2DListDic[code.ToString()], dataIntegerArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  722. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_3D__ | VariableCode.__STRING__);
  723. foreach (VariableCode code in codeList)
  724. if (str3DListDic.ContainsKey(code.ToString()))
  725. copyListToArray3D(str3DListDic[code.ToString()], dataStringArray3D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  726. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__ARRAY_3D__ | VariableCode.__INTEGER__);
  727. foreach (VariableCode code in codeList)
  728. if (int3DListDic.ContainsKey(code.ToString()))
  729. copyListToArray3D(int3DListDic[code.ToString()], dataIntegerArray3D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  730. if (version < 1808)//ユーザー定義変数の保存の実装前
  731. return;
  732. strListDic = reader.ReadStringArrayExtended();
  733. intListDic = reader.ReadInt64ArrayExtended();
  734. str2DListDic = reader.ReadStringArray2DExtended();
  735. int2DListDic = reader.ReadInt64Array2DExtended();
  736. str3DListDic = reader.ReadStringArray3DExtended();
  737. int3DListDic = reader.ReadInt64Array3DExtended();
  738. List<UserDefinedVariableToken> varList = null;
  739. int i = 0;
  740. varList = userDefinedSaveVarList[i]; i++;
  741. foreach (UserDefinedVariableToken var in varList)
  742. if (strListDic.ContainsKey(var.Name))
  743. copyListToArray(strListDic[var.Name], (string[])var.GetArray());
  744. varList = userDefinedSaveVarList[i]; i++;
  745. foreach (UserDefinedVariableToken var in varList)
  746. if (intListDic.ContainsKey(var.Name))
  747. copyListToArray(intListDic[var.Name], (Int64[])var.GetArray());
  748. varList = userDefinedSaveVarList[i]; i++;
  749. foreach (UserDefinedVariableToken var in varList)
  750. if (str2DListDic.ContainsKey(var.Name))
  751. copyListToArray2D(str2DListDic[var.Name], (string[,])var.GetArray());
  752. varList = userDefinedSaveVarList[i]; i++;
  753. foreach (UserDefinedVariableToken var in varList)
  754. if (int2DListDic.ContainsKey(var.Name))
  755. copyListToArray2D(int2DListDic[var.Name], (Int64[,])var.GetArray());
  756. varList = userDefinedSaveVarList[i]; i++;
  757. foreach (UserDefinedVariableToken var in varList)
  758. if (str3DListDic.ContainsKey(var.Name))
  759. copyListToArray3D(str3DListDic[var.Name], (string[, ,])var.GetArray());
  760. varList = userDefinedSaveVarList[i]; i++;
  761. foreach (UserDefinedVariableToken var in varList)
  762. if (int3DListDic.ContainsKey(var.Name))
  763. copyListToArray3D(int3DListDic[var.Name], (Int64[, ,])var.GetArray());
  764. }
  765. private void copyListToArray<T>(List<T> srcList, T[] destArray)
  766. {
  767. int count = Math.Min(srcList.Count, destArray.Length);
  768. for (int i = 0; i < count; i++)
  769. {
  770. destArray[i] = srcList[i];
  771. }
  772. }
  773. private void copyListToArray2D<T>(List<T[]> srcList, T[,] destArray)
  774. {
  775. int countX = Math.Min(srcList.Count, destArray.GetLength(0));
  776. int dLength = destArray.GetLength(1);
  777. for (int x = 0; x < countX; x++)
  778. {
  779. T[] srcArray = srcList[x];
  780. int countY = Math.Min(srcArray.Length, dLength);
  781. for (int y = 0; y < countY; y++)
  782. {
  783. destArray[x, y] = srcArray[y];
  784. }
  785. }
  786. }
  787. private void copyListToArray3D<T>(List<List<T[]>> srcList, T[, ,] destArray)
  788. {
  789. int countX = Math.Min(srcList.Count, destArray.GetLength(0));
  790. int dLength1 = destArray.GetLength(1);
  791. int dLength2 = destArray.GetLength(2);
  792. for (int x = 0; x < countX; x++)
  793. {
  794. List<T[]> srcArray = srcList[x];
  795. int countY = Math.Min(srcArray.Count, dLength1);
  796. for (int y = 0; y < countY; y++)
  797. {
  798. T[] baseArray = srcArray[y];
  799. int countZ = Math.Min(baseArray.Length, dLength2);
  800. for (int z = 0; z < countZ; z++)
  801. {
  802. destArray[x, y, z] = baseArray[z];
  803. }
  804. }
  805. }
  806. }
  807. public void SaveGlobalToStream(EraDataWriter writer)
  808. {
  809. writer.Write(dataIntegerArray[(int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBAL)]);
  810. writer.Write(dataStringArray[(int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBALS)]);
  811. }
  812. public void LoadGlobalFromStream(EraDataReader reader)
  813. {
  814. reader.ReadInt64Array(dataIntegerArray[(int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBAL)]);
  815. reader.ReadStringArray(dataStringArray[(int)(VariableCode.__LOWERCASE__ & VariableCode.GLOBALS)]);
  816. }
  817. public void SaveGlobalToStream1808(EraDataWriter writer)
  818. {
  819. for (int i = 0; i < 6; i++)
  820. {
  821. foreach (UserDefinedVariableToken var in userDefinedGlobalSaveVarList[i])
  822. {
  823. //if (!var.IsSavedata) continue;
  824. switch (i)
  825. {
  826. case 0: writer.WriteExtended(var.Name, (string[])var.GetArray()); break;
  827. case 1: writer.WriteExtended(var.Name, (Int64[])var.GetArray()); break;
  828. case 2: writer.WriteExtended(var.Name, (string[,])var.GetArray()); break;
  829. case 3: writer.WriteExtended(var.Name, (Int64[,])var.GetArray()); break;
  830. case 4: writer.WriteExtended(var.Name, (string[, ,])var.GetArray()); break;
  831. case 5: writer.WriteExtended(var.Name, (Int64[, ,])var.GetArray()); break;
  832. }
  833. }
  834. writer.EmuSeparete();
  835. }
  836. }
  837. public void LoadGlobalFromStream1808(EraDataReader reader)
  838. {
  839. Dictionary<string, List<string>> strListDic = null;
  840. Dictionary<string, List<Int64>> intListDic = null;
  841. Dictionary<string, List<string[]>> str2DListDic = null;
  842. Dictionary<string, List<Int64[]>> int2DListDic = null;
  843. Dictionary<string, List<List<string[]>>> str3DListDic = null;
  844. Dictionary<string, List<List<Int64[]>>> int3DListDic = null;
  845. strListDic = reader.ReadStringArrayExtended();
  846. intListDic = reader.ReadInt64ArrayExtended();
  847. str2DListDic = reader.ReadStringArray2DExtended();
  848. int2DListDic = reader.ReadInt64Array2DExtended();
  849. str3DListDic = reader.ReadStringArray3DExtended();
  850. int3DListDic = reader.ReadInt64Array3DExtended();
  851. List<UserDefinedVariableToken> varList = null;
  852. int i = 0;
  853. varList = userDefinedGlobalSaveVarList[i]; i++;
  854. foreach (UserDefinedVariableToken var in varList)
  855. if (strListDic.ContainsKey(var.Name))
  856. copyListToArray(strListDic[var.Name], (string[])var.GetArray());
  857. varList = userDefinedGlobalSaveVarList[i]; i++;
  858. foreach (UserDefinedVariableToken var in varList)
  859. if (intListDic.ContainsKey(var.Name))
  860. copyListToArray(intListDic[var.Name], (Int64[])var.GetArray());
  861. varList = userDefinedGlobalSaveVarList[i]; i++;
  862. foreach (UserDefinedVariableToken var in varList)
  863. if (str2DListDic.ContainsKey(var.Name))
  864. copyListToArray2D(str2DListDic[var.Name], (string[,])var.GetArray());
  865. varList = userDefinedGlobalSaveVarList[i]; i++;
  866. foreach (UserDefinedVariableToken var in varList)
  867. if (int2DListDic.ContainsKey(var.Name))
  868. copyListToArray2D(int2DListDic[var.Name], (Int64[,])var.GetArray());
  869. varList = userDefinedGlobalSaveVarList[i]; i++;
  870. foreach (UserDefinedVariableToken var in varList)
  871. if (str3DListDic.ContainsKey(var.Name))
  872. copyListToArray3D(str3DListDic[var.Name], (string[, ,])var.GetArray());
  873. varList = userDefinedGlobalSaveVarList[i]; i++;
  874. foreach (UserDefinedVariableToken var in varList)
  875. if (int3DListDic.ContainsKey(var.Name))
  876. copyListToArray3D(int3DListDic[var.Name], (Int64[, ,])var.GetArray());
  877. }
  878. public void SaveGlobalToStreamBinary(EraBinaryDataWriter writer)
  879. {
  880. foreach (KeyValuePair<string, VariableToken> pair in varTokenDic)
  881. {
  882. VariableToken var = pair.Value;
  883. if (var.IsSavedata && !var.IsCharacterData && var.IsGlobal)
  884. {
  885. writer.WriteWithKey(pair.Key, var.GetArray());
  886. }
  887. }
  888. foreach (UserDefinedVariableToken var in userDefinedGlobalVarList)
  889. {
  890. if (var.IsSavedata)
  891. writer.WriteWithKey(var.Name, var.GetArray());
  892. }
  893. }
  894. public void SaveToStreamBinary(EraBinaryDataWriter writer)
  895. {
  896. foreach (KeyValuePair<string, VariableToken> pair in varTokenDic)
  897. {
  898. VariableToken var = pair.Value;
  899. if (var.IsSavedata && !var.IsCharacterData && !var.IsGlobal)
  900. {
  901. writer.WriteWithKey(pair.Key, var.GetArray());
  902. }
  903. }
  904. foreach (UserDefinedVariableToken var in userDefinedStaticVarList)
  905. {
  906. if (var.IsSavedata)
  907. writer.WriteWithKey(var.Name, var.GetArray());
  908. }
  909. }
  910. public void LoadFromStreamBinary(EraBinaryDataReader bReader)
  911. {
  912. while (LoadVariableBinary(bReader)) { }
  913. }
  914. /// <summary>
  915. /// 1808 キャラクタ型でない変数を一つ読む
  916. /// ファイル終端の場合はfalseを返す
  917. /// </summary>
  918. /// <param name="reader"></param>
  919. public bool LoadVariableBinary(EraBinaryDataReader reader)
  920. {
  921. KeyValuePair<string, EraSaveDataType> nameAndType = reader.ReadVariableCode();
  922. VariableToken vToken = null;
  923. if (nameAndType.Key != null && !GlobalStatic.IdentifierDictionary.getVarTokenIsForbid(nameAndType.Key))
  924. vToken = GlobalStatic.IdentifierDictionary.GetVariableToken(nameAndType.Key, null, false);
  925. if (vToken != null && (vToken.IsCharacterData || vToken.IsConst || vToken.IsPrivate || vToken.IsLocal || vToken.IsCalc))
  926. vToken = null;
  927. switch (nameAndType.Value)
  928. {
  929. case EraSaveDataType.EOF:
  930. return false;
  931. case EraSaveDataType.Int:
  932. if (vToken == null || !vToken.IsInteger || vToken.Dimension != 0)
  933. reader.ReadInt();//該当変数なし、or型不一致なら読み捨てる
  934. else
  935. vToken.SetValue(reader.ReadInt(), null);
  936. break;
  937. case EraSaveDataType.Str:
  938. if (vToken == null || !vToken.IsString || vToken.Dimension != 0)
  939. reader.ReadString();
  940. else
  941. vToken.SetValue(reader.ReadString(), null);
  942. break;
  943. case EraSaveDataType.IntArray:
  944. if (vToken == null || !vToken.IsInteger || vToken.Dimension != 1)
  945. reader.ReadIntArray(null, true);
  946. else
  947. reader.ReadIntArray((long[])vToken.GetArray(), true);
  948. break;
  949. case EraSaveDataType.IntArray2D:
  950. if (vToken == null || !vToken.IsInteger || vToken.Dimension != 2)
  951. reader.ReadIntArray2D(null, true);
  952. else
  953. reader.ReadIntArray2D((long[,])vToken.GetArray(), true);
  954. break;
  955. case EraSaveDataType.IntArray3D:
  956. if (vToken == null || !vToken.IsInteger || vToken.Dimension != 3)
  957. reader.ReadIntArray3D(null, true);
  958. else
  959. reader.ReadIntArray3D((long[, ,])vToken.GetArray(), true);
  960. break;
  961. case EraSaveDataType.StrArray:
  962. if (vToken == null || !vToken.IsString || vToken.Dimension != 1)
  963. reader.ReadStrArray(null, true);
  964. else
  965. reader.ReadStrArray((string[])vToken.GetArray(), true);
  966. break;
  967. case EraSaveDataType.StrArray2D:
  968. if (vToken == null || !vToken.IsString || vToken.Dimension != 2)
  969. reader.ReadStrArray2D(null, true);
  970. else
  971. reader.ReadStrArray2D((string[,])vToken.GetArray(), true);
  972. break;
  973. case EraSaveDataType.StrArray3D:
  974. if (vToken == null || !vToken.IsString || vToken.Dimension != 3)
  975. reader.ReadStrArray3D(null, true);
  976. else
  977. reader.ReadStrArray3D((string[, ,])vToken.GetArray(), true);
  978. break;
  979. default:
  980. throw new FileEE("データ異常");
  981. }
  982. return true;
  983. }
  984. #region IDisposable メンバ
  985. public void Dispose()
  986. {
  987. ClearLocalValue();
  988. for (int i = 0; i < dataIntegerArray.Length; i++)
  989. dataIntegerArray[i] = null;
  990. for (int i = 0; i < dataStringArray.Length; i++)
  991. dataStringArray[i] = null;
  992. for (int i = 0; i < characterList.Count; i++)
  993. characterList[i].Dispose();
  994. characterList.Clear();
  995. }
  996. #endregion
  997. }
  998. }