/// <summary> /// 選択可能国の編集項目を更新する /// </summary> /// <param name="major">主要国設定</param> private void UpdateSelectableItems(MajorCountrySettings major) { _controller.UpdateItemValue(majorCountryNameKeyTextBox, major); _controller.UpdateItemValue(majorCountryNameStringTextBox, major); _controller.UpdateItemValue(majorFlagExtTextBox, major); _controller.UpdateItemValue(countryDescKeyTextBox, major); _controller.UpdateItemValue(countryDescStringTextBox, major); _controller.UpdateItemValue(propagandaTextBox, major); _controller.UpdateItemColor(majorCountryNameKeyTextBox, major); _controller.UpdateItemColor(majorCountryNameStringTextBox, major); _controller.UpdateItemColor(majorFlagExtTextBox, major); _controller.UpdateItemColor(countryDescKeyTextBox, major); _controller.UpdateItemColor(countryDescStringTextBox, major); _controller.UpdateItemColor(propagandaTextBox, major); UpdatePropagandaImage(major.Country, major.PictureName); }
/// <summary> /// 主要国追加ボタン押下時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnMajorAddButtonClick(object sender, EventArgs e) { Scenario scenario = Scenarios.Data; ScenarioHeader header = scenario.Header; List<Country> countries = (from int index in selectableListBox.SelectedIndices select _majorFreeCountries[index]).ToList(); majorListBox.BeginUpdate(); selectableListBox.BeginUpdate(); foreach (Country country in countries) { // 主要国リストボックスに追加する majorListBox.Items.Add(Countries.GetTagName(country)); // 主要国リストに追加する MajorCountrySettings major = new MajorCountrySettings { Country = country }; header.MajorCountries.Add(major); // 選択可能国リストボックスから削除する int index = _majorFreeCountries.IndexOf(country); selectableListBox.Items.RemoveAt(index); _majorFreeCountries.RemoveAt(index); // 編集済みフラグを設定する scenario.SetDirtySelectableCountry(country); Scenarios.SetDirty(); Log.Info("[Scenario] major country: +{0}", Countries.Strings[(int) country]); } majorListBox.EndUpdate(); selectableListBox.EndUpdate(); // 主要国リストボックスに追加した項目を選択する majorListBox.SelectedIndex = majorListBox.Items.Count - 1; }
/// <summary> /// 編集項目の値を更新する /// </summary> /// <param name="control">コントロール</param> /// <param name="major">主要国設定</param> public void UpdateItemValue(TextBox control, MajorCountrySettings major) { ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag; control.Text = ObjectHelper.ToString(GetItemValue(itemId, major)); switch (itemId) { case ScenarioEditorItemId.MajorCountryNameString: // 主要国設定の国名定義がなければ編集不可 control.ReadOnly = string.IsNullOrEmpty(major.Name); break; case ScenarioEditorItemId.MajorCountryDescString: // 主要国設定の説明文定義がなければ編集不可 control.ReadOnly = string.IsNullOrEmpty(major.Desc); break; } }
/// <summary> /// 主要国情報を構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>主要国情報</returns> private static MajorCountrySettings ParseMajorCountry(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; } MajorCountrySettings major = new MajorCountrySettings(); 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(); // desc if (keyword.Equals("desc")) { string s = ParseStringOrIdentifier(lexer); if (string.IsNullOrEmpty(s)) { Log.InvalidClause(LogCategory, "desc", lexer); continue; } // 説明文 major.Desc = s; continue; } // countrytactics if (keyword.Equals("countrytactics")) { string s = ParseStringOrIdentifier(lexer); if (string.IsNullOrEmpty(s)) { Log.InvalidClause(LogCategory, "countrytactics", lexer); continue; } // 国家戦略 major.CountryTactics = s; continue; } // picture if (keyword.Equals("picture")) { string s = ParseString(lexer); if (s == null) { Log.InvalidClause(LogCategory, "picture", lexer); continue; } // プロパガンダ画像名 major.PictureName = s; continue; } // songs if (keyword.Equals("songs")) { string s = ParseString(lexer); if (s == null) { Log.InvalidClause(LogCategory, "songs", lexer); continue; } // 音楽ファイル名 major.Songs = s; continue; } // bottom if (keyword.Equals("bottom")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "bottom", lexer); continue; } // 右端に配置 major.Bottom = (bool) b; continue; } if ((Game.Type == GameType.DarkestHour) && (Game.Version >= 104)) { // name if (keyword.Equals("name")) { string s = ParseStringOrIdentifier(lexer); if (string.IsNullOrEmpty(s)) { Log.InvalidClause(LogCategory, "name", lexer); continue; } // 国名 major.Name = s; continue; } // flag_ext if (keyword.Equals("flag_ext")) { string s = ParseStringOrIdentifier(lexer); if (string.IsNullOrEmpty(s)) { Log.InvalidClause(LogCategory, "flag_ext", lexer); continue; } // 国旗接尾辞 major.FlagExt = s; continue; } } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } return major; }
/// <summary> /// 編集項目の値を設定する /// </summary> /// <param name="itemId">項目ID</param> /// <param name="major">主要国設定</param> /// <param name="val">編集項目の値</param> public void SetItemValue(ScenarioEditorItemId itemId, object val, MajorCountrySettings major) { switch (itemId) { case ScenarioEditorItemId.MajorCountryNameKey: major.Name = (string) val; break; case ScenarioEditorItemId.MajorCountryNameString: // 主要国設定の国名 if (!string.IsNullOrEmpty(major.Name)) { Config.SetText(major.Name, (string) val, Game.WorldTextFileName); break; } // 国家設定の国名 CountrySettings settings = Scenarios.GetCountrySettings(major.Country); if (!string.IsNullOrEmpty(settings?.Name)) { Config.SetText(settings.Name, (string) val, Game.WorldTextFileName); break; } // 標準の国名 Config.SetText(Countries.Strings[(int) major.Country], (string) val, Game.WorldTextFileName); break; case ScenarioEditorItemId.MajorFlagExt: major.FlagExt = (string) val; break; case ScenarioEditorItemId.MajorCountryDescKey: major.Desc = (string) val; break; case ScenarioEditorItemId.MajorCountryDescString: // 主要国設定の説明文 if (!string.IsNullOrEmpty(major.Desc)) { Config.SetText(major.Desc, (string) val, Game.ScenarioTextFileName); break; } int year = Scenarios.Data.GlobalData.StartDate != null ? Scenarios.Data.GlobalData.StartDate.Year : Scenarios.Data.Header.StartDate != null ? Scenarios.Data.Header.StartDate.Year : Scenarios.Data.Header.StartYear; // 年数の下2桁のみ使用する year = year % 100; // 年数別の説明文 string key = $"{major.Country}_{year}_DESC"; if (Config.ExistsKey(key)) { Config.SetText(key, (string) val, Game.ScenarioTextFileName); break; } // 標準の説明文 key = $"{major.Country}_DESC"; Config.SetText(key, (string) val, Game.ScenarioTextFileName); break; case ScenarioEditorItemId.MajorPropaganada: major.PictureName = (string) val; break; } }
/// <summary> /// 編集項目の色を更新する /// </summary> /// <param name="control">コントロール</param> /// <param name="major">主要国設定</param> public void UpdateItemColor(Control control, MajorCountrySettings major) { ScenarioEditorItemId itemId = (ScenarioEditorItemId) control.Tag; control.ForeColor = IsItemDirty(itemId, major) ? Color.Red : SystemColors.WindowText; }
/// <summary> /// 項目値変更前の処理 /// </summary> /// <param name="itemId">項目ID</param> /// <param name="val">編集項目の値</param> /// <param name="major">主要国設定</param> public void PreItemChanged(ScenarioEditorItemId itemId, object val, MajorCountrySettings major) { // 何もしない }
/// <summary> /// 編集項目の編集済みフラグを設定する /// </summary> /// <param name="itemId">項目ID</param> /// <param name="major">主要国設定</param> public void SetItemDirty(ScenarioEditorItemId itemId, MajorCountrySettings major) { major.SetDirty((MajorCountrySettings.ItemId) ItemDirtyFlags[(int) itemId]); Scenarios.Data.SetDirty(); Scenarios.SetDirty(); }
/// <summary> /// 編集項目の値変更時のログを出力する /// </summary> /// <param name="itemId">項目ID</param> /// <param name="val">編集項目の値</param> /// <param name="major">主要国設定</param> public void OutputItemValueChangedLog(ScenarioEditorItemId itemId, object val, MajorCountrySettings major) { Log.Info("[Scenario] {0}: {1} -> {2} ({3})", ItemStrings[(int) itemId], ObjectHelper.ToString(GetItemValue(itemId, major)), ObjectHelper.ToString(val), Countries.Strings[(int) major.Country]); }
/// <summary> /// 項目値変更後の処理 /// </summary> /// <param name="itemId">項目ID</param> /// <param name="val">編集項目の値</param> /// <param name="major">主要国設定</param> public void PostItemChanged(ScenarioEditorItemId itemId, object val, MajorCountrySettings major) { TextBox control; switch (itemId) { case ScenarioEditorItemId.MajorCountryNameKey: control = (TextBox) _form.GetItemControl(ScenarioEditorItemId.MajorCountryNameString); UpdateItemValue(control, major); UpdateItemColor(control, major); break; case ScenarioEditorItemId.MajorCountryDescKey: control = (TextBox) _form.GetItemControl(ScenarioEditorItemId.MajorCountryDescString); UpdateItemValue(control, major); UpdateItemColor(control, major); break; case ScenarioEditorItemId.MajorPropaganada: _form.UpdatePropagandaImage(major.Country, (string) val); break; } }
/// <summary> /// 編集項目の編集済みフラグを取得する /// </summary> /// <param name="itemId">項目ID</param> /// <param name="major">主要国設定</param> /// <returns>編集済みフラグ</returns> public bool IsItemDirty(ScenarioEditorItemId itemId, MajorCountrySettings major) { return major.IsDirty((MajorCountrySettings.ItemId) ItemDirtyFlags[(int) itemId]); }
/// <summary> /// 編集項目の値を取得する /// </summary> /// <param name="itemId">項目ID</param> /// <param name="major">主要国設定</param> /// <returns>編集項目の値</returns> public object GetItemValue(ScenarioEditorItemId itemId, MajorCountrySettings major) { switch (itemId) { case ScenarioEditorItemId.MajorCountryNameKey: return major.Name; case ScenarioEditorItemId.MajorCountryNameString: return Scenarios.GetCountryName(major.Country); case ScenarioEditorItemId.MajorFlagExt: return major.FlagExt; case ScenarioEditorItemId.MajorCountryDescKey: return major.Desc; case ScenarioEditorItemId.MajorCountryDescString: if (!string.IsNullOrEmpty(major.Desc)) { return Config.GetText(major.Desc); } int year = Scenarios.Data.GlobalData.StartDate != null ? Scenarios.Data.GlobalData.StartDate.Year : Scenarios.Data.Header.StartDate != null ? Scenarios.Data.Header.StartDate.Year : Scenarios.Data.Header.StartYear; // 年数の下2桁のみ使用する year = year % 100; // 年数別の説明があれば使用する string key = $"{major.Country}_{year}_DESC"; if (Config.ExistsKey(key)) { return Config.GetText(key); } key = $"{major.Country}_DESC"; return Config.GetText(key); case ScenarioEditorItemId.MajorPropaganada: return major.PictureName; } return null; }
/// <summary> /// 主要国設定を書き出す /// </summary> /// <param name="major">主要国設定</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteMajorCountry(MajorCountrySettings major, TextWriter writer) { writer.Write(" {0} = {{", Countries.Strings[(int) major.Country]); if (!string.IsNullOrEmpty(major.Desc)) { writer.Write(" desc = \"{0}\"", major.Desc); } if (!string.IsNullOrEmpty(major.CountryTactics)) { writer.Write($" countrytactics = \"{major.CountryTactics}\""); } if (major.Bottom) { writer.Write(" bottom = yes"); } if (!string.IsNullOrEmpty(major.PictureName)) { writer.Write(" picture = \"{0}\"", major.PictureName); } if (!string.IsNullOrEmpty(major.FlagExt)) { writer.Write(" flag_ext = {0}", major.FlagExt); } if (!string.IsNullOrEmpty(major.Name)) { writer.Write(" name = {0}", major.Name); } if (!string.IsNullOrEmpty(major.Songs)) { writer.Write($" songs = \"{major.Songs}\""); } writer.WriteLine(" }"); }
/// <summary> /// 主要国設定を削除する /// </summary> /// <param name="major">主要国設定</param> public static void RemoveMajorCountrySettings(MajorCountrySettings major) { if (MajorTable.ContainsKey(major.Country)) { MajorTable.Remove(major.Country); } }
/// <summary> /// 主要国設定を設定する /// </summary> /// <param name="major">主要国設定</param> public static void SetMajorCountrySettings(MajorCountrySettings major) { MajorTable[major.Country] = major; }