/// <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(); }
/// <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(" }"); }