/// <summary> /// シナリオヘッダを構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>シナリオヘッダ</returns> private static ScenarioHeader ParseHeader(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; } ScenarioHeader header = new ScenarioHeader(); while (true) { token = lexer.GetToken(); // ファイルの終端 if (token == null) { Log.MissingCloseBrace(LogCategory, "header", 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(); // name if (keyword.Equals("name")) { string s = ParseString(lexer); if (s == null) { Log.InvalidClause(LogCategory, "name", lexer); continue; } // シナリオヘッダ名 header.Name = s; continue; } // startdate if (keyword.Equals("startdate")) { GameDate date = ParseDate(lexer); if (date == null) { Log.InvalidSection(LogCategory, "startdate", lexer); continue; } // 開始日時 header.StartDate = date; continue; } // startyear if (keyword.Equals("startyear")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "startyear", lexer); continue; } // 開始年 header.StartYear = (int) n; continue; } // endyear if (keyword.Equals("endyear")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "endyear", lexer); continue; } // 終了年 header.EndYear = (int) n; continue; } // free if (keyword.Equals("free")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "free", lexer); continue; } // 国家の自由選択 header.IsFreeSelection = (bool) b; continue; } // combat if (keyword.Equals("combat")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "combat", lexer); continue; } // ショートシナリオ header.IsBattleScenario = (bool) b; continue; } // selectable if (keyword.Equals("selectable")) { IEnumerable<Country> list = ParseCountryList(lexer); if (list == null) { Log.InvalidSection(LogCategory, "selectable", lexer); continue; } // 選択可能国 header.SelectableCountries.AddRange(list); continue; } // set_ai_aggresive if (keyword.Equals("set_ai_aggresive")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "set_ai_aggresive", lexer); continue; } // AIの攻撃性 header.AiAggressive = (int) n; continue; } // set_difficulty if (keyword.Equals("set_difficulty")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "set_difficulty", lexer); continue; } // 難易度 header.Difficulty = (int) n; continue; } // set_gamespeed if (keyword.Equals("set_gamespeed")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "set_gamespeed", lexer); continue; } // ゲームスピード header.GameSpeed = (int) n; continue; } // 国タグ string tagName = keyword.ToUpper(); if (Countries.StringMap.ContainsKey(tagName)) { Country tag = Countries.StringMap[tagName]; if (Countries.Tags.Contains(tag)) { MajorCountrySettings major = ParseMajorCountry(lexer); if (major == null) { Log.InvalidSection(LogCategory, tagName, lexer); continue; } // 主要国設定 major.Country = tag; MajorCountrySettings prev = header.MajorCountries.FirstOrDefault(m => m.Country == tag); if (prev != null) { header.MajorCountries.Remove(prev); } header.MajorCountries.Add(major); continue; } } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } return header; }
/// <summary> /// 主要国設定リストを書き出す /// </summary> /// <param name="header">シナリオヘッダ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteMajorCountries(ScenarioHeader header, TextWriter writer) { foreach (MajorCountrySettings major in header.MajorCountries) { WriteMajorCountry(major, writer); } }
/// <summary> /// 選択可能国リストを書き出す /// </summary> /// <param name="header">シナリオヘッダ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteSelectableCountries(ScenarioHeader header, TextWriter writer) { if (header.SelectableCountries.Count == 0) { return; } writer.Write(" selectable = {"); WriteCountryList(header.SelectableCountries, writer); writer.WriteLine(" }"); }
/// <summary> /// シナリオヘッダを書き出す /// </summary> /// <param name="header">シナリオヘッダ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteHeader(ScenarioHeader header, TextWriter writer) { writer.WriteLine("header = {"); if (!string.IsNullOrEmpty(header.Name)) { writer.WriteLine(" name = \"{0}\"", header.Name); } if (header.StartDate != null) { writer.WriteLine(" startdate = {{ year = {0} }}", header.StartDate.Year); } else { if (header.StartYear > 0) { writer.WriteLine(" startyear = {0}", header.StartYear); } if (header.EndYear > 0) { writer.WriteLine(" endyear = {0}", header.EndYear); } } if (!header.IsFreeSelection) { writer.WriteLine(" free = no"); } if (header.IsBattleScenario) { writer.WriteLine(" combat = yes"); } WriteSelectableCountries(header, writer); WriteMajorCountries(header, writer); writer.WriteLine("}"); }