GameBase.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using NTERA.EmuEra.Game.EraEmu.Sub;
  6. namespace NTERA.EmuEra.Game.EraEmu.GameData
  7. {
  8. internal sealed class GameBase
  9. {
  10. public string ScriptAutherName = "";
  11. public string ScriptDetail = "";//詳細な説明
  12. public string ScriptYear = "";
  13. public string ScriptTitle = "";
  14. public Int64 ScriptUniqueCode;
  15. //1.713 訂正。eramakerのバージョンの初期値は1000ではなく0だった
  16. public Int64 ScriptVersion;//1000;
  17. //1.713 上の変更とあわせて。セーブデータのバージョンが1000であり、現在のバージョンが未定義である場合、セーブデータのバージョンを同じとみなす
  18. public bool ScriptVersionDefined;
  19. public Int64 ScriptCompatibleMinVersion = -1;
  20. public string Compatible_EmueraVer = "0.000.0.0";
  21. //1.727 追加。Form.Text
  22. public string ScriptWindowTitle;
  23. public string ScriptVersionText
  24. {
  25. get
  26. {
  27. StringBuilder versionStr = new StringBuilder();
  28. versionStr.Append((ScriptVersion / 1000).ToString());
  29. versionStr.Append(".");
  30. if ((ScriptVersion % 10) != 0)
  31. versionStr.Append((ScriptVersion % 1000).ToString("000"));
  32. else
  33. versionStr.Append((ScriptVersion % 1000 / 10).ToString("00"));
  34. return versionStr.ToString();
  35. }
  36. }
  37. public bool UniqueCodeEqualTo(Int64 target)
  38. {
  39. //1804 UniqueCode Int64への拡張に伴い修正
  40. if (target == 0L)
  41. return true;
  42. return target == ScriptUniqueCode;
  43. }
  44. public bool CheckVersion(Int64 target)
  45. {
  46. if (!ScriptVersionDefined && target != 1000)
  47. return true;
  48. if (ScriptCompatibleMinVersion <= target)
  49. return true;
  50. return ScriptVersion == target;
  51. }
  52. public Int64 DefaultCharacter = -1;
  53. public Int64 DefaultNoItem;
  54. private bool tryatoi(string str, out Int64 i)
  55. {
  56. if (Int64.TryParse(str, out i))
  57. return true;
  58. StringStream st = new StringStream(str);
  59. StringBuilder sb = new StringBuilder(str.Length);
  60. while (true)
  61. {
  62. if (st.EOS)
  63. break;
  64. if (!char.IsNumber(st.Current))
  65. break;
  66. sb.Append(st.Current);
  67. st.ShiftNext();
  68. }
  69. if (sb.Length > 0)
  70. if (Int64.TryParse(sb.ToString(), out i))
  71. return true;
  72. return false;
  73. }
  74. public bool LoadGameBaseCsv(string basePath)
  75. {
  76. if (!File.Exists(basePath))
  77. {
  78. return true;
  79. }
  80. ScriptPosition pos = null;
  81. EraStreamReader eReader = new EraStreamReader(false);
  82. if (!eReader.Open(basePath))
  83. {
  84. //output.PrintLine(eReader.Filename + "のオープンに失敗しました");
  85. return true;
  86. }
  87. try
  88. {
  89. StringStream st = null;
  90. while ((st = eReader.ReadEnabledLine()) != null)
  91. {
  92. string[] tokens = st.Substring().Split(',');
  93. if (tokens.Length < 2)
  94. continue;
  95. string param = tokens[1].Trim();
  96. pos = new ScriptPosition(eReader.Filename, eReader.LineNo, st.RowString);
  97. switch (tokens[0])
  98. {
  99. case "コード":
  100. if (tryatoi(tokens[1], out ScriptUniqueCode))
  101. {
  102. if (ScriptUniqueCode == 0L)
  103. ParserMediator.Warn("コード:0のセーブデータはいかなるコードのスクリプトからも読めるデータとして扱われます", pos, 0);
  104. }
  105. break;
  106. case "バージョン":
  107. ScriptVersionDefined = tryatoi(tokens[1], out ScriptVersion);
  108. break;
  109. case "バージョン違い認める":
  110. tryatoi(tokens[1], out ScriptCompatibleMinVersion);
  111. break;
  112. case "最初からいるキャラ":
  113. tryatoi(tokens[1], out DefaultCharacter);
  114. break;
  115. case "アイテムなし":
  116. tryatoi(tokens[1], out DefaultNoItem);
  117. break;
  118. case "タイトル":
  119. ScriptTitle = tokens[1];
  120. break;
  121. case "作者":
  122. ScriptAutherName = tokens[1];
  123. break;
  124. case "製作年":
  125. ScriptYear = tokens[1];
  126. break;
  127. case "追加情報":
  128. ScriptDetail = tokens[1];
  129. break;
  130. case "ウィンドウタイトル":
  131. ScriptWindowTitle = tokens[1];
  132. break;
  133. case "動作に必要なEmueraのバージョン":
  134. Compatible_EmueraVer = tokens[1];
  135. if (!Regex.IsMatch(Compatible_EmueraVer, @"^\d+\.\d+\.\d+\.\d+$"))
  136. {
  137. ParserMediator.Warn("バージョン指定を読み取れなかったので処理を省略します", pos, 0);
  138. break;
  139. }
  140. Version curerntVersion = new Version(GlobalStatic.MainWindow.InternalEmueraVer);
  141. Version targetVersoin = new Version(Compatible_EmueraVer);
  142. if (curerntVersion < targetVersoin)
  143. {
  144. ParserMediator.Warn("このバリアント動作させるにはVer. " + GlobalStatic.MainWindow.EmueraVerText + "以降のバージョンのEmueraが必要です", pos, 2);
  145. return false;
  146. }
  147. break;
  148. }
  149. }
  150. }
  151. catch
  152. {
  153. ParserMediator.Warn("GAMEBASE.CSVの読み込み中にエラーが発生したため、読みこみを中断します", pos, 1);
  154. return true;
  155. }
  156. finally
  157. {
  158. eReader.Close();
  159. }
  160. if (ScriptWindowTitle == null)
  161. {
  162. if (string.IsNullOrEmpty(ScriptTitle))
  163. ScriptWindowTitle = "Emuera";
  164. else
  165. ScriptWindowTitle = ScriptTitle + " " + ScriptVersionText;
  166. }
  167. return true;
  168. }
  169. }
  170. }