/// <summary> /// applicationセクションを書き出す /// </summary> /// <param name="item">技術項目</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteApplication(TechItem item, StreamWriter writer) { writer.WriteLine(" # {0}", Config.ExistsKey(item.Name) ? Config.GetText(item.Name) : ""); writer.WriteLine(" application ="); writer.WriteLine(" {{ id = {0}", item.Id); writer.WriteLine(" name = {0}", item.Name); if (!string.IsNullOrEmpty(item.Desc)) { writer.WriteLine(" desc = {0}", item.Desc); } foreach (TechPosition position in item.Positions) { writer.WriteLine(" position = {{ x = {0} y = {1} }}", position.X, position.Y); } if (Game.Type == GameType.DarkestHour && !string.IsNullOrEmpty(item.PictureName)) { writer.WriteLine(" picture = \"{0}\"", item.PictureName); } writer.WriteLine(" year = {0}", item.Year); foreach (TechComponent component in item.Components) { WriteComponent(component, writer); } WriteRequired(item.AndRequiredTechs, writer); if (item.OrRequiredTechs.Count > 0) { WriteOrRequired(item.OrRequiredTechs, writer); } WriteEffects(item.Effects, writer); writer.WriteLine(" }"); }
/// <summary> /// 研究速度リストを更新する /// </summary> /// <param name="tech">対象技術</param> /// <param name="teams">研究機関</param> public static void UpdateResearchList(TechItem tech, IEnumerable<Team> teams) { Items.Clear(); // 研究速度を順に登録する foreach (Team team in teams) { Research research = new Research(tech, team); Items.Add(research); } // 研究日数の順にソートする Items.Sort((research1, research2) => research1.Days - research2.Days); }
/// <summary> /// 技術座標リストを更新する /// </summary> /// <param name="item">技術</param> private void UpdateTechPositionList(TechItem item) { techPositionListView.BeginUpdate(); techPositionListView.Items.Clear(); foreach (TechPosition position in item.Positions) { ListViewItem li = new ListViewItem(IntHelper.ToString(position.X)); li.SubItems.Add(IntHelper.ToString(position.Y)); techPositionListView.Items.Add(li); } if (techPositionListView.Items.Count > 0) { // 先頭の項目を選択する techPositionListView.Items[0].Focused = true; techPositionListView.Items[0].Selected = true; // 編集項目を有効化する EnableTechPositionItems(); } else { // 編集項目を無効化する DisableTechPositionItems(); } techPositionListView.EndUpdate(); }
/// <summary> /// 技術画像を更新する /// </summary> /// <param name="item">技術アプリケーション</param> private void UpdateTechPicture(TechItem item) { // 画像ファイル名テキストボックスの値を更新する if (Game.Type == GameType.DarkestHour) { techPictureNameTextBox.Text = item.PictureName ?? ""; } // 編集項目の色を更新する techPictureNameTextBox.ForeColor = item.IsDirty(TechItemId.PictureName) ? Color.Red : SystemColors.WindowText; Image prev = techPictureBox.Image; string name = !string.IsNullOrEmpty(item.PictureName) && (item.PictureName.IndexOfAny(Path.GetInvalidPathChars()) < 0) ? item.PictureName : IntHelper.ToString(item.Id); string fileName = Game.GetReadFileName(Game.TechPicturePathName, $"{name}.bmp"); if (File.Exists(fileName)) { // 技術画像を更新する Bitmap bitmap = new Bitmap(fileName); bitmap.MakeTransparent(); techPictureBox.Image = bitmap; } else { techPictureBox.Image = null; } prev?.Dispose(); }
/// <summary> /// 技術タブの項目を更新する /// </summary> /// <param name="item">技術アプリケーション</param> private void UpdateTechItems(TechItem item) { // 編集項目の値を更新する techNameTextBox.Text = item.ToString(); techShortNameTextBox.Text = item.GetShortName(); techIdNumericUpDown.Value = item.Id; techYearNumericUpDown.Value = item.Year; UpdateTechPositionList(item); UpdateTechPicture(item); // 編集項目の色を更新する techNameTextBox.ForeColor = item.IsDirty(TechItemId.Name) ? Color.Red : SystemColors.WindowText; techShortNameTextBox.ForeColor = item.IsDirty(TechItemId.ShortName) ? Color.Red : SystemColors.WindowText; techIdNumericUpDown.ForeColor = item.IsDirty(TechItemId.Id) ? Color.Red : SystemColors.WindowText; techYearNumericUpDown.ForeColor = item.IsDirty(TechItemId.Year) ? Color.Red : SystemColors.WindowText; techPictureNameTextBox.ForeColor = item.IsDirty(TechItemId.PictureName) ? Color.Red : SystemColors.WindowText; }
/// <summary> /// 必要技術タブの項目を更新する /// </summary> /// <param name="item">技術アプリケーション</param> private void UpdateRequiredItems(TechItem item) { UpdateAndRequiredList(item); UpdateOrRequiredList(item); }
/// <summary> /// OR条件必要技術リストを更新する /// </summary> /// <param name="item">技術アプリケーション</param> private void UpdateOrRequiredList(TechItem item) { orRequiredListView.BeginUpdate(); orRequiredListView.Items.Clear(); foreach (int id in item.OrRequiredTechs.Select(tech => tech.Id)) { ListViewItem li = new ListViewItem { Text = IntHelper.ToString(id) }; if (Techs.TechIdMap.ContainsKey(id)) { li.SubItems.Add(Techs.TechIdMap[id].ToString()); } orRequiredListView.Items.Add(li); } if (orRequiredListView.Items.Count > 0) { // 先頭の項目を選択する orRequiredListView.Items[0].Focused = true; orRequiredListView.Items[0].Selected = true; // 編集項目を有効化する EnableOrRequiredItems(); } else { // 編集項目を無効化する DisableOrRequiredItems(); } orRequiredListView.EndUpdate(); }
/// <summary> /// 技術効果タブの項目を更新する /// </summary> /// <param name="item">技術</param> private void UpdateEffectItems(TechItem item) { effectListView.BeginUpdate(); effectListView.Items.Clear(); // 項目を順に追加する foreach (Command command in item.Effects) { ListViewItem listItem = CreateEffectListItem(command); effectListView.Items.Add(listItem); } if (effectListView.Items.Count > 0) { // 先頭の項目を選択する effectListView.Items[0].Focused = true; effectListView.Items[0].Selected = true; // 編集項目を有効化する EnableEffectItems(); } else { // 編集項目を無効化する DisableEffectItems(); } effectListView.EndUpdate(); }
/// <summary> /// 小研究タブの項目を更新する /// </summary> /// <param name="item">技術</param> private void UpdateComponentItems(TechItem item) { componentListView.BeginUpdate(); componentListView.Items.Clear(); foreach (TechComponent component in item.Components) { ListViewItem listItem = CreateComponentListItem(component); componentListView.Items.Add(listItem); } if (componentListView.Items.Count > 0) { // 先頭の項目を選択する componentListView.Items[0].Focused = true; componentListView.Items[0].Selected = true; // 編集項目を有効化する EnableComponentItems(); } else { // 編集項目を無効化する DisableComponentItems(); } componentListView.EndUpdate(); }
/// <summary> /// 技術項目リストの新規技術ボタン押下時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnNewTechButtonClick(object sender, EventArgs e) { TechGroup grp = GetSelectedGroup(); // 項目を作成する TechItem item = new TechItem { Name = Config.GetTempKey(), ShortName = Config.GetTempKey(), Desc = Config.GetTempKey(), Year = 1936 }; Config.SetText(item.Name, "", Game.TechTextFileName); Config.SetText(item.ShortName, "", Game.TechTextFileName); Config.SetText(item.Desc, "", Game.TechTextFileName); // 重複文字列リストに登録する Techs.AddDuplicatedListItem(item); // 編集済みフラグを設定する grp.SetDirty(); item.SetDirtyAll(); ITechItem selected = techListBox.SelectedItem as ITechItem; if (selected != null) { // 選択項目の先頭座標を引き継ぐ item.Positions.Add(new TechPosition { X = selected.Positions[0].X, Y = selected.Positions[0].Y }); if (selected is TechItem) { // 選択項目が技術アプリケーションならばIDを10増やす TechItem selectedApplication = selected as TechItem; item.Id = Techs.GetNewId(selectedApplication.Id + 10); } else { // 未使用の技術IDを1010以降で検索する item.Id = Techs.GetNewId(1010); } // 空の小研究を追加する item.CreateNewComponents(); // 技術項目リストに項目を挿入する grp.InsertItem(item, selected); // 項目リストビューに項目を挿入する InsertTechListItem(item, techListBox.SelectedIndex + 1); } else { // 仮の座標を登録する item.Positions.Add(new TechPosition()); // 未使用の技術IDを1010以降で検索する item.Id = Techs.GetNewId(1010); // 空の小研究を追加する item.CreateNewComponents(); // 技術項目リストに項目を追加する grp.AddItem(item); // 項目リストビューに項目を追加する AddTechListItem(item); } // 技術ツリーにラベルを追加する _techTreePanelController.AddItem(item); // 技術項目とIDの対応付けを更新する Techs.UpdateTechIdMap(); // 必要技術コンボボックスの項目を更新する UpdateRequiredTechListItems(); // 技術イベントの技術IDコンボボックスの項目を更新する UpdateEventTechListItems(); // 技術項目リストの更新を通知する HoI2EditorController.OnItemChanged(EditorItemId.TechItemList, this); Log.Info("[Tech] Added new tech: {0}", item.Id); }
/// <summary> /// 技術ツリーに技術項目を追加する /// </summary> /// <param name="item">追加対象の項目</param> /// <param name="position">追加対象の位置</param> private void AddTechItem(TechItem item, TechPosition position) { Label label = new Label { Location = new Point(DeviceCaps.GetScaledWidth(position.X), DeviceCaps.GetScaledHeight(position.Y)), BackColor = Color.Transparent, Tag = new TechLabelInfo { Item = item, Position = position }, Size = new Size(_techLabelBitmap.Width, _techLabelBitmap.Height), Region = _techLabelRegion }; // ラベル画像を設定する if (ApplyItemStatus && (QueryItemStatus != null)) { QueryItemStatusEventArgs e = new QueryItemStatusEventArgs(item); QueryItemStatus(this, e); label.Image = e.Done ? (e.Blueprint ? _blueprintDoneTechLabelBitmap : _doneTechLabelBitmap) : (e.Blueprint ? _blueprintTechLabelBitmap : _techLabelBitmap); } else { label.Image = _techLabelBitmap; } label.Click += OnItemLabelClick; label.MouseClick += OnItemLabelMouseClick; label.MouseDown += OnItemLabelMouseDown; label.MouseUp += OnItemLabelMouseUp; label.MouseMove += OnItemLabelMouseMove; label.GiveFeedback += OnItemLabelGiveFeedback; label.Paint += OnTechItemPaint; _pictureBox.Controls.Add(label); }
/// <summary> /// 技術アプリケーションを複製する /// </summary> /// <returns>複製した技術アプリケーション</returns> public ITechItem Clone() { TechItem item = new TechItem { Id = Techs.GetNewId(Id + 10), Name = Config.GetTempKey(), ShortName = Config.GetTempKey(), Desc = Config.GetTempKey(), PictureName = PictureName, Year = Year }; // 文字列設定 Config.SetText(item.Name, Config.GetText(Name), Game.TechTextFileName); Config.SetText(item.ShortName, Config.GetText(ShortName), Game.TechTextFileName); Config.SetText(item.Desc, Config.GetText(Desc), Game.TechTextFileName); // 座標リスト foreach (TechPosition position in Positions) { item.Positions.Add(position.Clone()); } // 小研究リスト foreach (TechComponent component in Components) { item.Components.Add(component.Clone()); } foreach (TechComponent component in item.Components) { component.Id = item.GetNewComponentId(item.Id + 1); } // 必要技術リスト foreach (RequiredTech required in AndRequiredTechs) { item.AndRequiredTechs.Add(required.Clone()); } foreach (RequiredTech required in OrRequiredTechs) { item.OrRequiredTechs.Add(required.Clone()); } // 技術効果リスト foreach (Command command in Effects) { item.Effects.Add(new Command(command)); } return item; }
/// <summary> /// 保有技術の有無を切り替える /// </summary> /// <param name="item">対象技術</param> /// <param name="country">対象国</param> private void ToggleOwnedTech(TechItem item, Country country) { CountrySettings settings = Scenarios.GetCountrySettings(country); bool val = (settings == null) || !settings.TechApps.Contains(item.Id); Log.Info("[Scenario] owned techs: {0}{1} ({2})", val ? '+' : '-', item.Id, Countries.Strings[(int) country]); if (settings == null) { settings = Scenarios.CreateCountrySettings(country); } // 値を更新する if (val) { settings.TechApps.Add(item.Id); } else { settings.TechApps.Remove(item.Id); } // 編集済みフラグを設定する settings.SetDirtyOwnedTech(item.Id); Scenarios.SetDirty(); // 技術ツリーの項目ラベルを更新する _techTreePanelController.UpdateItem(item); // 保有技術リストビューの表示を更新する int index = _techs.IndexOf(item); if (index >= 0) { ListViewItem li = ownedTechsListView.Items[index]; li.Checked = val; li.ForeColor = Color.Red; li.EnsureVisible(); } }
/// <summary> /// 技術IDを変更する /// </summary> /// <param name="item">技術項目</param> /// <param name="id">技術ID</param> public static void ModifyTechId(TechItem item, int id) { // 値の変更前に技術項目とIDの対応付けを削除する TechIds.Remove(id); TechIdMap.Remove(id); // 値を更新する item.Id = id; // 技術項目とIDの対応付けを更新する UpdateTechIdMap(); }