/// <summary> /// ユニットモデルを移動する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="src">移動元の位置</param> /// <param name="dest">移動先の位置</param> private void MoveModel(UnitClass unit, int src, int dest) { // ユニットクラスのユニットモデルを移動する unit.MoveModel(src, dest); // ユニットモデルリストの表示を更新する UpdateModelList(); // 移動先の項目を選択する modelListView.Items[dest].Focused = true; modelListView.Items[dest].Selected = true; // 移動先の項目を表示する modelListView.EnsureVisible(dest); }
/// <summary> /// 改良リストビューの項目を更新する /// </summary> /// <param name="unit"></param> private void UpdateUpgradeList(UnitClass unit) { // 項目を順に登録する upgradeListView.BeginUpdate(); upgradeListView.Items.Clear(); foreach (UnitUpgrade upgrade in unit.Upgrades) { upgradeListView.Items.Add(CreateUpgradeListItem(upgrade)); } upgradeListView.EndUpdate(); // 改良情報が登録されていなければ編集項目を無効化する if (unit.Upgrades.Count == 0) { DisableUpgradeItems(); return; } // 編集項目を有効化する EnableUpgradeItems(); }
/// <summary> /// ユニットモデルを削除する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="index">削除する位置</param> private void RemoveModel(UnitClass unit, int index) { // ユニットクラスからユニットモデルを削除する unit.RemoveModel(index); // ユニットモデルリストの表示を更新する UpdateModelList(); // 削除した項目の次の項目を選択する if (index < modelListView.Items.Count - 1) { modelListView.Items[index].Focused = true; modelListView.Items[index].Selected = true; } else if (modelListView.Items.Count > 0) { modelListView.Items[index - 1].Focused = true; modelListView.Items[index - 1].Selected = true; } }
/// <summary> /// ユニットモデルを挿入する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="model">挿入対象のユニットモデル</param> /// <param name="index">挿入する位置</param> /// <param name="name">ユニットモデル名</param> private void InsertModel(UnitClass unit, UnitModel model, int index, string name) { // ユニットクラスにユニットモデルを挿入する unit.InsertModel(model, index, name); // ユニットモデルリストの表示を更新する UpdateModelList(); // 挿入した項目を選択する modelListView.Items[index].Focused = true; modelListView.Items[index].Selected = true; // 挿入した項目が表示されるようにする modelListView.EnsureVisible(index); }
/// <summary> /// ユニットモデル画像のファイル名を取得する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="index">ユニットモデルのインデックス</param> /// <param name="country">国タグ</param> /// <returns>ユニットモデル画像のファイル名</returns> private static string GetModelImageFileName(UnitClass unit, int index, Country country) { string name; string fileName; if (country != Country.None) { // 国タグ指定/モデル番号指定 name = string.Format( unit.Organization == UnitOrganization.Division ? "ill_div_{0}_{1}_{2}.bmp" : "ill_bri_{0}_{1}_{2}.bmp", Countries.Strings[(int) country], Units.UnitNumbers[(int) unit.Type], index); fileName = Game.GetReadFileName(Game.ModelPicturePathName, name); if (File.Exists(fileName)) { return fileName; } // 国タグ指定/モデル番号は0指定 name = string.Format( unit.Organization == UnitOrganization.Division ? "ill_div_{0}_{1}_0.bmp" : "ill_bri_{0}_{1}_0.bmp", Countries.Strings[(int) country], Units.UnitNumbers[(int) unit.Type]); fileName = Game.GetReadFileName(Game.ModelPicturePathName, name); if (File.Exists(fileName)) { return fileName; } } // モデル番号指定 name = string.Format( unit.Organization == UnitOrganization.Division ? "ill_div_{0}_{1}.bmp" : "ill_bri_{0}_{1}.bmp", Units.UnitNumbers[(int) unit.Type], index); fileName = Game.GetReadFileName(Game.ModelPicturePathName, name); if (File.Exists(fileName)) { return fileName; } // モデル番号は0指定 name = string.Format( unit.Organization == UnitOrganization.Division ? "ill_div_{0}_0.bmp" : "ill_bri_{0}_0.bmp", Units.UnitNumbers[(int) unit.Type]); fileName = Game.GetReadFileName(Game.ModelPicturePathName, name); return File.Exists(fileName) ? fileName : string.Empty; }
/// <summary> /// ユニットモデルリストビューの項目を作成する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="index">ユニットモデルのインデックス</param> /// <returns>ユニットモデルリストビューの項目</returns> private ListViewItem CreateModelListItem(UnitClass unit, int index) { UnitModel model = unit.Models[index]; ListViewItem item = new ListViewItem { Text = IntHelper.ToString(index) }; string name = unit.GetCountryModelName(index, GetSelectedCountry()); if (string.IsNullOrEmpty(name)) { name = unit.GetModelName(index); } item.SubItems.Add(name); item.SubItems.Add(DoubleHelper.ToString(model.Cost)); item.SubItems.Add(DoubleHelper.ToString(model.BuildTime)); item.SubItems.Add(DoubleHelper.ToString(model.ManPower)); item.SubItems.Add(DoubleHelper.ToString(model.SupplyConsumption)); item.SubItems.Add(DoubleHelper.ToString(model.FuelConsumption)); item.SubItems.Add(DoubleHelper.ToString(model.DefaultOrganization)); item.SubItems.Add(DoubleHelper.ToString(model.Morale)); item.SubItems.Add(DoubleHelper.ToString(model.MaxSpeed)); return item; }
/// <summary> /// ユニットモデルアイコンのファイル名を取得する /// </summary> /// <param name="unit">ユニットクラス</param> /// <param name="index">ユニットモデルのインデックス</param> /// <returns>ユニットモデルアイコンのファイル名</returns> private static string GetModelIconFileName(UnitClass unit, int index) { // 旅団にはアイコンが存在しないので空文字列を返す if (unit.Organization == UnitOrganization.Brigade) { return string.Empty; } string name = $"model_{Units.UnitNumbers[(int) unit.Type]}_{index}.bmp"; string fileName = Game.GetReadFileName(Game.ModelPicturePathName, name); return File.Exists(fileName) ? fileName : string.Empty; }
/// <summary> /// modelセクションを書き出す /// </summary> /// <param name="model">ユニットモデルデータ</param> /// <param name="unit">ユニットデータ</param> /// <param name="index">ユニットモデルのインデックス</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteModel(UnitModel model, UnitClass unit, int index, StreamWriter writer) { writer.WriteLine("# {0} - {1}", index, unit.GetModelName(index)); writer.WriteLine("model = {"); // 兵科固有部分 switch (unit.Branch) { case Branch.Army: if (unit.Organization == UnitOrganization.Division) { WriteLandDivision(model, writer); } else { WriteLandBrigade(model, writer); } break; case Branch.Navy: if (unit.Organization == UnitOrganization.Division) { WriteNavalDivision(model, writer); } else { WriteNavalBrigade(model, writer); } break; case Branch.Airforce: if (unit.Organization == UnitOrganization.Division) { WriteAirDivision(model, writer); } else { WriteAirBrigade(model, writer); } break; } if (Game.Type == GameType.DarkestHour) { // 自動改良 if (model.AutoUpgrade) { writer.WriteLine("\t{0}\t\t\t\t= {1}", Units.Strings[(int) model.UpgradeClass], model.UpgradeModel); } // upgrade_time_boost if (!model.UpgradeTimeBoost) { writer.WriteLine("\tupgrade_time_boost \t= {0}", model.UpgradeTimeBoost ? "yes" : "no"); } } // equipment (DH1.03以降) if ((Game.Type == GameType.DarkestHour) && (Game.Version >= 103) && (model.Equipments.Count > 0)) { writer.Write("\tequipment = {"); foreach (UnitEquipment equipment in model.Equipments) { writer.Write(" {0} = {1}", Units.EquipmentStrings[(int) equipment.Resource], equipment.Quantity); } writer.WriteLine(" }"); } writer.WriteLine("}"); }
/// <summary> /// 師団ユニットクラス定義を書き込む /// </summary> /// <param name="unit">ユニットクラスデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteDivisionType(UnitClass unit, StreamWriter writer) { writer.WriteLine(); if (unit.Type < UnitType.ReserveDivision33 || unit.Type > UnitType.ReserveDivision40) { writer.WriteLine("{0} = {{", Units.Strings[(int) unit.Type]); } else { writer.WriteLine("{0} = {{\t# Reserved for use by Darkest Hour Full", Units.Strings[(int) unit.Type]); } writer.WriteLine("\t#ID\t\t\t{0}", Units.UnitNumbers[(int) unit.Type]); if (unit.ExistsEntity() || (unit.Models.Count > 0)) { writer.WriteLine("\ttype\t\t= {0}", Units.RealStrings[(int) unit.RealType]); writer.WriteLine("\tname\t\t= {0}", unit.Name); writer.WriteLine("\tshort_name\t= {0}", unit.ShortName); writer.WriteLine("\tdesc\t\t= {0}", unit.Desc); writer.WriteLine("\tshort_desc\t= {0}", unit.ShortDesc); writer.WriteLine("\teyr\t\t\t= {0}", unit.Eyr); writer.WriteLine("\tsprite\t\t= {0}", Units.SpriteStrings[(int) unit.Sprite]); writer.WriteLine("\ttransmute\t= {0}", Units.Strings[(int) unit.Transmute]); writer.WriteLine("\tgfx_prio\t= {0}", unit.GfxPrio); if (unit.DefaultType) { string s = Units.RealStrings[(int) unit.RealType]; int len = s.Length; if (len < 4) { writer.WriteLine("\t{0}\t\t\t= yes", s); } else if (len < 8) { writer.WriteLine("\t{0}\t\t= yes", s); } else if (len < 12) { writer.WriteLine("\t{0}\t= yes", s); } else { writer.WriteLine("\t{0} = yes", s); } } writer.WriteLine("\tvalue\t\t= {0}", DoubleHelper.ToString(unit.Value)); if (unit.Productable) { writer.WriteLine("\tproduction\t= yes"); } } writer.WriteLine("\tlist_prio\t= {0}", unit.ListPrio); if (unit.UiPrio != 0) { writer.WriteLine("\tui_prio\t\t= {0}", unit.UiPrio); } writer.WriteLine("}"); }
/// <summary> /// 旅団ユニットクラス定義を書き込む /// </summary> /// <param name="unit">ユニットクラスデータ</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteBrigadeType(UnitClass unit, StreamWriter writer) { writer.WriteLine(); if (unit.Type == UnitType.None) { writer.WriteLine("{0} = {{\t#DO NOT CHANGE!!!", Units.Strings[(int) unit.Type]); } else if (unit.Type >= UnitType.ReserveBrigade36 && unit.Type <= UnitType.ReserveBrigade40) { writer.WriteLine("{0} = {{\t# Reserved for use by Darkest Hour Full", Units.Strings[(int) unit.Type]); } else { writer.WriteLine("{0} = {{", Units.Strings[(int) unit.Type]); } writer.WriteLine("\t#ID\t\t\t{0}", Units.UnitNumbers[(int) unit.Type]); if (unit.ExistsEntity() || (unit.Models.Count > 0)) { switch (unit.Branch) { case Branch.Army: writer.WriteLine("\ttype\t\t= land"); break; case Branch.Navy: writer.WriteLine("\ttype\t\t= naval"); break; case Branch.Airforce: writer.WriteLine("\ttype\t\t= air"); break; } writer.WriteLine("\tname\t\t= {0}", unit.Name); writer.WriteLine("\tshort_name\t= {0}", unit.ShortName); writer.WriteLine("\tdesc\t\t= {0}", unit.Desc); writer.WriteLine("\tshort_desc\t= {0}", unit.ShortDesc); writer.WriteLine("\tvalue\t\t= {0}", DoubleHelper.ToString(unit.Value)); if (unit.Cag) { writer.WriteLine("\tcag\t\t\t= yes"); } if (unit.Escort) { writer.WriteLine("\tescort\t\t= yes"); } if (unit.Engineer) { writer.WriteLine("\tengineer\t= yes"); } } if ((unit.Type != UnitType.None) || (unit.ListPrio != -1)) { writer.WriteLine("\tlist_prio\t= {0}", unit.ListPrio); } writer.WriteLine("}"); }
/// <summary> /// ユニットデータをファイルへ書き込む /// </summary> /// <param name="unit">ユニットデータ</param> /// <param name="fileName">ファイル名</param> public static void Write(UnitClass unit, string fileName) { using (StreamWriter writer = new StreamWriter(fileName, false, Encoding.GetEncoding(Game.CodePage))) { // unit_type if (Game.Type == GameType.ArsenalOfDemocracy) { switch (unit.Branch) { case Branch.Army: writer.WriteLine("land_unit_type = 1"); break; case Branch.Navy: writer.WriteLine("naval_unit_type = 1"); break; case Branch.Airforce: writer.WriteLine("air_unit_type = 1"); break; } } // max_speed_step if ((Game.Type == GameType.ArsenalOfDemocracy) && (unit.Organization == UnitOrganization.Division) && (unit.MaxSpeedStep < 2)) { writer.WriteLine("max_speed_step = {0}", unit.MaxSpeedStep); } // detachable if (Game.Type == GameType.DarkestHour && unit.Detachable) { writer.WriteLine("detachable = yes"); writer.WriteLine(); } // locked if ((Game.Type == GameType.ArsenalOfDemocracy) && (unit.Organization == UnitOrganization.Brigade) && !unit.Detachable) { writer.WriteLine("locked = 1"); } // allowed_brigades if (unit.AllowedBrigades.Count > 0) { foreach (UnitType brigade in unit.AllowedBrigades) { writer.WriteLine("allowed_brigades = {0}", Units.Strings[(int) brigade]); } // max_allowed_brigades if ((Game.Type == GameType.DarkestHour) && (unit.MaxAllowedBrigades >= 0)) { writer.WriteLine("max_allowed_brigades = {0}", unit.MaxAllowedBrigades); } writer.WriteLine(); } // upgrade if ((Game.Type == GameType.DarkestHour) && (unit.Upgrades.Count > 0)) { foreach (UnitUpgrade upgrade in unit.Upgrades) { writer.WriteLine( "upgrade = {{ type = {0} upgrade_time_factor = {1} upgrade_cost_factor = {2} }}", Units.Strings[(int) upgrade.Type], DoubleHelper.ToString(upgrade.UpgradeTimeFactor), DoubleHelper.ToString(upgrade.UpgradeCostFactor)); } writer.WriteLine(); } // model int index = 0; foreach (UnitModel model in unit.Models) { WriteModel(model, unit, index, writer); index++; } } }