CharacterData.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. using System;
  2. using System.Collections.Generic;
  3. using MinorShift.Emuera.GameProc;
  4. using MinorShift.Emuera.Sub;
  5. namespace MinorShift.Emuera.GameData.Variable
  6. {
  7. internal sealed class CharacterData : IDisposable
  8. {
  9. readonly Int64[] dataInteger;
  10. readonly string[] dataString;
  11. readonly Int64[][] dataIntegerArray;
  12. readonly string[][] dataStringArray;
  13. readonly Int64[][,] dataIntegerArray2D;
  14. readonly string[][,] dataStringArray2D;
  15. public Int64[] DataInteger => dataInteger;
  16. public string[] DataString => dataString;
  17. public Int64[][] DataIntegerArray => dataIntegerArray;
  18. public string[][] DataStringArray => dataStringArray;
  19. public Int64[][,] DataIntegerArray2D => dataIntegerArray2D;
  20. public string[][,] DataStringArray2D => dataStringArray2D;
  21. public List<object> UserDefCVarDataList { get; set; }
  22. public CharacterData(ConstantData constant, VariableData varData)
  23. {
  24. dataInteger = new Int64[(int)VariableCode.__COUNT_CHARACTER_INTEGER__];
  25. dataString = new string[(int)VariableCode.__COUNT_CHARACTER_STRING__];
  26. dataIntegerArray = new Int64[(int)VariableCode.__COUNT_CHARACTER_INTEGER_ARRAY__][];
  27. dataStringArray = new string[(int)VariableCode.__COUNT_CHARACTER_STRING_ARRAY__][];
  28. dataIntegerArray2D = new Int64[(int)VariableCode.__COUNT_CHARACTER_INTEGER_ARRAY_2D__][,];
  29. dataStringArray2D = new string[(int)VariableCode.__COUNT_CHARACTER_STRING_ARRAY_2D__][,];
  30. for (int i = 0; i < dataIntegerArray.Length; i++)
  31. dataIntegerArray[i] = new Int64[constant.CharacterIntArrayLength[i]];
  32. for (int i = 0; i < dataStringArray.Length; i++)
  33. dataStringArray[i] = new string[constant.CharacterStrArrayLength[i]];
  34. for (int i = 0; i < dataIntegerArray2D.Length; i++)
  35. {
  36. Int64 length64 = constant.CharacterIntArray2DLength[i];
  37. int length = (int)(length64 >> 32);
  38. int length2 = (int)(length64 & 0x7FFFFFFF);
  39. dataIntegerArray2D[i] = new Int64[length, length2];
  40. }
  41. for (int i = 0; i < dataStringArray2D.Length; i++)
  42. {
  43. Int64 length64 = constant.CharacterStrArray2DLength[i];
  44. int length = (int)(length64 >> 32);
  45. int length2 = (int)(length64 & 0x7FFFFFFF);
  46. dataStringArray2D[i] = new string[length, length2];
  47. }
  48. UserDefCVarDataList = new List<object>();
  49. for (int i = 0; i < varData.UserDefinedCharaVarList.Count; i++)
  50. {
  51. UserDefinedVariableData d = varData.UserDefinedCharaVarList[i].DimData;
  52. object array = null;
  53. if (d.TypeIsStr)
  54. {
  55. switch (d.Dimension)
  56. {
  57. case 1:
  58. array = new string[d.Lengths[0]];
  59. break;
  60. case 2:
  61. array = new string[d.Lengths[0], d.Lengths[1]];
  62. break;
  63. case 3:
  64. array = new string[d.Lengths[0], d.Lengths[1], d.Lengths[2]];
  65. break;
  66. }
  67. }
  68. else
  69. {
  70. switch (d.Dimension)
  71. {
  72. case 1:
  73. array = new Int64[d.Lengths[0]];
  74. break;
  75. case 2:
  76. array = new Int64[d.Lengths[0], d.Lengths[1]];
  77. break;
  78. case 3:
  79. array = new Int64[d.Lengths[0], d.Lengths[1], d.Lengths[2]];
  80. break;
  81. }
  82. }
  83. if (array == null)
  84. throw new ExeEE("");
  85. UserDefCVarDataList.Add(array);
  86. }
  87. }
  88. public CharacterData(ConstantData constant, CharacterTemplate tmpl, VariableData varData)
  89. : this(constant, varData)
  90. {
  91. dataInteger[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.NO] = tmpl.No;
  92. dataString[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.NAME] = tmpl.Name;
  93. dataString[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CALLNAME] = tmpl.Callname;
  94. dataString[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.NICKNAME] = tmpl.Nickname;
  95. dataString[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MASTERNAME] = tmpl.Mastername;
  96. Int64[] array, array2;
  97. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MAXBASE];
  98. array2 = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.BASE];
  99. foreach (KeyValuePair<int, Int64> pair in tmpl.Maxbase)
  100. {
  101. array[pair.Key] = pair.Value;
  102. array2[pair.Key] = pair.Value;
  103. }
  104. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MARK];
  105. foreach (KeyValuePair<int, Int64> pair in tmpl.Mark)
  106. array[pair.Key] = pair.Value;
  107. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXP];
  108. foreach (KeyValuePair<int, Int64> pair in tmpl.Exp)
  109. array[pair.Key] = pair.Value;
  110. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ABL];
  111. foreach (KeyValuePair<int, Int64> pair in tmpl.Abl)
  112. array[pair.Key] = pair.Value;
  113. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TALENT];
  114. foreach (KeyValuePair<int, Int64> pair in tmpl.Talent)
  115. array[pair.Key] = pair.Value;
  116. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.RELATION];
  117. for (int i = 0; i < array.Length; i++)
  118. array[i] = Config.RelationDef;
  119. foreach (KeyValuePair<int, Int64> pair in tmpl.Relation)
  120. array[pair.Key] = pair.Value;
  121. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CFLAG];
  122. foreach (KeyValuePair<int, Int64> pair in tmpl.CFlag)
  123. array[pair.Key] = pair.Value;
  124. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EQUIP];
  125. foreach (KeyValuePair<int, Int64> pair in tmpl.Equip)
  126. array[pair.Key] = pair.Value;
  127. array = dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.JUEL];
  128. foreach (KeyValuePair<int, Int64> pair in tmpl.Juel)
  129. array[pair.Key] = pair.Value;
  130. string[] arrays = dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CSTR];
  131. foreach (KeyValuePair<int, string> pair in tmpl.CStr)
  132. arrays[pair.Key] = pair.Value;
  133. /*
  134. //tmpl.Maxbase.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MAXBASE], 0);
  135. Buffer.BlockCopy(tmpl.Maxbase, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MAXBASE], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MAXBASE]);
  136. //tmpl.Maxbase.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.BASE], 0);
  137. Buffer.BlockCopy(tmpl.Maxbase, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.BASE], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.BASE]);
  138. //tmpl.Mark.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MARK], 0);
  139. Buffer.BlockCopy(tmpl.Mark, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MARK], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MARK]);
  140. //tmpl.Exp.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXP], 0);
  141. Buffer.BlockCopy(tmpl.Exp, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXP], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXP]);
  142. //tmpl.Abl.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ABL], 0);
  143. Buffer.BlockCopy(tmpl.Abl, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ABL], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ABL]);
  144. //tmpl.Talent.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TALENT], 0);
  145. Buffer.BlockCopy(tmpl.Talent, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TALENT], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TALENT]);
  146. //tmpl.Relation.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.RELATION], 0);
  147. Buffer.BlockCopy(tmpl.Relation, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.RELATION], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.RELATION]);
  148. //tmpl.CFlag.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CFLAG], 0);
  149. Buffer.BlockCopy(tmpl.CFlag, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CFLAG], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CFLAG]);
  150. //tmpl.Equip.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EQUIP], 0);
  151. Buffer.BlockCopy(tmpl.Equip, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EQUIP], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EQUIP]);
  152. //tmpl.Juel.CopyTo(dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.JUEL], 0);
  153. Buffer.BlockCopy(tmpl.Juel, 0, dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.JUEL], 0, 8 * constant.CharacterIntArrayLength[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.JUEL]);
  154. tmpl.CStr.CopyTo(dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CSTR], 0);
  155. */
  156. }
  157. public static int[] CharacterVarLength(VariableCode code, ConstantData constant)
  158. {
  159. int[] ret = null;
  160. VariableCode type = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ |
  161. VariableCode.__ARRAY_3D__ | VariableCode.__INTEGER__ | VariableCode.__STRING__);
  162. int i = (int)(code & VariableCode.__LOWERCASE__);
  163. if (i >= 0xF0)
  164. return null;
  165. Int64 length64 = 0;
  166. switch (type)
  167. {
  168. case VariableCode.__STRING__:
  169. case VariableCode.__INTEGER__:
  170. ret = new int[0];
  171. break;
  172. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  173. ret = new int[1];
  174. ret[0] = constant.CharacterIntArrayLength[i];
  175. break;
  176. case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  177. ret = new int[1];
  178. ret[0] = constant.CharacterStrArrayLength[i];
  179. break;
  180. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_2D__:
  181. ret = new int[2];
  182. length64 = constant.CharacterIntArray2DLength[i];
  183. ret[0] = (int)(length64 >> 32);
  184. ret[1] = (int)(length64 & 0x7FFFFFFF);
  185. break;
  186. case VariableCode.__STRING__ | VariableCode.__ARRAY_2D__:
  187. ret = new int[2];
  188. length64 = constant.CharacterStrArray2DLength[i];
  189. ret[0] = (int)(length64 >> 32);
  190. ret[1] = (int)(length64 & 0x7FFFFFFF);
  191. break;
  192. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_3D__:
  193. throw new NotImplCodeEE();
  194. case VariableCode.__STRING__ | VariableCode.__ARRAY_3D__:
  195. throw new NotImplCodeEE();
  196. }
  197. return ret;
  198. }
  199. public void CopyTo(CharacterData other, VariableData varData)
  200. {
  201. for (int i = 0; i < dataInteger.Length; i++)
  202. other.dataInteger[i] = dataInteger[i];
  203. for (int i = 0; i < dataString.Length; i++)
  204. other.dataString[i] = dataString[i];
  205. for (int i = 0; i < dataIntegerArray.Length; i++)
  206. for (int j = 0; j < dataIntegerArray[i].Length; j++)
  207. other.dataIntegerArray[i][j] = dataIntegerArray[i][j];
  208. for (int i = 0; i < dataStringArray.Length; i++)
  209. for (int j = 0; j < dataStringArray[i].Length; j++)
  210. other.dataStringArray[i][j] = dataStringArray[i][j];
  211. for (int i = 0; i < dataIntegerArray2D.Length; i++)
  212. {
  213. int length1 = dataIntegerArray2D[i].GetLength(0);
  214. int length2 = dataIntegerArray2D[i].GetLength(1);
  215. for (int j = 0; j < length1; j++)
  216. for (int k = 0; k < length2; k++)
  217. other.dataIntegerArray2D[i][j, k] = dataIntegerArray2D[i][j, k];
  218. }
  219. for (int i = 0; i < dataStringArray2D.Length; i++)
  220. {
  221. int length1 = dataStringArray2D[i].GetLength(0);
  222. int length2 = dataStringArray2D[i].GetLength(1);
  223. for (int j = 0; j < length1; j++)
  224. for (int k = 0; k < length2; k++)
  225. other.dataStringArray2D[i][j, k] = dataStringArray2D[i][j, k];
  226. }
  227. if (UserDefCVarDataList.Count > 0)
  228. {
  229. foreach (UserDefinedCharaVariableToken var in varData.UserDefinedCharaVarList)
  230. {
  231. if (!var.IsCharacterData)
  232. continue;
  233. if (var.IsString)
  234. {
  235. if (var.IsArray1D)
  236. {
  237. int length = ((string[])(UserDefCVarDataList[var.ArrayIndex])).GetLength(0);
  238. for (int i = 0; i < length; i++)
  239. ((string[])(other.UserDefCVarDataList[var.ArrayIndex]))[i] = ((string[])(UserDefCVarDataList[var.ArrayIndex]))[i];
  240. }
  241. else if (var.IsArray2D)
  242. {
  243. int length1 = ((string[,])UserDefCVarDataList[var.ArrayIndex]).GetLength(0);
  244. int length2 = ((string[,])UserDefCVarDataList[var.ArrayIndex]).GetLength(1);
  245. for (int i = 0; i < length1; i++)
  246. for (int j = 0; j < length2; j++)
  247. ((string[,])(other.UserDefCVarDataList[var.ArrayIndex]))[i, j] = ((string[,])(UserDefCVarDataList[var.ArrayIndex]))[i, j];
  248. }
  249. }
  250. else
  251. {
  252. if (var.IsArray1D)
  253. {
  254. int length = ((Int64[])(UserDefCVarDataList[var.ArrayIndex])).GetLength(0);
  255. for (int i = 0; i < length; i++)
  256. ((Int64[])(other.UserDefCVarDataList[var.ArrayIndex]))[i] = ((Int64[])(UserDefCVarDataList[var.ArrayIndex]))[i];
  257. }
  258. else if (var.IsArray2D)
  259. {
  260. int length1 = ((Int64[,])(UserDefCVarDataList[var.ArrayIndex])).GetLength(0);
  261. int length2 = ((Int64[,])(UserDefCVarDataList[var.ArrayIndex])).GetLength(1);
  262. for (int i = 0; i < length1; i++)
  263. for (int j = 0; j < length2; j++)
  264. ((Int64[,])(other.UserDefCVarDataList[var.ArrayIndex]))[i, j] = ((Int64[,])(UserDefCVarDataList[var.ArrayIndex]))[i, j];
  265. }
  266. }
  267. }
  268. }
  269. }
  270. const int strCount = (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__;
  271. const int intCount = (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__;
  272. const int intArrayCount = (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__;
  273. const int strArrayCount = (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__;
  274. public void SaveToStream(EraDataWriter writer)
  275. {
  276. for (int i = 0; i < strCount; i++)
  277. writer.Write(dataString[i]);
  278. for (int i = 0; i < intCount; i++)
  279. writer.Write(dataInteger[i]);
  280. for (int i = 0; i < intArrayCount; i++)
  281. writer.Write(dataIntegerArray[i]);
  282. for (int i = 0; i < strArrayCount; i++)
  283. writer.Write(dataStringArray[i]);
  284. }
  285. public void LoadFromStream(EraDataReader reader)
  286. {
  287. for (int i = 0; i < strCount; i++)
  288. dataString[i] = reader.ReadString();
  289. for (int i = 0; i < intCount; i++)
  290. dataInteger[i] = reader.ReadInt64();
  291. for (int i = 0; i < intArrayCount; i++)
  292. reader.ReadInt64Array(dataIntegerArray[i]);
  293. for (int i = 0; i < strArrayCount; i++)
  294. reader.ReadStringArray(dataStringArray[i]);
  295. }
  296. public void SaveToStreamExtended(EraDataWriter writer)
  297. {
  298. List<VariableCode> codeList = null;
  299. //dataString
  300. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__);
  301. foreach (VariableCode code in codeList)
  302. writer.WriteExtended(code.ToString(), dataString[(int)VariableCode.__LOWERCASE__ & (int)code]);
  303. writer.EmuSeparete();
  304. //datainteger
  305. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__);
  306. foreach (VariableCode code in codeList)
  307. writer.WriteExtended(code.ToString(), dataInteger[(int)VariableCode.__LOWERCASE__ & (int)code]);
  308. writer.EmuSeparete();
  309. //dataStringArray
  310. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__STRING__);
  311. foreach (VariableCode code in codeList)
  312. writer.WriteExtended(code.ToString(), dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  313. writer.EmuSeparete();
  314. //dataIntegerArray
  315. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__INTEGER__);
  316. foreach (VariableCode code in codeList)
  317. writer.WriteExtended(code.ToString(), dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  318. writer.EmuSeparete();
  319. //dataStringArray2D
  320. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_2D__ | VariableCode.__STRING__);
  321. foreach (VariableCode code in codeList)
  322. writer.WriteExtended(code.ToString(), dataStringArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  323. writer.EmuSeparete();
  324. //dataIntegerArray2D
  325. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_2D__ | VariableCode.__INTEGER__);
  326. foreach (VariableCode code in codeList)
  327. writer.WriteExtended(code.ToString(), dataIntegerArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  328. writer.EmuSeparete();
  329. }
  330. public void LoadFromStreamExtended(EraDataReader reader)
  331. {
  332. Dictionary<string, string> strDic = reader.ReadStringExtended();
  333. Dictionary<string, Int64> intDic = reader.ReadInt64Extended();
  334. Dictionary<string, List<string>> strListDic = reader.ReadStringArrayExtended();
  335. Dictionary<string, List<Int64>> intListDic = reader.ReadInt64ArrayExtended();
  336. Dictionary<string, List<string[]>> str2DListDic = reader.ReadStringArray2DExtended();
  337. Dictionary<string, List<Int64[]>> int2DListDic = reader.ReadInt64Array2DExtended();
  338. List<VariableCode> codeList = null;
  339. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__);
  340. foreach (VariableCode code in codeList)
  341. if (strDic.ContainsKey(code.ToString()))
  342. dataString[(int)VariableCode.__LOWERCASE__ & (int)code] = strDic[code.ToString()];
  343. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__);
  344. foreach (VariableCode code in codeList)
  345. if (intDic.ContainsKey(code.ToString()))
  346. dataInteger[(int)VariableCode.__LOWERCASE__ & (int)code] = intDic[code.ToString()];
  347. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__STRING__);
  348. foreach (VariableCode code in codeList)
  349. if (strListDic.ContainsKey(code.ToString()))
  350. copyListToArray(strListDic[code.ToString()], dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  351. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__INTEGER__);
  352. foreach (VariableCode code in codeList)
  353. if (intListDic.ContainsKey(code.ToString()))
  354. copyListToArray(intListDic[code.ToString()], dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  355. //dataStringArray2D
  356. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_2D__ | VariableCode.__STRING__);
  357. foreach (VariableCode code in codeList)
  358. if (int2DListDic.ContainsKey(code.ToString()))
  359. copyListToArray2D(str2DListDic[code.ToString()], dataStringArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  360. //dataIntegerArray2D
  361. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_2D__ | VariableCode.__INTEGER__);
  362. foreach (VariableCode code in codeList)
  363. if (int2DListDic.ContainsKey(code.ToString()))
  364. copyListToArray2D(int2DListDic[code.ToString()], dataIntegerArray2D[(int)VariableCode.__LOWERCASE__ & (int)code]);
  365. }
  366. public void LoadFromStreamExtended_Old1802(EraDataReader reader)
  367. {
  368. Dictionary<string, string> strDic = reader.ReadStringExtended();
  369. Dictionary<string, Int64> intDic = reader.ReadInt64Extended();
  370. Dictionary<string, List<string>> strListDic = reader.ReadStringArrayExtended();
  371. Dictionary<string, List<Int64>> intListDic = reader.ReadInt64ArrayExtended();
  372. List<VariableCode> codeList = null;
  373. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__);
  374. foreach (VariableCode code in codeList)
  375. if (strDic.ContainsKey(code.ToString()))
  376. dataString[(int)VariableCode.__LOWERCASE__ & (int)code] = strDic[code.ToString()];
  377. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__);
  378. foreach (VariableCode code in codeList)
  379. if (intDic.ContainsKey(code.ToString()))
  380. dataInteger[(int)VariableCode.__LOWERCASE__ & (int)code] = intDic[code.ToString()];
  381. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__STRING__);
  382. foreach (VariableCode code in codeList)
  383. if (strListDic.ContainsKey(code.ToString()))
  384. copyListToArray(strListDic[code.ToString()], dataStringArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  385. codeList = VariableIdentifier.GetExtSaveList(VariableCode.__CHARACTER_DATA__ | VariableCode.__ARRAY_1D__ | VariableCode.__INTEGER__);
  386. foreach (VariableCode code in codeList)
  387. if (intListDic.ContainsKey(code.ToString()))
  388. copyListToArray(intListDic[code.ToString()], dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)code]);
  389. }
  390. public void SaveToStreamBinary(EraBinaryDataWriter writer, VariableData varData)
  391. {
  392. //eramaker変数の保存
  393. foreach (KeyValuePair<string, VariableToken> pair in varData.GetVarTokenDic())
  394. {
  395. VariableToken var = pair.Value;
  396. if (!var.IsSavedata || !var.IsCharacterData || var.IsGlobal)
  397. continue;
  398. VariableCode code = var.Code;
  399. VariableCode flag = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__);
  400. int CodeInt = var.CodeInt;
  401. switch (flag)
  402. {
  403. case VariableCode.__INTEGER__:
  404. writer.WriteWithKey(code.ToString(), dataInteger[CodeInt]);
  405. break;
  406. case VariableCode.__STRING__:
  407. writer.WriteWithKey(code.ToString(), dataString[CodeInt]);
  408. break;
  409. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  410. writer.WriteWithKey(code.ToString(), dataIntegerArray[CodeInt]);
  411. break;
  412. case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  413. writer.WriteWithKey(code.ToString(), dataStringArray[CodeInt]);
  414. break;
  415. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_2D__:
  416. writer.WriteWithKey(code.ToString(), dataIntegerArray2D[CodeInt]);
  417. break;
  418. case VariableCode.__STRING__ | VariableCode.__ARRAY_2D__:
  419. writer.WriteWithKey(code.ToString(), dataStringArray2D[CodeInt]);
  420. break;
  421. //case VariableCode.__INTEGER__ | VariableCode.__ARRAY_3D__:
  422. // writer.Write(code.ToString(), dataIntegerArray3D[CodeInt]);
  423. // break;
  424. //case VariableCode.__STRING__ | VariableCode.__ARRAY_3D__:
  425. // writer.Write(code.ToString(), dataStringArray3D[CodeInt]);
  426. // break;
  427. }
  428. }
  429. //1813追加
  430. if (UserDefCVarDataList.Count != 0)
  431. {
  432. writer.WriteSeparator();
  433. //#DIM宣言変数の保存
  434. foreach (UserDefinedCharaVariableToken var in varData.UserDefinedCharaVarList)
  435. {
  436. if (!var.IsSavedata || !var.IsCharacterData || var.IsGlobal)
  437. continue;
  438. writer.WriteWithKey(var.Name, UserDefCVarDataList[var.ArrayIndex]);
  439. }
  440. }
  441. writer.WriteEOC();
  442. }
  443. public void LoadFromStreamBinary(EraBinaryDataReader reader)
  444. {
  445. int codeInt = 0;
  446. bool userDefineData = false;
  447. while (true)
  448. {
  449. KeyValuePair<string, EraSaveDataType> nameAndType = reader.ReadVariableCode();
  450. VariableToken vToken = null;
  451. object array = null;
  452. if (nameAndType.Key != null)
  453. {
  454. if (!GlobalStatic.IdentifierDictionary.getVarTokenIsForbid(nameAndType.Key))
  455. vToken = GlobalStatic.IdentifierDictionary.GetVariableToken(nameAndType.Key, null, false);
  456. if (userDefineData)
  457. {
  458. if (vToken == null || !vToken.IsSavedata || !vToken.IsCharacterData || !(vToken is UserDefinedCharaVariableToken))
  459. array = null;
  460. else
  461. array = UserDefCVarDataList[((UserDefinedCharaVariableToken)vToken).ArrayIndex];
  462. vToken = null;
  463. }
  464. else
  465. {
  466. if (vToken != null)
  467. codeInt = (int)VariableCode.__LOWERCASE__ & (int)vToken.Code;
  468. array = null;
  469. }
  470. }
  471. switch (nameAndType.Value)
  472. {
  473. case EraSaveDataType.Separator:
  474. userDefineData = true;
  475. continue;
  476. case EraSaveDataType.EOF:
  477. case EraSaveDataType.EOC:
  478. goto whilebreak;
  479. case EraSaveDataType.Int:
  480. if (vToken == null || !vToken.IsInteger || vToken.Dimension != 0)
  481. reader.ReadInt();
  482. else
  483. dataInteger[codeInt] = reader.ReadInt();
  484. break;
  485. case EraSaveDataType.Str:
  486. if (vToken == null || !vToken.IsString || vToken.Dimension != 0)
  487. reader.ReadString();
  488. else
  489. dataString[codeInt] = reader.ReadString();
  490. break;
  491. case EraSaveDataType.IntArray:
  492. if (userDefineData && array != null)
  493. reader.ReadIntArray(array as Int64[], true);
  494. else if (vToken == null || !vToken.IsInteger || vToken.Dimension != 1)
  495. reader.ReadIntArray(null, true);
  496. else
  497. reader.ReadIntArray(dataIntegerArray[codeInt], true);
  498. break;
  499. case EraSaveDataType.StrArray:
  500. if (userDefineData && array != null)
  501. reader.ReadStrArray(array as string[], true);
  502. else if (vToken == null || !vToken.IsString || vToken.Dimension != 1)
  503. reader.ReadStrArray(null, true);
  504. else
  505. reader.ReadStrArray(dataStringArray[codeInt], true);
  506. break;
  507. case EraSaveDataType.IntArray2D:
  508. if (userDefineData && array != null)
  509. reader.ReadIntArray2D(array as Int64[,], true);
  510. else if (vToken == null || !vToken.IsInteger || vToken.Dimension != 2)
  511. reader.ReadIntArray2D(null, true);
  512. else
  513. reader.ReadIntArray2D(dataIntegerArray2D[codeInt], true);
  514. break;
  515. case EraSaveDataType.StrArray2D:
  516. if (userDefineData && array != null)
  517. reader.ReadStrArray2D(array as string[,], true);
  518. else if (vToken == null || !vToken.IsString || vToken.Dimension != 2)
  519. reader.ReadStrArray2D(null, true);
  520. else
  521. reader.ReadStrArray2D(dataStringArray2D[codeInt], true);
  522. break;
  523. //case EraSaveDataType.IntArray3D:
  524. // if (vToken == null || !vToken.IsInteger || vToken.Dimension != 3)
  525. // reader.ReadIntArray3D(null, true);
  526. // else
  527. // reader.ReadIntArray3D(dataIntegerArray3D[codeInt], true);
  528. // break;
  529. //case EraSaveDataType.StrArray3D:
  530. // if (vToken == null || !vToken.IsString || vToken.Dimension != 3)
  531. // reader.ReadStrArray3D(null, true);
  532. // else
  533. // reader.ReadStrArray3D(dataStringArray3D[codeInt], true);
  534. // break;
  535. default:
  536. throw new FileEE("データ異常");
  537. }
  538. }
  539. whilebreak:
  540. ;
  541. }
  542. private void copyListToArray<T>(List<T> srcList, T[] destArray)
  543. {
  544. int count = Math.Min(srcList.Count, destArray.Length);
  545. srcList.CopyTo(0, destArray, 0, count);
  546. //for (int i = 0; i < count; i++)
  547. //{
  548. // destArray[i] = srcList[i];
  549. //}
  550. }
  551. private void copyListToArray2D<T>(List<T[]> srcList, T[,] destArray)
  552. {
  553. int countX = Math.Min(srcList.Count, destArray.GetLength(0));
  554. int dLength = destArray.GetLength(1);
  555. for (int x = 0; x < countX; x++)
  556. {
  557. T[] srcArray = srcList[x];
  558. int countY = Math.Min(srcArray.Length, dLength);
  559. for (int y = 0; y < countY; y++)
  560. {
  561. destArray[x, y] = srcArray[y];
  562. }
  563. }
  564. }
  565. public void setValueAll(int varInt, Int64 value)
  566. {
  567. dataInteger[varInt] = value;
  568. }
  569. public void setValueAll(int varInt, string value)
  570. {
  571. dataString[varInt] = value;
  572. }
  573. public void setValueAll1D(int varInt, Int64 value, int start, int end)
  574. {
  575. Int64[] array = dataIntegerArray[varInt];
  576. for (int i = start; i < end; i++)
  577. array[i] = value;
  578. }
  579. public void setValueAll1D(int varInt, string value, int start, int end)
  580. {
  581. string[] array = dataStringArray[varInt];
  582. for (int i = start; i < end; i++)
  583. array[i] = value;
  584. }
  585. public void setValueAll2D(int varInt, Int64 value)
  586. {
  587. Int64[,] array = dataIntegerArray2D[varInt];
  588. int a1 = array.GetLength(0);
  589. int a2 = array.GetLength(1);
  590. for (int i = 0; i < a1; i++)
  591. for (int j = 0; j < a2; j++)
  592. array[i, j] = value;
  593. }
  594. public void setValueAll2D(int varInt, string value)
  595. {
  596. string[,] array = dataStringArray2D[varInt];
  597. int a1 = array.GetLength(0);
  598. int a2 = array.GetLength(1);
  599. for (int i = 0; i < a1; i++)
  600. for (int j = 0; j < a2; j++)
  601. array[i, j] = value;
  602. }
  603. #region IDisposable メンバ
  604. public void Dispose()
  605. {
  606. for (int i = 0; i < dataIntegerArray.Length; i++)
  607. dataIntegerArray[i] = null;
  608. for (int i = 0; i < dataStringArray.Length; i++)
  609. dataStringArray[i] = null;
  610. for (int i = 0; i < dataIntegerArray2D.Length; i++)
  611. dataIntegerArray2D[i] = null;
  612. }
  613. #endregion
  614. public Int64[] CFlag => dataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.CFLAG];
  615. public Int64 NO => dataInteger[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.NO];
  616. #region sort
  617. public IComparable temp_SortKey;
  618. public int temp_CurrentOrder;
  619. //Comparison<CharacterData>
  620. public static int AscCharacterComparison(CharacterData x, CharacterData y)
  621. {
  622. int ret = x.temp_SortKey.CompareTo(y.temp_SortKey);
  623. if (ret != 0)
  624. return ret;
  625. return x.temp_CurrentOrder.CompareTo(y.temp_CurrentOrder);
  626. }
  627. public static int DescCharacterComparison(CharacterData x, CharacterData y)
  628. {
  629. int ret = x.temp_SortKey.CompareTo(y.temp_SortKey);
  630. if (ret != 0)
  631. return -ret;
  632. return x.temp_CurrentOrder.CompareTo(y.temp_CurrentOrder);
  633. }
  634. public void SetSortKey(VariableToken sortkey, Int64 elem64)
  635. {
  636. //チェック済み
  637. //if (!sortkey.IsCharacterData)
  638. // throw new ExeEE("キャラクタ変数でない");
  639. if (sortkey.IsString)
  640. {
  641. if (sortkey.IsArray2D)
  642. {
  643. string[,] array;
  644. if (sortkey is UserDefinedCharaVariableToken)
  645. array = (string[,])UserDefCVarDataList[((UserDefinedCharaVariableToken)sortkey).ArrayIndex];
  646. else
  647. array = dataStringArray2D[sortkey.CodeInt];
  648. int elem1 = (int)(elem64 >> 32);
  649. int elem2 = (int)(elem64 & 0x7FFFFFFF);
  650. if (elem1 < 0 || elem1 >= array.GetLength(0) || elem2 < 0 || elem2 >= array.GetLength(1))
  651. throw new CodeEE("ソートキーが配列外を参照しています");
  652. temp_SortKey = array[elem1, elem2];
  653. }
  654. else if (sortkey.IsArray1D)
  655. {
  656. string[] array;
  657. if (sortkey is UserDefinedCharaVariableToken)
  658. array = (string[])UserDefCVarDataList[((UserDefinedCharaVariableToken)sortkey).ArrayIndex];
  659. else
  660. array = dataStringArray[sortkey.CodeInt];
  661. if (elem64 < 0 || elem64 >= array.Length)
  662. throw new CodeEE("ソートキーが配列外を参照しています");
  663. if (array[(int)elem64] != null)
  664. temp_SortKey = array[(int)elem64];
  665. else
  666. temp_SortKey = "";
  667. }
  668. else
  669. {
  670. //ユーザー定義キャラ変数は非配列がない
  671. if (dataString[sortkey.CodeInt] != null)
  672. temp_SortKey = dataString[sortkey.CodeInt];
  673. else
  674. temp_SortKey = "";
  675. }
  676. }
  677. else
  678. {
  679. if (sortkey.IsArray2D)
  680. {
  681. Int64[,] array;
  682. if (sortkey is UserDefinedCharaVariableToken)
  683. array = (Int64[,])UserDefCVarDataList[((UserDefinedCharaVariableToken)sortkey).ArrayIndex];
  684. else
  685. array = dataIntegerArray2D[sortkey.CodeInt];
  686. int elem1 = (int)(elem64 >> 32);
  687. int elem2 = (int)(elem64 & 0x7FFFFFFF);
  688. if (elem1 < 0 || elem1 >= array.GetLength(0) || elem2 < 0 || elem2 >= array.GetLength(1))
  689. throw new CodeEE("ソートキーが配列外を参照しています");
  690. temp_SortKey = array[elem1, elem2];
  691. }
  692. else if (sortkey.IsArray1D)
  693. {
  694. Int64[] array;
  695. if (sortkey is UserDefinedCharaVariableToken)
  696. array = (Int64[])UserDefCVarDataList[((UserDefinedCharaVariableToken)sortkey).ArrayIndex];
  697. else
  698. array = dataIntegerArray[sortkey.CodeInt];
  699. if (elem64 < 0 || elem64 >= array.Length)
  700. throw new CodeEE("ソートキーが配列外を参照しています");
  701. temp_SortKey = array[(int)elem64];
  702. }
  703. else
  704. {
  705. temp_SortKey = dataInteger[sortkey.CodeInt];
  706. }
  707. }
  708. }
  709. #endregion
  710. }
  711. }