/// <summary> /// 同盟リストを書き出す /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteAlliances(ScenarioGlobalData data, TextWriter writer) { if (data.Axis?.Id != null) { WriteAlliance(data.Axis, "axis", writer); } if (data.Allies?.Id != null) { WriteAlliance(data.Allies, "allies", writer); } if (data.Comintern?.Id != null) { WriteAlliance(data.Comintern, "comintern", writer); } foreach (Alliance alliance in data.Alliances) { WriteAlliance(alliance, "alliance", writer); } }
/// <summary> /// シナリオグローバルデータを構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>シナリオグローバルデータ</returns> private static ScenarioGlobalData ParseGlobalData(TextLexer lexer) { // = Token token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); return null; } // { token = lexer.GetToken(); if (token.Type != TokenType.OpenBrace) { Log.InvalidToken(LogCategory, token, lexer); return null; } ScenarioGlobalData data = new ScenarioGlobalData(); while (true) { token = lexer.GetToken(); // ファイルの終端 if (token == null) { Log.MissingCloseBrace(LogCategory, "globaldata", lexer); break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } string keyword = token.Value as string; if (string.IsNullOrEmpty(keyword)) { continue; } keyword = keyword.ToLower(); // rules if (keyword.Equals("rules")) { ScenarioRules rules = ParseRules(lexer); if (rules == null) { Log.InvalidSection(LogCategory, "rules", lexer); continue; } // ルール設定 data.Rules = rules; continue; } // startdate if (keyword.Equals("startdate")) { GameDate date = ParseDate(lexer); if (date == null) { Log.InvalidSection(LogCategory, "startdate", lexer); continue; } // 開始日時 data.StartDate = date; continue; } // enddate if (keyword.Equals("enddate")) { GameDate date = ParseDate(lexer); if (date == null) { Log.InvalidSection(LogCategory, "enddate", lexer); continue; } // 終了日時 data.EndDate = date; continue; } // axis if (keyword.Equals("axis")) { Alliance alliance = ParseAlliance(lexer); if (alliance == null) { Log.InvalidSection(LogCategory, "axis", lexer); continue; } // 枢軸国 data.Axis = alliance; continue; } // allies if (keyword.Equals("allies")) { Alliance alliance = ParseAlliance(lexer); if (alliance == null) { Log.InvalidSection(LogCategory, "allies", lexer); continue; } // 連合国 data.Allies = alliance; continue; } // comintern if (keyword.Equals("comintern")) { Alliance alliance = ParseAlliance(lexer); if (alliance == null) { Log.InvalidSection(LogCategory, "comintern", lexer); continue; } // 共産国 data.Comintern = alliance; continue; } // alliance if (keyword.Equals("alliance")) { Alliance alliance = ParseAlliance(lexer); if (alliance == null) { Log.InvalidSection(LogCategory, "alliance", lexer); continue; } // 同盟国 data.Alliances.Add(alliance); continue; } // war if (keyword.Equals("war")) { War war = ParseWar(lexer); if (war == null) { Log.InvalidSection(LogCategory, "war", lexer); continue; } // 戦争 data.Wars.Add(war); continue; } // treaty if (keyword.Equals("treaty")) { Treaty treaty = ParseTreaty(lexer); if (treaty == null) { Log.InvalidSection(LogCategory, "treaty", lexer); continue; } // 外交協定 switch (treaty.Type) { case TreatyType.NonAggression: data.NonAggressions.Add(treaty); break; case TreatyType.Peace: data.Peaces.Add(treaty); break; case TreatyType.Trade: data.Trades.Add(treaty); break; } continue; } // flags if (keyword.Equals("flags")) { Dictionary<string, string> flags = ParseFlags(lexer); if (flags == null) { Log.InvalidSection(LogCategory, "flags", lexer); continue; } // グローバルフラグリスト data.Flags = flags; continue; } // queued_events if (keyword.Equals("queued_events")) { List<QueuedEvent> events = ParseQueuedEvents(lexer); if (events == null) { Log.InvalidSection(LogCategory, "queued_events", lexer); continue; } // 処理待ちイベントリスト data.QueuedEvents.AddRange(events); continue; } // dormant_leaders if (keyword.Equals("dormant_leaders")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } token = lexer.GetToken(); if (token.Type == TokenType.Identifier) { string s = token.Value as string; if (string.IsNullOrEmpty(s)) { continue; } s = s.ToLower(); // yes if (s.Equals("yes")) { data.DormantLeadersAll = true; continue; } // no if (s.Equals("no")) { data.DormantLeadersAll = false; continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); continue; } // { if (token.Type != TokenType.OpenBrace) { Log.InvalidToken(LogCategory, token, lexer); return null; } List<int> list = new List<int>(); while (true) { token = lexer.GetToken(); // ファイルの終端 if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Number) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // ID list.Add((int) (double) token.Value); } // 休止指揮官 data.DormantLeaders.AddRange(list); continue; } // dormant_ministers if (keyword.Equals("dormant_ministers")) { IEnumerable<int> list = ParseIdList(lexer); if (list == null) { Log.InvalidSection(LogCategory, "dormant_ministers", lexer); continue; } // 休止閣僚 data.DormantMinisters.AddRange(list); continue; } // dormant_teams if (keyword.Equals("dormant_teams")) { IEnumerable<int> list = ParseIdList(lexer); if (list == null) { Log.InvalidSection(LogCategory, "dormant_teams", lexer); continue; } // 休止研究機関 data.DormantTeams.AddRange(list); continue; } // weather if (keyword.Equals("weather")) { Weather weather = ParseWeather(lexer); if (weather == null) { Log.InvalidSection(LogCategory, "weather", lexer); continue; } // 天候設定 data.Weather = weather; continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } return data; }
/// <summary> /// 戦争リストを書き出す /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteWars(ScenarioGlobalData data, TextWriter writer) { if (data.Wars.Count == 0) { return; } foreach (War war in data.Wars) { WriteWar(war, writer); } }
/// <summary> /// 外交協定リストを書き出す /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteTreaties(ScenarioGlobalData data, TextWriter writer) { // 不可侵条約 foreach (Treaty treaty in data.NonAggressions) { WriteTreaty(treaty, writer); } // 講和条約 foreach (Treaty treaty in data.Peaces) { WriteTreaty(treaty, writer); } // 貿易 foreach (Treaty treaty in data.Trades) { WriteTreaty(treaty, writer); } }
/// <summary> /// 休止研究機関リストを書き出す (シナリオグローバルデータ) /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteScenarioDormantTeams(ScenarioGlobalData data, TextWriter writer) { // 休止研究機関がない場合は何も書き出さない if (data.DormantTeams.Count == 0) { return; } writer.Write(" dormant_teams = {"); WriteIdList(data.DormantTeams, writer); writer.WriteLine(" }"); }
/// <summary> /// 休止指揮官リストを書き出す (シナリオグローバルデータ) /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteScenarioDormantLeaders(ScenarioGlobalData data, TextWriter writer) { if (data.DormantLeadersAll) { writer.WriteLine(" dormant_leaders = yes"); return; } // 休止指揮官がない場合は何も書き出さない if (data.DormantLeaders.Count == 0) { return; } writer.Write(" dormant_leaders = {"); WriteIdList(data.DormantLeaders, writer); writer.WriteLine(" }"); }
/// <summary> /// シナリオグローバルデータを書き出す /// </summary> /// <param name="data">シナリオグローバルデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteGlobalData(ScenarioGlobalData data, TextWriter writer) { writer.WriteLine("globaldata = {"); WriteRules(data.Rules, writer); WriteScenarioStartDate(data.StartDate, writer); WriteAlliances(data, writer); WriteWars(data, writer); WriteTreaties(data, writer); WriteScenarioDormantLeaders(data, writer); WriteScenarioDormantMinisters(data, writer); WriteScenarioDormantTeams(data, writer); WriteScenarioEndDate(data.EndDate, writer); WriteGlobalFlags(data.Flags, writer); writer.WriteLine("}"); }