diff --git a/ElectronicObserver/Properties/Window/FleetResources.en.resx b/ElectronicObserver/Properties/Window/FleetResources.en.resx index 899063ff9..a7ac5d6ed 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.en.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.en.resx @@ -156,19 +156,6 @@ Long-range Torpedo Attack - - Lv sum: {0} / avg: {1:0.00} -{2} fleet -Support Expedition: {3} -Total FP {4} ({20}) / Torp {5} / AA {6} ({21}) / ASW {7} ({22}) / LOS {8} ({23}){26} -Drum: {9} ({10} ships) -Daihatsu: {11} ({12} ships, +{13:p1}) -TP: S {14} / A {15}{27} -Surface Radar: {24} ({25} ships) -Consumption: {16} fuel / {17} ammo -({18} fuel / {19} ammo per battle) - - w/o Proficiency @@ -285,4 +272,37 @@ Range: {20} / Speed: {21} Searching phase + + Lv sum: {0} / avg: {1:0.00} + + + {0} fleet + + + Support Expedition: {0} + + + Total FP {0} ({1}) / Torp {2} / AA {3} ({4}) / ASW {5} ({6}) / LOS {7} ({8}) + + + Drum: {0} ({1} ships) + + + Daihatsu: {0} ({1} ships, +{2:p1}) + + + TP: S {0} / A {1} + + + Surface Radar: {0} ({1} ships) + + + Consumption: {0} fuel / {1} ammo + + + ({0} fuel / {1} ammo per battle) + + + Jet: {0} steel per battle + \ No newline at end of file diff --git a/ElectronicObserver/Properties/Window/FleetResources.es-ES.resx b/ElectronicObserver/Properties/Window/FleetResources.es-ES.resx index ceeec91a6..26db09baf 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.es-ES.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.es-ES.resx @@ -156,18 +156,6 @@ Ataque de torpedos de largo alcance - - Suma de niveles: {0} / Promedio: {1:0.00} -{2} flota -Apoyo de expedición: {3} -FP total {4} ({20}) / Torp {5} / AA {6} ({21}) / ASW {7} ({22}) / LOS {8} ({23}){26} -Bidones: {9} ({10} barcos) -Daihatsu: {11} ({12} barcos, +{13:p1}) -TP: S {14} / A {15}{27} -Radar de superficie: {24} ({25} barcos) -Consumo: {16} de combustible / {17} de munición -({18} combustible / {19} munición por batalla) - Sin competencia @@ -280,4 +268,34 @@ Alcance: {20} / Velocidad: {21} Pantalla de humo + + Suma de niveles: {0} / Promedio: {1:0.00} + + + {0} flota + + + Apoyo de expedición: {0} + + + FP total {0} ({1}) / Torp {2} / AA {3} ({4}) / ASW {5} ({6}) / LOS {7} ({8}) + + + Bidones: {0} ({1} barcos) + + + Daihatsu: {0} ({1} barcos, +{2:p1}) + + + TP: S {0} / A {1} + + + Radar de superficie: {0} ({1} barcos) + + + Consumo: {0} de combustible / {1} de munición + + + ({0} combustible / {1} munición por batalla) + \ No newline at end of file diff --git a/ElectronicObserver/Properties/Window/FleetResources.ko-KR.resx b/ElectronicObserver/Properties/Window/FleetResources.ko-KR.resx index 2304e2a53..7608374c4 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.ko-KR.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.ko-KR.resx @@ -156,18 +156,6 @@ 지원 장거리 뇌격 - - Lv 합계: {0} / 평균: {1:0.00} -{2}함대 -지원 공격: {3} -합계 화력 {4} ({20}) / 뇌장 {5} / 대공 {6} ({21}) / 대잠 {7} ({22}) / 색적 {8} ({23}){26} -드럼통 탑재: {9}개 ({10}함) -대발동정 탑재: {11}개 ({12}함, +{13:p1}) -유송량(TP): S {14} / A {15}{27} -수상 전탐: {24}개 ({25}함) -총 적재: 연료 {16} / 탄약 {17} -(전투당 연료 {18} / 탄약 {19}) - 숙련도 없음 @@ -281,4 +269,34 @@ 연막 + + Lv 합계: {0} / 평균: {1:0.00} + + + {0}함대 + + + 지원 공격: {0} + + + 합계 화력 {0} ({1}) / 뇌장 {2} / 대공 {3} ({4}) / 대잠 {5} ({6}) / 색적 {7} ({8}) + + + 드럼통 탑재: {0}개 ({1}함) + + + 대발동정 탑재: {0}개 ({1}함, +{2:p1}) + + + 유송량(TP): S {0} / A {1} + + + 수상 전탐: {0}개 ({1}함) + + + 총 적재: 연료 {0} / 탄약 {1} + + + (전투당 연료 {0} / 탄약 {1}) + \ No newline at end of file diff --git a/ElectronicObserver/Properties/Window/FleetResources.resx b/ElectronicObserver/Properties/Window/FleetResources.resx index 5f2fa209d..d14204c14 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.resx @@ -157,18 +157,6 @@ 支援長距離雷撃 - - Lv合計: {0} / 平均: {1:0.00} -{2}艦隊 -支援攻撃: {3} -合計火力 {4} ({20}) / 雷装 {5} / 対空 {6} ({21}) / 対潜 {7} ({22}) / 索敵 {8} ({23}){26} -ドラム缶搭載: {9}個 ({10}艦) -大発動艇搭載: {11}個 ({12}艦, +{13:p1}) -輸送量(TP): S {14} / A {15}{27} -水上電探: {24}個 ({25}艦) -総積載: 燃 {16} / 弾 {17} -(1戦当たり 燃 {18} / 弾 {19}) - 熟練度なし @@ -285,4 +273,37 @@ 索敵フェイズ + + Lv合計: {0} / 平均: {1:0.00} + + + {0}艦隊 + + + 支援攻撃: {0} + + + 合計火力 {0} ({1}) / 雷装 {2} / 対空 {3} ({4}) / 対潜 {5} ({6}) / 索敵 {7} ({8}) + + + ドラム缶搭載: {0}個 ({1}艦) + + + 大発動艇搭載: {0}個 ({1}艦, +{2:p1}) + + + 輸送量(TP): S {0} / A {1} + + + 水上電探: {0}個 ({1}艦) + + + 総積載: 燃 {0} / 弾 {1} + + + (1戦当たり 燃 {0} / 弾 {1}) + + + ジェット1戦当たり: 鋼材 {0} + \ No newline at end of file diff --git a/ElectronicObserver/Properties/Window/FleetResources.zh-CN.resx b/ElectronicObserver/Properties/Window/FleetResources.zh-CN.resx index 5130649ca..5f063ca9a 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.zh-CN.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.zh-CN.resx @@ -150,18 +150,6 @@ 长距离雷击支援 - - Lv合计: {0} / 平均: {1:0.00} -{2}舰队 -支援攻击: {3} -总火力 {4} ({20}) / 雷装 {5} / 对空 {6} ({21}) / 对潜 {7} ({22}) / 索敌 {8} ({23}){26} -运输桶搭载: {9}个 ({10}舰) -大发动艇搭载: {11}个 ({12}舰, +{13:p1}) -运输量(TP): S {14} / A {15}{27} -水上电探: {24}个 ({25}舰) -总搭载: 燃 {16} / 弹 {17} -(1次战斗消耗 燃 {18} / 弹 {19}) - 无熟练度 @@ -266,4 +254,34 @@ 索敌阶段 + + Lv合计: {0} / 平均: {1:0.00} + + + {0}舰队 + + + 支援攻击: {0} + + + 总火力 {0} ({1}) / 雷装 {2} / 对空 {3} ({4}) / 对潜 {5} ({6}) / 索敌 {7} ({8}) + + + 运输桶搭载: {0}个 ({1}舰) + + + 大发动艇搭载: {0}个 ({1}舰, +{2:p1}) + + + 运输量(TP): S {0} / A {1} + + + 水上电探: {0}个 ({1}舰) + + + 总搭载: 燃 {0} / 弹 {1} + + + (1次战斗消耗 燃 {0} / 弹 {1}) + \ No newline at end of file diff --git a/ElectronicObserver/Properties/Window/FleetResources.zh-TW.resx b/ElectronicObserver/Properties/Window/FleetResources.zh-TW.resx index 38db37ca4..270ae227b 100644 --- a/ElectronicObserver/Properties/Window/FleetResources.zh-TW.resx +++ b/ElectronicObserver/Properties/Window/FleetResources.zh-TW.resx @@ -156,18 +156,6 @@ 長距離支援雷擊 - - 總等級: {0} / 平均: {1:0.00} -{2}艦隊 -支援攻擊: {3} -總計火力 {4} ({20}) / 雷裝 {5} / 對空 {6} ({21}) / 反潛 {7} ({22}) / 索敵 {8} ({23}){26} -搭載運輸罐: {9}個 ({10}艦) -搭載大發動艇: {11}個 ({12}艦, +{13:p1}) -運送量(TP): S {14} / A {15}{27} -水上電探: {24}個 ({25}艦) -總消耗: 油 {16} / 彈 {17} -(每場戰鬥 油 {18} / 彈 {19}) - 無熟練度 @@ -284,4 +272,34 @@ 索敵階段 + + 支援攻擊: {0} + + + 總等級: {0} / 平均: {1:0.00} + + + {0}艦隊 + + + 總計火力 {0} ({1}) / 雷裝 {2} / 對空 {3} ({4}) / 反潛 {5} ({6}) / 索敵 {7} ({8}) + + + 搭載運輸罐: {0}個 ({1}艦) + + + 搭載大發動艇: {0}個 ({1}艦, +{2:p1}) + + + 運送量(TP): S {0} / A {1} + + + 水上電探: {0}個 ({1}艦) + + + 總消耗: 油 {0} / 彈 {1} + + + (每場戰鬥 油 {0} / 彈 {1}) + \ No newline at end of file diff --git a/ElectronicObserver/Utility/Data/TransportGaugeService.cs b/ElectronicObserver/Utility/Data/TransportGaugeService.cs index 72f384a73..24eca441f 100644 --- a/ElectronicObserver/Utility/Data/TransportGaugeService.cs +++ b/ElectronicObserver/Utility/Data/TransportGaugeService.cs @@ -67,7 +67,10 @@ public string GetEventLandingOperationToolTip(List fleets, List GetEventLandingGauges(bool includeNone) diff --git a/ElectronicObserver/ViewModels/Translations/FormFleetTranslationViewModel.cs b/ElectronicObserver/ViewModels/Translations/FormFleetTranslationViewModel.cs index 41e9f09be..c97fc51d9 100644 --- a/ElectronicObserver/ViewModels/Translations/FormFleetTranslationViewModel.cs +++ b/ElectronicObserver/ViewModels/Translations/FormFleetTranslationViewModel.cs @@ -42,7 +42,6 @@ public class FormFleetTranslationViewModel : TranslationBaseViewModel public string SupportTypeShelling => FleetResources.SupportTypeShelling; public string SupportTypeTorpedo => FleetResources.SupportTypeTorpedo; - public string FleetNameToolTip => FleetResources.FleetNameToolTip; public string WithoutProficiency => FleetResources.WithoutProficiency; public string WithProficiency => FleetResources.WithProficiency; public string FleetLosToolTip => FleetResources.FleetLosToolTip; diff --git a/ElectronicObserver/Window/Wpf/Extensions.cs b/ElectronicObserver/Window/Wpf/Extensions.cs index 1eab07c18..9449278fa 100644 --- a/ElectronicObserver/Window/Wpf/Extensions.cs +++ b/ElectronicObserver/Window/Wpf/Extensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Windows; @@ -322,4 +323,15 @@ public static ObservableCollection ToObservableCollection(this IEnumerable public static ReadOnlyCollection ToReadOnlyCollection(this IList enumerable) => new(enumerable); + + public static StringBuilder AppendFormatLine( + this StringBuilder sb, + [StringSyntax(StringSyntaxAttribute.CompositeFormat)] string format, + params ReadOnlySpan args) + { + sb.AppendFormat(format, args); + sb.AppendLine(); + + return sb; + } } diff --git a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStatusViewModel.cs b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStatusViewModel.cs index a4be2e5c2..366de87c2 100644 --- a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStatusViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStatusViewModel.cs @@ -66,78 +66,11 @@ public void Update(IFleetData fleet) int speed = members.Select(s => s.Speed).DefaultIfEmpty(20).Min(); Name.Text = fleet.Name; - { - int levelSum = members.Sum(s => s.Level); - - int fueltotal = members.Sum(s => Math.Max((int)Math.Floor(s.FuelMax * (s.IsMarried ? 0.85 : 1.00)), 1)); - int ammototal = members.Sum(s => Math.Max((int)Math.Floor(s.AmmoMax * (s.IsMarried ? 0.85 : 1.00)), 1)); - - int fuelunit = members.Sum(s => Math.Max((int)Math.Floor(s.FuelMax * 0.2 * (s.IsMarried ? 0.85 : 1.00)), 1)); - int ammounit = members.Sum(s => Math.Max((int)Math.Floor(s.AmmoMax * 0.2 * (s.IsMarried ? 0.85 : 1.00)), 1)); - - string supporttype = fleet.SupportType switch - { - SupportType.None => FleetResources.SupportTypeNone, - SupportType.Aerial => FleetResources.SupportTypeAerial, - SupportType.Shelling => FleetResources.SupportTypeShelling, - SupportType.Torpedo => FleetResources.SupportTypeTorpedo, - SupportType.AntiSubmarine => FleetResources.SupportTypeAntiSubmarine, - _ => FormFleet.SupportTypeNone, - }; - - double expeditionBonus = Calculator.GetExpeditionBonus(fleet); - int tp = TpGauge.Normal.GetTp([fleet]); - - bool hasZeroSlotAircraft = fleet.MembersInstance! - .Where(s => s is not null) - .Any(s => s.HasZeroSlotAircraft()); - - string? zeroSlotWarning = hasZeroSlotAircraft switch - { - true => $"\n{DataRes.ZeroSlotAircraftWarning}", - _ => null, - }; - - // 各艦ごとの ドラム缶 or 大発系 を搭載している個数 - IEnumerable transport = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.CategoryType == EquipmentTypes.TransportContainer)); - IEnumerable landing = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.CategoryType is EquipmentTypes.LandingCraft or EquipmentTypes.SpecialAmphibiousTank)); - IEnumerable radar = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.IsSurfaceRadar == true)); - - Name.ToolTip = string.Format(FleetResources.FleetNameToolTip, - levelSum, - (double)levelSum / Math.Max(fleet.Members.Count(id => id != -1), 1), - Constants.GetSpeed(speed), - supporttype, - members.Sum(s => s.FirepowerTotal), - members.Sum(s => s.TorpedoTotal), - members.Sum(s => s.AATotal), - members.Sum(s => s.ASWTotal), - members.Sum(s => s.LOSTotal), - transport.Sum(), - transport.Count(i => i > 0), - landing.Sum(), - landing.Count(i => i > 0), - expeditionBonus, - tp, - (int)(tp * 0.7), - fueltotal, - ammototal, - fuelunit, - ammounit, - members.Sum(s => s.ExpeditionFirepowerTotal), - members.Sum(s => s.ExpeditionAATotal), - members.Sum(s => s.ExpeditionASWTotal), - members.Sum(s => s.ExpeditionLOSTotal), - radar.Sum(), - radar.Count(i => i > 0), - zeroSlotWarning, - GetTankTpTooltip(fleet) - ); + Name.ToolTip = GetFleetNameToolTip(fleet, members, speed); - NightRecons = fleet.NightRecons().TotalRate(); - Flares = fleet.Flares().TotalRate(); - SmokeGeneratorRates = fleet.GetSmokeTriggerRates().TotalRate(); - } + NightRecons = fleet.NightRecons().TotalRate(); + Flares = fleet.Flares().TotalRate(); + SmokeGeneratorRates = fleet.GetSmokeTriggerRates().TotalRate(); State.UpdateFleetState(fleet); @@ -214,6 +147,85 @@ public void Update(IFleetData fleet) Speed.ToolTip = string.Join("\r\n", members.Select(s => $"{s.Name}:{Constants.GetSpeed(s.Speed)}")); } + private string GetFleetNameToolTip(IFleetData fleet, List members, int speed) + { + int levelSum = members.Sum(s => s.Level); + double levelAverage = (double)levelSum / Math.Max(fleet.Members?.Count(id => id != -1) ?? 0, 1); + + int fueltotal = members.Sum(s => Math.Max((int)Math.Floor(s.FuelMax * (s.IsMarried ? 0.85 : 1.00)), 1)); + int ammototal = members.Sum(s => Math.Max((int)Math.Floor(s.AmmoMax * (s.IsMarried ? 0.85 : 1.00)), 1)); + + int fuelunit = members.Sum(s => Math.Max((int)Math.Floor(s.FuelMax * 0.2 * (s.IsMarried ? 0.85 : 1.00)), 1)); + int ammounit = members.Sum(s => Math.Max((int)Math.Floor(s.AmmoMax * 0.2 * (s.IsMarried ? 0.85 : 1.00)), 1)); + + int jetSteelConsumption = members + .SelectMany(s => s.AllSlotInstanceMaster.Zip(s.Aircraft, (eq, s) => (Equipment: eq, Aircraft: s))) + .Sum(t => t.Equipment.JetSteelCost(t.Aircraft)); + + string supporttype = fleet.SupportType switch + { + SupportType.None => FleetResources.SupportTypeNone, + SupportType.Aerial => FleetResources.SupportTypeAerial, + SupportType.Shelling => FleetResources.SupportTypeShelling, + SupportType.Torpedo => FleetResources.SupportTypeTorpedo, + SupportType.AntiSubmarine => FleetResources.SupportTypeAntiSubmarine, + _ => FleetResources.SupportTypeNone, + }; + + double expeditionBonus = Calculator.GetExpeditionBonus(fleet); + int tp = TpGauge.Normal.GetTp([fleet]); + + bool hasZeroSlotAircraft = members.Any(s => s.HasZeroSlotAircraft()); + + // 各艦ごとの ドラム缶 or 大発系 を搭載している個数 + IEnumerable transport = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.CategoryType == EquipmentTypes.TransportContainer)); + IEnumerable landing = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.CategoryType is EquipmentTypes.LandingCraft or EquipmentTypes.SpecialAmphibiousTank)); + IEnumerable radar = members.Select(s => s.AllSlotInstanceMaster.Count(eq => eq?.IsSurfaceRadar == true)); + + StringBuilder sb = new(); + + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Level, levelSum, levelAverage); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Speed, Constants.GetSpeed(speed)); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Support, supporttype); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Stats, + members.Sum(s => s.FirepowerTotal), + members.Sum(s => s.ExpeditionFirepowerTotal), + members.Sum(s => s.TorpedoTotal), + members.Sum(s => s.AATotal), + members.Sum(s => s.ExpeditionAATotal), + members.Sum(s => s.ASWTotal), + members.Sum(s => s.ExpeditionASWTotal), + members.Sum(s => s.LOSTotal), + members.Sum(s => s.ExpeditionLOSTotal) + ); + + if (hasZeroSlotAircraft) + { + sb.AppendLine(DataRes.ZeroSlotAircraftWarning); + } + + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Drum, transport.Sum(), transport.Count(i => i > 0)); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Daihatsu, landing.Sum(), landing.Count(i => i > 0), expeditionBonus); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Tp, tp, (int)(tp * 0.7)); + + if (GetTankTpTooltip(fleet) is string s && !string.IsNullOrEmpty(s)) + { + sb.AppendLine(s); + } + + sb.AppendFormatLine(FleetResources.FleetNameToolTip_SurfaceRadar, radar.Sum(), radar.Count(i => i > 0)); + sb.AppendFormatLine(FleetResources.FleetNameToolTip_Consumption, fueltotal, ammototal); + sb.AppendFormat(FleetResources.FleetNameToolTip_ConsumptionPerBattle, fuelunit, ammounit); + + if (jetSteelConsumption > 0) + { + sb.AppendLine(); + sb.AppendFormat(FleetResources.FleetNameToolTip_JetConsumption, jetSteelConsumption); + } + + return sb.ToString(); + } + private string GetTankTpTooltip(IFleetData fleet) { if (Configuration.Config.FormFleet.DisplayOnlyCurrentEventTankTp)