Process.SystemProc.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Media;
  4. using NTERA.Core.Interop;
  5. using NTERA.EmuEra.Game.EraEmu.Config;
  6. using NTERA.EmuEra.Game.EraEmu.GameData.Variable;
  7. using NTERA.EmuEra.Game.EraEmu.Sub;
  8. namespace NTERA.EmuEra.Game.EraEmu.GameProc
  9. {
  10. internal sealed partial class Process
  11. {
  12. private string[] _trainName;
  13. delegate void SystemProcess();
  14. readonly Dictionary<SystemStateCode, SystemProcess> _systemProcessDictionary = new Dictionary<SystemStateCode, SystemProcess>();
  15. private void InitSystemProcess()
  16. {
  17. _comAble = new int[_trainName.Length];
  18. _systemProcessDictionary.Add(SystemStateCode.Title_Begin, beginTitle);
  19. _systemProcessDictionary.Add(SystemStateCode.Openning, endOpenning);
  20. _systemProcessDictionary.Add(SystemStateCode.Train_Begin, beginTrain);
  21. _systemProcessDictionary.Add(SystemStateCode.Train_CallEventTrain, endCallEventTrain);
  22. _systemProcessDictionary.Add(SystemStateCode.Train_CallShowStatus, endCallShowStatus);
  23. _systemProcessDictionary.Add(SystemStateCode.Train_CallComAbleXX, endCallComAbleXX);
  24. _systemProcessDictionary.Add(SystemStateCode.Train_CallShowUserCom, endCallShowUserCom);
  25. _systemProcessDictionary.Add(SystemStateCode.Train_WaitInput, trainWaitInput);
  26. _systemProcessDictionary.Add(SystemStateCode.Train_CallEventCom, endEventCom);
  27. _systemProcessDictionary.Add(SystemStateCode.Train_CallComXX, endCallComXX);
  28. _systemProcessDictionary.Add(SystemStateCode.Train_CallSourceCheck, endCallSourceCheck);
  29. _systemProcessDictionary.Add(SystemStateCode.Train_CallEventComEnd, endCallEventComEnd); ;
  30. _systemProcessDictionary.Add(SystemStateCode.Train_DoTrain, doTrain);
  31. _systemProcessDictionary.Add(SystemStateCode.AfterTrain_Begin, beginAfterTrain);
  32. _systemProcessDictionary.Add(SystemStateCode.Ablup_Begin, beginAblup);
  33. _systemProcessDictionary.Add(SystemStateCode.Ablup_CallShowJuel, endCallShowJuel);
  34. _systemProcessDictionary.Add(SystemStateCode.Ablup_CallShowAblupSelect, endCallShowAblupSelect);
  35. _systemProcessDictionary.Add(SystemStateCode.Ablup_WaitInput, ablupWaitInput);
  36. _systemProcessDictionary.Add(SystemStateCode.Ablup_CallAblupXX, endCallAblupXX);
  37. _systemProcessDictionary.Add(SystemStateCode.Turnend_Begin, beginTurnend);
  38. _systemProcessDictionary.Add(SystemStateCode.Shop_Begin, beginShop);
  39. _systemProcessDictionary.Add(SystemStateCode.Shop_CallEventShop, endCallEventShop);
  40. _systemProcessDictionary.Add(SystemStateCode.Shop_CallShowShop, endCallShowShop);
  41. _systemProcessDictionary.Add(SystemStateCode.Shop_WaitInput, shopWaitInput);
  42. _systemProcessDictionary.Add(SystemStateCode.Shop_CallEventBuy, endCallEventBuy);
  43. _systemProcessDictionary.Add(SystemStateCode.SaveGame_Begin, beginSaveGame);
  44. _systemProcessDictionary.Add(SystemStateCode.SaveGame_WaitInput, saveGameWaitInput);
  45. _systemProcessDictionary.Add(SystemStateCode.SaveGame_WaitInputOverwrite, saveGameWaitInputOverwrite);
  46. _systemProcessDictionary.Add(SystemStateCode.SaveGame_CallSaveInfo, endCallSaveInfo);
  47. _systemProcessDictionary.Add(SystemStateCode.LoadGame_Begin, beginLoadGame);
  48. _systemProcessDictionary.Add(SystemStateCode.LoadGame_WaitInput, loadGameWaitInput);
  49. _systemProcessDictionary.Add(SystemStateCode.LoadGameOpenning_Begin, beginLoadGameOpening);
  50. _systemProcessDictionary.Add(SystemStateCode.LoadGameOpenning_WaitInput, loadGameWaitInput);
  51. //stateEndProcessDictionary.Add(ProgramState.AutoSave_Begin, new stateEndProcess(this.beginAutoSave));
  52. _systemProcessDictionary.Add(SystemStateCode.AutoSave_CallSaveInfo, endAutoSaveCallSaveInfo);
  53. _systemProcessDictionary.Add(SystemStateCode.AutoSave_CallUniqueAutosave, endAutoSave);
  54. _systemProcessDictionary.Add(SystemStateCode.LoadData_DataLoaded, beginDataLoaded);
  55. _systemProcessDictionary.Add(SystemStateCode.LoadData_CallSystemLoad, endSystemLoad);
  56. _systemProcessDictionary.Add(SystemStateCode.LoadData_CallEventLoad, endEventLoad);
  57. _systemProcessDictionary.Add(SystemStateCode.Openning_TitleLoadgame, endTitleLoadgame);
  58. _systemProcessDictionary.Add(SystemStateCode.System_Reloaderb, endReloaderb);
  59. _systemProcessDictionary.Add(SystemStateCode.First_Begin, beginFirst);
  60. _systemProcessDictionary.Add(SystemStateCode.Normal, endNormal);
  61. }
  62. Int64 _systemResult;
  63. int _lastCalledComable = -1;
  64. int _lastAddCom = -1;
  65. //(Train.csv中の値・定義されていなければ-1) == comAble[(表示されている値)];
  66. int[] _comAble;//
  67. private void RunSystemProc()
  68. {
  69. //スクリプト実行中にここには来ないはず
  70. //if (!state.ScriptEnd)
  71. // throw new ExeEE("不正な呼び出し");
  72. //ない物を渡す処理は現状ない
  73. //if (systemProcessDictionary.ContainsKey(state.SystemState))
  74. _systemProcessDictionary[state.SystemState]();
  75. //else
  76. // throw new ExeEE("未定義の状態");
  77. }
  78. void SetWait()
  79. {
  80. console.ReadAnyKey();
  81. }
  82. void SetWaitInput()
  83. {
  84. InputRequest req = new InputRequest();
  85. req.InputType = InputType.IntValue;
  86. req.IsSystemInput = true;
  87. console.WaitInput(req);
  88. }
  89. private bool CallFunction(string functionName, bool force, bool isEvent)
  90. {
  91. CalledFunction call = null;
  92. if (isEvent)
  93. call = CalledFunction.CallEventFunction(this, functionName, null);
  94. else
  95. call = CalledFunction.CallFunction(this, functionName, null);
  96. if (call == null)
  97. if (!force)
  98. return false;
  99. else
  100. throw new CodeEE("関数\"@" + functionName + "\"が見つかりません");
  101. //そもそも非イベント関数では関数1個分しか与えないので条件を満たすわけがない
  102. //if ((!isEvent) && (call.Count > 1))
  103. // throw new ExeEE("イベント関数でない関数\"@" + functionName + "\"の候補が複数ある");
  104. state.IntoFunction(call, null, null);
  105. return true;
  106. }
  107. //CheckState()から呼ばれる関数群。ScriptEndに達したときの処理。
  108. void beginTitle()
  109. {
  110. //連続調教コマンド処理中の状態が持ち越されていたらここで消しておく
  111. if (isCTrain)
  112. if (ClearCommands())
  113. return;
  114. skipPrint = false;
  115. console.ResetStyle();
  116. deleteAllPrevState();
  117. if (Program.AnalysisMode)
  118. {
  119. console.PrintSystemLine("ファイル解析終了:Analysis.logに出力します");
  120. console.OutputLog(Program.ExeDir + "Analysis.log");
  121. console.noOutputLog = true;
  122. console.PrintSystemLine("エンターキーもしくはクリックで終了します");
  123. SystemSounds.Asterisk.Play();
  124. console.ThrowTitleError(false);
  125. return;
  126. }
  127. if ((!noError) && (!Config.Config.CompatiErrorLine))
  128. {
  129. console.PrintSystemLine("ERBコードに解釈不可能な行があるためEmueraを終了します");
  130. console.PrintSystemLine("※互換性オプション「" + Config.Config.GetConfigName(ConfigCode.CompatiErrorLine) + "」により強制的に動作させることができます");
  131. console.PrintSystemLine("emuera.logにログを出力します");
  132. console.OutputLog(Program.ExeDir + "emuera.log");
  133. console.noOutputLog = true;
  134. console.PrintSystemLine("エンターキーもしくはクリックで終了します");
  135. //System.Media.SystemSounds.Asterisk.Play();
  136. console.ThrowTitleError(true);
  137. return;
  138. }
  139. if (CallFunction("SYSTEM_TITLE", false, false))
  140. {//独自定義
  141. state.SystemState = SystemStateCode.Normal;
  142. return;
  143. }
  144. //標準のタイトル画面
  145. console.PrintBar();
  146. console.NewLine();
  147. console.Alignment = DisplayLineAlignment.CENTER;
  148. console.PrintSingleLine(gamebase.ScriptTitle);
  149. if (gamebase.ScriptVersion != 0)
  150. console.PrintSingleLine(gamebase.ScriptVersionText);
  151. console.PrintSingleLine(gamebase.ScriptAutherName);
  152. console.PrintSingleLine("(" + gamebase.ScriptYear + ")");
  153. console.NewLine();
  154. console.PrintSingleLine(gamebase.ScriptDetail);
  155. console.Alignment = DisplayLineAlignment.LEFT;
  156. console.PrintBar();
  157. console.NewLine();
  158. console.PrintSingleLine("[0] " + Config.Config.TitleMenuString0);
  159. console.PrintSingleLine("[1] " + Config.Config.TitleMenuString1);
  160. openingInput();
  161. }
  162. void openingInput()
  163. {
  164. SetWaitInput();
  165. state.SystemState = SystemStateCode.Openning;
  166. }
  167. void endOpenning()
  168. {
  169. if (_systemResult == 0)
  170. {//[0] 最初からはじめる
  171. vEvaluator.ResetData();
  172. //vEvaluator.AddCharacter(0, false);
  173. vEvaluator.AddCharacterFromCsvNo(0);
  174. if (gamebase.DefaultCharacter > 0)
  175. //vEvaluator.AddCharacter(gamebase.DefaultCharacter, false);
  176. vEvaluator.AddCharacterFromCsvNo(gamebase.DefaultCharacter);
  177. console.PrintBar();
  178. console.NewLine();
  179. beginFirst();
  180. }
  181. else if (_systemResult == 1)
  182. {
  183. if (CallFunction("TITLE_LOADGAME", false, false))
  184. {//独自定義
  185. state.SystemState = SystemStateCode.Openning_TitleLoadgame;
  186. }
  187. else
  188. {//標準のLOADGAME
  189. beginLoadGameOpening();
  190. }
  191. }
  192. else//入力が正しくないならもう一回選択肢を書き直し、正しい選択を要求する。
  193. {//RESUELASTLINEと同様の処理を行うように変更
  194. console.deleteLine(1);
  195. console.PrintTemporaryLine("Invalid value");
  196. console.updatedGeneration = true;
  197. openingInput();
  198. //beginTitle();
  199. }
  200. }
  201. void beginFirst()
  202. {
  203. state.SystemState = SystemStateCode.Normal;
  204. //連続調教コマンド処理中の状態が持ち越されていたらここで消しておく
  205. if (isCTrain)
  206. if (ClearCommands())
  207. return;
  208. skipPrint = false;
  209. CallFunction("EVENTFIRST", true, true);
  210. }
  211. void endTitleLoadgame()
  212. {
  213. beginTitle();
  214. }
  215. void beginTrain()
  216. {
  217. vEvaluator.UpdateInBeginTrain();
  218. state.SystemState = SystemStateCode.Train_CallEventTrain;
  219. //EVENTTRAINを呼び出してTrain_CallEventTrainへ移行。
  220. if (!CallFunction("EVENTTRAIN", false, true))
  221. {
  222. //存在しなければスキップしてTrain_CallEventTrainが終わったことにする。
  223. endCallEventTrain();
  224. }
  225. }
  226. List<Int64> coms = new List<long>();
  227. bool isCTrain;
  228. int count;
  229. bool skipPrint;
  230. public bool SkipPrint { get => skipPrint;
  231. set { skipPrint = value; } }
  232. void endCallEventTrain()
  233. {
  234. if (vEvaluator.NEXTCOM >= 0)
  235. {//NEXTCOMの処理
  236. state.SystemState = SystemStateCode.Train_CallEventCom;
  237. vEvaluator.SELECTCOM = vEvaluator.NEXTCOM;
  238. vEvaluator.NEXTCOM = 0;
  239. //-1ではなく0を代入するのでERB側で変更しない限り無限にはまることになるがeramakerからの仕様である。
  240. callEventCom();
  241. }
  242. else
  243. {
  244. //if (!isCTrain)
  245. //{
  246. //SHOW_STATUSを呼び出してTrain_CallShowStatusへ移行。
  247. if (isCTrain)
  248. skipPrint = true;
  249. CallFunction("SHOW_STATUS", true, false);
  250. state.SystemState = SystemStateCode.Train_CallShowStatus;
  251. //}
  252. //else
  253. //{
  254. //連続調教モードならCOMABLE処理へ
  255. // endCallShowStatus();
  256. //}
  257. }
  258. }
  259. void endCallShowStatus()
  260. {
  261. //SHOW_STATUSが終わったらComAbleXXの呼び出し状態をリセットしてTrain_CallComAbleXXへ移行。
  262. state.SystemState = SystemStateCode.Train_CallComAbleXX;
  263. _lastCalledComable = -1;
  264. _lastAddCom = -1;
  265. printComCount = 0;
  266. for (int i = 0; i < _comAble.Length; i++)
  267. _comAble[i] = -1;
  268. endCallComAbleXX();
  269. }
  270. string getTrainComString(int trainCode, int comNo)
  271. {
  272. string trainName = Translation.translate(_trainName[trainCode], "Train", true);
  273. return string.Format("{0}[{1,3}]", trainName, comNo);
  274. }
  275. int printComCount;
  276. void endCallComAbleXX()
  277. {
  278. //選択肢追加。RESULTが0の場合は選択肢の番号のみ増やして追加はしない。
  279. if ((_lastCalledComable >= 0) && (_trainName[_lastCalledComable] != null))
  280. {
  281. _lastAddCom++;
  282. if (vEvaluator.RESULT != 0)
  283. {
  284. _comAble[_lastAddCom] = _lastCalledComable;
  285. if (!isCTrain)
  286. {
  287. console.PrintC(getTrainComString(_lastCalledComable, _lastAddCom), true);
  288. printComCount++;
  289. if ((Config.Config.PrintCPerLine > 0) && (printComCount % Config.Config.PrintCPerLine == 0))
  290. console.PrintFlush(false);
  291. }
  292. console.RefreshStrings(false);
  293. }
  294. }
  295. //ComAbleXXの呼び出し。train.csvに定義されていないものはスキップ、ComAbleXXが見つからなければREUTRN 1と同様に扱う。
  296. while (++_lastCalledComable < _trainName.Length)
  297. {
  298. if (_trainName[_lastCalledComable] == null)
  299. continue;
  300. string comName = string.Format("COM_ABLE{0}", _lastCalledComable);
  301. if (!CallFunction(comName, false, false))
  302. {
  303. _lastAddCom++;
  304. if (Config.Config.ComAbleDefault == 0)
  305. continue;
  306. _comAble[_lastAddCom] = _lastCalledComable;
  307. if (!isCTrain)
  308. {
  309. console.PrintC(getTrainComString(_lastCalledComable, _lastAddCom), true);
  310. printComCount++;
  311. if ((Config.Config.PrintCPerLine > 0) && (printComCount % Config.Config.PrintCPerLine == 0))
  312. console.PrintFlush(false);
  313. }
  314. continue;
  315. }
  316. console.RefreshStrings(false);
  317. return;
  318. }
  319. //全部検索したら終了し、SHOW_USERCOMを呼び出す。
  320. if (_lastCalledComable >= _trainName.Length)
  321. {
  322. state.SystemState = SystemStateCode.Train_CallShowUserCom;
  323. //if (!isCTrain)
  324. //{
  325. console.PrintFlush(false);
  326. console.RefreshStrings(false);
  327. CallFunction("SHOW_USERCOM", true, false);
  328. //}
  329. //else
  330. // endCallShowUserCom();
  331. }
  332. }
  333. void endCallShowUserCom()
  334. {
  335. if (skipPrint)
  336. skipPrint = false;
  337. vEvaluator.UpdateAfterShowUsercom();
  338. if (!isCTrain)
  339. {
  340. //数値入力待ち状態にしてTrain_WaitInputへ移行。
  341. SetWaitInput();
  342. state.SystemState = SystemStateCode.Train_WaitInput;
  343. }
  344. else
  345. {
  346. if (count < coms.Count)
  347. {
  348. _systemResult = coms[count];
  349. count++;
  350. trainWaitInput();
  351. }
  352. }
  353. }
  354. void trainWaitInput()
  355. {
  356. int selectCom = -1;
  357. if (!isCTrain)
  358. {
  359. if ((_systemResult >= 0) && (_systemResult < _comAble.Length))
  360. selectCom = _comAble[_systemResult];
  361. }
  362. else
  363. {
  364. for (int i = 0; i < _comAble.Length; i++)
  365. {
  366. if (_comAble[i] == _systemResult)
  367. selectCom = (int)_systemResult;
  368. }
  369. console.PrintSingleLine(string.Format("<Executed command:{0}/{1}>", count, coms.Count));
  370. }
  371. //TrainNameが定義されていて使用可能(COMABLEが非0を返した)である
  372. if (selectCom >= 0)
  373. {
  374. vEvaluator.SELECTCOM = selectCom;
  375. callEventCom();
  376. }
  377. else
  378. {//されていない。
  379. if (isCTrain)
  380. console.PrintSingleLine("Unable to execute command");
  381. vEvaluator.RESULT = _systemResult;
  382. state.SystemState = SystemStateCode.Train_CallEventComEnd;
  383. CallFunction("USERCOM", true, false);
  384. //COM中の必要なことは全部USERCOM内でやる。
  385. }
  386. }
  387. private Int64 doTrainSelectCom = -1;
  388. void doTrain()
  389. {
  390. vEvaluator.UpdateAfterShowUsercom();
  391. vEvaluator.SELECTCOM = doTrainSelectCom;
  392. callEventCom();
  393. }
  394. void callEventCom()
  395. {
  396. vEvaluator.UpdateAfterInputCom();
  397. state.SystemState = SystemStateCode.Train_CallEventCom;
  398. if (!CallFunction("EVENTCOM", false, true))
  399. endEventCom();
  400. }
  401. void endEventCom()
  402. {
  403. long selectCom = vEvaluator.SELECTCOM;
  404. string comName = string.Format("COM{0}", selectCom);
  405. state.SystemState = SystemStateCode.Train_CallComXX;
  406. CallFunction(comName, true, false);
  407. }
  408. void endCallComXX()
  409. {
  410. //実行に失敗した
  411. if (vEvaluator.RESULT == 0)
  412. {
  413. //Com終了。
  414. endCallEventComEnd();
  415. }
  416. else
  417. {//成功したならSOURCE_CHECKへ移行。
  418. state.SystemState = SystemStateCode.Train_CallSourceCheck;
  419. CallFunction("SOURCE_CHECK", true, false);
  420. }
  421. }
  422. void endCallSourceCheck()
  423. {
  424. //SOURCEはここでリセット
  425. vEvaluator.UpdateAfterSourceCheck();
  426. //EVENTCOMENDを呼び出してTrain_CallEventComEndへ移行。
  427. state.SystemState = SystemStateCode.Train_CallEventComEnd;
  428. //EVENTCOMENDが存在しない、またはEVENTCOMEND内でWAIT系命令が行われない場合、EVENTCOMEND後にWAITを追加する。
  429. NeedWaitToEventComEnd = true;
  430. if (!CallFunction("EVENTCOMEND", false, true))
  431. {
  432. //見つからないならスキップしてTrain_CallEventComEndが終了したとみなす。
  433. endCallEventComEnd();
  434. }
  435. }
  436. public bool NeedWaitToEventComEnd;
  437. bool needCheck = true;
  438. void endCallEventComEnd()
  439. {
  440. if (console.LastLineIsTemporary && !isCTrain && needCheck)
  441. {
  442. if (console.LastLineIsEmpty)
  443. {
  444. console.deleteLine(2);
  445. console.PrintTemporaryLine("Invalid value");
  446. }
  447. console.updatedGeneration = true;
  448. endCallShowUserCom();
  449. }
  450. else
  451. {
  452. if (isCTrain && count == coms.Count)
  453. {
  454. isCTrain = false;
  455. skipPrint = false;
  456. coms.Clear();
  457. count = 0;
  458. if (CallFunction("CALLTRAINEND", false, false))
  459. {
  460. needCheck = false;
  461. return;
  462. }
  463. }
  464. needCheck = true;
  465. ////1.701 ここでWAITは不要だった。
  466. ////setWait();
  467. //1.703 やはり必要な場合もあった
  468. if (NeedWaitToEventComEnd)
  469. SetWait();
  470. NeedWaitToEventComEnd = false;
  471. //SHOW_STATUSからやり直す。
  472. //処理はTrain_CallEventTrainと同じ。
  473. endCallEventTrain();
  474. }
  475. }
  476. void beginAfterTrain()
  477. {
  478. //連続調教モード中にここに来る場合があるので、ここで解除
  479. if (isCTrain)
  480. if (ClearCommands())
  481. return;
  482. skipPrint = false;
  483. state.SystemState = SystemStateCode.Normal;
  484. //EVENTENDを呼び出す。exe側が状態を把握する必要が無くなるのでNormalへ移行。
  485. CallFunction("EVENTEND", true, true);
  486. }
  487. void beginAblup()
  488. {
  489. //連続調教コマンド処理中の状態が持ち越されていたらここで消しておく
  490. if (isCTrain)
  491. if (ClearCommands())
  492. return;
  493. skipPrint = false;
  494. state.SystemState = SystemStateCode.Ablup_CallShowJuel;
  495. //SHOW_JUELを呼び出しAblup_CallShowJuelへ移行。
  496. CallFunction("SHOW_JUEL", true, false);
  497. }
  498. void endCallShowJuel()
  499. {
  500. state.SystemState = SystemStateCode.Ablup_CallShowAblupSelect;
  501. //SHOW_ABLUP_SELECTを呼び出しAblup_CallAblupSelectへ移行。
  502. CallFunction("SHOW_ABLUP_SELECT", true, false);
  503. }
  504. void endCallShowAblupSelect()
  505. {
  506. //数値入力待ち状態にしてAblup_WaitInputへ移行。
  507. SetWaitInput();
  508. state.SystemState = SystemStateCode.Ablup_WaitInput;
  509. }
  510. void ablupWaitInput()
  511. {
  512. //定義されていなくても100未満ならABLUPが呼ばれ、USERABLUPは呼ばれない。そうしないと[99]反発刻印とかが出来ない。
  513. if ((_systemResult >= 0) && (_systemResult < 100))
  514. {
  515. state.SystemState = SystemStateCode.Ablup_CallAblupXX;
  516. string ablName = string.Format("ABLUP{0}", _systemResult);
  517. if (!CallFunction(ablName, false, false))
  518. {
  519. //見つからなければ終了
  520. console.deleteLine(1);
  521. console.PrintTemporaryLine("Invalid value");
  522. console.updatedGeneration = true;
  523. endCallShowAblupSelect();
  524. }
  525. }
  526. else
  527. {
  528. vEvaluator.RESULT = _systemResult;
  529. state.SystemState = SystemStateCode.Ablup_CallAblupXX;
  530. CallFunction("USERABLUP", true, false);
  531. }
  532. }
  533. void endCallAblupXX()
  534. {
  535. if (console.LastLineIsTemporary)
  536. {
  537. if (console.LastLineIsEmpty)
  538. {
  539. console.deleteLine(2);
  540. console.PrintTemporaryLine("Invalid value");
  541. }
  542. console.updatedGeneration = true;
  543. endCallShowAblupSelect();
  544. }
  545. else
  546. beginAblup();
  547. }
  548. void beginTurnend()
  549. {
  550. //連続調教コマンド処理中の状態が持ち越されていたらここで消しておく
  551. if (isCTrain)
  552. if (ClearCommands())
  553. return;
  554. skipPrint = false;
  555. //EVENTTURNENDを呼び出しNormalへ移行
  556. CallFunction("EVENTTURNEND", true, true);
  557. state.SystemState = SystemStateCode.Normal;
  558. }
  559. void beginShop()
  560. {
  561. //連続調教コマンド処理中の状態が持ち越されていたらここで消しておく
  562. if (isCTrain)
  563. if (ClearCommands())
  564. return;
  565. skipPrint = false;
  566. state.SystemState = SystemStateCode.Shop_CallEventShop;
  567. //EVENTSHOPを呼び出してShop_CallEventShopへ移行。
  568. if (!CallFunction("EVENTSHOP", false, true))
  569. {
  570. //存在しなければスキップしてShop_CallEventShopが終わったことにする。
  571. endCallEventShop();
  572. }
  573. }
  574. void endCallEventShop()
  575. {
  576. saveTarget = -1;
  577. if (Config.Config.AutoSave && state.calledWhenNormal)
  578. beginAutoSave();
  579. else
  580. {
  581. state.SystemState = SystemStateCode.AutoSave_Skipped;
  582. endAutoSaveCallSaveInfo();
  583. }
  584. }
  585. void beginAutoSave()
  586. {
  587. if (CallFunction("SYSTEM_AUTOSAVE", false, false))
  588. {//@SYSTEM_AUTOSAVEが存在するならそれを使う。
  589. state.SystemState = SystemStateCode.AutoSave_CallUniqueAutosave;
  590. return;
  591. }
  592. saveTarget = AutoSaveIndex;
  593. vEvaluator.SAVEDATA_TEXT = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " ";
  594. state.SystemState = SystemStateCode.AutoSave_CallSaveInfo;
  595. if (!CallFunction("SAVEINFO", false, false))
  596. endAutoSaveCallSaveInfo();//存在しなければスキップ
  597. }
  598. void endAutoSaveCallSaveInfo()
  599. {
  600. if (saveTarget == AutoSaveIndex)
  601. {
  602. if (!vEvaluator.SaveTo(saveTarget, vEvaluator.SAVEDATA_TEXT))
  603. {
  604. console.PrintError("オートセーブ中に予期しないエラーが発生しました");
  605. console.PrintError("オートセーブをスキップします");
  606. console.ReadAnyKey();
  607. }
  608. }
  609. endAutoSave();
  610. }
  611. void endAutoSave()
  612. {
  613. if (state.isBegun)
  614. {
  615. state.Begin();
  616. return;
  617. }
  618. state.SystemState = SystemStateCode.Shop_CallShowShop;
  619. //SHOW_SHOPを呼び出しShop_CallShowShopへ移行
  620. CallFunction("SHOW_SHOP", true, false);
  621. }
  622. void endCallShowShop()
  623. {
  624. //数値入力待ち状態にしてShop_WaitInputへ移行。
  625. SetWaitInput();
  626. state.SystemState = SystemStateCode.Shop_WaitInput;
  627. }
  628. //PRINT_SHOPITEMとは独立している。
  629. //BOUGHTが100以上のアイテムが有り、ITEMSALESがTRUEだとしても強制的に@USERSHOP行き。
  630. void shopWaitInput()
  631. {
  632. if ((_systemResult >= 0) && (_systemResult < Config.Config.MaxShopItem))
  633. {
  634. if (vEvaluator.ItemSales(_systemResult))
  635. {
  636. if (vEvaluator.BuyItem(_systemResult))
  637. {
  638. state.SystemState = SystemStateCode.Shop_CallEventBuy;
  639. //EVENTBUYを呼び出しShop_CallEventBuyへ移行
  640. if (!CallFunction("EVENTBUY", false, true))
  641. endCallEventBuy();
  642. return;
  643. }
  644. //console.Print("お金が足りません。");
  645. //console.NewLine();
  646. console.deleteLine(1);
  647. console.PrintTemporaryLine("お金が足りません。");
  648. }
  649. else
  650. {
  651. //console.Print("売っていません。");
  652. //console.NewLine();
  653. console.deleteLine(1);
  654. console.PrintTemporaryLine("売っていません。");
  655. }
  656. //購入に失敗した場合、endCallEventShop()に戻す。
  657. //endCallEventShop();
  658. endCallShowShop();
  659. }
  660. else
  661. {
  662. //RESULTを更新
  663. vEvaluator.RESULT = _systemResult;
  664. //USERSHOPを呼び出しShop_CallEventBuyへ移行
  665. CallFunction("USERSHOP", true, false);
  666. state.SystemState = SystemStateCode.Shop_CallEventBuy;
  667. }
  668. }
  669. void endCallEventBuy()
  670. {
  671. if (console.LastLineIsTemporary)
  672. {
  673. if (console.LastLineIsEmpty)
  674. {
  675. console.deleteLine(2);
  676. console.PrintTemporaryLine("Invalid value");
  677. }
  678. console.updatedGeneration = true;
  679. endCallShowShop();
  680. }
  681. else
  682. {
  683. //最初に戻る
  684. endAutoSave();
  685. }
  686. }
  687. void beginDataLoaded()
  688. {
  689. state.SystemState = SystemStateCode.LoadData_CallSystemLoad;
  690. if (!CallFunction("SYSTEM_LOADEND", false, false))
  691. endSystemLoad();//存在しなければスキップ
  692. }
  693. void endSystemLoad()
  694. {
  695. state.SystemState = SystemStateCode.LoadData_CallEventLoad;
  696. //EVENTLOADを呼び出してLoadData_CallEventLoadへ移行。
  697. if (!CallFunction("EVENTLOAD", false, true))
  698. {
  699. //存在しなければスキップしてTrain_CallEventTrainが終わったことにする。
  700. endAutoSave();
  701. }
  702. }
  703. void endEventLoad()
  704. {
  705. //@EVENTLOAD中にBEGIN命令が行われればここには来ない。
  706. //ここに来たらBEGIN SHOP扱い。オートセーブはしない。
  707. endAutoSave();
  708. }
  709. void beginSaveGame()
  710. {
  711. console.PrintSingleLine("Where do you want to save?");
  712. state.SystemState = SystemStateCode.SaveGame_Begin;
  713. printSaveDataText();
  714. }
  715. void beginLoadGame()
  716. {
  717. console.PrintSingleLine("What do you want to load?");
  718. state.SystemState = SystemStateCode.LoadGame_Begin;
  719. printSaveDataText();
  720. }
  721. void beginLoadGameOpening()
  722. {
  723. console.PrintSingleLine("Which save do you load?");
  724. state.SystemState = SystemStateCode.LoadGameOpenning_Begin;
  725. printSaveDataText();
  726. }
  727. bool[] dataIsAvailable = new bool[21];
  728. bool isFirstTime = true;
  729. const int AutoSaveIndex = 99;
  730. int page;
  731. void printSaveDataText()
  732. {
  733. if (isFirstTime)
  734. {
  735. isFirstTime = false;
  736. dataIsAvailable = new bool[Config.Config.SaveDataNos + 1];
  737. }
  738. int dataNo = 0;
  739. for (int i = 0; i < page; i++)
  740. {
  741. console.PrintFlush(false);
  742. console.Write(string.Format("[{0, 2}] Display slots {0, 2}~{1, 2}", i * 20, i * 20 + 19));
  743. }
  744. for (int i = 0; i < 20; i++)
  745. {
  746. dataNo = page * 20 + i;
  747. if (dataNo == dataIsAvailable.Length - 1)
  748. break;
  749. dataIsAvailable[dataNo] = false;
  750. console.PrintFlush(false);
  751. console.Write(string.Format("[{0, 2}] ", dataNo));
  752. if (!writeSavedataTextFrom(dataNo))
  753. continue;
  754. dataIsAvailable[dataNo] = true;
  755. }
  756. for (int i = page; i < ((dataIsAvailable.Length - 2) / 20); i++)
  757. {
  758. console.PrintFlush(false);
  759. console.Write(string.Format("[{0, 2}] Display slots {0, 2}~{1, 2}", (i + 1) * 20, (i + 1) * 20 + 19));
  760. }
  761. //オートセーブの処理は別途切り出し(表示処理の都合上)
  762. dataIsAvailable[dataIsAvailable.Length - 1] = false;
  763. if (state.SystemState != SystemStateCode.SaveGame_Begin)
  764. {
  765. dataNo = AutoSaveIndex;
  766. console.PrintFlush(false);
  767. console.Write(string.Format("[{0, 2}] ", dataNo));
  768. if (writeSavedataTextFrom(dataNo))
  769. dataIsAvailable[dataIsAvailable.Length - 1] = true;
  770. }
  771. console.RefreshStrings(false);
  772. //描画全部終わり
  773. console.PrintSingleLine("[100] Return");
  774. SetWaitInput();
  775. if (state.SystemState == SystemStateCode.SaveGame_Begin)
  776. state.SystemState = SystemStateCode.SaveGame_WaitInput;
  777. else if (state.SystemState == SystemStateCode.LoadGame_Begin)
  778. state.SystemState = SystemStateCode.LoadGame_WaitInput;
  779. else// if (state.SystemState == SystemStateCode.LoadGameOpenning_Begin)
  780. state.SystemState = SystemStateCode.LoadGameOpenning_WaitInput;
  781. //きちんと処理されてるので、ここには来ない
  782. //else
  783. // throw new ExeEE("異常な状態");
  784. }
  785. int saveTarget = -1;
  786. void saveGameWaitInput()
  787. {
  788. if (_systemResult == 100)
  789. {
  790. //キャンセルなら直前の状態を呼び戻す
  791. loadPrevState();
  792. return;
  793. }
  794. if (((int)_systemResult / 20) != page && _systemResult != AutoSaveIndex && (_systemResult >= 0 && _systemResult < dataIsAvailable.Length - 1))
  795. {
  796. page = (int)_systemResult / 20;
  797. state.SystemState = SystemStateCode.SaveGame_Begin;
  798. printSaveDataText();
  799. return;
  800. }
  801. bool available = false;
  802. if ((_systemResult >= 0) && (_systemResult < dataIsAvailable.Length - 1))
  803. available = dataIsAvailable[_systemResult];
  804. else
  805. {//入力しなおし
  806. console.deleteLine(1);
  807. console.PrintTemporaryLine("Invalid value");
  808. console.updatedGeneration = true;
  809. SetWaitInput();
  810. return;
  811. }
  812. saveTarget = (int)_systemResult;
  813. //既存データがあるなら選択肢を表示してSaveGame_WaitInputOverwriteへ移行。
  814. if (available)
  815. {
  816. console.PrintSingleLine("Save already exists. Overwrite?");
  817. console.PrintC("[0] Yes", false);
  818. console.PrintC("[1] No", false);
  819. SetWaitInput();
  820. state.SystemState = SystemStateCode.SaveGame_WaitInputOverwrite;
  821. return;
  822. }
  823. //既存データがないなら「はい」を選んだことにして直接ジャンプ
  824. _systemResult = 0;
  825. saveGameWaitInputOverwrite();
  826. }
  827. void saveGameWaitInputOverwrite()
  828. {
  829. if (_systemResult == 1)//いいえ
  830. {
  831. beginSaveGame();
  832. return;
  833. }
  834. if (_systemResult != 0)//「はい」でもない
  835. {//入力しなおし
  836. console.deleteLine(1);
  837. console.PrintTemporaryLine("Invalid value");
  838. console.updatedGeneration = true;
  839. SetWaitInput();
  840. return;
  841. }
  842. vEvaluator.SAVEDATA_TEXT = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " ";
  843. state.SystemState = SystemStateCode.SaveGame_CallSaveInfo;
  844. if (!CallFunction("SAVEINFO", false, false))
  845. endCallSaveInfo();//存在しなければスキップ
  846. }
  847. void endCallSaveInfo()
  848. {
  849. if (!vEvaluator.SaveTo(saveTarget, vEvaluator.SAVEDATA_TEXT))
  850. {
  851. console.PrintError("Unexpected error while saving occured");
  852. console.ReadAnyKey();
  853. }
  854. loadPrevState();
  855. }
  856. void loadGameWaitInput()
  857. {
  858. if (_systemResult == 100)
  859. {//キャンセルなら
  860. //オープニングならオープニングへ戻る
  861. if (state.SystemState == SystemStateCode.LoadGameOpenning_WaitInput)
  862. {
  863. beginTitle();
  864. return;
  865. }
  866. //それ以外から来たなら直前の状態を呼び戻す
  867. loadPrevState();
  868. return;
  869. }
  870. if (((int)_systemResult / 20) != page && _systemResult != AutoSaveIndex && (_systemResult >= 0 && _systemResult < dataIsAvailable.Length - 1))
  871. {
  872. page = (int)_systemResult / 20;
  873. if (state.SystemState == SystemStateCode.LoadGameOpenning_WaitInput)
  874. state.SystemState = SystemStateCode.LoadGameOpenning_Begin;
  875. else
  876. state.SystemState = SystemStateCode.LoadGame_Begin;
  877. printSaveDataText();
  878. return;
  879. }
  880. bool available = false;
  881. if ((_systemResult >= 0) && (_systemResult < dataIsAvailable.Length - 1))
  882. available = dataIsAvailable[_systemResult];
  883. else if (_systemResult == AutoSaveIndex)
  884. available = dataIsAvailable[dataIsAvailable.Length - 1];
  885. else
  886. {//入力しなおし
  887. console.deleteLine(1);
  888. console.PrintTemporaryLine("Invalid value");
  889. console.updatedGeneration = true;
  890. SetWaitInput();
  891. return;
  892. }
  893. if (!available)
  894. {
  895. console.PrintSingleLine(_systemResult.ToString());
  896. console.PrintError("No data found");
  897. if (state.SystemState == SystemStateCode.LoadGameOpenning_WaitInput)
  898. {
  899. beginLoadGameOpening();
  900. return;
  901. }
  902. beginLoadGame();
  903. return;
  904. }
  905. if (!vEvaluator.LoadFrom((int)_systemResult))
  906. throw new ExeEE("Unexpected error while loading save");
  907. deletePrevState();
  908. beginDataLoaded();
  909. }
  910. void endNormal()
  911. {
  912. throw new CodeEE("Script execution terminated");
  913. }
  914. void endReloaderb()
  915. {
  916. loadPrevState();
  917. console.ReloadErbFinished();
  918. }
  919. private bool writeSavedataTextFrom(int saveIndex)
  920. {
  921. EraDataResult result = vEvaluator.CheckData(saveIndex, EraSaveFileType.Normal);
  922. console.Write(result.DataMes);
  923. console.NewLine();
  924. return result.State == EraDataState.OK;
  925. }
  926. }
  927. }