VariableEvaluator.cs 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Windows.Forms;
  7. using NTERA.Core;
  8. using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
  9. using NTERA.EmuEra.Game.EraEmu.GameProc.Function;
  10. using NTERA.EmuEra.Game.EraEmu.Sub;
  11. using SortOrder = NTERA.EmuEra.Game.EraEmu.GameProc.Function.SortOrder;
  12. //using System.Windows.Forms;
  13. namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
  14. {
  15. internal sealed class VariableEvaluator : IDisposable
  16. {
  17. readonly GameBase gamebase;
  18. readonly ConstantData constant;
  19. readonly VariableData varData;
  20. Random rand = new Random();
  21. public VariableData VariableData => varData;
  22. internal ConstantData Constant => constant;
  23. public VariableEvaluator(GameBase gamebase, ConstantData constant)
  24. {
  25. this.gamebase = gamebase;
  26. this.constant = constant;
  27. varData = new VariableData(gamebase, constant);
  28. GlobalStatic.VariableData = varData;
  29. }
  30. #region set/get
  31. public void Randomize(Int64 seed)
  32. {
  33. rand = new Random((int)seed);
  34. }
  35. public void InitRanddata()
  36. {
  37. //rand.SetRand(RANDDATA);
  38. }
  39. public void DumpRanddata()
  40. {
  41. //rand.GetRand(RANDDATA);
  42. }
  43. public Int64 GetNextRand(Int64 max)
  44. {
  45. return rand.Next((int)max);
  46. }
  47. public Int64 getPalamLv(Int64 pl, Int64 maxlv)
  48. {
  49. for (int i = 0; i < (int)maxlv; i++)
  50. {
  51. if (pl < varData.DataIntegerArray[(int)(VariableCode.PALAMLV & VariableCode.__LOWERCASE__)][i + 1])
  52. return i;
  53. }
  54. return maxlv;
  55. }
  56. public Int64 getExpLv(Int64 pl, Int64 maxlv)
  57. {
  58. for (int i = 0; i < (int)maxlv; i++)
  59. {
  60. if (pl < varData.DataIntegerArray[(int)(VariableCode.EXPLV & VariableCode.__LOWERCASE__)][i + 1])
  61. return i;
  62. }
  63. return maxlv;
  64. }
  65. public void SetValueAll(FixedVariableTerm p, Int64 srcValue, int start, int end)
  66. {
  67. //呼び出し元で判定済み
  68. //if (!p.Identifier.IsInteger)
  69. // throw new CodeEE("整数型でない変数" + p.Identifier.Name + "に整数値を代入しようとしました");
  70. //if (p.Identifier.Readonly)
  71. // throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました");
  72. if (p.Identifier.IsCalc)
  73. return;
  74. //一応チェック済み
  75. //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない");
  76. if (p.Identifier.IsArray1D)
  77. {
  78. if (start != 0 || end != p.Identifier.GetLength())
  79. p.IsArrayRangeValid(start, end, "VARSET", 3L, 4L);
  80. else if (p.Identifier.IsCharacterData)
  81. p.Identifier.CheckElement(new[] { p.Index1, p.Index2 });
  82. }
  83. else if (p.Identifier.IsCharacterData)
  84. {
  85. p.Identifier.CheckElement(new[] { p.Index1, p.Index2, p.Index3 });
  86. }
  87. p.Identifier.SetValueAll(srcValue, start, end, (int)p.Index1);
  88. }
  89. public void SetValueAll(FixedVariableTerm p, string srcValue, int start, int end)
  90. {
  91. //呼び出し元で判定済み
  92. //if (!p.Identifier.IsString)
  93. // throw new CodeEE("文字列型でない変数" + p.Identifier.Name + "に文字列型を代入しようとしました");
  94. //if (p.Identifier.Readonly)
  95. // throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました");
  96. if (p.Identifier.IsCalc)
  97. {
  98. if (p.Identifier.Code == VariableCode.WINDOW_TITLE)
  99. {
  100. GlobalStatic.Console.SetWindowTitle(srcValue);
  101. }
  102. //一応チェック済み
  103. //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない");
  104. }
  105. else
  106. {
  107. if (p.Identifier.IsArray1D)
  108. {
  109. if (start != 0 || end != p.Identifier.GetLength())
  110. p.IsArrayRangeValid(start, end, "VARSET", 3L, 4L);
  111. else if (p.Identifier.IsCharacterData)
  112. p.Identifier.CheckElement(new[] { p.Index1, p.Index2 });
  113. }
  114. else if (p.Identifier.IsCharacterData)
  115. {
  116. p.Identifier.CheckElement(new[] { p.Index1, p.Index2, p.Index3 });
  117. }
  118. p.Identifier.SetValueAll(srcValue, start, end, (int)p.Index1);
  119. }
  120. }
  121. public void SetValueAllEachChara(FixedVariableTerm p, SingleTerm index, Int64 srcValue, int start, int end)
  122. {
  123. if (!p.Identifier.IsInteger)
  124. throw new CodeEE("整数型でない変数" + p.Identifier.Name + "に整数値を代入しようとしました");
  125. if (p.Identifier.IsConst)
  126. throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました");
  127. if (p.Identifier.IsCalc)
  128. return;
  129. //一応チェック済み
  130. //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない");
  131. if (varData.CharacterList.Count == 0)
  132. return;
  133. CharacterData chara = varData.CharacterList[0];
  134. Int64 indexNum = -1;
  135. if (p.Identifier.IsArray1D)
  136. {
  137. if (index.GetOperandType() == typeof(Int64))
  138. indexNum = index.Int;
  139. else
  140. indexNum = constant.KeywordToInteger(p.Identifier.Code, index.Str, 1);
  141. if (indexNum < 0 || indexNum >= ((long[])(p.Identifier.GetArrayChara(0))).Length)
  142. throw new CodeEE("Character array variable " + p.Identifier.Name + " at the second argument (" + indexNum + ") is out of range of the array");
  143. }
  144. for (int i = start; i < end; i++)
  145. {
  146. p.Identifier.SetValue(srcValue, new[] { i, indexNum });
  147. }
  148. }
  149. public void SetValueAllEachChara(FixedVariableTerm p, SingleTerm index, string srcValue, int start, int end)
  150. {
  151. if (!p.Identifier.IsString)
  152. throw new CodeEE("文字列型でない変数" + p.Identifier.Name + "に文字列型を代入しようとしました");
  153. if (p.Identifier.IsConst)
  154. throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました");
  155. if (p.Identifier.IsCalc)
  156. {
  157. if (p.Identifier.Code == VariableCode.WINDOW_TITLE)
  158. {
  159. GlobalStatic.Console.SetWindowTitle(srcValue);
  160. return;
  161. }
  162. //一応チェック済み
  163. //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない");
  164. return;
  165. }
  166. if (varData.CharacterList.Count == 0)
  167. return;
  168. Int64 indexNum = -1;
  169. if (p.Identifier.IsArray1D)
  170. {
  171. if (index.GetOperandType() == typeof(Int64))
  172. indexNum = index.Int;
  173. else
  174. indexNum = constant.KeywordToInteger(p.Identifier.Code, index.Str, 1);
  175. if (indexNum < 0 || indexNum >= ((string[])(p.Identifier.GetArrayChara(0))).Length)
  176. throw new CodeEE("Character array variable " + p.Identifier.Name + " at the second argument (" + indexNum + ") is out of range of the array");
  177. }
  178. for (int i = start; i < end; i++)
  179. {
  180. p.Identifier.SetValue(srcValue, new[] { i, indexNum });
  181. }
  182. }
  183. public Int64 GetArraySum(FixedVariableTerm p, Int64 index1, Int64 index2)
  184. {
  185. Int64 sum = 0;
  186. if (p.Identifier.IsCharacterData)
  187. {
  188. if (p.Identifier.IsArray1D)
  189. {
  190. for (int i = (int)index1; i < (int)index2; i++)
  191. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, i });
  192. }
  193. else
  194. {
  195. for (int i = (int)index1; i < (int)index2; i++)
  196. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, p.Index2, i });
  197. }
  198. }
  199. else
  200. {
  201. if (p.Identifier.IsArray1D)
  202. {
  203. for (int i = (int)index1; i < (int)index2; i++)
  204. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new long[] { i });
  205. }
  206. else if (p.Identifier.IsArray2D)
  207. {
  208. for (int i = (int)index1; i < (int)index2; i++)
  209. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, i });
  210. }
  211. else
  212. {
  213. for (int i = (int)index1; i < (int)index2; i++)
  214. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, p.Index2, i });
  215. }
  216. }
  217. return sum;
  218. }
  219. public Int64 GetArraySumChara(FixedVariableTerm p, Int64 index1, Int64 index2)
  220. {
  221. Int64 sum = 0;
  222. for (int i = (int)index1; i < (int)index2; i++)
  223. {
  224. sum += p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { i, p.Index2 });
  225. }
  226. return sum;
  227. }
  228. public string GetJoinedStr(FixedVariableTerm p, string delimiter, Int64 index1, Int64 index2)
  229. {
  230. string sum = "";
  231. if (p.IsString)
  232. {
  233. if (p.Identifier.IsArray1D)
  234. {
  235. return string.Join(delimiter, (string[])p.Identifier.GetArray(), (int)index1, (int)index2);
  236. }
  237. if (p.Identifier.IsArray2D)
  238. {
  239. for (int i = (int)index1; i < (int)index2; i++)
  240. sum += p.Identifier.GetStrValue(GlobalStatic.EMediator, new[] { p.Index1, i }) + ((i + 1 < (int)index2) ? delimiter : "");
  241. }
  242. else
  243. {
  244. for (int i = (int)index1; i < (int)index2; i++)
  245. sum += p.Identifier.GetStrValue(GlobalStatic.EMediator, new[] { p.Index1, p.Index2, i }) + ((i + 1 < (int)index2) ? delimiter : "");
  246. }
  247. }
  248. else
  249. {
  250. if (p.Identifier.IsArray1D)
  251. {
  252. for (int i = (int)index1; i < (int)index2; i++)
  253. sum += (p.Identifier.GetIntValue(GlobalStatic.EMediator, new long[] { i })) + ((i + 1 < (int)index2) ? delimiter : "");
  254. }
  255. else if (p.Identifier.IsArray2D)
  256. {
  257. for (int i = (int)index1; i < (int)index2; i++)
  258. sum += (p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, i })) + ((i + 1 < (int)index2) ? delimiter : "");
  259. }
  260. else
  261. {
  262. for (int i = (int)index1; i < (int)index2; i++)
  263. sum += (p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { p.Index1, p.Index2, i })) + ((i + 1 < (int)index2) ? delimiter : "");
  264. }
  265. }
  266. return sum;
  267. }
  268. public Int64 GetMatch(FixedVariableTerm p, Int64 target, Int64 start, Int64 end)
  269. {
  270. Int64 ret = 0;
  271. for (int i = (int)start; i < (int)end; i++)
  272. if (p.Identifier.GetIntValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, i } : new long[] { i }) == target)
  273. ret++;
  274. return ret;
  275. }
  276. public Int64 GetMatch(FixedVariableTerm p, string target, Int64 start, Int64 end)
  277. {
  278. Int64 ret = 0;
  279. bool targetIsNullOrEmpty = string.IsNullOrEmpty(target);
  280. for (int i = (int)start; i < (int)end; i++)
  281. if ((p.Identifier.GetStrValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, i } : new long[] { i }) == target) || (targetIsNullOrEmpty && string.IsNullOrEmpty(p.Identifier.GetStrValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, i } : new long[] { i }))))
  282. ret++;
  283. return ret;
  284. }
  285. public Int64 GetMatchChara(FixedVariableTerm p, Int64 target, Int64 start, Int64 end)
  286. {
  287. Int64 ret = 0;
  288. for (int i = (int)start; i < (int)end; i++)
  289. {
  290. if (p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { i, p.Index2, p.Index3 }) == target)
  291. ret++;
  292. }
  293. return ret;
  294. }
  295. public Int64 GetMatchChara(FixedVariableTerm p, string target, Int64 start, Int64 end)
  296. {
  297. Int64 ret = 0;
  298. bool targetIsNullOrEmpty = string.IsNullOrEmpty(target);
  299. for (int i = (int)start; i < (int)end; i++)
  300. {
  301. if ((p.Identifier.GetStrValue(GlobalStatic.EMediator, new[] { i, p.Index2, p.Index3 }) == target) || (targetIsNullOrEmpty && string.IsNullOrEmpty(p.Identifier.GetStrValue(GlobalStatic.EMediator, new[] { i, p.Index2, p.Index3 }))))
  302. ret++;
  303. }
  304. return ret;
  305. }
  306. public Int64 FindElement(FixedVariableTerm p, Int64 target, Int64 start, Int64 end, bool isExact, bool isLast)
  307. {
  308. Int64[] array;
  309. //指定値の配列要素の範囲外かのチェックは済んでるので、これだけでよい
  310. if (start >= end)
  311. return -1;
  312. if (p.Identifier.IsCharacterData)
  313. array = (long[])p.Identifier.GetArrayChara((int)p.Index1);
  314. else
  315. array = (Int64[])p.Identifier.GetArray();
  316. if (isLast)
  317. {
  318. for (int i = (int)end - 1; i >= (int)start; i--)
  319. {
  320. if (target == array[i])
  321. return i;
  322. }
  323. }
  324. else
  325. {
  326. for (int i = (int)start; i < (int)end; i++)
  327. {
  328. if (target == array[i])
  329. return i;
  330. }
  331. }
  332. return -1;
  333. }
  334. public Int64 FindElement(FixedVariableTerm p, Regex target, Int64 start, Int64 end, bool isExact, bool isLast)
  335. {
  336. string[] array;
  337. //指定値の配列要素の範囲外かのチェックは済んでるので、これだけでよい
  338. if (start >= end)
  339. return -1;
  340. if (p.Identifier.IsCharacterData)
  341. array = (string[])p.Identifier.GetArrayChara((int)p.Index1);
  342. else
  343. array = (string[])p.Identifier.GetArray();
  344. if (isLast)
  345. {
  346. for (int i = (int)end - 1; i >= (int)start; i--)
  347. {
  348. if (isExact)
  349. {
  350. //Nullならないものと見なして飛ばす
  351. if (array[i] == null)
  352. continue;
  353. Match match = target.Match(array[i]);
  354. //正規表現に引っかかった文字列の長さ=元の文字列の長さなら完全一致
  355. if (match.Success && array[i].Length == match.Length)
  356. return i;
  357. }
  358. else
  359. {
  360. //Nullならないものと見なして飛ばす
  361. if (array[i] == null)
  362. continue;
  363. //部分一致なのでひっかかればOK
  364. if (target.IsMatch(array[i]))
  365. return i;
  366. }
  367. }
  368. }
  369. else
  370. {
  371. for (int i = (int)start; i < (int)end; i++)
  372. {
  373. if (isExact)
  374. {
  375. //Nullならないものと見なして飛ばす
  376. if (array[i] == null)
  377. continue;
  378. //正規表現に引っかかった文字列の長さ=元の文字列の長さなら完全一致
  379. Match match = target.Match(array[i]);
  380. if (match.Success && array[i].Length == match.Length)
  381. return i;
  382. }
  383. else
  384. {
  385. //Nullならないものと見なして飛ばす
  386. if (array[i] == null)
  387. continue;
  388. //部分一致なのでひっかかればOK
  389. if (target.IsMatch(array[i]))
  390. return i;
  391. }
  392. }
  393. }
  394. return -1;
  395. }
  396. public Int64 GetMaxArray(FixedVariableTerm p, Int64 start, Int64 end, bool isMax)
  397. {
  398. Int64 value;
  399. Int64 ret = p.Identifier.GetIntValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, start } : new[] { start });
  400. for (int i = (int)start + 1; i < (int)end; i++)
  401. {
  402. value = p.Identifier.GetIntValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, i } : new long[] { i });
  403. if (isMax)
  404. {
  405. if (value > ret)
  406. ret = value;
  407. }
  408. else
  409. {
  410. if (value < ret)
  411. ret = value;
  412. }
  413. }
  414. return ret;
  415. }
  416. public Int64 GetMaxArrayChara(FixedVariableTerm p, Int64 start, Int64 end, bool isMax)
  417. {
  418. Int64 ret;
  419. Int64 value;
  420. ret = p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { start, p.Index2, p.Index3 });
  421. for (int i = (int)start + 1; i < (int)end; i++)
  422. {
  423. value = p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { i, p.Index2, p.Index3 });
  424. if (isMax)
  425. {
  426. if (value > ret)
  427. ret = value;
  428. }
  429. else
  430. {
  431. if (value < ret)
  432. ret = value;
  433. }
  434. }
  435. return ret;
  436. }
  437. public Int64 GetInRangeArray(FixedVariableTerm p, Int64 min, Int64 max, Int64 start, Int64 end)
  438. {
  439. Int64 value;
  440. Int64 ret = 0;
  441. for (int i = (int)start; i < (int)end; i++)
  442. {
  443. value = p.Identifier.GetIntValue(GlobalStatic.EMediator, p.Identifier.IsCharacterData ? new[] { p.Index1, i } : new long[] { i });
  444. if (value >= min && value < max)
  445. ret++;
  446. }
  447. return ret;
  448. }
  449. public Int64 GetInRangeArrayChara(FixedVariableTerm p, Int64 min, Int64 max, Int64 start, Int64 end)
  450. {
  451. Int64 ret = 0;
  452. Int64 value;
  453. for (int i = (int)start; i < (int)end; i++)
  454. {
  455. value = p.Identifier.GetIntValue(GlobalStatic.EMediator, new[] { i, p.Index2, p.Index3 });
  456. if (value >= min && value < max)
  457. ret++;
  458. }
  459. return ret;
  460. }
  461. public void ShiftArray(FixedVariableTerm p, int shift, Int64 def, int start, int num)
  462. {
  463. Int64[] array;
  464. if (p.Identifier.IsCharacterData)
  465. array = (long[])p.Identifier.GetArrayChara((int)p.Index1);
  466. else
  467. array = (Int64[])p.Identifier.GetArray();
  468. if (start >= array.Length)
  469. throw new CodeEE("命令ARRAYREMOVEの第4引数(" + start + ")が配列" + p.Identifier.Name + "の範囲を超えています");
  470. if (num == -1)
  471. num = array.Length - start;
  472. if ((start + num) > array.Length)
  473. num = array.Length - start;
  474. if (Math.Abs(shift) >= array.Length && start == 0 && num >= array.Length)
  475. {
  476. for (int i = 0; i < array.Length; i++)
  477. array[i] = def;
  478. return;
  479. }
  480. int sourceStart = 0;
  481. int destStart = start + shift;
  482. int length = num - Math.Abs(shift);
  483. if (shift < 0)
  484. {
  485. sourceStart = -shift;
  486. destStart = start;
  487. }
  488. Int64[] temp = new Int64[num];
  489. Buffer.BlockCopy(array, start * 8, temp, 0, 8 * num);
  490. //これを満たすのはshift > 0であることは自明
  491. if (sourceStart == 0)
  492. {
  493. if (length > 0)
  494. for (int i = start; i < (start + shift); i++)
  495. array[i] = def;
  496. else
  497. {
  498. for (int i = start; i < (start + num); i++)
  499. array[i] = def;
  500. return;
  501. }
  502. }
  503. else
  504. {
  505. if (length > 0)
  506. for (int i = (start + length); i < (start + num); i++)
  507. array[i] = def;
  508. else
  509. {
  510. for (int i = start; i < (start + num); i++)
  511. array[i] = def;
  512. return;
  513. }
  514. }
  515. //if (start > 0)
  516. // //Array.Copy(temp, 0, array, 0, start);
  517. // Buffer.BlockCopy(temp, 0, array, 0, 8 * start);
  518. if (length > 0)
  519. //Array.Copy(temp, sourceStart, array, destStart, length);
  520. Buffer.BlockCopy(temp, sourceStart * 8, array, destStart * 8, length * 8);
  521. //if ((start + num) < array.Length)
  522. // //Array.Copy(temp, (start + num), array, (start + num), array.Length - (start + num));
  523. // Buffer.BlockCopy(temp, (start + num) * 8, array, (start + num) * 8, (array.Length - (start + num)) * 8);
  524. }
  525. public void ShiftArray(FixedVariableTerm p, int shift, string def, int start, int num)
  526. {
  527. string[] arrays;
  528. if (p.Identifier.IsCharacterData)
  529. arrays = (string[])p.Identifier.GetArrayChara((int)p.Index1);
  530. else
  531. arrays = (string[])p.Identifier.GetArray();
  532. if (start >= arrays.Length)
  533. throw new CodeEE("命令ARRAYREMOVEの第4引数(" + start + ")が配列" + p.Identifier.Name + "の範囲を超えています");
  534. //for (int i = 0; i < arrays.Length; i++)
  535. // arrays[i] = "";
  536. //Array.Clear(arrays, 0, arrays.Length);
  537. if (num == -1)
  538. num = arrays.Length - start;
  539. if ((start + num) > arrays.Length)
  540. num = arrays.Length - start;
  541. if (Math.Abs(shift) >= arrays.Length && start == 0 && num >= arrays.Length)
  542. {
  543. for (int i = 0; i < arrays.Length; i++)
  544. arrays[i] = def;
  545. return;
  546. }
  547. //if (start > 0)
  548. // Array.Copy(temps, 0, arrays, 0, start);
  549. int sourceStart = 0;
  550. int destStart = start + shift;
  551. int length = num - Math.Abs(shift);
  552. if (shift < 0)
  553. {
  554. sourceStart = -shift;
  555. destStart = start;
  556. }
  557. string[] temps = new string[num];
  558. Array.Copy(arrays, start, temps, 0, num);
  559. if (destStart > start)
  560. {
  561. if (length > 0)
  562. for (int i = start; i < (start + shift); i++)
  563. arrays[i] = def;
  564. else
  565. {
  566. for (int i = start; i < (start + num); i++)
  567. arrays[i] = def;
  568. return;
  569. }
  570. }
  571. else
  572. {
  573. if (length > 0)
  574. for (int i = (start + length); i < (start + num); i++)
  575. arrays[i] = def;
  576. else
  577. {
  578. for (int i = start; i < (start + num); i++)
  579. arrays[i] = def;
  580. return;
  581. }
  582. }
  583. if (length > 0)
  584. Array.Copy(temps, sourceStart, arrays, destStart, length);
  585. //if ((start + num) < arrays.Length)
  586. // Array.Copy(temps, (start + num), arrays, (start + num), arrays.Length - (start + num));
  587. }
  588. public void RemoveArray(FixedVariableTerm p, int start, int num)
  589. {
  590. if (p.Identifier.IsInteger)
  591. {
  592. Int64[] array;
  593. if (p.Identifier.IsCharacterData)
  594. array = (long[])p.Identifier.GetArrayChara((int)p.Index1);
  595. else
  596. array = (Int64[])p.Identifier.GetArray();
  597. if (start >= array.Length)
  598. throw new CodeEE("命令ARRAYREMOVEの第2引数(" + start + ")が配列" + p.Identifier.Name + "の範囲を超えています");
  599. if (num <= 0)
  600. num = array.Length;
  601. Int64[] temp = new Int64[array.Length];
  602. //array.CopyTo(temp, 0);
  603. //for (int i = 0; i < array.Length; i++)
  604. // array[i] = 0;
  605. //Array.Clear(array, 0, array.Length);
  606. if (start > 0)
  607. //Array.Copy(array, 0, temp, 0, start);
  608. Buffer.BlockCopy(array, 0, temp, 0, start * 8);
  609. if ((start + num) < array.Length)
  610. //Array.Copy(array, (start + num), temp, start, (array.Length - (start + num)));
  611. Buffer.BlockCopy(array, (start + num) * 8, temp, start * 8, (array.Length - (start + num)) * 8);
  612. //temp.CopyTo(array, 0);
  613. Buffer.BlockCopy(temp, 0, array, 0, temp.Length * 8);
  614. }
  615. else
  616. {
  617. string[] arrays;
  618. if (p.Identifier.IsCharacterData)
  619. arrays = (string[])p.Identifier.GetArrayChara((int)p.Index1);
  620. else
  621. arrays = (string[])p.Identifier.GetArray();
  622. if (num <= 0)
  623. num = arrays.Length;
  624. string[] temps = new string[arrays.Length];
  625. //arrays.CopyTo(temps, 0);
  626. //for (int i = 0; i < arrays.Length; i++)
  627. // arrays[i] = "";
  628. if (start > 0)
  629. Array.Copy(arrays, 0, temps, 0, start);
  630. if ((start + num) < arrays.Length)
  631. Array.Copy(arrays, (start + num), temps, start, (arrays.Length - (start + num)));
  632. temps.CopyTo(arrays, 0);
  633. }
  634. }
  635. public void SortArray(FixedVariableTerm p, SortOrder order, int start, int num)
  636. {
  637. if (order == SortOrder.UNDEF)
  638. order = SortOrder.ASCENDING;
  639. if (p.Identifier.IsInteger)
  640. {
  641. Int64[] array;
  642. if (p.Identifier.IsCharacterData)
  643. array = (long[])p.Identifier.GetArrayChara((int)p.Index1);
  644. else
  645. array = (Int64[])p.Identifier.GetArray();
  646. if (start >= array.Length)
  647. throw new CodeEE("命令ARRAYSORTの第3引数(" + start + ")が配列" + p.Identifier.Name + "の範囲を超えています");
  648. if (num <= 0)
  649. num = array.Length - start;
  650. Int64[] temp = new Int64[num];
  651. Array.Copy(array, start, temp, 0, num);
  652. if (order == SortOrder.ASCENDING)
  653. Array.Sort(temp);
  654. else if (order == SortOrder.DESENDING)
  655. Array.Sort(temp, delegate(Int64 a, Int64 b) { return b.CompareTo(a); });
  656. Array.Copy(temp, 0, array, start, num);
  657. }
  658. else
  659. {
  660. string[] array;
  661. if (p.Identifier.IsCharacterData)
  662. array = (string[])p.Identifier.GetArrayChara((int)p.Index1);
  663. else
  664. array = (string[])p.Identifier.GetArray();
  665. if (start >= array.Length)
  666. throw new CodeEE("命令ARRAYSORTの第3引数(" + start + ")が配列" + p.Identifier.Name + "の範囲を超えています");
  667. if (num <= 0)
  668. num = array.Length - start;
  669. string[] temp = new string[num];
  670. Array.Copy(array, start, temp, 0, num);
  671. if (order == SortOrder.ASCENDING)
  672. Array.Sort(temp);
  673. else if (order == SortOrder.DESENDING)
  674. Array.Sort(temp, delegate(string a, string b) { return b.CompareTo(a); });
  675. Array.Copy(temp, 0, array, start, num);
  676. }
  677. }
  678. public void CopyArray(VariableToken var1, VariableToken var2)
  679. {
  680. if (var1.IsInteger)
  681. {
  682. if (var1.IsArray1D)
  683. {
  684. Int64[] array1 = (Int64[])var1.GetArray();
  685. Int64[] array2 = (Int64[])var2.GetArray();
  686. int length = (array1.Length >= array2.Length) ? array2.Length : array1.Length;
  687. for (int i = 0; i < length; i++)
  688. array2[i] = array1[i];
  689. }
  690. else if (var1.IsArray2D)
  691. {
  692. Int64[,] array1 = (Int64[,])var1.GetArray();
  693. Int64[,] array2 = (Int64[,])var2.GetArray();
  694. int length1 = (array1.GetLength(0) >= array2.GetLength(0)) ? array2.GetLength(0) : array1.GetLength(0);
  695. int length2 = (array1.GetLength(1) >= array2.GetLength(1)) ? array2.GetLength(1) : array1.GetLength(1);
  696. for (int i = 0; i < length1; i++)
  697. {
  698. for (int j = 0; j < length2; j++)
  699. array2[i, j] = array1[i, j];
  700. }
  701. }
  702. else
  703. {
  704. Int64[, ,] array1 = (Int64[, ,])var1.GetArray();
  705. Int64[, ,] array2 = (Int64[, ,])var2.GetArray();
  706. int length1 = (array1.GetLength(0) >= array2.GetLength(0)) ? array2.GetLength(0) : array1.GetLength(0);
  707. int length2 = (array1.GetLength(1) >= array2.GetLength(1)) ? array2.GetLength(1) : array1.GetLength(1);
  708. int length3 = (array1.GetLength(2) >= array2.GetLength(2)) ? array2.GetLength(2) : array1.GetLength(2);
  709. for (int i = 0; i < length1; i++)
  710. {
  711. for (int j = 0; j < length2; j++)
  712. {
  713. for (int k = 0; k < length3; k++)
  714. array2[i, j, k] = array1[i, j, k];
  715. }
  716. }
  717. }
  718. }
  719. else
  720. {
  721. if (var1.IsArray1D)
  722. {
  723. string[] array1 = (string[])var1.GetArray();
  724. string[] array2 = (string[])var2.GetArray();
  725. int length = (array1.Length >= array2.Length) ? array2.Length : array1.Length;
  726. for (int i = 0; i < length; i++)
  727. array2[i] = array1[i];
  728. }
  729. else if (var1.IsArray2D)
  730. {
  731. string[,] array1 = (string[,])var1.GetArray();
  732. string[,] array2 = (string[,])var2.GetArray();
  733. int length1 = (array1.GetLength(0) >= array2.GetLength(0)) ? array2.GetLength(0) : array1.GetLength(0);
  734. int length2 = (array1.GetLength(1) >= array2.GetLength(1)) ? array2.GetLength(1) : array1.GetLength(1);
  735. for (int i = 0; i < length1; i++)
  736. {
  737. for (int j = 0; j < length2; j++)
  738. array2[i, j] = array1[i, j];
  739. }
  740. }
  741. else
  742. {
  743. string[, ,] array1 = (string[, ,])var1.GetArray();
  744. string[, ,] array2 = (string[, ,])var2.GetArray();
  745. int length1 = (array1.GetLength(0) >= array2.GetLength(0)) ? array2.GetLength(0) : array1.GetLength(0);
  746. int length2 = (array1.GetLength(1) >= array2.GetLength(1)) ? array2.GetLength(1) : array1.GetLength(1);
  747. int length3 = (array1.GetLength(2) >= array2.GetLength(2)) ? array2.GetLength(2) : array1.GetLength(2);
  748. for (int i = 0; i < length1; i++)
  749. {
  750. for (int j = 0; j < length2; j++)
  751. {
  752. for (int k = 0; k < length3; k++)
  753. array2[i, j, k] = array1[i, j, k];
  754. }
  755. }
  756. }
  757. }
  758. }
  759. public string GetHavingItemsString()
  760. {
  761. Int64[] array = ITEM;
  762. string[] itemnames = ITEMNAME;
  763. int length = Math.Min(array.Length, itemnames.Length);
  764. int count = 0;
  765. StringBuilder builder = new StringBuilder(100);
  766. builder.Append("Owned Items: ");
  767. for (int i = 0; i < length; i++)
  768. {
  769. if (array[i] == 0)
  770. continue;
  771. count++;
  772. if (itemnames[i] != null)
  773. builder.Append(Translation.translate(itemnames[i], "Item", true));//Bartoum: This is for PRINT_ITEM
  774. builder.Append("(");
  775. builder.Append(array[i].ToString());
  776. builder.Append(") ");
  777. }
  778. if (count == 0)
  779. builder.Append("None");
  780. return builder.ToString();
  781. }
  782. //public string GetItemSalesString()
  783. //{
  784. // Int64[] itemsales = varData.DataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ITEMSALES];
  785. // string[] itemname = constant.GetCsvNameList(VariableCode.ITEMNAME);
  786. // StringBuilder builder = new StringBuilder(100);
  787. // for (int i = 0; i < itemsales.Length; i++)
  788. // {
  789. // if (itemsales[i] != 0)
  790. // continue;
  791. // builder.Append(itemname[i]);
  792. // builder.Append("(");
  793. // builder.Append(itemsales[i].ToString());
  794. // builder.Append(")");
  795. // }
  796. // return builder.ToString();
  797. //}
  798. public string GetCharacterDataString(Int64 target, FunctionCode func)
  799. {
  800. StringBuilder builder = new StringBuilder(100);
  801. if ((target < 0) || (target >= varData.CharacterList.Count))
  802. throw new CodeEE("Attempted to reference a registered character that does not exist");
  803. CharacterData chara = varData.CharacterList[(int)target];
  804. Int64[] array = null;
  805. string[] arrayName = null;
  806. int i = 0;
  807. switch (func)
  808. {
  809. case FunctionCode.PRINT_ABL:
  810. array = chara.DataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.ABL];
  811. arrayName = constant.GetCsvNameList(VariableCode.ABLNAME);
  812. for (i = 0; i < array.Length; i++)
  813. {
  814. if (i >= arrayName.Length)
  815. break;
  816. if (array[i] == 0)
  817. continue;
  818. if (string.IsNullOrEmpty(arrayName[i]))
  819. continue;
  820. builder.Append(arrayName[i]);
  821. builder.Append("LV");
  822. builder.Append(array[i].ToString());
  823. builder.Append(" ");
  824. }
  825. break;
  826. case FunctionCode.PRINT_TALENT:
  827. array = chara.DataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.TALENT];
  828. arrayName = constant.GetCsvNameList(VariableCode.TALENTNAME);
  829. for (i = 0; i < array.Length; i++)
  830. {
  831. if (i >= arrayName.Length)
  832. break;
  833. if (array[i] == 0)
  834. continue;
  835. if (string.IsNullOrEmpty(arrayName[i]))
  836. continue;
  837. builder.Append("[");
  838. builder.Append(arrayName[i]);
  839. builder.Append("]");
  840. }
  841. break;
  842. case FunctionCode.PRINT_MARK:
  843. array = chara.DataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.MARK];
  844. arrayName = constant.GetCsvNameList(VariableCode.MARKNAME);
  845. for (i = 0; i < array.Length; i++)
  846. {
  847. if (i >= arrayName.Length)
  848. break;
  849. if (array[i] == 0)
  850. continue;
  851. if (string.IsNullOrEmpty(arrayName[i]))
  852. continue;
  853. builder.Append(arrayName[i]);
  854. builder.Append("LV");
  855. builder.Append(array[i].ToString());
  856. builder.Append(" ");
  857. }
  858. break;
  859. case FunctionCode.PRINT_EXP:
  860. array = chara.DataIntegerArray[(int)VariableCode.__LOWERCASE__ & (int)VariableCode.EXP];
  861. arrayName = constant.GetCsvNameList(VariableCode.EXPNAME);
  862. for (i = 0; i < array.Length; i++)
  863. {
  864. if (i >= arrayName.Length)
  865. break;
  866. if (array[i] == 0)
  867. continue;
  868. if (string.IsNullOrEmpty(arrayName[i]))
  869. continue;
  870. builder.Append(arrayName[i]);
  871. builder.Append(array[i].ToString());
  872. builder.Append(" ");
  873. }
  874. break;
  875. //現状ここに来ることはないはず
  876. //default:
  877. // throw new ExeEE("未定義の関数");
  878. }
  879. return builder.ToString();
  880. }
  881. public string GetCharacterParamString(Int64 target, int paramCode)
  882. {
  883. if ((target < 0) || (target >= varData.CharacterList.Count))
  884. throw new CodeEE("Attempted to reference a registered character that does not exist");
  885. //そもそも呼び出し元がint i = 0; i < 100; i++)でこの条件が満たされる可能性0
  886. //if ((paramCode < 0) || (paramCode >= constant.ParamName.Length))
  887. // throw new ExeEE("存在しない名称を取得しようとした");
  888. CharacterData chara = varData.CharacterList[(int)target];
  889. Int64 param = chara.DataIntegerArray[(int)(VariableCode.PALAM & VariableCode.__LOWERCASE__)][paramCode];
  890. Int64[] paramlv = varData.DataIntegerArray[(int)(VariableCode.PALAMLV & VariableCode.__LOWERCASE__)];
  891. string paramName = constant.GetCsvNameList(VariableCode.PALAMNAME)[paramCode];
  892. paramName = Translation.translate(paramName, "Palam", true);//Bartoum: this is for PRINT_PALAM
  893. if ((param == 0) && (string.IsNullOrEmpty(paramName)))
  894. return null;
  895. if (paramName == null)
  896. paramName = "";
  897. char c = '-';
  898. Int64 border = paramlv[1];
  899. if (param >= border)
  900. {
  901. c = '=';
  902. border = paramlv[2];
  903. }
  904. if (param >= border)
  905. {
  906. c = '>';
  907. border = paramlv[3];
  908. }
  909. if (param >= border)
  910. {
  911. c = '*';
  912. border = paramlv[4];
  913. }
  914. StringBuilder bar = new StringBuilder(100);
  915. bar.Append('[');
  916. if ((border <= 0) || (border <= param))
  917. bar.Append(c, 10);
  918. else if (param <= 0)
  919. bar.Append('.', 10);
  920. else
  921. {
  922. unchecked
  923. {
  924. int count = (int)(param * 10 / border);
  925. bar.Append(c, count);
  926. bar.Append('.', 10 - count);
  927. }
  928. }
  929. bar.Append(']');
  930. return string.Format("{0}{1}{2,6}", paramName, bar, param);
  931. }
  932. public void AddCharacter(Int64 charaTmplNo)
  933. {
  934. CharacterTemplate tmpl = constant.GetCharacterTemplate(charaTmplNo);
  935. if (tmpl == null)
  936. throw new CodeEE("Attempted to create an undefined character");
  937. CharacterData chara = new CharacterData(constant, tmpl, varData);
  938. varData.CharacterList.Add(chara);
  939. }
  940. public void AddCharacter_UseSp(Int64 charaTmplNo, bool isSp)
  941. {
  942. CharacterTemplate tmpl = constant.GetCharacterTemplate_UseSp(charaTmplNo, isSp);
  943. if (tmpl == null)
  944. throw new CodeEE("Attempted to create an undefined character");
  945. CharacterData chara = new CharacterData(constant, tmpl, varData);
  946. varData.CharacterList.Add(chara);
  947. }
  948. public void AddCharacterFromCsvNo(Int64 CsvNo)
  949. {
  950. CharacterTemplate tmpl = constant.GetCharacterTemplateFromCsvNo(CsvNo);
  951. if (tmpl == null)
  952. //throw new CodeEE("Attempted to create an undefined character");
  953. tmpl = constant.GetPseudoChara();
  954. CharacterData chara = new CharacterData(constant, tmpl, varData);
  955. varData.CharacterList.Add(chara);
  956. }
  957. public void AddPseudoCharacter()
  958. {
  959. CharacterTemplate tmpl = constant.GetPseudoChara();
  960. CharacterData chara = new CharacterData(constant, tmpl, varData);
  961. varData.CharacterList.Add(chara);
  962. }
  963. public void DelCharacter(Int64 charaNo)
  964. {
  965. if ((charaNo < 0) || (charaNo >= varData.CharacterList.Count))
  966. throw new CodeEE("Attempted to delete registered characters (" + charaNo + ") that do not exist");
  967. varData.CharacterList[(int)charaNo].Dispose();
  968. varData.CharacterList.RemoveAt((int)charaNo);
  969. }
  970. public void DelCharacter(Int64[] charaNoList)
  971. {
  972. List<CharacterData> DelList = new List<CharacterData>();
  973. foreach(Int64 charaNo in charaNoList)
  974. {
  975. if ((charaNo < 0) || (charaNo >= varData.CharacterList.Count))
  976. throw new CodeEE("Attempted to delete registered characters (" + charaNoList + ") that do not exist");
  977. CharacterData chara = varData.CharacterList[(int)charaNo];
  978. if (DelList.Contains(chara))
  979. throw new CodeEE("Identical registered character number (" + charaNo + ") has been specified more than once");
  980. DelList.Add(chara);
  981. chara.Dispose();
  982. }
  983. foreach (CharacterData chara in DelList)
  984. varData.CharacterList.Remove(chara);
  985. }
  986. public void DelAllCharacter()
  987. {
  988. if (varData.CharacterList.Count == 0)
  989. return;
  990. foreach (CharacterData chara in varData.CharacterList)
  991. chara.Dispose();
  992. varData.CharacterList.Clear();
  993. }
  994. public void PickUpChara(Int64[] NoList)
  995. {
  996. List<Int64> pickList = new List<long>();
  997. Int64 oldTarget = TARGET;
  998. Int64 oldAssi = ASSI;
  999. Int64 oldMaster = MASTER;
  1000. TARGET = -1;
  1001. ASSI = -1;
  1002. MASTER = -1;
  1003. //同じキャラが複数出てこないようにリストを整理
  1004. for (int i = 0; i < NoList.Length; i++)
  1005. {
  1006. if (!pickList.Contains(NoList[i]) && NoList[i] >= 0)
  1007. pickList.Add(NoList[i]);
  1008. }
  1009. for (int i = 0; i < pickList.Count; i++)
  1010. {
  1011. if (i != pickList[i])
  1012. {
  1013. SwapChara(pickList[i], i);
  1014. if (pickList.IndexOf(i) > i)
  1015. pickList[pickList.IndexOf(i)] = pickList[i];
  1016. }
  1017. if (TARGET < 0 && pickList[i] == oldTarget)
  1018. TARGET = i;
  1019. if (ASSI < 0 && pickList[i] == oldAssi)
  1020. ASSI = i;
  1021. if (MASTER < 0 && pickList[i] == oldMaster)
  1022. MASTER = i;
  1023. }
  1024. if (pickList.Count < varData.CharacterList.Count)
  1025. {
  1026. for (int i = (varData.CharacterList.Count - 1); i >= pickList.Count; i--)
  1027. DelCharacter(i);
  1028. }
  1029. }
  1030. public void ResetData()
  1031. {
  1032. //グローバルは初期化しない方が都合がよい。
  1033. //varData.SetDefaultGlobalValue();
  1034. varData.SetDefaultLocalValue();
  1035. varData.SetDefaultValue(constant);
  1036. foreach (CharacterData chara in varData.CharacterList)
  1037. chara.Dispose();
  1038. varData.CharacterList.Clear();
  1039. }
  1040. public void ResetGlobalData()
  1041. {
  1042. varData.SetDefaultGlobalValue();
  1043. }
  1044. public void CopyChara(Int64 x, Int64 y)
  1045. {
  1046. if ((x < 0) || (x >= varData.CharacterList.Count))
  1047. throw new CodeEE("Source of a copy character does not exist");
  1048. if ((y < 0) || (y >= varData.CharacterList.Count))
  1049. throw new CodeEE("Destination of a copy character does not exist");
  1050. varData.CharacterList[(int)x].CopyTo(varData.CharacterList[(int)y], varData);
  1051. }
  1052. public void AddCopyChara(Int64 x)
  1053. {
  1054. if ((x < 0) || (x >= varData.CharacterList.Count))
  1055. throw new CodeEE("Source of a copy character does not exist");
  1056. AddPseudoCharacter();
  1057. varData.CharacterList[(int)x].CopyTo(varData.CharacterList[varData.CharacterList.Count - 1], varData);
  1058. }
  1059. public void SwapChara(Int64 x, Int64 y)
  1060. {
  1061. if (((x < 0) || (x >= varData.CharacterList.Count)) || ((y < 0) || (y >= varData.CharacterList.Count)))
  1062. throw new CodeEE("Attempted to replace a registered character that does not exist");
  1063. if (x == y)
  1064. return;
  1065. CharacterData data = varData.CharacterList[(int)y];
  1066. varData.CharacterList[(int)y] = varData.CharacterList[(int)x];
  1067. varData.CharacterList[(int)x] = data;
  1068. }
  1069. public void SortChara(VariableToken sortkey, Int64 elem, SortOrder sortorder, bool fixMaster)
  1070. {
  1071. if (varData.CharacterList.Count <= 1)
  1072. return;
  1073. if (sortorder == SortOrder.UNDEF)
  1074. sortorder = SortOrder.ASCENDING;
  1075. if (sortkey == null)
  1076. sortkey = GlobalStatic.VariableData.GetSystemVariableToken("NO");
  1077. CharacterData masterChara = null;
  1078. CharacterData targetChara = null;
  1079. CharacterData assiChara = null;
  1080. if (MASTER >= 0 && MASTER < varData.CharacterList.Count)
  1081. masterChara = varData.CharacterList[(int)MASTER];
  1082. if (TARGET >= 0 && TARGET < varData.CharacterList.Count)
  1083. targetChara = varData.CharacterList[(int)TARGET];
  1084. if (ASSI >= 0 && ASSI < varData.CharacterList.Count)
  1085. assiChara = varData.CharacterList[(int)ASSI];
  1086. for (int i = 0; i < varData.CharacterList.Count; i++)
  1087. {
  1088. varData.CharacterList[i].temp_CurrentOrder = i;
  1089. varData.CharacterList[i].SetSortKey(sortkey, elem);
  1090. }
  1091. if ((fixMaster) && (masterChara != null))
  1092. {
  1093. if (varData.CharacterList.Count <= 2)
  1094. return;
  1095. varData.CharacterList.Remove(masterChara);
  1096. }
  1097. if (sortorder == SortOrder.ASCENDING)
  1098. varData.CharacterList.Sort(CharacterData.AscCharacterComparison);
  1099. else// if (sortorder == SortOrder.DESENDING)
  1100. varData.CharacterList.Sort(CharacterData.DescCharacterComparison);
  1101. //引数解析でチェック済み
  1102. //else
  1103. // throw new ExeEE("ソート順序不明");
  1104. if ((fixMaster) && (masterChara != null))
  1105. {
  1106. varData.CharacterList.Insert((int)MASTER, masterChara);
  1107. }
  1108. for (int i = 0; i < varData.CharacterList.Count; i++)
  1109. varData.CharacterList[i].temp_CurrentOrder = i;
  1110. if ((masterChara != null) && (!fixMaster))
  1111. MASTER = masterChara.temp_CurrentOrder;
  1112. if (targetChara != null)
  1113. TARGET = targetChara.temp_CurrentOrder;
  1114. if (assiChara != null)
  1115. ASSI = assiChara.temp_CurrentOrder;
  1116. }
  1117. internal Int64 FindChara(VariableToken varID, Int64 elem64, string word, Int64 startIndex, Int64 lastIndex, bool isLast)
  1118. {
  1119. if (startIndex >= lastIndex)
  1120. return -1;
  1121. FixedVariableTerm fvp = new FixedVariableTerm(varID);
  1122. if (varID.IsArray1D)
  1123. fvp.Index2 = elem64;
  1124. else if (varID.IsArray2D)
  1125. {
  1126. fvp.Index2 = elem64 >> 32;
  1127. fvp.Index3 = elem64 & 0x7FFFFFFF;
  1128. }
  1129. int count = varData.CharacterList.Count;
  1130. if (isLast)
  1131. {
  1132. for (Int64 i = lastIndex - 1; i >= startIndex; i--)
  1133. {
  1134. fvp.Index1 = i;
  1135. if (word == fvp.GetStrValue(null))
  1136. return i;
  1137. }
  1138. }
  1139. else
  1140. {
  1141. for (Int64 i = startIndex; i < lastIndex; i++)
  1142. {
  1143. fvp.Index1 = i;
  1144. if (word == fvp.GetStrValue(null))
  1145. return i;
  1146. }
  1147. }
  1148. return -1;
  1149. }
  1150. internal Int64 FindChara(VariableToken varID, Int64 elem64, Int64 word, Int64 startIndex, Int64 lastIndex, bool isLast)
  1151. {
  1152. if (startIndex >= lastIndex)
  1153. return -1;
  1154. FixedVariableTerm fvp = new FixedVariableTerm(varID);
  1155. if (varID.IsArray1D)
  1156. fvp.Index2 = elem64;
  1157. else if (varID.IsArray2D)
  1158. {
  1159. fvp.Index2 = elem64 >> 32;
  1160. fvp.Index3 = elem64 & 0x7FFFFFFF;
  1161. }
  1162. int count = varData.CharacterList.Count;
  1163. if (isLast)
  1164. {
  1165. for (Int64 i = lastIndex - 1; i >= startIndex; i--)
  1166. {
  1167. fvp.Index1 = i;
  1168. if (word == fvp.GetIntValue(null))
  1169. return i;
  1170. }
  1171. }
  1172. else
  1173. {
  1174. for (Int64 i = startIndex; i < lastIndex; i++)
  1175. {
  1176. fvp.Index1 = i;
  1177. if (word == fvp.GetIntValue(null))
  1178. return i;
  1179. }
  1180. }
  1181. return -1;
  1182. }
  1183. public Int64 GetChara(Int64 charaNo)
  1184. {
  1185. int i;
  1186. for (i = 0; i < varData.CharacterList.Count; i++)
  1187. {
  1188. if (varData.CharacterList[i].NO == charaNo)
  1189. return i;
  1190. }
  1191. return -1;
  1192. }
  1193. public Int64 GetChara_UseSp(Int64 charaNo, bool getSp)
  1194. {
  1195. //後天的にNOを変更する場合も考慮し、chara*.csvで定義されているかどうかは調べない。
  1196. //CharacterTemplate tmpl = constant.GetCharacterTemplate(charaNo, false);
  1197. //if (tmpl == null)
  1198. // return -1;
  1199. int i;
  1200. for (i = 0; i < varData.CharacterList.Count; i++)
  1201. {
  1202. if (varData.CharacterList[i].NO == charaNo)
  1203. {
  1204. bool isSp = varData.CharacterList[i].CFlag[0] != 0;
  1205. if (isSp == getSp)
  1206. return i;
  1207. }
  1208. }
  1209. return -1;
  1210. }
  1211. public Int64 ExistCsv(Int64 charaNo, bool getSp)
  1212. {
  1213. //SPキャラ廃止に伴う問題は呼び出し元で処理
  1214. CharacterTemplate tmpl = constant.GetCharacterTemplate_UseSp(charaNo, getSp);
  1215. if (tmpl == null)
  1216. return 0;
  1217. return 1;
  1218. }
  1219. public string GetCharacterStrfromCSVData(Int64 charaTmplNo, CharacterStrData type, bool isSp, Int64 arg2Long)
  1220. {
  1221. //SPキャラ廃止に伴う問題は呼び出し元で処理
  1222. CharacterTemplate tmpl = constant.GetCharacterTemplate_UseSp(charaTmplNo, isSp);
  1223. if (tmpl == null)
  1224. throw new CodeEE("Attempted to refer to an undefined character");
  1225. int arg2 = (int)arg2Long;
  1226. switch (type)
  1227. {
  1228. case CharacterStrData.CALLNAME:
  1229. if (tmpl.Callname != null)
  1230. return tmpl.Callname;
  1231. else
  1232. return "";
  1233. case CharacterStrData.NAME:
  1234. if (tmpl.Name != null)
  1235. return tmpl.Name;
  1236. else
  1237. return "";
  1238. case CharacterStrData.NICKNAME:
  1239. if (tmpl.Nickname != null)
  1240. return tmpl.Nickname;
  1241. else
  1242. return "";
  1243. case CharacterStrData.MASTERNAME:
  1244. if (tmpl.Mastername != null)
  1245. return tmpl.Mastername;
  1246. else
  1247. return "";
  1248. case CharacterStrData.CSTR:
  1249. if (tmpl.CStr != null)
  1250. {
  1251. string ret = null;
  1252. if (arg2 >= tmpl.ArrayStrLength(CharacterStrData.CSTR) || arg2 < 0)
  1253. throw new CodeEE("Attempted reference is out of the CSTR reference range");
  1254. if (tmpl.CStr.TryGetValue(arg2, out ret))
  1255. return ret;
  1256. return "";
  1257. }
  1258. else
  1259. return "";
  1260. default:
  1261. throw new CodeEE("Attempted to reference data that does not exist");
  1262. }
  1263. }
  1264. public Int64 GetCharacterIntfromCSVData(Int64 charaTmplNo, CharacterIntData type, bool isSp, Int64 arg2Long)
  1265. {
  1266. //SPキャラ廃止に伴う問題は呼び出し元で処理
  1267. CharacterTemplate tmpl = constant.GetCharacterTemplate_UseSp(charaTmplNo, isSp);
  1268. if (tmpl == null)
  1269. throw new CodeEE("Attempted to refer to an undefined character");
  1270. if (arg2Long >= tmpl.ArrayLength(type) || arg2Long < 0)
  1271. throw new CodeEE("Attempted reference is out of the reference range");
  1272. int arg2 = (int)arg2Long;
  1273. Dictionary<int, Int64> intDic = null;
  1274. switch (type)
  1275. {
  1276. case CharacterIntData.BASE:
  1277. intDic = tmpl.Maxbase; break;
  1278. case CharacterIntData.MARK:
  1279. intDic = tmpl.Mark; break;
  1280. case CharacterIntData.ABL:
  1281. intDic = tmpl.Abl; break;
  1282. case CharacterIntData.EXP:
  1283. intDic = tmpl.Exp; break;
  1284. case CharacterIntData.RELATION:
  1285. intDic = tmpl.Relation; break;
  1286. case CharacterIntData.TALENT:
  1287. intDic = tmpl.Talent; break;
  1288. case CharacterIntData.CFLAG:
  1289. intDic = tmpl.CFlag; break;
  1290. case CharacterIntData.EQUIP:
  1291. intDic = tmpl.Equip; break;
  1292. case CharacterIntData.JUEL:
  1293. intDic = tmpl.Juel; break;
  1294. default:
  1295. throw new CodeEE("Attempted to reference data that does not exist");
  1296. }
  1297. Int64 ret;
  1298. if (intDic.TryGetValue(arg2, out ret))
  1299. return ret;
  1300. return 0L;
  1301. }
  1302. public void UpdateInBeginTrain()
  1303. {
  1304. ASSIPLAY = 0;
  1305. PREVCOM = -1;
  1306. NEXTCOM = -1;
  1307. Int64[] array;
  1308. string[] sarray;
  1309. array = varData.DataIntegerArray[(int)(VariableCode.TFLAG & VariableCode.__LOWERCASE__)];
  1310. for (int i = 0; i < array.Length; i++)
  1311. array[i] = 0;
  1312. sarray = varData.DataStringArray[(int)(VariableCode.TSTR & VariableCode.__LOWERCASE__)];
  1313. for (int i = 0; i < sarray.Length; i++)
  1314. sarray[i] = "";
  1315. //本家の仕様にあわせ、選択中以外のキャラクタも全部リセット。
  1316. foreach (CharacterData chara in varData.CharacterList)
  1317. {
  1318. array = chara.DataIntegerArray[(int)(VariableCode.GOTJUEL & VariableCode.__LOWERCASE__)];
  1319. for (int i = 0; i < array.Length; i++)
  1320. array[i] = 0;
  1321. array = chara.DataIntegerArray[(int)(VariableCode.TEQUIP & VariableCode.__LOWERCASE__)];
  1322. for (int i = 0; i < array.Length; i++)
  1323. array[i] = 0;
  1324. array = chara.DataIntegerArray[(int)(VariableCode.EX & VariableCode.__LOWERCASE__)];
  1325. for (int i = 0; i < array.Length; i++)
  1326. array[i] = 0;
  1327. //STAINは関数に切り出す(RESET_STAIN対応のため)
  1328. setDefaultStain(chara);
  1329. array = chara.DataIntegerArray[(int)(VariableCode.PALAM & VariableCode.__LOWERCASE__)];
  1330. for (int i = 0; i < array.Length; i++)
  1331. array[i] = 0;
  1332. //1.728 このタイミングでSOURCEも更新されていた
  1333. array = chara.DataIntegerArray[(int)(VariableCode.SOURCE & VariableCode.__LOWERCASE__)];
  1334. for (int i = 0; i < array.Length; i++)
  1335. array[i] = 0;
  1336. //1.728 NOWEXはここでは更新されていない
  1337. //1736f CTFLAGはTFLAGと同じ仕様で
  1338. array = chara.DataIntegerArray[(int)(VariableCode.TCVAR & VariableCode.__LOWERCASE__)];
  1339. for (int i = 0; i < array.Length; i++)
  1340. array[i] = 0;
  1341. }
  1342. }
  1343. public void UpdateAfterShowUsercom()
  1344. {
  1345. //UP = 0,DOWN = 0,LOSEBASE = 0
  1346. Int64[] array;
  1347. array = varData.DataIntegerArray[(int)(VariableCode.UP & VariableCode.__LOWERCASE__)];
  1348. for (int i = 0; i < array.Length; i++)
  1349. array[i] = 0;
  1350. array = varData.DataIntegerArray[(int)(VariableCode.DOWN & VariableCode.__LOWERCASE__)];
  1351. for (int i = 0; i < array.Length; i++)
  1352. array[i] = 0;
  1353. array = varData.DataIntegerArray[(int)(VariableCode.LOSEBASE & VariableCode.__LOWERCASE__)];
  1354. for (int i = 0; i < array.Length; i++)
  1355. array[i] = 0;
  1356. foreach (CharacterData chara in varData.CharacterList)
  1357. {
  1358. array = chara.DataIntegerArray[(int)(VariableCode.DOWNBASE & VariableCode.__LOWERCASE__)];
  1359. for (int i = 0; i < array.Length; i++)
  1360. array[i] = 0;
  1361. array = chara.DataIntegerArray[(int)(VariableCode.CUP & VariableCode.__LOWERCASE__)];
  1362. for (int i = 0; i < array.Length; i++)
  1363. array[i] = 0;
  1364. array = chara.DataIntegerArray[(int)(VariableCode.CDOWN & VariableCode.__LOWERCASE__)];
  1365. for (int i = 0; i < array.Length; i++)
  1366. array[i] = 0;
  1367. }
  1368. //SOURCEはリセットタイミングが違うので消し
  1369. //1.728 NOWEXも微妙に違うので移動
  1370. }
  1371. //1.728 NOWEXもリセットタイミングが違うので移動
  1372. //UP,DOWN,LOSEBASEはUSERCOMに移動する場合にもリセットされるがNOWEXはCOMが実行される場合のみ更新される
  1373. //なのでEVENTCOM直前に呼ぶ
  1374. public void UpdateAfterInputCom()
  1375. {
  1376. //本家の仕様にあわせ、選択中以外のキャラクタも全部リセット。
  1377. Int64[] array;
  1378. foreach (CharacterData chara in varData.CharacterList)
  1379. {
  1380. array = chara.DataIntegerArray[(int)(VariableCode.NOWEX & VariableCode.__LOWERCASE__)];
  1381. for (int i = 0; i < array.Length; i++)
  1382. array[i] = 0;
  1383. }
  1384. }
  1385. //SOURCEのリセットタイミングはUP、DOWN、LOSEBASE、NOWEXと違いSOURCECHECK終了後なので切り分け
  1386. public void UpdateAfterSourceCheck()
  1387. {
  1388. //本家の仕様にあわせ、選択中以外のキャラクタも全部リセット。
  1389. Int64[] array;
  1390. foreach (CharacterData chara in varData.CharacterList)
  1391. {
  1392. array = chara.DataIntegerArray[(int)(VariableCode.SOURCE & VariableCode.__LOWERCASE__)];
  1393. for (int i = 0; i < array.Length; i++)
  1394. array[i] = 0;
  1395. }
  1396. }
  1397. //PREVCOMは更新されない。スクリプトの方で更新する必要がある。
  1398. //Data側からEmueraConsoleを操作するのはここだけ。
  1399. //1756 ↑だったのは今は昔の話である
  1400. public void UpdateInUpcheck(IConsole window, bool skipPrint)
  1401. {
  1402. Int64[] up, down, param;
  1403. string[] paramname = constant.GetCsvNameList(VariableCode.PALAMNAME);
  1404. up = varData.DataIntegerArray[(int)(VariableCode.UP & VariableCode.__LOWERCASE__)];
  1405. down = varData.DataIntegerArray[(int)(VariableCode.DOWN & VariableCode.__LOWERCASE__)];
  1406. Int64 target = TARGET;
  1407. if ((target < 0) || (target >= varData.CharacterList.Count))
  1408. goto end;
  1409. CharacterData chara = varData.CharacterList[(int)target];
  1410. param = chara.DataIntegerArray[(int)(VariableCode.PALAM & VariableCode.__LOWERCASE__)];
  1411. int length = param.Length;
  1412. if (param.Length > up.Length)
  1413. length = up.Length;
  1414. if (param.Length > down.Length)
  1415. length = down.Length;
  1416. for (int i = 0; i < length; i++)
  1417. {
  1418. //本家の仕様では負の値は無効。
  1419. if ((up[i] <= 0) && (down[i] <= 0))
  1420. continue;
  1421. StringBuilder builder = new StringBuilder();
  1422. if (!skipPrint)
  1423. {
  1424. builder.Append(paramname[i]);
  1425. builder.Append(' ');
  1426. builder.Append(param[i].ToString());
  1427. if (up[i] > 0)
  1428. {
  1429. builder.Append('+');
  1430. builder.Append(up[i].ToString());
  1431. }
  1432. if (down[i] > 0)
  1433. {
  1434. builder.Append('-');
  1435. builder.Append(down[i].ToString());
  1436. }
  1437. }
  1438. unchecked { param[i] += up[i] - down[i]; }
  1439. if (!skipPrint)
  1440. {
  1441. builder.Append('=');
  1442. builder.Append(param[i].ToString());
  1443. window.Write(builder.ToString());
  1444. window.NewLine();
  1445. }
  1446. }
  1447. end:
  1448. for (int i = 0; i < up.Length; i++)
  1449. up[i] = 0;
  1450. for (int i = 0; i < down.Length; i++)
  1451. down[i] = 0;
  1452. }
  1453. public void CUpdateInUpcheck(IConsole window, Int64 target, bool skipPrint)
  1454. {
  1455. Int64[] up, down, param;
  1456. string[] paramname = constant.GetCsvNameList(VariableCode.PALAMNAME);
  1457. if ((target < 0) || (target >= varData.CharacterList.Count))
  1458. return;
  1459. CharacterData chara = varData.CharacterList[(int)target];
  1460. up = chara.DataIntegerArray[(int)(VariableCode.CUP & VariableCode.__LOWERCASE__)];
  1461. down = chara.DataIntegerArray[(int)(VariableCode.CDOWN & VariableCode.__LOWERCASE__)];
  1462. param = chara.DataIntegerArray[(int)(VariableCode.PALAM & VariableCode.__LOWERCASE__)];
  1463. int length = param.Length;
  1464. if (param.Length > up.Length)
  1465. length = up.Length;
  1466. if (param.Length > down.Length)
  1467. length = down.Length;
  1468. for (int i = 0; i < length; i++)
  1469. {
  1470. //本家の仕様では負の値は無効。
  1471. if ((up[i] <= 0) && (down[i] <= 0))
  1472. continue;
  1473. StringBuilder builder = new StringBuilder();
  1474. if (!skipPrint)
  1475. {
  1476. builder.Append(paramname[i]);
  1477. builder.Append(' ');
  1478. builder.Append(param[i].ToString());
  1479. if (up[i] > 0)
  1480. {
  1481. builder.Append('+');
  1482. builder.Append(up[i].ToString());
  1483. }
  1484. if (down[i] > 0)
  1485. {
  1486. builder.Append('-');
  1487. builder.Append(down[i].ToString());
  1488. }
  1489. }
  1490. unchecked { param[i] += up[i] - down[i]; }
  1491. if (!skipPrint)
  1492. {
  1493. builder.Append('=');
  1494. builder.Append(param[i].ToString());
  1495. window.Write(builder.ToString());
  1496. window.NewLine();
  1497. }
  1498. }
  1499. for (int i = 0; i < up.Length; i++)
  1500. up[i] = 0;
  1501. for (int i = 0; i < down.Length; i++)
  1502. down[i] = 0;
  1503. }
  1504. private void setDefaultStain(CharacterData chara)
  1505. {
  1506. long[] array = chara.DataIntegerArray[(int)(VariableCode.STAIN & VariableCode.__LOWERCASE__)];
  1507. //STAINの配列要素数 < _REPLACE.CSVのSTAIN初期値の指定数の時エラーになるのを対処
  1508. if (array.Length >= Config.Config.StainDefault.Count)
  1509. {
  1510. Config.Config.StainDefault.CopyTo(array);
  1511. for (int i = Config.Config.StainDefault.Count; i < array.Length; i++)
  1512. array[i] = 0;
  1513. }
  1514. else
  1515. {
  1516. for (int i = 0; i < array.Length; i++)
  1517. array[i] = Config.Config.StainDefault[i];
  1518. }
  1519. }
  1520. public void SetDefaultStain(Int64 no)
  1521. {
  1522. if (no < 0 || no >= varData.CharacterList.Count)
  1523. throw new CodeEE("Attempted to refer to a character that does not exist");
  1524. CharacterData chara = varData.CharacterList[(int)no];
  1525. setDefaultStain(chara);
  1526. }
  1527. /// <summary>
  1528. /// RESULTに配列のサイズを代入。二次元配列ならRESULT:1に二番目のサイズを代入。三次元配列ならRESULT:1に二番目、RESULT:2に三番目のサイズを代入
  1529. /// </summary>
  1530. /// <param name="varID"></param>
  1531. /// <returns></returns>
  1532. public void VarSize(VariableToken varID)
  1533. {
  1534. Int64[] resultArray = RESULT_ARRAY;
  1535. if (varID.IsArray2D)
  1536. {
  1537. resultArray[0] = varID.GetLength(0);
  1538. resultArray[1] = varID.GetLength(1);
  1539. }
  1540. else if (varID.IsArray3D)
  1541. {
  1542. resultArray[0] = varID.GetLength(0);
  1543. resultArray[1] = varID.GetLength(1);
  1544. resultArray[2] = varID.GetLength(2);
  1545. }
  1546. else
  1547. {
  1548. resultArray[0] = varID.GetLength();
  1549. }
  1550. }
  1551. public bool ItemSales(Int64 itemNo)
  1552. {
  1553. Int64[] itemSales = ITEMSALES;
  1554. string[] itemNames = constant.GetCsvNameList(VariableCode.ITEMNAME);
  1555. if ((itemNo < 0) || (itemNo >= itemSales.Length) || (itemNo >= itemNames.Length))
  1556. return false;
  1557. int index = (int)itemNo;
  1558. return ((itemSales[index] != 0) && (itemNames[index] != null));
  1559. }
  1560. public bool BuyItem(Int64 itemNo)
  1561. {
  1562. if (!ItemSales(itemNo))
  1563. return false;
  1564. Int64[] itemPrice = constant.ItemPrice;
  1565. if (itemNo >= itemPrice.Length)
  1566. return false;
  1567. int index = (int)itemNo;
  1568. if (MONEY < itemPrice[index])
  1569. return false;
  1570. MONEY -= itemPrice[index];
  1571. ITEM[index]++;
  1572. BOUGHT = itemNo;
  1573. return true;
  1574. }
  1575. public void SetEncodingResult(int[] ary)
  1576. {
  1577. long[] resary = varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)];
  1578. resary[0] = ary.Length;
  1579. for (int i = 0; i < ary.Length; i++)
  1580. resary[i + 1] = ary[i];
  1581. }
  1582. #endregion
  1583. //ちーと
  1584. public void IamaMunchkin()
  1585. {
  1586. if ((MASTER < 0) || (MASTER >= varData.CharacterList.Count))
  1587. return;
  1588. varData.CharacterList[(int)MASTER].DataString[(int)(VariableCode.NAME & VariableCode.__LOWERCASE__)] = "イカサマ";
  1589. varData.CharacterList[(int)MASTER].DataString[(int)(VariableCode.CALLNAME & VariableCode.__LOWERCASE__)] = "イカサマ";
  1590. varData.CharacterList[(int)MASTER].DataString[(int)(VariableCode.NICKNAME & VariableCode.__LOWERCASE__)] = "イカサマ";
  1591. }
  1592. public void SetResultX(List<long> values)
  1593. {
  1594. for (int i = 0; i < values.Count; i++)
  1595. {
  1596. if (i >= varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)].Length)
  1597. return;
  1598. varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)][i] = values[i];
  1599. }
  1600. }
  1601. #region File操作
  1602. private string getSaveDataPathG() { return Config.Config.SavDir + "global.sav"; }
  1603. private string getSaveDataPath(int index) { return string.Format("{0}save{1:00}.sav", Config.Config.SavDir, index); }
  1604. private string getSaveDataPath(string s) { return string.Format("{0}save{1:00}.sav", Config.Config.SavDir, s); }
  1605. private string getSaveDataPathV(int index) { return Program.DatDir + string.Format("var_{0:00}.dat", index); }
  1606. private string getSaveDataPathC(int index) { return Program.DatDir + string.Format("chara_{0:00}.dat", index); }
  1607. private string getSaveDataPathV(string s) { return Program.DatDir + "var_" + s + ".dat"; }
  1608. private string getSaveDataPathC(string s) { return Program.DatDir + "chara_" + s + ".dat"; }
  1609. /// <summary>
  1610. /// DatFolderが存在せず、かつ作成に失敗したらエラーを投げる
  1611. /// </summary>
  1612. /// <returns></returns>
  1613. public void CreateDatFolder()
  1614. {
  1615. if (Directory.Exists(Program.DatDir))
  1616. return;
  1617. try
  1618. {
  1619. Directory.CreateDirectory(Program.DatDir);
  1620. }
  1621. catch
  1622. {
  1623. MessageBox.Show("Failed to create dat folder");
  1624. throw new CodeEE("Failed to create dat folder");
  1625. }
  1626. }
  1627. public List<string> GetDatFiles(bool charadat, string pattern)
  1628. {
  1629. List<string> files = new List<string>();
  1630. if (!Directory.Exists(Program.DatDir))
  1631. return files;
  1632. string searchPattern = "var_" + pattern + ".dat";
  1633. if (charadat)
  1634. searchPattern = "chara_" + pattern + ".dat";
  1635. string[] pathes = Directory.GetFiles(Program.DatDir, searchPattern, SearchOption.TopDirectoryOnly);
  1636. foreach (string path in pathes)
  1637. {
  1638. if (!Path.GetExtension(path).Equals(".dat", StringComparison.OrdinalIgnoreCase))
  1639. continue;
  1640. string filename = Path.GetFileNameWithoutExtension(path);
  1641. if (charadat)
  1642. filename = filename.Substring(6);
  1643. else
  1644. filename = filename.Substring(4);
  1645. if (string.IsNullOrEmpty(filename))
  1646. continue;
  1647. files.Add(filename);
  1648. }
  1649. return files;
  1650. }
  1651. /// <summary>
  1652. /// 文字列がファイル名の一部として適切かどうか調べる
  1653. /// </summary>
  1654. /// <param name="datfilename"></param>
  1655. /// <returns>適切ならnull、不適切ならエラーメッセージ</returns>
  1656. public string CheckDatFilename(string datfilename)
  1657. {
  1658. if (string.IsNullOrEmpty(datfilename))
  1659. return "File name is not specified";
  1660. if (datfilename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
  1661. return "Invalid character in file name";
  1662. return null;
  1663. }
  1664. public EraDataResult CheckData(string savename, EraSaveFileType type)
  1665. {
  1666. string filename = null;
  1667. switch (type)
  1668. {
  1669. case EraSaveFileType.Normal:
  1670. filename = getSaveDataPath(savename); break;
  1671. case EraSaveFileType.Global:
  1672. filename = getSaveDataPathG(); break;
  1673. case EraSaveFileType.Var:
  1674. filename = getSaveDataPathV(savename); break;
  1675. case EraSaveFileType.CharVar:
  1676. filename = getSaveDataPathC(savename); break;
  1677. }
  1678. return CheckDataByFilename(filename, type);
  1679. }
  1680. public EraDataResult CheckData(int saveIndex, EraSaveFileType type)
  1681. {
  1682. string filename = null;
  1683. switch (type)
  1684. {
  1685. case EraSaveFileType.Normal:
  1686. filename = getSaveDataPath(saveIndex); break;
  1687. case EraSaveFileType.Global:
  1688. filename = getSaveDataPathG(); break;
  1689. case EraSaveFileType.Var:
  1690. filename = getSaveDataPathV(saveIndex); break;
  1691. case EraSaveFileType.CharVar:
  1692. filename = getSaveDataPathC(saveIndex); break;
  1693. }
  1694. return CheckDataByFilename(filename, type);
  1695. }
  1696. public EraDataResult CheckDataByFilename(string filename, EraSaveFileType type)
  1697. {
  1698. EraDataResult result = new EraDataResult();
  1699. if (!File.Exists(filename))
  1700. {
  1701. result.State = EraDataState.FILENOTFOUND;
  1702. result.DataMes = "----";
  1703. return result;
  1704. }
  1705. FileStream fs = null;
  1706. EraBinaryDataReader bReader = null;
  1707. EraDataReader reader = null;
  1708. Int64 version = 0;
  1709. try
  1710. {
  1711. fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
  1712. bReader = EraBinaryDataReader.CreateReader(fs);
  1713. if (bReader == null)//eramaker形式
  1714. {
  1715. reader = new EraDataReader(fs);
  1716. if (!gamebase.UniqueCodeEqualTo(reader.ReadInt64()))
  1717. {
  1718. result.State = EraDataState.GAME_ERROR;
  1719. result.DataMes = "Attempted to load save data from a different game";
  1720. return result;
  1721. }
  1722. version = reader.ReadInt64();
  1723. if (!gamebase.CheckVersion(version))
  1724. {
  1725. result.State = EraDataState.VIRSION_ERROR;
  1726. result.DataMes = "Save data version is different";
  1727. return result;
  1728. }
  1729. result.State = EraDataState.OK;
  1730. result.DataMes = reader.ReadString();
  1731. return result;
  1732. //result.State = EraDataState.ETC_ERROR;
  1733. //result.DataMes = "セーブデータが壊れています";
  1734. //return result;
  1735. }
  1736. EraSaveFileType fileType = bReader.ReadFileType();
  1737. if (type != fileType)
  1738. {
  1739. result.State = EraDataState.ETC_ERROR;
  1740. result.DataMes = "Save data is corrupted";
  1741. return result;
  1742. }
  1743. if (!gamebase.UniqueCodeEqualTo(bReader.ReadInt64()))
  1744. {
  1745. result.State = EraDataState.GAME_ERROR;
  1746. result.DataMes = "Attempted to load save data from a different game";
  1747. return result;
  1748. }
  1749. version = bReader.ReadInt64();
  1750. if (!gamebase.CheckVersion(version))
  1751. {
  1752. result.State = EraDataState.VIRSION_ERROR;
  1753. result.DataMes = "Save data version is different";
  1754. return result;
  1755. }
  1756. result.State = EraDataState.OK;
  1757. result.DataMes = bReader.ReadString();
  1758. return result;
  1759. }
  1760. catch (FileEE fee)
  1761. {
  1762. result.State = EraDataState.ETC_ERROR;
  1763. result.DataMes = fee.Message;
  1764. }
  1765. catch (Exception)
  1766. {
  1767. result.State = EraDataState.ETC_ERROR;
  1768. result.DataMes = "An error has occurred while loading";
  1769. }
  1770. finally
  1771. {
  1772. if (reader != null)
  1773. reader.Close();
  1774. else if (bReader != null)
  1775. bReader.Close();
  1776. else if (fs != null)
  1777. fs.Close();
  1778. }
  1779. return result;
  1780. }
  1781. ////これは理屈上VariableEvaluator上で動くはず
  1782. //public EraDataResult checkData(int saveIndex)
  1783. //{
  1784. // string filename = getSaveDataPath(saveIndex);
  1785. // EraDataResult result = new EraDataResult();
  1786. // EraDataReader reader = null;
  1787. // try
  1788. // {
  1789. // if (!File.Exists(filename))
  1790. // {
  1791. // result.State = EraDataState.FILENOTFOUND;
  1792. // result.DataMes = "----";
  1793. // return result;
  1794. // }
  1795. // reader = new EraDataReader(filename);
  1796. // if (!gamebase.UniqueCodeEqualTo(reader.ReadInt64()))
  1797. // {
  1798. // result.State = EraDataState.GAME_ERROR;
  1799. // result.DataMes = "Attempted to load save data from a different game";
  1800. // return result;
  1801. // }
  1802. // Int64 version = reader.ReadInt64();
  1803. // if (!gamebase.CheckVersion(version))
  1804. // {
  1805. // result.State = EraDataState.VIRSION_ERROR;
  1806. // result.DataMes = "Save data version is different";
  1807. // return result;
  1808. // }
  1809. // result.State = EraDataState.OK;
  1810. // result.DataMes = reader.ReadString();
  1811. // return result;
  1812. // }
  1813. // catch (FileEE fee)
  1814. // {
  1815. // result.State = EraDataState.ETC_ERROR;
  1816. // result.DataMes = fee.Message;
  1817. // }
  1818. // catch (Exception)
  1819. // {
  1820. // result.State = EraDataState.ETC_ERROR;
  1821. // result.DataMes = "読み込み中にエラーが発生しました";
  1822. // }
  1823. // finally
  1824. // {
  1825. // if (reader != null)
  1826. // reader.Close();
  1827. // }
  1828. // return result;
  1829. //}
  1830. public void SaveChara(string savename, string savMes, int[] charas)
  1831. {
  1832. CreateDatFolder();
  1833. CheckDatFilename(savename);
  1834. string filepath = getSaveDataPathC(savename);
  1835. EraBinaryDataWriter bWriter = null;
  1836. FileStream fs = null;
  1837. try
  1838. {
  1839. Config.Config.CreateSavDir();
  1840. fs = new FileStream(filepath, FileMode.Create, FileAccess.Write);
  1841. bWriter = new EraBinaryDataWriter(fs);
  1842. bWriter.WriteHeader();
  1843. bWriter.WriteFileType(EraSaveFileType.CharVar);
  1844. bWriter.WriteInt64(gamebase.ScriptUniqueCode);
  1845. bWriter.WriteInt64(gamebase.ScriptVersion);
  1846. bWriter.WriteString(savMes);
  1847. bWriter.WriteInt64(charas.Length);//保存するキャラ数
  1848. for (int i = 0; i < charas.Length; i++)
  1849. {
  1850. varData.CharacterList[charas[i]].SaveToStreamBinary(bWriter, varData);
  1851. }
  1852. bWriter.WriteEOF();
  1853. //RESULT = 1;
  1854. }
  1855. //catch (Exception)
  1856. //{
  1857. // throw new CodeEE("セーブ中にエラーが発生しました");
  1858. //}
  1859. finally
  1860. {
  1861. if (bWriter != null)
  1862. bWriter.Close();
  1863. else if (fs != null)
  1864. fs.Close();
  1865. }
  1866. }
  1867. public void LoadChara(string savename)
  1868. {
  1869. string filepath = getSaveDataPathC(savename);
  1870. RESULT = 0;
  1871. if (!File.Exists(filepath))
  1872. return;
  1873. EraBinaryDataReader bReader = null;
  1874. FileStream fs = null;
  1875. try
  1876. {
  1877. List<CharacterData> addCharaList = new List<CharacterData>();
  1878. fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
  1879. bReader = EraBinaryDataReader.CreateReader(fs);
  1880. if (bReader == null)
  1881. return;
  1882. if (bReader.ReadFileType() != EraSaveFileType.CharVar)
  1883. return;
  1884. if (!gamebase.UniqueCodeEqualTo(bReader.ReadInt64()))
  1885. return;
  1886. Int64 version = bReader.ReadInt64();
  1887. if (!gamebase.CheckVersion(version))
  1888. return;
  1889. bReader.ReadString();//saveMes
  1890. Int64 loadnum = bReader.ReadInt64();
  1891. for (int i = 0; i < loadnum; i++)
  1892. {
  1893. CharacterData chara = new CharacterData(constant, varData);
  1894. chara.LoadFromStreamBinary(bReader);
  1895. addCharaList.Add(chara);
  1896. }
  1897. varData.CharacterList.AddRange(addCharaList);
  1898. RESULT = 1;
  1899. }
  1900. //catch (Exception)
  1901. //{
  1902. // return;
  1903. //}
  1904. finally
  1905. {
  1906. if (bReader != null)
  1907. bReader.Close();
  1908. else if (fs != null)
  1909. fs.Close();
  1910. }
  1911. }
  1912. public bool SaveGlobal()
  1913. {
  1914. string filepath = getSaveDataPathG();
  1915. EraDataWriter writer = null;
  1916. EraBinaryDataWriter bWriter = null;
  1917. FileStream fs = null;
  1918. try
  1919. {
  1920. Config.Config.CreateSavDir();
  1921. fs = new FileStream(filepath, FileMode.Create, FileAccess.Write);
  1922. if (Config.Config.SystemSaveInBinary)
  1923. {
  1924. bWriter = new EraBinaryDataWriter(fs);
  1925. bWriter.WriteHeader();
  1926. bWriter.WriteFileType(EraSaveFileType.Global);
  1927. bWriter.WriteInt64(gamebase.ScriptUniqueCode);
  1928. bWriter.WriteInt64(gamebase.ScriptVersion);
  1929. bWriter.WriteString("");//saveMes
  1930. varData.SaveGlobalToStreamBinary(bWriter);
  1931. bWriter.WriteEOF();
  1932. }
  1933. else
  1934. {
  1935. writer = new EraDataWriter(fs);
  1936. writer.Write(gamebase.ScriptUniqueCode);
  1937. writer.Write(gamebase.ScriptVersion);
  1938. varData.SaveGlobalToStream(writer);
  1939. writer.EmuStart();
  1940. varData.SaveGlobalToStream1808(writer);
  1941. }
  1942. }
  1943. //catch (SystemException)
  1944. //{
  1945. // throw new CodeEE("グローバルデータの保存中にエラーが発生しました");
  1946. // //console.PrintError(
  1947. // //console.NewLine();
  1948. // //return false;
  1949. //}
  1950. finally
  1951. {
  1952. if (writer != null)
  1953. writer.Close();
  1954. else if (bWriter != null)
  1955. bWriter.Close();
  1956. else if (fs != null)
  1957. fs.Close();
  1958. }
  1959. return true;
  1960. }
  1961. public bool LoadGlobal()
  1962. {
  1963. string filepath = getSaveDataPathG();
  1964. if (!File.Exists(filepath))
  1965. return false;
  1966. EraDataReader reader = null;
  1967. EraBinaryDataReader bReader = null;
  1968. FileStream fs = null;
  1969. try
  1970. {
  1971. fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
  1972. bReader = EraBinaryDataReader.CreateReader(fs);
  1973. if (bReader != null)
  1974. {
  1975. EraSaveFileType fileType = bReader.ReadFileType();
  1976. if (fileType != EraSaveFileType.Global)
  1977. return false;
  1978. if (!gamebase.UniqueCodeEqualTo(bReader.ReadInt64()))
  1979. return false;
  1980. Int64 version = bReader.ReadInt64();
  1981. if (!gamebase.CheckVersion(version))
  1982. return false;
  1983. bReader.ReadString();//saveMes
  1984. varData.LoadFromStreamBinary(bReader);
  1985. }
  1986. else
  1987. {
  1988. reader = new EraDataReader(fs);
  1989. if (!gamebase.UniqueCodeEqualTo(reader.ReadInt64()))
  1990. return false;
  1991. Int64 version = reader.ReadInt64();
  1992. if (!gamebase.CheckVersion(version))
  1993. return false;
  1994. varData.LoadGlobalFromStream(reader);
  1995. if (reader.SeekEmuStart())
  1996. {
  1997. varData.LoadGlobalFromStream1808(reader);
  1998. }
  1999. }
  2000. return true;
  2001. }
  2002. catch
  2003. {
  2004. return false;
  2005. }
  2006. finally
  2007. {
  2008. if (reader != null)
  2009. reader.Close();
  2010. else if (bReader != null)
  2011. bReader.Close();
  2012. else if (fs != null)
  2013. fs.Close();
  2014. }
  2015. }
  2016. public void SaveToStreamBinary(EraBinaryDataWriter bWriter, string saveDataText)
  2017. {
  2018. bWriter.WriteHeader();
  2019. bWriter.WriteFileType(EraSaveFileType.Normal);
  2020. bWriter.WriteInt64(gamebase.ScriptUniqueCode);
  2021. bWriter.WriteInt64(gamebase.ScriptVersion);
  2022. bWriter.WriteString(saveDataText);
  2023. bWriter.WriteInt64(varData.CharacterList.Count);
  2024. for (int i = 0; i < varData.CharacterList.Count; i++)
  2025. {
  2026. varData.CharacterList[i].SaveToStreamBinary(bWriter, varData);
  2027. }
  2028. varData.SaveToStreamBinary(bWriter);
  2029. bWriter.WriteEOF();
  2030. }
  2031. public void LoadFromStreamBinary(EraBinaryDataReader bReader)
  2032. {
  2033. EraSaveFileType fileType = bReader.ReadFileType();
  2034. if (fileType != EraSaveFileType.Normal)
  2035. throw new FileEE("セーブデータが壊れています");
  2036. if (!gamebase.UniqueCodeEqualTo(bReader.ReadInt64()))
  2037. throw new FileEE("Attempted to load save data from a different game");
  2038. Int64 version = bReader.ReadInt64();
  2039. if (!gamebase.CheckVersion(version))
  2040. throw new FileEE("Save data version is different");
  2041. string text = bReader.ReadString();//PUTFORM
  2042. varData.SetDefaultValue(constant);
  2043. varData.SetDefaultLocalValue();
  2044. varData.LastLoadVersion = version;
  2045. //varData.LastLoadNo = dataIndex;
  2046. varData.LastLoadText = text;
  2047. int charaCount = (int)bReader.ReadInt64();
  2048. varData.CharacterList.Clear();
  2049. for (int i = 0; i < charaCount; i++)
  2050. {
  2051. CharacterData chara = new CharacterData(constant, varData);
  2052. varData.CharacterList.Add(chara);
  2053. chara.LoadFromStreamBinary(bReader);
  2054. }
  2055. varData.LoadFromStreamBinary(bReader);
  2056. }
  2057. public bool SaveTo(int saveIndex, string saveText)
  2058. {
  2059. string filepath = getSaveDataPath(saveIndex);
  2060. FileStream fs = null;
  2061. EraBinaryDataWriter bWriter = null;
  2062. try
  2063. {
  2064. Config.Config.CreateSavDir();
  2065. fs = new FileStream(filepath, FileMode.Create, FileAccess.Write);
  2066. // So this used to check for a config option as to whether it should save in binary format or not
  2067. // But since there's no way to set it and all games use binary by default I took it out because it was bad --Sworve
  2068. bWriter = new EraBinaryDataWriter(fs);
  2069. SaveToStreamBinary(bWriter, saveText);
  2070. return true;
  2071. }
  2072. catch (Exception)
  2073. {
  2074. return false;
  2075. }
  2076. finally
  2077. {
  2078. bWriter?.Close();
  2079. fs?.Close();
  2080. }
  2081. }
  2082. public bool LoadFrom(int dataIndex)
  2083. {
  2084. string filepath = getSaveDataPath(dataIndex);
  2085. if (!File.Exists(filepath))
  2086. throw new ExeEE("存在しないパスを呼び出した");
  2087. EraBinaryDataReader bReader = null;
  2088. FileStream fs = null;
  2089. try
  2090. {
  2091. fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
  2092. bReader = EraBinaryDataReader.CreateReader(fs);
  2093. LoadFromStreamBinary(bReader);
  2094. varData.LastLoadNo = dataIndex;
  2095. }
  2096. finally
  2097. {
  2098. bReader?.Close();
  2099. fs?.Close();
  2100. }
  2101. return true;
  2102. }
  2103. public void DelData(int dataIndex)
  2104. {
  2105. string filepath = getSaveDataPath(dataIndex);
  2106. if (!File.Exists(filepath))
  2107. return;
  2108. FileAttributes att = File.GetAttributes(filepath);
  2109. if ((att & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
  2110. throw new CodeEE("Specified file \"" + filepath + "\" cannot be deleted because it is set to read only");
  2111. //{
  2112. // console.PrintError("指定されたファイル\"" + filepath + "\"は読み込み専用のため削除できません");
  2113. // return;
  2114. //}
  2115. File.Delete(filepath);
  2116. }
  2117. #endregion
  2118. #region IDisposable メンバ
  2119. public void Dispose()
  2120. {
  2121. varData.Dispose();
  2122. }
  2123. #endregion
  2124. #region Property
  2125. public Int64[] RESULT_ARRAY => varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)];
  2126. public Int64 RESULT
  2127. {
  2128. get => varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)][0];
  2129. set { varData.DataIntegerArray[(int)(VariableCode.RESULT & VariableCode.__LOWERCASE__)][0] = value; }
  2130. }
  2131. public Int64 COUNT
  2132. {
  2133. get => varData.DataIntegerArray[(int)(VariableCode.COUNT & VariableCode.__LOWERCASE__)][0];
  2134. set { varData.DataIntegerArray[(int)(VariableCode.COUNT & VariableCode.__LOWERCASE__)][0] = value; }
  2135. }
  2136. public string RESULTS
  2137. {
  2138. get
  2139. {
  2140. string ret = varData.DataStringArray[(int)(VariableCode.RESULTS & VariableCode.__LOWERCASE__)][0];
  2141. if (ret == null)
  2142. return "";
  2143. return ret;
  2144. }
  2145. set => varData.DataStringArray[(int)(VariableCode.RESULTS & VariableCode.__LOWERCASE__)][0] = value;
  2146. }
  2147. public string[] RESULTS_ARRAY => varData.DataStringArray[(int)(VariableCode.RESULTS & VariableCode.__LOWERCASE__)];
  2148. public Int64 TARGET
  2149. {
  2150. get => varData.DataIntegerArray[(int)(VariableCode.TARGET & VariableCode.__LOWERCASE__)][0];
  2151. set { varData.DataIntegerArray[(int)(VariableCode.TARGET & VariableCode.__LOWERCASE__)][0] = value; }
  2152. }
  2153. public Int64[] SELECTCOM_ARRAY => varData.DataIntegerArray[(int)(VariableCode.SELECTCOM & VariableCode.__LOWERCASE__)];
  2154. public Int64 SELECTCOM
  2155. {
  2156. get => varData.DataIntegerArray[(int)(VariableCode.SELECTCOM & VariableCode.__LOWERCASE__)][0];
  2157. set { varData.DataIntegerArray[(int)(VariableCode.SELECTCOM & VariableCode.__LOWERCASE__)][0] = value; }
  2158. }
  2159. public string[] ITEMNAME => constant.GetCsvNameList(VariableCode.ITEMNAME);
  2160. public Int64[] ITEMSALES => varData.DataIntegerArray[(int)(VariableCode.ITEMSALES & VariableCode.__LOWERCASE__)];
  2161. public Int64[] ITEMPRICE => constant.ItemPrice;
  2162. private Int64[] ITEM => varData.DataIntegerArray[(int)(VariableCode.ITEM & VariableCode.__LOWERCASE__)];
  2163. public Int64[] RANDDATA => varData.DataIntegerArray[(int)(VariableCode.RANDDATA & VariableCode.__LOWERCASE__)];
  2164. public string SAVEDATA_TEXT
  2165. {
  2166. get => varData.DataString[(int)(VariableCode.SAVEDATA_TEXT & VariableCode.__LOWERCASE__)];
  2167. set { varData.DataString[(int)(VariableCode.SAVEDATA_TEXT & VariableCode.__LOWERCASE__)] = value; }
  2168. }
  2169. public Int64 CHARANUM => varData.CharacterList.Count;
  2170. private Int64 get_Variable_canforbid(VariableCode code)
  2171. {
  2172. long[] array = varData.DataIntegerArray[(int)(code & VariableCode.__LOWERCASE__)];
  2173. if (array.Length == 0)
  2174. return -1;
  2175. return array[0];
  2176. }
  2177. private void set_Variable_canforbid(VariableCode code, Int64 value)
  2178. {
  2179. long[] array = varData.DataIntegerArray[(int)(code & VariableCode.__LOWERCASE__)];
  2180. if (array.Length == 0)
  2181. return;
  2182. array[0] = value;
  2183. }
  2184. public Int64 MASTER
  2185. {
  2186. get => get_Variable_canforbid(VariableCode.MASTER);
  2187. set { set_Variable_canforbid(VariableCode.MASTER, value); }
  2188. }
  2189. public Int64 ASSI
  2190. {
  2191. get => get_Variable_canforbid(VariableCode.ASSI);
  2192. set { set_Variable_canforbid(VariableCode.ASSI, value); }
  2193. }
  2194. public Int64 ASSIPLAY
  2195. {
  2196. set => set_Variable_canforbid(VariableCode.ASSIPLAY, value);
  2197. }
  2198. public Int64 PREVCOM
  2199. {
  2200. get => get_Variable_canforbid(VariableCode.PREVCOM);
  2201. set { set_Variable_canforbid(VariableCode.PREVCOM, value); }
  2202. }
  2203. public Int64 NEXTCOM
  2204. {
  2205. get => get_Variable_canforbid(VariableCode.NEXTCOM);
  2206. set { set_Variable_canforbid(VariableCode.NEXTCOM, value); }
  2207. }
  2208. private Int64 MONEY
  2209. {
  2210. get => get_Variable_canforbid(VariableCode.MONEY);
  2211. set { set_Variable_canforbid(VariableCode.MONEY, value); }
  2212. }
  2213. private Int64 BOUGHT
  2214. {
  2215. set => set_Variable_canforbid(VariableCode.BOUGHT, value);
  2216. }
  2217. //public Int64 MASTER
  2218. //{
  2219. // get { return varData.DataIntegerArray[(int)(VariableCode.MASTER & VariableCode.__LOWERCASE__)][0]; }
  2220. // set { varData.DataIntegerArray[(int)(VariableCode.MASTER & VariableCode.__LOWERCASE__)][0] = value; }
  2221. //}
  2222. //public Int64 ASSI
  2223. //{
  2224. // get { return varData.DataIntegerArray[(int)(VariableCode.ASSI & VariableCode.__LOWERCASE__)][0]; }
  2225. // set { varData.DataIntegerArray[(int)(VariableCode.ASSI & VariableCode.__LOWERCASE__)][0] = value; }
  2226. //}
  2227. //public Int64 ASSIPLAY
  2228. //{
  2229. // //get { return varData.DataIntegerArray[(int)(VariableCode.ASSIPLAY & VariableCode.__LOWERCASE__)][0]; }
  2230. // set { varData.DataIntegerArray[(int)(VariableCode.ASSIPLAY & VariableCode.__LOWERCASE__)][0] = value; }
  2231. //}
  2232. //public Int64 PREVCOM
  2233. //{
  2234. // //get { return varData.DataIntegerArray[(int)(VariableCode.PREVCOM & VariableCode.__LOWERCASE__)][0]; }
  2235. // set { varData.DataIntegerArray[(int)(VariableCode.PREVCOM & VariableCode.__LOWERCASE__)][0] = value; }
  2236. //}
  2237. //public Int64 NEXTCOM
  2238. //{
  2239. // get { return varData.DataIntegerArray[(int)(VariableCode.NEXTCOM & VariableCode.__LOWERCASE__)][0]; }
  2240. // set { varData.DataIntegerArray[(int)(VariableCode.NEXTCOM & VariableCode.__LOWERCASE__)][0] = value; }
  2241. //}
  2242. //private Int64 MONEY
  2243. //{
  2244. // get { return varData.DataIntegerArray[(int)(VariableCode.MONEY & VariableCode.__LOWERCASE__)][0]; }
  2245. // set { varData.DataIntegerArray[(int)(VariableCode.MONEY & VariableCode.__LOWERCASE__)][0] = value; }
  2246. //}
  2247. //private Int64 BOUGHT
  2248. //{
  2249. // //get { return varData.DataIntegerArray[(int)(VariableCode.BOUGHT & VariableCode.__LOWERCASE__)][0]; }
  2250. // set { varData.DataIntegerArray[(int)(VariableCode.BOUGHT & VariableCode.__LOWERCASE__)][0] = value; }
  2251. //}
  2252. #endregion
  2253. }
  2254. }