Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
 /// <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);
     }
 }
Ejemplo n.º 3
0
 /// <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(" }");
 }
Ejemplo n.º 4
0
 /// <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("}");
 }