Пример #1
0
 /// <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("  }");
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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();
        }
Пример #4
0
        /// <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();
        }
Пример #5
0
        /// <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;
        }
Пример #6
0
 /// <summary>
 ///     必要技術タブの項目を更新する
 /// </summary>
 /// <param name="item">技術アプリケーション</param>
 private void UpdateRequiredItems(TechItem item)
 {
     UpdateAndRequiredList(item);
     UpdateOrRequiredList(item);
 }
Пример #7
0
        /// <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();
        }
Пример #8
0
        /// <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();
        }
Пример #9
0
        /// <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();
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
        /// <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;
        }
Пример #13
0
        /// <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();
            }
        }
Пример #14
0
        /// <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();
        }