Beispiel #1
0
        /// <summary>
        ///     同盟国設定を構文解析する
        /// </summary>
        /// <param name="lexer">字句解析器</param>
        /// <returns>同盟国設定</returns>
        private static Alliance ParseAlliance(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;
            }

            Alliance alliance = new Alliance();
            while (true)
            {
                token = lexer.GetToken();

                // ファイルの終端
                if (token == null)
                {
                    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();

                // id
                if (keyword.Equals("id"))
                {
                    TypeId id = ParseTypeId(lexer);
                    if (id == null)
                    {
                        Log.InvalidSection(LogCategory, "id", lexer);
                        continue;
                    }

                    // typeとidの組
                    alliance.Id = id;
                    continue;
                }

                // participant
                if (keyword.Equals("participant"))
                {
                    IEnumerable<Country> list = ParseCountryList(lexer);
                    if (list == null)
                    {
                        Log.InvalidSection(LogCategory, "participant", lexer);
                        continue;
                    }

                    // 参加国
                    alliance.Participant.AddRange(list);
                    continue;
                }

                // defensive
                if (keyword.Equals("defensive"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "defensive", lexer);
                        continue;
                    }

                    // 防衛同盟かどうか
                    alliance.Defensive = (bool) b;
                    continue;
                }

                if (Game.Type == GameType.DarkestHour)
                {
                    // name
                    if (keyword.Equals("name"))
                    {
                        string s = ParseString(lexer);
                        if (s == null)
                        {
                            Log.InvalidClause(LogCategory, "name", lexer);
                            continue;
                        }

                        // 同盟名
                        alliance.Name = s;
                        continue;
                    }
                }

                // 無効なトークン
                Log.InvalidToken(LogCategory, token, lexer);
                lexer.SkipLine();
            }

            return alliance;
        }
        /// <summary>
        ///     同盟の新規ボタン押下時の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnAllianceNewButtonClick(object sender, EventArgs e)
        {
            Scenario scenario = Scenarios.Data;
            List<Alliance> alliances = scenario.GlobalData.Alliances;

            // 同盟リストに項目を追加する
            Alliance alliance = new Alliance { Id = Scenarios.GetNewTypeId(Scenarios.DefaultAllianceType, 1) };
            alliances.Add(alliance);

            // 同盟リストビューに項目を追加する
            ListViewItem item = new ListViewItem { Text = Resources.Alliance, Tag = alliance };
            item.SubItems.Add("");
            allianceListView.Items.Add(item);

            Log.Info("[Scenario] alliance added ({0})", allianceListView.Items.Count - 4);

            // 編集済みフラグを設定する
            alliance.SetDirty(Alliance.ItemId.Type);
            alliance.SetDirty(Alliance.ItemId.Id);
            Scenarios.SetDirty();

            // 追加した項目を選択する
            if (allianceListView.SelectedIndices.Count > 0)
            {
                ListViewItem prev = allianceListView.SelectedItems[0];
                prev.Focused = false;
                prev.Selected = false;
            }
            item.Focused = true;
            item.Selected = true;
        }
        /// <summary>
        ///     項目変更前の処理 - 同盟id
        /// </summary>
        /// <param name="control">typeのコントロール</param>
        /// <param name="val">編集項目の値</param>
        /// <param name="alliance">同盟</param>
        private void PreItemChangedAllianceId(TextBox control, object val, Alliance alliance)
        {
            alliance.Id.Type = Scenarios.GetNewType(Scenarios.DefaultAllianceType, (int) val);

            // 編集済みフラグを設定する
            ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag;
            SetItemDirty(itemId, alliance);

            // 編集項目の値を更新する
            UpdateItemValue(control, alliance);

            // 編集項目の色を更新する
            UpdateItemColor(control, alliance);
        }
        /// <summary>
        ///     項目変更前の処理 - 同盟type
        /// </summary>
        /// <param name="control">idのコントロール</param>
        /// <param name="val">編集項目の値</param>
        /// <param name="alliance">同盟</param>
        private void PreItemChangedAllianceType(TextBox control, object val, Alliance alliance)
        {
            // 新規idを設定する
            alliance.Id.Id = Scenarios.GetNewId((int) val, 1);

            // 編集済みフラグを設定する
            ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag;
            SetItemDirty(itemId, alliance);

            // 編集項目の値を更新する
            UpdateItemValue(control, alliance);

            // 編集項目の色を更新する
            UpdateItemColor(control, alliance);
        }
 /// <summary>
 ///     編集項目の色を更新する
 /// </summary>
 /// <param name="control">コントロール</param>
 /// <param name="alliance">同盟</param>
 public void UpdateItemColor(Control control, Alliance alliance)
 {
     ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag;
     control.ForeColor = IsItemDirty(itemId, alliance) ? Color.Red : SystemColors.WindowText;
 }
 /// <summary>
 ///     編集項目の値を更新する
 /// </summary>
 /// <param name="control">コントロール</param>
 /// <param name="alliance">同盟</param>
 public void UpdateItemValue(TextBox control, Alliance alliance)
 {
     ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag;
     control.Text = ObjectHelper.ToString(GetItemValue(itemId, alliance));
 }
 /// <summary>
 ///     編集項目の編集済みフラグを設定する
 /// </summary>
 /// <param name="itemId">項目ID</param>
 /// <param name="alliance">同盟</param>
 public void SetItemDirty(ScenarioEditorItemId itemId, Alliance alliance)
 {
     alliance.SetDirty((Alliance.ItemId) ItemDirtyFlags[(int) itemId]);
     Scenarios.Data.SetDirty();
     Scenarios.SetDirty();
 }
        /// <summary>
        ///     編集項目の値を取得する
        /// </summary>
        /// <param name="itemId">項目ID</param>
        /// <param name="alliance">同盟</param>
        /// <returns>編集項目の値</returns>
        public object GetItemValue(ScenarioEditorItemId itemId, Alliance alliance)
        {
            switch (itemId)
            {
                case ScenarioEditorItemId.AllianceName:
                    if (!string.IsNullOrEmpty(alliance.Name))
                    {
                        return Config.GetText("ALLIANCE_" + alliance.Name);
                    }
                    ScenarioGlobalData data = Scenarios.Data.GlobalData;
                    if (alliance == data.Axis)
                    {
                        return Config.GetText(TextId.AllianceAxis);
                    }
                    if (alliance == data.Allies)
                    {
                        return Config.GetText(TextId.AllianceAllies);
                    }
                    if (alliance == data.Comintern)
                    {
                        return Config.GetText(TextId.AllianceComintern);
                    }
                    return "";

                case ScenarioEditorItemId.AllianceType:
                    return alliance.Id?.Type;

                case ScenarioEditorItemId.AllianceId:
                    return alliance.Id?.Id;
            }

            return null;
        }
 /// <summary>
 ///     項目値変更後の処理
 /// </summary>
 /// <param name="itemId">項目ID</param>
 /// <param name="val">編集項目の値</param>
 /// <param name="alliance">同盟</param>
 public void PostItemChanged(ScenarioEditorItemId itemId, object val, Alliance alliance)
 {
     switch (itemId)
     {
         case ScenarioEditorItemId.AllianceName:
             _form.SetAllianceListItemText(0, (string) val);
             break;
     }
 }
        /// <summary>
        ///     項目値変更前の処理
        /// </summary>
        /// <param name="itemId">項目ID</param>
        /// <param name="val">編集項目の値</param>
        /// <param name="alliance">同盟</param>
        public void PreItemChanged(ScenarioEditorItemId itemId, object val, Alliance alliance)
        {
            switch (itemId)
            {
                case ScenarioEditorItemId.AllianceType:
                    if (alliance.Id == null)
                    {
                        alliance.Id = new TypeId();
                        PreItemChangedAllianceType(
                            (TextBox) _form.GetItemControl(ScenarioEditorItemId.AllianceId), val, alliance);
                    }
                    break;

                case ScenarioEditorItemId.AllianceId:
                    if (alliance.Id == null)
                    {
                        alliance.Id = new TypeId();
                        PreItemChangedAllianceId(
                            (TextBox) _form.GetItemControl(ScenarioEditorItemId.AllianceType), val, alliance);
                    }
                    break;
            }
        }
 /// <summary>
 ///     編集項目の値変更時のログを出力する
 /// </summary>
 /// <param name="itemId">項目ID</param>
 /// <param name="val">編集項目の値</param>
 /// <param name="alliance">同盟</param>
 /// <param name="index">同盟リストのインデックス</param>
 public void OutputItemValueChangedLog(ScenarioEditorItemId itemId, object val, Alliance alliance, int index)
 {
     Log.Info("[Scenario] {0}: {1} -> {2} ({3})", ItemStrings[(int) itemId],
         ObjectHelper.ToString(GetItemValue(itemId, alliance)), ObjectHelper.ToString(val), index);
 }
        /// <summary>
        ///     編集項目の値が有効かどうかを判定する
        /// </summary>
        /// <param name="itemId">項目ID</param>
        /// <param name="val">編集項目の値</param>
        /// <param name="alliance">同盟</param>
        /// <returns>編集項目の値が有効でなければfalseを返す</returns>
        public bool IsItemValueValid(ScenarioEditorItemId itemId, object val, Alliance alliance)
        {
            switch (itemId)
            {
                case ScenarioEditorItemId.AllianceType:
                    if ((alliance.Id != null) && Scenarios.ExistsTypeId((int) val, alliance.Id.Id))
                    {
                        return false;
                    }
                    break;

                case ScenarioEditorItemId.AllianceId:
                    if ((alliance.Id != null) && Scenarios.ExistsTypeId(alliance.Id.Type, (int) val))
                    {
                        return false;
                    }
                    break;
            }

            return true;
        }
 /// <summary>
 ///     編集項目の編集済みフラグを取得する
 /// </summary>
 /// <param name="itemId">項目ID</param>
 /// <param name="alliance">同盟</param>
 /// <returns>編集済みフラグ</returns>
 public bool IsItemDirty(ScenarioEditorItemId itemId, Alliance alliance)
 {
     return alliance.IsDirty((Alliance.ItemId) ItemDirtyFlags[(int) itemId]);
 }
        /// <summary>
        ///     同盟の編集項目を更新する
        /// </summary>
        /// <param name="alliance">同盟</param>
        private void UpdateAllianceItems(Alliance alliance)
        {
            // 編集項目の値を更新する
            _controller.UpdateItemValue(allianceNameTextBox, alliance);
            _controller.UpdateItemValue(allianceTypeTextBox, alliance);
            _controller.UpdateItemValue(allianceIdTextBox, alliance);

            // 編集項目の色を更新する
            _controller.UpdateItemColor(allianceNameTextBox, alliance);
            _controller.UpdateItemColor(allianceTypeTextBox, alliance);
            _controller.UpdateItemColor(allianceIdTextBox, alliance);

            // 同盟参加国リストを更新する
            UpdateAllianceParticipant(alliance);
        }
        /// <summary>
        ///     編集項目の値を設定する
        /// </summary>
        /// <param name="itemId">項目ID</param>
        /// <param name="val">編集項目の値</param>
        /// <param name="alliance">同盟</param>
        public void SetItemValue(ScenarioEditorItemId itemId, object val, Alliance alliance)
        {
            switch (itemId)
            {
                case ScenarioEditorItemId.AllianceName:
                    if (!string.IsNullOrEmpty(alliance.Name))
                    {
                        Config.SetText("ALLIANCE_" + alliance.Name, (string) val, Game.ScenarioTextFileName);
                    }
                    else
                    {
                        ScenarioGlobalData data = Scenarios.Data.GlobalData;
                        if (alliance == data.Axis)
                        {
                            Config.SetText(TextId.AllianceAxis, (string) val, Game.ScenarioTextFileName);
                        }
                        else if (alliance == data.Allies)
                        {
                            Config.SetText(TextId.AllianceAllies, (string) val, Game.ScenarioTextFileName);
                        }
                        else if (alliance == data.Comintern)
                        {
                            Config.SetText(TextId.AllianceComintern, (string) val, Game.ScenarioTextFileName);
                        }
                    }
                    break;

                case ScenarioEditorItemId.AllianceType:
                    alliance.Id.Type = (int) val;
                    break;

                case ScenarioEditorItemId.AllianceId:
                    alliance.Id.Id = (int) val;
                    break;
            }
        }
        /// <summary>
        ///     同盟参加国リストを更新する
        /// </summary>
        /// <param name="alliance">同盟</param>
        private void UpdateAllianceParticipant(Alliance alliance)
        {
            // 同盟参加国
            allianceParticipantListBox.BeginUpdate();
            allianceParticipantListBox.Items.Clear();
            foreach (Country country in alliance.Participant)
            {
                allianceParticipantListBox.Items.Add(Countries.GetTagName(country));
            }
            allianceParticipantListBox.EndUpdate();

            // 同盟非参加国
            _allianceFreeCountries = Countries.Tags.Where(country => !alliance.Participant.Contains(country)).ToList();
            allianceFreeCountryListBox.BeginUpdate();
            allianceFreeCountryListBox.Items.Clear();
            foreach (Country country in _allianceFreeCountries)
            {
                allianceFreeCountryListBox.Items.Add(Countries.GetTagName(country));
            }
            allianceFreeCountryListBox.EndUpdate();
        }
Beispiel #17
0
 /// <summary>
 ///     同盟情報を書き出す
 /// </summary>
 /// <param name="alliance">同盟情報</param>
 /// <param name="type">同盟の種類</param>
 /// <param name="writer">ファイル書き込み用</param>
 private static void WriteAlliance(Alliance alliance, string type, TextWriter writer)
 {
     writer.WriteLine("  {0} = {{", type);
     if (alliance.Id != null)
     {
         writer.Write("    id          = ");
         WriteTypeId(alliance.Id, writer);
         writer.WriteLine();
     }
     if (!string.IsNullOrEmpty(alliance.Name))
     {
         writer.WriteLine("    name        = \"{0}\"", alliance.Name);
     }
     if (alliance.Defensive)
     {
         writer.WriteLine("    defensive   = yes");
     }
     writer.Write("    participant = {");
     WriteCountryList(alliance.Participant, writer);
     writer.WriteLine(" }");
     writer.WriteLine("  }");
 }