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