diff --git a/ElectronicObserver.Avalonia/ShipGroup/ShipGroupItemViewModel.cs b/ElectronicObserver.Avalonia/ShipGroup/ShipGroupItemViewModel.cs index b96f068af..e558e6e84 100644 --- a/ElectronicObserver.Avalonia/ShipGroup/ShipGroupItemViewModel.cs +++ b/ElectronicObserver.Avalonia/ShipGroup/ShipGroupItemViewModel.cs @@ -40,27 +40,27 @@ public class ShipGroupItemViewModel(IShipData ship) } private int AircraftCurrent1 => Ship.Aircraft[0]; - private int AircraftMax1 => Ship.MasterShip.Aircraft[0]; + private int AircraftMax1 => Ship.AircraftMax?[0] ?? Ship.MasterShip.Aircraft[0]; public Fraction? Aircraft1 => GetAircraftFraction(0, AircraftCurrent1, AircraftMax1); private int AircraftCurrent2 => Ship.Aircraft[1]; - private int AircraftMax2 => Ship.MasterShip.Aircraft[1]; + private int AircraftMax2 => Ship.AircraftMax?[1] ?? Ship.MasterShip.Aircraft[1]; public Fraction? Aircraft2 => GetAircraftFraction(0, AircraftCurrent2, AircraftMax2); private int AircraftCurrent3 => Ship.Aircraft[2]; - private int AircraftMax3 => Ship.MasterShip.Aircraft[2]; + private int AircraftMax3 => Ship.AircraftMax?[2] ?? Ship.MasterShip.Aircraft[2]; public Fraction? Aircraft3 => GetAircraftFraction(0, AircraftCurrent3, AircraftMax3); private int AircraftCurrent4 => Ship.Aircraft[3]; - private int AircraftMax4 => Ship.MasterShip.Aircraft[3]; + private int AircraftMax4 => Ship.AircraftMax?[3] ?? Ship.MasterShip.Aircraft[3]; public Fraction? Aircraft4 => GetAircraftFraction(0, AircraftCurrent4, AircraftMax4); private int AircraftCurrent5 => Ship.Aircraft[4]; - private int AircraftMax5 => Ship.MasterShip.Aircraft[4]; + private int AircraftMax5 => Ship.AircraftMax?[4] ?? Ship.MasterShip.Aircraft[4]; public Fraction? Aircraft5 => GetAircraftFraction(0, AircraftCurrent5, AircraftMax5); private int AircraftCurrentTotal => Ship.AircraftTotal; - private int AircraftMaxTotal => Ship.MasterShip.AircraftTotal; + private int AircraftMaxTotal => Ship.AircraftMaxTotal; public Fraction? AircraftTotal => GetAircraftFraction(0, AircraftCurrentTotal, AircraftMaxTotal); public string Fleet => Ship.FleetWithIndex; diff --git a/ElectronicObserver.Core/Types/IShipData.cs b/ElectronicObserver.Core/Types/IShipData.cs index abd732a1d..20edb4279 100644 --- a/ElectronicObserver.Core/Types/IShipData.cs +++ b/ElectronicObserver.Core/Types/IShipData.cs @@ -129,11 +129,18 @@ public interface IShipData /// IList Aircraft { get; } + /// + /// Aircraft capacity if it was increased + /// + List? AircraftMax { get; } + /// /// 現在の航空機搭載量 /// int AircraftTotal { get; } + int AircraftMaxTotal { get; } + /// /// 搭載燃料 /// diff --git a/ElectronicObserver.Core/Types/Mocks/ShipDataMock.cs b/ElectronicObserver.Core/Types/Mocks/ShipDataMock.cs index 29741f6fa..508b06324 100644 --- a/ElectronicObserver.Core/Types/Mocks/ShipDataMock.cs +++ b/ElectronicObserver.Core/Types/Mocks/ShipDataMock.cs @@ -66,7 +66,9 @@ public class ShipDataMock : IShipData public IList AllSlotMasterReplay { get; } = []; public IList AllSlotInstanceMaster => AllSlotInstance.Select(e => e?.MasterEquipment).ToList(); public IList Aircraft { get; set; } + public List? AircraftMax { get; set; } public int AircraftTotal { get; } + public int AircraftMaxTotal { get; } public int Fuel { get; set; } public int Ammo { get; set; } public int SlotSize { get; } @@ -184,14 +186,14 @@ public int LuckBase public bool IsLockedByEquipment { get; } public bool CanBeTargeted { get; set; } = true; - public ShipDataMock(IShipDataMaster ship, List? kyouka = null) + public ShipDataMock(IShipDataMaster ship, List? kyouka = null, List? aircraft = null) { MasterShip = ship; HPCurrent = MasterShip.HPMin; SlotSize = MasterShip.SlotSize; - Aircraft = MasterShip.Aircraft; + Aircraft = aircraft ?? MasterShip.Aircraft; SlotInstance = [.. Enumerable.Range(0, SlotSize).Select(i => null as IEquipmentData)]; Fuel = ship.Fuel; diff --git a/ElectronicObserver.Core/Types/Serialization/DeckBuilder/DeckBuilderEquipment.cs b/ElectronicObserver.Core/Types/Serialization/DeckBuilder/DeckBuilderEquipment.cs index 6c91a0a64..29205300e 100644 --- a/ElectronicObserver.Core/Types/Serialization/DeckBuilder/DeckBuilderEquipment.cs +++ b/ElectronicObserver.Core/Types/Serialization/DeckBuilder/DeckBuilderEquipment.cs @@ -7,4 +7,5 @@ public class DeckBuilderEquipment [JsonPropertyName("id")] public EquipmentId Id { get; set; } [JsonPropertyName("rf")] public int Level { get; set; } [JsonPropertyName("mas")] public int? AircraftLevel { get; set; } -} \ No newline at end of file + [JsonPropertyName("ac")] public int? AircraftCount { get; set; } +} diff --git a/ElectronicObserver.Core/Types/Serialization/FleetAnalysis/FleetAnalysisShip.cs b/ElectronicObserver.Core/Types/Serialization/FleetAnalysis/FleetAnalysisShip.cs index bbc54f3ec..3919296b4 100644 --- a/ElectronicObserver.Core/Types/Serialization/FleetAnalysis/FleetAnalysisShip.cs +++ b/ElectronicObserver.Core/Types/Serialization/FleetAnalysis/FleetAnalysisShip.cs @@ -13,4 +13,5 @@ public class FleetAnalysisShip [JsonPropertyName("api_slot_ex")] public required int ExpansionSlot { get; set; } [JsonPropertyName("api_sally_area")] public required int SallyArea { get; set; } [JsonPropertyName("api_sp_effect_items")] public required List SpecialEffectItems { get; set; } + [JsonPropertyName("api_onslot_max")] public required List? AircraftMax { get; set; } } diff --git a/ElectronicObserver/Data/ShipData.cs b/ElectronicObserver/Data/ShipData.cs index 2d00866fe..743cc1cb3 100644 --- a/ElectronicObserver/Data/ShipData.cs +++ b/ElectronicObserver/Data/ShipData.cs @@ -156,12 +156,15 @@ public class ShipData : APIWrapper, IIdentifiable, IShipData /// public IList Aircraft => Array.AsReadOnly(_aircraft); + public List? AircraftMax { get; private set; } /// /// 現在の航空機搭載量 /// public int AircraftTotal => _aircraft.Sum(a => Math.Max(a, 0)); + public int AircraftMaxTotal => AircraftMax?.Sum(a => Math.Max(a, 0)) ?? MasterShip.AircraftTotal; + /// /// 搭載燃料 @@ -600,7 +603,7 @@ public IList AircraftRate get { double[] airs = new double[_aircraft.Length]; - var airmax = MasterShip.Aircraft; + var airmax = AircraftMax ?? MasterShip.Aircraft; for (int i = 0; i < airs.Length; i++) { @@ -614,7 +617,7 @@ public IList AircraftRate /// /// 搭載機残量割合 /// - public double AircraftTotalRate => (double)AircraftTotal / Math.Max(MasterShip.AircraftTotal, 1); + public double AircraftTotalRate => (double)AircraftTotal / Math.Max(AircraftMaxTotal, 1); @@ -1520,6 +1523,12 @@ public override void LoadFromResponse(string apiname, dynamic data) Evasion = i.ApiKaih, }).ToList() ?? new(); } + + if (data.api_onslot_max()) + { + AircraftMax = (List)RawData.api_onslot_max; + } + break; case "api_req_hokyu/charge": diff --git a/ElectronicObserver/Services/ApiFileService/ApiFileService.cs b/ElectronicObserver/Services/ApiFileService/ApiFileService.cs index 0cbc9f053..29790cffc 100644 --- a/ElectronicObserver/Services/ApiFileService/ApiFileService.cs +++ b/ElectronicObserver/Services/ApiFileService/ApiFileService.cs @@ -327,12 +327,12 @@ private static bool ShouldIncludeFleet(IFleetData fleet, FleetType combinedFlag, public static SortieFleetData MakeSortieFleet(IEnumerable fleets, IEnumerable airBases, FleetType combinedFlag, int fleetId, int nodeSupportFleetId, int bossSupportFleetId, int world) => new() - { - FleetId = fleetId, - NodeSupportFleetId = nodeSupportFleetId, - BossSupportFleetId = bossSupportFleetId, - CombinedFlag = combinedFlag, - Fleets = fleets + { + FleetId = fleetId, + NodeSupportFleetId = nodeSupportFleetId, + BossSupportFleetId = bossSupportFleetId, + CombinedFlag = combinedFlag, + Fleets = fleets .Select(f => f switch { null => null, @@ -342,11 +342,11 @@ public static SortieFleetData MakeSortieFleet(IEnumerable fleets, _ => null, }, }).ToList(), - AirBases = airBases + AirBases = airBases .Where(a => a.MapAreaID == world) .Select(MakeSortieAirBase) .ToList(), - }; + }; private static SortieFleet MakeSortieFleet(IFleetData f) => new() { @@ -381,7 +381,7 @@ public static SortieFleetData MakeSortieFleet(IEnumerable fleets, Luck = s.LuckTotal, EquipmentSlots = s.SlotInstance .Zip(s.Aircraft, (Equipment, AircraftCurrent) => (Equipment, AircraftCurrent)) - .Zip(s.MasterShip.Aircraft, (slot, AircraftMax) => new SortieEquipmentSlot + .Zip(s.AircraftMax ?? s.MasterShip.Aircraft, (slot, AircraftMax) => new SortieEquipmentSlot { Equipment = slot.Equipment switch { diff --git a/ElectronicObserver/Services/DataSerializationService.cs b/ElectronicObserver/Services/DataSerializationService.cs index a8a5445bd..9193b272b 100644 --- a/ElectronicObserver/Services/DataSerializationService.cs +++ b/ElectronicObserver/Services/DataSerializationService.cs @@ -188,12 +188,12 @@ private static DeckBuilderShip? MakeDeckBuilderShip IsExpansionSlotAvailable = s.IsExpansionSlotAvailable, Equipment = new() { - Equipment1 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(0).FirstOrDefault(), maxAircraftLevel), - Equipment2 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(1).FirstOrDefault(), maxAircraftLevel), - Equipment3 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(2).FirstOrDefault(), maxAircraftLevel), - Equipment4 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(3).FirstOrDefault(), maxAircraftLevel), - Equipment5 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(4).FirstOrDefault(), maxAircraftLevel), - EquipmentExpansion = MakeDeckBuilderEquipment(s.ExpansionSlotInstance, maxAircraftLevel), + Equipment1 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(0).FirstOrDefault(), maxAircraftLevel, s.Aircraft.Skip(0).FirstOrDefault()), + Equipment2 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(1).FirstOrDefault(), maxAircraftLevel, s.Aircraft.Skip(1).FirstOrDefault()), + Equipment3 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(2).FirstOrDefault(), maxAircraftLevel, s.Aircraft.Skip(2).FirstOrDefault()), + Equipment4 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(3).FirstOrDefault(), maxAircraftLevel, s.Aircraft.Skip(3).FirstOrDefault()), + Equipment5 = MakeDeckBuilderEquipment(s.AllSlotInstance.Skip(4).FirstOrDefault(), maxAircraftLevel, s.Aircraft.Skip(4).FirstOrDefault()), + EquipmentExpansion = MakeDeckBuilderEquipment(s.ExpansionSlotInstance, maxAircraftLevel, null), }, Hp = s.HPMax, Firepower = s.FirepowerTotal, @@ -223,7 +223,8 @@ private static DeckBuilderShip? MakeDeckBuilderShip private static DeckBuilderEquipment? MakeDeckBuilderEquipment ( IEquipmentData? equipment, - bool maxAircraftLevel + bool maxAircraftLevel, + int? aircraftCount ) => equipment switch { { } eq => new() @@ -231,6 +232,7 @@ bool maxAircraftLevel Id = eq.MasterEquipment.EquipmentId, Level = eq.Level, AircraftLevel = GetAircraftLevel(eq, maxAircraftLevel), + AircraftCount = aircraftCount, }, _ => null @@ -256,10 +258,10 @@ bool maxAircraftLevel Name = airBase.Name, Equipment = new() { - Equipment1 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(0).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel), - Equipment2 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(1).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel), - Equipment3 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(2).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel), - Equipment4 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(3).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel), + Equipment1 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(0).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel, null), + Equipment2 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(1).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel, null), + Equipment3 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(2).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel, null), + Equipment4 = MakeDeckBuilderEquipment(ab.Squadrons.Values.Skip(3).FirstOrDefault()?.EquipmentInstance, maxAircraftLevel, null), }, Mode = airBase.ActionKind, Distance = airBase.Distance, @@ -375,6 +377,7 @@ private static IEnumerable MakeFleetAnalysisShips(IEnumerable Armor = i.Armor, Evasion = i.Evasion, }).ToList(), + AircraftMax = ship.AircraftMax, }; private static IEnumerable MakeFleetAnalysisEquipment(IEnumerable equipment) diff --git a/ElectronicObserver/Window/Tools/FleetImageGenerator/Extensions.cs b/ElectronicObserver/Window/Tools/FleetImageGenerator/Extensions.cs index ab8031368..e107e74a9 100644 --- a/ElectronicObserver/Window/Tools/FleetImageGenerator/Extensions.cs +++ b/ElectronicObserver/Window/Tools/FleetImageGenerator/Extensions.cs @@ -52,7 +52,16 @@ public static class Extensions return null; } - ShipDataMock ship = new(Db.MasterShips[(int)deckBuilderShip.Id]) + List aircraft = + [ + deckBuilderShip.Equipment.Equipment1?.AircraftCount ?? 0, + deckBuilderShip.Equipment.Equipment2?.AircraftCount ?? 0, + deckBuilderShip.Equipment.Equipment3?.AircraftCount ?? 0, + deckBuilderShip.Equipment.Equipment4?.AircraftCount ?? 0, + deckBuilderShip.Equipment.Equipment5?.AircraftCount ?? 0, + ]; + + ShipDataMock ship = new(Db.MasterShips[(int)deckBuilderShip.Id], null, aircraft) { Level = deckBuilderShip.Level, IsExpansionSlotAvailable = deckBuilderShip.IsExpansionSlotAvailable, diff --git a/ElectronicObserver/Window/Tools/FleetImageGenerator/ShipViewModel.cs b/ElectronicObserver/Window/Tools/FleetImageGenerator/ShipViewModel.cs index e00bdd21a..feaf9794c 100644 --- a/ElectronicObserver/Window/Tools/FleetImageGenerator/ShipViewModel.cs +++ b/ElectronicObserver/Window/Tools/FleetImageGenerator/ShipViewModel.cs @@ -75,7 +75,7 @@ public virtual ShipViewModel Initialize(IShipData? ship) Slots = ship.SlotInstance .Take(ship.MasterShip.SlotSize) - .Zip(ship.MasterShip.Aircraft, (eq, slot) => new EquipmentSlotViewModel(eq, slot)) + .Zip(ship.Aircraft, (eq, slot) => new EquipmentSlotViewModel(eq, slot)) .ToObservableCollection(); ExpansionSlot = ship.IsExpansionSlotAvailable switch diff --git a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/EquipmentItemViewModel.cs b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/EquipmentItemViewModel.cs index 2866806fc..3230f0250 100644 --- a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/EquipmentItemViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/EquipmentItemViewModel.cs @@ -147,7 +147,7 @@ public void SetSlotList(IShipData ship) { var slots = ship.AllSlotInstance .Zip(ship.Aircraft, (eq, s) => (Equipment: eq, CurrentAircraft: s)) - .Zip(ship.MasterShip.Aircraft, (slot, t) => (slot.Equipment, slot.CurrentAircraft, Size: t)) + .Zip(ship.AircraftMax ?? ship.MasterShip.Aircraft, (slot, t) => (slot.Equipment, slot.CurrentAircraft, Size: t)) .ToList(); for (int i = 0; i < Slots.Count; i++) diff --git a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetItemViewModel.cs b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetItemViewModel.cs index 4dd1b22bf..c5aee37e3 100644 --- a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetItemViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetItemViewModel.cs @@ -409,7 +409,7 @@ private string GetEquipmentString(IShipData ship, IFleetData fleet) IEquipmentData? eq = ship.SlotInstance[i]; if (eq is not null) { - sb.AppendFormat("[{0}/{1}] {2}\r\n", ship.Aircraft[i], ship.MasterShip.Aircraft[i], eq.NameWithLevel); + sb.AppendFormat("[{0}/{1}] {2}\r\n", ship.Aircraft[i], ship.AircraftMax?[i] ?? ship.MasterShip.Aircraft[i], eq.NameWithLevel); } } diff --git a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStateViewModel.cs b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStateViewModel.cs index 573de198c..f42e66a6e 100644 --- a/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStateViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Fleet/ViewModels/FleetStateViewModel.cs @@ -212,7 +212,7 @@ public void UpdateFleetState(IFleetData fleet) int fuel = members.Sum(ship => ship.SupplyFuel); int ammo = members.Sum(ship => ship.SupplyAmmo); - int aircraft = members.SelectMany(s => s.MasterShip.Aircraft.Zip(s.Aircraft, (max, now) => max - now)).Sum(); + int aircraft = members.SelectMany(s => s.AircraftMax ?? s.MasterShip.Aircraft.Zip(s.Aircraft, (max, now) => max - now)).Sum(); int bauxite = aircraft * 5; if (fuel > 0 || ammo > 0 || bauxite > 0) diff --git a/ElectronicObserver/Window/Wpf/FleetPreset/FleetPresetItemViewModel.cs b/ElectronicObserver/Window/Wpf/FleetPreset/FleetPresetItemViewModel.cs index 778e7aa05..62ec02b16 100644 --- a/ElectronicObserver/Window/Wpf/FleetPreset/FleetPresetItemViewModel.cs +++ b/ElectronicObserver/Window/Wpf/FleetPreset/FleetPresetItemViewModel.cs @@ -103,7 +103,7 @@ public void Update(int presetId) if (e < ship.MasterShip.Aircraft.Count) { - sb.AppendLine($"[{ship.Aircraft[e]}/{ship.MasterShip.Aircraft[e]}] {slot[e].NameWithLevel}"); + sb.AppendLine($"[{ship.Aircraft[e]}/{ship.AircraftMax?[e] ?? ship.MasterShip.Aircraft[e]}] {slot[e].NameWithLevel}"); } else { diff --git a/ElectronicObserver/Window/Wpf/InformationView/InformationViewModel.cs b/ElectronicObserver/Window/Wpf/InformationView/InformationViewModel.cs index 1ad56db70..945c3a057 100644 --- a/ElectronicObserver/Window/Wpf/InformationView/InformationViewModel.cs +++ b/ElectronicObserver/Window/Wpf/InformationView/InformationViewModel.cs @@ -499,7 +499,7 @@ private string GetConsumptionResource(dynamic data) int fuel_supply = ships.Sum(s => s.SupplyFuel); int ammo = ships.Sum(s => s.SupplyAmmo); - int bauxite = ships.Sum(s => s.Aircraft.Zip(s.MasterShip.Aircraft, (current, max) => new { Current = current, Max = max }).Sum(a => (a.Max - a.Current) * 5)); + int bauxite = ships.Sum(s => s.Aircraft.Zip(s.AircraftMax ?? s.MasterShip.Aircraft, (current, max) => new { Current = current, Max = max }).Sum(a => (a.Max - a.Current) * 5)); int fuel_repair = ships.Sum(s => s.RepairFuel); int steel = ships.Sum(s => s.RepairSteel);